From 451682693ec955dfb90c81bdcd06be4c8d19d6ac Mon Sep 17 00:00:00 2001 From: Tropical <42101043+tropicaaal@users.noreply.github.com> Date: Mon, 30 Mar 2026 09:50:58 -0500 Subject: [PATCH] restructure codebase according to vcproj filters --- .../{Platform => }/Common/App_Defines.h | 0 .../{Platform => }/Common/App_enums.h | 0 .../{Platform => }/Common/App_structs.h | 0 .../{Platform => }/Common/Consoles_App.cpp | 100 +- .../{Platform => }/Common/Consoles_App.h | 22 +- .../Windows64 => Common}/Minecraft_Macros.h | 0 .../{Platform => }/Common/Potion_Macros.h | 0 .../{Platform => }/Common/ShutdownManager.h | 2 +- .../Audio/Consoles_SoundEngine.cpp | 2 +- .../Audio/Consoles_SoundEngine.h | 6 +- .../Source Files}/Audio/SoundEngine.cpp | 20 +- .../Source Files}/Audio/SoundEngine.h | 2 +- .../Source Files}/Audio/SoundNames.cpp | 2 +- .../Source Files/BuildVer}/BuildVer.h | 0 .../Source Files}/Colours/ColourTable.cpp | 4 +- .../Source Files}/Colours/ColourTable.h | 0 .../Source Files}/ConsoleGameMode.cpp | 2 +- .../Source Files}/ConsoleGameMode.h | 0 .../Source Files}/Console_Awards_enum.h | 0 .../Source Files}/Console_Debug_enum.h | 0 .../Source Files}/Console_Utils.cpp | 2 +- .../Source Files}/DLC/DLCAudioFile.cpp | 6 +- .../Source Files}/DLC/DLCAudioFile.h | 0 .../Source Files}/DLC/DLCCapeFile.cpp | 2 +- .../Source Files}/DLC/DLCCapeFile.h | 0 .../Source Files}/DLC/DLCColourTableFile.cpp | 8 +- .../Source Files}/DLC/DLCColourTableFile.h | 0 .../Source Files}/DLC/DLCFile.cpp | 2 +- .../Source Files}/DLC/DLCFile.h | 0 .../Source Files}/DLC/DLCGameRules.h | 2 +- .../Source Files}/DLC/DLCGameRulesFile.cpp | 2 +- .../Source Files}/DLC/DLCGameRulesFile.h | 0 .../Source Files}/DLC/DLCGameRulesHeader.cpp | 8 +- .../Source Files}/DLC/DLCGameRulesHeader.h | 2 +- .../Source Files}/DLC/DLCLocalisationFile.cpp | 4 +- .../Source Files}/DLC/DLCLocalisationFile.h | 0 .../Source Files}/DLC/DLCManager.cpp | 10 +- .../Source Files}/DLC/DLCManager.h | 0 .../Source Files}/DLC/DLCPack.cpp | 4 +- .../Source Files}/DLC/DLCPack.h | 0 .../Source Files}/DLC/DLCSkinFile.cpp | 12 +- .../Source Files}/DLC/DLCSkinFile.h | 2 +- .../Source Files}/DLC/DLCTextureFile.cpp | 2 +- .../Source Files}/DLC/DLCTextureFile.h | 0 .../Source Files}/DLC/DLCUIDataFile.cpp | 2 +- .../Source Files}/DLC/DLCUIDataFile.h | 0 .../Source Files/GameRules/ConsoleGameRules.h | 32 + .../GameRules/ConsoleGameRulesConstants.h | 0 .../GameRules/GameRuleManager.cpp | 12 +- .../Source Files}/GameRules/GameRuleManager.h | 4 +- .../ApplySchematicRuleDefinition.cpp | 16 +- .../ApplySchematicRuleDefinition.h | 4 +- .../LevelGeneration}/BiomeOverride.cpp | 4 +- .../LevelGeneration}/BiomeOverride.h | 2 +- .../ConsoleGenerateStructure.cpp | 14 +- .../ConsoleGenerateStructure.h | 4 +- .../ConsoleGenerateStructureAction.h | 2 +- .../LevelGeneration}/ConsoleSchematicFile.cpp | 22 +- .../LevelGeneration}/ConsoleSchematicFile.h | 2 +- .../LevelGenerationOptions.cpp | 16 +- .../LevelGeneration}/LevelGenerationOptions.h | 4 +- .../LevelGeneration}/LevelGenerators.cpp | 2 +- .../LevelGeneration}/LevelGenerators.h | 0 .../LevelGeneration}/StartFeature.cpp | 4 +- .../GameRules/LevelGeneration}/StartFeature.h | 4 +- .../XboxStructureActionGenerateBox.cpp | 6 +- .../XboxStructureActionGenerateBox.h | 2 +- .../XboxStructureActionPlaceBlock.cpp | 6 +- .../XboxStructureActionPlaceBlock.h | 2 +- .../XboxStructureActionPlaceContainer.cpp | 14 +- .../XboxStructureActionPlaceContainer.h | 0 .../XboxStructureActionPlaceSpawner.cpp | 10 +- .../XboxStructureActionPlaceSpawner.h | 0 .../GameRules/LevelRules}/LevelRules.cpp | 2 +- .../GameRules/LevelRules}/LevelRules.h | 0 .../AddEnchantmentRuleDefinition.cpp | 8 +- .../AddEnchantmentRuleDefinition.h | 0 .../AddItemRuleDefinition.cpp | 10 +- .../RuleDefinitions}/AddItemRuleDefinition.h | 0 .../CollectItemRuleDefinition.cpp | 12 +- .../CollectItemRuleDefinition.h | 0 .../CompleteAllRuleDefinition.cpp | 10 +- .../CompleteAllRuleDefinition.h | 0 .../CompoundGameRuleDefinition.cpp | 8 +- .../CompoundGameRuleDefinition.h | 0 .../RuleDefinitions}/GameRuleDefinition.cpp | 8 +- .../RuleDefinitions}/GameRuleDefinition.h | 6 +- .../RuleDefinitions}/LevelRuleset.cpp | 8 +- .../RuleDefinitions}/LevelRuleset.h | 0 .../NamedAreaRuleDefinition.cpp | 6 +- .../NamedAreaRuleDefinition.h | 2 +- .../UpdatePlayerRuleDefinition.cpp | 14 +- .../UpdatePlayerRuleDefinition.h | 0 .../UseTileRuleDefinition.cpp | 4 +- .../RuleDefinitions}/UseTileRuleDefinition.h | 2 +- .../GameRules/LevelRules/Rules}/GameRule.cpp | 4 +- .../GameRules/LevelRules/Rules}/GameRule.h | 0 .../LevelRules/Rules}/GameRulesInstance.h | 0 .../Source Files/GameRules}/WstringLookup.cpp | 2 +- .../Source Files/GameRules}/WstringLookup.h | 0 .../Leaderboards/LeaderboardInterface.cpp | 2 +- .../Leaderboards/LeaderboardInterface.h | 0 .../Leaderboards/LeaderboardManager.cpp | 4 +- .../Leaderboards/LeaderboardManager.h | 0 .../Leaderboards/SonyLeaderboardManager.cpp | 6 +- .../Leaderboards/SonyLeaderboardManager.h | 2 +- .../Source Files}/Leaderboards/base64.cpp | 0 .../Source Files}/Leaderboards/base64.h | 0 .../Localisation}/StringTable.cpp | 2 +- .../Source Files/Localisation}/StringTable.h | 0 .../Network/GameNetworkManager.cpp | 54 +- .../Network/GameNetworkManager.h | 2 +- .../Network/NetworkPlayerInterface.h | 0 .../Network/PlatformNetworkManagerInterface.h | 2 +- .../Network/PlatformNetworkManagerStub.cpp | 6 +- .../Network/PlatformNetworkManagerStub.h | 2 +- .../Source Files}/Network/SessionInfo.h | 0 .../Telemetry/TelemetryManager.cpp | 10 +- .../Telemetry/TelemetryManager.h | 6 +- .../Source Files}/Trial/TrialMode.cpp | 2 +- .../Source Files}/Trial/TrialMode.h | 0 .../Tutorial/Constraints}/AreaConstraint.cpp | 8 +- .../Tutorial/Constraints}/AreaConstraint.h | 0 .../Constraints}/ChangeStateConstraint.cpp | 16 +- .../Constraints}/ChangeStateConstraint.h | 2 +- .../Tutorial/Constraints}/InputConstraint.cpp | 2 +- .../Tutorial/Constraints}/InputConstraint.h | 0 .../Constraints}/TutorialConstraint.h | 0 .../Constraints}/TutorialConstraints.h | 0 .../Source Files}/Tutorial/FullTutorial.cpp | 20 +- .../Source Files}/Tutorial/FullTutorial.h | 0 .../Tutorial/FullTutorialMode.cpp | 4 +- .../Source Files}/Tutorial/FullTutorialMode.h | 0 .../Source Files/Tutorial/Hints}/AreaHint.cpp | 10 +- .../Source Files/Tutorial/Hints}/AreaHint.h | 0 .../Tutorial/Hints}/DiggerItemHint.cpp | 12 +- .../Tutorial/Hints}/DiggerItemHint.h | 0 .../Tutorial/Hints}/LookAtEntityHint.cpp | 4 +- .../Tutorial/Hints}/LookAtEntityHint.h | 2 +- .../Tutorial/Hints}/LookAtTileHint.cpp | 8 +- .../Tutorial/Hints}/LookAtTileHint.h | 0 .../Tutorial/Hints}/TakeItemHint.cpp | 8 +- .../Tutorial/Hints}/TakeItemHint.h | 0 .../Tutorial/Hints}/TutorialHint.cpp | 14 +- .../Tutorial/Hints}/TutorialHint.h | 2 +- .../Tutorial/Hints}/TutorialHints.h | 0 .../Source Files/Tutorial/Tasks}/AreaTask.cpp | 4 +- .../Source Files/Tutorial/Tasks}/AreaTask.h | 0 .../Tutorial/Tasks}/ChoiceTask.cpp | 12 +- .../Source Files/Tutorial/Tasks}/ChoiceTask.h | 0 .../Tutorial/Tasks}/CompleteUsingItemTask.cpp | 4 +- .../Tutorial/Tasks}/CompleteUsingItemTask.h | 0 .../Tutorial/Tasks}/ControllerTask.cpp | 10 +- .../Tutorial/Tasks}/ControllerTask.h | 0 .../Tutorial/Tasks}/CraftTask.cpp | 4 +- .../Source Files/Tutorial/Tasks}/CraftTask.h | 0 .../Tutorial/Tasks}/EffectChangedTask.cpp | 4 +- .../Tutorial/Tasks}/EffectChangedTask.h | 0 .../Tasks}/FullTutorialActiveTask.cpp | 4 +- .../Tutorial/Tasks}/FullTutorialActiveTask.h | 0 .../Tutorial/Tasks}/HorseChoiceTask.cpp | 8 +- .../Tutorial/Tasks}/HorseChoiceTask.h | 0 .../Source Files/Tutorial/Tasks}/InfoTask.cpp | 12 +- .../Source Files/Tutorial/Tasks}/InfoTask.h | 0 .../Tutorial/Tasks}/PickupTask.cpp | 2 +- .../Source Files/Tutorial/Tasks}/PickupTask.h | 0 .../Tutorial/Tasks}/ProcedureCompoundTask.cpp | 2 +- .../Tutorial/Tasks}/ProcedureCompoundTask.h | 0 .../Tutorial/Tasks}/ProgressFlagTask.cpp | 2 +- .../Tutorial/Tasks}/ProgressFlagTask.h | 2 +- .../Tutorial/Tasks}/RideEntityTask.cpp | 8 +- .../Tutorial/Tasks}/RideEntityTask.h | 0 .../Source Files/Tutorial/Tasks}/StatTask.cpp | 10 +- .../Source Files/Tutorial/Tasks}/StatTask.h | 0 .../Tutorial/Tasks}/StateChangeTask.h | 2 +- .../Tutorial/Tasks}/TutorialTask.cpp | 6 +- .../Tutorial/Tasks}/TutorialTask.h | 2 +- .../Tutorial/Tasks}/TutorialTasks.h | 0 .../Tutorial/Tasks}/UseItemTask.cpp | 8 +- .../Tutorial/Tasks}/UseItemTask.h | 0 .../Tutorial/Tasks}/UseTileTask.cpp | 8 +- .../Tutorial/Tasks}/UseTileTask.h | 0 .../Tutorial/Tasks}/XuiCraftingTask.cpp | 8 +- .../Tutorial/Tasks}/XuiCraftingTask.h | 2 +- .../Source Files}/Tutorial/Tutorial.cpp | 34 +- .../Source Files}/Tutorial/Tutorial.h | 6 +- .../Source Files}/Tutorial/TutorialEnum.h | 0 .../Tutorial/TutorialMessage.cpp | 2 +- .../Source Files}/Tutorial/TutorialMessage.h | 0 .../Source Files}/Tutorial/TutorialMode.cpp | 16 +- .../Source Files}/Tutorial/TutorialMode.h | 2 +- .../UI/All Platforms}/ArchiveFile.cpp | 8 +- .../UI/All Platforms}/ArchiveFile.h | 4 +- .../UI/All Platforms}/IUIController.h | 0 .../IUIScene_AbstractContainerMenu.cpp | 14 +- .../IUIScene_AbstractContainerMenu.h | 0 .../UI/All Platforms}/IUIScene_AnvilMenu.cpp | 14 +- .../UI/All Platforms}/IUIScene_AnvilMenu.h | 2 +- .../UI/All Platforms}/IUIScene_BeaconMenu.cpp | 18 +- .../UI/All Platforms}/IUIScene_BeaconMenu.h | 2 +- .../All Platforms}/IUIScene_BrewingMenu.cpp | 4 +- .../UI/All Platforms}/IUIScene_BrewingMenu.h | 0 .../IUIScene_CommandBlockMenu.cpp | 8 +- .../IUIScene_CommandBlockMenu.h | 2 +- .../All Platforms}/IUIScene_ContainerMenu.cpp | 4 +- .../All Platforms}/IUIScene_ContainerMenu.h | 0 .../All Platforms}/IUIScene_CraftingMenu.cpp | 10 +- .../UI/All Platforms}/IUIScene_CraftingMenu.h | 4 +- .../All Platforms}/IUIScene_CreativeMenu.cpp | 22 +- .../UI/All Platforms}/IUIScene_CreativeMenu.h | 2 +- .../All Platforms}/IUIScene_DispenserMenu.cpp | 4 +- .../All Platforms}/IUIScene_DispenserMenu.h | 0 .../IUIScene_EnchantingMenu.cpp | 8 +- .../All Platforms}/IUIScene_EnchantingMenu.h | 0 .../All Platforms}/IUIScene_FireworksMenu.cpp | 4 +- .../All Platforms}/IUIScene_FireworksMenu.h | 0 .../All Platforms}/IUIScene_FurnaceMenu.cpp | 4 +- .../UI/All Platforms}/IUIScene_FurnaceMenu.h | 0 .../UI/All Platforms}/IUIScene_HUD.cpp | 14 +- .../UI/All Platforms}/IUIScene_HUD.h | 0 .../UI/All Platforms}/IUIScene_HopperMenu.cpp | 4 +- .../UI/All Platforms}/IUIScene_HopperMenu.h | 4 +- .../IUIScene_HorseInventoryMenu.cpp | 4 +- .../IUIScene_HorseInventoryMenu.h | 6 +- .../All Platforms}/IUIScene_InventoryMenu.cpp | 4 +- .../All Platforms}/IUIScene_InventoryMenu.h | 0 .../UI/All Platforms}/IUIScene_PauseMenu.cpp | 24 +- .../UI/All Platforms}/IUIScene_PauseMenu.h | 0 .../All Platforms}/IUIScene_TradingMenu.cpp | 14 +- .../UI/All Platforms}/IUIScene_TradingMenu.h | 6 +- .../Source Files/UI/All Platforms}/UIEnums.h | 0 .../UI/All Platforms}/UIStructs.h | 2 +- .../UI/Components}/UIComponent_Chat.cpp | 8 +- .../UI/Components}/UIComponent_Chat.h | 2 +- .../UIComponent_DebugUIConsole.cpp | 4 +- .../Components}/UIComponent_DebugUIConsole.h | 4 +- .../UIComponent_DebugUIMarketingGuide.cpp | 4 +- .../UIComponent_DebugUIMarketingGuide.h | 4 +- .../UI/Components}/UIComponent_Logo.cpp | 4 +- .../UI/Components}/UIComponent_Logo.h | 2 +- .../UIComponent_MenuBackground.cpp | 4 +- .../Components}/UIComponent_MenuBackground.h | 2 +- .../UI/Components}/UIComponent_Panorama.cpp | 12 +- .../UI/Components}/UIComponent_Panorama.h | 2 +- .../UIComponent_PressStartToPlay.cpp | 6 +- .../UIComponent_PressStartToPlay.h | 2 +- .../UI/Components}/UIComponent_Tooltips.cpp | 4 +- .../UI/Components}/UIComponent_Tooltips.h | 2 +- .../Components}/UIComponent_TutorialPopup.cpp | 14 +- .../Components}/UIComponent_TutorialPopup.h | 2 +- .../UI/Components}/UIScene_HUD.cpp | 22 +- .../Source Files/UI/Components}/UIScene_HUD.h | 4 +- .../Source Files/UI/Controls}/UIControl.cpp | 8 +- .../Source Files/UI/Controls}/UIControl.h | 0 .../UI/Controls}/UIControl_Base.cpp | 8 +- .../UI/Controls}/UIControl_Base.h | 2 +- .../UIControl_BeaconEffectButton.cpp | 4 +- .../Controls}/UIControl_BeaconEffectButton.h | 0 .../UI/Controls}/UIControl_BitmapIcon.cpp | 4 +- .../UI/Controls}/UIControl_BitmapIcon.h | 0 .../UI/Controls}/UIControl_Button.cpp | 4 +- .../UI/Controls}/UIControl_Button.h | 0 .../UI/Controls}/UIControl_ButtonList.cpp | 4 +- .../UI/Controls}/UIControl_ButtonList.h | 0 .../UI/Controls}/UIControl_CheckBox.cpp | 4 +- .../UI/Controls}/UIControl_CheckBox.h | 0 .../UI/Controls}/UIControl_Cursor.cpp | 4 +- .../UI/Controls}/UIControl_Cursor.h | 0 .../UI/Controls}/UIControl_DLCList.cpp | 4 +- .../UI/Controls}/UIControl_DLCList.h | 0 .../UI/Controls}/UIControl_DynamicLabel.cpp | 4 +- .../UI/Controls}/UIControl_DynamicLabel.h | 0 .../Controls}/UIControl_EnchantmentBook.cpp | 18 +- .../UI/Controls}/UIControl_EnchantmentBook.h | 0 .../Controls}/UIControl_EnchantmentButton.cpp | 12 +- .../Controls}/UIControl_EnchantmentButton.h | 0 .../UI/Controls}/UIControl_HTMLLabel.cpp | 4 +- .../UI/Controls}/UIControl_HTMLLabel.h | 0 .../UI/Controls}/UIControl_Label.cpp | 6 +- .../UI/Controls}/UIControl_Label.h | 0 .../Controls}/UIControl_LeaderboardList.cpp | 4 +- .../UI/Controls}/UIControl_LeaderboardList.h | 0 .../UI/Controls}/UIControl_MinecraftHorse.cpp | 28 +- .../UI/Controls}/UIControl_MinecraftHorse.h | 0 .../Controls}/UIControl_MinecraftPlayer.cpp | 24 +- .../UI/Controls}/UIControl_MinecraftPlayer.h | 0 .../UI/Controls}/UIControl_PlayerList.cpp | 4 +- .../UI/Controls}/UIControl_PlayerList.h | 0 .../Controls}/UIControl_PlayerSkinPreview.cpp | 20 +- .../Controls}/UIControl_PlayerSkinPreview.h | 2 +- .../UI/Controls}/UIControl_Progress.cpp | 4 +- .../UI/Controls}/UIControl_Progress.h | 0 .../UI/Controls}/UIControl_SaveList.cpp | 4 +- .../UI/Controls}/UIControl_SaveList.h | 0 .../UI/Controls}/UIControl_Slider.cpp | 4 +- .../UI/Controls}/UIControl_Slider.h | 0 .../UI/Controls}/UIControl_SlotList.cpp | 4 +- .../UI/Controls}/UIControl_SlotList.h | 0 .../Controls}/UIControl_SpaceIndicatorBar.cpp | 4 +- .../Controls}/UIControl_SpaceIndicatorBar.h | 0 .../UI/Controls}/UIControl_TextInput.cpp | 6 +- .../UI/Controls}/UIControl_TextInput.h | 0 .../Controls}/UIControl_TexturePackList.cpp | 4 +- .../UI/Controls}/UIControl_TexturePackList.h | 0 .../UI/Controls}/UIControl_Touch.cpp | 4 +- .../UI/Controls}/UIControl_Touch.h | 0 .../Debug}/UIScene_DebugCreateSchematic.cpp | 10 +- .../Debug}/UIScene_DebugCreateSchematic.h | 4 +- .../UI/Scenes/Debug}/UIScene_DebugOptions.cpp | 4 +- .../UI/Scenes/Debug}/UIScene_DebugOptions.h | 4 +- .../UI/Scenes/Debug}/UIScene_DebugOverlay.cpp | 28 +- .../UI/Scenes/Debug}/UIScene_DebugOverlay.h | 4 +- .../Scenes/Debug}/UIScene_DebugSetCamera.cpp | 10 +- .../UI/Scenes/Debug}/UIScene_DebugSetCamera.h | 2 +- .../IUIScene_StartGame.cpp | 10 +- .../IUIScene_StartGame.h | 2 +- .../UIScene_CreateWorldMenu.cpp | 26 +- .../UIScene_CreateWorldMenu.h | 0 .../UIScene_DLCMainMenu.cpp | 4 +- .../UIScene_DLCMainMenu.h | 2 +- .../UIScene_DLCOffersMenu.cpp | 6 +- .../UIScene_DLCOffersMenu.h | 2 +- .../Frontend Menu screens}/UIScene_EULA.cpp | 6 +- .../Frontend Menu screens}/UIScene_EULA.h | 2 +- .../Frontend Menu screens}/UIScene_Intro.cpp | 4 +- .../Frontend Menu screens}/UIScene_Intro.h | 2 +- .../UIScene_JoinMenu.cpp | 16 +- .../Frontend Menu screens}/UIScene_JoinMenu.h | 2 +- .../UIScene_LaunchMoreOptionsMenu.cpp | 6 +- .../UIScene_LaunchMoreOptionsMenu.h | 2 +- .../UIScene_LeaderboardsMenu.cpp | 10 +- .../UIScene_LeaderboardsMenu.h | 4 +- .../UIScene_LoadMenu.cpp | 18 +- .../Frontend Menu screens}/UIScene_LoadMenu.h | 0 .../UIScene_LoadOrJoinMenu.cpp | 30 +- .../UIScene_LoadOrJoinMenu.h | 2 +- .../UIScene_MainMenu.cpp | 14 +- .../Frontend Menu screens}/UIScene_MainMenu.h | 2 +- .../UIScene_NewUpdateMessage.cpp | 6 +- .../UIScene_NewUpdateMessage.h | 2 +- .../UIScene_SaveMessage.cpp | 4 +- .../UIScene_SaveMessage.h | 2 +- .../UIScene_TrialExitUpsell.cpp | 4 +- .../UIScene_TrialExitUpsell.h | 2 +- .../Help & Options}/UIScene_ControlsMenu.cpp | 8 +- .../Help & Options}/UIScene_ControlsMenu.h | 2 +- .../Help & Options}/UIScene_Credits.cpp | 4 +- .../Scenes/Help & Options}/UIScene_Credits.h | 2 +- .../UIScene_HelpAndOptionsMenu.cpp | 6 +- .../UIScene_HelpAndOptionsMenu.h | 2 +- .../Help & Options}/UIScene_HowToPlay.cpp | 6 +- .../Help & Options}/UIScene_HowToPlay.h | 2 +- .../Help & Options}/UIScene_HowToPlayMenu.cpp | 4 +- .../Help & Options}/UIScene_HowToPlayMenu.h | 2 +- .../UIScene_LanguageSelector.cpp | 4 +- .../UIScene_LanguageSelector.h | 2 +- .../Help & Options}/UIScene_ReinstallMenu.cpp | 4 +- .../Help & Options}/UIScene_ReinstallMenu.h | 2 +- .../UIScene_SettingsAudioMenu.cpp | 4 +- .../UIScene_SettingsAudioMenu.h | 2 +- .../UIScene_SettingsControlMenu.cpp | 4 +- .../UIScene_SettingsControlMenu.h | 2 +- .../UIScene_SettingsGraphicsMenu.cpp | 4 +- .../UIScene_SettingsGraphicsMenu.h | 2 +- .../Help & Options}/UIScene_SettingsMenu.cpp | 6 +- .../Help & Options}/UIScene_SettingsMenu.h | 2 +- .../UIScene_SettingsOptionsMenu.cpp | 4 +- .../UIScene_SettingsOptionsMenu.h | 2 +- .../UIScene_SettingsUIMenu.cpp | 4 +- .../Help & Options}/UIScene_SettingsUIMenu.h | 2 +- .../UIScene_SkinSelectMenu.cpp | 6 +- .../Help & Options}/UIScene_SkinSelectMenu.h | 6 +- .../UIScene_AbstractContainerMenu.cpp | 10 +- .../UIScene_AbstractContainerMenu.h | 4 +- .../Containers}/UIScene_AnvilMenu.cpp | 14 +- .../Containers}/UIScene_AnvilMenu.h | 4 +- .../Containers}/UIScene_BeaconMenu.cpp | 10 +- .../Containers}/UIScene_BeaconMenu.h | 4 +- .../Containers}/UIScene_BrewingStandMenu.cpp | 12 +- .../Containers}/UIScene_BrewingStandMenu.h | 2 +- .../Containers}/UIScene_ContainerMenu.cpp | 20 +- .../Containers}/UIScene_ContainerMenu.h | 2 +- .../Containers}/UIScene_CreativeMenu.cpp | 16 +- .../Containers}/UIScene_CreativeMenu.h | 2 +- .../Containers}/UIScene_DispenserMenu.cpp | 10 +- .../Containers}/UIScene_DispenserMenu.h | 2 +- .../Containers}/UIScene_EnchantingMenu.cpp | 10 +- .../Containers}/UIScene_EnchantingMenu.h | 2 +- .../Containers}/UIScene_FireworksMenu.cpp | 12 +- .../Containers}/UIScene_FireworksMenu.h | 2 +- .../Containers}/UIScene_FurnaceMenu.cpp | 10 +- .../Containers}/UIScene_FurnaceMenu.h | 2 +- .../Containers}/UIScene_HopperMenu.cpp | 10 +- .../Containers}/UIScene_HopperMenu.h | 2 +- .../UIScene_HorseInventoryMenu.cpp | 12 +- .../Containers}/UIScene_HorseInventoryMenu.h | 2 +- .../Containers}/UIScene_InventoryMenu.cpp | 28 +- .../Containers}/UIScene_InventoryMenu.h | 4 +- .../Containers}/UIScene_TradingMenu.cpp | 16 +- .../Containers}/UIScene_TradingMenu.h | 2 +- .../UIScene_CraftingMenu.cpp | 10 +- .../UIScene_CraftingMenu.h | 8 +- .../UIScene_DeathMenu.cpp | 10 +- .../In-Game Menu Screens}/UIScene_DeathMenu.h | 2 +- .../In-Game Menu Screens}/UIScene_EndPoem.cpp | 12 +- .../In-Game Menu Screens}/UIScene_EndPoem.h | 2 +- .../UIScene_InGameHostOptionsMenu.cpp | 14 +- .../UIScene_InGameHostOptionsMenu.h | 2 +- .../UIScene_InGameInfoMenu.cpp | 12 +- .../UIScene_InGameInfoMenu.h | 2 +- .../UIScene_InGamePlayerOptionsMenu.cpp | 12 +- .../UIScene_InGamePlayerOptionsMenu.h | 2 +- .../UIScene_InGameSaveManagementMenu.cpp | 4 +- .../UIScene_InGameSaveManagementMenu.h | 2 +- .../UIScene_PauseMenu.cpp | 16 +- .../In-Game Menu Screens}/UIScene_PauseMenu.h | 4 +- .../UIScene_SignEntryMenu.cpp | 18 +- .../UIScene_SignEntryMenu.h | 2 +- .../UIScene_TeleportMenu.cpp | 14 +- .../UIScene_TeleportMenu.h | 2 +- .../UI/Scenes}/UIScene_ConnectingProgress.cpp | 6 +- .../UI/Scenes}/UIScene_ConnectingProgress.h | 2 +- .../UI/Scenes}/UIScene_FullscreenProgress.cpp | 8 +- .../UI/Scenes}/UIScene_FullscreenProgress.h | 2 +- .../UI/Scenes}/UIScene_Keyboard.cpp | 4 +- .../UI/Scenes}/UIScene_Keyboard.h | 2 +- .../UI/Scenes}/UIScene_MessageBox.cpp | 4 +- .../UI/Scenes}/UIScene_MessageBox.h | 2 +- .../UI/Scenes}/UIScene_QuadrantSignin.cpp | 6 +- .../UI/Scenes}/UIScene_QuadrantSignin.h | 2 +- .../Source Files/UI/Scenes}/UIScene_Timer.cpp | 4 +- .../Source Files/UI/Scenes}/UIScene_Timer.h | 2 +- Minecraft.Client/Common/Source Files/UI/UI.h | 119 + .../Source Files}/UI/UIBitmapFont.cpp | 4 +- .../Source Files}/UI/UIBitmapFont.h | 0 .../Source Files}/UI/UIController.cpp | 24 +- .../Source Files}/UI/UIController.h | 4 +- .../Source Files}/UI/UIFontData.cpp | 2 +- .../Source Files}/UI/UIFontData.h | 0 .../Source Files}/UI/UIGroup.cpp | 2 +- .../Source Files}/UI/UIGroup.h | 2 +- .../Source Files}/UI/UILayer.cpp | 2 +- .../Source Files}/UI/UILayer.h | 2 +- .../Source Files}/UI/UIScene.cpp | 10 +- .../Source Files}/UI/UIScene.h | 4 +- .../Source Files}/UI/UIString.cpp | 4 +- .../Source Files}/UI/UIString.h | 0 .../Source Files}/UI/UITTFFont.cpp | 4 +- .../Source Files}/UI/UITTFFont.h | 0 .../Common => ConsoleHelpers}/C4JMemoryPool.h | 0 .../C4JMemoryPoolAllocator.h | 0 .../GameState/DispenserBootstrap.cpp | 1 - Minecraft.Client/GameState/StatsSyncer.cpp | 4 - .../BufferedImage.h | 0 .../{Utils => Header Files}/FrameProfiler.h | 0 .../{Textures => Header Files}/MemTexture.h | 0 .../MemTextureProcessor.h | 0 .../Minecraft.spa.h | 0 .../MobSkinMemTextureProcessor.h | 0 .../Models => Header Files}/SkinBox.h | 0 .../extraX64client.h | 0 Minecraft.Client/Header Files/stdafx.h | 153 + .../{Platform => Header Files}/stubs.h | 0 .../{Platform => }/Linux/Iggy/gdraw/gdraw.c | 8 +- .../{Platform => }/Linux/Iggy/gdraw/gdraw.h | 4 +- .../Windows64 => Linux}/Iggy/include/gdraw.h | 2 +- .../{Platform => }/Linux/Iggy/include/iggy.h | 2 +- .../Linux/Iggy/include/rrCore.h | 0 .../Leaderboards/LinuxLeaderboardManager.cpp | 2 +- .../Leaderboards/LinuxLeaderboardManager.h | 2 +- .../{Platform => }/Linux/LinuxGL.cpp | 8 +- .../{Platform => }/Linux/LinuxGL.h | 0 .../{Platform => }/Linux/Linux_App.cpp | 22 +- .../{Platform => }/Linux/Linux_App.h | 0 .../{Platform => }/Linux/Linux_Minecraft.cpp | 56 +- .../Linux/Linux_ShutdownManager.cpp | 4 +- .../Linux/Linux_UIController.cpp | 4 +- .../{Platform => }/Linux/Linux_UIController.h | 2 +- .../Linux/Sentient/DynamicConfigurations.h | 0 .../Linux/Sentient/MinecraftTelemetry.h | 4 + .../Sentient/SentientManager.h | 2 +- .../Linux/Sentient/SentientStats.h | 0 .../Linux/Sentient/SentientTelemetryCommon.h | 0 .../Linux/Sentient/TelemetryEnum.h | 0 .../Linux/Social/SocialManager.h | 0 .../Stubs/DirectXMath/DirectXCollision.h | 896 +- .../Stubs/DirectXMath/DirectXCollision.inl | 9632 ++--- .../Linux/Stubs/DirectXMath/DirectXColors.h | 1000 +- .../Linux/Stubs/DirectXMath/DirectXMath.h | 6182 ++-- .../Stubs/DirectXMath/DirectXMathConvert.inl | 4402 +-- .../Stubs/DirectXMath/DirectXMathMatrix.inl | 7108 ++-- .../Stubs/DirectXMath/DirectXMathMisc.inl | 4986 +-- .../Stubs/DirectXMath/DirectXMathVector.inl | 29738 ++++++++-------- .../Stubs/DirectXMath/DirectXPackedVector.h | 2658 +- .../Stubs/DirectXMath/DirectXPackedVector.inl | 9006 ++--- .../Linux/Stubs/DirectXMath/sal.h | 0 .../{Platform => }/Linux/Stubs/LinuxStubs.h | 0 .../{Platform => }/Linux/Stubs/d3d11_stubs.h | 0 .../{Platform => }/Linux/Stubs/iggy_stubs.h | 2 +- .../{Platform => }/Linux/Stubs/winapi_stubs.h | 0 .../{Platform => }/Linux/Stubs/xbox_stubs.h | 0 .../{Platform => }/Linux/linux_game_stubs.cpp | 4 +- .../Common/GameRules/ConsoleGameRules.h | 32 - .../Platform/Common/Minecraft_Macros.h | 62 - .../Common/Network/NetworkPlayerQNet.cpp | 109 - .../Common/Network/NetworkPlayerQNet.h | 46 - Minecraft.Client/Platform/Common/UI/UI.h | 119 - .../Windows64/GameConfig/Minecraft.gameconfig | Bin 578964 -> 0 bytes .../Windows64/GameConfig/Minecraft.spa | Bin 244400 -> 0 bytes .../GameHDD/20140401093851/saveData.ms | Bin 3761681 -> 0 bytes .../Windows64/Iggy/gdraw/gdraw_d3d.cpp | 2390 -- .../Platform/Windows64/Iggy/gdraw/gdraw_d3d.h | 125 - .../Windows64/Iggy/gdraw/gdraw_d3d10.cpp | 145 - .../Windows64/Iggy/gdraw/gdraw_d3d10.h | 152 - .../Iggy/gdraw/gdraw_d3d9_shaders.inl | 1075 - .../Platform/Windows64/Iggy/gdraw/gdraw_wgl.c | 219 - .../Platform/Windows64/Iggy/gdraw/gdraw_wgl.h | 48 - .../Platform/Windows64/Iggy/lib/iggy_w32.lib | Bin 49766 -> 0 bytes .../Platform/Windows64/Iggy/lib/iggy_w64.lib | Bin 51572 -> 0 bytes .../Windows64/Iggy/lib/iggyexpruntime_w32.lib | Bin 2430 -> 0 bytes .../Windows64/Iggy/lib/iggyexpruntime_w64.lib | Bin 2386 -> 0 bytes .../Windows64/Iggy/lib/iggyperfmon_w32.lib | Bin 2436 -> 0 bytes .../Windows64/Iggy/lib/iggyperfmon_w64.lib | Bin 2390 -> 0 bytes .../Windows64/Iggy/lib/redist64/iggy_w64.dll | Bin 1063424 -> 0 bytes .../Windows64/Miles/include/imssapi.h | 3267 -- .../Platform/Windows64/Miles/include/tmapi.h | 36 - .../Platform/Windows64/Miles/lib/aud32.lib | Bin 2480 -> 0 bytes .../Platform/Windows64/Miles/lib/mss32.lib | Bin 100962 -> 0 bytes .../Windows64/Miles/lib/mss32midi.lib | Bin 29792 -> 0 bytes .../Platform/Windows64/Miles/lib/mss64.lib | Bin 94326 -> 0 bytes .../Windows64/Miles/lib/mss64midi.lib | Bin 27852 -> 0 bytes .../Miles/lib/redist64/binkawin64.asi | Bin 110592 -> 0 bytes .../Miles/lib/redist64/mss64dolby.flt | Bin 44032 -> 0 bytes .../Miles/lib/redist64/mss64ds3d.flt | Bin 71168 -> 0 bytes .../Windows64/Miles/lib/redist64/mss64dsp.flt | Bin 131584 -> 0 bytes .../Windows64/Miles/lib/redist64/mss64eax.flt | Bin 131584 -> 0 bytes .../Windows64/Miles/lib/redist64/mss64srs.flt | Bin 65024 -> 0 bytes .../Windows64/Sentient/MinecraftTelemetry.h | 4 - .../Platform/Windows64/XML/ATGXmlParser.h | 159 - .../Platform/Windows64/Xbox_BuildVer.h | 60 - Minecraft.Client/Platform/stdafx.h | 153 - .../BufferedImage.cpp | 12 +- .../Extrax64Stubs.cpp | 18 +- .../{Utils => Source Files}/FrameProfiler.cpp | 4 +- .../{Rendering => Source Files}/glWrapper.cpp | 8 +- .../{Platform => Source Files}/stdafx.cpp | 2 +- .../{Platform => Source Files}/stubs.cpp | 2 +- .../Iggy/gdraw/gdraw_d3d10_shaders.inl | 0 .../Windows64/Iggy/gdraw/gdraw_d3d11.cpp | 2 +- .../Windows64/Iggy/gdraw/gdraw_d3d11.h | 0 .../Iggy/gdraw/gdraw_d3d1x_shared.inl | 0 .../Windows64/Iggy/gdraw/gdraw_gl_shaders.inl | 0 .../Windows64/Iggy/gdraw/gdraw_gl_shared.inl | 0 .../Windows64/Iggy/gdraw/gdraw_shared.inl | 0 .../Linux => Windows64}/Iggy/include/gdraw.h | 2 +- .../Windows64/Iggy/include/iggy.h | 0 .../Windows64/Iggy/include/iggyexpruntime.h | 0 .../Windows64/Iggy/include/iggyperfmon.h | 0 .../Windows64/Iggy/include/rrCore.h | 0 .../Miles Sound System/Include}/mss.h | 0 .../Miles Sound System/Include}/rrcore.h | 0 .../{Platform => }/Windows64/Resource.h | 0 .../WindowsLeaderboardManager.cpp | 2 +- .../Leaderboards/WindowsLeaderboardManager.h | 2 +- .../Sentient/DynamicConfigurations.h | 0 .../Sentient/MinecraftTelemetry.h | 0 .../Source Files}/Sentient/SentientManager.h | 0 .../Source Files}/Sentient/SentientStats.h | 0 .../Sentient/SentientTelemetryCommon.h | 0 .../Source Files}/Sentient/TelemetryEnum.h | 0 .../Source Files}/Social/SocialManager.h | 0 .../Source Files}/Windows64_Minecraft.cpp | 54 +- .../Windows64/Windows64_App.cpp | 20 +- .../{Platform => }/Windows64/Windows64_App.h | 0 .../Windows64/Windows64_UIController.cpp | 6 +- .../Windows64/Windows64_UIController.h | 2 +- .../Common => Windows64}/XML/ATGXmlParser.cpp | 2 +- .../Common => Windows64}/XML/ATGXmlParser.h | 0 .../XML/xmlFilesCallback.h | 0 .../minecraft/client}/Camera.cpp | 12 +- .../minecraft/client}/Camera.h | 4 +- .../minecraft/client}/ClientConstants.cpp | 2 +- .../minecraft/client}/ClientConstants.h | 0 .../minecraft/client}/DemoUser.cpp | 2 +- .../minecraft/client}/DemoUser.h | 2 +- .../minecraft/client}/GuiMessage.cpp | 2 +- .../{UI => net/minecraft/client}/GuiMessage.h | 0 .../minecraft/client}/KeyMapping.cpp | 2 +- .../minecraft/client}/KeyMapping.h | 0 .../minecraft/client}/Lighting.cpp | 6 +- .../minecraft/client}/Lighting.h | 0 .../minecraft/client}/MemoryTracker.cpp | 8 +- .../minecraft/client}/MemoryTracker.h | 0 .../{ => net/minecraft/client}/Minecraft.cpp | 134 +- .../{ => net/minecraft/client}/Minecraft.h | 8 +- .../minecraft/client}/Options.cpp | 28 +- .../minecraft/client}/Options.h | 2 +- .../minecraft/client}/ProgressRenderer.cpp | 8 +- .../minecraft/client}/ProgressRenderer.h | 2 +- .../{Utils => net/minecraft/client}/Timer.cpp | 4 +- .../{Utils => net/minecraft/client}/Timer.h | 0 .../{Player => net/minecraft/client}/User.cpp | 4 +- .../{Player => net/minecraft/client}/User.h | 0 .../minecraft/client/gui}/Button.cpp | 4 +- .../{UI => net/minecraft/client/gui}/Button.h | 0 .../minecraft/client/gui}/ChatScreen.cpp | 8 +- .../minecraft/client/gui}/ChatScreen.h | 2 +- .../minecraft/client/gui}/ConfirmScreen.cpp | 6 +- .../minecraft/client/gui}/ConfirmScreen.h | 2 +- .../minecraft/client/gui}/ControlsScreen.cpp | 8 +- .../minecraft/client/gui}/ControlsScreen.h | 2 +- .../client/gui}/CreateWorldScreen.cpp | 24 +- .../minecraft/client/gui}/CreateWorldScreen.h | 2 +- .../minecraft/client/gui}/DeathScreen.cpp | 10 +- .../minecraft/client/gui}/DeathScreen.h | 2 +- .../minecraft/client/gui}/EditBox.cpp | 4 +- .../minecraft/client/gui}/EditBox.h | 0 .../client/gui}/EnchantmentScreen.cpp | 18 +- .../minecraft/client/gui}/EnchantmentScreen.h | 4 +- .../minecraft/client/gui}/ErrorScreen.cpp | 2 +- .../minecraft/client/gui}/ErrorScreen.h | 2 +- .../{UI => net/minecraft/client/gui}/Font.cpp | 18 +- .../{UI => net/minecraft/client/gui}/Font.h | 0 .../{UI => net/minecraft/client/gui}/Gui.cpp | 62 +- .../{UI => net/minecraft/client/gui}/Gui.h | 4 +- .../minecraft/client/gui}/GuiComponent.cpp | 4 +- .../minecraft/client/gui}/GuiComponent.h | 0 .../minecraft/client/gui}/HopperScreen.cpp | 12 +- .../minecraft/client/gui}/HopperScreen.h | 2 +- .../minecraft/client/gui}/InBedChatScreen.cpp | 10 +- .../minecraft/client/gui}/InBedChatScreen.h | 0 .../client/gui}/JoinMultiplayerScreen.cpp | 10 +- .../client/gui}/JoinMultiplayerScreen.h | 2 +- .../minecraft/client/gui}/MerchantScreen.cpp | 32 +- .../minecraft/client/gui}/MerchantScreen.h | 6 +- .../minecraft/client/gui}/MessageScreen.cpp | 2 +- .../minecraft/client/gui}/MessageScreen.h | 2 +- .../minecraft/client/gui}/Minimap.cpp | 14 +- .../minecraft/client/gui}/Minimap.h | 2 +- .../minecraft/client/gui}/NameEntryScreen.cpp | 6 +- .../minecraft/client/gui}/NameEntryScreen.h | 2 +- .../minecraft/client/gui}/OptionsScreen.cpp | 10 +- .../minecraft/client/gui}/OptionsScreen.h | 2 +- .../minecraft/client/gui}/PauseScreen.cpp | 22 +- .../minecraft/client/gui}/PauseScreen.h | 2 +- .../client/gui}/RenameWorldScreen.cpp | 12 +- .../minecraft/client/gui}/RenameWorldScreen.h | 2 +- .../minecraft/client/gui}/RepairScreen.cpp | 20 +- .../minecraft/client/gui}/RepairScreen.h | 8 +- .../minecraft/client/gui}/Screen.cpp | 10 +- .../{UI => net/minecraft/client/gui}/Screen.h | 0 .../client/gui}/ScreenSizeCalculator.cpp | 4 +- .../client/gui}/ScreenSizeCalculator.h | 0 .../client/gui}/ScrolledSelectionList.cpp | 8 +- .../client/gui}/ScrolledSelectionList.h | 0 .../client/gui}/SelectWorldScreen.cpp | 12 +- .../minecraft/client/gui}/SelectWorldScreen.h | 4 +- .../minecraft/client/gui}/SlideButton.cpp | 2 +- .../minecraft/client/gui}/SlideButton.h | 2 +- .../minecraft/client/gui}/SmallButton.cpp | 2 +- .../minecraft/client/gui}/SmallButton.h | 2 +- .../client/gui}/TradeSwitchButton.cpp | 12 +- .../minecraft/client/gui}/TradeSwitchButton.h | 0 .../client/gui}/VideoSettingsScreen.cpp | 10 +- .../client/gui}/VideoSettingsScreen.h | 2 +- .../gui/achievement}/AchievementPopup.cpp | 16 +- .../gui/achievement}/AchievementPopup.h | 0 .../gui/achievement}/AchievementScreen.cpp | 22 +- .../gui/achievement}/AchievementScreen.h | 2 +- .../client/gui/achievement}/StatsScreen.cpp | 14 +- .../client/gui/achievement}/StatsScreen.h | 0 .../gui/inventory}/AbstractBeaconButton.cpp | 6 +- .../gui/inventory}/AbstractBeaconButton.h | 2 +- .../inventory}/AbstractContainerScreen.cpp | 20 +- .../gui/inventory}/AbstractContainerScreen.h | 0 .../gui/inventory}/BeaconCancelButton.cpp | 6 +- .../gui/inventory}/BeaconCancelButton.h | 0 .../gui/inventory}/BeaconConfirmButton.cpp | 6 +- .../gui/inventory}/BeaconConfirmButton.h | 0 .../gui/inventory}/BeaconPowerButton.cpp | 12 +- .../client/gui/inventory}/BeaconPowerButton.h | 2 +- .../client/gui/inventory}/BeaconScreen.cpp | 28 +- .../client/gui/inventory}/BeaconScreen.h | 4 +- .../gui/inventory}/BrewingStandScreen.cpp | 16 +- .../gui/inventory}/BrewingStandScreen.h | 4 +- .../client/gui/inventory}/ContainerScreen.cpp | 6 +- .../client/gui/inventory}/ContainerScreen.h | 0 .../client/gui/inventory}/CraftingScreen.cpp | 10 +- .../client/gui/inventory}/CraftingScreen.h | 0 .../inventory}/CreativeInventoryScreen.cpp | 22 +- .../gui/inventory}/CreativeInventoryScreen.h | 6 +- .../client/gui/inventory}/FurnaceScreen.cpp | 10 +- .../client/gui/inventory}/FurnaceScreen.h | 0 .../gui/inventory}/HorseInventoryScreen.cpp | 14 +- .../gui/inventory}/HorseInventoryScreen.h | 2 +- .../client/gui/inventory}/InventoryScreen.cpp | 16 +- .../client/gui/inventory}/InventoryScreen.h | 0 .../client/gui/inventory}/TextEditScreen.cpp | 18 +- .../client/gui/inventory}/TextEditScreen.h | 0 .../client/gui/inventory}/TrapScreen.cpp | 12 +- .../client/gui/inventory}/TrapScreen.h | 0 .../client/gui/particle}/GuiParticle.cpp | 4 +- .../client/gui/particle}/GuiParticle.h | 0 .../client/gui/particle}/GuiParticles.cpp | 4 +- .../client/gui/particle}/GuiParticles.h | 2 +- .../minecraft/client/level}/DemoLevel.cpp | 4 +- .../minecraft/client/level}/DemoLevel.h | 2 +- .../minecraft/client/model}/BatModel.cpp | 6 +- .../minecraft/client/model}/BatModel.h | 2 +- .../minecraft/client/model}/BlazeModel.cpp | 6 +- .../minecraft/client/model}/BlazeModel.h | 2 +- .../minecraft/client/model}/BoatModel.cpp | 2 +- .../minecraft/client/model}/BoatModel.h | 4 +- .../minecraft/client/model}/BookModel.cpp | 6 +- .../minecraft/client/model}/BookModel.h | 2 +- .../minecraft/client/model}/ChestModel.cpp | 4 +- .../minecraft/client/model}/ChestModel.h | 2 +- .../minecraft/client/model}/ChickenModel.cpp | 6 +- .../minecraft/client/model}/ChickenModel.h | 2 +- .../minecraft/client/model}/CowModel.cpp | 4 +- .../minecraft/client/model}/CowModel.h | 0 .../minecraft/client/model}/CreeperModel.cpp | 6 +- .../minecraft/client/model}/CreeperModel.h | 2 +- .../minecraft/client/model/EndermanModel.cpp} | 6 +- .../minecraft/client/model/EndermanModel.h} | 0 .../minecraft/client/model}/GhastModel.cpp | 8 +- .../minecraft/client/model}/GhastModel.h | 2 +- .../minecraft/client/model}/HumanoidModel.cpp | 8 +- .../minecraft/client/model}/HumanoidModel.h | 2 +- .../client/model}/LargeChestModel.cpp | 4 +- .../minecraft/client/model}/LargeChestModel.h | 0 .../client/model}/LavaSlimeModel.cpp | 8 +- .../minecraft/client/model}/LavaSlimeModel.h | 2 +- .../client/model}/LeashKnotModel.cpp | 4 +- .../minecraft/client/model}/LeashKnotModel.h | 2 +- .../minecraft/client/model}/MinecartModel.cpp | 4 +- .../minecraft/client/model}/MinecartModel.h | 2 +- .../minecraft/client/model}/ModelHorse.cpp | 8 +- .../minecraft/client/model}/ModelHorse.h | 2 +- .../minecraft/client/model}/OcelotModel.cpp | 8 +- .../minecraft/client/model}/OcelotModel.h | 2 +- .../minecraft/client/model}/PigModel.cpp | 4 +- .../minecraft/client/model}/PigModel.h | 0 .../minecraft/client/model}/Polygon.cpp | 2 +- .../minecraft/client/model}/Polygon.h | 4 +- .../client/model}/QuadrupedModel.cpp | 6 +- .../minecraft/client/model}/QuadrupedModel.h | 2 +- .../minecraft/client/model}/SheepFurModel.cpp | 6 +- .../minecraft/client/model}/SheepFurModel.h | 0 .../minecraft/client/model}/SheepModel.cpp | 6 +- .../minecraft/client/model}/SheepModel.h | 0 .../minecraft/client/model}/SignModel.cpp | 4 +- .../minecraft/client/model}/SignModel.h | 2 +- .../client/model}/SilverfishModel.cpp | 8 +- .../minecraft/client/model}/SilverfishModel.h | 2 +- .../client/model}/SkeletonHeadModel.cpp | 4 +- .../client/model}/SkeletonHeadModel.h | 2 +- .../minecraft/client/model}/SkeletonModel.cpp | 8 +- .../minecraft/client/model}/SkeletonModel.h | 0 .../minecraft/client/model}/SkiModel.cpp | 2 +- .../minecraft/client/model}/SkiModel.h | 4 +- .../minecraft/client/model}/SlimeModel.cpp | 4 +- .../minecraft/client/model}/SlimeModel.h | 2 +- .../minecraft/client/model}/SnowManModel.cpp | 6 +- .../minecraft/client/model}/SnowManModel.h | 2 +- .../minecraft/client/model}/SpiderModel.cpp | 6 +- .../minecraft/client/model}/SpiderModel.h | 2 +- .../minecraft/client/model}/SquidModel.cpp | 6 +- .../minecraft/client/model}/SquidModel.h | 2 +- .../minecraft/client/model}/Vertex.cpp | 0 .../minecraft/client/model}/Vertex.h | 2 +- .../client/model}/VillagerGolemModel.cpp | 6 +- .../client/model}/VillagerGolemModel.h | 2 +- .../minecraft/client/model}/VillagerModel.cpp | 6 +- .../minecraft/client/model}/VillagerModel.h | 2 +- .../client/model}/VillagerZombieModel.cpp | 6 +- .../client/model}/VillagerZombieModel.h | 0 .../minecraft/client/model}/WitchModel.cpp | 6 +- .../minecraft/client/model}/WitchModel.h | 0 .../client/model}/WitherBossModel.cpp | 6 +- .../minecraft/client/model}/WitherBossModel.h | 4 +- .../minecraft/client/model}/WolfModel.cpp | 8 +- .../minecraft/client/model}/WolfModel.h | 4 +- .../minecraft/client/model}/ZombieModel.cpp | 6 +- .../minecraft/client/model}/ZombieModel.h | 0 .../client/model/dragon}/DragonModel.cpp | 6 +- .../client/model/dragon}/DragonModel.h | 4 +- .../model/dragon}/EnderCrystalModel.cpp | 2 +- .../client/model/dragon}/EnderCrystalModel.h | 4 +- .../minecraft/client/model/geom}/Cube.cpp | 8 +- .../minecraft/client/model/geom}/Cube.h | 6 +- .../minecraft/client/model/geom}/Model.cpp | 4 +- .../minecraft/client/model/geom}/Model.h | 4 +- .../client/model/geom}/ModelPart.cpp | 6 +- .../minecraft/client/model/geom}/ModelPart.h | 4 +- .../minecraft/client/model/geom}/TexOffs.cpp | 2 +- .../minecraft/client/model/geom}/TexOffs.h | 0 .../client/multiplayer}/ClientConnection.cpp | 92 +- .../client/multiplayer}/ClientConnection.h | 2 +- .../client/multiplayer}/ConnectScreen.cpp | 14 +- .../client/multiplayer}/ConnectScreen.h | 2 +- .../multiplayer}/DisconnectedScreen.cpp | 8 +- .../client/multiplayer}/DisconnectedScreen.h | 2 +- .../multiplayer}/MultiPlayerChunkCache.cpp | 20 +- .../multiplayer}/MultiPlayerChunkCache.h | 6 +- .../multiplayer}/MultiPlayerGameMode.cpp | 22 +- .../client/multiplayer}/MultiPlayerGameMode.h | 2 +- .../client/multiplayer}/MultiPlayerLevel.cpp | 28 +- .../client/multiplayer}/MultiPlayerLevel.h | 8 +- .../multiplayer}/MultiPlayerLocalPlayer.cpp | 30 +- .../multiplayer}/MultiPlayerLocalPlayer.h | 4 +- .../client/multiplayer}/PlayerInfo.h | 0 .../multiplayer}/ReceivingLevelScreen.cpp | 6 +- .../multiplayer}/ReceivingLevelScreen.h | 2 +- .../client/particle}/BreakingItemParticle.cpp | 10 +- .../client/particle}/BreakingItemParticle.h | 0 .../client/particle}/BubbleParticle.cpp | 12 +- .../client/particle}/BubbleParticle.h | 0 .../client/particle}/CritParticle.cpp | 10 +- .../minecraft/client/particle}/CritParticle.h | 0 .../client/particle}/CritParticle2.cpp | 4 +- .../client/particle}/CritParticle2.h | 0 .../client/particle}/DragonBreathParticle.cpp | 4 +- .../client/particle}/DragonBreathParticle.h | 0 .../client/particle}/DripParticle.cpp | 12 +- .../minecraft/client/particle}/DripParticle.h | 0 .../particle}/EnchantmentTableParticle.cpp | 4 +- .../particle}/EnchantmentTableParticle.h | 0 .../client/particle}/EnderParticle.cpp | 6 +- .../client/particle}/EnderParticle.h | 0 .../client/particle}/ExplodeParticle.cpp | 6 +- .../client/particle}/ExplodeParticle.h | 0 .../client/particle}/FireworksParticles.cpp | 8 +- .../client/particle}/FireworksParticles.h | 2 +- .../client/particle}/FlameParticle.cpp | 6 +- .../client/particle}/FlameParticle.h | 0 .../client/particle}/FootstepParticle.cpp | 12 +- .../client/particle}/FootstepParticle.h | 0 .../client/particle}/HeartParticle.cpp | 2 +- .../client/particle}/HeartParticle.h | 0 .../particle}/HugeExplosionParticle.cpp | 10 +- .../client/particle}/HugeExplosionParticle.h | 0 .../particle}/HugeExplosionSeedParticle.cpp | 6 +- .../particle}/HugeExplosionSeedParticle.h | 0 .../client/particle}/LavaParticle.cpp | 8 +- .../minecraft/client/particle}/LavaParticle.h | 0 .../client/particle}/NetherPortalParticle.cpp | 8 +- .../client/particle}/NetherPortalParticle.h | 0 .../client/particle}/NoteParticle.cpp | 4 +- .../minecraft/client/particle}/NoteParticle.h | 0 .../minecraft/client/particle}/Particle.cpp | 12 +- .../minecraft/client/particle}/Particle.h | 4 +- .../client/particle}/ParticleEngine.cpp | 20 +- .../client/particle}/ParticleEngine.h | 0 .../client/particle}/PlayerCloudParticle.cpp | 10 +- .../client/particle}/PlayerCloudParticle.h | 0 .../client/particle}/RedDustParticle.cpp | 4 +- .../client/particle}/RedDustParticle.h | 0 .../client/particle}/SmokeParticle.cpp | 4 +- .../client/particle}/SmokeParticle.h | 0 .../client/particle}/SnowShovelParticle.cpp | 4 +- .../client/particle}/SnowShovelParticle.h | 0 .../client/particle}/SpellParticle.cpp | 4 +- .../client/particle}/SpellParticle.h | 0 .../client/particle}/SplashParticle.cpp | 2 +- .../client/particle}/SplashParticle.h | 0 .../client/particle}/SuspendedParticle.cpp | 12 +- .../client/particle}/SuspendedParticle.h | 0 .../particle}/SuspendedTownParticle.cpp | 6 +- .../client/particle}/SuspendedTownParticle.h | 0 .../particle}/TakeAnimationParticle.cpp | 10 +- .../client/particle}/TakeAnimationParticle.h | 0 .../client/particle}/TerrainParticle.cpp | 10 +- .../client/particle}/TerrainParticle.h | 0 .../client/particle}/WaterDropParticle.cpp | 10 +- .../client/particle}/WaterDropParticle.h | 0 .../minecraft/client/player}/Input.cpp | 14 +- .../minecraft/client/player}/Input.h | 0 .../minecraft/client/player}/LocalPlayer.cpp | 106 +- .../minecraft/client/player}/LocalPlayer.h | 6 +- .../minecraft/client/player}/RemotePlayer.cpp | 6 +- .../minecraft/client/player}/RemotePlayer.h | 4 +- .../client/renderer}/BossMobGuiInfo.cpp | 4 +- .../client/renderer}/BossMobGuiInfo.h | 0 .../minecraft/client/renderer}/Chunk.cpp | 16 +- .../minecraft/client/renderer}/Chunk.h | 4 +- .../client/renderer}/DirtyChunkSorter.cpp | 6 +- .../client/renderer}/DirtyChunkSorter.h | 0 .../client/renderer}/DistanceChunkSorter.cpp | 6 +- .../client/renderer}/DistanceChunkSorter.h | 0 .../client/renderer}/EntityTileRenderer.cpp | 8 +- .../client/renderer}/EntityTileRenderer.h | 0 .../client/renderer}/GameRenderer.cpp | 96 +- .../minecraft/client/renderer}/GameRenderer.h | 6 +- .../client/renderer}/HttpTexture.cpp | 2 +- .../minecraft/client/renderer}/HttpTexture.h | 0 .../client/renderer}/HttpTextureProcessor.h | 0 .../client/renderer}/ItemInHandRenderer.cpp | 32 +- .../client/renderer}/ItemInHandRenderer.h | 0 .../client/renderer}/LevelRenderer.cpp | 116 +- .../client/renderer}/LevelRenderer.h | 8 +- .../minecraft/client/renderer}/MemTexture.cpp | 4 +- .../renderer}/MobSkinMemTextureProcessor.cpp | 4 +- .../renderer}/MobSkinTextureProcessor.cpp | 2 +- .../renderer}/MobSkinTextureProcessor.h | 0 .../client/renderer}/OffsettedRenderList.cpp | 4 +- .../client/renderer}/OffsettedRenderList.h | 0 .../minecraft/client/renderer}/Rect2i.cpp | 2 +- .../minecraft/client/renderer}/Rect2i.h | 0 .../minecraft/client/renderer}/Tesselator.cpp | 8 +- .../minecraft/client/renderer}/Tesselator.h | 0 .../minecraft/client/renderer}/Textures.cpp | 38 +- .../minecraft/client/renderer}/Textures.h | 2 +- .../client/renderer}/TileRenderer.cpp | 24 +- .../minecraft/client/renderer}/TileRenderer.h | 0 .../renderer/culling}/AllowAllCuller.cpp | 2 +- .../client/renderer/culling}/AllowAllCuller.h | 0 .../client/renderer/culling}/Culler.h | 2 +- .../client/renderer/culling}/Frustum.cpp | 6 +- .../client/renderer/culling}/Frustum.h | 0 .../renderer/culling}/FrustumCuller.cpp | 2 +- .../client/renderer/culling}/FrustumCuller.h | 4 +- .../client/renderer/culling}/FrustumData.cpp | 2 +- .../client/renderer/culling}/FrustumData.h | 2 +- .../renderer/culling}/ViewportCuller.cpp | 4 +- .../client/renderer/culling}/ViewportCuller.h | 2 +- .../client/renderer/entity}/ArrowRenderer.cpp | 6 +- .../client/renderer/entity}/ArrowRenderer.h | 0 .../client/renderer/entity}/BatRenderer.cpp | 6 +- .../client/renderer/entity}/BatRenderer.h | 0 .../client/renderer/entity}/BlazeRenderer.cpp | 6 +- .../client/renderer/entity}/BlazeRenderer.h | 0 .../client/renderer/entity}/BoatRenderer.cpp | 8 +- .../client/renderer/entity}/BoatRenderer.h | 0 .../renderer/entity}/CaveSpiderRenderer.cpp | 2 +- .../renderer/entity}/CaveSpiderRenderer.h | 0 .../renderer/entity}/ChickenRenderer.cpp | 6 +- .../client/renderer/entity}/ChickenRenderer.h | 0 .../client/renderer/entity}/CowRenderer.cpp | 2 +- .../client/renderer/entity}/CowRenderer.h | 0 .../renderer/entity}/CreeperRenderer.cpp | 8 +- .../client/renderer/entity}/CreeperRenderer.h | 0 .../renderer/entity}/DefaultRenderer.cpp | 4 +- .../client/renderer/entity}/DefaultRenderer.h | 0 .../renderer/entity}/EnderCrystalRenderer.cpp | 6 +- .../renderer/entity}/EnderCrystalRenderer.h | 0 .../renderer/entity}/EnderDragonRenderer.cpp | 10 +- .../renderer/entity}/EnderDragonRenderer.h | 0 .../renderer/entity/EndermanRenderer.cpp} | 12 +- .../renderer/entity/EndermanRenderer.h} | 0 .../entity}/EntityRenderDispatcher.cpp | 66 +- .../renderer/entity}/EntityRenderDispatcher.h | 4 +- .../renderer/entity}/EntityRenderer.cpp | 24 +- .../client/renderer/entity}/EntityRenderer.h | 10 +- .../entity}/ExperienceOrbRenderer.cpp | 12 +- .../renderer/entity}/ExperienceOrbRenderer.h | 0 .../renderer/entity}/FallingTileRenderer.cpp | 12 +- .../renderer/entity}/FallingTileRenderer.h | 0 .../renderer/entity}/FireballRenderer.cpp | 14 +- .../renderer/entity}/FireballRenderer.h | 0 .../renderer/entity}/FishingHookRenderer.cpp | 14 +- .../renderer/entity}/FishingHookRenderer.h | 0 .../client/renderer/entity}/GhastRenderer.cpp | 6 +- .../client/renderer/entity}/GhastRenderer.h | 0 .../renderer/entity}/GiantMobRenderer.cpp | 2 +- .../renderer/entity}/GiantMobRenderer.h | 0 .../client/renderer/entity}/HorseRenderer.cpp | 4 +- .../client/renderer/entity}/HorseRenderer.h | 2 +- .../renderer/entity}/HumanoidMobRenderer.cpp | 18 +- .../renderer/entity}/HumanoidMobRenderer.h | 0 .../renderer/entity}/ItemFrameRenderer.cpp | 28 +- .../renderer/entity}/ItemFrameRenderer.h | 0 .../client/renderer/entity}/ItemRenderer.cpp | 22 +- .../client/renderer/entity}/ItemRenderer.h | 0 .../renderer/entity}/ItemSpriteRenderer.cpp | 12 +- .../renderer/entity}/ItemSpriteRenderer.h | 0 .../renderer/entity}/LavaSlimeRenderer.cpp | 6 +- .../renderer/entity}/LavaSlimeRenderer.h | 0 .../renderer/entity}/LeashKnotRenderer.cpp | 4 +- .../renderer/entity}/LeashKnotRenderer.h | 0 .../entity}/LightningBoltRenderer.cpp | 4 +- .../renderer/entity}/LightningBoltRenderer.h | 0 .../renderer/entity}/LivingEntityRenderer.cpp | 16 +- .../renderer/entity}/LivingEntityRenderer.h | 4 +- .../renderer/entity}/MinecartRenderer.cpp | 10 +- .../renderer/entity}/MinecartRenderer.h | 0 .../entity}/MinecartSpawnerRenderer.cpp | 8 +- .../entity}/MinecartSpawnerRenderer.h | 0 .../client/renderer/entity}/MobRenderer.cpp | 14 +- .../client/renderer/entity}/MobRenderer.h | 0 .../renderer/entity}/MushroomCowRenderer.cpp | 12 +- .../renderer/entity}/MushroomCowRenderer.h | 0 .../renderer/entity}/OcelotRenderer.cpp | 4 +- .../client/renderer/entity}/OcelotRenderer.h | 0 .../renderer/entity}/PaintingRenderer.cpp | 10 +- .../renderer/entity}/PaintingRenderer.h | 0 .../client/renderer/entity}/PigRenderer.cpp | 4 +- .../client/renderer/entity}/PigRenderer.h | 0 .../renderer/entity}/PlayerRenderer.cpp | 24 +- .../client/renderer/entity}/PlayerRenderer.h | 2 +- .../client/renderer/entity}/SheepRenderer.cpp | 6 +- .../client/renderer/entity}/SheepRenderer.h | 0 .../renderer/entity}/SilverfishRenderer.cpp | 6 +- .../renderer/entity}/SilverfishRenderer.h | 0 .../renderer/entity}/SkeletonRenderer.cpp | 6 +- .../renderer/entity}/SkeletonRenderer.h | 0 .../client/renderer/entity}/SlimeRenderer.cpp | 4 +- .../client/renderer/entity}/SlimeRenderer.h | 0 .../renderer/entity}/SnowManRenderer.cpp | 12 +- .../client/renderer/entity}/SnowManRenderer.h | 0 .../renderer/entity}/SpiderRenderer.cpp | 6 +- .../client/renderer/entity}/SpiderRenderer.h | 0 .../client/renderer/entity}/SquidRenderer.cpp | 4 +- .../client/renderer/entity}/SquidRenderer.h | 0 .../renderer/entity}/TntMinecartRenderer.cpp | 6 +- .../renderer/entity}/TntMinecartRenderer.h | 0 .../client/renderer/entity}/TntRenderer.cpp | 10 +- .../client/renderer/entity}/TntRenderer.h | 0 .../entity}/VillagerGolemRenderer.cpp | 12 +- .../renderer/entity}/VillagerGolemRenderer.h | 0 .../renderer/entity}/VillagerRenderer.cpp | 6 +- .../renderer/entity}/VillagerRenderer.h | 0 .../client/renderer/entity}/WitchRenderer.cpp | 8 +- .../client/renderer/entity}/WitchRenderer.h | 0 .../renderer/entity}/WitherBossRenderer.cpp | 8 +- .../renderer/entity}/WitherBossRenderer.h | 0 .../renderer/entity}/WitherSkullRenderer.cpp | 6 +- .../renderer/entity}/WitherSkullRenderer.h | 0 .../client/renderer/entity}/WolfRenderer.cpp | 6 +- .../client/renderer/entity}/WolfRenderer.h | 0 .../renderer/entity}/ZombieRenderer.cpp | 8 +- .../client/renderer/entity}/ZombieRenderer.h | 0 .../texture}/PreStitchedTextureMap.cpp | 30 +- .../renderer/texture}/PreStitchedTextureMap.h | 2 +- .../client/renderer/texture}/SimpleIcon.cpp | 2 +- .../client/renderer/texture}/SimpleIcon.h | 4 +- .../client/renderer/texture}/StitchSlot.cpp | 6 +- .../client/renderer/texture}/StitchSlot.h | 0 .../renderer/texture}/StitchedTexture.cpp | 12 +- .../renderer/texture}/StitchedTexture.h | 2 +- .../client/renderer/texture}/Stitcher.cpp | 8 +- .../client/renderer/texture}/Stitcher.h | 2 +- .../client/renderer/texture}/Texture.cpp | 6 +- .../client/renderer/texture}/Texture.h | 0 .../client/renderer/texture}/TextureAtlas.cpp | 4 +- .../client/renderer/texture}/TextureAtlas.h | 0 .../renderer/texture}/TextureHolder.cpp | 6 +- .../client/renderer/texture}/TextureHolder.h | 0 .../renderer/texture}/TextureManager.cpp | 12 +- .../client/renderer/texture}/TextureManager.h | 0 .../client/renderer/texture}/TextureMap.cpp | 22 +- .../client/renderer/texture}/TextureMap.h | 2 +- .../renderer/texture/custom}/ClockTexture.cpp | 14 +- .../renderer/texture/custom}/ClockTexture.h | 2 +- .../texture/custom}/CompassTexture.cpp | 14 +- .../renderer/texture/custom}/CompassTexture.h | 2 +- .../renderer/tileentity}/BeaconRenderer.cpp | 6 +- .../renderer/tileentity}/BeaconRenderer.h | 0 .../renderer/tileentity}/ChestRenderer.cpp | 14 +- .../renderer/tileentity}/ChestRenderer.h | 0 .../tileentity}/EnchantTableRenderer.cpp | 8 +- .../tileentity}/EnchantTableRenderer.h | 0 .../tileentity}/EnderChestRenderer.cpp | 6 +- .../renderer/tileentity}/EnderChestRenderer.h | 2 +- .../tileentity}/MobSpawnerRenderer.cpp | 8 +- .../renderer/tileentity}/MobSpawnerRenderer.h | 0 .../tileentity}/PistonPieceRenderer.cpp | 14 +- .../tileentity}/PistonPieceRenderer.h | 0 .../renderer/tileentity}/SignRenderer.cpp | 14 +- .../renderer/tileentity}/SignRenderer.h | 0 .../tileentity}/SkullTileRenderer.cpp | 12 +- .../renderer/tileentity}/SkullTileRenderer.h | 0 .../tileentity}/TheEndPortalRenderer.cpp | 10 +- .../tileentity}/TheEndPortalRenderer.h | 0 .../TileEntityRenderDispatcher.cpp | 10 +- .../tileentity}/TileEntityRenderDispatcher.h | 4 +- .../tileentity}/TileEntityRenderer.cpp | 2 +- .../renderer/tileentity}/TileEntityRenderer.h | 4 +- .../client/resources}/ResourceLocation.h | 2 +- .../client/skins}/AbstractTexturePack.cpp | 8 +- .../client/skins}/AbstractTexturePack.h | 0 .../client/skins}/DLCTexturePack.cpp | 28 +- .../minecraft/client/skins}/DLCTexturePack.h | 0 .../client/skins}/DefaultTexturePack.cpp | 6 +- .../client/skins}/DefaultTexturePack.h | 0 .../client/skins}/FileTexturePack.cpp | 2 +- .../minecraft/client/skins}/FileTexturePack.h | 0 .../client/skins}/FolderTexturePack.cpp | 2 +- .../client/skins}/FolderTexturePack.h | 0 .../minecraft/client/skins}/TexturePack.cpp | 2 +- .../minecraft/client/skins}/TexturePack.h | 2 +- .../client/skins}/TexturePackRepository.cpp | 10 +- .../client/skins}/TexturePackRepository.h | 0 .../minecraft/client/title}/TitleScreen.cpp | 26 +- .../minecraft/client/title}/TitleScreen.h | 2 +- .../minecraft/server}/ConsoleInput.cpp | 2 +- .../minecraft/server}/ConsoleInput.h | 0 .../minecraft/server}/ConsoleInputSource.h | 0 .../minecraft/server/DispenserBootstrap.cpp | 1 + .../minecraft/server}/DispenserBootstrap.h | 8 +- .../minecraft/server}/MinecraftServer.cpp | 86 +- .../minecraft/server}/MinecraftServer.h | 8 +- .../minecraft/server}/PlayerList.cpp | 52 +- .../minecraft/server}/PlayerList.h | 2 +- .../minecraft/server}/ServerInterface.h | 0 .../minecraft/server}/ServerScoreboard.cpp | 2 +- .../minecraft/server}/ServerScoreboard.h | 2 +- .../minecraft/server}/Settings.cpp | 4 +- .../minecraft/server}/Settings.h | 0 .../commands}/ServerCommandDispatcher.cpp | 12 +- .../commands}/ServerCommandDispatcher.h | 4 +- .../server/commands}/TeleportCommand.cpp | 16 +- .../server/commands}/TeleportCommand.h | 2 +- .../minecraft/server/level}/CreativeMode.cpp | 16 +- .../minecraft/server/level}/CreativeMode.h | 0 .../minecraft/server/level}/DemoMode.cpp | 4 +- .../minecraft/server/level}/DemoMode.h | 0 .../server/level}/DerivedServerLevel.cpp | 6 +- .../server/level}/DerivedServerLevel.h | 0 .../minecraft/server/level}/EntityTracker.cpp | 34 +- .../minecraft/server/level}/EntityTracker.h | 4 +- .../minecraft/server/level}/GameMode.cpp | 20 +- .../minecraft/server/level}/GameMode.h | 0 .../server/level}/PlayerChunkMap.cpp | 22 +- .../minecraft/server/level}/PlayerChunkMap.h | 4 +- .../server/level}/ServerChunkCache.cpp | 24 +- .../server/level}/ServerChunkCache.h | 12 +- .../minecraft/server/level}/ServerLevel.cpp | 74 +- .../minecraft/server/level}/ServerLevel.h | 4 +- .../server/level}/ServerLevelListener.cpp | 18 +- .../server/level}/ServerLevelListener.h | 2 +- .../minecraft/server/level}/ServerPlayer.cpp | 54 +- .../minecraft/server/level}/ServerPlayer.h | 6 +- .../server/level}/ServerPlayerGameMode.cpp | 24 +- .../server/level}/ServerPlayerGameMode.h | 0 .../minecraft/server/level}/SurvivalMode.cpp | 16 +- .../minecraft/server/level}/SurvivalMode.h | 0 .../minecraft/server/level}/TrackedEntity.cpp | 34 +- .../minecraft/server/level}/TrackedEntity.h | 0 .../server/network}/PendingConnection.cpp | 24 +- .../server/network}/PendingConnection.h | 2 +- .../server/network}/PlayerConnection.cpp | 58 +- .../server/network}/PlayerConnection.h | 6 +- .../server/network}/ServerConnection.cpp | 14 +- .../server/network}/ServerConnection.h | 0 .../minecraft/stats}/StatsCounter.cpp | 18 +- .../minecraft/stats}/StatsCounter.h | 0 .../net/minecraft/stats/StatsSyncer.cpp | 4 + .../minecraft/stats}/StatsSyncer.h | 0 .../ArrayWithLength.h | 2 +- .../{Util => ConsoleHelpers}/C4JThread.cpp | 4 +- .../{Util => ConsoleHelpers}/C4JThread.h | 0 .../ConsoleSaveFileIO}/ConsoleSaveFile.h | 0 .../ConsoleSaveFileConverter.cpp | 8 +- .../ConsoleSaveFileConverter.h | 2 +- .../ConsoleSaveFileIO}/ConsoleSaveFileIO.h | 0 .../ConsoleSaveFileInputStream.cpp | 4 +- .../ConsoleSaveFileInputStream.h | 2 +- .../ConsoleSaveFileOriginal.cpp | 24 +- .../ConsoleSaveFileOriginal.h | 0 .../ConsoleSaveFileOutputStream.cpp | 4 +- .../ConsoleSaveFileOutputStream.h | 2 +- .../ConsoleSaveFileSplit.cpp | 24 +- .../ConsoleSaveFileIO}/ConsoleSaveFileSplit.h | 0 .../ConsoleSaveFileIO}/ConsoleSavePath.h | 0 .../ConsoleSaveFileIO}/FileHeader.cpp | 2 +- .../ConsoleSaveFileIO}/FileHeader.h | 2 +- .../{Util => ConsoleHelpers}/Definitions.h | 0 .../{Util => ConsoleHelpers}/HashExtension.h | 0 .../PerformanceTimer.cpp | 2 +- .../PerformanceTimer.h | 0 .../StringHelpers.cpp | 2 +- .../{Util => ConsoleHelpers}/StringHelpers.h | 0 .../{Util => ConsoleHelpers}/ThreadName.cpp | 2 +- .../{Util => ConsoleHelpers}/ThreadName.h | 0 .../{Util => ConsoleJavaLibs}/Arrays.h | 2 +- .../Streams => ConsoleJavaLibs}/Buffer.cpp | 2 +- .../{IO/Streams => ConsoleJavaLibs}/Buffer.h | 0 .../ByteBuffer.cpp | 2 +- .../Streams => ConsoleJavaLibs}/ByteBuffer.h | 2 +- .../{Util => ConsoleJavaLibs}/Class.cpp | 2 +- .../{Util => ConsoleJavaLibs}/Class.h | 0 .../{Util => ConsoleJavaLibs}/Color.cpp | 2 +- .../{Util => ConsoleJavaLibs}/Color.h | 0 .../{Util => ConsoleJavaLibs}/Exceptions.h | 0 .../{IO/Files => ConsoleJavaLibs}/File.cpp | 6 +- .../{IO/Files => ConsoleJavaLibs}/File.h | 0 .../Files => ConsoleJavaLibs}/FileFilter.h | 0 .../FilenameFilter.h | 2 +- .../FloatBuffer.cpp | 2 +- .../Streams => ConsoleJavaLibs}/FloatBuffer.h | 0 .../BufferedOutputStream.cpp | 2 +- .../InputOutputStream}/BufferedOutputStream.h | 0 .../InputOutputStream}/BufferedReader.cpp | 2 +- .../InputOutputStream}/BufferedReader.h | 0 .../ByteArrayInputStream.cpp | 2 +- .../InputOutputStream}/ByteArrayInputStream.h | 0 .../ByteArrayOutputStream.cpp | 2 +- .../ByteArrayOutputStream.h | 0 .../InputOutputStream}/DataInput.h | 0 .../InputOutputStream}/DataInputStream.cpp | 2 +- .../InputOutputStream}/DataInputStream.h | 0 .../InputOutputStream}/DataOutput.h | 0 .../InputOutputStream}/DataOutputStream.cpp | 2 +- .../InputOutputStream}/DataOutputStream.h | 0 .../InputOutputStream}/FileInputStream.cpp | 4 +- .../InputOutputStream}/FileInputStream.h | 2 +- .../InputOutputStream}/FileOutputStream.cpp | 4 +- .../InputOutputStream}/FileOutputStream.h | 2 +- .../InputOutputStream}/GZIPInputStream.h | 0 .../InputOutputStream}/GZIPOutputStream.h | 0 .../InputOutputStream}/InputOutputStream.h | 4 +- .../InputOutputStream}/InputStream.cpp | 4 +- .../InputOutputStream}/InputStream.h | 0 .../InputOutputStream}/InputStreamReader.cpp | 2 +- .../InputOutputStream}/InputStreamReader.h | 0 .../InputOutputStream}/OutputStream.h | 0 .../InputOutputStream}/Reader.h | 0 .../Streams => ConsoleJavaLibs}/IntBuffer.cpp | 2 +- .../Streams => ConsoleJavaLibs}/IntBuffer.h | 0 .../{Util => ConsoleJavaLibs}/JavaIntHash.h | 0 .../{Util => ConsoleJavaLibs}/JavaMath.cpp | 2 +- .../{Util => ConsoleJavaLibs}/JavaMath.h | 0 .../{Util => ConsoleJavaLibs}/Random.cpp | 4 +- .../{Util => ConsoleJavaLibs}/Random.h | 0 .../{Util => ConsoleJavaLibs}/Reference.h | 0 .../{Network => ConsoleJavaLibs}/Socket.cpp | 10 +- .../{Network => ConsoleJavaLibs}/Socket.h | 4 +- .../SocketAddress.h | 0 .../{Platform => ConsoleJavaLibs}/System.h | 2 +- .../System.cpp => ConsoleJavaLibs/system.cpp} | 2 +- Minecraft.World/Entities/GlobalEntity.cpp | 2 - Minecraft.World/Entities/Mobs/Creature.cpp | 2 - Minecraft.World/Entities/Mobs/Npc.cpp | 3 - .../LevelObjectInputStream.h | 0 .../Minecraft.World.h | 0 .../{Util => Header Files}/ParticleTypes.h | 0 .../{Util => Header Files}/PathHelper.h | 0 .../{Util => Header Files}/PortableFileIO.h | 2 +- .../{Util => Header Files}/SoundTypes.h | 0 .../compression.h} | 2 +- .../{Util => Header Files}/libdivide.h | 0 Minecraft.World/Header Files/stdafx.h | 116 + Minecraft.World/Headers/com.mojang.nbt.h | 2 - .../Headers/net.minecraft.commands.common.h | 11 - .../Headers/net.minecraft.commands.h | 7 - Minecraft.World/Headers/net.minecraft.core.h | 16 - Minecraft.World/Headers/net.minecraft.h | 6 - .../Headers/net.minecraft.locale.h | 4 - .../Headers/net.minecraft.network.h | 3 - .../Headers/net.minecraft.network.packet.h | 110 - Minecraft.World/Headers/net.minecraft.stats.h | 10 - .../net.minecraft.world.damagesource.h | 7 - .../Headers/net.minecraft.world.effect.h | 8 - ...net.minecraft.world.entity.ai.attributes.h | 10 - .../net.minecraft.world.entity.ai.control.h | 7 - .../net.minecraft.world.entity.ai.goal.h | 42 - ...et.minecraft.world.entity.ai.goal.target.h | 9 - ...net.minecraft.world.entity.ai.navigation.h | 3 - .../net.minecraft.world.entity.ai.sensing.h | 3 - .../net.minecraft.world.entity.ai.util.h | 3 - .../net.minecraft.world.entity.ai.village.h | 6 - .../net.minecraft.world.entity.ambient.h | 4 - .../net.minecraft.world.entity.animal.h | 22 - ....minecraft.world.entity.boss.enderdragon.h | 5 - .../Headers/net.minecraft.world.entity.boss.h | 5 - .../net.minecraft.world.entity.global.h | 4 - .../Headers/net.minecraft.world.entity.h | 34 - .../Headers/net.minecraft.world.entity.item.h | 14 - .../net.minecraft.world.entity.monster.h | 26 - .../Headers/net.minecraft.world.entity.npc.h | 5 - .../net.minecraft.world.entity.player.h | 5 - .../net.minecraft.world.entity.projectile.h | 24 - .../Headers/net.minecraft.world.food.h | 4 - Minecraft.World/Headers/net.minecraft.world.h | 15 - .../Headers/net.minecraft.world.inventory.h | 32 - .../net.minecraft.world.item.alchemy.h | 3 - .../net.minecraft.world.item.crafting.h | 16 - .../net.minecraft.world.item.enchantment.h | 24 - .../Headers/net.minecraft.world.item.h | 87 - .../net.minecraft.world.item.trading.h | 5 - .../Headers/net.minecraft.world.level.biome.h | 31 - .../Headers/net.minecraft.world.level.chunk.h | 8 - .../net.minecraft.world.level.chunk.storage.h | 13 - .../net.minecraft.world.level.dimension.h | 6 - .../Headers/net.minecraft.world.level.h | 26 - ...t.minecraft.world.level.levelgen.feature.h | 37 - .../net.minecraft.world.level.levelgen.flat.h | 4 - .../net.minecraft.world.level.levelgen.h | 15 - ...minecraft.world.level.levelgen.structure.h | 20 - ...net.minecraft.world.level.levelgen.synth.h | 12 - .../net.minecraft.world.level.material.h | 8 - ...net.minecraft.world.level.newbiome.layer.h | 27 - .../net.minecraft.world.level.pathfinder.h | 6 - .../net.minecraft.world.level.redstone.h | 3 - .../net.minecraft.world.level.saveddata.h | 4 - .../net.minecraft.world.level.storage.h | 17 - .../net.minecraft.world.level.tile.entity.h | 22 - .../Headers/net.minecraft.world.level.tile.h | 131 - .../net.minecraft.world.level.tile.piston.h | 6 - .../Headers/net.minecraft.world.phys.h | 4 - .../net.minecraft.world.scores.criteria.h | 5 - .../Headers/net.minecraft.world.scores.h | 9 - Minecraft.World/Items/EggItem.cpp | 29 - Minecraft.World/Platform/stdafx.h | 74 +- .../Minecraft.World.cpp | 34 +- .../compression.cpp} | 4 +- .../{Platform => Source Files}/stdafx.cpp | 2 +- .../{IO/NBT => com/mojang/nbt}/ByteArrayTag.h | 2 +- .../{IO/NBT => com/mojang/nbt}/ByteTag.h | 0 .../{IO/NBT => com/mojang/nbt}/CompoundTag.h | 0 .../{IO/NBT => com/mojang/nbt}/DoubleTag.h | 2 +- .../{IO/NBT => com/mojang/nbt}/EndTag.h | 0 .../{IO/NBT => com/mojang/nbt}/FloatTag.h | 2 +- .../{IO/NBT => com/mojang/nbt}/IntArrayTag.h | 2 +- .../{IO/NBT => com/mojang/nbt}/IntTag.h | 0 .../{IO/NBT => com/mojang/nbt}/ListTag.h | 0 .../{IO/NBT => com/mojang/nbt}/LongTag.h | 0 .../NbtIO.cpp => com/mojang/nbt/NbtIo.cpp} | 6 +- .../NBT/NbtIO.h => com/mojang/nbt/NbtIo.h} | 0 .../{IO/NBT => com/mojang/nbt}/ShortTag.h | 0 .../{IO/NBT => com/mojang/nbt}/StringTag.h | 0 .../{IO/NBT => com/mojang/nbt}/Tag.cpp | 2 +- .../{IO/NBT => com/mojang/nbt}/Tag.h | 2 +- .../com/mojang/nbt/com.mojang.nbt.h | 2 + .../{Util => net/minecraft}/Direction.cpp | 2 +- .../{Util => net/minecraft}/Direction.h | 0 .../{Util => net/minecraft}/Facing.cpp | 2 +- .../{Util => net/minecraft}/Facing.h | 0 .../{Util => net/minecraft}/Pos.cpp | 2 +- Minecraft.World/{Util => net/minecraft}/Pos.h | 0 .../minecraft}/SharedConstants.cpp | 6 +- .../{Util => net/minecraft}/SharedConstants.h | 2 +- .../minecraft/commands}/AdminLogCommand.h | 2 +- .../minecraft/commands}/Command.cpp | 10 +- .../minecraft/commands}/Command.h | 2 +- .../minecraft/commands}/CommandDispatcher.cpp | 4 +- .../minecraft/commands}/CommandDispatcher.h | 0 .../minecraft/commands}/CommandSender.h | 2 +- .../minecraft/commands}/CommandsEnum.h | 0 .../minecraft/commands}/PlayerSelector.h | 0 .../common}/DefaultGameModeCommand.cpp | 4 +- .../commands/common}/DefaultGameModeCommand.h | 0 .../commands/common}/EffectCommand.cpp | 6 +- .../commands/common}/EffectCommand.h | 2 +- .../commands/common}/EnchantItemCommand.cpp | 10 +- .../commands/common}/EnchantItemCommand.h | 2 +- .../commands/common}/ExperienceCommand.cpp | 10 +- .../commands/common}/ExperienceCommand.h | 2 +- .../commands/common}/GameDifficultyCommand.h | 0 .../commands/common}/GameModeCommand.cpp | 4 +- .../commands/common}/GameModeCommand.h | 2 +- .../commands/common}/GameRuleCommand.h | 0 .../commands/common}/GiveItemCommand.cpp | 12 +- .../commands/common}/GiveItemCommand.h | 2 +- .../commands/common}/KillCommand.cpp | 8 +- .../minecraft/commands/common}/KillCommand.h | 2 +- .../commands/common}/PlaySoundCommand.h | 0 .../common}/SetPlayerTimeoutCommand.h | 0 .../commands/common}/ShowSeedCommand.h | 0 .../commands/common}/SpreadPlayersCommand.h | 0 .../commands/common}/TimeCommand.cpp | 10 +- .../minecraft/commands/common}/TimeCommand.h | 2 +- .../common}/ToggleDownfallCommand.cpp | 14 +- .../commands/common}/ToggleDownfallCommand.h | 2 +- .../commands/common}/WeatherCommand.h | 0 .../common/net.minecraft.commands.common.h | 11 + .../commands/net.minecraft.commands.h | 7 + .../AbstractProjectileDispenseBehavior.cpp | 12 +- .../AbstractProjectileDispenseBehavior.h | 0 .../{Core => net/minecraft/core}/Behavior.h | 0 .../minecraft/core}/BehaviorRegistry.cpp | 2 +- .../minecraft/core}/BehaviorRegistry.h | 0 .../minecraft/core}/BlockSource.h | 0 .../minecraft/core}/BlockSourceImpl.cpp | 8 +- .../minecraft/core}/BlockSourceImpl.h | 0 .../core}/DefaultDispenseItemBehavior.cpp | 12 +- .../core}/DefaultDispenseItemBehavior.h | 0 .../minecraft/core}/DispenseItemBehavior.cpp | 2 +- .../minecraft/core}/DispenseItemBehavior.h | 0 .../minecraft/core}/FacingEnum.cpp | 2 +- .../{Core => net/minecraft/core}/FacingEnum.h | 0 .../minecraft/core}/ItemDispenseBehaviors.cpp | 14 +- .../minecraft/core}/ItemDispenseBehaviors.h | 0 .../minecraft/core}/LocatableSource.h | 0 .../{Core => net/minecraft/core}/Location.h | 0 .../{Core => net/minecraft/core}/Position.h | 0 .../minecraft/core}/PositionImpl.h | 0 .../{Core => net/minecraft/core}/Source.h | 0 .../net/minecraft/core/net.minecraft.core.h | 16 + .../{Util => net/minecraft/locale}/I18n.cpp | 2 +- .../{Util => net/minecraft/locale}/I18n.h | 2 +- .../minecraft/locale}/Language.cpp | 6 +- .../{Util => net/minecraft/locale}/Language.h | 0 .../minecraft/locale/net.minecraft.locale.h | 4 + Minecraft.World/net/minecraft/net.minecraft.h | 6 + .../minecraft/network}/Connection.cpp | 12 +- .../minecraft/network}/Connection.h | 14 +- .../minecraft/network/net.minecraft.network.h | 3 + .../network/packet}/AddEntityPacket.cpp | 6 +- .../network/packet}/AddEntityPacket.h | 0 .../packet}/AddExperienceOrbPacket.cpp | 6 +- .../network/packet}/AddExperienceOrbPacket.h | 0 .../network/packet}/AddGlobalEntityPacket.cpp | 8 +- .../network/packet}/AddGlobalEntityPacket.h | 0 .../network/packet}/AddMobPacket.cpp | 6 +- .../minecraft/network/packet}/AddMobPacket.h | 2 +- .../network/packet}/AddPaintingPacket.cpp | 6 +- .../network/packet}/AddPaintingPacket.h | 0 .../network/packet}/AddPlayerPacket.cpp | 8 +- .../network/packet}/AddPlayerPacket.h | 2 +- .../network/packet}/AnimatePacket.cpp | 6 +- .../minecraft/network/packet}/AnimatePacket.h | 0 .../network/packet}/AwardStatPacket.cpp | 4 +- .../network/packet}/AwardStatPacket.h | 0 .../packet}/BlockRegionUpdatePacket.cpp | 14 +- .../network/packet}/BlockRegionUpdatePacket.h | 0 .../network/packet}/ChatAutoCompletePacket.h | 0 .../minecraft/network/packet}/ChatPacket.cpp | 6 +- .../minecraft/network/packet}/ChatPacket.h | 0 .../packet}/ChunkTilesUpdatePacket.cpp | 10 +- .../network/packet}/ChunkTilesUpdatePacket.h | 0 .../packet}/ChunkVisibilityAreaPacket.cpp | 6 +- .../packet}/ChunkVisibilityAreaPacket.h | 0 .../network/packet}/ChunkVisibilityPacket.cpp | 4 +- .../network/packet}/ChunkVisibilityPacket.h | 2 +- .../network/packet}/ClientCommandPacket.cpp | 2 +- .../network/packet}/ClientCommandPacket.h | 0 .../network/packet}/ClientInformationPacket.h | 2 +- .../network/packet}/ClientProtocolPacket.h | 0 .../network/packet}/ComplexItemDataPacket.cpp | 4 +- .../network/packet}/ComplexItemDataPacket.h | 0 .../network/packet}/ContainerAckPacket.cpp | 4 +- .../network/packet}/ContainerAckPacket.h | 2 +- .../packet}/ContainerButtonClickPacket.cpp | 6 +- .../packet}/ContainerButtonClickPacket.h | 0 .../network/packet}/ContainerClickPacket.cpp | 6 +- .../network/packet}/ContainerClickPacket.h | 0 .../network/packet}/ContainerClosePacket.cpp | 4 +- .../network/packet}/ContainerClosePacket.h | 0 .../network/packet}/ContainerOpenPacket.cpp | 4 +- .../network/packet}/ContainerOpenPacket.h | 0 .../packet}/ContainerSetContentPacket.cpp | 6 +- .../packet}/ContainerSetContentPacket.h | 0 .../packet}/ContainerSetDataPacket.cpp | 4 +- .../network/packet}/ContainerSetDataPacket.h | 0 .../packet}/ContainerSetSlotPacket.cpp | 6 +- .../network/packet}/ContainerSetSlotPacket.h | 0 .../network/packet}/CraftItemPacket.cpp | 6 +- .../network/packet}/CraftItemPacket.h | 0 .../network/packet}/CustomPayloadPacket.cpp | 4 +- .../network/packet}/CustomPayloadPacket.h | 0 .../network/packet}/DebugOptionsPacket.cpp | 6 +- .../network/packet}/DebugOptionsPacket.h | 0 .../network/packet}/DisconnectPacket.cpp | 6 +- .../network/packet}/DisconnectPacket.h | 0 .../packet}/EntityActionAtPositionPacket.cpp | 6 +- .../packet}/EntityActionAtPositionPacket.h | 0 .../network/packet}/EntityEventPacket.cpp | 4 +- .../network/packet}/EntityEventPacket.h | 0 .../network/packet}/ExplodePacket.cpp | 6 +- .../minecraft/network/packet}/ExplodePacket.h | 2 +- .../network/packet}/GameCommandPacket.cpp | 4 +- .../network/packet}/GameCommandPacket.h | 2 +- .../network/packet}/GameEventPacket.cpp | 4 +- .../network/packet}/GameEventPacket.h | 0 .../network/packet}/GetInfoPacket.cpp | 4 +- .../minecraft/network/packet}/GetInfoPacket.h | 0 .../network/packet}/InteractPacket.cpp | 4 +- .../network/packet}/InteractPacket.h | 0 .../network/packet}/KeepAlivePacket.cpp | 4 +- .../network/packet}/KeepAlivePacket.h | 0 .../network/packet}/KickPlayerPacket.cpp | 4 +- .../network/packet}/KickPlayerPacket.h | 0 .../network/packet}/LevelEventPacket.cpp | 4 +- .../network/packet}/LevelEventPacket.h | 0 .../network/packet}/LevelParticlesPacket.cpp | 2 +- .../network/packet}/LevelParticlesPacket.h | 0 .../network/packet}/LevelSoundPacket.cpp | 6 +- .../network/packet}/LevelSoundPacket.h | 0 .../minecraft/network/packet}/LoginPacket.cpp | 8 +- .../minecraft/network/packet}/LoginPacket.h | 0 .../network/packet}/MoveEntityPacket.cpp | 4 +- .../network/packet}/MoveEntityPacket.h | 0 .../network/packet}/MoveEntityPacketSmall.cpp | 4 +- .../network/packet}/MoveEntityPacketSmall.h | 0 .../network/packet}/MovePlayerPacket.cpp | 4 +- .../network/packet}/MovePlayerPacket.h | 0 .../minecraft/network/packet}/Packet.cpp | 14 +- .../minecraft/network/packet}/Packet.h | 0 .../network/packet}/PacketListener.cpp | 4 +- .../network/packet}/PacketListener.h | 0 .../network/packet}/PlayerAbilitiesPacket.cpp | 6 +- .../network/packet}/PlayerAbilitiesPacket.h | 0 .../network/packet}/PlayerActionPacket.cpp | 4 +- .../network/packet}/PlayerActionPacket.h | 0 .../network/packet}/PlayerCommandPacket.cpp | 6 +- .../network/packet}/PlayerCommandPacket.h | 0 .../network/packet}/PlayerInfoPacket.cpp | 10 +- .../network/packet}/PlayerInfoPacket.h | 0 .../network/packet}/PlayerInputPacket.cpp | 4 +- .../network/packet}/PlayerInputPacket.h | 0 .../network/packet}/PreLoginPacket.cpp | 4 +- .../network/packet}/PreLoginPacket.h | 0 .../network/packet}/RemoveEntitiesPacket.cpp | 6 +- .../network/packet}/RemoveEntitiesPacket.h | 0 .../network/packet}/RemoveMobEffectPacket.cpp | 6 +- .../network/packet}/RemoveMobEffectPacket.h | 0 .../network/packet}/RespawnPacket.cpp | 6 +- .../minecraft/network/packet}/RespawnPacket.h | 0 .../network/packet}/RotateHeadPacket.cpp | 2 +- .../network/packet}/RotateHeadPacket.h | 2 +- .../network/packet}/ServerAuthDataPacket.h | 0 .../packet}/ServerSettingsChangedPacket.cpp | 6 +- .../packet}/ServerSettingsChangedPacket.h | 0 .../network/packet}/SetCarriedItemPacket.cpp | 4 +- .../network/packet}/SetCarriedItemPacket.h | 0 .../packet}/SetCreativeModeSlotPacket.cpp | 4 +- .../packet}/SetCreativeModeSlotPacket.h | 0 .../packet}/SetDisplayObjectivePacket.cpp | 4 +- .../packet}/SetDisplayObjectivePacket.h | 0 .../network/packet}/SetEntityDataPacket.cpp | 6 +- .../network/packet}/SetEntityDataPacket.h | 2 +- .../network/packet}/SetEntityLinkPacket.cpp | 6 +- .../network/packet}/SetEntityLinkPacket.h | 0 .../network/packet}/SetEntityMotionPacket.cpp | 6 +- .../network/packet}/SetEntityMotionPacket.h | 0 .../network/packet}/SetEquippedItemPacket.cpp | 6 +- .../network/packet}/SetEquippedItemPacket.h | 0 .../network/packet}/SetExperiencePacket.cpp | 4 +- .../network/packet}/SetExperiencePacket.h | 0 .../network/packet}/SetHealthPacket.cpp | 4 +- .../network/packet}/SetHealthPacket.h | 0 .../network/packet}/SetObjectivePacket.cpp | 4 +- .../network/packet}/SetObjectivePacket.h | 0 .../network/packet}/SetPlayerTeamPacket.cpp | 6 +- .../network/packet}/SetPlayerTeamPacket.h | 0 .../network/packet}/SetScorePacket.cpp | 6 +- .../network/packet}/SetScorePacket.h | 0 .../packet}/SetSpawnPositionPacket.cpp | 4 +- .../network/packet}/SetSpawnPositionPacket.h | 0 .../network/packet}/SetTimePacket.cpp | 4 +- .../minecraft/network/packet}/SetTimePacket.h | 0 .../network/packet}/SharedKeyPacket.h | 0 .../network/packet}/SignUpdatePacket.cpp | 6 +- .../network/packet}/SignUpdatePacket.h | 0 .../network/packet}/TakeItemEntityPacket.cpp | 4 +- .../network/packet}/TakeItemEntityPacket.h | 0 .../network/packet}/TeleportEntityPacket.cpp | 6 +- .../network/packet}/TeleportEntityPacket.h | 0 .../TextureAndGeometryChangePacket.cpp | 6 +- .../packet}/TextureAndGeometryChangePacket.h | 0 .../packet}/TextureAndGeometryPacket.cpp | 4 +- .../packet}/TextureAndGeometryPacket.h | 4 +- .../network/packet}/TextureChangePacket.cpp | 6 +- .../network/packet}/TextureChangePacket.h | 0 .../network/packet}/TexturePacket.cpp | 4 +- .../minecraft/network/packet}/TexturePacket.h | 0 .../network/packet}/TileDestructionPacket.cpp | 4 +- .../network/packet}/TileDestructionPacket.h | 0 .../network/packet}/TileEditorOpenPacket.cpp | 2 +- .../network/packet}/TileEditorOpenPacket.h | 0 .../network/packet}/TileEntityDataPacket.cpp | 4 +- .../network/packet}/TileEntityDataPacket.h | 0 .../network/packet}/TileEventPacket.cpp | 6 +- .../network/packet}/TileEventPacket.h | 0 .../network/packet}/TileUpdatePacket.cpp | 8 +- .../network/packet}/TileUpdatePacket.h | 0 .../network/packet}/TradeItemPacket.cpp | 4 +- .../network/packet}/TradeItemPacket.h | 2 +- .../packet}/UpdateAttributesPacket.cpp | 4 +- .../network/packet}/UpdateAttributesPacket.h | 0 .../packet}/UpdateGameRuleProgressPacket.cpp | 4 +- .../packet}/UpdateGameRuleProgressPacket.h | 0 .../network/packet}/UpdateMobEffectPacket.cpp | 8 +- .../network/packet}/UpdateMobEffectPacket.h | 0 .../network/packet}/UpdateProgressPacket.cpp | 4 +- .../network/packet}/UpdateProgressPacket.h | 0 .../network/packet}/UseItemPacket.cpp | 6 +- .../minecraft/network/packet}/UseItemPacket.h | 0 .../minecraft/network/packet}/XZPacket.cpp | 6 +- .../minecraft/network/packet}/XZPacket.h | 0 .../packet/net.minecraft.network.packet.h | 110 + .../minecraft/stats}/Achievement.cpp | 8 +- .../minecraft/stats}/Achievement.h | 0 .../minecraft/stats}/Achievements.cpp | 8 +- .../minecraft/stats}/Achievements.h | 0 .../minecraft/stats}/CommonStats.cpp | 6 +- .../minecraft/stats}/CommonStats.h | 0 .../minecraft/stats}/DescFormatter.h | 0 .../minecraft/stats}/DurangoStats.h | 0 .../minecraft/stats}/GeneralStat.cpp | 4 +- .../minecraft/stats}/GeneralStat.h | 0 .../minecraft/stats}/GenericStats.cpp | 4 +- .../minecraft/stats}/GenericStats.h | 4 +- .../minecraft/stats}/ItemStat.cpp | 2 +- .../{Stats => net/minecraft/stats}/ItemStat.h | 0 .../minecraft/stats}/NumberFormatters.h | 0 .../{Stats => net/minecraft/stats}/Stat.cpp | 4 +- .../{Stats => net/minecraft/stats}/Stat.h | 0 .../minecraft/stats}/StatFormatter.h | 0 .../{Stats => net/minecraft/stats}/Stats.cpp | 14 +- .../{Stats => net/minecraft/stats}/Stats.h | 0 .../net/minecraft/stats/net.minecraft.stats.h | 10 + .../{Util => net/minecraft/util}/Hasher.cpp | 2 +- .../{Util => net/minecraft/util}/Hasher.h | 0 .../minecraft/util}/HtmlString.cpp | 2 +- .../{Util => net/minecraft/util}/HtmlString.h | 0 .../{Util => net/minecraft/util}/Mth.cpp | 6 +- .../{Util => net/minecraft/util}/Mth.h | 0 .../minecraft/util}/ProgressListener.h | 0 .../minecraft/util}/SmoothFloat.cpp | 2 +- .../minecraft/util}/SmoothFloat.h | 0 .../minecraft/util}/WeighedRandom.cpp | 2 +- .../minecraft/util}/WeighedRandom.h | 0 .../minecraft/util}/WeighedTreasure.cpp | 6 +- .../minecraft/util}/WeighedTreasure.h | 0 .../minecraft/world}/CompoundContainer.cpp | 6 +- .../minecraft/world}/CompoundContainer.h | 0 .../minecraft/world}/Container.h | 0 .../minecraft/world}/Difficulty.h | 0 .../minecraft/world}/FlippedIcon.cpp | 4 +- .../minecraft/world}/FlippedIcon.h | 0 .../{Util => net/minecraft/world}/Icon.h | 0 .../minecraft/world}/IconRegister.h | 0 .../world}/MouseInventoryClickHandler.h | 0 .../minecraft/world}/SimpleContainer.cpp | 6 +- .../minecraft/world}/SimpleContainer.h | 2 +- .../minecraft/world}/WorldlyContainer.h | 0 .../world/damageSource}/CombatEntry.cpp | 6 +- .../world/damageSource}/CombatEntry.h | 0 .../world/damageSource}/CombatTracker.cpp | 12 +- .../world/damageSource}/CombatTracker.h | 2 +- .../world/damageSource}/DamageSource.cpp | 16 +- .../world/damageSource}/DamageSource.h | 2 +- .../damageSource}/EntityDamageSource.cpp | 10 +- .../world/damageSource}/EntityDamageSource.h | 2 +- .../IndirectEntityDamageSource.cpp | 10 +- .../IndirectEntityDamageSource.h | 0 .../net.minecraft.world.damagesource.h | 7 + .../world/effect}/AbsoptionMobEffect.cpp | 6 +- .../world/effect}/AbsoptionMobEffect.h | 0 .../world/effect}/AttackDamageMobEffect.cpp | 2 +- .../world/effect}/AttackDamageMobEffect.h | 0 .../world/effect}/HealthBoostMobEffect.cpp | 4 +- .../world/effect}/HealthBoostMobEffect.h | 0 .../world/effect}/InstantaneousMobEffect.cpp | 4 +- .../world/effect}/InstantaneousMobEffect.h | 0 .../minecraft/world/effect}/MobEffect.cpp | 20 +- .../minecraft/world/effect}/MobEffect.h | 2 +- .../world/effect}/MobEffectInstance.cpp | 4 +- .../world/effect}/MobEffectInstance.h | 0 .../world/effect/net.minecraft.world.effect.h | 8 + .../minecraft/world/entity}/AgeableMob.cpp | 14 +- .../minecraft/world/entity}/AgeableMob.h | 2 +- .../net/minecraft/world/entity/Creature.cpp | 2 + .../minecraft/world/entity}/Creature.h | 2 +- .../world/entity}/DelayedRelease.cpp | 4 +- .../minecraft/world/entity}/DelayedRelease.h | 2 +- .../minecraft/world/entity}/Entity.cpp | 42 +- .../minecraft/world/entity}/Entity.h | 12 +- .../minecraft/world/entity}/EntityEvent.h | 0 .../minecraft/world/entity}/EntityIO.cpp | 32 +- .../minecraft/world/entity}/EntityIO.h | 4 +- .../minecraft/world/entity}/EntityPos.cpp | 2 +- .../minecraft/world/entity}/EntityPos.h | 0 .../world/entity}/EntitySelector.cpp | 4 +- .../minecraft/world/entity}/EntitySelector.h | 0 .../minecraft/world/entity}/ExperienceOrb.cpp | 20 +- .../minecraft/world/entity}/ExperienceOrb.h | 2 +- .../minecraft/world/entity}/FlyingMob.cpp | 8 +- .../minecraft/world/entity}/FlyingMob.h | 0 .../minecraft/world/entity}/HangingEntity.cpp | 14 +- .../minecraft/world/entity}/HangingEntity.h | 0 .../minecraft/world/entity}/ItemFrame.cpp | 20 +- .../minecraft/world/entity}/ItemFrame.h | 4 +- .../world/entity}/LeashFenceKnotEntity.cpp | 10 +- .../world/entity}/LeashFenceKnotEntity.h | 0 .../minecraft/world/entity}/LivingEntity.cpp | 66 +- .../minecraft/world/entity}/LivingEntity.h | 4 +- .../minecraft/world/entity}/Mob.cpp | 58 +- .../minecraft/world/entity}/Mob.h | 2 +- .../minecraft/world/entity}/MobCategory.cpp | 10 +- .../minecraft/world/entity}/MobCategory.h | 0 .../minecraft/world/entity}/MobGroupData.h | 0 .../minecraft/world/entity}/MobType.h | 0 .../minecraft/world/entity}/OwnableEntity.h | 0 .../minecraft/world/entity}/Painting.cpp | 18 +- .../minecraft/world/entity}/Painting.h | 4 +- .../minecraft/world/entity}/PathfinderMob.cpp | 22 +- .../minecraft/world/entity}/PathfinderMob.h | 0 .../world/entity}/SyncedEntityData.cpp | 12 +- .../world/entity}/SyncedEntityData.h | 0 .../minecraft/world/entity}/TamableAnimal.cpp | 10 +- .../minecraft/world/entity}/TamableAnimal.h | 2 +- .../world/entity/ai/attributes}/Attribute.cpp | 2 +- .../world/entity/ai/attributes}/Attribute.h | 0 .../entity/ai/attributes}/AttributeInstance.h | 0 .../ai/attributes}/AttributeModifier.cpp | 4 +- .../entity/ai/attributes}/AttributeModifier.h | 0 .../entity/ai/attributes}/BaseAttribute.cpp | 2 +- .../entity/ai/attributes}/BaseAttribute.h | 0 .../ai/attributes}/BaseAttributeMap.cpp | 4 +- .../entity/ai/attributes}/BaseAttributeMap.h | 0 .../ModifiableAttributeInstance.cpp | 4 +- .../attributes}/ModifiableAttributeInstance.h | 0 .../entity/ai/attributes}/RangedAttribute.cpp | 2 +- .../entity/ai/attributes}/RangedAttribute.h | 0 .../ai/attributes}/ServersideAttributeMap.cpp | 2 +- .../ai/attributes}/ServersideAttributeMap.h | 0 ...net.minecraft.world.entity.ai.attributes.h | 10 + .../world/entity/ai/control}/BodyControl.cpp | 6 +- .../world/entity/ai/control}/BodyControl.h | 0 .../world/entity/ai/control}/Control.h | 0 .../world/entity/ai/control}/JumpControl.cpp | 4 +- .../world/entity/ai/control}/JumpControl.h | 0 .../world/entity/ai/control}/LookControl.cpp | 8 +- .../world/entity/ai/control}/LookControl.h | 0 .../world/entity/ai/control}/MoveControl.cpp | 12 +- .../world/entity/ai/control}/MoveControl.h | 0 .../net.minecraft.world.entity.ai.control.h | 7 + .../world/entity/ai/goal}/AvoidPlayerGoal.cpp | 20 +- .../world/entity/ai/goal}/AvoidPlayerGoal.h | 2 +- .../world/entity/ai/goal}/BegGoal.cpp | 12 +- .../minecraft/world/entity/ai/goal}/BegGoal.h | 0 .../world/entity/ai/goal}/BreakDoorGoal.cpp | 12 +- .../world/entity/ai/goal}/BreakDoorGoal.h | 2 +- .../world/entity/ai/goal}/BreedGoal.cpp | 16 +- .../world/entity/ai/goal}/BreedGoal.h | 0 .../ai/goal}/ControlledByPlayerGoal.cpp | 16 +- .../entity/ai/goal}/ControlledByPlayerGoal.h | 2 +- .../entity/ai/goal}/DoorInteractGoal.cpp | 12 +- .../world/entity/ai/goal}/DoorInteractGoal.h | 0 .../world/entity/ai/goal}/EatTileGoal.cpp | 12 +- .../world/entity/ai/goal}/EatTileGoal.h | 2 +- .../world/entity/ai/goal}/FleeSunGoal.cpp | 12 +- .../world/entity/ai/goal}/FleeSunGoal.h | 2 +- .../world/entity/ai/goal}/FloatGoal.cpp | 8 +- .../world/entity/ai/goal}/FloatGoal.h | 0 .../world/entity/ai/goal}/FollowOwnerGoal.cpp | 14 +- .../world/entity/ai/goal}/FollowOwnerGoal.h | 0 .../entity/ai/goal}/FollowParentGoal.cpp | 10 +- .../world/entity/ai/goal}/FollowParentGoal.h | 0 .../minecraft/world/entity/ai/goal}/Goal.cpp | 2 +- .../minecraft/world/entity/ai/goal}/Goal.h | 0 .../world/entity/ai/goal}/GoalSelector.cpp | 2 +- .../world/entity/ai/goal}/GoalSelector.h | 0 .../world/entity/ai/goal}/InteractGoal.cpp | 4 +- .../world/entity/ai/goal}/InteractGoal.h | 0 .../entity/ai/goal}/LeapAtTargetGoal.cpp | 6 +- .../world/entity/ai/goal}/LeapAtTargetGoal.h | 0 .../entity/ai/goal}/LookAtPlayerGoal.cpp | 10 +- .../world/entity/ai/goal}/LookAtPlayerGoal.h | 0 .../ai/goal}/LookAtTradingPlayerGoal.cpp | 6 +- .../entity/ai/goal}/LookAtTradingPlayerGoal.h | 0 .../world/entity/ai/goal}/MakeLoveGoal.cpp | 16 +- .../world/entity/ai/goal}/MakeLoveGoal.h | 0 .../world/entity/ai/goal}/MeleeAttackGoal.cpp | 18 +- .../world/entity/ai/goal}/MeleeAttackGoal.h | 0 .../world/entity/ai/goal}/MoveIndoorsGoal.cpp | 16 +- .../world/entity/ai/goal}/MoveIndoorsGoal.h | 0 .../ai/goal}/MoveThroughVillageGoal.cpp | 16 +- .../entity/ai/goal}/MoveThroughVillageGoal.h | 0 .../ai/goal}/MoveTowardsRestrictionGoal.cpp | 12 +- .../ai/goal}/MoveTowardsRestrictionGoal.h | 0 .../entity/ai/goal}/MoveTowardsTargetGoal.cpp | 12 +- .../entity/ai/goal}/MoveTowardsTargetGoal.h | 0 .../entity/ai/goal}/OcelotAttackGoal.cpp | 12 +- .../world/entity/ai/goal}/OcelotAttackGoal.h | 0 .../entity/ai/goal}/OcelotSitOnTileGoal.cpp | 18 +- .../entity/ai/goal}/OcelotSitOnTileGoal.h | 0 .../world/entity/ai/goal}/OfferFlowerGoal.cpp | 12 +- .../world/entity/ai/goal}/OfferFlowerGoal.h | 0 .../world/entity/ai/goal}/OpenDoorGoal.cpp | 6 +- .../world/entity/ai/goal}/OpenDoorGoal.h | 0 .../world/entity/ai/goal}/PanicGoal.cpp | 12 +- .../world/entity/ai/goal}/PanicGoal.h | 0 .../world/entity/ai/goal}/PlayGoal.cpp | 16 +- .../world/entity/ai/goal}/PlayGoal.h | 0 .../entity/ai/goal}/RandomLookAroundGoal.cpp | 6 +- .../entity/ai/goal}/RandomLookAroundGoal.h | 0 .../entity/ai/goal}/RandomStrollGoal.cpp | 14 +- .../world/entity/ai/goal}/RandomStrollGoal.h | 0 .../entity/ai/goal}/RangedAttackGoal.cpp | 14 +- .../world/entity/ai/goal}/RangedAttackGoal.h | 0 .../entity/ai/goal}/RestrictOpenDoorGoal.cpp | 10 +- .../entity/ai/goal}/RestrictOpenDoorGoal.h | 0 .../world/entity/ai/goal}/RestrictSunGoal.cpp | 8 +- .../world/entity/ai/goal}/RestrictSunGoal.h | 0 .../ai/goal}/RunAroundLikeCrazyGoal.cpp | 16 +- .../entity/ai/goal}/RunAroundLikeCrazyGoal.h | 0 .../world/entity/ai/goal}/SitGoal.cpp | 12 +- .../minecraft/world/entity/ai/goal}/SitGoal.h | 0 .../world/entity/ai/goal}/SwellGoal.cpp | 10 +- .../world/entity/ai/goal}/SwellGoal.h | 0 .../world/entity/ai/goal}/TakeFlowerGoal.cpp | 16 +- .../world/entity/ai/goal}/TakeFlowerGoal.h | 0 .../world/entity/ai/goal}/TemptGoal.cpp | 12 +- .../world/entity/ai/goal}/TemptGoal.h | 0 .../entity/ai/goal}/TradeWithPlayerGoal.cpp | 10 +- .../entity/ai/goal}/TradeWithPlayerGoal.h | 0 .../goal/net.minecraft.world.entity.ai.goal.h | 42 + .../goal/target}/DefendVillageTargetGoal.cpp | 6 +- .../ai/goal/target}/DefendVillageTargetGoal.h | 0 .../ai/goal/target}/HurtByTargetGoal.cpp | 8 +- .../entity/ai/goal/target}/HurtByTargetGoal.h | 0 .../target}/NearestAttackableTargetGoal.cpp | 8 +- .../target}/NearestAttackableTargetGoal.h | 2 +- .../goal/target}/NonTameRandomTargetGoal.cpp | 4 +- .../ai/goal/target}/NonTameRandomTargetGoal.h | 0 .../ai/goal/target}/OwnerHurtByTargetGoal.cpp | 6 +- .../ai/goal/target}/OwnerHurtByTargetGoal.h | 0 .../ai/goal/target}/OwnerHurtTargetGoal.cpp | 6 +- .../ai/goal/target}/OwnerHurtTargetGoal.h | 0 .../entity/ai/goal/target}/TargetGoal.cpp | 20 +- .../world/entity/ai/goal/target}/TargetGoal.h | 2 +- ...et.minecraft.world.entity.ai.goal.target.h | 9 + .../entity/ai/navigation}/PathNavigation.cpp | 20 +- .../entity/ai/navigation}/PathNavigation.h | 0 ...net.minecraft.world.entity.ai.navigation.h | 3 + .../world/entity/ai/sensing}/Sensing.cpp | 4 +- .../world/entity/ai/sensing}/Sensing.h | 0 .../net.minecraft.world.entity.ai.sensing.h | 3 + .../world/entity/ai/util}/RandomPos.cpp | 6 +- .../world/entity/ai/util}/RandomPos.h | 0 .../util/net.minecraft.world.entity.ai.util.h | 3 + .../world/entity/ai/village}/DoorInfo.cpp | 2 +- .../world/entity/ai/village}/DoorInfo.h | 0 .../world/entity/ai/village}/Village.cpp | 14 +- .../world/entity/ai/village}/Village.h | 0 .../world/entity/ai/village}/VillageSiege.cpp | 10 +- .../world/entity/ai/village}/VillageSiege.h | 0 .../world/entity/ai/village}/Villages.cpp | 10 +- .../world/entity/ai/village}/Villages.h | 2 +- .../net.minecraft.world.entity.ai.village.h | 6 + .../world/entity/ambient}/AmbientCreature.cpp | 2 +- .../world/entity/ambient}/AmbientCreature.h | 2 +- .../minecraft/world/entity/ambient}/Bat.cpp | 14 +- .../minecraft/world/entity/ambient}/Bat.h | 0 .../net.minecraft.world.entity.ambient.h | 4 + .../minecraft/world/entity/animal}/Animal.cpp | 28 +- .../minecraft/world/entity/animal}/Animal.h | 4 +- .../world/entity/animal}/Chicken.cpp | 22 +- .../minecraft/world/entity/animal}/Chicken.h | 0 .../minecraft/world/entity/animal}/Cow.cpp | 26 +- .../minecraft/world/entity/animal}/Cow.h | 0 .../world/entity/animal}/EntityHorse.cpp | 34 +- .../world/entity/animal}/EntityHorse.h | 4 +- .../minecraft/world/entity/animal}/Golem.cpp | 2 +- .../minecraft/world/entity/animal}/Golem.h | 2 +- .../world/entity/animal}/MushroomCow.cpp | 16 +- .../world/entity/animal}/MushroomCow.h | 0 .../minecraft/world/entity/animal}/Ocelot.cpp | 38 +- .../minecraft/world/entity/animal}/Ocelot.h | 0 .../minecraft/world/entity/animal}/Pig.cpp | 32 +- .../minecraft/world/entity/animal}/Pig.h | 0 .../minecraft/world/entity/animal}/Sheep.cpp | 38 +- .../minecraft/world/entity/animal}/Sheep.h | 4 +- .../world/entity/animal}/SnowMan.cpp | 32 +- .../minecraft/world/entity/animal}/SnowMan.h | 2 +- .../minecraft/world/entity/animal}/Squid.cpp | 22 +- .../minecraft/world/entity/animal}/Squid.h | 2 +- .../world/entity/animal}/VillagerGolem.cpp | 36 +- .../world/entity/animal}/VillagerGolem.h | 0 .../world/entity/animal}/WaterAnimal.cpp | 12 +- .../world/entity/animal}/WaterAnimal.h | 4 +- .../minecraft/world/entity/animal}/Wolf.cpp | 40 +- .../minecraft/world/entity/animal}/Wolf.h | 0 .../net.minecraft.world.entity.animal.h | 22 + .../minecraft/world/entity/boss}/BossMob.h | 0 .../world/entity/boss}/MultiEntityMob.h | 0 .../world/entity/boss}/MultiEntityMobPart.cpp | 2 +- .../world/entity/boss}/MultiEntityMobPart.h | 0 .../entity/boss/enderdragon}/EnderCrystal.cpp | 12 +- .../entity/boss/enderdragon}/EnderCrystal.h | 2 +- .../entity/boss/enderdragon}/EnderDragon.cpp | 28 +- .../entity/boss/enderdragon}/EnderDragon.h | 6 +- ....minecraft.world.entity.boss.enderdragon.h | 5 + .../boss/net.minecraft.world.entity.boss.h | 5 + .../world/entity/boss/wither}/WitherBoss.cpp | 32 +- .../world/entity/boss/wither}/WitherBoss.h | 6 +- .../world/entity/global/GlobalEntity.cpp | 2 + .../world/entity/global}/GlobalEntity.h | 2 +- .../world/entity/global}/LightningBolt.cpp | 16 +- .../world/entity/global}/LightningBolt.h | 4 +- .../net.minecraft.world.entity.global.h | 4 + .../minecraft/world/entity/item}/Boat.cpp | 20 +- .../minecraft/world/entity/item}/Boat.h | 0 .../world/entity/item}/FallingTile.cpp | 12 +- .../world/entity/item}/FallingTile.h | 2 +- .../world/entity/item}/ItemEntity.cpp | 26 +- .../minecraft/world/entity/item}/ItemEntity.h | 4 +- .../minecraft/world/entity/item}/Minecart.cpp | 30 +- .../minecraft/world/entity/item}/Minecart.h | 0 .../world/entity/item}/MinecartChest.cpp | 6 +- .../world/entity/item}/MinecartChest.h | 0 .../world/entity/item}/MinecartContainer.cpp | 12 +- .../world/entity/item}/MinecartContainer.h | 4 +- .../world/entity/item}/MinecartFurnace.cpp | 14 +- .../world/entity/item}/MinecartFurnace.h | 2 +- .../world/entity/item}/MinecartHopper.cpp | 16 +- .../world/entity/item}/MinecartHopper.h | 2 +- .../world/entity/item}/MinecartRideable.cpp | 8 +- .../world/entity/item}/MinecartRideable.h | 2 +- .../world/entity/item}/MinecartSpawner.cpp | 6 +- .../world/entity/item}/MinecartSpawner.h | 4 +- .../world/entity/item}/MinecartTNT.cpp | 8 +- .../world/entity/item}/MinecartTNT.h | 2 +- .../world/entity/item}/PrimedTnt.cpp | 8 +- .../minecraft/world/entity/item}/PrimedTnt.h | 0 .../item/net.minecraft.world.entity.item.h | 14 + .../minecraft/world/entity/monster}/Blaze.cpp | 26 +- .../minecraft/world/entity/monster}/Blaze.h | 2 +- .../world/entity/monster}/CaveSpider.cpp | 16 +- .../world/entity/monster}/CaveSpider.h | 0 .../world/entity/monster}/Creeper.cpp | 34 +- .../minecraft/world/entity/monster}/Creeper.h | 2 +- .../world/entity/monster}/EnderMan.cpp | 24 +- .../world/entity/monster}/EnderMan.h | 2 +- .../minecraft/world/entity/monster}/Enemy.cpp | 2 +- .../minecraft/world/entity/monster}/Enemy.h | 4 +- .../minecraft/world/entity/monster}/Ghast.cpp | 30 +- .../minecraft/world/entity/monster}/Ghast.h | 2 +- .../minecraft/world/entity/monster}/Giant.cpp | 10 +- .../minecraft/world/entity/monster}/Giant.h | 2 +- .../world/entity/monster}/LavaSlime.cpp | 16 +- .../world/entity/monster}/LavaSlime.h | 0 .../world/entity/monster}/Monster.cpp | 22 +- .../minecraft/world/entity/monster}/Monster.h | 2 +- .../world/entity/monster}/PigZombie.cpp | 28 +- .../world/entity/monster}/PigZombie.h | 0 .../world/entity/monster}/RangedAttackMob.h | 0 .../monster}/SharedMonsterAttributes.cpp | 4 +- .../entity/monster}/SharedMonsterAttributes.h | 0 .../world/entity/monster}/Silverfish.cpp | 20 +- .../world/entity/monster}/Silverfish.h | 2 +- .../world/entity/monster}/Skeleton.cpp | 44 +- .../world/entity/monster}/Skeleton.h | 2 +- .../minecraft/world/entity/monster}/Slime.cpp | 32 +- .../minecraft/world/entity/monster}/Slime.h | 4 +- .../world/entity/monster}/Spider.cpp | 26 +- .../minecraft/world/entity/monster}/Spider.h | 4 +- .../minecraft/world/entity/monster}/Witch.cpp | 26 +- .../minecraft/world/entity/monster}/Witch.h | 2 +- .../world/entity/monster}/Zombie.cpp | 38 +- .../minecraft/world/entity/monster}/Zombie.h | 6 +- .../net.minecraft.world.entity.monster.h | 26 + .../world/entity/net.minecraft.world.entity.h | 34 + .../world/entity/npc}/ClientSideMerchant.cpp | 6 +- .../world/entity/npc}/ClientSideMerchant.h | 2 +- .../net/minecraft/world/entity/npc/Npc.cpp | 3 + .../minecraft/world/entity/npc}/Npc.h | 2 +- .../minecraft/world/entity/npc}/Villager.cpp | 34 +- .../minecraft/world/entity/npc}/Villager.h | 6 +- .../npc/net.minecraft.world.entity.npc.h | 5 + .../world/entity/player}/Abilities.cpp | 4 +- .../world/entity/player}/Abilities.h | 0 .../world/entity/player}/Inventory.cpp | 14 +- .../world/entity/player}/Inventory.h | 6 +- .../minecraft/world/entity/player}/Player.cpp | 66 +- .../minecraft/world/entity/player}/Player.h | 12 +- .../net.minecraft.world.entity.player.h | 5 + .../world/entity/projectile}/Arrow.cpp | 32 +- .../world/entity/projectile}/Arrow.h | 2 +- .../entity/projectile}/DragonFireball.cpp | 14 +- .../world/entity/projectile}/DragonFireball.h | 0 .../entity/projectile}/EyeOfEnderSignal.cpp | 16 +- .../entity/projectile}/EyeOfEnderSignal.h | 0 .../world/entity/projectile}/Fireball.cpp | 20 +- .../world/entity/projectile}/Fireball.h | 2 +- .../projectile}/FireworksRocketEntity.cpp | 8 +- .../projectile}/FireworksRocketEntity.h | 2 +- .../world/entity/projectile}/FishingHook.cpp | 24 +- .../world/entity/projectile}/FishingHook.h | 0 .../entity/projectile}/LargeFireball.cpp | 8 +- .../world/entity/projectile}/LargeFireball.h | 2 +- .../world/entity/projectile}/Projectile.h | 0 .../entity/projectile}/SmallFireball.cpp | 12 +- .../world/entity/projectile}/SmallFireball.h | 0 .../world/entity/projectile}/Snowball.cpp | 10 +- .../world/entity/projectile}/Snowball.h | 2 +- .../world/entity/projectile}/Throwable.cpp | 12 +- .../world/entity/projectile}/Throwable.h | 2 +- .../world/entity/projectile}/ThrownEgg.cpp | 12 +- .../world/entity/projectile}/ThrownEgg.h | 2 +- .../entity/projectile/ThrownEnderpearl.cpp} | 16 +- .../entity/projectile/ThrownEnderpearl.h} | 2 +- .../entity/projectile}/ThrownExpBottle.cpp | 10 +- .../entity/projectile}/ThrownExpBottle.h | 2 +- .../world/entity/projectile}/ThrownPotion.cpp | 16 +- .../world/entity/projectile}/ThrownPotion.h | 2 +- .../world/entity/projectile}/WitherSkull.cpp | 16 +- .../world/entity/projectile}/WitherSkull.h | 2 +- .../net.minecraft.world.entity.projectile.h | 24 + .../minecraft/world/food}/FoodConstants.cpp | 2 +- .../minecraft/world/food}/FoodConstants.h | 0 .../minecraft/world/food}/FoodData.cpp | 16 +- .../minecraft/world/food}/FoodData.h | 0 .../world/food/net.minecraft.world.food.h | 4 + .../inventory}/AbstractContainerMenu.cpp | 8 +- .../world/inventory}/AbstractContainerMenu.h | 4 +- .../world/inventory}/AnimalChest.cpp | 2 +- .../minecraft/world/inventory}/AnimalChest.h | 2 +- .../minecraft/world/inventory}/AnvilMenu.cpp | 12 +- .../minecraft/world/inventory}/AnvilMenu.h | 0 .../minecraft/world/inventory}/ArmorSlot.cpp | 12 +- .../minecraft/world/inventory}/ArmorSlot.h | 0 .../minecraft/world/inventory}/BeaconMenu.cpp | 6 +- .../minecraft/world/inventory}/BeaconMenu.h | 0 .../world/inventory}/BrewingStandMenu.cpp | 12 +- .../world/inventory}/BrewingStandMenu.h | 0 .../world/inventory}/ContainerMenu.cpp | 14 +- .../world/inventory}/ContainerMenu.h | 0 .../world/inventory}/CraftingContainer.cpp | 6 +- .../world/inventory}/CraftingContainer.h | 2 +- .../world/inventory}/CraftingMenu.cpp | 12 +- .../minecraft/world/inventory}/CraftingMenu.h | 0 .../world/inventory}/EnchantmentContainer.cpp | 4 +- .../world/inventory}/EnchantmentContainer.h | 2 +- .../world/inventory}/EnchantmentMenu.cpp | 14 +- .../world/inventory}/EnchantmentMenu.h | 2 +- .../world/inventory}/EnchantmentSlot.h | 0 .../world/inventory}/FireworksMenu.cpp | 12 +- .../world/inventory}/FireworksMenu.h | 0 .../world/inventory}/FurnaceMenu.cpp | 12 +- .../minecraft/world/inventory}/FurnaceMenu.h | 0 .../world/inventory}/FurnaceResultSlot.cpp | 16 +- .../world/inventory}/FurnaceResultSlot.h | 0 .../minecraft/world/inventory}/HopperMenu.cpp | 4 +- .../minecraft/world/inventory}/HopperMenu.h | 0 .../world/inventory}/HorseInventoryMenu.cpp | 6 +- .../world/inventory}/HorseInventoryMenu.h | 0 .../world/inventory}/InventoryMenu.cpp | 12 +- .../world/inventory}/InventoryMenu.h | 0 .../minecraft/world/inventory}/MenuBackup.cpp | 6 +- .../minecraft/world/inventory}/MenuBackup.h | 0 .../world/inventory}/MerchantContainer.cpp | 4 +- .../world/inventory}/MerchantContainer.h | 4 +- .../world/inventory}/MerchantMenu.cpp | 10 +- .../minecraft/world/inventory}/MerchantMenu.h | 0 .../world/inventory}/MerchantResultSlot.cpp | 6 +- .../world/inventory}/MerchantResultSlot.h | 0 .../inventory}/PlayerEnderChestContainer.cpp | 6 +- .../inventory}/PlayerEnderChestContainer.h | 2 +- .../world/inventory}/RepairContainer.cpp | 2 +- .../world/inventory}/RepairContainer.h | 2 +- .../world/inventory}/RepairResultSlot.cpp | 10 +- .../world/inventory}/RepairResultSlot.h | 0 .../world/inventory}/ResultContainer.cpp | 4 +- .../world/inventory}/ResultContainer.h | 2 +- .../minecraft/world/inventory}/ResultSlot.cpp | 12 +- .../minecraft/world/inventory}/ResultSlot.h | 0 .../minecraft/world/inventory}/Slot.cpp | 8 +- .../minecraft/world/inventory}/Slot.h | 0 .../minecraft/world/inventory}/TrapMenu.cpp | 8 +- .../minecraft/world/inventory}/TrapMenu.h | 0 ...ecraft.world.inventory.ContainerListener.h | 0 .../inventory/net.minecraft.world.inventory.h | 32 + .../minecraft/world/item}/AnvilTileItem.cpp | 4 +- .../minecraft/world/item}/AnvilTileItem.h | 0 .../minecraft/world/item}/ArmorItem.cpp | 18 +- .../minecraft/world/item}/ArmorItem.h | 2 +- .../minecraft/world/item}/AuxDataTileItem.cpp | 4 +- .../minecraft/world/item}/AuxDataTileItem.h | 0 .../minecraft/world/item}/BedItem.cpp | 16 +- .../minecraft/world/item}/BedItem.h | 0 .../minecraft/world/item}/BoatItem.cpp | 14 +- .../minecraft/world/item}/BoatItem.h | 0 .../minecraft/world/item}/BookItem.cpp | 2 +- .../minecraft/world/item}/BookItem.h | 0 .../minecraft/world/item}/BottleItem.cpp | 12 +- .../minecraft/world/item}/BottleItem.h | 0 .../minecraft/world/item}/BowItem.cpp | 16 +- .../minecraft/world/item}/BowItem.h | 0 .../minecraft/world/item}/BowlFoodItem.cpp | 4 +- .../minecraft/world/item}/BowlFoodItem.h | 0 .../minecraft/world/item}/BucketItem.cpp | 34 +- .../minecraft/world/item}/BucketItem.h | 0 .../world/item}/CarrotOnAStickItem.cpp | 10 +- .../world/item}/CarrotOnAStickItem.h | 0 .../minecraft/world/item}/ClockItem.cpp | 8 +- .../minecraft/world/item}/ClockItem.h | 0 .../minecraft/world/item}/CoalItem.cpp | 10 +- .../minecraft/world/item}/CoalItem.h | 0 .../minecraft/world/item}/ColoredTileItem.cpp | 4 +- .../minecraft/world/item}/ColoredTileItem.h | 0 .../minecraft/world/item}/CompassItem.cpp | 8 +- .../minecraft/world/item}/CompassItem.h | 0 .../minecraft/world/item}/ComplexItem.cpp | 8 +- .../minecraft/world/item}/ComplexItem.h | 0 .../minecraft/world/item}/DiggerItem.cpp | 12 +- .../minecraft/world/item}/DiggerItem.h | 0 .../minecraft/world/item}/DoorItem.cpp | 20 +- .../minecraft/world/item}/DoorItem.h | 0 .../minecraft/world/item}/DyePowderItem.cpp | 24 +- .../minecraft/world/item}/DyePowderItem.h | 0 .../net/minecraft/world/item/EggItem.cpp | 29 + .../minecraft/world/item}/EggItem.h | 0 .../minecraft/world/item}/EmptyMapItem.cpp | 6 +- .../minecraft/world/item}/EmptyMapItem.h | 0 .../world/item}/EnchantedBookItem.cpp | 8 +- .../minecraft/world/item}/EnchantedBookItem.h | 0 .../minecraft/world/item}/EnderEyeItem.cpp | 18 +- .../minecraft/world/item}/EnderEyeItem.h | 0 .../minecraft/world/item/EnderpearlItem.cpp} | 12 +- .../minecraft/world/item/EnderpearlItem.h} | 0 .../minecraft/world/item}/ExperienceItem.cpp | 12 +- .../minecraft/world/item}/ExperienceItem.h | 0 .../minecraft/world/item}/FireChargeItem.cpp | 16 +- .../minecraft/world/item}/FireChargeItem.h | 0 .../world/item}/FireworksChargeItem.cpp | 6 +- .../world/item}/FireworksChargeItem.h | 0 .../minecraft/world/item}/FireworksItem.cpp | 10 +- .../minecraft/world/item}/FireworksItem.h | 0 .../minecraft/world/item}/FishingRodItem.cpp | 24 +- .../minecraft/world/item}/FishingRodItem.h | 0 .../world/item}/FlintAndSteelItem.cpp | 16 +- .../minecraft/world/item}/FlintAndSteelItem.h | 0 .../minecraft/world/item}/FoodItem.cpp | 16 +- .../minecraft/world/item}/FoodItem.h | 0 .../minecraft/world/item}/GoldenAppleItem.cpp | 10 +- .../minecraft/world/item}/GoldenAppleItem.h | 0 .../world/item}/HangingEntityItem.cpp | 22 +- .../minecraft/world/item}/HangingEntityItem.h | 0 .../minecraft/world/item}/HatchetItem.cpp | 4 +- .../minecraft/world/item}/HatchetItem.h | 0 .../minecraft/world/item}/HoeItem.cpp | 8 +- .../minecraft/world/item}/HoeItem.h | 0 .../minecraft/world/item}/Item.cpp | 28 +- .../minecraft/world/item}/Item.h | 6 +- .../minecraft/world/item}/ItemInstance.cpp | 26 +- .../minecraft/world/item}/ItemInstance.h | 6 +- .../minecraft/world/item}/LeafTileItem.cpp | 8 +- .../minecraft/world/item}/LeafTileItem.h | 0 .../minecraft/world/item}/LeashItem.cpp | 12 +- .../minecraft/world/item}/LeashItem.h | 0 .../minecraft/world/item}/MapItem.cpp | 28 +- .../minecraft/world/item}/MapItem.h | 0 .../minecraft/world/item}/MilkBucketItem.cpp | 6 +- .../minecraft/world/item}/MilkBucketItem.h | 0 .../minecraft/world/item}/MinecartItem.cpp | 10 +- .../minecraft/world/item}/MinecartItem.h | 2 +- .../world/item}/MultiTextureTileItem.cpp | 6 +- .../world/item}/MultiTextureTileItem.h | 0 .../minecraft/world/item}/NameTagItem.cpp | 4 +- .../minecraft/world/item}/NameTagItem.h | 0 .../minecraft/world/item}/PickaxeItem.cpp | 4 +- .../minecraft/world/item}/PickaxeItem.h | 0 .../minecraft/world/item}/PistonTileItem.cpp | 6 +- .../minecraft/world/item}/PistonTileItem.h | 0 .../minecraft/world/item}/PlanterTileItem.cpp | 14 +- .../minecraft/world/item}/PlanterTileItem.h | 2 +- .../minecraft/world/item}/PotionItem.cpp | 26 +- .../minecraft/world/item}/PotionItem.h | 0 .../minecraft/world/item}/Rarity.cpp | 2 +- .../minecraft/world/item}/Rarity.h | 0 .../minecraft/world/item}/RecordingItem.cpp | 14 +- .../minecraft/world/item}/RecordingItem.h | 0 .../minecraft/world/item/RedStoneItem.cpp} | 12 +- .../minecraft/world/item/RedStoneItem.h} | 0 .../minecraft/world/item}/SaddleItem.cpp | 8 +- .../minecraft/world/item}/SaddleItem.h | 0 .../minecraft/world/item}/SaplingTileItem.cpp | 4 +- .../minecraft/world/item}/SaplingTileItem.h | 0 .../minecraft/world/item}/SeedFoodItem.cpp | 8 +- .../minecraft/world/item}/SeedFoodItem.h | 0 .../minecraft/world/item}/SeedItem.cpp | 8 +- .../minecraft/world/item}/SeedItem.h | 0 .../minecraft/world/item}/ShearsItem.cpp | 6 +- .../minecraft/world/item}/ShearsItem.h | 0 .../minecraft/world/item}/ShovelItem.cpp | 4 +- .../minecraft/world/item}/ShovelItem.h | 0 .../minecraft/world/item}/SignItem.cpp | 12 +- .../minecraft/world/item}/SignItem.h | 0 .../world/item}/SimpleFoiledItem.cpp | 2 +- .../minecraft/world/item}/SimpleFoiledItem.h | 0 .../minecraft/world/item}/SkullItem.cpp | 14 +- .../minecraft/world/item}/SkullItem.h | 2 +- .../minecraft/world/item}/SnowItem.cpp | 10 +- .../minecraft/world/item}/SnowItem.h | 2 +- .../minecraft/world/item}/SnowballItem.cpp | 12 +- .../minecraft/world/item}/SnowballItem.h | 0 .../minecraft/world/item}/SpawnEggItem.cpp | 22 +- .../minecraft/world/item}/SpawnEggItem.h | 0 .../world/item}/StoneSlabTileItem.cpp | 16 +- .../minecraft/world/item}/StoneSlabTileItem.h | 2 +- .../minecraft/world/item}/TileItem.cpp | 20 +- .../minecraft/world/item}/TileItem.h | 2 +- .../minecraft/world/item}/UseAnim.h | 0 .../world/item}/WaterLilyTileItem.cpp | 12 +- .../minecraft/world/item}/WaterLilyTileItem.h | 0 .../minecraft/world/item}/WeaponItem.cpp | 14 +- .../minecraft/world/item}/WeaponItem.h | 0 .../minecraft/world/item}/WoolTileItem.cpp | 8 +- .../minecraft/world/item}/WoolTileItem.h | 0 .../minecraft/world/item}/WrittenBookItem.h | 0 .../world/item/alchemy}/PotionBrewing.cpp | 10 +- .../world/item/alchemy}/PotionBrewing.h | 0 .../net.minecraft.world.item.alchemy.h | 3 + .../world/item/crafting}/ArmorDyeRecipe.cpp | 10 +- .../world/item/crafting}/ArmorDyeRecipe.h | 0 .../world/item/crafting}/ArmorRecipes.cpp | 6 +- .../world/item/crafting}/ArmorRecipes.h | 0 .../world/item/crafting}/ClothDyeRecipes.cpp | 6 +- .../world/item/crafting}/ClothDyeRecipes.h | 0 .../world/item/crafting}/FireworksRecipe.cpp | 4 +- .../world/item/crafting}/FireworksRecipe.h | 0 .../world/item/crafting}/FoodRecipes.cpp | 8 +- .../world/item/crafting}/FoodRecipes.h | 0 .../world/item/crafting}/FurnaceRecipes.cpp | 6 +- .../world/item/crafting}/FurnaceRecipes.h | 0 .../world/item/crafting}/MapCloningRecipe.h | 0 .../world/item/crafting}/MapExtendingRecipe.h | 0 .../world/item/crafting}/OreRecipes.cpp | 8 +- .../world/item/crafting}/OreRecipes.h | 0 .../world/item/crafting}/Recipes.cpp | 18 +- .../minecraft/world/item/crafting}/Recipes.h | 0 .../minecraft/world/item/crafting}/Recipy.h | 2 +- .../world/item/crafting}/ShapedRecipy.cpp | 8 +- .../world/item/crafting}/ShapedRecipy.h | 0 .../world/item/crafting}/ShapelessRecipy.cpp | 8 +- .../world/item/crafting}/ShapelessRecipy.h | 0 .../world/item/crafting}/StructureRecipes.cpp | 6 +- .../world/item/crafting}/StructureRecipes.h | 0 .../world/item/crafting}/ToolRecipes.cpp | 6 +- .../world/item/crafting}/ToolRecipes.h | 0 .../world/item/crafting}/WeaponRecipes.cpp | 6 +- .../world/item/crafting}/WeaponRecipes.h | 0 .../net.minecraft.world.item.crafting.h | 16 + .../enchantment}/ArrowDamageEnchantment.cpp | 2 +- .../enchantment}/ArrowDamageEnchantment.h | 0 .../enchantment}/ArrowFireEnchantment.cpp | 2 +- .../item/enchantment}/ArrowFireEnchantment.h | 0 .../enchantment}/ArrowInfiniteEnchantment.cpp | 2 +- .../enchantment}/ArrowInfiniteEnchantment.h | 0 .../ArrowKnockbackEnchantment.cpp | 2 +- .../enchantment}/ArrowKnockbackEnchantment.h | 0 .../item/enchantment}/DamageEnchantment.cpp | 6 +- .../item/enchantment}/DamageEnchantment.h | 0 .../enchantment}/DigDurabilityEnchantment.cpp | 4 +- .../enchantment}/DigDurabilityEnchantment.h | 0 .../item/enchantment}/DiggingEnchantment.cpp | 4 +- .../item/enchantment}/DiggingEnchantment.h | 0 .../world/item/enchantment}/Enchantment.cpp | 6 +- .../world/item/enchantment}/Enchantment.h | 0 .../item/enchantment}/EnchantmentCategory.cpp | 4 +- .../item/enchantment}/EnchantmentCategory.h | 0 .../item/enchantment}/EnchantmentHelper.cpp | 14 +- .../item/enchantment}/EnchantmentHelper.h | 0 .../item/enchantment}/EnchantmentInstance.cpp | 4 +- .../item/enchantment}/EnchantmentInstance.h | 2 +- .../enchantment}/FireAspectEnchantment.cpp | 2 +- .../item/enchantment}/FireAspectEnchantment.h | 0 .../enchantment}/KnockbackEnchantment.cpp | 2 +- .../item/enchantment}/KnockbackEnchantment.h | 0 .../enchantment}/LootBonusEnchantment.cpp | 2 +- .../item/enchantment}/LootBonusEnchantment.h | 0 .../item/enchantment}/OxygenEnchantment.cpp | 2 +- .../item/enchantment}/OxygenEnchantment.h | 0 .../enchantment}/ProtectionEnchantment.cpp | 8 +- .../item/enchantment}/ProtectionEnchantment.h | 0 .../item/enchantment}/ThornsEnchantment.cpp | 10 +- .../item/enchantment}/ThornsEnchantment.h | 0 .../enchantment}/UntouchingEnchantment.cpp | 4 +- .../item/enchantment}/UntouchingEnchantment.h | 0 .../enchantment}/WaterWorkerEnchantment.cpp | 2 +- .../enchantment}/WaterWorkerEnchantment.h | 0 .../net.minecraft.world.item.enchantment.h | 24 + .../world/item/net.minecraft.world.item.h | 87 + .../minecraft/world/item/trading}/Merchant.h | 0 .../world/item/trading}/MerchantRecipe.cpp | 2 +- .../world/item/trading}/MerchantRecipe.h | 0 .../item/trading}/MerchantRecipeList.cpp | 4 +- .../world/item/trading}/MerchantRecipeList.h | 0 .../net.minecraft.world.item.trading.h | 5 + .../minecraft/world/level}/BaseMobSpawner.cpp | 12 +- .../minecraft/world/level}/BaseMobSpawner.h | 2 +- .../world/level}/BlockDestructionProgress.cpp | 2 +- .../world/level}/BlockDestructionProgress.h | 0 .../minecraft/world/level}/Calendar.cpp | 2 +- .../minecraft/world/level}/Calendar.h | 0 .../minecraft/world/level}/ChunkPos.cpp | 4 +- .../minecraft/world/level}/ChunkPos.h | 0 .../minecraft/world/level}/Coord.h | 0 .../minecraft/world/level}/Explosion.cpp | 20 +- .../minecraft/world/level}/Explosion.h | 2 +- .../minecraft/world/level}/FoliageColor.cpp | 4 +- .../minecraft/world/level}/FoliageColor.h | 0 .../minecraft/world/level}/GameRules.cpp | 2 +- .../minecraft/world/level}/GameRules.h | 0 .../minecraft/world/level}/GrassColor.cpp | 2 +- .../minecraft/world/level}/GrassColor.h | 0 .../minecraft/world/level}/Level.cpp | 76 +- .../minecraft/world/level}/Level.h | 14 +- .../world/level}/LevelConflictException.cpp | 2 +- .../world/level}/LevelConflictException.h | 2 +- .../minecraft/world/level}/LevelListener.h | 4 +- .../minecraft/world/level}/LevelSettings.cpp | 4 +- .../minecraft/world/level}/LevelSettings.h | 0 .../minecraft/world/level}/LevelSource.h | 2 +- .../minecraft/world/level}/LevelType.cpp | 4 +- .../minecraft/world/level}/LevelType.h | 2 +- .../minecraft/world/level}/LightLayer.h | 0 .../minecraft/world/level}/MobSpawner.cpp | 36 +- .../minecraft/world/level}/MobSpawner.h | 2 +- .../minecraft/world/level}/PortalForcer.cpp | 12 +- .../minecraft/world/level}/PortalForcer.h | 0 .../minecraft/world/level}/Region.cpp | 16 +- .../minecraft/world/level}/Region.h | 0 .../world/level}/TickNextTickData.cpp | 4 +- .../minecraft/world/level}/TickNextTickData.h | 0 .../minecraft/world/level}/TileEventData.cpp | 2 +- .../minecraft/world/level}/TileEventData.h | 0 .../minecraft/world/level}/TilePos.cpp | 4 +- .../minecraft/world/level}/TilePos.h | 0 .../minecraft/world/level}/WaterColor.cpp | 2 +- .../minecraft/world/level}/WaterColor.h | 0 .../world/level/biome}/BeachBiome.cpp | 4 +- .../minecraft/world/level/biome}/BeachBiome.h | 0 .../minecraft/world/level/biome}/Biome.cpp | 20 +- .../minecraft/world/level/biome}/Biome.h | 6 +- .../world/level/biome}/BiomeCache.cpp | 4 +- .../minecraft/world/level/biome}/BiomeCache.h | 2 +- .../world/level/biome}/BiomeDecorator.cpp | 10 +- .../world/level/biome}/BiomeDecorator.h | 0 .../world/level/biome}/BiomeSource.cpp | 16 +- .../world/level/biome}/BiomeSource.h | 2 +- .../world/level/biome}/DesertBiome.cpp | 10 +- .../world/level/biome}/DesertBiome.h | 0 .../world/level/biome}/ExtremeHillsBiome.cpp | 8 +- .../world/level/biome}/ExtremeHillsBiome.h | 0 .../world/level/biome}/FixedBiomeSource.cpp | 4 +- .../world/level/biome}/FixedBiomeSource.h | 0 .../world/level/biome}/ForestBiome.cpp | 10 +- .../world/level/biome}/ForestBiome.h | 0 .../world/level/biome}/HellBiome.cpp | 4 +- .../minecraft/world/level/biome}/HellBiome.h | 0 .../minecraft/world/level/biome}/IceBiome.cpp | 2 +- .../minecraft/world/level/biome}/IceBiome.h | 0 .../world/level/biome}/JungleBiome.cpp | 12 +- .../world/level/biome}/JungleBiome.h | 0 .../level/biome}/MushroomIslandBiome.cpp | 6 +- .../world/level/biome}/MushroomIslandBiome.h | 0 .../minecraft/world/level/biome}/OceanBiome.h | 0 .../world/level/biome}/PlainsBiome.cpp | 4 +- .../world/level/biome}/PlainsBiome.h | 0 .../world/level/biome}/RainforestBiome.cpp | 4 +- .../world/level/biome}/RainforestBiome.h | 0 .../minecraft/world/level/biome}/RiverBiome.h | 0 .../world/level/biome}/SwampBiome.cpp | 8 +- .../minecraft/world/level/biome}/SwampBiome.h | 0 .../world/level/biome}/TaigaBiome.cpp | 8 +- .../minecraft/world/level/biome}/TaigaBiome.h | 0 .../world/level/biome}/TheEndBiome.cpp | 8 +- .../world/level/biome}/TheEndBiome.h | 0 .../level/biome}/TheEndBiomeDecorator.cpp | 10 +- .../world/level/biome}/TheEndBiomeDecorator.h | 2 +- .../world/level/biome}/WaterlilyFeature.cpp | 6 +- .../world/level/biome}/WaterlilyFeature.h | 2 +- .../biome/net.minecraft.world.level.biome.h | 31 + .../world/level/chunk}/BlockReplacements.cpp | 4 +- .../world/level/chunk}/BlockReplacements.h | 0 .../world/level/chunk}/ChunkSource.h | 2 +- .../level/chunk}/CompressedTileStorage.cpp | 2 +- .../level/chunk}/CompressedTileStorage.h | 2 +- .../world/level/chunk}/DataLayer.cpp | 2 +- .../minecraft/world/level/chunk}/DataLayer.h | 0 .../world/level/chunk}/EmptyLevelChunk.cpp | 8 +- .../world/level/chunk}/EmptyLevelChunk.h | 2 +- .../world/level/chunk}/LevelChunk.cpp | 34 +- .../minecraft/world/level/chunk}/LevelChunk.h | 12 +- .../world/level/chunk}/ReadOnlyChunkCache.cpp | 6 +- .../world/level/chunk}/ReadOnlyChunkCache.h | 8 +- .../world/level/chunk}/SparseDataStorage.cpp | 2 +- .../world/level/chunk}/SparseDataStorage.h | 2 +- .../world/level/chunk}/SparseLightStorage.cpp | 2 +- .../world/level/chunk}/SparseLightStorage.h | 2 +- .../world/level/chunk}/WaterLevelChunk.cpp | 10 +- .../world/level/chunk}/WaterLevelChunk.h | 2 +- .../chunk/net.minecraft.world.level.chunk.h | 8 + .../world/level/chunk/storage}/ChunkStorage.h | 0 .../storage}/ChunkStorageProfileDecorator.cpp | 4 +- .../storage}/ChunkStorageProfileDecorator.h | 0 .../chunk/storage}/McRegionChunkStorage.cpp | 10 +- .../chunk/storage}/McRegionChunkStorage.h | 2 +- .../chunk/storage}/MemoryChunkStorage.cpp | 6 +- .../level/chunk/storage}/MemoryChunkStorage.h | 0 .../level/chunk/storage}/NbtSlotFile.cpp | 4 +- .../world/level/chunk/storage}/NbtSlotFile.h | 6 +- .../level/chunk/storage}/OldChunkStorage.cpp | 18 +- .../level/chunk/storage}/OldChunkStorage.h | 6 +- .../world/level/chunk/storage}/RegionFile.cpp | 10 +- .../world/level/chunk/storage}/RegionFile.h | 4 +- .../level/chunk/storage}/RegionFileCache.cpp | 6 +- .../level/chunk/storage}/RegionFileCache.h | 4 +- .../world/level/chunk/storage}/ZoneFile.cpp | 6 +- .../world/level/chunk/storage}/ZoneFile.h | 4 +- .../world/level/chunk/storage/ZoneIo.cpp} | 6 +- .../world/level/chunk/storage/ZoneIo.h} | 0 .../chunk/storage}/ZonedChunkStorage.cpp | 14 +- .../level/chunk/storage}/ZonedChunkStorage.h | 2 +- .../net.minecraft.world.level.chunk.storage.h | 13 + .../world/level/dimension}/Dimension.cpp | 22 +- .../world/level/dimension}/Dimension.h | 6 +- .../world/level/dimension}/HellDimension.cpp | 16 +- .../world/level/dimension}/HellDimension.h | 0 .../world/level/dimension}/NormalDimension.h | 0 .../level/dimension}/TheEndDimension.cpp | 14 +- .../world/level/dimension}/TheEndDimension.h | 0 .../net.minecraft.world.level.dimension.h | 6 + .../world/level/levelgen}/CanyonFeature.cpp | 8 +- .../world/level/levelgen}/CanyonFeature.h | 0 .../level/levelgen}/CustomLevelSource.cpp | 20 +- .../world/level/levelgen}/CustomLevelSource.h | 2 +- .../world/level/levelgen}/DungeonFeature.cpp | 6 +- .../world/level/levelgen}/DungeonFeature.h | 0 .../world/level/levelgen}/FlatLevelSource.cpp | 16 +- .../world/level/levelgen}/FlatLevelSource.h | 2 +- .../level/levelgen}/HellFlatLevelSource.cpp | 8 +- .../level/levelgen}/HellFlatLevelSource.h | 20 +- .../level/levelgen}/HellRandomLevelSource.cpp | 14 +- .../level/levelgen}/HellRandomLevelSource.h | 22 +- .../level/levelgen}/LargeCaveFeature.cpp | 8 +- .../world/level/levelgen}/LargeCaveFeature.h | 0 .../world/level/levelgen}/LargeFeature.cpp | 4 +- .../world/level/levelgen}/LargeFeature.h | 2 +- .../level/levelgen}/LargeHellCaveFeature.cpp | 6 +- .../level/levelgen}/LargeHellCaveFeature.h | 0 .../level/levelgen}/RandomLevelSource.cpp | 20 +- .../world/level/levelgen}/RandomLevelSource.h | 2 +- .../TheEndLevelRandomLevelSource.cpp | 18 +- .../levelgen}/TheEndLevelRandomLevelSource.h | 2 +- .../world/level/levelgen}/TownFeature.h | 0 .../levelgen/feature}/BasicTreeFeature.cpp | 6 +- .../levelgen/feature}/BasicTreeFeature.h | 0 .../level/levelgen/feature}/BirchFeature.cpp | 6 +- .../level/levelgen/feature}/BirchFeature.h | 0 .../levelgen/feature}/BonusChestFeature.cpp | 12 +- .../levelgen/feature}/BonusChestFeature.h | 0 .../level/levelgen/feature}/CactusFeature.cpp | 6 +- .../level/levelgen/feature}/CactusFeature.h | 0 .../level/levelgen/feature}/CaveFeature.cpp | 6 +- .../level/levelgen/feature}/CaveFeature.h | 2 +- .../level/levelgen/feature}/ClayFeature.cpp | 8 +- .../level/levelgen/feature}/ClayFeature.h | 2 +- .../levelgen/feature}/DeadBushFeature.cpp | 6 +- .../level/levelgen/feature}/DeadBushFeature.h | 0 .../levelgen/feature}/DesertWellFeature.cpp | 6 +- .../levelgen/feature}/DesertWellFeature.h | 0 .../levelgen/feature}/EndPodiumFeature.cpp | 8 +- .../levelgen/feature}/EndPodiumFeature.h | 0 .../world/level/levelgen/feature}/Feature.cpp | 6 +- .../world/level/levelgen/feature}/Feature.h | 0 .../level/levelgen/feature}/FlowerFeature.cpp | 8 +- .../level/levelgen/feature}/FlowerFeature.h | 0 .../levelgen/feature}/GroundBushFeature.cpp | 6 +- .../levelgen/feature}/GroundBushFeature.h | 0 .../levelgen/feature}/HellFireFeature.cpp | 6 +- .../level/levelgen/feature}/HellFireFeature.h | 0 .../levelgen/feature}/HellPortalFeature.cpp | 6 +- .../levelgen/feature}/HellPortalFeature.h | 0 .../levelgen/feature}/HellSpringFeature.cpp | 6 +- .../levelgen/feature}/HellSpringFeature.h | 0 .../level/levelgen/feature}/HouseFeature.cpp | 10 +- .../level/levelgen/feature}/HouseFeature.h | 2 +- .../levelgen/feature}/HugeMushroomFeature.cpp | 6 +- .../levelgen/feature}/HugeMushroomFeature.h | 0 .../level/levelgen/feature}/LakeFeature.cpp | 8 +- .../level/levelgen/feature}/LakeFeature.h | 2 +- .../levelgen/feature}/LightGemFeature.cpp | 6 +- .../level/levelgen/feature}/LightGemFeature.h | 0 .../levelgen/feature}/MegaTreeFeature.cpp | 6 +- .../level/levelgen/feature}/MegaTreeFeature.h | 0 .../levelgen/feature}/MonsterRoomFeature.cpp | 14 +- .../levelgen/feature}/MonsterRoomFeature.h | 2 +- .../levelgen/feature}/NetherSphereFeature.cpp | 2 +- .../levelgen/feature}/NetherSphereFeature.h | 2 +- .../level/levelgen/feature}/OreFeature.cpp | 6 +- .../level/levelgen/feature}/OreFeature.h | 0 .../level/levelgen/feature}/PineFeature.cpp | 6 +- .../level/levelgen/feature}/PineFeature.h | 0 .../levelgen/feature}/PumpkinFeature.cpp | 6 +- .../level/levelgen/feature}/PumpkinFeature.h | 0 .../level/levelgen/feature}/ReedsFeature.cpp | 6 +- .../level/levelgen/feature}/ReedsFeature.h | 2 +- .../level/levelgen/feature}/SandFeature.cpp | 6 +- .../level/levelgen/feature}/SandFeature.h | 0 .../level/levelgen/feature}/SpikeFeature.cpp | 8 +- .../level/levelgen/feature}/SpikeFeature.h | 0 .../level/levelgen/feature}/SpringFeature.cpp | 6 +- .../level/levelgen/feature}/SpringFeature.h | 0 .../level/levelgen/feature}/SpruceFeature.cpp | 6 +- .../level/levelgen/feature}/SpruceFeature.h | 0 .../levelgen/feature}/SwampTreeFeature.cpp | 8 +- .../levelgen/feature}/SwampTreeFeature.h | 0 .../levelgen/feature}/TallGrassFeature.cpp | 6 +- .../levelgen/feature}/TallGrassFeature.h | 0 .../level/levelgen/feature}/TreeFeature.cpp | 6 +- .../level/levelgen/feature}/TreeFeature.h | 0 .../level/levelgen/feature}/VinesFeature.cpp | 8 +- .../level/levelgen/feature}/VinesFeature.h | 0 ...t.minecraft.world.level.levelgen.feature.h | 37 + .../levelgen/flat}/FlatGeneratorInfo.cpp | 8 +- .../level/levelgen/flat}/FlatGeneratorInfo.h | 0 .../level/levelgen/flat}/FlatLayerInfo.cpp | 2 +- .../level/levelgen/flat}/FlatLayerInfo.h | 0 .../net.minecraft.world.level.levelgen.flat.h | 4 + .../net.minecraft.world.level.levelgen.h | 15 + .../levelgen/structure}/BlockGenMethods.cpp | 6 +- .../levelgen/structure}/BlockGenMethods.h | 2 +- .../level/levelgen/structure}/BoundingBox.cpp | 6 +- .../level/levelgen/structure}/BoundingBox.h | 2 +- .../levelgen/structure}/MineShaftFeature.cpp | 8 +- .../levelgen/structure}/MineShaftFeature.h | 0 .../levelgen/structure}/MineShaftPieces.cpp | 18 +- .../levelgen/structure}/MineShaftPieces.h | 0 .../levelgen/structure}/MineShaftStart.cpp | 4 +- .../levelgen/structure}/MineShaftStart.h | 0 .../structure}/NetherBridgeFeature.cpp | 14 +- .../levelgen/structure}/NetherBridgeFeature.h | 4 +- .../structure}/NetherBridgePieces.cpp | 20 +- .../levelgen/structure}/NetherBridgePieces.h | 0 .../RandomScatteredLargeFeature.cpp | 10 +- .../structure}/RandomScatteredLargeFeature.h | 2 +- .../structure}/ScatteredFeaturePieces.cpp | 18 +- .../structure}/ScatteredFeaturePieces.h | 0 .../structure}/SkyIslandDimension.cpp | 10 +- .../levelgen/structure}/StrongholdFeature.cpp | 16 +- .../levelgen/structure}/StrongholdFeature.h | 4 +- .../levelgen/structure}/StrongholdPieces.cpp | 22 +- .../levelgen/structure}/StrongholdPieces.h | 0 .../levelgen/structure}/StructureFeature.cpp | 14 +- .../levelgen/structure}/StructureFeature.h | 4 +- .../structure}/StructureFeatureIO.cpp | 4 +- .../levelgen/structure}/StructureFeatureIO.h | 0 .../structure}/StructureFeatureSavedData.cpp | 2 +- .../structure}/StructureFeatureSavedData.h | 2 +- .../levelgen/structure}/StructurePiece.cpp | 26 +- .../levelgen/structure}/StructurePiece.h | 6 +- .../levelgen/structure}/StructureStart.cpp | 8 +- .../levelgen/structure}/StructureStart.h | 2 +- .../levelgen/structure}/VillageFeature.cpp | 10 +- .../levelgen/structure}/VillageFeature.h | 2 +- .../levelgen/structure}/VillagePieces.cpp | 30 +- .../level/levelgen/structure}/VillagePieces.h | 0 ...minecraft.world.level.levelgen.structure.h | 20 + .../world/level/levelgen/synth}/Distort.cpp | 2 +- .../world/level/levelgen/synth}/Distort.h | 2 +- .../world/level/levelgen/synth}/Emboss.cpp | 2 +- .../world/level/levelgen/synth}/Emboss.h | 2 +- .../world/level/levelgen/synth}/FastNoise.cpp | 2 +- .../world/level/levelgen/synth}/FastNoise.h | 0 .../level/levelgen/synth}/ImprovedNoise.cpp | 2 +- .../level/levelgen/synth}/ImprovedNoise.h | 0 .../level/levelgen/synth}/PerlinNoise.cpp | 4 +- .../world/level/levelgen/synth}/PerlinNoise.h | 0 .../levelgen/synth}/PerlinSimplexNoise.cpp | 2 +- .../levelgen/synth}/PerlinSimplexNoise.h | 0 .../world/level/levelgen/synth}/Rotate.cpp | 2 +- .../world/level/levelgen/synth}/Rotate.h | 2 +- .../world/level/levelgen/synth}/Scale.cpp | 2 +- .../world/level/levelgen/synth}/Scale.h | 2 +- .../level/levelgen/synth}/SimplexNoise.cpp | 2 +- .../level/levelgen/synth}/SimplexNoise.h | 0 .../world/level/levelgen/synth}/Synth.cpp | 2 +- .../world/level/levelgen/synth}/Synth.h | 0 ...net.minecraft.world.level.levelgen.synth.h | 12 + .../level/material}/DecorationMaterial.h | 0 .../world/level/material}/GasMaterial.h | 0 .../world/level/material}/LiquidMaterial.h | 0 .../world/level/material}/Material.cpp | 2 +- .../world/level/material}/Material.h | 0 .../world/level/material}/MaterialColor.cpp | 2 +- .../world/level/material}/MaterialColor.h | 0 .../world/level/material}/PortalMaterial.h | 0 .../world/level/material}/WebMaterial.h | 0 .../net.minecraft.world.level.material.h | 8 + .../world/level/net.minecraft.world.level.h | 26 + .../level/newbiome/layer}/AddIslandLayer.cpp | 6 +- .../level/newbiome/layer}/AddIslandLayer.h | 0 .../layer}/AddMushroomIslandLayer.cpp | 6 +- .../newbiome/layer}/AddMushroomIslandLayer.h | 0 .../level/newbiome/layer}/AddSnowLayer.cpp | 6 +- .../level/newbiome/layer}/AddSnowLayer.h | 0 .../level/newbiome/layer}/BiomeInitLayer.cpp | 8 +- .../level/newbiome/layer}/BiomeInitLayer.h | 0 .../newbiome/layer}/BiomeOverrideLayer.cpp | 8 +- .../newbiome/layer}/BiomeOverrideLayer.h | 0 .../level/newbiome/layer}/DownfallLayer.cpp | 6 +- .../level/newbiome/layer}/DownfallLayer.h | 0 .../newbiome/layer}/DownfallMixerLayer.cpp | 6 +- .../newbiome/layer}/DownfallMixerLayer.h | 0 .../world/level/newbiome/layer}/FlatLayer.cpp | 4 +- .../world/level/newbiome/layer}/FlatLayer.h | 0 .../level/newbiome/layer}/FuzzyZoomLayer.cpp | 6 +- .../level/newbiome/layer}/FuzzyZoomLayer.h | 0 .../layer}/GrowMushroomIslandLayer.cpp | 6 +- .../newbiome/layer}/GrowMushroomIslandLayer.h | 0 .../level/newbiome/layer}/IslandLayer.cpp | 4 +- .../world/level/newbiome/layer}/IslandLayer.h | 0 .../world/level/newbiome/layer}/Layer.cpp | 6 +- .../world/level/newbiome/layer}/Layer.h | 2 +- .../newbiome/layer}/RegionHillsLayer.cpp | 4 +- .../level/newbiome/layer}/RegionHillsLayer.h | 0 .../level/newbiome/layer}/RiverInitLayer.cpp | 4 +- .../level/newbiome/layer}/RiverInitLayer.h | 0 .../level/newbiome/layer}/RiverLayer.cpp | 6 +- .../world/level/newbiome/layer}/RiverLayer.h | 0 .../level/newbiome/layer}/RiverMixerLayer.cpp | 6 +- .../level/newbiome/layer}/RiverMixerLayer.h | 0 .../level/newbiome/layer}/ShoreLayer.cpp | 6 +- .../world/level/newbiome/layer}/ShoreLayer.h | 0 .../level/newbiome/layer}/SmoothLayer.cpp | 4 +- .../world/level/newbiome/layer}/SmoothLayer.h | 0 .../level/newbiome/layer}/SmoothZoomLayer.cpp | 6 +- .../level/newbiome/layer}/SmoothZoomLayer.h | 0 .../newbiome/layer}/SwampRiversLayer.cpp | 4 +- .../level/newbiome/layer}/SwampRiversLayer.h | 0 .../newbiome/layer}/TemperatureLayer.cpp | 6 +- .../level/newbiome/layer}/TemperatureLayer.h | 0 .../newbiome/layer}/TemperatureMixerLayer.cpp | 6 +- .../newbiome/layer}/TemperatureMixerLayer.h | 0 .../level/newbiome/layer}/VoronoiZoom.cpp | 6 +- .../world/level/newbiome/layer}/VoronoiZoom.h | 0 .../world/level/newbiome/layer}/ZoomLayer.cpp | 6 +- .../world/level/newbiome/layer}/ZoomLayer.h | 0 ...net.minecraft.world.level.newbiome.layer.h | 27 + .../world/level/pathfinder}/BinaryHeap.cpp | 6 +- .../world/level/pathfinder}/BinaryHeap.h | 6 +- .../world/level/pathfinder}/Node.cpp | 6 +- .../minecraft/world/level/pathfinder}/Node.h | 0 .../world/level/pathfinder}/Path.cpp | 6 +- .../minecraft/world/level/pathfinder}/Path.h | 0 .../world/level/pathfinder}/PathFinder.cpp | 14 +- .../world/level/pathfinder}/PathFinder.h | 2 +- .../net.minecraft.world.level.pathfinder.h | 6 + .../world/level/redstone}/Redstone.cpp | 2 +- .../world/level/redstone}/Redstone.h | 0 .../net.minecraft.world.level.redstone.h | 3 + .../level/saveddata}/MapItemSavedData.cpp | 20 +- .../world/level/saveddata}/MapItemSavedData.h | 2 +- .../world/level/saveddata}/SavedData.cpp | 2 +- .../world/level/saveddata}/SavedData.h | 2 +- .../net.minecraft.world.level.saveddata.h | 4 + .../world/level/storage}/DerivedLevelData.cpp | 2 +- .../world/level/storage}/DerivedLevelData.h | 0 .../level/storage}/DirectoryLevelStorage.cpp | 24 +- .../level/storage}/DirectoryLevelStorage.h | 4 +- .../storage}/DirectoryLevelStorageSource.cpp | 12 +- .../storage}/DirectoryLevelStorageSource.h | 2 +- .../world/level/storage}/LevelData.cpp | 12 +- .../world/level/storage}/LevelData.h | 2 +- .../world/level/storage}/LevelStorage.cpp | 2 +- .../world/level/storage}/LevelStorage.h | 2 +- .../LevelStorageProfilerDecorator.cpp | 12 +- .../storage}/LevelStorageProfilerDecorator.h | 0 .../world/level/storage}/LevelStorageSource.h | 2 +- .../world/level/storage}/LevelSummary.cpp | 2 +- .../world/level/storage}/LevelSummary.h | 0 .../level/storage}/McRegionLevelStorage.cpp | 14 +- .../level/storage}/McRegionLevelStorage.h | 0 .../storage}/McRegionLevelStorageSource.cpp | 16 +- .../storage}/McRegionLevelStorageSource.h | 4 +- .../level/storage}/MemoryLevelStorage.cpp | 14 +- .../world/level/storage}/MemoryLevelStorage.h | 14 +- .../storage}/MemoryLevelStorageSource.cpp | 4 +- .../level/storage}/MemoryLevelStorageSource.h | 0 .../level/storage}/MockedLevelStorage.cpp | 12 +- .../world/level/storage}/MockedLevelStorage.h | 2 +- .../minecraft/world/level/storage}/PlayerIO.h | 0 .../world/level/storage}/SavedDataStorage.cpp | 14 +- .../world/level/storage}/SavedDataStorage.h | 2 +- .../net.minecraft.world.level.storage.h | 17 + .../minecraft/world/level/tile}/AirTile.cpp | 2 +- .../minecraft/world/level/tile}/AirTile.h | 2 +- .../minecraft/world/level/tile}/AnvilTile.cpp | 14 +- .../minecraft/world/level/tile}/AnvilTile.h | 0 .../world/level/tile}/BaseEntityTile.cpp | 8 +- .../world/level/tile}/BaseEntityTile.h | 2 +- .../level/tile}/BasePressurePlateTile.cpp | 16 +- .../world/level/tile}/BasePressurePlateTile.h | 0 .../world/level/tile}/BaseRailTile.cpp | 8 +- .../world/level/tile}/BaseRailTile.h | 4 +- .../world/level/tile}/BeaconTile.cpp | 8 +- .../minecraft/world/level/tile}/BeaconTile.h | 0 .../minecraft/world/level/tile}/BedTile.cpp | 14 +- .../minecraft/world/level/tile}/BedTile.h | 0 .../world/level/tile}/BookshelfTile.cpp | 6 +- .../world/level/tile}/BookshelfTile.h | 2 +- .../world/level/tile}/BrewingStandTile.cpp | 14 +- .../world/level/tile}/BrewingStandTile.h | 0 .../world/level/tile}/ButtonTile.cpp | 14 +- .../minecraft/world/level/tile}/ButtonTile.h | 2 +- .../world/level/tile}/CactusTile.cpp | 16 +- .../minecraft/world/level/tile}/CactusTile.h | 4 +- .../minecraft/world/level/tile}/CakeTile.cpp | 16 +- .../minecraft/world/level/tile}/CakeTile.h | 4 +- .../world/level/tile}/CarrotTile.cpp | 6 +- .../minecraft/world/level/tile}/CarrotTile.h | 0 .../world/level/tile}/CauldronTile.cpp | 16 +- .../world/level/tile}/CauldronTile.h | 0 .../minecraft/world/level/tile}/ChestTile.cpp | 22 +- .../minecraft/world/level/tile}/ChestTile.h | 2 +- .../minecraft/world/level/tile}/ClayTile.cpp | 4 +- .../minecraft/world/level/tile}/ClayTile.h | 2 +- .../minecraft/world/level/tile}/CocoaTile.cpp | 14 +- .../minecraft/world/level/tile}/CocoaTile.h | 0 .../world/level/tile}/ColoredTile.cpp | 6 +- .../minecraft/world/level/tile}/ColoredTile.h | 0 .../world/level/tile}/CommandBlock.cpp | 8 +- .../world/level/tile}/CommandBlock.h | 0 .../world/level/tile}/ComparatorTile.cpp | 14 +- .../world/level/tile}/ComparatorTile.h | 2 +- .../minecraft/world/level/tile}/CoralTile.cpp | 2 +- .../minecraft/world/level/tile}/CoralTile.h | 2 +- .../minecraft/world/level/tile}/CropTile.cpp | 10 +- .../minecraft/world/level/tile}/CropTile.h | 2 +- .../level/tile}/DaylightDetectorTile.cpp | 16 +- .../world/level/tile}/DaylightDetectorTile.h | 0 .../world/level/tile}/DeadBushTile.cpp | 10 +- .../world/level/tile}/DeadBushTile.h | 0 .../world/level/tile}/DetectorRailTile.cpp | 18 +- .../world/level/tile}/DetectorRailTile.h | 0 .../minecraft/world/level/tile}/DiodeTile.cpp | 16 +- .../minecraft/world/level/tile}/DiodeTile.h | 0 .../world/level/tile}/DirectionalTile.cpp | 2 +- .../world/level/tile}/DirectionalTile.h | 0 .../minecraft/world/level/tile}/DirtTile.cpp | 2 +- .../minecraft/world/level/tile}/DirtTile.h | 0 .../world/level/tile}/DispenserTile.cpp | 24 +- .../world/level/tile}/DispenserTile.h | 2 +- .../minecraft/world/level/tile}/DoorTile.cpp | 16 +- .../minecraft/world/level/tile}/DoorTile.h | 2 +- .../world/level/tile}/DropperTile.cpp | 14 +- .../minecraft/world/level/tile}/DropperTile.h | 0 .../minecraft/world/level/tile}/EggTile.cpp | 8 +- .../minecraft/world/level/tile}/EggTile.h | 0 .../level/tile}/EnchantmentTableTile.cpp | 10 +- .../world/level/tile}/EnchantmentTableTile.h | 0 .../world/level/tile}/EnderChestTile.cpp | 14 +- .../world/level/tile}/EnderChestTile.h | 0 .../minecraft/world/level/tile}/EntityTile.h | 0 .../minecraft/world/level/tile}/FarmTile.cpp | 10 +- .../minecraft/world/level/tile}/FarmTile.h | 2 +- .../world/level/tile}/FenceGateTile.cpp | 12 +- .../world/level/tile}/FenceGateTile.h | 0 .../minecraft/world/level/tile}/FenceTile.cpp | 8 +- .../minecraft/world/level/tile}/FenceTile.h | 2 +- .../minecraft/world/level/tile}/FireTile.cpp | 22 +- .../minecraft/world/level/tile}/FireTile.h | 2 +- .../world/level/tile}/FlowerPotTile.cpp | 10 +- .../world/level/tile}/FlowerPotTile.h | 0 .../world/level/tile}/FurnaceTile.cpp | 20 +- .../minecraft/world/level/tile}/FurnaceTile.h | 0 .../minecraft/world/level/tile}/GlassTile.cpp | 2 +- .../minecraft/world/level/tile}/GlassTile.h | 0 .../world/level/tile}/GlowstoneTile.cpp | 4 +- .../world/level/tile}/GlowstoneTile.h | 0 .../minecraft/world/level/tile}/GrassTile.cpp | 16 +- .../minecraft/world/level/tile}/GrassTile.h | 0 .../world/level/tile}/GravelTile.cpp | 4 +- .../minecraft/world/level/tile}/GravelTile.h | 0 .../world/level/tile}/HalfSlabTile.cpp | 12 +- .../world/level/tile}/HalfSlabTile.h | 0 .../world/level/tile}/HalfTransparentTile.cpp | 6 +- .../world/level/tile}/HalfTransparentTile.h | 0 .../world/level/tile}/HayBlockTile.cpp | 4 +- .../world/level/tile}/HayBlockTile.h | 0 .../minecraft/world/level/tile}/HeavyTile.cpp | 6 +- .../minecraft/world/level/tile}/HeavyTile.h | 0 .../world/level/tile}/HopperTile.cpp | 16 +- .../minecraft/world/level/tile}/HopperTile.h | 0 .../world/level/tile}/HugeMushroomTile.cpp | 4 +- .../world/level/tile}/HugeMushroomTile.h | 0 .../minecraft/world/level/tile}/IceTile.cpp | 12 +- .../minecraft/world/level/tile}/IceTile.h | 0 .../world/level/tile}/JukeboxTile.cpp | 16 +- .../minecraft/world/level/tile}/JukeboxTile.h | 4 +- .../world/level/tile}/LadderTile.cpp | 6 +- .../minecraft/world/level/tile}/LadderTile.h | 2 +- .../minecraft/world/level/tile}/LeafTile.cpp | 14 +- .../minecraft/world/level/tile}/LeafTile.h | 0 .../minecraft/world/level/tile}/LevelEvent.h | 0 .../minecraft/world/level/tile}/LeverTile.cpp | 10 +- .../minecraft/world/level/tile}/LeverTile.h | 0 .../world/level/tile}/LiquidTile.cpp | 20 +- .../minecraft/world/level/tile}/LiquidTile.h | 2 +- .../world/level/tile}/LiquidTileDynamic.cpp | 6 +- .../world/level/tile}/LiquidTileDynamic.h | 0 .../world/level/tile}/LiquidTileStatic.cpp | 4 +- .../world/level/tile}/LiquidTileStatic.h | 0 .../world/level/tile}/LockedChestTile.cpp | 4 +- .../world/level/tile}/LockedChestTile.h | 0 .../minecraft/world/level/tile}/MelonTile.cpp | 8 +- .../minecraft/world/level/tile}/MelonTile.h | 0 .../minecraft/world/level/tile}/MetalTile.cpp | 2 +- .../minecraft/world/level/tile}/MetalTile.h | 0 .../world/level/tile}/MobSpawnerTile.cpp | 6 +- .../world/level/tile}/MobSpawnerTile.h | 0 .../world/level/tile}/MushroomPlantTile.cpp | 8 +- .../world/level/tile}/MushroomPlantTile.h | 0 .../minecraft/world/level/tile}/MycelTile.cpp | 8 +- .../minecraft/world/level/tile}/MycelTile.h | 0 .../world/level/tile}/NetherWartTile.cpp | 10 +- .../world/level/tile}/NetherWartTile.h | 0 .../world/level/tile}/NetherrackTile.cpp | 2 +- .../world/level/tile}/NetherrackTile.h | 0 .../world/level/tile}/NotGateTile.cpp | 10 +- .../minecraft/world/level/tile}/NotGateTile.h | 0 .../world/level/tile}/NoteBlockTile.cpp | 8 +- .../world/level/tile}/NoteBlockTile.h | 0 .../world/level/tile}/ObsidianTile.cpp | 2 +- .../world/level/tile}/ObsidianTile.h | 0 .../minecraft/world/level/tile}/OreTile.cpp | 6 +- .../minecraft/world/level/tile}/OreTile.h | 0 .../minecraft/world/level/tile}/PlantTile.cpp | 6 +- .../minecraft/world/level/tile}/PlantTile.h | 4 +- .../world/level/tile}/PortalTile.cpp | 12 +- .../minecraft/world/level/tile}/PortalTile.h | 2 +- .../world/level/tile}/PotatoTile.cpp | 8 +- .../minecraft/world/level/tile}/PotatoTile.h | 0 .../world/level/tile}/PoweredMetalTile.cpp | 4 +- .../world/level/tile}/PoweredMetalTile.h | 0 .../world/level/tile}/PoweredRailTile.cpp | 6 +- .../world/level/tile}/PoweredRailTile.h | 0 .../world/level/tile}/PressurePlateTile.cpp | 8 +- .../world/level/tile}/PressurePlateTile.h | 0 .../world/level/tile}/PumpkinTile.cpp | 16 +- .../minecraft/world/level/tile}/PumpkinTile.h | 0 .../world/level/tile}/QuartzBlockTile.cpp | 12 +- .../world/level/tile}/QuartzBlockTile.h | 0 .../minecraft/world/level/tile}/RailTile.cpp | 4 +- .../minecraft/world/level/tile}/RailTile.h | 0 .../world/level/tile}/RedStoneDustTile.cpp | 24 +- .../world/level/tile}/RedStoneDustTile.h | 2 +- .../world/level/tile}/RedStoneOreTile.cpp | 6 +- .../world/level/tile}/RedStoneOreTile.h | 0 .../world/level/tile/RedlightTile.cpp} | 10 +- .../world/level/tile/RedlightTile.h} | 0 .../minecraft/world/level/tile}/ReedTile.cpp | 10 +- .../minecraft/world/level/tile}/ReedTile.h | 2 +- .../world/level/tile}/RepeaterTile.cpp | 10 +- .../world/level/tile}/RepeaterTile.h | 0 .../world/level/tile}/RotatedPillarTile.cpp | 4 +- .../world/level/tile}/RotatedPillarTile.h | 0 .../world/level/tile}/SandStoneTile.cpp | 8 +- .../world/level/tile}/SandStoneTile.h | 0 .../world/level/tile}/SaplingPlantTile.cpp | 10 +- .../world/level/tile}/SaplingPlantTile.h | 0 .../minecraft/world/level/tile}/SignTile.cpp | 12 +- .../minecraft/world/level/tile}/SignTile.h | 6 +- .../minecraft/world/level/tile}/SkullTile.cpp | 16 +- .../minecraft/world/level/tile}/SkullTile.h | 0 .../level/tile}/SmoothStoneBrickTile.cpp | 4 +- .../world/level/tile}/SmoothStoneBrickTile.h | 0 .../minecraft/world/level/tile}/SnowTile.cpp | 6 +- .../minecraft/world/level/tile}/SnowTile.h | 0 .../world/level/tile}/SoulSandTile.cpp | 6 +- .../world/level/tile}/SoulSandTile.h | 2 +- .../world/level/tile}/SpongeTile.cpp | 4 +- .../minecraft/world/level/tile}/SpongeTile.h | 0 .../world/level/tile}/StainedGlassBlock.cpp | 6 +- .../world/level/tile}/StainedGlassBlock.h | 0 .../level/tile}/StainedGlassPaneBlock.cpp | 6 +- .../world/level/tile}/StainedGlassPaneBlock.h | 0 .../minecraft/world/level/tile}/StairTile.cpp | 10 +- .../minecraft/world/level/tile}/StairTile.h | 0 .../minecraft/world/level/tile}/StemTile.cpp | 14 +- .../minecraft/world/level/tile}/StemTile.h | 0 .../world/level/tile}/StoneButtonTile.cpp | 4 +- .../world/level/tile}/StoneButtonTile.h | 0 .../world/level/tile}/StoneMonsterTile.cpp | 8 +- .../world/level/tile}/StoneMonsterTile.h | 0 .../world/level/tile}/StoneSlabTile.cpp | 10 +- .../world/level/tile}/StoneSlabTile.h | 0 .../minecraft/world/level/tile}/StoneTile.cpp | 2 +- .../minecraft/world/level/tile}/StoneTile.h | 0 .../world/level/tile}/TallGrassPlantTile.cpp | 14 +- .../world/level/tile}/TallGrassPlantTile.h | 0 .../level/tile}/TheEndPortalFrameTile.cpp | 10 +- .../world/level/tile}/TheEndPortalFrameTile.h | 0 .../world/level/tile}/ThinFenceTile.cpp | 6 +- .../world/level/tile}/ThinFenceTile.h | 2 +- .../minecraft/world/level/tile}/Tile.cpp | 36 +- .../minecraft/world/level/tile}/Tile.h | 8 +- .../minecraft/world/level/tile}/TntTile.cpp | 16 +- .../minecraft/world/level/tile}/TntTile.h | 0 .../world/level/tile}/TopSnowTile.cpp | 16 +- .../minecraft/world/level/tile}/TopSnowTile.h | 0 .../minecraft/world/level/tile}/TorchTile.cpp | 10 +- .../minecraft/world/level/tile}/TorchTile.h | 2 +- .../world/level/tile}/TransparentTile.cpp | 4 +- .../world/level/tile}/TransparentTile.h | 0 .../world/level/tile}/TrapDoorTile.cpp | 12 +- .../world/level/tile}/TrapDoorTile.h | 0 .../minecraft/world/level/tile}/TreeTile.cpp | 10 +- .../minecraft/world/level/tile}/TreeTile.h | 0 .../world/level/tile}/TripWireSourceTile.cpp | 12 +- .../world/level/tile}/TripWireSourceTile.h | 0 .../world/level/tile}/TripWireTile.cpp | 10 +- .../world/level/tile}/TripWireTile.h | 0 .../minecraft/world/level/tile}/VineTile.cpp | 18 +- .../minecraft/world/level/tile}/VineTile.h | 2 +- .../minecraft/world/level/tile}/WallTile.cpp | 12 +- .../minecraft/world/level/tile}/WallTile.h | 0 .../world/level/tile}/WaterLilyTile.cpp | 10 +- .../world/level/tile}/WaterLilyTile.h | 0 .../minecraft/world/level/tile}/WebTile.cpp | 8 +- .../minecraft/world/level/tile}/WebTile.h | 0 .../level/tile}/WeightedPressurePlateTile.cpp | 14 +- .../level/tile}/WeightedPressurePlateTile.h | 0 .../world/level/tile}/WoodButtonTile.cpp | 4 +- .../world/level/tile}/WoodButtonTile.h | 0 .../world/level/tile}/WoodSlabTile.cpp | 10 +- .../world/level/tile}/WoodSlabTile.h | 0 .../minecraft/world/level/tile}/WoodTile.cpp | 12 +- .../minecraft/world/level/tile}/WoodTile.h | 0 .../world/level/tile}/WoolCarpetTile.cpp | 8 +- .../world/level/tile}/WoolCarpetTile.h | 0 .../world/level/tile}/WorkbenchTile.cpp | 10 +- .../world/level/tile}/WorkbenchTile.h | 0 .../level/tile/entity}/BeaconTileEntity.cpp | 16 +- .../level/tile/entity}/BeaconTileEntity.h | 2 +- .../tile/entity}/BrewingStandTileEntity.cpp | 14 +- .../tile/entity}/BrewingStandTileEntity.h | 2 +- .../level/tile/entity}/ChestTileEntity.cpp | 24 +- .../level/tile/entity}/ChestTileEntity.h | 4 +- .../level/tile/entity}/CommandBlockEntity.cpp | 10 +- .../level/tile/entity}/CommandBlockEntity.h | 2 +- .../tile/entity}/ComparatorTileEntity.cpp | 2 +- .../level/tile/entity}/ComparatorTileEntity.h | 0 .../entity}/DaylightDetectorTileEntity.cpp | 6 +- .../tile/entity}/DaylightDetectorTileEntity.h | 0 .../tile/entity}/DispenserTileEntity.cpp | 12 +- .../level/tile/entity}/DispenserTileEntity.h | 4 +- .../level/tile/entity}/DropperTileEntity.cpp | 2 +- .../level/tile/entity}/DropperTileEntity.h | 0 .../entity}/EnchantmentTableTileEntity.cpp | 6 +- .../tile/entity}/EnchantmentTableTileEntity.h | 0 .../tile/entity}/EnderChestTileEntity.cpp | 6 +- .../level/tile/entity}/EnderChestTileEntity.h | 0 .../level/tile/entity}/FurnaceTileEntity.cpp | 18 +- .../level/tile/entity}/FurnaceTileEntity.h | 2 +- .../world/level/tile/entity}/Hopper.h | 2 +- .../level/tile/entity}/HopperTileEntity.cpp | 20 +- .../level/tile/entity}/HopperTileEntity.h | 0 .../tile/entity}/MobSpawnerTileEntity.cpp | 8 +- .../level/tile/entity}/MobSpawnerTileEntity.h | 2 +- .../level/tile/entity}/MusicTileEntity.cpp | 14 +- .../level/tile/entity}/MusicTileEntity.h | 0 .../tile/entity}/PistonMovingTileEntity.cpp | 12 +- .../tile/entity}/PistonMovingTileEntity.h | 2 +- .../tile/entity}/PistonPieceTileEntity.cpp | 12 +- .../tile/entity}/PistonPieceTileEntity.h | 0 .../level/tile/entity}/SignTileEntity.cpp | 26 +- .../world/level/tile/entity}/SignTileEntity.h | 0 .../level/tile/entity}/SkullTileEntity.cpp | 6 +- .../level/tile/entity}/SkullTileEntity.h | 0 .../level/tile/entity}/TheEndPortalTile.cpp | 16 +- .../level/tile/entity}/TheEndPortalTile.h | 4 +- .../tile/entity}/TheEndPortalTileEntity.cpp | 2 +- .../tile/entity}/TheEndPortalTileEntity.h | 0 .../world/level/tile/entity}/TileEntity.cpp | 10 +- .../world/level/tile/entity}/TileEntity.h | 4 +- .../net.minecraft.world.level.tile.entity.h | 22 + .../tile/net.minecraft.world.level.tile.h | 131 + .../level/tile/piston}/PistonBaseTile.cpp | 22 +- .../world/level/tile/piston}/PistonBaseTile.h | 2 +- .../tile/piston}/PistonExtensionTile.cpp | 6 +- .../level/tile/piston}/PistonExtensionTile.h | 2 +- .../net.minecraft.world.level.tile.piston.h | 6 + .../net.minecraft.world.ContainerListener.h | 0 .../net/minecraft/world/net.minecraft.world.h | 15 + .../minecraft/world/phys}/AABB.cpp | 4 +- .../{Util => net/minecraft/world/phys}/AABB.h | 2 +- .../minecraft/world/phys}/HitResult.cpp | 4 +- .../minecraft/world/phys}/HitResult.h | 0 .../minecraft/world/phys}/Vec3.cpp | 0 .../{Util => net/minecraft/world/phys}/Vec3.h | 0 .../world/phys/net.minecraft.world.phys.h | 4 + .../minecraft/world/scores}/Objective.cpp | 4 +- .../minecraft/world/scores}/Objective.h | 0 .../minecraft/world/scores}/PlayerTeam.cpp | 4 +- .../minecraft/world/scores}/PlayerTeam.h | 0 .../minecraft/world/scores}/Score.cpp | 6 +- .../minecraft/world/scores}/Score.h | 0 .../minecraft/world/scores}/ScoreHolder.h | 0 .../minecraft/world/scores}/Scoreboard.cpp | 2 +- .../minecraft/world/scores}/Scoreboard.h | 0 .../world/scores}/ScoreboardSaveData.h | 0 .../minecraft/world/scores}/Team.cpp | 2 +- .../minecraft/world/scores}/Team.h | 0 .../world/scores/criteria}/DummyCriteria.cpp | 2 +- .../world/scores/criteria}/DummyCriteria.h | 0 .../world/scores/criteria}/HealthCriteria.cpp | 4 +- .../world/scores/criteria}/HealthCriteria.h | 0 .../scores/criteria}/ObjectiveCriteria.cpp | 4 +- .../scores/criteria}/ObjectiveCriteria.h | 0 .../net.minecraft.world.scores.criteria.h | 5 + .../world/scores/net.minecraft.world.scores.h | 9 + .../{Platform => }/x64headers/extraX64.h | 2 +- .../{Platform => }/x64headers/qnet.h | 0 .../{Platform => }/x64headers/xmcore.h | 0 .../{Platform => }/x64headers/xrnm.h | 0 .../{Platform => }/x64headers/xsocialpost.h | 0 .../{Platform => }/x64headers/xuiapp.h | 0 .../{Platform => }/x64headers/xuiresource.h | 0 3007 files changed, 46828 insertions(+), 54605 deletions(-) rename Minecraft.Client/{Platform => }/Common/App_Defines.h (100%) rename Minecraft.Client/{Platform => }/Common/App_enums.h (100%) rename Minecraft.Client/{Platform => }/Common/App_structs.h (100%) rename Minecraft.Client/{Platform => }/Common/Consoles_App.cpp (98%) rename Minecraft.Client/{Platform => }/Common/Consoles_App.h (98%) rename Minecraft.Client/{Platform/Windows64 => Common}/Minecraft_Macros.h (100%) rename Minecraft.Client/{Platform => }/Common/Potion_Macros.h (100%) rename Minecraft.Client/{Platform => }/Common/ShutdownManager.h (95%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Audio/Consoles_SoundEngine.cpp (93%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Audio/Consoles_SoundEngine.h (93%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Audio/SoundEngine.cpp (99%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Audio/SoundEngine.h (98%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Audio/SoundNames.cpp (99%) rename Minecraft.Client/{Platform/Common => Common/Source Files/BuildVer}/BuildVer.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Colours/ColourTable.cpp (98%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Colours/ColourTable.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/ConsoleGameMode.cpp (82%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/ConsoleGameMode.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Console_Awards_enum.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Console_Debug_enum.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Console_Utils.cpp (95%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCAudioFile.cpp (97%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCAudioFile.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCCapeFile.cpp (82%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCCapeFile.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCColourTableFile.cpp (73%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCColourTableFile.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCFile.cpp (90%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCFile.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCGameRules.h (74%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCGameRulesFile.cpp (88%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCGameRulesFile.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCGameRulesHeader.cpp (77%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCGameRulesHeader.h (96%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCLocalisationFile.cpp (78%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCLocalisationFile.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCManager.cpp (98%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCManager.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCPack.cpp (98%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCPack.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCSkinFile.cpp (93%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCSkinFile.h (93%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCTextureFile.cpp (95%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCTextureFile.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCUIDataFile.cpp (92%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/DLC/DLCUIDataFile.h (100%) create mode 100644 Minecraft.Client/Common/Source Files/GameRules/ConsoleGameRules.h rename Minecraft.Client/{Platform/Common => Common/Source Files}/GameRules/ConsoleGameRulesConstants.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/GameRules/GameRuleManager.cpp (98%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/GameRules/GameRuleManager.h (97%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration}/ApplySchematicRuleDefinition.cpp (93%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration}/ApplySchematicRuleDefinition.h (92%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration}/BiomeOverride.cpp (92%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration}/BiomeOverride.h (91%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration}/ConsoleGenerateStructure.cpp (91%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration}/ConsoleGenerateStructure.h (90%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration}/ConsoleGenerateStructureAction.h (74%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration}/ConsoleSchematicFile.cpp (97%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration}/ConsoleSchematicFile.h (98%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration}/LevelGenerationOptions.cpp (98%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration}/LevelGenerationOptions.h (97%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration}/LevelGenerators.cpp (91%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration}/LevelGenerators.h (100%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration}/StartFeature.cpp (94%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration}/StartFeature.h (81%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration/StructureActions}/XboxStructureActionGenerateBox.cpp (93%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration/StructureActions}/XboxStructureActionGenerateBox.h (94%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration/StructureActions}/XboxStructureActionPlaceBlock.cpp (90%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration/StructureActions}/XboxStructureActionPlaceBlock.h (94%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration/StructureActions}/XboxStructureActionPlaceContainer.cpp (83%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration/StructureActions}/XboxStructureActionPlaceContainer.h (100%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration/StructureActions}/XboxStructureActionPlaceSpawner.cpp (82%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelGeneration/StructureActions}/XboxStructureActionPlaceSpawner.h (100%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules}/LevelRules.cpp (86%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules}/LevelRules.h (100%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/AddEnchantmentRuleDefinition.cpp (87%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/AddEnchantmentRuleDefinition.h (100%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/AddItemRuleDefinition.cpp (90%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/AddItemRuleDefinition.h (100%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/CollectItemRuleDefinition.cpp (90%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/CollectItemRuleDefinition.h (100%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/CompleteAllRuleDefinition.cpp (86%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/CompleteAllRuleDefinition.h (100%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/CompoundGameRuleDefinition.cpp (92%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/CompoundGameRuleDefinition.h (100%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/GameRuleDefinition.cpp (95%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/GameRuleDefinition.h (93%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/LevelRuleset.cpp (86%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/LevelRuleset.h (100%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/NamedAreaRuleDefinition.cpp (92%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/NamedAreaRuleDefinition.h (89%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/UpdatePlayerRuleDefinition.cpp (90%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/UpdatePlayerRuleDefinition.h (100%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/UseTileRuleDefinition.cpp (95%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/RuleDefinitions}/UseTileRuleDefinition.h (92%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/Rules}/GameRule.cpp (95%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/Rules}/GameRule.h (100%) rename Minecraft.Client/{Platform/Common/GameRules => Common/Source Files/GameRules/LevelRules/Rules}/GameRulesInstance.h (100%) rename Minecraft.Client/{Utils => Common/Source Files/GameRules}/WstringLookup.cpp (94%) rename Minecraft.Client/{Utils => Common/Source Files/GameRules}/WstringLookup.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Leaderboards/LeaderboardInterface.cpp (97%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Leaderboards/LeaderboardInterface.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Leaderboards/LeaderboardManager.cpp (96%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Leaderboards/LeaderboardManager.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Leaderboards/SonyLeaderboardManager.cpp (99%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Leaderboards/SonyLeaderboardManager.h (98%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Leaderboards/base64.cpp (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Leaderboards/base64.h (100%) rename Minecraft.Client/{Utils => Common/Source Files/Localisation}/StringTable.cpp (98%) rename Minecraft.Client/{Utils => Common/Source Files/Localisation}/StringTable.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Network/GameNetworkManager.cpp (97%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Network/GameNetworkManager.h (99%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Network/NetworkPlayerInterface.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Network/PlatformNetworkManagerInterface.h (98%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Network/PlatformNetworkManagerStub.cpp (99%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Network/PlatformNetworkManagerStub.h (99%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Network/SessionInfo.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Telemetry/TelemetryManager.cpp (97%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Telemetry/TelemetryManager.h (95%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Trial/TrialMode.cpp (81%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Trial/TrialMode.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Constraints}/AreaConstraint.cpp (84%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Constraints}/AreaConstraint.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Constraints}/ChangeStateConstraint.cpp (91%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Constraints}/ChangeStateConstraint.h (97%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Constraints}/InputConstraint.cpp (91%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Constraints}/InputConstraint.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Constraints}/TutorialConstraint.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Constraints}/TutorialConstraints.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Tutorial/FullTutorial.cpp (98%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Tutorial/FullTutorial.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Tutorial/FullTutorialMode.cpp (78%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Tutorial/FullTutorialMode.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Hints}/AreaHint.cpp (79%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Hints}/AreaHint.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Hints}/DiggerItemHint.cpp (79%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Hints}/DiggerItemHint.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Hints}/LookAtEntityHint.cpp (89%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Hints}/LookAtEntityHint.h (87%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Hints}/LookAtTileHint.cpp (87%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Hints}/LookAtTileHint.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Hints}/TakeItemHint.cpp (79%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Hints}/TakeItemHint.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Hints}/TutorialHint.cpp (84%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Hints}/TutorialHint.h (98%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Hints}/TutorialHints.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/AreaTask.cpp (95%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/AreaTask.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/ChoiceTask.cpp (91%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/ChoiceTask.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/CompleteUsingItemTask.cpp (87%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/CompleteUsingItemTask.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/ControllerTask.cpp (93%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/ControllerTask.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/CraftTask.cpp (92%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/CraftTask.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/EffectChangedTask.cpp (85%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/EffectChangedTask.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/FullTutorialActiveTask.cpp (86%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/FullTutorialActiveTask.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/HorseChoiceTask.cpp (85%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/HorseChoiceTask.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/InfoTask.cpp (90%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/InfoTask.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/PickupTask.cpp (88%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/PickupTask.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/ProcedureCompoundTask.cpp (99%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/ProcedureCompoundTask.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/ProgressFlagTask.cpp (84%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/ProgressFlagTask.h (96%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/RideEntityTask.cpp (76%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/RideEntityTask.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/StatTask.cpp (68%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/StatTask.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/StateChangeTask.h (97%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/TutorialTask.cpp (94%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/TutorialTask.h (99%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/TutorialTasks.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/UseItemTask.cpp (71%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/UseItemTask.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/UseTileTask.cpp (84%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/UseTileTask.h (100%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/XuiCraftingTask.cpp (80%) rename Minecraft.Client/{Platform/Common/Tutorial => Common/Source Files/Tutorial/Tasks}/XuiCraftingTask.h (94%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Tutorial/Tutorial.cpp (99%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Tutorial/Tutorial.h (98%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Tutorial/TutorialEnum.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Tutorial/TutorialMessage.cpp (90%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Tutorial/TutorialMessage.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Tutorial/TutorialMode.cpp (83%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/Tutorial/TutorialMode.h (93%) rename Minecraft.Client/{Utils => Common/Source Files/UI/All Platforms}/ArchiveFile.cpp (94%) rename Minecraft.Client/{Utils => Common/Source Files/UI/All Platforms}/ArchiveFile.h (83%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIController.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_AbstractContainerMenu.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_AbstractContainerMenu.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_AnvilMenu.cpp (93%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_AnvilMenu.h (94%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_BeaconMenu.cpp (94%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_BeaconMenu.h (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_BrewingMenu.cpp (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_BrewingMenu.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_CommandBlockMenu.cpp (69%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_CommandBlockMenu.h (76%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_ContainerMenu.cpp (92%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_ContainerMenu.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_CraftingMenu.cpp (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_CraftingMenu.h (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_CreativeMenu.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_CreativeMenu.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_DispenserMenu.cpp (92%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_DispenserMenu.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_EnchantingMenu.cpp (94%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_EnchantingMenu.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_FireworksMenu.cpp (95%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_FireworksMenu.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_FurnaceMenu.cpp (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_FurnaceMenu.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_HUD.cpp (93%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_HUD.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_HopperMenu.cpp (92%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_HopperMenu.h (75%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_HorseInventoryMenu.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_HorseInventoryMenu.h (74%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_InventoryMenu.cpp (92%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_InventoryMenu.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_PauseMenu.cpp (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_PauseMenu.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_TradingMenu.cpp (95%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/IUIScene_TradingMenu.h (88%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/UIEnums.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/All Platforms}/UIStructs.h (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIComponent_Chat.cpp (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIComponent_Chat.h (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIComponent_DebugUIConsole.cpp (92%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIComponent_DebugUIConsole.h (95%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIComponent_DebugUIMarketingGuide.cpp (90%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIComponent_DebugUIMarketingGuide.h (93%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIComponent_Logo.cpp (92%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIComponent_Logo.h (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIComponent_MenuBackground.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIComponent_MenuBackground.h (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIComponent_Panorama.cpp (91%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIComponent_Panorama.h (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIComponent_PressStartToPlay.cpp (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIComponent_PressStartToPlay.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIComponent_Tooltips.cpp (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIComponent_Tooltips.h (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIComponent_TutorialPopup.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIComponent_TutorialPopup.h (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIScene_HUD.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Components}/UIScene_HUD.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl.cpp (95%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_Base.cpp (94%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_Base.h (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_BeaconEffectButton.cpp (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_BeaconEffectButton.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_BitmapIcon.cpp (92%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_BitmapIcon.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_Button.cpp (95%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_Button.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_ButtonList.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_ButtonList.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_CheckBox.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_CheckBox.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_Cursor.cpp (82%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_Cursor.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_DLCList.cpp (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_DLCList.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_DynamicLabel.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_DynamicLabel.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_EnchantmentBook.cpp (83%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_EnchantmentBook.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_EnchantmentButton.cpp (94%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_EnchantmentButton.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_HTMLLabel.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_HTMLLabel.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_Label.cpp (87%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_Label.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_LeaderboardList.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_LeaderboardList.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_MinecraftHorse.cpp (78%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_MinecraftHorse.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_MinecraftPlayer.cpp (82%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_MinecraftPlayer.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_PlayerList.cpp (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_PlayerList.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_PlayerSkinPreview.cpp (95%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_PlayerSkinPreview.h (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_Progress.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_Progress.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_SaveList.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_SaveList.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_Slider.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_Slider.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_SlotList.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_SlotList.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_SpaceIndicatorBar.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_SpaceIndicatorBar.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_TextInput.cpp (93%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_TextInput.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_TexturePackList.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_TexturePackList.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_Touch.cpp (90%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Controls}/UIControl_Touch.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Debug}/UIScene_DebugCreateSchematic.cpp (95%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Debug}/UIScene_DebugCreateSchematic.h (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Debug}/UIScene_DebugOptions.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Debug}/UIScene_DebugOptions.h (95%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Debug}/UIScene_DebugOverlay.cpp (90%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Debug}/UIScene_DebugOverlay.h (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Debug}/UIScene_DebugSetCamera.cpp (94%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Debug}/UIScene_DebugSetCamera.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/IUIScene_StartGame.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/IUIScene_StartGame.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_CreateWorldMenu.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_CreateWorldMenu.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_DLCMainMenu.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_DLCMainMenu.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_DLCOffersMenu.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_DLCOffersMenu.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_EULA.cpp (94%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_EULA.h (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_Intro.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_Intro.h (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_JoinMenu.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_JoinMenu.h (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_LaunchMoreOptionsMenu.cpp (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_LaunchMoreOptionsMenu.h (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_LeaderboardsMenu.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_LeaderboardsMenu.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_LoadMenu.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_LoadMenu.h (100%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_LoadOrJoinMenu.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_LoadOrJoinMenu.h (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_MainMenu.cpp (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_MainMenu.h (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_NewUpdateMessage.cpp (95%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_NewUpdateMessage.h (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_SaveMessage.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_SaveMessage.h (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_TrialExitUpsell.cpp (95%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Frontend Menu screens}/UIScene_TrialExitUpsell.h (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_ControlsMenu.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_ControlsMenu.h (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_Credits.cpp (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_Credits.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_HelpAndOptionsMenu.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_HelpAndOptionsMenu.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_HowToPlay.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_HowToPlay.h (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_HowToPlayMenu.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_HowToPlayMenu.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_LanguageSelector.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_LanguageSelector.h (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_ReinstallMenu.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_ReinstallMenu.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_SettingsAudioMenu.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_SettingsAudioMenu.h (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_SettingsControlMenu.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_SettingsControlMenu.h (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_SettingsGraphicsMenu.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_SettingsGraphicsMenu.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_SettingsMenu.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_SettingsMenu.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_SettingsOptionsMenu.cpp (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_SettingsOptionsMenu.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_SettingsUIMenu.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_SettingsUIMenu.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_SkinSelectMenu.cpp (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/Help & Options}/UIScene_SkinSelectMenu.h (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_AbstractContainerMenu.cpp (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_AbstractContainerMenu.h (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_AnvilMenu.cpp (95%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_AnvilMenu.h (93%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_BeaconMenu.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_BeaconMenu.h (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_BrewingStandMenu.cpp (94%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_BrewingStandMenu.h (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_ContainerMenu.cpp (90%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_ContainerMenu.h (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_CreativeMenu.cpp (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_CreativeMenu.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_DispenserMenu.cpp (93%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_DispenserMenu.h (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_EnchantingMenu.cpp (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_EnchantingMenu.h (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_FireworksMenu.cpp (93%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_FireworksMenu.h (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_FurnaceMenu.cpp (95%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_FurnaceMenu.h (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_HopperMenu.cpp (93%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_HopperMenu.h (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_HorseInventoryMenu.cpp (95%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_HorseInventoryMenu.h (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_InventoryMenu.cpp (91%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_InventoryMenu.h (92%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_TradingMenu.cpp (93%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers}/UIScene_TradingMenu.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_CraftingMenu.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_CraftingMenu.h (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_DeathMenu.cpp (95%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_DeathMenu.h (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_EndPoem.cpp (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_EndPoem.h (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_InGameHostOptionsMenu.cpp (94%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_InGameHostOptionsMenu.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_InGameInfoMenu.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_InGameInfoMenu.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_InGamePlayerOptionsMenu.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_InGamePlayerOptionsMenu.h (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_InGameSaveManagementMenu.cpp (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_InGameSaveManagementMenu.h (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_PauseMenu.cpp (97%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_PauseMenu.h (96%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_SignEntryMenu.cpp (89%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_SignEntryMenu.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_TeleportMenu.cpp (95%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes/In-Game Menu Screens}/UIScene_TeleportMenu.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes}/UIScene_ConnectingProgress.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes}/UIScene_ConnectingProgress.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes}/UIScene_FullscreenProgress.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes}/UIScene_FullscreenProgress.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes}/UIScene_Keyboard.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes}/UIScene_Keyboard.h (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes}/UIScene_MessageBox.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes}/UIScene_MessageBox.h (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes}/UIScene_QuadrantSignin.cpp (98%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes}/UIScene_QuadrantSignin.h (99%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes}/UIScene_Timer.cpp (88%) rename Minecraft.Client/{Platform/Common/UI => Common/Source Files/UI/Scenes}/UIScene_Timer.h (96%) create mode 100644 Minecraft.Client/Common/Source Files/UI/UI.h rename Minecraft.Client/{Platform/Common => Common/Source Files}/UI/UIBitmapFont.cpp (99%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/UI/UIBitmapFont.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/UI/UIController.cpp (98%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/UI/UIController.h (99%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/UI/UIFontData.cpp (99%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/UI/UIFontData.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/UI/UIGroup.cpp (99%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/UI/UIGroup.h (98%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/UI/UILayer.cpp (99%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/UI/UILayer.h (98%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/UI/UIScene.cpp (99%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/UI/UIScene.h (99%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/UI/UIString.cpp (96%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/UI/UIString.h (100%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/UI/UITTFFont.cpp (94%) rename Minecraft.Client/{Platform/Common => Common/Source Files}/UI/UITTFFont.h (100%) rename Minecraft.Client/{Platform/Common => ConsoleHelpers}/C4JMemoryPool.h (100%) rename Minecraft.Client/{Platform/Common => ConsoleHelpers}/C4JMemoryPoolAllocator.h (100%) delete mode 100644 Minecraft.Client/GameState/DispenserBootstrap.cpp delete mode 100644 Minecraft.Client/GameState/StatsSyncer.cpp rename Minecraft.Client/{Textures => Header Files}/BufferedImage.h (100%) rename Minecraft.Client/{Utils => Header Files}/FrameProfiler.h (100%) rename Minecraft.Client/{Textures => Header Files}/MemTexture.h (100%) rename Minecraft.Client/{Textures => Header Files}/MemTextureProcessor.h (100%) rename Minecraft.Client/{Platform/Windows64/GameConfig => Header Files}/Minecraft.spa.h (100%) rename Minecraft.Client/{Textures => Header Files}/MobSkinMemTextureProcessor.h (100%) rename Minecraft.Client/{Rendering/Models => Header Files}/SkinBox.h (100%) rename Minecraft.Client/{Platform => Header Files}/extraX64client.h (100%) create mode 100644 Minecraft.Client/Header Files/stdafx.h rename Minecraft.Client/{Platform => Header Files}/stubs.h (100%) rename Minecraft.Client/{Platform => }/Linux/Iggy/gdraw/gdraw.c (99%) rename Minecraft.Client/{Platform => }/Linux/Iggy/gdraw/gdraw.h (94%) rename Minecraft.Client/{Platform/Windows64 => Linux}/Iggy/include/gdraw.h (99%) rename Minecraft.Client/{Platform => }/Linux/Iggy/include/iggy.h (99%) rename Minecraft.Client/{Platform => }/Linux/Iggy/include/rrCore.h (100%) rename Minecraft.Client/{Platform => }/Linux/Leaderboards/LinuxLeaderboardManager.cpp (77%) rename Minecraft.Client/{Platform => }/Linux/Leaderboards/LinuxLeaderboardManager.h (95%) rename Minecraft.Client/{Platform => }/Linux/LinuxGL.cpp (95%) rename Minecraft.Client/{Platform => }/Linux/LinuxGL.h (100%) rename Minecraft.Client/{Platform => }/Linux/Linux_App.cpp (87%) rename Minecraft.Client/{Platform => }/Linux/Linux_App.h (100%) rename Minecraft.Client/{Platform => }/Linux/Linux_Minecraft.cpp (96%) rename Minecraft.Client/{Platform => }/Linux/Linux_ShutdownManager.cpp (86%) rename Minecraft.Client/{Platform => }/Linux/Linux_UIController.cpp (97%) rename Minecraft.Client/{Platform => }/Linux/Linux_UIController.h (94%) rename Minecraft.Client/{Platform => }/Linux/Sentient/DynamicConfigurations.h (100%) create mode 100644 Minecraft.Client/Linux/Sentient/MinecraftTelemetry.h rename Minecraft.Client/{Platform/Windows64 => Linux}/Sentient/SentientManager.h (98%) rename Minecraft.Client/{Platform => }/Linux/Sentient/SentientStats.h (100%) rename Minecraft.Client/{Platform => }/Linux/Sentient/SentientTelemetryCommon.h (100%) rename Minecraft.Client/{Platform => }/Linux/Sentient/TelemetryEnum.h (100%) rename Minecraft.Client/{Platform => }/Linux/Social/SocialManager.h (100%) rename Minecraft.Client/{Platform => }/Linux/Stubs/DirectXMath/DirectXCollision.h (97%) rename Minecraft.Client/{Platform => }/Linux/Stubs/DirectXMath/DirectXCollision.inl (97%) rename Minecraft.Client/{Platform => }/Linux/Stubs/DirectXMath/DirectXColors.h (98%) rename Minecraft.Client/{Platform => }/Linux/Stubs/DirectXMath/DirectXMath.h (97%) rename Minecraft.Client/{Platform => }/Linux/Stubs/DirectXMath/DirectXMathConvert.inl (97%) rename Minecraft.Client/{Platform => }/Linux/Stubs/DirectXMath/DirectXMathMatrix.inl (97%) rename Minecraft.Client/{Platform => }/Linux/Stubs/DirectXMath/DirectXMathMisc.inl (96%) rename Minecraft.Client/{Platform => }/Linux/Stubs/DirectXMath/DirectXMathVector.inl (97%) rename Minecraft.Client/{Platform => }/Linux/Stubs/DirectXMath/DirectXPackedVector.h (97%) rename Minecraft.Client/{Platform => }/Linux/Stubs/DirectXMath/DirectXPackedVector.inl (97%) rename Minecraft.Client/{Platform => }/Linux/Stubs/DirectXMath/sal.h (100%) rename Minecraft.Client/{Platform => }/Linux/Stubs/LinuxStubs.h (100%) rename Minecraft.Client/{Platform => }/Linux/Stubs/d3d11_stubs.h (100%) rename Minecraft.Client/{Platform => }/Linux/Stubs/iggy_stubs.h (99%) rename Minecraft.Client/{Platform => }/Linux/Stubs/winapi_stubs.h (100%) rename Minecraft.Client/{Platform => }/Linux/Stubs/xbox_stubs.h (100%) rename Minecraft.Client/{Platform => }/Linux/linux_game_stubs.cpp (74%) delete mode 100644 Minecraft.Client/Platform/Common/GameRules/ConsoleGameRules.h delete mode 100644 Minecraft.Client/Platform/Common/Minecraft_Macros.h delete mode 100644 Minecraft.Client/Platform/Common/Network/NetworkPlayerQNet.cpp delete mode 100644 Minecraft.Client/Platform/Common/Network/NetworkPlayerQNet.h delete mode 100644 Minecraft.Client/Platform/Common/UI/UI.h delete mode 100644 Minecraft.Client/Platform/Windows64/GameConfig/Minecraft.gameconfig delete mode 100644 Minecraft.Client/Platform/Windows64/GameConfig/Minecraft.spa delete mode 100644 Minecraft.Client/Platform/Windows64/GameHDD/20140401093851/saveData.ms delete mode 100644 Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d.cpp delete mode 100644 Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d.h delete mode 100644 Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d10.cpp delete mode 100644 Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d10.h delete mode 100644 Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d9_shaders.inl delete mode 100644 Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_wgl.c delete mode 100644 Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_wgl.h delete mode 100644 Minecraft.Client/Platform/Windows64/Iggy/lib/iggy_w32.lib delete mode 100644 Minecraft.Client/Platform/Windows64/Iggy/lib/iggy_w64.lib delete mode 100644 Minecraft.Client/Platform/Windows64/Iggy/lib/iggyexpruntime_w32.lib delete mode 100644 Minecraft.Client/Platform/Windows64/Iggy/lib/iggyexpruntime_w64.lib delete mode 100644 Minecraft.Client/Platform/Windows64/Iggy/lib/iggyperfmon_w32.lib delete mode 100644 Minecraft.Client/Platform/Windows64/Iggy/lib/iggyperfmon_w64.lib delete mode 100644 Minecraft.Client/Platform/Windows64/Iggy/lib/redist64/iggy_w64.dll delete mode 100644 Minecraft.Client/Platform/Windows64/Miles/include/imssapi.h delete mode 100644 Minecraft.Client/Platform/Windows64/Miles/include/tmapi.h delete mode 100644 Minecraft.Client/Platform/Windows64/Miles/lib/aud32.lib delete mode 100644 Minecraft.Client/Platform/Windows64/Miles/lib/mss32.lib delete mode 100644 Minecraft.Client/Platform/Windows64/Miles/lib/mss32midi.lib delete mode 100644 Minecraft.Client/Platform/Windows64/Miles/lib/mss64.lib delete mode 100644 Minecraft.Client/Platform/Windows64/Miles/lib/mss64midi.lib delete mode 100644 Minecraft.Client/Platform/Windows64/Miles/lib/redist64/binkawin64.asi delete mode 100644 Minecraft.Client/Platform/Windows64/Miles/lib/redist64/mss64dolby.flt delete mode 100644 Minecraft.Client/Platform/Windows64/Miles/lib/redist64/mss64ds3d.flt delete mode 100644 Minecraft.Client/Platform/Windows64/Miles/lib/redist64/mss64dsp.flt delete mode 100644 Minecraft.Client/Platform/Windows64/Miles/lib/redist64/mss64eax.flt delete mode 100644 Minecraft.Client/Platform/Windows64/Miles/lib/redist64/mss64srs.flt delete mode 100644 Minecraft.Client/Platform/Windows64/Sentient/MinecraftTelemetry.h delete mode 100644 Minecraft.Client/Platform/Windows64/XML/ATGXmlParser.h delete mode 100644 Minecraft.Client/Platform/Windows64/Xbox_BuildVer.h delete mode 100644 Minecraft.Client/Platform/stdafx.h rename Minecraft.Client/{Textures => Source Files}/BufferedImage.cpp (96%) rename Minecraft.Client/{Platform => Source Files}/Extrax64Stubs.cpp (98%) rename Minecraft.Client/{Utils => Source Files}/FrameProfiler.cpp (98%) rename Minecraft.Client/{Rendering => Source Files}/glWrapper.cpp (97%) rename Minecraft.Client/{Platform => Source Files}/stdafx.cpp (83%) rename Minecraft.Client/{Platform => Source Files}/stubs.cpp (95%) rename Minecraft.Client/{Platform => }/Windows64/Iggy/gdraw/gdraw_d3d10_shaders.inl (100%) rename Minecraft.Client/{Platform => }/Windows64/Iggy/gdraw/gdraw_d3d11.cpp (98%) rename Minecraft.Client/{Platform => }/Windows64/Iggy/gdraw/gdraw_d3d11.h (100%) rename Minecraft.Client/{Platform => }/Windows64/Iggy/gdraw/gdraw_d3d1x_shared.inl (100%) rename Minecraft.Client/{Platform => }/Windows64/Iggy/gdraw/gdraw_gl_shaders.inl (100%) rename Minecraft.Client/{Platform => }/Windows64/Iggy/gdraw/gdraw_gl_shared.inl (100%) rename Minecraft.Client/{Platform => }/Windows64/Iggy/gdraw/gdraw_shared.inl (100%) rename Minecraft.Client/{Platform/Linux => Windows64}/Iggy/include/gdraw.h (99%) rename Minecraft.Client/{Platform => }/Windows64/Iggy/include/iggy.h (100%) rename Minecraft.Client/{Platform => }/Windows64/Iggy/include/iggyexpruntime.h (100%) rename Minecraft.Client/{Platform => }/Windows64/Iggy/include/iggyperfmon.h (100%) rename Minecraft.Client/{Platform => }/Windows64/Iggy/include/rrCore.h (100%) rename Minecraft.Client/{Platform/Windows64/Miles/include => Windows64/Miles Sound System/Include}/mss.h (100%) rename Minecraft.Client/{Platform/Windows64/Miles/include => Windows64/Miles Sound System/Include}/rrcore.h (100%) rename Minecraft.Client/{Platform => }/Windows64/Resource.h (100%) rename Minecraft.Client/{Platform/Windows64 => Windows64/Source Files}/Leaderboards/WindowsLeaderboardManager.cpp (78%) rename Minecraft.Client/{Platform/Windows64 => Windows64/Source Files}/Leaderboards/WindowsLeaderboardManager.h (95%) rename Minecraft.Client/{Platform/Windows64 => Windows64/Source Files}/Sentient/DynamicConfigurations.h (100%) rename Minecraft.Client/{Platform/Linux => Windows64/Source Files}/Sentient/MinecraftTelemetry.h (100%) rename Minecraft.Client/{Platform/Linux => Windows64/Source Files}/Sentient/SentientManager.h (100%) rename Minecraft.Client/{Platform/Windows64 => Windows64/Source Files}/Sentient/SentientStats.h (100%) rename Minecraft.Client/{Platform/Windows64 => Windows64/Source Files}/Sentient/SentientTelemetryCommon.h (100%) rename Minecraft.Client/{Platform/Windows64 => Windows64/Source Files}/Sentient/TelemetryEnum.h (100%) rename Minecraft.Client/{Platform/Windows64 => Windows64/Source Files}/Social/SocialManager.h (100%) rename Minecraft.Client/{Platform/Windows64 => Windows64/Source Files}/Windows64_Minecraft.cpp (96%) rename Minecraft.Client/{Platform => }/Windows64/Windows64_App.cpp (88%) rename Minecraft.Client/{Platform => }/Windows64/Windows64_App.h (100%) rename Minecraft.Client/{Platform => }/Windows64/Windows64_UIController.cpp (97%) rename Minecraft.Client/{Platform => }/Windows64/Windows64_UIController.h (95%) rename Minecraft.Client/{Platform/Common => Windows64}/XML/ATGXmlParser.cpp (99%) rename Minecraft.Client/{Platform/Common => Windows64}/XML/ATGXmlParser.h (100%) rename Minecraft.Client/{Platform/Common => Windows64}/XML/xmlFilesCallback.h (100%) rename Minecraft.Client/{Rendering => net/minecraft/client}/Camera.cpp (88%) rename Minecraft.Client/{Rendering => net/minecraft/client}/Camera.h (85%) rename Minecraft.Client/{ => net/minecraft/client}/ClientConstants.cpp (78%) rename Minecraft.Client/{ => net/minecraft/client}/ClientConstants.h (100%) rename Minecraft.Client/{GameState => net/minecraft/client}/DemoUser.cpp (54%) rename Minecraft.Client/{GameState => net/minecraft/client}/DemoUser.h (71%) rename Minecraft.Client/{UI => net/minecraft/client}/GuiMessage.cpp (66%) rename Minecraft.Client/{UI => net/minecraft/client}/GuiMessage.h (100%) rename Minecraft.Client/{Input => net/minecraft/client}/KeyMapping.cpp (68%) rename Minecraft.Client/{Input => net/minecraft/client}/KeyMapping.h (100%) rename Minecraft.Client/{Rendering => net/minecraft/client}/Lighting.cpp (89%) rename Minecraft.Client/{Rendering => net/minecraft/client}/Lighting.h (100%) rename Minecraft.Client/{Utils => net/minecraft/client}/MemoryTracker.cpp (84%) rename Minecraft.Client/{Utils => net/minecraft/client}/MemoryTracker.h (100%) rename Minecraft.Client/{ => net/minecraft/client}/Minecraft.cpp (97%) rename Minecraft.Client/{ => net/minecraft/client}/Minecraft.h (97%) rename Minecraft.Client/{GameState => net/minecraft/client}/Options.cpp (94%) rename Minecraft.Client/{GameState => net/minecraft/client}/Options.h (98%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client}/ProgressRenderer.cpp (94%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client}/ProgressRenderer.h (93%) rename Minecraft.Client/{Utils => net/minecraft/client}/Timer.cpp (96%) rename Minecraft.Client/{Utils => net/minecraft/client}/Timer.h (100%) rename Minecraft.Client/{Player => net/minecraft/client}/User.cpp (89%) rename Minecraft.Client/{Player => net/minecraft/client}/User.h (100%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/Button.cpp (95%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/Button.h (100%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/ChatScreen.cpp (88%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/ChatScreen.h (95%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/ConfirmScreen.cpp (90%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/ConfirmScreen.h (96%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/ControlsScreen.cpp (91%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/ControlsScreen.h (96%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/CreateWorldScreen.cpp (95%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/CreateWorldScreen.h (98%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/DeathScreen.cpp (87%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/DeathScreen.h (93%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/EditBox.cpp (95%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/EditBox.h (100%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/EnchantmentScreen.cpp (95%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/EnchantmentScreen.h (89%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/ErrorScreen.cpp (90%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/ErrorScreen.h (93%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/Font.cpp (97%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/Font.h (100%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/Gui.cpp (96%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/Gui.h (96%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/GuiComponent.cpp (98%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/GuiComponent.h (100%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/HopperScreen.cpp (73%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/HopperScreen.h (90%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/InBedChatScreen.cpp (82%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/InBedChatScreen.h (100%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/JoinMultiplayerScreen.cpp (94%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/JoinMultiplayerScreen.h (96%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/MerchantScreen.cpp (86%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/MerchantScreen.h (77%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/MessageScreen.cpp (88%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/MessageScreen.h (94%) rename Minecraft.Client/{Rendering => net/minecraft/client/gui}/Minimap.cpp (95%) rename Minecraft.Client/{Rendering => net/minecraft/client/gui}/Minimap.h (91%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/NameEntryScreen.cpp (93%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/NameEntryScreen.h (96%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/OptionsScreen.cpp (92%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/OptionsScreen.h (95%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/PauseScreen.cpp (86%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/PauseScreen.h (95%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/RenameWorldScreen.cpp (82%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/RenameWorldScreen.h (96%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/RepairScreen.cpp (92%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/RepairScreen.h (78%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/Screen.cpp (96%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/Screen.h (100%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/ScreenSizeCalculator.cpp (90%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/ScreenSizeCalculator.h (100%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/ScrolledSelectionList.cpp (93%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/ScrolledSelectionList.h (100%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/SelectWorldScreen.cpp (96%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/SelectWorldScreen.h (97%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/SlideButton.cpp (95%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/SlideButton.h (94%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/SmallButton.cpp (90%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/SmallButton.h (92%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/TradeSwitchButton.cpp (74%) rename Minecraft.Client/{UI => net/minecraft/client/gui}/TradeSwitchButton.h (100%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/VideoSettingsScreen.cpp (92%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui}/VideoSettingsScreen.h (94%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/achievement}/AchievementPopup.cpp (87%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/achievement}/AchievementPopup.h (100%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/achievement}/AchievementScreen.cpp (87%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/achievement}/AchievementScreen.h (94%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/achievement}/StatsScreen.cpp (97%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/achievement}/StatsScreen.h (100%) rename Minecraft.Client/{UI => net/minecraft/client/gui/inventory}/AbstractBeaconButton.cpp (88%) rename Minecraft.Client/{UI => net/minecraft/client/gui/inventory}/AbstractBeaconButton.h (95%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/AbstractContainerScreen.cpp (95%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/AbstractContainerScreen.h (100%) rename Minecraft.Client/{UI => net/minecraft/client/gui/inventory}/BeaconCancelButton.cpp (78%) rename Minecraft.Client/{UI => net/minecraft/client/gui/inventory}/BeaconCancelButton.h (100%) rename Minecraft.Client/{UI => net/minecraft/client/gui/inventory}/BeaconConfirmButton.cpp (78%) rename Minecraft.Client/{UI => net/minecraft/client/gui/inventory}/BeaconConfirmButton.h (100%) rename Minecraft.Client/{UI => net/minecraft/client/gui/inventory}/BeaconPowerButton.cpp (74%) rename Minecraft.Client/{UI => net/minecraft/client/gui/inventory}/BeaconPowerButton.h (80%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/BeaconScreen.cpp (90%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/BeaconScreen.h (79%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/BrewingStandScreen.cpp (84%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/BrewingStandScreen.h (73%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/ContainerScreen.cpp (82%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/ContainerScreen.h (100%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/CraftingScreen.cpp (75%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/CraftingScreen.h (100%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/CreativeInventoryScreen.cpp (95%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/CreativeInventoryScreen.h (92%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/FurnaceScreen.cpp (76%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/FurnaceScreen.h (100%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/HorseInventoryScreen.cpp (86%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/HorseInventoryScreen.h (85%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/InventoryScreen.cpp (87%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/InventoryScreen.h (100%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/TextEditScreen.cpp (78%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/TextEditScreen.h (100%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/TrapScreen.cpp (57%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/gui/inventory}/TrapScreen.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/gui/particle}/GuiParticle.cpp (88%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/gui/particle}/GuiParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/gui/particle}/GuiParticles.cpp (85%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/gui/particle}/GuiParticles.h (89%) rename Minecraft.Client/{Level => net/minecraft/client/level}/DemoLevel.cpp (74%) rename Minecraft.Client/{Level => net/minecraft/client/level}/DemoLevel.h (85%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/BatModel.cpp (93%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/BatModel.h (94%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/BlazeModel.cpp (93%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/BlazeModel.h (96%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/BoatModel.cpp (96%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/BoatModel.h (84%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/BookModel.cpp (94%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/BookModel.h (96%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/ChestModel.cpp (92%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/ChestModel.h (90%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/ChickenModel.cpp (95%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/ChickenModel.h (96%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/CowModel.cpp (90%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/CowModel.h (100%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/CreeperModel.cpp (94%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/CreeperModel.h (96%) rename Minecraft.Client/{Rendering/Models/EnderManModel.cpp => net/minecraft/client/model/EndermanModel.cpp} (96%) rename Minecraft.Client/{Rendering/Models/EnderManModel.h => net/minecraft/client/model/EndermanModel.h} (100%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/GhastModel.cpp (89%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/GhastModel.h (96%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/HumanoidModel.cpp (98%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/HumanoidModel.h (99%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/LargeChestModel.cpp (89%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/LargeChestModel.h (100%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/LavaSlimeModel.cpp (87%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/LavaSlimeModel.h (95%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/LeashKnotModel.cpp (92%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/LeashKnotModel.h (96%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/MinecartModel.cpp (95%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/MinecartModel.h (93%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/ModelHorse.cpp (98%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/ModelHorse.h (98%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/OcelotModel.cpp (96%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/OcelotModel.h (98%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/PigModel.cpp (80%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/PigModel.h (100%) rename Minecraft.Client/{Rendering => net/minecraft/client/model}/Polygon.cpp (98%) rename Minecraft.Client/{Rendering => net/minecraft/client/model}/Polygon.h (84%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/QuadrupedModel.cpp (96%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/QuadrupedModel.h (96%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SheepFurModel.cpp (90%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SheepFurModel.h (100%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SheepModel.cpp (85%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SheepModel.h (100%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SignModel.cpp (84%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SignModel.h (88%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SilverfishModel.cpp (94%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SilverfishModel.h (96%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SkeletonHeadModel.cpp (94%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SkeletonHeadModel.h (96%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SkeletonModel.cpp (86%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SkeletonModel.h (100%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SkiModel.cpp (96%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SkiModel.h (91%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SlimeModel.cpp (93%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SlimeModel.h (93%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SnowManModel.cpp (93%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SnowManModel.h (95%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SpiderModel.cpp (96%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SpiderModel.h (96%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SquidModel.cpp (92%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/SquidModel.h (96%) rename Minecraft.Client/{Rendering => net/minecraft/client/model}/Vertex.cpp (100%) rename Minecraft.Client/{Rendering => net/minecraft/client/model}/Vertex.h (84%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/VillagerGolemModel.cpp (94%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/VillagerGolemModel.h (97%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/VillagerModel.cpp (94%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/VillagerModel.h (96%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/VillagerZombieModel.cpp (92%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/VillagerZombieModel.h (100%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/WitchModel.cpp (93%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/WitchModel.h (100%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/WitherBossModel.cpp (93%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/WitherBossModel.h (93%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/WolfModel.cpp (95%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/WolfModel.h (89%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/ZombieModel.cpp (89%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model}/ZombieModel.h (100%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model/dragon}/DragonModel.cpp (97%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model/dragon}/DragonModel.h (93%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model/dragon}/EnderCrystalModel.cpp (95%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model/dragon}/EnderCrystalModel.h (87%) rename Minecraft.Client/{Rendering => net/minecraft/client/model/geom}/Cube.cpp (96%) rename Minecraft.Client/{Rendering => net/minecraft/client/model/geom}/Cube.h (81%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model/geom}/Model.cpp (79%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model/geom}/Model.h (91%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model/geom}/ModelPart.cpp (98%) rename Minecraft.Client/{Rendering/Models => net/minecraft/client/model/geom}/ModelPart.h (94%) rename Minecraft.Client/{Rendering => net/minecraft/client/model/geom}/TexOffs.cpp (50%) rename Minecraft.Client/{Rendering => net/minecraft/client/model/geom}/TexOffs.h (100%) rename Minecraft.Client/{Network => net/minecraft/client/multiplayer}/ClientConnection.cpp (97%) rename Minecraft.Client/{Network => net/minecraft/client/multiplayer}/ClientConnection.h (99%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/multiplayer}/ConnectScreen.cpp (86%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/multiplayer}/ConnectScreen.h (95%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/multiplayer}/DisconnectedScreen.cpp (85%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/multiplayer}/DisconnectedScreen.h (95%) rename Minecraft.Client/{Network => net/minecraft/client/multiplayer}/MultiPlayerChunkCache.cpp (93%) rename Minecraft.Client/{Network => net/minecraft/client/multiplayer}/MultiPlayerChunkCache.h (84%) rename Minecraft.Client/{Player => net/minecraft/client/multiplayer}/MultiPlayerGameMode.cpp (96%) rename Minecraft.Client/{Player => net/minecraft/client/multiplayer}/MultiPlayerGameMode.h (98%) rename Minecraft.Client/{Level => net/minecraft/client/multiplayer}/MultiPlayerLevel.cpp (97%) rename Minecraft.Client/{Level => net/minecraft/client/multiplayer}/MultiPlayerLevel.h (92%) rename Minecraft.Client/{Player => net/minecraft/client/multiplayer}/MultiPlayerLocalPlayer.cpp (93%) rename Minecraft.Client/{Player => net/minecraft/client/multiplayer}/MultiPlayerLocalPlayer.h (95%) rename Minecraft.Client/{Network => net/minecraft/client/multiplayer}/PlayerInfo.h (100%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/multiplayer}/ReceivingLevelScreen.cpp (84%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/multiplayer}/ReceivingLevelScreen.h (95%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/BreakingItemParticle.cpp (87%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/BreakingItemParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/BubbleParticle.cpp (66%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/BubbleParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/CritParticle.cpp (81%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/CritParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/CritParticle2.cpp (93%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/CritParticle2.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/DragonBreathParticle.cpp (95%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/DragonBreathParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/DripParticle.cpp (88%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/DripParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/EnchantmentTableParticle.cpp (93%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/EnchantmentTableParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/EnderParticle.cpp (92%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/EnderParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/ExplodeParticle.cpp (90%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/ExplodeParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/FireworksParticles.cpp (98%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/FireworksParticles.h (97%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/FlameParticle.cpp (89%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/FlameParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/FootstepParticle.cpp (84%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/FootstepParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/HeartParticle.cpp (95%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/HeartParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/HugeExplosionParticle.cpp (91%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/HugeExplosionParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/HugeExplosionSeedParticle.cpp (87%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/HugeExplosionSeedParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/LavaParticle.cpp (82%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/LavaParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/NetherPortalParticle.cpp (92%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/NetherPortalParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/NoteParticle.cpp (95%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/NoteParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/Particle.cpp (93%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/Particle.h (90%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/ParticleEngine.cpp (93%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/ParticleEngine.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/PlayerCloudParticle.cpp (77%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/PlayerCloudParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/RedDustParticle.cpp (94%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/RedDustParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/SmokeParticle.cpp (93%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/SmokeParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/SnowShovelParticle.cpp (92%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/SnowShovelParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/SpellParticle.cpp (89%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/SpellParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/SplashParticle.cpp (85%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/SplashParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/SuspendedParticle.cpp (69%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/SuspendedParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/SuspendedTownParticle.cpp (80%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/SuspendedTownParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/TakeAnimationParticle.cpp (84%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/TakeAnimationParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/TerrainParticle.cpp (90%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/TerrainParticle.h (100%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/WaterDropParticle.cpp (73%) rename Minecraft.Client/{Rendering/Particles => net/minecraft/client/particle}/WaterDropParticle.h (100%) rename Minecraft.Client/{Input => net/minecraft/client/player}/Input.cpp (89%) rename Minecraft.Client/{Input => net/minecraft/client/player}/Input.h (100%) rename Minecraft.Client/{Player => net/minecraft/client/player}/LocalPlayer.cpp (94%) rename Minecraft.Client/{Player => net/minecraft/client/player}/LocalPlayer.h (96%) rename Minecraft.Client/{Player => net/minecraft/client/player}/RemotePlayer.cpp (94%) rename Minecraft.Client/{Player => net/minecraft/client/player}/RemotePlayer.h (86%) rename Minecraft.Client/{UI => net/minecraft/client/renderer}/BossMobGuiInfo.cpp (78%) rename Minecraft.Client/{UI => net/minecraft/client/renderer}/BossMobGuiInfo.h (100%) rename Minecraft.Client/{Rendering => net/minecraft/client/renderer}/Chunk.cpp (98%) rename Minecraft.Client/{Rendering => net/minecraft/client/renderer}/Chunk.h (94%) rename Minecraft.Client/{Rendering/Culling => net/minecraft/client/renderer}/DirtyChunkSorter.cpp (78%) rename Minecraft.Client/{Rendering/Culling => net/minecraft/client/renderer}/DirtyChunkSorter.h (100%) rename Minecraft.Client/{Rendering/Culling => net/minecraft/client/renderer}/DistanceChunkSorter.cpp (74%) rename Minecraft.Client/{Rendering/Culling => net/minecraft/client/renderer}/DistanceChunkSorter.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer}/EntityTileRenderer.cpp (75%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer}/EntityTileRenderer.h (100%) rename Minecraft.Client/{Rendering => net/minecraft/client/renderer}/GameRenderer.cpp (95%) rename Minecraft.Client/{Rendering => net/minecraft/client/renderer}/GameRenderer.h (96%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer}/HttpTexture.cpp (79%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer}/HttpTexture.h (100%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer}/HttpTextureProcessor.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer}/ItemInHandRenderer.cpp (97%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer}/ItemInHandRenderer.h (100%) rename Minecraft.Client/{Rendering => net/minecraft/client/renderer}/LevelRenderer.cpp (98%) rename Minecraft.Client/{Rendering => net/minecraft/client/renderer}/LevelRenderer.h (97%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer}/MemTexture.cpp (86%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer}/MobSkinMemTextureProcessor.cpp (93%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer}/MobSkinTextureProcessor.cpp (96%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer}/MobSkinTextureProcessor.h (100%) rename Minecraft.Client/{Rendering => net/minecraft/client/renderer}/OffsettedRenderList.cpp (91%) rename Minecraft.Client/{Rendering => net/minecraft/client/renderer}/OffsettedRenderList.h (100%) rename Minecraft.Client/{UI => net/minecraft/client/renderer}/Rect2i.cpp (94%) rename Minecraft.Client/{UI => net/minecraft/client/renderer}/Rect2i.h (100%) rename Minecraft.Client/{Rendering => net/minecraft/client/renderer}/Tesselator.cpp (98%) rename Minecraft.Client/{Rendering => net/minecraft/client/renderer}/Tesselator.h (100%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer}/Textures.cpp (97%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer}/Textures.h (99%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer}/TileRenderer.cpp (99%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer}/TileRenderer.h (100%) rename Minecraft.Client/{Rendering/Culling => net/minecraft/client/renderer/culling}/AllowAllCuller.cpp (87%) rename Minecraft.Client/{Rendering/Culling => net/minecraft/client/renderer/culling}/AllowAllCuller.h (100%) rename Minecraft.Client/{Rendering/Culling => net/minecraft/client/renderer/culling}/Culler.h (84%) rename Minecraft.Client/{Rendering => net/minecraft/client/renderer/culling}/Frustum.cpp (96%) rename Minecraft.Client/{Rendering => net/minecraft/client/renderer/culling}/Frustum.h (100%) rename Minecraft.Client/{Rendering => net/minecraft/client/renderer/culling}/FrustumCuller.cpp (93%) rename Minecraft.Client/{Rendering => net/minecraft/client/renderer/culling}/FrustumCuller.h (86%) rename Minecraft.Client/{Rendering => net/minecraft/client/renderer/culling}/FrustumData.cpp (98%) rename Minecraft.Client/{Rendering => net/minecraft/client/renderer/culling}/FrustumData.h (94%) rename Minecraft.Client/{Rendering/Culling => net/minecraft/client/renderer/culling}/ViewportCuller.cpp (97%) rename Minecraft.Client/{Rendering/Culling => net/minecraft/client/renderer/culling}/ViewportCuller.h (94%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/ArrowRenderer.cpp (93%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/ArrowRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/BatRenderer.cpp (86%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/BatRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/BlazeRenderer.cpp (81%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/BlazeRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/BoatRenderer.cpp (81%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/BoatRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/CaveSpiderRenderer.cpp (88%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/CaveSpiderRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/ChickenRenderer.cpp (79%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/ChickenRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/CowRenderer.cpp (87%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/CowRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/CreeperRenderer.cpp (90%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/CreeperRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/DefaultRenderer.cpp (69%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/DefaultRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/EnderCrystalRenderer.cpp (83%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/EnderCrystalRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/EnderDragonRenderer.cpp (97%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/EnderDragonRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers/EnderManRenderer.cpp => net/minecraft/client/renderer/entity/EndermanRenderer.cpp} (90%) rename Minecraft.Client/{Rendering/EntityRenderers/EnderManRenderer.h => net/minecraft/client/renderer/entity/EndermanRenderer.h} (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/EntityRenderDispatcher.cpp (84%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/EntityRenderDispatcher.h (92%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/EntityRenderer.cpp (94%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/EntityRenderer.h (94%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/ExperienceOrbRenderer.cpp (84%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/ExperienceOrbRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/FallingTileRenderer.cpp (86%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/FallingTileRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/FireballRenderer.cpp (85%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/FireballRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/FishingHookRenderer.cpp (89%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/FishingHookRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/GhastRenderer.cpp (81%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/GhastRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/GiantMobRenderer.cpp (88%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/GiantMobRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/HorseRenderer.cpp (95%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/HorseRenderer.h (96%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/HumanoidMobRenderer.cpp (93%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/HumanoidMobRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/ItemFrameRenderer.cpp (86%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/ItemFrameRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/ItemRenderer.cpp (97%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/ItemRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/ItemSpriteRenderer.cpp (83%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/ItemSpriteRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/LavaSlimeRenderer.cpp (81%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/LavaSlimeRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/LeashKnotRenderer.cpp (89%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/LeashKnotRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/LightningBoltRenderer.cpp (94%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/LightningBoltRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/LivingEntityRenderer.cpp (97%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/LivingEntityRenderer.h (95%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/MinecartRenderer.cpp (92%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/MinecartRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/MinecartSpawnerRenderer.cpp (57%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/MinecartSpawnerRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/MobRenderer.cpp (90%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/MobRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/MushroomCowRenderer.cpp (83%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/MushroomCowRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/OcelotRenderer.cpp (90%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/OcelotRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/PaintingRenderer.cpp (92%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/PaintingRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/PigRenderer.cpp (85%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/PigRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/PlayerRenderer.cpp (95%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/PlayerRenderer.h (95%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/SheepRenderer.cpp (91%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/SheepRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/SilverfishRenderer.cpp (77%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/SilverfishRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/SkeletonRenderer.cpp (83%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/SkeletonRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/SlimeRenderer.cpp (89%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/SlimeRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/SnowManRenderer.cpp (77%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/SnowManRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/SpiderRenderer.cpp (91%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/SpiderRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/SquidRenderer.cpp (89%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/SquidRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/TntMinecartRenderer.cpp (79%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/TntMinecartRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/TntRenderer.cpp (83%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/TntRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/VillagerGolemRenderer.cpp (86%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/VillagerGolemRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/VillagerRenderer.cpp (92%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/VillagerRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/WitchRenderer.cpp (93%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/WitchRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/WitherBossRenderer.cpp (93%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/WitherBossRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/WitherSkullRenderer.cpp (86%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/WitherSkullRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/WolfRenderer.cpp (90%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/WolfRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/ZombieRenderer.cpp (92%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/entity}/ZombieRenderer.h (100%) rename Minecraft.Client/{Textures/Stitching => net/minecraft/client/renderer/texture}/PreStitchedTextureMap.cpp (97%) rename Minecraft.Client/{Textures/Stitching => net/minecraft/client/renderer/texture}/PreStitchedTextureMap.h (95%) rename Minecraft.Client/{UI => net/minecraft/client/renderer/texture}/SimpleIcon.cpp (79%) rename Minecraft.Client/{UI => net/minecraft/client/renderer/texture}/SimpleIcon.h (75%) rename Minecraft.Client/{Textures/Stitching => net/minecraft/client/renderer/texture}/StitchSlot.cpp (96%) rename Minecraft.Client/{Textures/Stitching => net/minecraft/client/renderer/texture}/StitchSlot.h (100%) rename Minecraft.Client/{Textures/Stitching => net/minecraft/client/renderer/texture}/StitchedTexture.cpp (97%) rename Minecraft.Client/{Textures/Stitching => net/minecraft/client/renderer/texture}/StitchedTexture.h (96%) rename Minecraft.Client/{Textures/Stitching => net/minecraft/client/renderer/texture}/Stitcher.cpp (98%) rename Minecraft.Client/{Textures/Stitching => net/minecraft/client/renderer/texture}/Stitcher.h (98%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer/texture}/Texture.cpp (99%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer/texture}/Texture.h (100%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer/texture}/TextureAtlas.cpp (62%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer/texture}/TextureAtlas.h (100%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer/texture}/TextureHolder.cpp (92%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer/texture}/TextureHolder.h (100%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer/texture}/TextureManager.cpp (96%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer/texture}/TextureManager.h (100%) rename Minecraft.Client/{Textures/Stitching => net/minecraft/client/renderer/texture}/TextureMap.cpp (93%) rename Minecraft.Client/{Textures/Stitching => net/minecraft/client/renderer/texture}/TextureMap.h (94%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer/texture/custom}/ClockTexture.cpp (84%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer/texture/custom}/ClockTexture.h (92%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer/texture/custom}/CompassTexture.cpp (87%) rename Minecraft.Client/{Textures => net/minecraft/client/renderer/texture/custom}/CompassTexture.h (94%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/BeaconRenderer.cpp (94%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/BeaconRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/ChestRenderer.cpp (88%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/ChestRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/EnchantTableRenderer.cpp (85%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/EnchantTableRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/EnderChestRenderer.cpp (86%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/EnderChestRenderer.h (91%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/MobSpawnerRenderer.cpp (79%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/MobSpawnerRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/PistonPieceRenderer.cpp (87%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/PistonPieceRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/SignRenderer.cpp (87%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/SignRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/SkullTileRenderer.cpp (89%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/SkullTileRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/TheEndPortalRenderer.cpp (92%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/TheEndPortalRenderer.h (100%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/TileEntityRenderDispatcher.cpp (91%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/TileEntityRenderDispatcher.h (93%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/TileEntityRenderer.cpp (93%) rename Minecraft.Client/{Rendering/EntityRenderers => net/minecraft/client/renderer/tileentity}/TileEntityRenderer.h (91%) rename Minecraft.Client/{Textures => net/minecraft/client/resources}/ResourceLocation.h (97%) rename Minecraft.Client/{Textures/Packs => net/minecraft/client/skins}/AbstractTexturePack.cpp (96%) rename Minecraft.Client/{Textures/Packs => net/minecraft/client/skins}/AbstractTexturePack.h (100%) rename Minecraft.Client/{Textures/Packs => net/minecraft/client/skins}/DLCTexturePack.cpp (94%) rename Minecraft.Client/{Textures/Packs => net/minecraft/client/skins}/DLCTexturePack.h (100%) rename Minecraft.Client/{Textures/Packs => net/minecraft/client/skins}/DefaultTexturePack.cpp (91%) rename Minecraft.Client/{Textures/Packs => net/minecraft/client/skins}/DefaultTexturePack.h (100%) rename Minecraft.Client/{Textures/Packs => net/minecraft/client/skins}/FileTexturePack.cpp (92%) rename Minecraft.Client/{Textures/Packs => net/minecraft/client/skins}/FileTexturePack.h (100%) rename Minecraft.Client/{Textures/Packs => net/minecraft/client/skins}/FolderTexturePack.cpp (96%) rename Minecraft.Client/{Textures/Packs => net/minecraft/client/skins}/FolderTexturePack.h (100%) rename Minecraft.Client/{Textures/Packs => net/minecraft/client/skins}/TexturePack.cpp (86%) rename Minecraft.Client/{Textures/Packs => net/minecraft/client/skins}/TexturePack.h (98%) rename Minecraft.Client/{Textures/Packs => net/minecraft/client/skins}/TexturePackRepository.cpp (97%) rename Minecraft.Client/{Textures/Packs => net/minecraft/client/skins}/TexturePackRepository.h (100%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/title}/TitleScreen.cpp (95%) rename Minecraft.Client/{UI/Screens => net/minecraft/client/title}/TitleScreen.h (97%) rename Minecraft.Client/{Input => net/minecraft/server}/ConsoleInput.cpp (75%) rename Minecraft.Client/{Input => net/minecraft/server}/ConsoleInput.h (100%) rename Minecraft.Client/{Input => net/minecraft/server}/ConsoleInputSource.h (100%) create mode 100644 Minecraft.Client/net/minecraft/server/DispenserBootstrap.cpp rename Minecraft.Client/{GameState => net/minecraft/server}/DispenserBootstrap.h (83%) rename Minecraft.Client/{ => net/minecraft/server}/MinecraftServer.cpp (96%) rename Minecraft.Client/{ => net/minecraft/server}/MinecraftServer.h (97%) rename Minecraft.Client/{Network => net/minecraft/server}/PlayerList.cpp (97%) rename Minecraft.Client/{Network => net/minecraft/server}/PlayerList.h (98%) rename Minecraft.Client/{Network => net/minecraft/server}/ServerInterface.h (100%) rename Minecraft.Client/{Network => net/minecraft/server}/ServerScoreboard.cpp (99%) rename Minecraft.Client/{Network => net/minecraft/server}/ServerScoreboard.h (94%) rename Minecraft.Client/{GameState => net/minecraft/server}/Settings.cpp (90%) rename Minecraft.Client/{GameState => net/minecraft/server}/Settings.h (100%) rename Minecraft.Client/{Network => net/minecraft/server/commands}/ServerCommandDispatcher.cpp (89%) rename Minecraft.Client/{Network => net/minecraft/server/commands}/ServerCommandDispatcher.h (73%) rename Minecraft.Client/{Commands => net/minecraft/server/commands}/TeleportCommand.cpp (86%) rename Minecraft.Client/{Commands => net/minecraft/server/commands}/TeleportCommand.h (81%) rename Minecraft.Client/{GameState => net/minecraft/server/level}/CreativeMode.cpp (81%) rename Minecraft.Client/{GameState => net/minecraft/server/level}/CreativeMode.h (100%) rename Minecraft.Client/{GameState => net/minecraft/server/level}/DemoMode.cpp (95%) rename Minecraft.Client/{GameState => net/minecraft/server/level}/DemoMode.h (100%) rename Minecraft.Client/{Level => net/minecraft/server/level}/DerivedServerLevel.cpp (78%) rename Minecraft.Client/{Level => net/minecraft/server/level}/DerivedServerLevel.h (100%) rename Minecraft.Client/{Player => net/minecraft/server/level}/EntityTracker.cpp (85%) rename Minecraft.Client/{Player => net/minecraft/server/level}/EntityTracker.h (90%) rename Minecraft.Client/{GameState => net/minecraft/server/level}/GameMode.cpp (83%) rename Minecraft.Client/{GameState => net/minecraft/server/level}/GameMode.h (100%) rename Minecraft.Client/{Network => net/minecraft/server/level}/PlayerChunkMap.cpp (97%) rename Minecraft.Client/{Network => net/minecraft/server/level}/PlayerChunkMap.h (96%) rename Minecraft.Client/{Network => net/minecraft/server/level}/ServerChunkCache.cpp (97%) rename Minecraft.Client/{Network => net/minecraft/server/level}/ServerChunkCache.h (87%) rename Minecraft.Client/{Level => net/minecraft/server/level}/ServerLevel.cpp (95%) rename Minecraft.Client/{Level => net/minecraft/server/level}/ServerLevel.h (97%) rename Minecraft.Client/{Level => net/minecraft/server/level}/ServerLevelListener.cpp (90%) rename Minecraft.Client/{Level => net/minecraft/server/level}/ServerLevelListener.h (96%) rename Minecraft.Client/{Player => net/minecraft/server/level}/ServerPlayer.cpp (96%) rename Minecraft.Client/{Player => net/minecraft/server/level}/ServerPlayer.h (95%) rename Minecraft.Client/{Player => net/minecraft/server/level}/ServerPlayerGameMode.cpp (93%) rename Minecraft.Client/{Player => net/minecraft/server/level}/ServerPlayerGameMode.h (100%) rename Minecraft.Client/{GameState => net/minecraft/server/level}/SurvivalMode.cpp (90%) rename Minecraft.Client/{GameState => net/minecraft/server/level}/SurvivalMode.h (100%) rename Minecraft.Client/{Player => net/minecraft/server/level}/TrackedEntity.cpp (96%) rename Minecraft.Client/{Player => net/minecraft/server/level}/TrackedEntity.h (100%) rename Minecraft.Client/{Network => net/minecraft/server/network}/PendingConnection.cpp (91%) rename Minecraft.Client/{Network => net/minecraft/server/network}/PendingConnection.h (94%) rename Minecraft.Client/{Network => net/minecraft/server/network}/PlayerConnection.cpp (97%) rename Minecraft.Client/{Network => net/minecraft/server/network}/PlayerConnection.h (96%) rename Minecraft.Client/{Network => net/minecraft/server/network}/ServerConnection.cpp (93%) rename Minecraft.Client/{Network => net/minecraft/server/network}/ServerConnection.h (100%) rename Minecraft.Client/{GameState => net/minecraft/stats}/StatsCounter.cpp (95%) rename Minecraft.Client/{GameState => net/minecraft/stats}/StatsCounter.h (100%) create mode 100644 Minecraft.Client/net/minecraft/stats/StatsSyncer.cpp rename Minecraft.Client/{GameState => net/minecraft/stats}/StatsSyncer.h (100%) rename Minecraft.World/{Util => ConsoleHelpers}/ArrayWithLength.h (98%) rename Minecraft.World/{Util => ConsoleHelpers}/C4JThread.cpp (99%) rename Minecraft.World/{Util => ConsoleHelpers}/C4JThread.h (100%) rename Minecraft.World/{IO/Files => ConsoleHelpers/ConsoleSaveFileIO}/ConsoleSaveFile.h (100%) rename Minecraft.World/{IO/Files => ConsoleHelpers/ConsoleSaveFileIO}/ConsoleSaveFileConverter.cpp (97%) rename Minecraft.World/{IO/Files => ConsoleHelpers/ConsoleSaveFileIO}/ConsoleSaveFileConverter.h (95%) rename Minecraft.World/{IO/Files => ConsoleHelpers/ConsoleSaveFileIO}/ConsoleSaveFileIO.h (100%) rename Minecraft.World/{IO/Files => ConsoleHelpers/ConsoleSaveFileIO}/ConsoleSaveFileInputStream.cpp (98%) rename Minecraft.World/{IO/Files => ConsoleHelpers/ConsoleSaveFileIO}/ConsoleSaveFileInputStream.h (91%) rename Minecraft.World/{IO/Files => ConsoleHelpers/ConsoleSaveFileIO}/ConsoleSaveFileOriginal.cpp (97%) rename Minecraft.World/{IO/Files => ConsoleHelpers/ConsoleSaveFileIO}/ConsoleSaveFileOriginal.h (100%) rename Minecraft.World/{IO/Files => ConsoleHelpers/ConsoleSaveFileIO}/ConsoleSaveFileOutputStream.cpp (98%) rename Minecraft.World/{IO/Files => ConsoleHelpers/ConsoleSaveFileIO}/ConsoleSaveFileOutputStream.h (91%) rename Minecraft.World/{IO/Files => ConsoleHelpers/ConsoleSaveFileIO}/ConsoleSaveFileSplit.cpp (98%) rename Minecraft.World/{IO/Files => ConsoleHelpers/ConsoleSaveFileIO}/ConsoleSaveFileSplit.h (100%) rename Minecraft.World/{IO/Files => ConsoleHelpers/ConsoleSaveFileIO}/ConsoleSavePath.h (100%) rename Minecraft.World/{IO/Files => ConsoleHelpers/ConsoleSaveFileIO}/FileHeader.cpp (99%) rename Minecraft.World/{IO/Files => ConsoleHelpers/ConsoleSaveFileIO}/FileHeader.h (99%) rename Minecraft.World/{Util => ConsoleHelpers}/Definitions.h (100%) rename Minecraft.World/{Util => ConsoleHelpers}/HashExtension.h (100%) rename Minecraft.World/{Util => ConsoleHelpers}/PerformanceTimer.cpp (92%) rename Minecraft.World/{Util => ConsoleHelpers}/PerformanceTimer.h (100%) rename Minecraft.World/{Util => ConsoleHelpers}/StringHelpers.cpp (99%) rename Minecraft.World/{Util => ConsoleHelpers}/StringHelpers.h (100%) rename Minecraft.World/{Util => ConsoleHelpers}/ThreadName.cpp (96%) rename Minecraft.World/{Util => ConsoleHelpers}/ThreadName.h (100%) rename Minecraft.World/{Util => ConsoleJavaLibs}/Arrays.h (96%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs}/Buffer.cpp (98%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs}/Buffer.h (100%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs}/ByteBuffer.cpp (99%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs}/ByteBuffer.h (96%) rename Minecraft.World/{Util => ConsoleJavaLibs}/Class.cpp (81%) rename Minecraft.World/{Util => ConsoleJavaLibs}/Class.h (100%) rename Minecraft.World/{Util => ConsoleJavaLibs}/Color.cpp (98%) rename Minecraft.World/{Util => ConsoleJavaLibs}/Color.h (100%) rename Minecraft.World/{Util => ConsoleJavaLibs}/Exceptions.h (100%) rename Minecraft.World/{IO/Files => ConsoleJavaLibs}/File.cpp (98%) rename Minecraft.World/{IO/Files => ConsoleJavaLibs}/File.h (100%) rename Minecraft.World/{IO/Files => ConsoleJavaLibs}/FileFilter.h (100%) rename Minecraft.World/{IO/Files => ConsoleJavaLibs}/FilenameFilter.h (81%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs}/FloatBuffer.cpp (97%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs}/FloatBuffer.h (100%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/BufferedOutputStream.cpp (98%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/BufferedOutputStream.h (100%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/BufferedReader.cpp (99%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/BufferedReader.h (100%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/ByteArrayInputStream.cpp (99%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/ByteArrayInputStream.h (100%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/ByteArrayOutputStream.cpp (98%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/ByteArrayOutputStream.h (100%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/DataInput.h (100%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/DataInputStream.cpp (99%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/DataInputStream.h (100%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/DataOutput.h (100%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/DataOutputStream.cpp (99%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/DataOutputStream.h (100%) rename Minecraft.World/{IO/Files => ConsoleJavaLibs/InputOutputStream}/FileInputStream.cpp (99%) rename Minecraft.World/{IO/Files => ConsoleJavaLibs/InputOutputStream}/FileInputStream.h (92%) rename Minecraft.World/{IO/Files => ConsoleJavaLibs/InputOutputStream}/FileOutputStream.cpp (98%) rename Minecraft.World/{IO/Files => ConsoleJavaLibs/InputOutputStream}/FileOutputStream.h (92%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/GZIPInputStream.h (100%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/GZIPOutputStream.h (100%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/InputOutputStream.h (84%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/InputStream.cpp (78%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/InputStream.h (100%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/InputStreamReader.cpp (97%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/InputStreamReader.h (100%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/OutputStream.h (100%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs/InputOutputStream}/Reader.h (100%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs}/IntBuffer.cpp (98%) rename Minecraft.World/{IO/Streams => ConsoleJavaLibs}/IntBuffer.h (100%) rename Minecraft.World/{Util => ConsoleJavaLibs}/JavaIntHash.h (100%) rename Minecraft.World/{Util => ConsoleJavaLibs}/JavaMath.cpp (98%) rename Minecraft.World/{Util => ConsoleJavaLibs}/JavaMath.h (100%) rename Minecraft.World/{Util => ConsoleJavaLibs}/Random.cpp (97%) rename Minecraft.World/{Util => ConsoleJavaLibs}/Random.h (100%) rename Minecraft.World/{Util => ConsoleJavaLibs}/Reference.h (100%) rename Minecraft.World/{Network => ConsoleJavaLibs}/Socket.cpp (98%) rename Minecraft.World/{Network => ConsoleJavaLibs}/Socket.h (98%) rename Minecraft.World/{Network => ConsoleJavaLibs}/SocketAddress.h (100%) rename Minecraft.World/{Platform => ConsoleJavaLibs}/System.h (97%) rename Minecraft.World/{Platform/System.cpp => ConsoleJavaLibs/system.cpp} (99%) delete mode 100644 Minecraft.World/Entities/GlobalEntity.cpp delete mode 100644 Minecraft.World/Entities/Mobs/Creature.cpp delete mode 100644 Minecraft.World/Entities/Mobs/Npc.cpp rename Minecraft.World/{Level/Events => Header Files}/LevelObjectInputStream.h (100%) rename Minecraft.World/{Platform => Header Files}/Minecraft.World.h (100%) rename Minecraft.World/{Util => Header Files}/ParticleTypes.h (100%) rename Minecraft.World/{Util => Header Files}/PathHelper.h (100%) rename Minecraft.World/{Util => Header Files}/PortableFileIO.h (98%) rename Minecraft.World/{Util => Header Files}/SoundTypes.h (100%) rename Minecraft.World/{IO/Streams/Compression.h => Header Files/compression.h} (98%) rename Minecraft.World/{Util => Header Files}/libdivide.h (100%) create mode 100644 Minecraft.World/Header Files/stdafx.h delete mode 100644 Minecraft.World/Headers/com.mojang.nbt.h delete mode 100644 Minecraft.World/Headers/net.minecraft.commands.common.h delete mode 100644 Minecraft.World/Headers/net.minecraft.commands.h delete mode 100644 Minecraft.World/Headers/net.minecraft.core.h delete mode 100644 Minecraft.World/Headers/net.minecraft.h delete mode 100644 Minecraft.World/Headers/net.minecraft.locale.h delete mode 100644 Minecraft.World/Headers/net.minecraft.network.h delete mode 100644 Minecraft.World/Headers/net.minecraft.network.packet.h delete mode 100644 Minecraft.World/Headers/net.minecraft.stats.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.damagesource.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.effect.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.entity.ai.attributes.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.entity.ai.control.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.entity.ai.goal.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.entity.ai.goal.target.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.entity.ai.navigation.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.entity.ai.sensing.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.entity.ai.util.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.entity.ai.village.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.entity.ambient.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.entity.animal.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.entity.boss.enderdragon.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.entity.boss.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.entity.global.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.entity.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.entity.item.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.entity.monster.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.entity.npc.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.entity.player.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.entity.projectile.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.food.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.inventory.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.item.alchemy.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.item.crafting.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.item.enchantment.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.item.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.item.trading.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.level.biome.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.level.chunk.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.level.chunk.storage.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.level.dimension.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.level.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.level.levelgen.feature.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.level.levelgen.flat.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.level.levelgen.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.level.levelgen.structure.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.level.levelgen.synth.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.level.material.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.level.newbiome.layer.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.level.pathfinder.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.level.redstone.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.level.saveddata.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.level.storage.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.level.tile.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.level.tile.piston.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.phys.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.scores.criteria.h delete mode 100644 Minecraft.World/Headers/net.minecraft.world.scores.h delete mode 100644 Minecraft.World/Items/EggItem.cpp rename Minecraft.World/{Platform => Source Files}/Minecraft.World.cpp (57%) rename Minecraft.World/{IO/Streams/Compression.cpp => Source Files/compression.cpp} (99%) rename Minecraft.World/{Platform => Source Files}/stdafx.cpp (88%) rename Minecraft.World/{IO/NBT => com/mojang/nbt}/ByteArrayTag.h (97%) rename Minecraft.World/{IO/NBT => com/mojang/nbt}/ByteTag.h (100%) rename Minecraft.World/{IO/NBT => com/mojang/nbt}/CompoundTag.h (100%) rename Minecraft.World/{IO/NBT => com/mojang/nbt}/DoubleTag.h (91%) rename Minecraft.World/{IO/NBT => com/mojang/nbt}/EndTag.h (100%) rename Minecraft.World/{IO/NBT => com/mojang/nbt}/FloatTag.h (91%) rename Minecraft.World/{IO/NBT => com/mojang/nbt}/IntArrayTag.h (97%) rename Minecraft.World/{IO/NBT => com/mojang/nbt}/IntTag.h (100%) rename Minecraft.World/{IO/NBT => com/mojang/nbt}/ListTag.h (100%) rename Minecraft.World/{IO/NBT => com/mojang/nbt}/LongTag.h (100%) rename Minecraft.World/{IO/NBT/NbtIO.cpp => com/mojang/nbt/NbtIo.cpp} (93%) rename Minecraft.World/{IO/NBT/NbtIO.h => com/mojang/nbt/NbtIo.h} (100%) rename Minecraft.World/{IO/NBT => com/mojang/nbt}/ShortTag.h (100%) rename Minecraft.World/{IO/NBT => com/mojang/nbt}/StringTag.h (100%) rename Minecraft.World/{IO/NBT => com/mojang/nbt}/Tag.cpp (98%) rename Minecraft.World/{IO/NBT => com/mojang/nbt}/Tag.h (95%) create mode 100644 Minecraft.World/com/mojang/nbt/com.mojang.nbt.h rename Minecraft.World/{Util => net/minecraft}/Direction.cpp (97%) rename Minecraft.World/{Util => net/minecraft}/Direction.h (100%) rename Minecraft.World/{Util => net/minecraft}/Facing.cpp (90%) rename Minecraft.World/{Util => net/minecraft}/Facing.h (100%) rename Minecraft.World/{Util => net/minecraft}/Pos.cpp (98%) rename Minecraft.World/{Util => net/minecraft}/Pos.h (100%) rename Minecraft.World/{Util => net/minecraft}/SharedConstants.cpp (88%) rename Minecraft.World/{Util => net/minecraft}/SharedConstants.h (95%) rename Minecraft.World/{Commands => net/minecraft/commands}/AdminLogCommand.h (90%) rename Minecraft.World/{Commands => net/minecraft/commands}/Command.cpp (83%) rename Minecraft.World/{Commands => net/minecraft/commands}/Command.h (97%) rename Minecraft.World/{Commands => net/minecraft/commands}/CommandDispatcher.cpp (91%) rename Minecraft.World/{Commands => net/minecraft/commands}/CommandDispatcher.h (100%) rename Minecraft.World/{Commands => net/minecraft/commands}/CommandSender.h (89%) rename Minecraft.World/{Commands => net/minecraft/commands}/CommandsEnum.h (100%) rename Minecraft.World/{Commands => net/minecraft/commands}/PlayerSelector.h (100%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/DefaultGameModeCommand.cpp (93%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/DefaultGameModeCommand.h (100%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/EffectCommand.cpp (94%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/EffectCommand.h (94%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/EnchantItemCommand.cpp (89%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/EnchantItemCommand.h (94%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/ExperienceCommand.cpp (85%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/ExperienceCommand.h (91%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/GameDifficultyCommand.h (100%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/GameModeCommand.cpp (95%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/GameModeCommand.h (94%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/GameRuleCommand.h (100%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/GiveItemCommand.cpp (83%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/GiveItemCommand.h (95%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/KillCommand.cpp (72%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/KillCommand.h (91%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/PlaySoundCommand.h (100%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/SetPlayerTimeoutCommand.h (100%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/ShowSeedCommand.h (100%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/SpreadPlayersCommand.h (100%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/TimeCommand.cpp (87%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/TimeCommand.h (95%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/ToggleDownfallCommand.cpp (67%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/ToggleDownfallCommand.h (94%) rename Minecraft.World/{Commands => net/minecraft/commands/common}/WeatherCommand.h (100%) create mode 100644 Minecraft.World/net/minecraft/commands/common/net.minecraft.commands.common.h create mode 100644 Minecraft.World/net/minecraft/commands/net.minecraft.commands.h rename Minecraft.World/{Core => net/minecraft/core}/AbstractProjectileDispenseBehavior.cpp (85%) rename Minecraft.World/{Core => net/minecraft/core}/AbstractProjectileDispenseBehavior.h (100%) rename Minecraft.World/{Core => net/minecraft/core}/Behavior.h (100%) rename Minecraft.World/{Core => net/minecraft/core}/BehaviorRegistry.cpp (93%) rename Minecraft.World/{Core => net/minecraft/core}/BehaviorRegistry.h (100%) rename Minecraft.World/{Core => net/minecraft/core}/BlockSource.h (100%) rename Minecraft.World/{Core => net/minecraft/core}/BlockSourceImpl.cpp (78%) rename Minecraft.World/{Core => net/minecraft/core}/BlockSourceImpl.h (100%) rename Minecraft.World/{Core => net/minecraft/core}/DefaultDispenseItemBehavior.cpp (91%) rename Minecraft.World/{Core => net/minecraft/core}/DefaultDispenseItemBehavior.h (100%) rename Minecraft.World/{Core => net/minecraft/core}/DispenseItemBehavior.cpp (86%) rename Minecraft.World/{Core => net/minecraft/core}/DispenseItemBehavior.h (100%) rename Minecraft.World/{Core => net/minecraft/core}/FacingEnum.cpp (96%) rename Minecraft.World/{Core => net/minecraft/core}/FacingEnum.h (100%) rename Minecraft.World/{Core => net/minecraft/core}/ItemDispenseBehaviors.cpp (97%) rename Minecraft.World/{Core => net/minecraft/core}/ItemDispenseBehaviors.h (100%) rename Minecraft.World/{Core => net/minecraft/core}/LocatableSource.h (100%) rename Minecraft.World/{Core => net/minecraft/core}/Location.h (100%) rename Minecraft.World/{Core => net/minecraft/core}/Position.h (100%) rename Minecraft.World/{Core => net/minecraft/core}/PositionImpl.h (100%) rename Minecraft.World/{Core => net/minecraft/core}/Source.h (100%) create mode 100644 Minecraft.World/net/minecraft/core/net.minecraft.core.h rename Minecraft.World/{Util => net/minecraft/locale}/I18n.cpp (89%) rename Minecraft.World/{Util => net/minecraft/locale}/I18n.h (83%) rename Minecraft.World/{Util => net/minecraft/locale}/Language.cpp (96%) rename Minecraft.World/{Util => net/minecraft/locale}/Language.h (100%) create mode 100644 Minecraft.World/net/minecraft/locale/net.minecraft.locale.h create mode 100644 Minecraft.World/net/minecraft/net.minecraft.h rename Minecraft.World/{Network => net/minecraft/network}/Connection.cpp (98%) rename Minecraft.World/{Network => net/minecraft/network}/Connection.h (90%) create mode 100644 Minecraft.World/net/minecraft/network/net.minecraft.network.h rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/AddEntityPacket.cpp (94%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/AddEntityPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/AddExperienceOrbPacket.cpp (84%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/AddExperienceOrbPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/AddGlobalEntityPacket.cpp (82%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/AddGlobalEntityPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/AddMobPacket.cpp (94%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/AddMobPacket.h (95%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/AddPaintingPacket.cpp (85%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/AddPaintingPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/AddPlayerPacket.cpp (94%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/AddPlayerPacket.h (96%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/AnimatePacket.cpp (79%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/AnimatePacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/AwardStatPacket.cpp (94%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/AwardStatPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/BlockRegionUpdatePacket.cpp (92%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/BlockRegionUpdatePacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ChatAutoCompletePacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ChatPacket.cpp (95%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ChatPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ChunkTilesUpdatePacket.cpp (94%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ChunkTilesUpdatePacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ChunkVisibilityAreaPacket.cpp (85%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ChunkVisibilityAreaPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ChunkVisibilityPacket.cpp (87%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ChunkVisibilityPacket.h (93%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ClientCommandPacket.cpp (93%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ClientCommandPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ClientInformationPacket.h (58%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ClientProtocolPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ComplexItemDataPacket.cpp (91%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ComplexItemDataPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ContainerAckPacket.cpp (88%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ContainerAckPacket.h (93%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ContainerButtonClickPacket.cpp (82%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ContainerButtonClickPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ContainerClickPacket.cpp (90%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ContainerClickPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ContainerClosePacket.cpp (84%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ContainerClosePacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ContainerOpenPacket.cpp (94%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ContainerOpenPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ContainerSetContentPacket.cpp (88%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ContainerSetContentPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ContainerSetDataPacket.cpp (88%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ContainerSetDataPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ContainerSetSlotPacket.cpp (88%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ContainerSetSlotPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/CraftItemPacket.cpp (80%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/CraftItemPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/CustomPayloadPacket.cpp (94%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/CustomPayloadPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/DebugOptionsPacket.cpp (79%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/DebugOptionsPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/DisconnectPacket.cpp (86%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/DisconnectPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/EntityActionAtPositionPacket.cpp (86%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/EntityActionAtPositionPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/EntityEventPacket.cpp (86%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/EntityEventPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ExplodePacket.cpp (94%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ExplodePacket.h (96%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/GameCommandPacket.cpp (92%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/GameCommandPacket.h (94%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/GameEventPacket.cpp (92%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/GameEventPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/GetInfoPacket.cpp (72%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/GetInfoPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/InteractPacket.cpp (88%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/InteractPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/KeepAlivePacket.cpp (86%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/KeepAlivePacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/KickPlayerPacket.cpp (84%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/KickPlayerPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/LevelEventPacket.cpp (90%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/LevelEventPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/LevelParticlesPacket.cpp (97%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/LevelParticlesPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/LevelSoundPacket.cpp (92%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/LevelSoundPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/LoginPacket.cpp (96%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/LoginPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/MoveEntityPacket.cpp (96%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/MoveEntityPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/MoveEntityPacketSmall.cpp (97%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/MoveEntityPacketSmall.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/MovePlayerPacket.cpp (97%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/MovePlayerPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/Packet.cpp (98%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/Packet.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/PacketListener.cpp (99%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/PacketListener.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/PlayerAbilitiesPacket.cpp (94%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/PlayerAbilitiesPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/PlayerActionPacket.cpp (91%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/PlayerActionPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/PlayerCommandPacket.cpp (89%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/PlayerCommandPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/PlayerInfoPacket.cpp (82%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/PlayerInfoPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/PlayerInputPacket.cpp (91%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/PlayerInputPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/PreLoginPacket.cpp (96%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/PreLoginPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/RemoveEntitiesPacket.cpp (85%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/RemoveEntitiesPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/RemoveMobEffectPacket.cpp (80%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/RemoveMobEffectPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/RespawnPacket.cpp (94%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/RespawnPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/RotateHeadPacket.cpp (95%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/RotateHeadPacket.h (90%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ServerAuthDataPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ServerSettingsChangedPacket.cpp (87%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/ServerSettingsChangedPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetCarriedItemPacket.cpp (86%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetCarriedItemPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetCreativeModeSlotPacket.cpp (88%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetCreativeModeSlotPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetDisplayObjectivePacket.cpp (90%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetDisplayObjectivePacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetEntityDataPacket.cpp (86%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetEntityDataPacket.h (94%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetEntityLinkPacket.cpp (88%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetEntityLinkPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetEntityMotionPacket.cpp (93%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetEntityMotionPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetEquippedItemPacket.cpp (92%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetEquippedItemPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetExperiencePacket.cpp (91%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetExperiencePacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetHealthPacket.cpp (92%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetHealthPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetObjectivePacket.cpp (90%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetObjectivePacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetPlayerTeamPacket.cpp (94%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetPlayerTeamPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetScorePacket.cpp (88%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetScorePacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetSpawnPositionPacket.cpp (89%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetSpawnPositionPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetTimePacket.cpp (90%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SetTimePacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SharedKeyPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SignUpdatePacket.cpp (88%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/SignUpdatePacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TakeItemEntityPacket.cpp (86%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TakeItemEntityPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TeleportEntityPacket.cpp (91%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TeleportEntityPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TextureAndGeometryChangePacket.cpp (87%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TextureAndGeometryChangePacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TextureAndGeometryPacket.cpp (97%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TextureAndGeometryPacket.h (91%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TextureChangePacket.cpp (84%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TextureChangePacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TexturePacket.cpp (91%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TexturePacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TileDestructionPacket.cpp (94%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TileDestructionPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TileEditorOpenPacket.cpp (95%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TileEditorOpenPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TileEntityDataPacket.cpp (90%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TileEntityDataPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TileEventPacket.cpp (85%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TileEventPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TileUpdatePacket.cpp (91%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TileUpdatePacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TradeItemPacket.cpp (85%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/TradeItemPacket.h (93%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/UpdateAttributesPacket.cpp (96%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/UpdateAttributesPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/UpdateGameRuleProgressPacket.cpp (93%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/UpdateGameRuleProgressPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/UpdateMobEffectPacket.cpp (87%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/UpdateMobEffectPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/UpdateProgressPacket.cpp (84%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/UpdateProgressPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/UseItemPacket.cpp (92%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/UseItemPacket.h (100%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/XZPacket.cpp (80%) rename Minecraft.World/{Network/Packets => net/minecraft/network/packet}/XZPacket.h (100%) create mode 100644 Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h rename Minecraft.World/{Stats => net/minecraft/stats}/Achievement.cpp (96%) rename Minecraft.World/{Stats => net/minecraft/stats}/Achievement.h (100%) rename Minecraft.World/{Stats => net/minecraft/stats}/Achievements.cpp (98%) rename Minecraft.World/{Stats => net/minecraft/stats}/Achievements.h (100%) rename Minecraft.World/{Stats => net/minecraft/stats}/CommonStats.cpp (98%) rename Minecraft.World/{Stats => net/minecraft/stats}/CommonStats.h (100%) rename Minecraft.World/{Util => net/minecraft/stats}/DescFormatter.h (100%) rename Minecraft.World/{Stats => net/minecraft/stats}/DurangoStats.h (100%) rename Minecraft.World/{Stats => net/minecraft/stats}/GeneralStat.cpp (83%) rename Minecraft.World/{Stats => net/minecraft/stats}/GeneralStat.h (100%) rename Minecraft.World/{Stats => net/minecraft/stats}/GenericStats.cpp (99%) rename Minecraft.World/{Stats => net/minecraft/stats}/GenericStats.h (99%) rename Minecraft.World/{Stats => net/minecraft/stats}/ItemStat.cpp (80%) rename Minecraft.World/{Stats => net/minecraft/stats}/ItemStat.h (100%) rename Minecraft.World/{Util => net/minecraft/stats}/NumberFormatters.h (100%) rename Minecraft.World/{Stats => net/minecraft/stats}/Stat.cpp (97%) rename Minecraft.World/{Stats => net/minecraft/stats}/Stat.h (100%) rename Minecraft.World/{Stats => net/minecraft/stats}/StatFormatter.h (100%) rename Minecraft.World/{Stats => net/minecraft/stats}/Stats.cpp (98%) rename Minecraft.World/{Stats => net/minecraft/stats}/Stats.h (100%) create mode 100644 Minecraft.World/net/minecraft/stats/net.minecraft.stats.h rename Minecraft.World/{Util => net/minecraft/util}/Hasher.cpp (97%) rename Minecraft.World/{Util => net/minecraft/util}/Hasher.h (100%) rename Minecraft.World/{Util => net/minecraft/util}/HtmlString.cpp (96%) rename Minecraft.World/{Util => net/minecraft/util}/HtmlString.h (100%) rename Minecraft.World/{Util => net/minecraft/util}/Mth.cpp (97%) rename Minecraft.World/{Util => net/minecraft/util}/Mth.h (100%) rename Minecraft.World/{Util => net/minecraft/util}/ProgressListener.h (100%) rename Minecraft.World/{Util => net/minecraft/util}/SmoothFloat.cpp (94%) rename Minecraft.World/{Util => net/minecraft/util}/SmoothFloat.h (100%) rename Minecraft.World/{Util => net/minecraft/util}/WeighedRandom.cpp (97%) rename Minecraft.World/{Util => net/minecraft/util}/WeighedRandom.h (100%) rename Minecraft.World/{Util => net/minecraft/util}/WeighedTreasure.cpp (94%) rename Minecraft.World/{Util => net/minecraft/util}/WeighedTreasure.h (100%) rename Minecraft.World/{Containers => net/minecraft/world}/CompoundContainer.cpp (94%) rename Minecraft.World/{Containers => net/minecraft/world}/CompoundContainer.h (100%) rename Minecraft.World/{Containers => net/minecraft/world}/Container.h (100%) rename Minecraft.World/{Util => net/minecraft/world}/Difficulty.h (100%) rename Minecraft.World/{Util => net/minecraft/world}/FlippedIcon.cpp (95%) rename Minecraft.World/{Util => net/minecraft/world}/FlippedIcon.h (100%) rename Minecraft.World/{Util => net/minecraft/world}/Icon.h (100%) rename Minecraft.World/{Util => net/minecraft/world}/IconRegister.h (100%) rename Minecraft.World/{Containers => net/minecraft/world}/MouseInventoryClickHandler.h (100%) rename Minecraft.World/{Containers => net/minecraft/world}/SimpleContainer.cpp (95%) rename Minecraft.World/{Containers => net/minecraft/world}/SimpleContainer.h (96%) rename Minecraft.World/{Containers => net/minecraft/world}/WorldlyContainer.h (100%) rename Minecraft.World/{Util => net/minecraft/world/damageSource}/CombatEntry.cpp (91%) rename Minecraft.World/{Util => net/minecraft/world/damageSource}/CombatEntry.h (100%) rename Minecraft.World/{Util => net/minecraft/world/damageSource}/CombatTracker.cpp (96%) rename Minecraft.World/{Util => net/minecraft/world/damageSource}/CombatTracker.h (97%) rename Minecraft.World/{Util => net/minecraft/world/damageSource}/DamageSource.cpp (94%) rename Minecraft.World/{Util => net/minecraft/world/damageSource}/DamageSource.h (98%) rename Minecraft.World/{Entities => net/minecraft/world/damageSource}/EntityDamageSource.cpp (88%) rename Minecraft.World/{Entities => net/minecraft/world/damageSource}/EntityDamageSource.h (96%) rename Minecraft.World/{Entities => net/minecraft/world/damageSource}/IndirectEntityDamageSource.cpp (89%) rename Minecraft.World/{Entities => net/minecraft/world/damageSource}/IndirectEntityDamageSource.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/damageSource/net.minecraft.world.damagesource.h rename Minecraft.World/{Entities => net/minecraft/world/effect}/AbsoptionMobEffect.cpp (86%) rename Minecraft.World/{Entities => net/minecraft/world/effect}/AbsoptionMobEffect.h (100%) rename Minecraft.World/{Entities => net/minecraft/world/effect}/AttackDamageMobEffect.cpp (91%) rename Minecraft.World/{Entities => net/minecraft/world/effect}/AttackDamageMobEffect.h (100%) rename Minecraft.World/{Entities => net/minecraft/world/effect}/HealthBoostMobEffect.cpp (85%) rename Minecraft.World/{Entities => net/minecraft/world/effect}/HealthBoostMobEffect.h (100%) rename Minecraft.World/{Entities => net/minecraft/world/effect}/InstantaneousMobEffect.cpp (83%) rename Minecraft.World/{Entities => net/minecraft/world/effect}/InstantaneousMobEffect.h (100%) rename Minecraft.World/{Entities => net/minecraft/world/effect}/MobEffect.cpp (97%) rename Minecraft.World/{Entities => net/minecraft/world/effect}/MobEffect.h (98%) rename Minecraft.World/{Entities => net/minecraft/world/effect}/MobEffectInstance.cpp (98%) rename Minecraft.World/{Entities => net/minecraft/world/effect}/MobEffectInstance.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/effect/net.minecraft.world.effect.h rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity}/AgeableMob.cpp (91%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity}/AgeableMob.h (96%) create mode 100644 Minecraft.World/net/minecraft/world/entity/Creature.cpp rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity}/Creature.h (76%) rename Minecraft.World/{Util => net/minecraft/world/entity}/DelayedRelease.cpp (88%) rename Minecraft.World/{Util => net/minecraft/world/entity}/DelayedRelease.h (95%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/Entity.cpp (97%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/Entity.h (98%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/EntityEvent.h (100%) rename Minecraft.World/{Level/Storage => net/minecraft/world/entity}/EntityIO.cpp (95%) rename Minecraft.World/{Level/Storage => net/minecraft/world/entity}/EntityIO.h (97%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/EntityPos.cpp (96%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/EntityPos.h (100%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/EntitySelector.cpp (94%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/EntitySelector.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity}/ExperienceOrb.cpp (92%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity}/ExperienceOrb.h (98%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/FlyingMob.cpp (91%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/FlyingMob.h (100%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/HangingEntity.cpp (95%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/HangingEntity.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity}/ItemFrame.cpp (88%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity}/ItemFrame.h (95%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/LeashFenceKnotEntity.cpp (95%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/LeashFenceKnotEntity.h (100%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/LivingEntity.cpp (96%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/LivingEntity.h (99%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/Mob.cpp (94%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/Mob.h (99%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/MobCategory.cpp (93%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/MobCategory.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity}/MobGroupData.h (100%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/MobType.h (100%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/OwnableEntity.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity}/Painting.cpp (91%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity}/Painting.h (98%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/PathfinderMob.cpp (95%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/PathfinderMob.h (100%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/SyncedEntityData.cpp (98%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/SyncedEntityData.h (100%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/TamableAnimal.cpp (94%) rename Minecraft.World/{Entities => net/minecraft/world/entity}/TamableAnimal.h (97%) rename Minecraft.World/{AI/Attributes => net/minecraft/world/entity/ai/attributes}/Attribute.cpp (90%) rename Minecraft.World/{AI/Attributes => net/minecraft/world/entity/ai/attributes}/Attribute.h (100%) rename Minecraft.World/{AI/Attributes => net/minecraft/world/entity/ai/attributes}/AttributeInstance.h (100%) rename Minecraft.World/{AI/Attributes => net/minecraft/world/entity/ai/attributes}/AttributeModifier.cpp (97%) rename Minecraft.World/{AI/Attributes => net/minecraft/world/entity/ai/attributes}/AttributeModifier.h (100%) rename Minecraft.World/{AI/Attributes => net/minecraft/world/entity/ai/attributes}/BaseAttribute.cpp (90%) rename Minecraft.World/{AI/Attributes => net/minecraft/world/entity/ai/attributes}/BaseAttribute.h (100%) rename Minecraft.World/{AI/Attributes => net/minecraft/world/entity/ai/attributes}/BaseAttributeMap.cpp (94%) rename Minecraft.World/{AI/Attributes => net/minecraft/world/entity/ai/attributes}/BaseAttributeMap.h (100%) rename Minecraft.World/{AI/Attributes => net/minecraft/world/entity/ai/attributes}/ModifiableAttributeInstance.cpp (97%) rename Minecraft.World/{AI/Attributes => net/minecraft/world/entity/ai/attributes}/ModifiableAttributeInstance.h (100%) rename Minecraft.World/{AI/Attributes => net/minecraft/world/entity/ai/attributes}/RangedAttribute.cpp (94%) rename Minecraft.World/{AI/Attributes => net/minecraft/world/entity/ai/attributes}/RangedAttribute.h (100%) rename Minecraft.World/{AI/Attributes => net/minecraft/world/entity/ai/attributes}/ServersideAttributeMap.cpp (97%) rename Minecraft.World/{AI/Attributes => net/minecraft/world/entity/ai/attributes}/ServersideAttributeMap.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/entity/ai/attributes/net.minecraft.world.entity.ai.attributes.h rename Minecraft.World/{AI/Control => net/minecraft/world/entity/ai/control}/BodyControl.cpp (90%) rename Minecraft.World/{AI/Control => net/minecraft/world/entity/ai/control}/BodyControl.h (100%) rename Minecraft.World/{AI/Control => net/minecraft/world/entity/ai/control}/Control.h (100%) rename Minecraft.World/{AI/Control => net/minecraft/world/entity/ai/control}/JumpControl.cpp (69%) rename Minecraft.World/{AI/Control => net/minecraft/world/entity/ai/control}/JumpControl.h (100%) rename Minecraft.World/{AI/Control => net/minecraft/world/entity/ai/control}/LookControl.cpp (91%) rename Minecraft.World/{AI/Control => net/minecraft/world/entity/ai/control}/LookControl.h (100%) rename Minecraft.World/{AI/Control => net/minecraft/world/entity/ai/control}/MoveControl.cpp (82%) rename Minecraft.World/{AI/Control => net/minecraft/world/entity/ai/control}/MoveControl.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/entity/ai/control/net.minecraft.world.entity.ai.control.h rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/AvoidPlayerGoal.cpp (84%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/AvoidPlayerGoal.h (96%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/BegGoal.cpp (82%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/BegGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/BreakDoorGoal.cpp (85%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/BreakDoorGoal.h (90%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/BreedGoal.cpp (90%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/BreedGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/ControlledByPlayerGoal.cpp (91%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/ControlledByPlayerGoal.h (93%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/DoorInteractGoal.cpp (83%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/DoorInteractGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/EatTileGoal.cpp (84%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/EatTileGoal.h (94%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/FleeSunGoal.cpp (80%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/FleeSunGoal.h (94%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/FloatGoal.cpp (62%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/FloatGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/FollowOwnerGoal.cpp (87%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/FollowOwnerGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/FollowParentGoal.cpp (85%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/FollowParentGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/Goal.cpp (88%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/Goal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/GoalSelector.cpp (98%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/GoalSelector.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/InteractGoal.cpp (84%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/InteractGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/LeapAtTargetGoal.cpp (87%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/LeapAtTargetGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/LookAtPlayerGoal.cpp (87%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/LookAtPlayerGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/LookAtTradingPlayerGoal.cpp (72%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/LookAtTradingPlayerGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/MakeLoveGoal.cpp (88%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/MakeLoveGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/MeleeAttackGoal.cpp (84%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/MeleeAttackGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/MoveIndoorsGoal.cpp (82%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/MoveIndoorsGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/MoveThroughVillageGoal.cpp (90%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/MoveThroughVillageGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/MoveTowardsRestrictionGoal.cpp (75%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/MoveTowardsRestrictionGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/MoveTowardsTargetGoal.cpp (81%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/MoveTowardsTargetGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/OcelotAttackGoal.cpp (83%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/OcelotAttackGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/OcelotSitOnTileGoal.cpp (86%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/OcelotSitOnTileGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/OfferFlowerGoal.cpp (76%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/OfferFlowerGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/OpenDoorGoal.cpp (79%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/OpenDoorGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/PanicGoal.cpp (76%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/PanicGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/PlayGoal.cpp (84%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/PlayGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/RandomLookAroundGoal.cpp (84%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/RandomLookAroundGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/RandomStrollGoal.cpp (85%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/RandomStrollGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/RangedAttackGoal.cpp (89%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/RangedAttackGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/RestrictOpenDoorGoal.cpp (85%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/RestrictOpenDoorGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/RestrictSunGoal.cpp (60%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/RestrictSunGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/RunAroundLikeCrazyGoal.cpp (81%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/RunAroundLikeCrazyGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/SitGoal.cpp (74%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/SitGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/SwellGoal.cpp (76%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/SwellGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/TakeFlowerGoal.cpp (81%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/TakeFlowerGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/TemptGoal.cpp (88%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/TemptGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/TradeWithPlayerGoal.cpp (76%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal}/TradeWithPlayerGoal.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/entity/ai/goal/net.minecraft.world.entity.ai.goal.h rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal/target}/DefendVillageTargetGoal.cpp (86%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal/target}/DefendVillageTargetGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal/target}/HurtByTargetGoal.cpp (86%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal/target}/HurtByTargetGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal/target}/NearestAttackableTargetGoal.cpp (92%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal/target}/NearestAttackableTargetGoal.h (96%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal/target}/NonTameRandomTargetGoal.cpp (77%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal/target}/NonTameRandomTargetGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal/target}/OwnerHurtByTargetGoal.cpp (87%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal/target}/OwnerHurtByTargetGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal/target}/OwnerHurtTargetGoal.cpp (86%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal/target}/OwnerHurtTargetGoal.h (100%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal/target}/TargetGoal.cpp (84%) rename Minecraft.World/{AI/Goals => net/minecraft/world/entity/ai/goal/target}/TargetGoal.h (98%) create mode 100644 Minecraft.World/net/minecraft/world/entity/ai/goal/target/net.minecraft.world.entity.ai.goal.target.h rename Minecraft.World/{AI/Navigation => net/minecraft/world/entity/ai/navigation}/PathNavigation.cpp (94%) rename Minecraft.World/{AI/Navigation => net/minecraft/world/entity/ai/navigation}/PathNavigation.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/entity/ai/navigation/net.minecraft.world.entity.ai.navigation.h rename Minecraft.World/{AI/Control => net/minecraft/world/entity/ai/sensing}/Sensing.cpp (89%) rename Minecraft.World/{AI/Control => net/minecraft/world/entity/ai/sensing}/Sensing.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/entity/ai/sensing/net.minecraft.world.entity.ai.sensing.h rename Minecraft.World/{AI/Navigation => net/minecraft/world/entity/ai/util}/RandomPos.cpp (95%) rename Minecraft.World/{AI/Navigation => net/minecraft/world/entity/ai/util}/RandomPos.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/entity/ai/util/net.minecraft.world.entity.ai.util.h rename Minecraft.World/{Entities => net/minecraft/world/entity/ai/village}/DoorInfo.cpp (95%) rename Minecraft.World/{Entities => net/minecraft/world/entity/ai/village}/DoorInfo.h (100%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/entity/ai/village}/Village.cpp (97%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/entity/ai/village}/Village.h (100%) rename Minecraft.World/{Level/Events => net/minecraft/world/entity/ai/village}/VillageSiege.cpp (94%) rename Minecraft.World/{Level/Events => net/minecraft/world/entity/ai/village}/VillageSiege.h (100%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/entity/ai/village}/Villages.cpp (96%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/entity/ai/village}/Villages.h (95%) create mode 100644 Minecraft.World/net/minecraft/world/entity/ai/village/net.minecraft.world.entity.ai.village.h rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/ambient}/AmbientCreature.cpp (83%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/ambient}/AmbientCreature.h (90%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/ambient}/Bat.cpp (93%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/ambient}/Bat.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/entity/ambient/net.minecraft.world.entity.ambient.h rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/Animal.cpp (95%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/Animal.h (98%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/Chicken.cpp (85%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/Chicken.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/Cow.cpp (81%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/Cow.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/EntityHorse.cpp (97%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/EntityHorse.h (98%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/Golem.cpp (88%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/Golem.h (94%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/MushroomCow.cpp (87%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/MushroomCow.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/Ocelot.cpp (89%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/Ocelot.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/Pig.cpp (83%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/Pig.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/Sheep.cpp (89%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/Sheep.h (95%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/SnowMan.cpp (75%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/SnowMan.h (94%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/Squid.cpp (87%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/Squid.h (97%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/VillagerGolem.cpp (87%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/VillagerGolem.h (100%) rename Minecraft.World/{Entities => net/minecraft/world/entity/animal}/WaterAnimal.cpp (76%) rename Minecraft.World/{Entities => net/minecraft/world/entity/animal}/WaterAnimal.h (87%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/Wolf.cpp (93%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/animal}/Wolf.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/boss}/BossMob.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/boss}/MultiEntityMob.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/boss}/MultiEntityMobPart.cpp (95%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/boss}/MultiEntityMobPart.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/boss/enderdragon}/EnderCrystal.cpp (90%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/boss/enderdragon}/EnderCrystal.h (97%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/boss/enderdragon}/EnderDragon.cpp (98%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/boss/enderdragon}/EnderDragon.h (98%) create mode 100644 Minecraft.World/net/minecraft/world/entity/boss/enderdragon/net.minecraft.world.entity.boss.enderdragon.h create mode 100644 Minecraft.World/net/minecraft/world/entity/boss/net.minecraft.world.entity.boss.h rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/boss/wither}/WitherBoss.cpp (94%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/boss/wither}/WitherBoss.h (96%) create mode 100644 Minecraft.World/net/minecraft/world/entity/global/GlobalEntity.cpp rename Minecraft.World/{Entities => net/minecraft/world/entity/global}/GlobalEntity.h (87%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/global}/LightningBolt.cpp (90%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/global}/LightningBolt.h (87%) create mode 100644 Minecraft.World/net/minecraft/world/entity/global/net.minecraft.world.entity.global.h rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/item}/Boat.cpp (95%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/item}/Boat.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/entity/item}/FallingTile.cpp (96%) rename Minecraft.World/{Blocks => net/minecraft/world/entity/item}/FallingTile.h (97%) rename Minecraft.World/{Entities => net/minecraft/world/entity/item}/ItemEntity.cpp (92%) rename Minecraft.World/{Entities => net/minecraft/world/entity/item}/ItemEntity.h (96%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/item}/Minecart.cpp (96%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/item}/Minecart.h (100%) rename Minecraft.World/{Entities => net/minecraft/world/entity/item}/MinecartChest.cpp (85%) rename Minecraft.World/{Entities => net/minecraft/world/entity/item}/MinecartChest.h (100%) rename Minecraft.World/{Entities => net/minecraft/world/entity/item}/MinecartContainer.cpp (95%) rename Minecraft.World/{Entities => net/minecraft/world/entity/item}/MinecartContainer.h (95%) rename Minecraft.World/{Entities => net/minecraft/world/entity/item}/MinecartFurnace.cpp (90%) rename Minecraft.World/{Entities => net/minecraft/world/entity/item}/MinecartFurnace.h (97%) rename Minecraft.World/{Entities => net/minecraft/world/entity/item}/MinecartHopper.cpp (87%) rename Minecraft.World/{Entities => net/minecraft/world/entity/item}/MinecartHopper.h (98%) rename Minecraft.World/{Entities => net/minecraft/world/entity/item}/MinecartRideable.cpp (83%) rename Minecraft.World/{Entities => net/minecraft/world/entity/item}/MinecartRideable.h (93%) rename Minecraft.World/{Entities => net/minecraft/world/entity/item}/MinecartSpawner.cpp (92%) rename Minecraft.World/{Entities => net/minecraft/world/entity/item}/MinecartSpawner.h (94%) rename Minecraft.World/{Entities => net/minecraft/world/entity/item}/MinecartTNT.cpp (94%) rename Minecraft.World/{Entities => net/minecraft/world/entity/item}/MinecartTNT.h (97%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/item}/PrimedTnt.cpp (90%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/item}/PrimedTnt.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Blaze.cpp (88%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Blaze.h (97%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/CaveSpider.cpp (77%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/CaveSpider.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Creeper.cpp (83%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Creeper.h (98%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/EnderMan.cpp (94%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/EnderMan.h (98%) rename Minecraft.World/{Entities => net/minecraft/world/entity/monster}/Enemy.cpp (83%) rename Minecraft.World/{Entities => net/minecraft/world/entity/monster}/Enemy.h (89%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Ghast.cpp (88%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Ghast.h (98%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Giant.cpp (71%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Giant.h (93%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/LavaSlime.cpp (86%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/LavaSlime.h (100%) rename Minecraft.World/{Entities => net/minecraft/world/entity/monster}/Monster.cpp (87%) rename Minecraft.World/{Entities => net/minecraft/world/entity/monster}/Monster.h (96%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/PigZombie.cpp (85%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/PigZombie.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/RangedAttackMob.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/SharedMonsterAttributes.cpp (97%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/SharedMonsterAttributes.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Silverfish.cpp (92%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Silverfish.h (97%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Skeleton.cpp (88%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Skeleton.h (98%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Slime.cpp (89%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Slime.h (95%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Spider.cpp (88%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Spider.h (96%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Witch.cpp (91%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Witch.h (98%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Zombie.cpp (94%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/monster}/Zombie.h (96%) create mode 100644 Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h create mode 100644 Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h rename Minecraft.World/{Containers => net/minecraft/world/entity/npc}/ClientSideMerchant.cpp (88%) rename Minecraft.World/{Containers => net/minecraft/world/entity/npc}/ClientSideMerchant.h (95%) create mode 100644 Minecraft.World/net/minecraft/world/entity/npc/Npc.cpp rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/npc}/Npc.h (76%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/npc}/Villager.cpp (96%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/npc}/Villager.h (97%) create mode 100644 Minecraft.World/net/minecraft/world/entity/npc/net.minecraft.world.entity.npc.h rename Minecraft.World/{Player => net/minecraft/world/entity/player}/Abilities.cpp (93%) rename Minecraft.World/{Player => net/minecraft/world/entity/player}/Abilities.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/entity/player}/Inventory.cpp (98%) rename Minecraft.World/{Containers => net/minecraft/world/entity/player}/Inventory.h (96%) rename Minecraft.World/{Player => net/minecraft/world/entity/player}/Player.cpp (97%) rename Minecraft.World/{Player => net/minecraft/world/entity/player}/Player.h (98%) create mode 100644 Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/Arrow.cpp (94%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/Arrow.h (98%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/DragonFireball.cpp (86%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/DragonFireball.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/EyeOfEnderSignal.cpp (91%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/EyeOfEnderSignal.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/Fireball.cpp (94%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/Fireball.h (96%) rename Minecraft.World/{Entities => net/minecraft/world/entity/projectile}/FireworksRocketEntity.cpp (96%) rename Minecraft.World/{Entities => net/minecraft/world/entity/projectile}/FireworksRocketEntity.h (97%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/FishingHook.cpp (94%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/FishingHook.h (100%) rename Minecraft.World/{Entities => net/minecraft/world/entity/projectile}/LargeFireball.cpp (87%) rename Minecraft.World/{Entities => net/minecraft/world/entity/projectile}/LargeFireball.h (96%) rename Minecraft.World/{Entities => net/minecraft/world/entity/projectile}/Projectile.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/SmallFireball.cpp (86%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/SmallFireball.h (100%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/Snowball.cpp (79%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/Snowball.h (94%) rename Minecraft.World/{Entities => net/minecraft/world/entity/projectile}/Throwable.cpp (95%) rename Minecraft.World/{Entities => net/minecraft/world/entity/projectile}/Throwable.h (98%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/ThrownEgg.cpp (84%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/ThrownEgg.h (93%) rename Minecraft.World/{Entities/Mobs/ThrownEnderPearl.cpp => net/minecraft/world/entity/projectile/ThrownEnderpearl.cpp} (84%) rename Minecraft.World/{Entities/Mobs/ThrownEnderPearl.h => net/minecraft/world/entity/projectile/ThrownEnderpearl.h} (94%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/ThrownExpBottle.cpp (82%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/ThrownExpBottle.h (95%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/ThrownPotion.cpp (92%) rename Minecraft.World/{Entities/Mobs => net/minecraft/world/entity/projectile}/ThrownPotion.h (97%) rename Minecraft.World/{Entities => net/minecraft/world/entity/projectile}/WitherSkull.cpp (88%) rename Minecraft.World/{Entities => net/minecraft/world/entity/projectile}/WitherSkull.h (97%) create mode 100644 Minecraft.World/net/minecraft/world/entity/projectile/net.minecraft.world.entity.projectile.h rename Minecraft.World/{Util => net/minecraft/world/food}/FoodConstants.cpp (97%) rename Minecraft.World/{Util => net/minecraft/world/food}/FoodConstants.h (100%) rename Minecraft.World/{Player => net/minecraft/world/food}/FoodData.cpp (91%) rename Minecraft.World/{Player => net/minecraft/world/food}/FoodData.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/food/net.minecraft.world.food.h rename Minecraft.World/{Containers => net/minecraft/world/inventory}/AbstractContainerMenu.cpp (99%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/AbstractContainerMenu.h (97%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/AnimalChest.cpp (88%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/AnimalChest.h (88%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/AnvilMenu.cpp (97%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/AnvilMenu.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/ArmorSlot.cpp (85%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/ArmorSlot.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/BeaconMenu.cpp (95%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/BeaconMenu.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/BrewingStandMenu.cpp (96%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/BrewingStandMenu.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/ContainerMenu.cpp (90%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/ContainerMenu.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/CraftingContainer.cpp (94%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/CraftingContainer.h (97%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/CraftingMenu.cpp (93%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/CraftingMenu.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/EnchantmentContainer.cpp (85%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/EnchantmentContainer.h (93%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/EnchantmentMenu.cpp (95%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/EnchantmentMenu.h (96%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/EnchantmentSlot.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/FireworksMenu.cpp (93%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/FireworksMenu.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/FurnaceMenu.cpp (94%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/FurnaceMenu.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/FurnaceResultSlot.cpp (85%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/FurnaceResultSlot.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/HopperMenu.cpp (95%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/HopperMenu.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/HorseInventoryMenu.cpp (96%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/HorseInventoryMenu.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/InventoryMenu.cpp (97%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/InventoryMenu.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/MenuBackup.cpp (89%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/MenuBackup.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/MerchantContainer.cpp (97%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/MerchantContainer.h (93%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/MerchantMenu.cpp (93%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/MerchantMenu.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/MerchantResultSlot.cpp (95%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/MerchantResultSlot.h (100%) rename Minecraft.World/{Player => net/minecraft/world/inventory}/PlayerEnderChestContainer.cpp (92%) rename Minecraft.World/{Player => net/minecraft/world/inventory}/PlayerEnderChestContainer.h (93%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/RepairContainer.cpp (91%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/RepairContainer.h (92%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/RepairResultSlot.cpp (90%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/RepairResultSlot.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/ResultContainer.cpp (93%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/ResultContainer.h (97%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/ResultSlot.cpp (93%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/ResultSlot.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/Slot.cpp (95%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/Slot.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/TrapMenu.cpp (89%) rename Minecraft.World/{Containers => net/minecraft/world/inventory}/TrapMenu.h (100%) rename Minecraft.World/{Headers => net/minecraft/world/inventory}/net.minecraft.world.inventory.ContainerListener.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/AnvilTileItem.cpp (80%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/AnvilTileItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/ArmorItem.cpp (94%) rename Minecraft.World/{Items => net/minecraft/world/item}/ArmorItem.h (98%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/AuxDataTileItem.cpp (78%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/AuxDataTileItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/BedItem.cpp (85%) rename Minecraft.World/{Items => net/minecraft/world/item}/BedItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/BoatItem.cpp (92%) rename Minecraft.World/{Items => net/minecraft/world/item}/BoatItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/BookItem.cpp (83%) rename Minecraft.World/{Items => net/minecraft/world/item}/BookItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/BottleItem.cpp (88%) rename Minecraft.World/{Items => net/minecraft/world/item}/BottleItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/BowItem.cpp (88%) rename Minecraft.World/{Items => net/minecraft/world/item}/BowItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/BowlFoodItem.cpp (80%) rename Minecraft.World/{Items => net/minecraft/world/item}/BowlFoodItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/BucketItem.cpp (88%) rename Minecraft.World/{Items => net/minecraft/world/item}/BucketItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/CarrotOnAStickItem.cpp (81%) rename Minecraft.World/{Items => net/minecraft/world/item}/CarrotOnAStickItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/ClockItem.cpp (78%) rename Minecraft.World/{Items => net/minecraft/world/item}/ClockItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/CoalItem.cpp (72%) rename Minecraft.World/{Items => net/minecraft/world/item}/CoalItem.h (100%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/ColoredTileItem.cpp (94%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/ColoredTileItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/CompassItem.cpp (78%) rename Minecraft.World/{Items => net/minecraft/world/item}/CompassItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/ComplexItem.cpp (57%) rename Minecraft.World/{Items => net/minecraft/world/item}/ComplexItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/DiggerItem.cpp (86%) rename Minecraft.World/{Items => net/minecraft/world/item}/DiggerItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/DoorItem.cpp (85%) rename Minecraft.World/{Items => net/minecraft/world/item}/DoorItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/DyePowderItem.cpp (94%) rename Minecraft.World/{Items => net/minecraft/world/item}/DyePowderItem.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/item/EggItem.cpp rename Minecraft.World/{Items => net/minecraft/world/item}/EggItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/EmptyMapItem.cpp (89%) rename Minecraft.World/{Items => net/minecraft/world/item}/EmptyMapItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/EnchantedBookItem.cpp (96%) rename Minecraft.World/{Items => net/minecraft/world/item}/EnchantedBookItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/EnderEyeItem.cpp (94%) rename Minecraft.World/{Items => net/minecraft/world/item}/EnderEyeItem.h (100%) rename Minecraft.World/{Items/EnderPearlItem.cpp => net/minecraft/world/item/EnderpearlItem.cpp} (76%) rename Minecraft.World/{Items/EnderPearlItem.h => net/minecraft/world/item/EnderpearlItem.h} (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/ExperienceItem.cpp (73%) rename Minecraft.World/{Items => net/minecraft/world/item}/ExperienceItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/FireChargeItem.cpp (79%) rename Minecraft.World/{Items => net/minecraft/world/item}/FireChargeItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/FireworksChargeItem.cpp (98%) rename Minecraft.World/{Items => net/minecraft/world/item}/FireworksChargeItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/FireworksItem.cpp (91%) rename Minecraft.World/{Items => net/minecraft/world/item}/FireworksItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/FishingRodItem.cpp (68%) rename Minecraft.World/{Items => net/minecraft/world/item}/FishingRodItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/FlintAndSteelItem.cpp (83%) rename Minecraft.World/{Items => net/minecraft/world/item}/FlintAndSteelItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/FoodItem.cpp (88%) rename Minecraft.World/{Items => net/minecraft/world/item}/FoodItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/GoldenAppleItem.cpp (88%) rename Minecraft.World/{Items => net/minecraft/world/item}/GoldenAppleItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/HangingEntityItem.cpp (88%) rename Minecraft.World/{Items => net/minecraft/world/item}/HangingEntityItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/HatchetItem.cpp (91%) rename Minecraft.World/{Items => net/minecraft/world/item}/HatchetItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/HoeItem.cpp (87%) rename Minecraft.World/{Items => net/minecraft/world/item}/HoeItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/Item.cpp (99%) rename Minecraft.World/{Items => net/minecraft/world/item}/Item.h (99%) rename Minecraft.World/{Items => net/minecraft/world/item}/ItemInstance.cpp (97%) rename Minecraft.World/{Items => net/minecraft/world/item}/ItemInstance.h (98%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/LeafTileItem.cpp (85%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/LeafTileItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/LeashItem.cpp (90%) rename Minecraft.World/{Items => net/minecraft/world/item}/LeashItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/MapItem.cpp (93%) rename Minecraft.World/{Items => net/minecraft/world/item}/MapItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/MilkBucketItem.cpp (86%) rename Minecraft.World/{Items => net/minecraft/world/item}/MilkBucketItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/MinecartItem.cpp (92%) rename Minecraft.World/{Items => net/minecraft/world/item}/MinecartItem.h (94%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/MultiTextureTileItem.cpp (90%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/MultiTextureTileItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/NameTagItem.cpp (88%) rename Minecraft.World/{Items => net/minecraft/world/item}/NameTagItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/PickaxeItem.cpp (96%) rename Minecraft.World/{Items => net/minecraft/world/item}/PickaxeItem.h (100%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/PistonTileItem.cpp (64%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/PistonTileItem.h (100%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/PlanterTileItem.cpp (90%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/PlanterTileItem.h (95%) rename Minecraft.World/{Items => net/minecraft/world/item}/PotionItem.cpp (95%) rename Minecraft.World/{Items => net/minecraft/world/item}/PotionItem.h (100%) rename Minecraft.World/{Util => net/minecraft/world/item}/Rarity.cpp (89%) rename Minecraft.World/{Util => net/minecraft/world/item}/Rarity.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/RecordingItem.cpp (87%) rename Minecraft.World/{Items => net/minecraft/world/item}/RecordingItem.h (100%) rename Minecraft.World/{Items/RedstoneItem.cpp => net/minecraft/world/item/RedStoneItem.cpp} (82%) rename Minecraft.World/{Items/RedstoneItem.h => net/minecraft/world/item/RedStoneItem.h} (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/SaddleItem.cpp (81%) rename Minecraft.World/{Items => net/minecraft/world/item}/SaddleItem.h (100%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/SaplingTileItem.cpp (87%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/SaplingTileItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/SeedFoodItem.cpp (84%) rename Minecraft.World/{Items => net/minecraft/world/item}/SeedFoodItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/SeedItem.cpp (82%) rename Minecraft.World/{Items => net/minecraft/world/item}/SeedItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/ShearsItem.cpp (90%) rename Minecraft.World/{Items => net/minecraft/world/item}/ShearsItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/ShovelItem.cpp (88%) rename Minecraft.World/{Items => net/minecraft/world/item}/ShovelItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/SignItem.cpp (85%) rename Minecraft.World/{Items => net/minecraft/world/item}/SignItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/SimpleFoiledItem.cpp (80%) rename Minecraft.World/{Items => net/minecraft/world/item}/SimpleFoiledItem.h (100%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/SkullItem.cpp (91%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/SkullItem.h (98%) rename Minecraft.World/{Items => net/minecraft/world/item}/SnowItem.cpp (88%) rename Minecraft.World/{Items => net/minecraft/world/item}/SnowItem.h (90%) rename Minecraft.World/{Items => net/minecraft/world/item}/SnowballItem.cpp (67%) rename Minecraft.World/{Items => net/minecraft/world/item}/SnowballItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/SpawnEggItem.cpp (95%) rename Minecraft.World/{Items => net/minecraft/world/item}/SpawnEggItem.h (100%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/StoneSlabTileItem.cpp (92%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/StoneSlabTileItem.h (96%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/TileItem.cpp (94%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/TileItem.h (98%) rename Minecraft.World/{Util => net/minecraft/world/item}/UseAnim.h (100%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/WaterLilyTileItem.cpp (86%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/WaterLilyTileItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/WeaponItem.cpp (88%) rename Minecraft.World/{Items => net/minecraft/world/item}/WeaponItem.h (100%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/WoolTileItem.cpp (96%) rename Minecraft.World/{Items/TileItems => net/minecraft/world/item}/WoolTileItem.h (100%) rename Minecraft.World/{Items => net/minecraft/world/item}/WrittenBookItem.h (100%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/item/alchemy}/PotionBrewing.cpp (99%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/item/alchemy}/PotionBrewing.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/item/alchemy/net.minecraft.world.item.alchemy.h rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/ArmorDyeRecipe.cpp (95%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/ArmorDyeRecipe.h (100%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/ArmorRecipes.cpp (97%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/ArmorRecipes.h (100%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/ClothDyeRecipes.cpp (96%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/ClothDyeRecipes.h (100%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/FireworksRecipe.cpp (99%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/FireworksRecipe.h (100%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/FoodRecipes.cpp (95%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/FoodRecipes.h (100%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/FurnaceRecipes.cpp (96%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/FurnaceRecipes.h (100%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/MapCloningRecipe.h (100%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/MapExtendingRecipe.h (100%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/OreRecipes.cpp (91%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/OreRecipes.h (100%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/Recipes.cpp (99%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/Recipes.h (100%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/Recipy.h (97%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/ShapedRecipy.cpp (97%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/ShapedRecipy.h (100%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/ShapelessRecipy.cpp (96%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/ShapelessRecipy.h (100%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/StructureRecipes.cpp (96%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/StructureRecipes.h (100%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/ToolRecipes.cpp (95%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/ToolRecipes.h (100%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/WeaponRecipes.cpp (95%) rename Minecraft.World/{Recipes => net/minecraft/world/item/crafting}/WeaponRecipes.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/item/crafting/net.minecraft.world.item.crafting.h rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/ArrowDamageEnchantment.cpp (90%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/ArrowDamageEnchantment.h (100%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/ArrowFireEnchantment.cpp (89%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/ArrowFireEnchantment.h (100%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/ArrowInfiniteEnchantment.cpp (89%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/ArrowInfiniteEnchantment.h (100%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/ArrowKnockbackEnchantment.cpp (90%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/ArrowKnockbackEnchantment.h (100%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/DamageEnchantment.cpp (92%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/DamageEnchantment.h (100%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/DigDurabilityEnchantment.cpp (91%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/DigDurabilityEnchantment.h (100%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/DiggingEnchantment.cpp (87%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/DiggingEnchantment.h (100%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/Enchantment.cpp (97%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/Enchantment.h (100%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/EnchantmentCategory.cpp (94%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/EnchantmentCategory.h (100%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/EnchantmentHelper.cpp (97%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/EnchantmentHelper.h (100%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/EnchantmentInstance.cpp (85%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/EnchantmentInstance.h (87%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/FireAspectEnchantment.cpp (90%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/FireAspectEnchantment.h (100%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/KnockbackEnchantment.cpp (90%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/KnockbackEnchantment.h (100%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/LootBonusEnchantment.cpp (94%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/LootBonusEnchantment.h (100%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/OxygenEnchantment.cpp (89%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/OxygenEnchantment.h (100%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/ProtectionEnchantment.cpp (92%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/ProtectionEnchantment.h (100%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/ThornsEnchantment.cpp (86%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/ThornsEnchantment.h (100%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/UntouchingEnchantment.cpp (89%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/UntouchingEnchantment.h (100%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/WaterWorkerEnchantment.cpp (90%) rename Minecraft.World/{Enchantments => net/minecraft/world/item/enchantment}/WaterWorkerEnchantment.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/item/enchantment/net.minecraft.world.item.enchantment.h create mode 100644 Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h rename Minecraft.World/{Containers => net/minecraft/world/item/trading}/Merchant.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/item/trading}/MerchantRecipe.cpp (98%) rename Minecraft.World/{Containers => net/minecraft/world/item/trading}/MerchantRecipe.h (100%) rename Minecraft.World/{Containers => net/minecraft/world/item/trading}/MerchantRecipeList.cpp (98%) rename Minecraft.World/{Containers => net/minecraft/world/item/trading}/MerchantRecipeList.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/item/trading/net.minecraft.world.item.trading.h rename Minecraft.World/{Level => net/minecraft/world/level}/BaseMobSpawner.cpp (97%) rename Minecraft.World/{Level => net/minecraft/world/level}/BaseMobSpawner.h (97%) rename Minecraft.World/{Level => net/minecraft/world/level}/BlockDestructionProgress.cpp (95%) rename Minecraft.World/{Level => net/minecraft/world/level}/BlockDestructionProgress.h (100%) rename Minecraft.World/{Level => net/minecraft/world/level}/Calendar.cpp (86%) rename Minecraft.World/{Level => net/minecraft/world/level}/Calendar.h (100%) rename Minecraft.World/{Level => net/minecraft/world/level}/ChunkPos.cpp (93%) rename Minecraft.World/{Level => net/minecraft/world/level}/ChunkPos.h (100%) rename Minecraft.World/{Util => net/minecraft/world/level}/Coord.h (100%) rename Minecraft.World/{Level => net/minecraft/world/level}/Explosion.cpp (95%) rename Minecraft.World/{Level => net/minecraft/world/level}/Explosion.h (96%) rename Minecraft.World/{Util => net/minecraft/world/level}/FoliageColor.cpp (89%) rename Minecraft.World/{Util => net/minecraft/world/level}/FoliageColor.h (100%) rename Minecraft.World/{Level => net/minecraft/world/level}/GameRules.cpp (99%) rename Minecraft.World/{Level => net/minecraft/world/level}/GameRules.h (100%) rename Minecraft.World/{Util => net/minecraft/world/level}/GrassColor.cpp (91%) rename Minecraft.World/{Util => net/minecraft/world/level}/GrassColor.h (100%) rename Minecraft.World/{Level => net/minecraft/world/level}/Level.cpp (98%) rename Minecraft.World/{Level => net/minecraft/world/level}/Level.h (99%) rename Minecraft.World/{Level => net/minecraft/world/level}/LevelConflictException.cpp (75%) rename Minecraft.World/{Level => net/minecraft/world/level}/LevelConflictException.h (78%) rename Minecraft.World/{Level/Events => net/minecraft/world/level}/LevelListener.h (96%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level}/LevelSettings.cpp (97%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level}/LevelSettings.h (100%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level}/LevelSource.h (97%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level}/LevelType.cpp (96%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level}/LevelType.h (95%) rename Minecraft.World/{Util => net/minecraft/world/level}/LightLayer.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level}/MobSpawner.cpp (95%) rename Minecraft.World/{Blocks => net/minecraft/world/level}/MobSpawner.h (96%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level}/PortalForcer.cpp (98%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level}/PortalForcer.h (100%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level}/Region.cpp (96%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level}/Region.h (100%) rename Minecraft.World/{Level => net/minecraft/world/level}/TickNextTickData.cpp (96%) rename Minecraft.World/{Level => net/minecraft/world/level}/TickNextTickData.h (100%) rename Minecraft.World/{Level => net/minecraft/world/level}/TileEventData.cpp (94%) rename Minecraft.World/{Level => net/minecraft/world/level}/TileEventData.h (100%) rename Minecraft.World/{Level => net/minecraft/world/level}/TilePos.cpp (87%) rename Minecraft.World/{Level => net/minecraft/world/level}/TilePos.h (100%) rename Minecraft.World/{Util => net/minecraft/world/level}/WaterColor.cpp (91%) rename Minecraft.World/{Util => net/minecraft/world/level}/WaterColor.h (100%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/BeachBiome.cpp (80%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/BeachBiome.h (100%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/Biome.cpp (97%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/Biome.h (97%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/BiomeCache.cpp (97%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/BiomeCache.h (96%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/BiomeDecorator.cpp (97%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/BiomeDecorator.h (100%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/BiomeSource.cpp (97%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/BiomeSource.h (98%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/DesertBiome.cpp (75%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/DesertBiome.h (100%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/ExtremeHillsBiome.cpp (84%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/ExtremeHillsBiome.h (100%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/FixedBiomeSource.cpp (98%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/FixedBiomeSource.h (100%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/ForestBiome.cpp (78%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/ForestBiome.h (100%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/HellBiome.cpp (80%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/HellBiome.h (100%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/IceBiome.cpp (57%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/IceBiome.h (100%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/JungleBiome.cpp (85%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/JungleBiome.h (100%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/MushroomIslandBiome.cpp (79%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/MushroomIslandBiome.h (100%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/OceanBiome.h (100%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/PlainsBiome.cpp (69%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/PlainsBiome.h (100%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/RainforestBiome.cpp (67%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/RainforestBiome.h (100%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/RiverBiome.h (100%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/SwampBiome.cpp (85%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/SwampBiome.h (100%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/TaigaBiome.cpp (64%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/TaigaBiome.h (100%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/TheEndBiome.cpp (73%) rename Minecraft.World/{WorldGen/Biomes => net/minecraft/world/level/biome}/TheEndBiome.h (100%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/level/biome}/TheEndBiomeDecorator.cpp (89%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/level/biome}/TheEndBiomeDecorator.h (90%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/biome}/WaterlilyFeature.cpp (81%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/biome}/WaterlilyFeature.h (76%) create mode 100644 Minecraft.World/net/minecraft/world/level/biome/net.minecraft.world.level.biome.h rename Minecraft.World/{Level => net/minecraft/world/level/chunk}/BlockReplacements.cpp (83%) rename Minecraft.World/{Level => net/minecraft/world/level/chunk}/BlockReplacements.h (100%) rename Minecraft.World/{Level => net/minecraft/world/level/chunk}/ChunkSource.h (98%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk}/CompressedTileStorage.cpp (99%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk}/CompressedTileStorage.h (99%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk}/DataLayer.cpp (96%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk}/DataLayer.h (100%) rename Minecraft.World/{Level => net/minecraft/world/level/chunk}/EmptyLevelChunk.cpp (96%) rename Minecraft.World/{Level => net/minecraft/world/level/chunk}/EmptyLevelChunk.h (98%) rename Minecraft.World/{Level => net/minecraft/world/level/chunk}/LevelChunk.cpp (99%) rename Minecraft.World/{Level => net/minecraft/world/level/chunk}/LevelChunk.h (98%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk}/ReadOnlyChunkCache.cpp (94%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk}/ReadOnlyChunkCache.h (91%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk}/SparseDataStorage.cpp (99%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk}/SparseDataStorage.h (99%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk}/SparseLightStorage.cpp (99%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk}/SparseLightStorage.h (99%) rename Minecraft.World/{Level => net/minecraft/world/level/chunk}/WaterLevelChunk.cpp (93%) rename Minecraft.World/{Level => net/minecraft/world/level/chunk}/WaterLevelChunk.h (97%) create mode 100644 Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk/storage}/ChunkStorage.h (100%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk/storage}/ChunkStorageProfileDecorator.cpp (95%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk/storage}/ChunkStorageProfileDecorator.h (100%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk/storage}/McRegionChunkStorage.cpp (98%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk/storage}/McRegionChunkStorage.h (95%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk/storage}/MemoryChunkStorage.cpp (76%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk/storage}/MemoryChunkStorage.h (100%) rename Minecraft.World/{IO/NBT => net/minecraft/world/level/chunk/storage}/NbtSlotFile.cpp (98%) rename Minecraft.World/{IO/NBT => net/minecraft/world/level/chunk/storage}/NbtSlotFile.h (84%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk/storage}/OldChunkStorage.cpp (97%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk/storage}/OldChunkStorage.h (91%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk/storage}/RegionFile.cpp (98%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk/storage}/RegionFile.h (94%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk/storage}/RegionFileCache.cpp (94%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk/storage}/RegionFileCache.h (96%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk/storage}/ZoneFile.cpp (94%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk/storage}/ZoneFile.h (91%) rename Minecraft.World/{Level/Storage/ZoneIO.cpp => net/minecraft/world/level/chunk/storage/ZoneIo.cpp} (91%) rename Minecraft.World/{Level/Storage/ZoneIO.h => net/minecraft/world/level/chunk/storage/ZoneIo.h} (100%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk/storage}/ZonedChunkStorage.cpp (95%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/chunk/storage}/ZonedChunkStorage.h (95%) create mode 100644 Minecraft.World/net/minecraft/world/level/chunk/storage/net.minecraft.world.level.chunk.storage.h rename Minecraft.World/{Level/Dimensions => net/minecraft/world/level/dimension}/Dimension.cpp (91%) rename Minecraft.World/{Level/Dimensions => net/minecraft/world/level/dimension}/Dimension.h (94%) rename Minecraft.World/{Level/Dimensions => net/minecraft/world/level/dimension}/HellDimension.cpp (81%) rename Minecraft.World/{Level/Dimensions => net/minecraft/world/level/dimension}/HellDimension.h (100%) rename Minecraft.World/{Level/Dimensions => net/minecraft/world/level/dimension}/NormalDimension.h (100%) rename Minecraft.World/{Level/Dimensions => net/minecraft/world/level/dimension}/TheEndDimension.cpp (80%) rename Minecraft.World/{Level/Dimensions => net/minecraft/world/level/dimension}/TheEndDimension.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen}/CanyonFeature.cpp (96%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen}/CanyonFeature.h (100%) rename Minecraft.World/{Level => net/minecraft/world/level/levelgen}/CustomLevelSource.cpp (97%) rename Minecraft.World/{Level => net/minecraft/world/level/levelgen}/CustomLevelSource.h (98%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen}/DungeonFeature.cpp (97%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen}/DungeonFeature.h (100%) rename Minecraft.World/{WorldGen/Sources => net/minecraft/world/level/levelgen}/FlatLevelSource.cpp (89%) rename Minecraft.World/{WorldGen/Sources => net/minecraft/world/level/levelgen}/FlatLevelSource.h (97%) rename Minecraft.World/{WorldGen/Sources => net/minecraft/world/level/levelgen}/HellFlatLevelSource.cpp (97%) rename Minecraft.World/{WorldGen/Sources => net/minecraft/world/level/levelgen}/HellFlatLevelSource.h (76%) rename Minecraft.World/{WorldGen/Sources => net/minecraft/world/level/levelgen}/HellRandomLevelSource.cpp (98%) rename Minecraft.World/{WorldGen/Sources => net/minecraft/world/level/levelgen}/HellRandomLevelSource.h (79%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen}/LargeCaveFeature.cpp (97%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen}/LargeCaveFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen}/LargeFeature.cpp (90%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen}/LargeFeature.h (93%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen}/LargeHellCaveFeature.cpp (97%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen}/LargeHellCaveFeature.h (100%) rename Minecraft.World/{Level => net/minecraft/world/level/levelgen}/RandomLevelSource.cpp (98%) rename Minecraft.World/{Level => net/minecraft/world/level/levelgen}/RandomLevelSource.h (98%) rename Minecraft.World/{WorldGen/Sources => net/minecraft/world/level/levelgen}/TheEndLevelRandomLevelSource.cpp (96%) rename Minecraft.World/{WorldGen/Sources => net/minecraft/world/level/levelgen}/TheEndLevelRandomLevelSource.h (98%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen}/TownFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/BasicTreeFeature.cpp (99%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/BasicTreeFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/BirchFeature.cpp (94%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/BirchFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/BonusChestFeature.cpp (92%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/BonusChestFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/CactusFeature.cpp (83%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/CactusFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/CaveFeature.cpp (96%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/CaveFeature.h (81%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/ClayFeature.cpp (80%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/ClayFeature.h (86%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/DeadBushFeature.cpp (84%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/DeadBushFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/DesertWellFeature.cpp (95%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/DesertWellFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/EndPodiumFeature.cpp (91%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/EndPodiumFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/Feature.cpp (81%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/Feature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/FlowerFeature.cpp (86%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/FlowerFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/GroundBushFeature.cpp (90%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/GroundBushFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/HellFireFeature.cpp (79%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/HellFireFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/HellPortalFeature.cpp (89%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/HellPortalFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/HellSpringFeature.cpp (90%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/HellSpringFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/HouseFeature.cpp (95%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/HouseFeature.h (81%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/HugeMushroomFeature.cpp (95%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/HugeMushroomFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/LakeFeature.cpp (96%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/LakeFeature.h (84%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/LightGemFeature.cpp (89%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/LightGemFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/MegaTreeFeature.cpp (98%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/MegaTreeFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/MonsterRoomFeature.cpp (93%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/MonsterRoomFeature.h (91%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/NetherSphereFeature.cpp (90%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/NetherSphereFeature.h (90%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/OreFeature.cpp (97%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/OreFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/PineFeature.cpp (95%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/PineFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/PumpkinFeature.cpp (82%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/PumpkinFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/ReedsFeature.cpp (91%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/ReedsFeature.h (81%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/SandFeature.cpp (92%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/SandFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/SpikeFeature.cpp (95%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/SpikeFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/SpringFeature.cpp (92%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/SpringFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/SpruceFeature.cpp (95%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/SpruceFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/SwampTreeFeature.cpp (95%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/SwampTreeFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/TallGrassFeature.cpp (85%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/TallGrassFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/TreeFeature.cpp (98%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/TreeFeature.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/VinesFeature.cpp (82%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/feature}/VinesFeature.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/level/levelgen/feature/net.minecraft.world.level.levelgen.feature.h rename Minecraft.World/{WorldGen/Flat => net/minecraft/world/level/levelgen/flat}/FlatGeneratorInfo.cpp (92%) rename Minecraft.World/{WorldGen/Flat => net/minecraft/world/level/levelgen/flat}/FlatGeneratorInfo.h (100%) rename Minecraft.World/{WorldGen/Flat => net/minecraft/world/level/levelgen/flat}/FlatLayerInfo.cpp (95%) rename Minecraft.World/{WorldGen/Flat => net/minecraft/world/level/levelgen/flat}/FlatLayerInfo.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/level/levelgen/flat/net.minecraft.world.level.levelgen.flat.h create mode 100644 Minecraft.World/net/minecraft/world/level/levelgen/net.minecraft.world.level.levelgen.h rename Minecraft.World/{Level => net/minecraft/world/level/levelgen/structure}/BlockGenMethods.cpp (97%) rename Minecraft.World/{Level => net/minecraft/world/level/levelgen/structure}/BlockGenMethods.h (94%) rename Minecraft.World/{Util => net/minecraft/world/level/levelgen/structure}/BoundingBox.cpp (97%) rename Minecraft.World/{Util => net/minecraft/world/level/levelgen/structure}/BoundingBox.h (94%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/structure}/MineShaftFeature.cpp (85%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/structure}/MineShaftFeature.h (100%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/level/levelgen/structure}/MineShaftPieces.cpp (98%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/level/levelgen/structure}/MineShaftPieces.h (100%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/level/levelgen/structure}/MineShaftStart.cpp (84%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/level/levelgen/structure}/MineShaftStart.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/structure}/NetherBridgeFeature.cpp (92%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/structure}/NetherBridgeFeature.h (93%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/level/levelgen/structure}/NetherBridgePieces.cpp (99%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/level/levelgen/structure}/NetherBridgePieces.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/structure}/RandomScatteredLargeFeature.cpp (94%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/structure}/RandomScatteredLargeFeature.h (96%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/level/levelgen/structure}/ScatteredFeaturePieces.cpp (98%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/level/levelgen/structure}/ScatteredFeaturePieces.h (100%) rename Minecraft.World/{Level/Dimensions => net/minecraft/world/level/levelgen/structure}/SkyIslandDimension.cpp (82%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/structure}/StrongholdFeature.cpp (95%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/structure}/StrongholdFeature.h (95%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/level/levelgen/structure}/StrongholdPieces.cpp (99%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/level/levelgen/structure}/StrongholdPieces.h (100%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/structure}/StructureFeature.cpp (97%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/structure}/StructureFeature.h (96%) rename Minecraft.World/{WorldGen => net/minecraft/world/level/levelgen/structure}/StructureFeatureIO.cpp (96%) rename Minecraft.World/{WorldGen => net/minecraft/world/level/levelgen/structure}/StructureFeatureIO.h (100%) rename Minecraft.World/{WorldGen => net/minecraft/world/level/levelgen/structure}/StructureFeatureSavedData.cpp (96%) rename Minecraft.World/{WorldGen => net/minecraft/world/level/levelgen/structure}/StructureFeatureSavedData.h (92%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/level/levelgen/structure}/StructurePiece.cpp (97%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/level/levelgen/structure}/StructurePiece.h (98%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/level/levelgen/structure}/StructureStart.cpp (95%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/level/levelgen/structure}/StructureStart.h (96%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/structure}/VillageFeature.cpp (95%) rename Minecraft.World/{WorldGen/Features => net/minecraft/world/level/levelgen/structure}/VillageFeature.h (97%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/level/levelgen/structure}/VillagePieces.cpp (99%) rename Minecraft.World/{WorldGen/Structures => net/minecraft/world/level/levelgen/structure}/VillagePieces.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/level/levelgen/structure/net.minecraft.world.level.levelgen.structure.h rename Minecraft.World/{Util => net/minecraft/world/level/levelgen/synth}/Distort.cpp (82%) rename Minecraft.World/{Util => net/minecraft/world/level/levelgen/synth}/Distort.h (84%) rename Minecraft.World/{Util => net/minecraft/world/level/levelgen/synth}/Emboss.cpp (78%) rename Minecraft.World/{Util => net/minecraft/world/level/levelgen/synth}/Emboss.h (81%) rename Minecraft.World/{WorldGen/Noise => net/minecraft/world/level/levelgen/synth}/FastNoise.cpp (98%) rename Minecraft.World/{WorldGen/Noise => net/minecraft/world/level/levelgen/synth}/FastNoise.h (100%) rename Minecraft.World/{WorldGen/Noise => net/minecraft/world/level/levelgen/synth}/ImprovedNoise.cpp (99%) rename Minecraft.World/{WorldGen/Noise => net/minecraft/world/level/levelgen/synth}/ImprovedNoise.h (100%) rename Minecraft.World/{WorldGen/Noise => net/minecraft/world/level/levelgen/synth}/PerlinNoise.cpp (96%) rename Minecraft.World/{WorldGen/Noise => net/minecraft/world/level/levelgen/synth}/PerlinNoise.h (100%) rename Minecraft.World/{WorldGen/Noise => net/minecraft/world/level/levelgen/synth}/PerlinSimplexNoise.cpp (98%) rename Minecraft.World/{WorldGen/Noise => net/minecraft/world/level/levelgen/synth}/PerlinSimplexNoise.h (100%) rename Minecraft.World/{Util => net/minecraft/world/level/levelgen/synth}/Rotate.cpp (83%) rename Minecraft.World/{Util => net/minecraft/world/level/levelgen/synth}/Rotate.h (84%) rename Minecraft.World/{Util => net/minecraft/world/level/levelgen/synth}/Scale.cpp (84%) rename Minecraft.World/{Util => net/minecraft/world/level/levelgen/synth}/Scale.h (85%) rename Minecraft.World/{WorldGen/Noise => net/minecraft/world/level/levelgen/synth}/SimplexNoise.cpp (99%) rename Minecraft.World/{WorldGen/Noise => net/minecraft/world/level/levelgen/synth}/SimplexNoise.h (100%) rename Minecraft.World/{WorldGen/Noise => net/minecraft/world/level/levelgen/synth}/Synth.cpp (85%) rename Minecraft.World/{WorldGen/Noise => net/minecraft/world/level/levelgen/synth}/Synth.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/level/levelgen/synth/net.minecraft.world.level.levelgen.synth.h rename Minecraft.World/{Blocks => net/minecraft/world/level/material}/DecorationMaterial.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/material}/GasMaterial.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/material}/LiquidMaterial.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/material}/Material.cpp (99%) rename Minecraft.World/{Blocks => net/minecraft/world/level/material}/Material.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/material}/MaterialColor.cpp (97%) rename Minecraft.World/{Blocks => net/minecraft/world/level/material}/MaterialColor.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/material}/PortalMaterial.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/material}/WebMaterial.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/level/material/net.minecraft.world.level.material.h create mode 100644 Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/AddIslandLayer.cpp (92%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/AddIslandLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/AddMushroomIslandLayer.cpp (87%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/AddMushroomIslandLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/AddSnowLayer.cpp (84%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/AddSnowLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/BiomeInitLayer.cpp (89%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/BiomeInitLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/BiomeOverrideLayer.cpp (91%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/BiomeOverrideLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/DownfallLayer.cpp (71%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/DownfallLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/DownfallMixerLayer.cpp (79%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/DownfallMixerLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/FlatLayer.cpp (75%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/FlatLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/FuzzyZoomLayer.cpp (93%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/FuzzyZoomLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/GrowMushroomIslandLayer.cpp (87%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/GrowMushroomIslandLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/IslandLayer.cpp (83%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/IslandLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/Layer.cpp (97%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/Layer.h (89%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/RegionHillsLayer.cpp (94%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/RegionHillsLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/RiverInitLayer.cpp (83%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/RiverInitLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/RiverLayer.cpp (85%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/RiverLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/RiverMixerLayer.cpp (90%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/RiverMixerLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/ShoreLayer.cpp (94%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/ShoreLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/SmoothLayer.cpp (91%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/SmoothLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/SmoothZoomLayer.cpp (92%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/SmoothZoomLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/SwampRiversLayer.cpp (88%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/SwampRiversLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/TemperatureLayer.cpp (71%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/TemperatureLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/TemperatureMixerLayer.cpp (81%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/TemperatureMixerLayer.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/VoronoiZoom.cpp (96%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/VoronoiZoom.h (100%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/ZoomLayer.cpp (94%) rename Minecraft.World/{WorldGen/Layers => net/minecraft/world/level/newbiome/layer}/ZoomLayer.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/level/newbiome/layer/net.minecraft.world.level.newbiome.layer.h rename Minecraft.World/{Util => net/minecraft/world/level/pathfinder}/BinaryHeap.cpp (96%) rename Minecraft.World/{Util => net/minecraft/world/level/pathfinder}/BinaryHeap.h (79%) rename Minecraft.World/{AI/Navigation => net/minecraft/world/level/pathfinder}/Node.cpp (90%) rename Minecraft.World/{AI/Navigation => net/minecraft/world/level/pathfinder}/Node.h (100%) rename Minecraft.World/{AI/Navigation => net/minecraft/world/level/pathfinder}/Path.cpp (93%) rename Minecraft.World/{AI/Navigation => net/minecraft/world/level/pathfinder}/Path.h (100%) rename Minecraft.World/{AI/Navigation => net/minecraft/world/level/pathfinder}/PathFinder.cpp (96%) rename Minecraft.World/{AI/Navigation => net/minecraft/world/level/pathfinder}/PathFinder.h (96%) create mode 100644 Minecraft.World/net/minecraft/world/level/pathfinder/net.minecraft.world.level.pathfinder.h rename Minecraft.World/{Level => net/minecraft/world/level/redstone}/Redstone.cpp (76%) rename Minecraft.World/{Level => net/minecraft/world/level/redstone}/Redstone.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/level/redstone/net.minecraft.world.level.redstone.h rename Minecraft.World/{Level/Storage => net/minecraft/world/level/saveddata}/MapItemSavedData.cpp (97%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/saveddata}/MapItemSavedData.h (98%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/saveddata}/SavedData.cpp (84%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/saveddata}/SavedData.h (89%) create mode 100644 Minecraft.World/net/minecraft/world/level/saveddata/net.minecraft.world.level.saveddata.h rename Minecraft.World/{Level => net/minecraft/world/level/storage}/DerivedLevelData.cpp (98%) rename Minecraft.World/{Level => net/minecraft/world/level/storage}/DerivedLevelData.h (100%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/DirectoryLevelStorage.cpp (97%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/DirectoryLevelStorage.h (97%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/DirectoryLevelStorageSource.cpp (91%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/DirectoryLevelStorageSource.h (96%) rename Minecraft.World/{Level => net/minecraft/world/level/storage}/LevelData.cpp (98%) rename Minecraft.World/{Level => net/minecraft/world/level/storage}/LevelData.h (99%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/LevelStorage.cpp (75%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/LevelStorage.h (93%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/LevelStorageProfilerDecorator.cpp (78%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/LevelStorageProfilerDecorator.h (100%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/LevelStorageSource.h (97%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/LevelSummary.cpp (96%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/LevelSummary.h (100%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/McRegionLevelStorage.cpp (90%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/McRegionLevelStorage.h (100%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/McRegionLevelStorageSource.cpp (88%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/McRegionLevelStorageSource.h (91%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/MemoryLevelStorage.cpp (69%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/MemoryLevelStorage.h (65%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/MemoryLevelStorageSource.cpp (92%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/MemoryLevelStorageSource.h (100%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/MockedLevelStorage.cpp (66%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/MockedLevelStorage.h (89%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/PlayerIO.h (100%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/SavedDataStorage.cpp (94%) rename Minecraft.World/{Level/Storage => net/minecraft/world/level/storage}/SavedDataStorage.h (96%) create mode 100644 Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/AirTile.cpp (61%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/AirTile.h (77%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/AnvilTile.cpp (90%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/AnvilTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/BaseEntityTile.cpp (84%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/BaseEntityTile.h (92%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/BasePressurePlateTile.cpp (93%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/BasePressurePlateTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/BaseRailTile.cpp (98%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/BaseRailTile.h (97%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/BeaconTile.cpp (88%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/BeaconTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/BedTile.cpp (96%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/BedTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/BookshelfTile.cpp (77%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/BookshelfTile.h (89%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/BrewingStandTile.cpp (93%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/BrewingStandTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/ButtonTile.cpp (96%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/ButtonTile.h (98%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/CactusTile.cpp (87%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/CactusTile.h (93%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/CakeTile.cpp (90%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/CakeTile.h (95%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/CarrotTile.cpp (82%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/CarrotTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/CauldronTile.cpp (93%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/CauldronTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/ChestTile.cpp (96%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/ChestTile.h (98%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/ClayTile.cpp (71%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/ClayTile.h (87%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/CocoaTile.cpp (94%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/CocoaTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/ColoredTile.cpp (83%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/ColoredTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/CommandBlock.cpp (93%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/CommandBlock.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/ComparatorTile.cpp (95%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/ComparatorTile.h (98%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/CoralTile.cpp (92%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/CoralTile.h (90%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/CropTile.cpp (94%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/CropTile.h (97%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/DaylightDetectorTile.cpp (87%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/DaylightDetectorTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/DeadBushTile.cpp (81%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/DeadBushTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/DetectorRailTile.cpp (90%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/DetectorRailTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/DiodeTile.cpp (96%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/DiodeTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/DirectionalTile.cpp (82%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/DirectionalTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/DirtTile.cpp (62%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/DirtTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/DispenserTile.cpp (92%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/DispenserTile.h (97%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/DoorTile.cpp (96%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/DoorTile.h (98%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/DropperTile.cpp (87%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/DropperTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/EggTile.cpp (96%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/EggTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/EnchantmentTableTile.cpp (94%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/EnchantmentTableTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/EnderChestTile.cpp (90%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/EnderChestTile.h (100%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile}/EntityTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/FarmTile.cpp (94%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/FarmTile.h (95%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/FenceGateTile.cpp (95%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/FenceGateTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/FenceTile.cpp (95%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/FenceTile.h (95%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/FireTile.cpp (95%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/FireTile.h (97%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/FlowerPotTile.cpp (95%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/FlowerPotTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/FurnaceTile.cpp (94%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/FurnaceTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/GlassTile.cpp (89%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/GlassTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/GlowstoneTile.cpp (84%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/GlowstoneTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/GrassTile.cpp (90%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/GrassTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/GravelTile.cpp (75%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/GravelTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/HalfSlabTile.cpp (93%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/HalfSlabTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/HalfTransparentTile.cpp (86%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/HalfTransparentTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/HayBlockTile.cpp (83%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/HayBlockTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/HeavyTile.cpp (93%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/HeavyTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/HopperTile.cpp (94%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/HopperTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/HugeMushroomTile.cpp (95%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/HugeMushroomTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/IceTile.cpp (86%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/IceTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/JukeboxTile.cpp (93%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/JukeboxTile.h (95%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/LadderTile.cpp (96%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/LadderTile.h (95%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/LeafTile.cpp (97%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/LeafTile.h (100%) rename Minecraft.World/{Level/Events => net/minecraft/world/level/tile}/LevelEvent.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/LeverTile.cpp (97%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/LeverTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/LiquidTile.cpp (96%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/LiquidTile.h (98%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/LiquidTileDynamic.cpp (98%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/LiquidTileDynamic.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/LiquidTileStatic.cpp (96%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/LiquidTileStatic.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/LockedChestTile.cpp (81%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/LockedChestTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/MelonTile.cpp (83%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/MelonTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/MetalTile.cpp (63%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/MetalTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/MobSpawnerTile.cpp (88%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/MobSpawnerTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/MushroomPlantTile.cpp (92%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/MushroomPlantTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/MycelTile.cpp (93%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/MycelTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/NetherWartTile.cpp (91%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/NetherWartTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/NetherrackTile.cpp (67%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/NetherrackTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/NotGateTile.cpp (97%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/NotGateTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/NoteBlockTile.cpp (93%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/NoteBlockTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/ObsidianTile.cpp (84%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/ObsidianTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/OreTile.cpp (93%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/OreTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/PlantTile.cpp (93%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/PlantTile.h (91%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/PortalTile.cpp (96%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/PortalTile.h (96%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/PotatoTile.cpp (86%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/PotatoTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/PoweredMetalTile.cpp (73%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/PoweredMetalTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/PoweredRailTile.cpp (97%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/PoweredRailTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/PressurePlateTile.cpp (90%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/PressurePlateTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/PumpkinTile.cpp (96%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/PumpkinTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/QuartzBlockTile.cpp (94%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/QuartzBlockTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/RailTile.cpp (89%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/RailTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/RedStoneDustTile.cpp (96%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/RedStoneDustTile.h (97%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/RedStoneOreTile.cpp (96%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/RedStoneOreTile.h (100%) rename Minecraft.World/{Blocks/RedLightTile.cpp => net/minecraft/world/level/tile/RedlightTile.cpp} (89%) rename Minecraft.World/{Blocks/RedLightTile.h => net/minecraft/world/level/tile/RedlightTile.h} (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/ReedTile.cpp (91%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/ReedTile.h (95%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/RepeaterTile.cpp (93%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/RepeaterTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/RotatedPillarTile.cpp (95%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/RotatedPillarTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/SandStoneTile.cpp (88%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/SandStoneTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/SaplingPlantTile.cpp (94%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/SaplingPlantTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/SignTile.cpp (93%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/SignTile.h (91%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/SkullTile.cpp (97%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/SkullTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/SmoothStoneBrickTile.cpp (94%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/SmoothStoneBrickTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/SnowTile.cpp (82%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/SnowTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/SoulSandTile.cpp (74%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/SoulSandTile.h (84%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/SpongeTile.cpp (53%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/SpongeTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/StainedGlassBlock.cpp (88%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/StainedGlassBlock.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/StainedGlassPaneBlock.cpp (90%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/StainedGlassPaneBlock.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/StairTile.cpp (98%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/StairTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/StemTile.cpp (94%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/StemTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/StoneButtonTile.cpp (70%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/StoneButtonTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/StoneMonsterTile.cpp (93%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/StoneMonsterTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/StoneSlabTile.cpp (91%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/StoneSlabTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/StoneTile.cpp (80%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/StoneTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TallGrassPlantTile.cpp (89%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TallGrassPlantTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TheEndPortalFrameTile.cpp (92%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TheEndPortalFrameTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/ThinFenceTile.cpp (96%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/ThinFenceTile.h (96%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/Tile.cpp (99%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/Tile.h (99%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TntTile.cpp (91%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TntTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TopSnowTile.cpp (92%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TopSnowTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TorchTile.cpp (97%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TorchTile.h (97%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TransparentTile.cpp (87%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TransparentTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TrapDoorTile.cpp (95%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TrapDoorTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TreeTile.cpp (92%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TreeTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TripWireSourceTile.cpp (97%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TripWireSourceTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TripWireTile.cpp (96%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/TripWireTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/VineTile.cpp (97%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/VineTile.h (98%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/WallTile.cpp (94%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/WallTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/WaterLilyTile.cpp (89%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/WaterLilyTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/WebTile.cpp (81%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/WebTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/WeightedPressurePlateTile.cpp (80%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/WeightedPressurePlateTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/WoodButtonTile.cpp (70%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/WoodButtonTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/WoodSlabTile.cpp (85%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/WoodSlabTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/WoodTile.cpp (80%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/WoodTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/WoolCarpetTile.cpp (93%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/WoolCarpetTile.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/WorkbenchTile.cpp (83%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile}/WorkbenchTile.h (100%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/BeaconTileEntity.cpp (95%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/BeaconTileEntity.h (98%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/BrewingStandTileEntity.cpp (97%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/BrewingStandTileEntity.h (97%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/ChestTileEntity.cpp (94%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/ChestTileEntity.h (96%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/CommandBlockEntity.cpp (88%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/CommandBlockEntity.h (96%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/ComparatorTileEntity.cpp (93%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/ComparatorTileEntity.h (100%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/DaylightDetectorTileEntity.cpp (84%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/DaylightDetectorTileEntity.h (100%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/DispenserTileEntity.cpp (94%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/DispenserTileEntity.h (94%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/DropperTileEntity.cpp (89%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/DropperTileEntity.h (100%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/EnchantmentTableTileEntity.cpp (94%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/EnchantmentTableTileEntity.h (100%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/EnderChestTileEntity.cpp (95%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/EnderChestTileEntity.h (100%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/FurnaceTileEntity.cpp (95%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/FurnaceTileEntity.h (98%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/Hopper.h (84%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/HopperTileEntity.cpp (96%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/HopperTileEntity.h (100%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/MobSpawnerTileEntity.cpp (91%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/MobSpawnerTileEntity.h (96%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/MusicTileEntity.cpp (74%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/MusicTileEntity.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile/entity}/PistonMovingTileEntity.cpp (96%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile/entity}/PistonMovingTileEntity.h (98%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/PistonPieceTileEntity.cpp (94%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/PistonPieceTileEntity.h (100%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/SignTileEntity.cpp (87%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/SignTileEntity.h (100%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/SkullTileEntity.cpp (89%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/SkullTileEntity.h (100%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile/entity}/TheEndPortalTile.cpp (88%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile/entity}/TheEndPortalTile.h (95%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/TheEndPortalTileEntity.cpp (85%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/TheEndPortalTileEntity.h (100%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/TileEntity.cpp (96%) rename Minecraft.World/{Blocks/TileEntities => net/minecraft/world/level/tile/entity}/TileEntity.h (95%) create mode 100644 Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h create mode 100644 Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h rename Minecraft.World/{Blocks => net/minecraft/world/level/tile/piston}/PistonBaseTile.cpp (97%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile/piston}/PistonBaseTile.h (99%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile/piston}/PistonExtensionTile.cpp (98%) rename Minecraft.World/{Blocks => net/minecraft/world/level/tile/piston}/PistonExtensionTile.h (98%) create mode 100644 Minecraft.World/net/minecraft/world/level/tile/piston/net.minecraft.world.level.tile.piston.h rename Minecraft.World/{Headers => net/minecraft/world}/net.minecraft.world.ContainerListener.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/net.minecraft.world.h rename Minecraft.World/{Util => net/minecraft/world/phys}/AABB.cpp (99%) rename Minecraft.World/{Util => net/minecraft/world/phys}/AABB.h (95%) rename Minecraft.World/{Util => net/minecraft/world/phys}/HitResult.cpp (86%) rename Minecraft.World/{Util => net/minecraft/world/phys}/HitResult.h (100%) rename Minecraft.World/{Util => net/minecraft/world/phys}/Vec3.cpp (100%) rename Minecraft.World/{Util => net/minecraft/world/phys}/Vec3.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/phys/net.minecraft.world.phys.h rename Minecraft.World/{Scores => net/minecraft/world/scores}/Objective.cpp (88%) rename Minecraft.World/{Scores => net/minecraft/world/scores}/Objective.h (100%) rename Minecraft.World/{Scores => net/minecraft/world/scores}/PlayerTeam.cpp (96%) rename Minecraft.World/{Scores => net/minecraft/world/scores}/PlayerTeam.h (100%) rename Minecraft.World/{Scores => net/minecraft/world/scores}/Score.cpp (90%) rename Minecraft.World/{Scores => net/minecraft/world/scores}/Score.h (100%) rename Minecraft.World/{Scores => net/minecraft/world/scores}/ScoreHolder.h (100%) rename Minecraft.World/{Scores => net/minecraft/world/scores}/Scoreboard.cpp (99%) rename Minecraft.World/{Scores => net/minecraft/world/scores}/Scoreboard.h (100%) rename Minecraft.World/{Scores => net/minecraft/world/scores}/ScoreboardSaveData.h (100%) rename Minecraft.World/{Scores => net/minecraft/world/scores}/Team.cpp (80%) rename Minecraft.World/{Scores => net/minecraft/world/scores}/Team.h (100%) rename Minecraft.World/{Scores/Criteria => net/minecraft/world/scores/criteria}/DummyCriteria.cpp (88%) rename Minecraft.World/{Scores/Criteria => net/minecraft/world/scores/criteria}/DummyCriteria.h (100%) rename Minecraft.World/{Scores/Criteria => net/minecraft/world/scores/criteria}/HealthCriteria.cpp (82%) rename Minecraft.World/{Scores/Criteria => net/minecraft/world/scores/criteria}/HealthCriteria.h (100%) rename Minecraft.World/{Scores/Criteria => net/minecraft/world/scores/criteria}/ObjectiveCriteria.cpp (85%) rename Minecraft.World/{Scores/Criteria => net/minecraft/world/scores/criteria}/ObjectiveCriteria.h (100%) create mode 100644 Minecraft.World/net/minecraft/world/scores/criteria/net.minecraft.world.scores.criteria.h create mode 100644 Minecraft.World/net/minecraft/world/scores/net.minecraft.world.scores.h rename Minecraft.World/{Platform => }/x64headers/extraX64.h (99%) rename Minecraft.World/{Platform => }/x64headers/qnet.h (100%) rename Minecraft.World/{Platform => }/x64headers/xmcore.h (100%) rename Minecraft.World/{Platform => }/x64headers/xrnm.h (100%) rename Minecraft.World/{Platform => }/x64headers/xsocialpost.h (100%) rename Minecraft.World/{Platform => }/x64headers/xuiapp.h (100%) rename Minecraft.World/{Platform => }/x64headers/xuiresource.h (100%) diff --git a/Minecraft.Client/Platform/Common/App_Defines.h b/Minecraft.Client/Common/App_Defines.h similarity index 100% rename from Minecraft.Client/Platform/Common/App_Defines.h rename to Minecraft.Client/Common/App_Defines.h diff --git a/Minecraft.Client/Platform/Common/App_enums.h b/Minecraft.Client/Common/App_enums.h similarity index 100% rename from Minecraft.Client/Platform/Common/App_enums.h rename to Minecraft.Client/Common/App_enums.h diff --git a/Minecraft.Client/Platform/Common/App_structs.h b/Minecraft.Client/Common/App_structs.h similarity index 100% rename from Minecraft.Client/Platform/Common/App_structs.h rename to Minecraft.Client/Common/App_structs.h diff --git a/Minecraft.Client/Platform/Common/Consoles_App.cpp b/Minecraft.Client/Common/Consoles_App.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/Consoles_App.cpp rename to Minecraft.Client/Common/Consoles_App.cpp index e6ea0b3c5..0a3f7b4d0 100644 --- a/Minecraft.Client/Platform/Common/Consoles_App.cpp +++ b/Minecraft.Client/Common/Consoles_App.cpp @@ -1,67 +1,67 @@ -#include "../Minecraft.World/Platform/stdafx.h" +#include "../../Minecraft.World/Header Files/stdafx.h" -#include "../Minecraft.World/Recipes/Recipy.h" -#include "../Minecraft.Client/GameState/Options.h" -#include "../Minecraft.World/Util/AABB.h" -#include "../Minecraft.World/Util/Vec3.h" -#include "../Minecraft.Client/MinecraftServer.h" -#include "../Minecraft.Client/Level/MultiPlayerLevel.h" -#include "../Minecraft.Client/Rendering/GameRenderer.h" -#include "../Minecraft.Client/Rendering/EntityRenderers/ProgressRenderer.h" -#include "../Minecraft.Client/Rendering/LevelRenderer.h" -#include "../Minecraft.Client/Textures/MobSkinMemTextureProcessor.h" -#include "../Minecraft.Client/Minecraft.h" -#include "../Minecraft.Client/Network/ClientConnection.h" -#include "../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../Minecraft.Client/Player/LocalPlayer.h" -#include "../Minecraft.World/Player/Player.h" -#include "../Minecraft.World/Containers/Inventory.h" -#include "../Minecraft.World/Level/Level.h" -#include "../Minecraft.World/Blocks/TileEntities/FurnaceTileEntity.h" -#include "../Minecraft.World/Containers/Container.h" -#include "../Minecraft.World/Blocks/TileEntities/DispenserTileEntity.h" -#include "../Minecraft.World/Blocks/TileEntities/SignTileEntity.h" -#include "../Minecraft.World/Blocks/TileEntities/HopperTileEntity.h" -#include "../Minecraft.World/Util/PathHelper.h" -#include "../Minecraft.Client/GameState/StatsCounter.h" -#include "../Minecraft.Client/GameState/GameMode.h" -#include "../Minecraft.Client/Platform/Windows64/Social/SocialManager.h" -#include "Tutorial/TutorialMode.h" +#include "../../Minecraft.World/net/minecraft/world/item/crafting/Recipy.h" +#include "../net/minecraft/client/Options.h" +#include "../../Minecraft.World/net/minecraft/world/phys/AABB.h" +#include "../../Minecraft.World/net/minecraft/world/phys/Vec3.h" +#include "../net/minecraft/server/MinecraftServer.h" +#include "../net/minecraft/client/multiplayer/MultiPlayerLevel.h" +#include "../net/minecraft/client/renderer/GameRenderer.h" +#include "../net/minecraft/client/ProgressRenderer.h" +#include "../net/minecraft/client/renderer/LevelRenderer.h" +#include "../Header Files/MobSkinMemTextureProcessor.h" +#include "../net/minecraft/client/Minecraft.h" +#include "../net/minecraft/client/multiplayer/ClientConnection.h" +#include "../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../net/minecraft/client/player/LocalPlayer.h" +#include "../../Minecraft.World/net/minecraft/world/entity/player/Player.h" +#include "../../Minecraft.World/net/minecraft/world/entity/player/Inventory.h" +#include "../../Minecraft.World/net/minecraft/world/level/Level.h" +#include "../../Minecraft.World/net/minecraft/world/level/tile/entity/FurnaceTileEntity.h" +#include "../../Minecraft.World/net/minecraft/world/Container.h" +#include "../../Minecraft.World/net/minecraft/world/level/tile/entity/DispenserTileEntity.h" +#include "../../Minecraft.World/net/minecraft/world/level/tile/entity/SignTileEntity.h" +#include "../../Minecraft.World/net/minecraft/world/level/tile/entity/HopperTileEntity.h" +#include "../../Minecraft.World/Header Files/PathHelper.h" +#include "../net/minecraft/stats/StatsCounter.h" +#include "../net/minecraft/server/level/GameMode.h" +#include "../Windows64/Source Files/Social/SocialManager.h" +#include "Source Files/Tutorial/TutorialMode.h" #if defined(_WINDOWS64) -#include "../Minecraft.Client/Platform/Common/XML/ATGXmlParser.h" -#include "../Minecraft.Client/Platform/Common/XML/xmlFilesCallback.h" +#include "../Windows64/XML/ATGXmlParser.h" +#include "../Windows64/XML/xmlFilesCallback.h" #endif #include "Minecraft_Macros.h" -#include "../Minecraft.Client/Network/PlayerList.h" -#include "../Minecraft.Client/Player/ServerPlayer.h" -#include "GameRules/ConsoleGameRules.h" -#include "GameRules/ConsoleSchematicFile.h" -#include "../Minecraft.World/IO/Streams/InputOutputStream.h" -#include "../Minecraft.World/Level/Storage/LevelSettings.h" -#include "../Minecraft.Client/Player/User.h" +#include "../net/minecraft/server/PlayerList.h" +#include "../net/minecraft/server/level/ServerPlayer.h" +#include "Source Files/GameRules/ConsoleGameRules.h" +#include "Source Files/GameRules/LevelGeneration/ConsoleSchematicFile.h" +#include "../../Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../Minecraft.World/net/minecraft/world/level/LevelSettings.h" +#include "../net/minecraft/client/User.h" #include -#include "../Minecraft.World/Level/LevelData.h" -#include "../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../Minecraft.Client/Rendering/EntityRenderers/EntityRenderDispatcher.h" -#include "../Minecraft.World/IO/Streams/Compression.h" -#include "../Minecraft.Client/Textures/Packs/TexturePackRepository.h" -#include "../Minecraft.Client/Textures/Packs/DLCTexturePack.h" -#include "DLC/DLCPack.h" -#include "../Minecraft.Client/Utils/StringTable.h" -#include "../Minecraft.Client/Utils/ArchiveFile.h" -#include "../Minecraft.Client/Minecraft.h" +#include "../../Minecraft.World/net/minecraft/world/level/storage/LevelData.h" +#include "../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../net/minecraft/client/renderer/entity/EntityRenderDispatcher.h" +#include "../../Minecraft.World/Header Files/compression.h" +#include "../net/minecraft/client/skins/TexturePackRepository.h" +#include "../net/minecraft/client/skins/DLCTexturePack.h" +#include "Source Files/DLC/DLCPack.h" +#include "Source Files/Localisation/StringTable.h" +#include "Source Files/UI/All Platforms/ArchiveFile.h" +#include "../net/minecraft/client/Minecraft.h" #if defined(__linux__) #include #include #endif -#include "UI/UI.h" -#include "UI/UIScene_PauseMenu.h" +#include "Source Files/UI/UI.h" +#include "Source Files/UI/Scenes/In-Game Menu Screens/UIScene_PauseMenu.h" #include #include -#include "Leaderboards/LeaderboardManager.h" +#include "Source Files/Leaderboards/LeaderboardManager.h" // CMinecraftApp app; unsigned int CMinecraftApp::m_uiLastSignInData = 0; diff --git a/Minecraft.Client/Platform/Common/Consoles_App.h b/Minecraft.Client/Common/Consoles_App.h similarity index 98% rename from Minecraft.Client/Platform/Common/Consoles_App.h rename to Minecraft.Client/Common/Consoles_App.h index 9263ac5b2..30e05aab9 100644 --- a/Minecraft.Client/Platform/Common/Consoles_App.h +++ b/Minecraft.Client/Common/Consoles_App.h @@ -5,26 +5,26 @@ // using namespace std; -#include "Audio/Consoles_SoundEngine.h" +#include "Source Files/Audio/Consoles_SoundEngine.h" #if !defined(__linux__) #include #endif -#include "Tutorial/TutorialEnum.h" +#include "Source Files/Tutorial/TutorialEnum.h" -#include "UI/UIStructs.h" +#include "Source Files/UI/All Platforms/UIStructs.h" -#include "../Minecraft.World/Network/Packets/DisconnectPacket.h" +#include "../../Minecraft.World/net/minecraft/network/packet/DisconnectPacket.h" #if !defined(__linux__) #include #endif -#include "../Minecraft.Client/Utils/StringTable.h" -#include "DLC/DLCManager.h" -#include "GameRules/ConsoleGameRulesConstants.h" -#include "GameRules/GameRuleManager.h" -#include "../Minecraft.Client/Rendering/Models/SkinBox.h" -#include "../Minecraft.Client/Utils/ArchiveFile.h" -#include "../Minecraft.World/Entities/MinecartHopper.h" +#include "Source Files/Localisation/StringTable.h" +#include "Source Files/DLC/DLCManager.h" +#include "Source Files/GameRules/ConsoleGameRulesConstants.h" +#include "Source Files/GameRules/GameRuleManager.h" +#include "../Header Files/SkinBox.h" +#include "Source Files/UI/All Platforms/ArchiveFile.h" +#include "../../Minecraft.World/net/minecraft/world/entity/item/MinecartHopper.h" typedef struct _JoinFromInviteData { std::uint32_t dwUserIndex; // dwUserIndex diff --git a/Minecraft.Client/Platform/Windows64/Minecraft_Macros.h b/Minecraft.Client/Common/Minecraft_Macros.h similarity index 100% rename from Minecraft.Client/Platform/Windows64/Minecraft_Macros.h rename to Minecraft.Client/Common/Minecraft_Macros.h diff --git a/Minecraft.Client/Platform/Common/Potion_Macros.h b/Minecraft.Client/Common/Potion_Macros.h similarity index 100% rename from Minecraft.Client/Platform/Common/Potion_Macros.h rename to Minecraft.Client/Common/Potion_Macros.h diff --git a/Minecraft.Client/Platform/Common/ShutdownManager.h b/Minecraft.Client/Common/ShutdownManager.h similarity index 95% rename from Minecraft.Client/Platform/Common/ShutdownManager.h rename to Minecraft.Client/Common/ShutdownManager.h index 3e672c037..0153b511f 100644 --- a/Minecraft.Client/Platform/Common/ShutdownManager.h +++ b/Minecraft.Client/Common/ShutdownManager.h @@ -6,7 +6,7 @@ #include #include -#include "../../../Minecraft.World/Util/C4JThread.h" +#include "../../Minecraft.World/ConsoleHelpers/C4JThread.h" class ShutdownManager { public: diff --git a/Minecraft.Client/Platform/Common/Audio/Consoles_SoundEngine.cpp b/Minecraft.Client/Common/Source Files/Audio/Consoles_SoundEngine.cpp similarity index 93% rename from Minecraft.Client/Platform/Common/Audio/Consoles_SoundEngine.cpp rename to Minecraft.Client/Common/Source Files/Audio/Consoles_SoundEngine.cpp index 900ec6dc3..708cee3d6 100644 --- a/Minecraft.Client/Platform/Common/Audio/Consoles_SoundEngine.cpp +++ b/Minecraft.Client/Common/Source Files/Audio/Consoles_SoundEngine.cpp @@ -1,4 +1,4 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "Consoles_SoundEngine.h" bool ConsoleSoundEngine::GetIsPlayingStreamingCDMusic() { diff --git a/Minecraft.Client/Platform/Common/Audio/Consoles_SoundEngine.h b/Minecraft.Client/Common/Source Files/Audio/Consoles_SoundEngine.h similarity index 93% rename from Minecraft.Client/Platform/Common/Audio/Consoles_SoundEngine.h rename to Minecraft.Client/Common/Source Files/Audio/Consoles_SoundEngine.h index 6d25da9b5..b2abab2f8 100644 --- a/Minecraft.Client/Platform/Common/Audio/Consoles_SoundEngine.h +++ b/Minecraft.Client/Common/Source Files/Audio/Consoles_SoundEngine.h @@ -1,12 +1,12 @@ #pragma once -#include "../../Minecraft.World/Util/SoundTypes.h" +#include "../../../../Minecraft.World/Header Files/SoundTypes.h" #ifdef _WINDOWS64 -#include "../../windows64/Miles/include/mss.h" +#include "../../../Windows64/Miles Sound System/Include/mss.h" #else // Linux currently uses the Windows64 Miles headers as the compatible host SDK. -#include "../../Minecraft.Client/Platform/Windows64/Miles/include/mss.h" +#include "../../../Windows64/Miles Sound System/Include/mss.h" #endif typedef struct { diff --git a/Minecraft.Client/Platform/Common/Audio/SoundEngine.cpp b/Minecraft.Client/Common/Source Files/Audio/SoundEngine.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/Audio/SoundEngine.cpp rename to Minecraft.Client/Common/Source Files/Audio/SoundEngine.cpp index 29e246508..f5a13942d 100644 --- a/Minecraft.Client/Platform/Common/Audio/SoundEngine.cpp +++ b/Minecraft.Client/Common/Source Files/Audio/SoundEngine.cpp @@ -1,13 +1,13 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "SoundEngine.h" -#include "../../Minecraft.World/Util/PathHelper.h" -#include "../Consoles_App.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Level/LevelData.h" -#include "../../Minecraft.World/Util/Mth.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePackRepository.h" -#include "../../Minecraft.Client/Textures/Packs/DLCTexturePack.h" +#include "../../../../Minecraft.World/Header Files/PathHelper.h" +#include "../../Consoles_App.h" +#include "../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/storage/LevelData.h" +#include "../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "../../../net/minecraft/client/skins/TexturePackRepository.h" +#include "../../../net/minecraft/client/skins/DLCTexturePack.h" #include "../DLC/DLCAudioFile.h" #if defined(__linux__) @@ -33,7 +33,7 @@ int strcasecmp(const char* a, const char* b) { #include "stb_vorbis.c" #endif #if defined(_WINDOWS64) -#include "../../Minecraft.Client/Platform/Windows64/Windows64_App.h" +#include "../../../Windows64/Windows64_App.h" #include "../../Minecraft.Client/Platform/Windows64/Miles/include/imssapi.h" #endif diff --git a/Minecraft.Client/Platform/Common/Audio/SoundEngine.h b/Minecraft.Client/Common/Source Files/Audio/SoundEngine.h similarity index 98% rename from Minecraft.Client/Platform/Common/Audio/SoundEngine.h rename to Minecraft.Client/Common/Source Files/Audio/SoundEngine.h index 558131447..65f6606d8 100644 --- a/Minecraft.Client/Platform/Common/Audio/SoundEngine.h +++ b/Minecraft.Client/Common/Source Files/Audio/SoundEngine.h @@ -2,7 +2,7 @@ class Mob; class Options; using namespace std; -#include "../../Minecraft.World/Util/SoundTypes.h" +#include "../../../../Minecraft.World/Header Files/SoundTypes.h" #include "./miniaudio.h" constexpr float SFX_3D_MIN_DISTANCE = 1.0f; constexpr float SFX_3D_MAX_DISTANCE = 16.0f; diff --git a/Minecraft.Client/Platform/Common/Audio/SoundNames.cpp b/Minecraft.Client/Common/Source Files/Audio/SoundNames.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/Audio/SoundNames.cpp rename to Minecraft.Client/Common/Source Files/Audio/SoundNames.cpp index 867716afb..e04bbf71f 100644 --- a/Minecraft.Client/Platform/Common/Audio/SoundNames.cpp +++ b/Minecraft.Client/Common/Source Files/Audio/SoundNames.cpp @@ -1,4 +1,4 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "Consoles_SoundEngine.h" diff --git a/Minecraft.Client/Platform/Common/BuildVer.h b/Minecraft.Client/Common/Source Files/BuildVer/BuildVer.h similarity index 100% rename from Minecraft.Client/Platform/Common/BuildVer.h rename to Minecraft.Client/Common/Source Files/BuildVer/BuildVer.h diff --git a/Minecraft.Client/Platform/Common/Colours/ColourTable.cpp b/Minecraft.Client/Common/Source Files/Colours/ColourTable.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/Colours/ColourTable.cpp rename to Minecraft.Client/Common/Source Files/Colours/ColourTable.cpp index 04cfb7fbd..ede383611 100644 --- a/Minecraft.Client/Platform/Common/Colours/ColourTable.cpp +++ b/Minecraft.Client/Common/Source Files/Colours/ColourTable.cpp @@ -1,6 +1,6 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "ColourTable.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" std::unordered_map ColourTable::s_colourNamesMap; diff --git a/Minecraft.Client/Platform/Common/Colours/ColourTable.h b/Minecraft.Client/Common/Source Files/Colours/ColourTable.h similarity index 100% rename from Minecraft.Client/Platform/Common/Colours/ColourTable.h rename to Minecraft.Client/Common/Source Files/Colours/ColourTable.h diff --git a/Minecraft.Client/Platform/Common/ConsoleGameMode.cpp b/Minecraft.Client/Common/Source Files/ConsoleGameMode.cpp similarity index 82% rename from Minecraft.Client/Platform/Common/ConsoleGameMode.cpp rename to Minecraft.Client/Common/Source Files/ConsoleGameMode.cpp index d4c2c7f3c..c571751b4 100644 --- a/Minecraft.Client/Platform/Common/ConsoleGameMode.cpp +++ b/Minecraft.Client/Common/Source Files/ConsoleGameMode.cpp @@ -1,4 +1,4 @@ -#include "../Minecraft.World/Platform/stdafx.h" +#include "../../../Minecraft.World/Header Files/stdafx.h" #include "ConsoleGameMode.h" #include "Tutorial/Tutorial.h" diff --git a/Minecraft.Client/Platform/Common/ConsoleGameMode.h b/Minecraft.Client/Common/Source Files/ConsoleGameMode.h similarity index 100% rename from Minecraft.Client/Platform/Common/ConsoleGameMode.h rename to Minecraft.Client/Common/Source Files/ConsoleGameMode.h diff --git a/Minecraft.Client/Platform/Common/Console_Awards_enum.h b/Minecraft.Client/Common/Source Files/Console_Awards_enum.h similarity index 100% rename from Minecraft.Client/Platform/Common/Console_Awards_enum.h rename to Minecraft.Client/Common/Source Files/Console_Awards_enum.h diff --git a/Minecraft.Client/Platform/Common/Console_Debug_enum.h b/Minecraft.Client/Common/Source Files/Console_Debug_enum.h similarity index 100% rename from Minecraft.Client/Platform/Common/Console_Debug_enum.h rename to Minecraft.Client/Common/Source Files/Console_Debug_enum.h diff --git a/Minecraft.Client/Platform/Common/Console_Utils.cpp b/Minecraft.Client/Common/Source Files/Console_Utils.cpp similarity index 95% rename from Minecraft.Client/Platform/Common/Console_Utils.cpp rename to Minecraft.Client/Common/Source Files/Console_Utils.cpp index 715a2fd2b..8576bb21a 100644 --- a/Minecraft.Client/Platform/Common/Console_Utils.cpp +++ b/Minecraft.Client/Common/Source Files/Console_Utils.cpp @@ -1,4 +1,4 @@ -#include "../Minecraft.World/Platform/stdafx.h" +#include "../../../Minecraft.World/Header Files/stdafx.h" #define CDECL diff --git a/Minecraft.Client/Platform/Common/DLC/DLCAudioFile.cpp b/Minecraft.Client/Common/Source Files/DLC/DLCAudioFile.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/DLC/DLCAudioFile.cpp rename to Minecraft.Client/Common/Source Files/DLC/DLCAudioFile.cpp index 51d9fdf09..cbd55daf2 100644 --- a/Minecraft.Client/Platform/Common/DLC/DLCAudioFile.cpp +++ b/Minecraft.Client/Common/Source Files/DLC/DLCAudioFile.cpp @@ -1,12 +1,12 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include #include #include #include "DLCManager.h" #include "DLCAudioFile.h" #if defined(_WINDOWS64) -#include "../../Minecraft.Client/Platform/Common/XML/ATGXmlParser.h" -#include "../../Minecraft.Client/Platform/Common/XML/xmlFilesCallback.h" +#include "../../../Windows64/XML/ATGXmlParser.h" +#include "../../../Windows64/XML/xmlFilesCallback.h" #endif namespace { diff --git a/Minecraft.Client/Platform/Common/DLC/DLCAudioFile.h b/Minecraft.Client/Common/Source Files/DLC/DLCAudioFile.h similarity index 100% rename from Minecraft.Client/Platform/Common/DLC/DLCAudioFile.h rename to Minecraft.Client/Common/Source Files/DLC/DLCAudioFile.h diff --git a/Minecraft.Client/Platform/Common/DLC/DLCCapeFile.cpp b/Minecraft.Client/Common/Source Files/DLC/DLCCapeFile.cpp similarity index 82% rename from Minecraft.Client/Platform/Common/DLC/DLCCapeFile.cpp rename to Minecraft.Client/Common/Source Files/DLC/DLCCapeFile.cpp index 151d1176b..0d93b82a4 100644 --- a/Minecraft.Client/Platform/Common/DLC/DLCCapeFile.cpp +++ b/Minecraft.Client/Common/Source Files/DLC/DLCCapeFile.cpp @@ -1,4 +1,4 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "DLCManager.h" #include "DLCCapeFile.h" diff --git a/Minecraft.Client/Platform/Common/DLC/DLCCapeFile.h b/Minecraft.Client/Common/Source Files/DLC/DLCCapeFile.h similarity index 100% rename from Minecraft.Client/Platform/Common/DLC/DLCCapeFile.h rename to Minecraft.Client/Common/Source Files/DLC/DLCCapeFile.h diff --git a/Minecraft.Client/Platform/Common/DLC/DLCColourTableFile.cpp b/Minecraft.Client/Common/Source Files/DLC/DLCColourTableFile.cpp similarity index 73% rename from Minecraft.Client/Platform/Common/DLC/DLCColourTableFile.cpp rename to Minecraft.Client/Common/Source Files/DLC/DLCColourTableFile.cpp index 2c0ce4980..ddb7b7854 100644 --- a/Minecraft.Client/Platform/Common/DLC/DLCColourTableFile.cpp +++ b/Minecraft.Client/Common/Source Files/DLC/DLCColourTableFile.cpp @@ -1,9 +1,9 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "DLCManager.h" #include "DLCColourTableFile.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePackRepository.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePack.h" +#include "../../../net/minecraft/client/Minecraft.h" +#include "../../../net/minecraft/client/skins/TexturePackRepository.h" +#include "../../../net/minecraft/client/skins/TexturePack.h" DLCColourTableFile::DLCColourTableFile(const std::wstring& path) : DLCFile(DLCManager::e_DLCType_ColourTable, path) { diff --git a/Minecraft.Client/Platform/Common/DLC/DLCColourTableFile.h b/Minecraft.Client/Common/Source Files/DLC/DLCColourTableFile.h similarity index 100% rename from Minecraft.Client/Platform/Common/DLC/DLCColourTableFile.h rename to Minecraft.Client/Common/Source Files/DLC/DLCColourTableFile.h diff --git a/Minecraft.Client/Platform/Common/DLC/DLCFile.cpp b/Minecraft.Client/Common/Source Files/DLC/DLCFile.cpp similarity index 90% rename from Minecraft.Client/Platform/Common/DLC/DLCFile.cpp rename to Minecraft.Client/Common/Source Files/DLC/DLCFile.cpp index 0732416ad..9f9091f05 100644 --- a/Minecraft.Client/Platform/Common/DLC/DLCFile.cpp +++ b/Minecraft.Client/Common/Source Files/DLC/DLCFile.cpp @@ -1,4 +1,4 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "DLCFile.h" DLCFile::DLCFile(DLCManager::EDLCType type, const std::wstring& path) { diff --git a/Minecraft.Client/Platform/Common/DLC/DLCFile.h b/Minecraft.Client/Common/Source Files/DLC/DLCFile.h similarity index 100% rename from Minecraft.Client/Platform/Common/DLC/DLCFile.h rename to Minecraft.Client/Common/Source Files/DLC/DLCFile.h diff --git a/Minecraft.Client/Platform/Common/DLC/DLCGameRules.h b/Minecraft.Client/Common/Source Files/DLC/DLCGameRules.h similarity index 74% rename from Minecraft.Client/Platform/Common/DLC/DLCGameRules.h rename to Minecraft.Client/Common/Source Files/DLC/DLCGameRules.h index 05ad1d783..0da3d4b7b 100644 --- a/Minecraft.Client/Platform/Common/DLC/DLCGameRules.h +++ b/Minecraft.Client/Common/Source Files/DLC/DLCGameRules.h @@ -1,7 +1,7 @@ #pragma once #include "DLCFile.h" -#include "../GameRules/LevelGenerationOptions.h" +#include "../GameRules/LevelGeneration/LevelGenerationOptions.h" class DLCGameRules : public DLCFile { public: diff --git a/Minecraft.Client/Platform/Common/DLC/DLCGameRulesFile.cpp b/Minecraft.Client/Common/Source Files/DLC/DLCGameRulesFile.cpp similarity index 88% rename from Minecraft.Client/Platform/Common/DLC/DLCGameRulesFile.cpp rename to Minecraft.Client/Common/Source Files/DLC/DLCGameRulesFile.cpp index 9c1aa397b..7791dc86f 100644 --- a/Minecraft.Client/Platform/Common/DLC/DLCGameRulesFile.cpp +++ b/Minecraft.Client/Common/Source Files/DLC/DLCGameRulesFile.cpp @@ -1,4 +1,4 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "DLCManager.h" #include "DLCGameRulesFile.h" diff --git a/Minecraft.Client/Platform/Common/DLC/DLCGameRulesFile.h b/Minecraft.Client/Common/Source Files/DLC/DLCGameRulesFile.h similarity index 100% rename from Minecraft.Client/Platform/Common/DLC/DLCGameRulesFile.h rename to Minecraft.Client/Common/Source Files/DLC/DLCGameRulesFile.h diff --git a/Minecraft.Client/Platform/Common/DLC/DLCGameRulesHeader.cpp b/Minecraft.Client/Common/Source Files/DLC/DLCGameRulesHeader.cpp similarity index 77% rename from Minecraft.Client/Platform/Common/DLC/DLCGameRulesHeader.cpp rename to Minecraft.Client/Common/Source Files/DLC/DLCGameRulesHeader.cpp index 9fdf31ff0..28685e7ef 100644 --- a/Minecraft.Client/Platform/Common/DLC/DLCGameRulesHeader.cpp +++ b/Minecraft.Client/Common/Source Files/DLC/DLCGameRulesHeader.cpp @@ -1,10 +1,10 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include -#include "../../Minecraft.World/IO/Files/File.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/IO/Streams/InputOutputStream.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/File.h" +#include "../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "DLCManager.h" #include "DLCGameRulesHeader.h" diff --git a/Minecraft.Client/Platform/Common/DLC/DLCGameRulesHeader.h b/Minecraft.Client/Common/Source Files/DLC/DLCGameRulesHeader.h similarity index 96% rename from Minecraft.Client/Platform/Common/DLC/DLCGameRulesHeader.h rename to Minecraft.Client/Common/Source Files/DLC/DLCGameRulesHeader.h index ddf766d00..e080e2baf 100644 --- a/Minecraft.Client/Platform/Common/DLC/DLCGameRulesHeader.h +++ b/Minecraft.Client/Common/Source Files/DLC/DLCGameRulesHeader.h @@ -1,7 +1,7 @@ #pragma once #include "DLCGameRules.h" -#include "../GameRules/LevelGenerationOptions.h" +#include "../GameRules/LevelGeneration/LevelGenerationOptions.h" class DLCGameRulesHeader : public DLCGameRules, public JustGrSource { private: diff --git a/Minecraft.Client/Platform/Common/DLC/DLCLocalisationFile.cpp b/Minecraft.Client/Common/Source Files/DLC/DLCLocalisationFile.cpp similarity index 78% rename from Minecraft.Client/Platform/Common/DLC/DLCLocalisationFile.cpp rename to Minecraft.Client/Common/Source Files/DLC/DLCLocalisationFile.cpp index 8c835e553..b241ec5c2 100644 --- a/Minecraft.Client/Platform/Common/DLC/DLCLocalisationFile.cpp +++ b/Minecraft.Client/Common/Source Files/DLC/DLCLocalisationFile.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "DLCManager.h" #include "DLCLocalisationFile.h" -#include "../../Minecraft.Client/Utils/StringTable.h" +#include "../Localisation/StringTable.h" DLCLocalisationFile::DLCLocalisationFile(const std::wstring& path) : DLCFile(DLCManager::e_DLCType_LocalisationData, path) { diff --git a/Minecraft.Client/Platform/Common/DLC/DLCLocalisationFile.h b/Minecraft.Client/Common/Source Files/DLC/DLCLocalisationFile.h similarity index 100% rename from Minecraft.Client/Platform/Common/DLC/DLCLocalisationFile.h rename to Minecraft.Client/Common/Source Files/DLC/DLCLocalisationFile.h diff --git a/Minecraft.Client/Platform/Common/DLC/DLCManager.cpp b/Minecraft.Client/Common/Source Files/DLC/DLCManager.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/DLC/DLCManager.cpp rename to Minecraft.Client/Common/Source Files/DLC/DLCManager.cpp index 00b7e0c7b..7cc9b746b 100644 --- a/Minecraft.Client/Platform/Common/DLC/DLCManager.cpp +++ b/Minecraft.Client/Common/Source Files/DLC/DLCManager.cpp @@ -1,12 +1,12 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include #include "DLCManager.h" #include "DLCPack.h" #include "DLCFile.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Util/PortableFileIO.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePackRepository.h" +#include "../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../Minecraft.World/Header Files/PortableFileIO.h" +#include "../../../net/minecraft/client/Minecraft.h" +#include "../../../net/minecraft/client/skins/TexturePackRepository.h" #include #include #include diff --git a/Minecraft.Client/Platform/Common/DLC/DLCManager.h b/Minecraft.Client/Common/Source Files/DLC/DLCManager.h similarity index 100% rename from Minecraft.Client/Platform/Common/DLC/DLCManager.h rename to Minecraft.Client/Common/Source Files/DLC/DLCManager.h diff --git a/Minecraft.Client/Platform/Common/DLC/DLCPack.cpp b/Minecraft.Client/Common/Source Files/DLC/DLCPack.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/DLC/DLCPack.cpp rename to Minecraft.Client/Common/Source Files/DLC/DLCPack.cpp index 790eddab8..6a22c9b38 100644 --- a/Minecraft.Client/Platform/Common/DLC/DLCPack.cpp +++ b/Minecraft.Client/Common/Source Files/DLC/DLCPack.cpp @@ -1,4 +1,4 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "DLCPack.h" #include "DLCSkinFile.h" #include "DLCCapeFile.h" @@ -9,7 +9,7 @@ #include "DLCGameRulesHeader.h" #include "DLCAudioFile.h" #include "DLCColourTableFile.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" DLCPack::DLCPack(const std::wstring& name, std::uint32_t dwLicenseMask) { m_dataPath = L""; diff --git a/Minecraft.Client/Platform/Common/DLC/DLCPack.h b/Minecraft.Client/Common/Source Files/DLC/DLCPack.h similarity index 100% rename from Minecraft.Client/Platform/Common/DLC/DLCPack.h rename to Minecraft.Client/Common/Source Files/DLC/DLCPack.h diff --git a/Minecraft.Client/Platform/Common/DLC/DLCSkinFile.cpp b/Minecraft.Client/Common/Source Files/DLC/DLCSkinFile.cpp similarity index 93% rename from Minecraft.Client/Platform/Common/DLC/DLCSkinFile.cpp rename to Minecraft.Client/Common/Source Files/DLC/DLCSkinFile.cpp index 1f55c3357..727e05bb2 100644 --- a/Minecraft.Client/Platform/Common/DLC/DLCSkinFile.cpp +++ b/Minecraft.Client/Common/Source Files/DLC/DLCSkinFile.cpp @@ -1,11 +1,11 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "DLCManager.h" #include "DLCSkinFile.h" -#include "../../Minecraft.Client/Rendering/Models/ModelPart.h" -#include "../../Minecraft.Client/Rendering/EntityRenderers/EntityRenderer.h" -#include "../../Minecraft.Client/Rendering/EntityRenderers/EntityRenderDispatcher.h" -#include "../../Minecraft.World/Player/Player.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../net/minecraft/client/model/geom/ModelPart.h" +#include "../../../net/minecraft/client/renderer/entity/EntityRenderer.h" +#include "../../../net/minecraft/client/renderer/entity/EntityRenderDispatcher.h" +#include "../../../../Minecraft.World/net/minecraft/world/entity/player/Player.h" +#include "../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" DLCSkinFile::DLCSkinFile(const std::wstring& path) : DLCFile(DLCManager::e_DLCType_Skin, path) { diff --git a/Minecraft.Client/Platform/Common/DLC/DLCSkinFile.h b/Minecraft.Client/Common/Source Files/DLC/DLCSkinFile.h similarity index 93% rename from Minecraft.Client/Platform/Common/DLC/DLCSkinFile.h rename to Minecraft.Client/Common/Source Files/DLC/DLCSkinFile.h index c0facea6c..c30a9fc5a 100644 --- a/Minecraft.Client/Platform/Common/DLC/DLCSkinFile.h +++ b/Minecraft.Client/Common/Source Files/DLC/DLCSkinFile.h @@ -1,6 +1,6 @@ #pragma once #include "DLCFile.h" -#include "../../Minecraft.Client/Rendering/Models/HumanoidModel.h" +#include "../../../net/minecraft/client/model/HumanoidModel.h" class DLCSkinFile : public DLCFile { private: diff --git a/Minecraft.Client/Platform/Common/DLC/DLCTextureFile.cpp b/Minecraft.Client/Common/Source Files/DLC/DLCTextureFile.cpp similarity index 95% rename from Minecraft.Client/Platform/Common/DLC/DLCTextureFile.cpp rename to Minecraft.Client/Common/Source Files/DLC/DLCTextureFile.cpp index ed6b9fcce..f48c38660 100644 --- a/Minecraft.Client/Platform/Common/DLC/DLCTextureFile.cpp +++ b/Minecraft.Client/Common/Source Files/DLC/DLCTextureFile.cpp @@ -1,4 +1,4 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "DLCManager.h" #include "DLCTextureFile.h" diff --git a/Minecraft.Client/Platform/Common/DLC/DLCTextureFile.h b/Minecraft.Client/Common/Source Files/DLC/DLCTextureFile.h similarity index 100% rename from Minecraft.Client/Platform/Common/DLC/DLCTextureFile.h rename to Minecraft.Client/Common/Source Files/DLC/DLCTextureFile.h diff --git a/Minecraft.Client/Platform/Common/DLC/DLCUIDataFile.cpp b/Minecraft.Client/Common/Source Files/DLC/DLCUIDataFile.cpp similarity index 92% rename from Minecraft.Client/Platform/Common/DLC/DLCUIDataFile.cpp rename to Minecraft.Client/Common/Source Files/DLC/DLCUIDataFile.cpp index 4acc5fae2..1ed764f57 100644 --- a/Minecraft.Client/Platform/Common/DLC/DLCUIDataFile.cpp +++ b/Minecraft.Client/Common/Source Files/DLC/DLCUIDataFile.cpp @@ -1,4 +1,4 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "DLCManager.h" #include "DLCUIDataFile.h" diff --git a/Minecraft.Client/Platform/Common/DLC/DLCUIDataFile.h b/Minecraft.Client/Common/Source Files/DLC/DLCUIDataFile.h similarity index 100% rename from Minecraft.Client/Platform/Common/DLC/DLCUIDataFile.h rename to Minecraft.Client/Common/Source Files/DLC/DLCUIDataFile.h diff --git a/Minecraft.Client/Common/Source Files/GameRules/ConsoleGameRules.h b/Minecraft.Client/Common/Source Files/GameRules/ConsoleGameRules.h new file mode 100644 index 000000000..bb12d422e --- /dev/null +++ b/Minecraft.Client/Common/Source Files/GameRules/ConsoleGameRules.h @@ -0,0 +1,32 @@ +#pragma once +#include "ConsoleGameRulesConstants.h" + +#include "GameRuleManager.h" + +#include "LevelRules/Rules/GameRule.h" + +#include "LevelRules/RuleDefinitions/GameRuleDefinition.h" + +#include "LevelRules/RuleDefinitions/LevelRuleset.h" +#include "LevelRules/RuleDefinitions/NamedAreaRuleDefinition.h" + +#include "LevelRules/RuleDefinitions/CollectItemRuleDefinition.h" +#include "LevelRules/RuleDefinitions/CompleteAllRuleDefinition.h" +#include "LevelRules/RuleDefinitions/CompoundGameRuleDefinition.h" +#include "LevelRules/RuleDefinitions/UseTileRuleDefinition.h" +#include "LevelRules/RuleDefinitions/UpdatePlayerRuleDefinition.h" +#include "LevelRules/RuleDefinitions/AddItemRuleDefinition.h" +#include "LevelRules/RuleDefinitions/AddEnchantmentRuleDefinition.h" + +#include "LevelGeneration/LevelGenerationOptions.h" +#include "LevelGeneration/ApplySchematicRuleDefinition.h" +#include "LevelGeneration/ConsoleGenerateStructure.h" +#include "LevelGeneration/ConsoleGenerateStructureAction.h" +#include "LevelGeneration/StructureActions/XboxStructureActionGenerateBox.h" +#include "LevelGeneration/StructureActions/XboxStructureActionPlaceBlock.h" +#include "LevelGeneration/StructureActions/XboxStructureActionPlaceContainer.h" +#include "LevelGeneration/StructureActions/XboxStructureActionPlaceSpawner.h" +#include "LevelGeneration/BiomeOverride.h" +#include "LevelGeneration/StartFeature.h" + +#include "LevelRules/Rules/GameRulesInstance.h" diff --git a/Minecraft.Client/Platform/Common/GameRules/ConsoleGameRulesConstants.h b/Minecraft.Client/Common/Source Files/GameRules/ConsoleGameRulesConstants.h similarity index 100% rename from Minecraft.Client/Platform/Common/GameRules/ConsoleGameRulesConstants.h rename to Minecraft.Client/Common/Source Files/GameRules/ConsoleGameRulesConstants.h diff --git a/Minecraft.Client/Platform/Common/GameRules/GameRuleManager.cpp b/Minecraft.Client/Common/Source Files/GameRules/GameRuleManager.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/GameRules/GameRuleManager.cpp rename to Minecraft.Client/Common/Source Files/GameRules/GameRuleManager.cpp index fd3f79820..973c79c9b 100644 --- a/Minecraft.Client/Platform/Common/GameRules/GameRuleManager.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/GameRuleManager.cpp @@ -1,14 +1,14 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/IO/Streams/Compression.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/IO/Files/File.h" -#include "../../Minecraft.World/IO/Streams/Compression.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../Minecraft.World/Header Files/compression.h" +#include "../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/File.h" +#include "../../../../Minecraft.World/Header Files/compression.h" #include "../DLC/DLCPack.h" #include "../DLC/DLCLocalisationFile.h" #include "../DLC/DLCGameRulesFile.h" #include "../DLC/DLCGameRules.h" #include "../DLC/DLCGameRulesHeader.h" -#include "../../Minecraft.Client/Utils/StringTable.h" +#include "../Localisation/StringTable.h" #include "ConsoleGameRules.h" #include "GameRuleManager.h" diff --git a/Minecraft.Client/Platform/Common/GameRules/GameRuleManager.h b/Minecraft.Client/Common/Source Files/GameRules/GameRuleManager.h similarity index 97% rename from Minecraft.Client/Platform/Common/GameRules/GameRuleManager.h rename to Minecraft.Client/Common/Source Files/GameRules/GameRuleManager.h index ae4a28ad4..90e97e43c 100644 --- a/Minecraft.Client/Platform/Common/GameRules/GameRuleManager.h +++ b/Minecraft.Client/Common/Source Files/GameRules/GameRuleManager.h @@ -1,8 +1,8 @@ #pragma once ////using namespace std; -#include "LevelGenerators.h" -#include "LevelRules.h" +#include "LevelGeneration/LevelGenerators.h" +#include "LevelRules/LevelRules.h" #include "../DLC/DLCGameRulesHeader.h" class LevelGenerationOptions; diff --git a/Minecraft.Client/Platform/Common/GameRules/ApplySchematicRuleDefinition.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ApplySchematicRuleDefinition.cpp similarity index 93% rename from Minecraft.Client/Platform/Common/GameRules/ApplySchematicRuleDefinition.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ApplySchematicRuleDefinition.cpp index d6d049b59..43c7e25ba 100644 --- a/Minecraft.Client/Platform/Common/GameRules/ApplySchematicRuleDefinition.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ApplySchematicRuleDefinition.cpp @@ -1,14 +1,14 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.phys.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.chunk.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../Minecraft.World/net/minecraft/world/phys/net.minecraft.world.phys.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" #include "ApplySchematicRuleDefinition.h" #include "LevelGenerationOptions.h" #include "ConsoleSchematicFile.h" -#include "../../Minecraft.World/Util/AABB.h" +#include "../../../../../Minecraft.World/net/minecraft/world/phys/AABB.h" ApplySchematicRuleDefinition::ApplySchematicRuleDefinition( LevelGenerationOptions* levelGenOptions) { diff --git a/Minecraft.Client/Platform/Common/GameRules/ApplySchematicRuleDefinition.h b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ApplySchematicRuleDefinition.h similarity index 92% rename from Minecraft.Client/Platform/Common/GameRules/ApplySchematicRuleDefinition.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ApplySchematicRuleDefinition.h index 90afa1be1..92a7083d1 100644 --- a/Minecraft.Client/Platform/Common/GameRules/ApplySchematicRuleDefinition.h +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ApplySchematicRuleDefinition.h @@ -1,8 +1,8 @@ #pragma once #include -#include "GameRuleDefinition.h" +#include "../LevelRules/RuleDefinitions/GameRuleDefinition.h" #include "ConsoleSchematicFile.h" -#include "../../Minecraft.World/Util/AABB.h" +#include "../../../../../Minecraft.World/net/minecraft/world/phys/AABB.h" class AABB; class Vec3; diff --git a/Minecraft.Client/Platform/Common/GameRules/BiomeOverride.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/BiomeOverride.cpp similarity index 92% rename from Minecraft.Client/Platform/Common/GameRules/BiomeOverride.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/BiomeOverride.cpp index 9ee41e272..9db6a4a18 100644 --- a/Minecraft.Client/Platform/Common/GameRules/BiomeOverride.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/BiomeOverride.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #include "BiomeOverride.h" BiomeOverride::BiomeOverride() { diff --git a/Minecraft.Client/Platform/Common/GameRules/BiomeOverride.h b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/BiomeOverride.h similarity index 91% rename from Minecraft.Client/Platform/Common/GameRules/BiomeOverride.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/BiomeOverride.h index 191cbff33..dddf3ea6f 100644 --- a/Minecraft.Client/Platform/Common/GameRules/BiomeOverride.h +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/BiomeOverride.h @@ -1,7 +1,7 @@ #pragma once // using namespace std; -#include "GameRuleDefinition.h" +#include "../LevelRules/RuleDefinitions/GameRuleDefinition.h" class BiomeOverride : public GameRuleDefinition { private: diff --git a/Minecraft.Client/Platform/Common/GameRules/ConsoleGenerateStructure.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ConsoleGenerateStructure.cpp similarity index 91% rename from Minecraft.Client/Platform/Common/GameRules/ConsoleGenerateStructure.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ConsoleGenerateStructure.cpp index 64c9db7af..4fd480cfb 100644 --- a/Minecraft.Client/Platform/Common/GameRules/ConsoleGenerateStructure.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ConsoleGenerateStructure.cpp @@ -1,11 +1,11 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ConsoleGenerateStructure.h" -#include "ConsoleGameRules.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.levelgen.structure.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Headers/net.minecraft.h" +#include "../ConsoleGameRules.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/levelgen/structure/net.minecraft.world.level.levelgen.structure.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../Minecraft.World/net/minecraft/net.minecraft.h" ConsoleGenerateStructure::ConsoleGenerateStructure() : StructurePiece(0) { m_x = m_y = m_z = 0; diff --git a/Minecraft.Client/Platform/Common/GameRules/ConsoleGenerateStructure.h b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ConsoleGenerateStructure.h similarity index 90% rename from Minecraft.Client/Platform/Common/GameRules/ConsoleGenerateStructure.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ConsoleGenerateStructure.h index c65280d56..388cdc5aa 100644 --- a/Minecraft.Client/Platform/Common/GameRules/ConsoleGenerateStructure.h +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ConsoleGenerateStructure.h @@ -1,6 +1,6 @@ #pragma once -#include "GameRuleDefinition.h" -#include "../../Minecraft.World/WorldGen/Structures/StructurePiece.h" +#include "../LevelRules/RuleDefinitions/GameRuleDefinition.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/levelgen/structure/StructurePiece.h" class Level; class Random; diff --git a/Minecraft.Client/Platform/Common/GameRules/ConsoleGenerateStructureAction.h b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ConsoleGenerateStructureAction.h similarity index 74% rename from Minecraft.Client/Platform/Common/GameRules/ConsoleGenerateStructureAction.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ConsoleGenerateStructureAction.h index 937b70c34..1e12e739b 100644 --- a/Minecraft.Client/Platform/Common/GameRules/ConsoleGenerateStructureAction.h +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ConsoleGenerateStructureAction.h @@ -1,6 +1,6 @@ #pragma once -#include "GameRuleDefinition.h" +#include "../LevelRules/RuleDefinitions/GameRuleDefinition.h" class ConsoleGenerateStructureAction : public GameRuleDefinition { public: diff --git a/Minecraft.Client/Platform/Common/GameRules/ConsoleSchematicFile.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ConsoleSchematicFile.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/GameRules/ConsoleSchematicFile.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ConsoleSchematicFile.cpp index 9614fcfca..1df124475 100644 --- a/Minecraft.Client/Platform/Common/GameRules/ConsoleSchematicFile.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ConsoleSchematicFile.cpp @@ -1,16 +1,16 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include -#include "../../Minecraft.World/Headers/com.mojang.nbt.h" -#include "../../Minecraft.World/Platform/System.h" +#include "../../../../../Minecraft.World/com/mojang/nbt/com.mojang.nbt.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/System.h" #include "ConsoleSchematicFile.h" -#include "../../Minecraft.World/IO/Streams/InputOutputStream.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.chunk.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.phys.h" -#include "../../Minecraft.World/IO/Streams/Compression.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/phys/net.minecraft.world.phys.h" +#include "../../../../../Minecraft.World/Header Files/compression.h" ConsoleSchematicFile::ConsoleSchematicFile() { m_xSize = m_ySize = m_zSize = 0; diff --git a/Minecraft.Client/Platform/Common/GameRules/ConsoleSchematicFile.h b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ConsoleSchematicFile.h similarity index 98% rename from Minecraft.Client/Platform/Common/GameRules/ConsoleSchematicFile.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ConsoleSchematicFile.h index 8a54f201d..e52cb93f1 100644 --- a/Minecraft.Client/Platform/Common/GameRules/ConsoleSchematicFile.h +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/ConsoleSchematicFile.h @@ -4,7 +4,7 @@ #define XBOX_SCHEMATIC_ORIGINAL_VERSION 1 #define XBOX_SCHEMATIC_CURRENT_VERSION 2 -#include "../../Minecraft.World/Util/ArrayWithLength.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/ArrayWithLength.h" class Level; class DataOutputStream; diff --git a/Minecraft.Client/Platform/Common/GameRules/LevelGenerationOptions.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/LevelGenerationOptions.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/GameRules/LevelGenerationOptions.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/LevelGenerationOptions.cpp index 105267e8d..d29d67547 100644 --- a/Minecraft.Client/Platform/Common/GameRules/LevelGenerationOptions.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/LevelGenerationOptions.cpp @@ -1,15 +1,15 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Util/Pos.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.phys.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.chunk.h" -#include "../../Minecraft.Client/Utils/StringTable.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../Minecraft.World/net/minecraft/Pos.h" +#include "../../../../../Minecraft.World/net/minecraft/world/phys/net.minecraft.world.phys.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h" +#include "../../Localisation/StringTable.h" #include "LevelGenerationOptions.h" -#include "ConsoleGameRules.h" +#include "../ConsoleGameRules.h" JustGrSource::JustGrSource() { m_displayName = L"Default_DisplayName"; diff --git a/Minecraft.Client/Platform/Common/GameRules/LevelGenerationOptions.h b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/LevelGenerationOptions.h similarity index 97% rename from Minecraft.Client/Platform/Common/GameRules/LevelGenerationOptions.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/LevelGenerationOptions.h index f95c9accc..b6b598208 100644 --- a/Minecraft.Client/Platform/Common/GameRules/LevelGenerationOptions.h +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/LevelGenerationOptions.h @@ -5,8 +5,8 @@ #include -#include "GameRuleDefinition.h" -#include "../../Minecraft.World/WorldGen/Features/StructureFeature.h" +#include "../LevelRules/RuleDefinitions/GameRuleDefinition.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureFeature.h" class ApplySchematicRuleDefinition; class LevelChunk; diff --git a/Minecraft.Client/Platform/Common/GameRules/LevelGenerators.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/LevelGenerators.cpp similarity index 91% rename from Minecraft.Client/Platform/Common/GameRules/LevelGenerators.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/LevelGenerators.cpp index 5c8fdff78..7e80242a1 100644 --- a/Minecraft.Client/Platform/Common/GameRules/LevelGenerators.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/LevelGenerators.cpp @@ -1,4 +1,4 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "LevelGenerationOptions.h" #include "LevelGenerators.h" diff --git a/Minecraft.Client/Platform/Common/GameRules/LevelGenerators.h b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/LevelGenerators.h similarity index 100% rename from Minecraft.Client/Platform/Common/GameRules/LevelGenerators.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/LevelGenerators.h diff --git a/Minecraft.Client/Platform/Common/GameRules/StartFeature.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StartFeature.cpp similarity index 94% rename from Minecraft.Client/Platform/Common/GameRules/StartFeature.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StartFeature.cpp index 293e4ca84..6824bc977 100644 --- a/Minecraft.Client/Platform/Common/GameRules/StartFeature.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StartFeature.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #include "StartFeature.h" StartFeature::StartFeature() { diff --git a/Minecraft.Client/Platform/Common/GameRules/StartFeature.h b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StartFeature.h similarity index 81% rename from Minecraft.Client/Platform/Common/GameRules/StartFeature.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StartFeature.h index d2c7c9d24..bdc3b0166 100644 --- a/Minecraft.Client/Platform/Common/GameRules/StartFeature.h +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StartFeature.h @@ -1,8 +1,8 @@ #pragma once // using namespace std; -#include "GameRuleDefinition.h" -#include "../../Minecraft.World/WorldGen/Features/StructureFeature.h" +#include "../LevelRules/RuleDefinitions/GameRuleDefinition.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureFeature.h" class StartFeature : public GameRuleDefinition { private: diff --git a/Minecraft.Client/Platform/Common/GameRules/XboxStructureActionGenerateBox.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionGenerateBox.cpp similarity index 93% rename from Minecraft.Client/Platform/Common/GameRules/XboxStructureActionGenerateBox.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionGenerateBox.cpp index 4edd3be9d..70888aedb 100644 --- a/Minecraft.Client/Platform/Common/GameRules/XboxStructureActionGenerateBox.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionGenerateBox.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "XboxStructureActionGenerateBox.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.levelgen.structure.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/levelgen/structure/net.minecraft.world.level.levelgen.structure.h" XboxStructureActionGenerateBox::XboxStructureActionGenerateBox() { m_x0 = m_y0 = m_z0 = m_x1 = m_y1 = m_z1 = m_edgeTile = m_fillTile = 0; diff --git a/Minecraft.Client/Platform/Common/GameRules/XboxStructureActionGenerateBox.h b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionGenerateBox.h similarity index 94% rename from Minecraft.Client/Platform/Common/GameRules/XboxStructureActionGenerateBox.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionGenerateBox.h index 7625f141c..e6fc7e256 100644 --- a/Minecraft.Client/Platform/Common/GameRules/XboxStructureActionGenerateBox.h +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionGenerateBox.h @@ -1,5 +1,5 @@ #pragma once -#include "ConsoleGenerateStructureAction.h" +#include "../ConsoleGenerateStructureAction.h" class StructurePiece; class Level; diff --git a/Minecraft.Client/Platform/Common/GameRules/XboxStructureActionPlaceBlock.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionPlaceBlock.cpp similarity index 90% rename from Minecraft.Client/Platform/Common/GameRules/XboxStructureActionPlaceBlock.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionPlaceBlock.cpp index b98d4a974..5812b8c82 100644 --- a/Minecraft.Client/Platform/Common/GameRules/XboxStructureActionPlaceBlock.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionPlaceBlock.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "XboxStructureActionPlaceBlock.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.levelgen.structure.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/levelgen/structure/net.minecraft.world.level.levelgen.structure.h" XboxStructureActionPlaceBlock::XboxStructureActionPlaceBlock() { m_x = m_y = m_z = m_tile = m_data = 0; diff --git a/Minecraft.Client/Platform/Common/GameRules/XboxStructureActionPlaceBlock.h b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionPlaceBlock.h similarity index 94% rename from Minecraft.Client/Platform/Common/GameRules/XboxStructureActionPlaceBlock.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionPlaceBlock.h index 63a4b6754..7c740c7ba 100644 --- a/Minecraft.Client/Platform/Common/GameRules/XboxStructureActionPlaceBlock.h +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionPlaceBlock.h @@ -1,5 +1,5 @@ #pragma once -#include "ConsoleGenerateStructureAction.h" +#include "../ConsoleGenerateStructureAction.h" class StructurePiece; class Level; diff --git a/Minecraft.Client/Platform/Common/GameRules/XboxStructureActionPlaceContainer.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionPlaceContainer.cpp similarity index 83% rename from Minecraft.Client/Platform/Common/GameRules/XboxStructureActionPlaceContainer.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionPlaceContainer.cpp index 1315c1ea6..9484fc0d5 100644 --- a/Minecraft.Client/Platform/Common/GameRules/XboxStructureActionPlaceContainer.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionPlaceContainer.cpp @@ -1,11 +1,11 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #include "XboxStructureActionPlaceContainer.h" -#include "AddItemRuleDefinition.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.levelgen.structure.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" +#include "../../LevelRules/RuleDefinitions/AddItemRuleDefinition.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/levelgen/structure/net.minecraft.world.level.levelgen.structure.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" XboxStructureActionPlaceContainer::XboxStructureActionPlaceContainer() { m_tile = Tile::chest_Id; diff --git a/Minecraft.Client/Platform/Common/GameRules/XboxStructureActionPlaceContainer.h b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionPlaceContainer.h similarity index 100% rename from Minecraft.Client/Platform/Common/GameRules/XboxStructureActionPlaceContainer.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionPlaceContainer.h diff --git a/Minecraft.Client/Platform/Common/GameRules/XboxStructureActionPlaceSpawner.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionPlaceSpawner.cpp similarity index 82% rename from Minecraft.Client/Platform/Common/GameRules/XboxStructureActionPlaceSpawner.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionPlaceSpawner.cpp index 670528169..4c24dcc3d 100644 --- a/Minecraft.Client/Platform/Common/GameRules/XboxStructureActionPlaceSpawner.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionPlaceSpawner.cpp @@ -1,9 +1,9 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #include "XboxStructureActionPlaceSpawner.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.levelgen.structure.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/levelgen/structure/net.minecraft.world.level.levelgen.structure.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" XboxStructureActionPlaceSpawner::XboxStructureActionPlaceSpawner() { m_tile = Tile::mobSpawner_Id; diff --git a/Minecraft.Client/Platform/Common/GameRules/XboxStructureActionPlaceSpawner.h b/Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionPlaceSpawner.h similarity index 100% rename from Minecraft.Client/Platform/Common/GameRules/XboxStructureActionPlaceSpawner.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/StructureActions/XboxStructureActionPlaceSpawner.h diff --git a/Minecraft.Client/Platform/Common/GameRules/LevelRules.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/LevelRules.cpp similarity index 86% rename from Minecraft.Client/Platform/Common/GameRules/LevelRules.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/LevelRules.cpp index 8e280e0ac..7d02770b1 100644 --- a/Minecraft.Client/Platform/Common/GameRules/LevelRules.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/LevelRules.cpp @@ -1,4 +1,4 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "LevelRules.h" LevelRules::LevelRules() {} diff --git a/Minecraft.Client/Platform/Common/GameRules/LevelRules.h b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/LevelRules.h similarity index 100% rename from Minecraft.Client/Platform/Common/GameRules/LevelRules.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/LevelRules.h diff --git a/Minecraft.Client/Platform/Common/GameRules/AddEnchantmentRuleDefinition.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/AddEnchantmentRuleDefinition.cpp similarity index 87% rename from Minecraft.Client/Platform/Common/GameRules/AddEnchantmentRuleDefinition.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/AddEnchantmentRuleDefinition.cpp index 4a1d27bf7..81a5a4574 100644 --- a/Minecraft.Client/Platform/Common/GameRules/AddEnchantmentRuleDefinition.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/AddEnchantmentRuleDefinition.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.enchantment.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/enchantment/net.minecraft.world.item.enchantment.h" #include "AddEnchantmentRuleDefinition.h" AddEnchantmentRuleDefinition::AddEnchantmentRuleDefinition() { diff --git a/Minecraft.Client/Platform/Common/GameRules/AddEnchantmentRuleDefinition.h b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/AddEnchantmentRuleDefinition.h similarity index 100% rename from Minecraft.Client/Platform/Common/GameRules/AddEnchantmentRuleDefinition.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/AddEnchantmentRuleDefinition.h diff --git a/Minecraft.Client/Platform/Common/GameRules/AddItemRuleDefinition.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/AddItemRuleDefinition.cpp similarity index 90% rename from Minecraft.Client/Platform/Common/GameRules/AddItemRuleDefinition.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/AddItemRuleDefinition.cpp index 4f9868d24..8fe3538c2 100644 --- a/Minecraft.Client/Platform/Common/GameRules/AddItemRuleDefinition.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/AddItemRuleDefinition.cpp @@ -1,8 +1,8 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" #include "AddItemRuleDefinition.h" #include "AddEnchantmentRuleDefinition.h" diff --git a/Minecraft.Client/Platform/Common/GameRules/AddItemRuleDefinition.h b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/AddItemRuleDefinition.h similarity index 100% rename from Minecraft.Client/Platform/Common/GameRules/AddItemRuleDefinition.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/AddItemRuleDefinition.h diff --git a/Minecraft.Client/Platform/Common/GameRules/CollectItemRuleDefinition.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/CollectItemRuleDefinition.cpp similarity index 90% rename from Minecraft.Client/Platform/Common/GameRules/CollectItemRuleDefinition.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/CollectItemRuleDefinition.cpp index 7360dcf33..2e454297f 100644 --- a/Minecraft.Client/Platform/Common/GameRules/CollectItemRuleDefinition.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/CollectItemRuleDefinition.cpp @@ -1,10 +1,10 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.Client/Utils/WstringLookup.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../WstringLookup.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #include "CollectItemRuleDefinition.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Network/Connection.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.packet.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/network/Connection.h" +#include "../../../../../../Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h" CollectItemRuleDefinition::CollectItemRuleDefinition() { m_itemId = 0; diff --git a/Minecraft.Client/Platform/Common/GameRules/CollectItemRuleDefinition.h b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/CollectItemRuleDefinition.h similarity index 100% rename from Minecraft.Client/Platform/Common/GameRules/CollectItemRuleDefinition.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/CollectItemRuleDefinition.h diff --git a/Minecraft.Client/Platform/Common/GameRules/CompleteAllRuleDefinition.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/CompleteAllRuleDefinition.cpp similarity index 86% rename from Minecraft.Client/Platform/Common/GameRules/CompleteAllRuleDefinition.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/CompleteAllRuleDefinition.cpp index 82baa6c60..c94a0382e 100644 --- a/Minecraft.Client/Platform/Common/GameRules/CompleteAllRuleDefinition.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/CompleteAllRuleDefinition.cpp @@ -1,9 +1,9 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "CompleteAllRuleDefinition.h" -#include "ConsoleGameRules.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Network/Connection.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.packet.h" +#include "../../ConsoleGameRules.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../../Minecraft.World/net/minecraft/network/Connection.h" +#include "../../../../../../Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h" void CompleteAllRuleDefinition::getChildren( std::vector* children) { diff --git a/Minecraft.Client/Platform/Common/GameRules/CompleteAllRuleDefinition.h b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/CompleteAllRuleDefinition.h similarity index 100% rename from Minecraft.Client/Platform/Common/GameRules/CompleteAllRuleDefinition.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/CompleteAllRuleDefinition.h diff --git a/Minecraft.Client/Platform/Common/GameRules/CompoundGameRuleDefinition.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/CompoundGameRuleDefinition.cpp similarity index 92% rename from Minecraft.Client/Platform/Common/GameRules/CompoundGameRuleDefinition.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/CompoundGameRuleDefinition.cpp index 3b8913f89..11727a8cf 100644 --- a/Minecraft.Client/Platform/Common/GameRules/CompoundGameRuleDefinition.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/CompoundGameRuleDefinition.cpp @@ -1,8 +1,8 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" #include "CompoundGameRuleDefinition.h" -#include "ConsoleGameRules.h" +#include "../../ConsoleGameRules.h" CompoundGameRuleDefinition::CompoundGameRuleDefinition() { m_lastRuleStatusChanged = nullptr; diff --git a/Minecraft.Client/Platform/Common/GameRules/CompoundGameRuleDefinition.h b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/CompoundGameRuleDefinition.h similarity index 100% rename from Minecraft.Client/Platform/Common/GameRules/CompoundGameRuleDefinition.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/CompoundGameRuleDefinition.h diff --git a/Minecraft.Client/Platform/Common/GameRules/GameRuleDefinition.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/GameRuleDefinition.cpp similarity index 95% rename from Minecraft.Client/Platform/Common/GameRules/GameRuleDefinition.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/GameRuleDefinition.cpp index 87081110c..d8f82d6e2 100644 --- a/Minecraft.Client/Platform/Common/GameRules/GameRuleDefinition.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/GameRuleDefinition.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.Client/Utils/WstringLookup.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "ConsoleGameRules.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../WstringLookup.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../ConsoleGameRules.h" GameRuleDefinition::GameRuleDefinition() { m_descriptionId = L""; diff --git a/Minecraft.Client/Platform/Common/GameRules/GameRuleDefinition.h b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/GameRuleDefinition.h similarity index 93% rename from Minecraft.Client/Platform/Common/GameRules/GameRuleDefinition.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/GameRuleDefinition.h index bf5967365..506c2e21b 100644 --- a/Minecraft.Client/Platform/Common/GameRules/GameRuleDefinition.h +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/GameRuleDefinition.h @@ -3,10 +3,10 @@ #include #include -#include "../../Minecraft.World/Items/ItemInstance.h" -#include "ConsoleGameRulesConstants.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/ItemInstance.h" +#include "../../ConsoleGameRulesConstants.h" -#include "GameRulesInstance.h" +#include "../Rules/GameRulesInstance.h" class GameRule; class LevelRuleset; diff --git a/Minecraft.Client/Platform/Common/GameRules/LevelRuleset.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/LevelRuleset.cpp similarity index 86% rename from Minecraft.Client/Platform/Common/GameRules/LevelRuleset.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/LevelRuleset.cpp index 8cb2b3eb8..d8f2abe4a 100644 --- a/Minecraft.Client/Platform/Common/GameRules/LevelRuleset.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/LevelRuleset.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.Client/Utils/StringTable.h" -#include "ConsoleGameRules.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../Localisation/StringTable.h" +#include "../../ConsoleGameRules.h" #include "LevelRuleset.h" LevelRuleset::LevelRuleset() { m_stringTable = nullptr; } diff --git a/Minecraft.Client/Platform/Common/GameRules/LevelRuleset.h b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/LevelRuleset.h similarity index 100% rename from Minecraft.Client/Platform/Common/GameRules/LevelRuleset.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/LevelRuleset.h diff --git a/Minecraft.Client/Platform/Common/GameRules/NamedAreaRuleDefinition.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/NamedAreaRuleDefinition.cpp similarity index 92% rename from Minecraft.Client/Platform/Common/GameRules/NamedAreaRuleDefinition.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/NamedAreaRuleDefinition.cpp index da0524ff7..5865c50c8 100644 --- a/Minecraft.Client/Platform/Common/GameRules/NamedAreaRuleDefinition.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/NamedAreaRuleDefinition.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "NamedAreaRuleDefinition.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.phys.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/phys/net.minecraft.world.phys.h" NamedAreaRuleDefinition::NamedAreaRuleDefinition() { m_name = L""; diff --git a/Minecraft.Client/Platform/Common/GameRules/NamedAreaRuleDefinition.h b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/NamedAreaRuleDefinition.h similarity index 89% rename from Minecraft.Client/Platform/Common/GameRules/NamedAreaRuleDefinition.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/NamedAreaRuleDefinition.h index 81be6c4bc..e356c3e26 100644 --- a/Minecraft.Client/Platform/Common/GameRules/NamedAreaRuleDefinition.h +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/NamedAreaRuleDefinition.h @@ -1,7 +1,7 @@ #pragma once #include "GameRuleDefinition.h" -#include "../../Minecraft.World/Util/AABB.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/phys/AABB.h" class NamedAreaRuleDefinition : public GameRuleDefinition { private: diff --git a/Minecraft.Client/Platform/Common/GameRules/UpdatePlayerRuleDefinition.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/UpdatePlayerRuleDefinition.cpp similarity index 90% rename from Minecraft.Client/Platform/Common/GameRules/UpdatePlayerRuleDefinition.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/UpdatePlayerRuleDefinition.cpp index 7444fc21e..2b6f384da 100644 --- a/Minecraft.Client/Platform/Common/GameRules/UpdatePlayerRuleDefinition.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/UpdatePlayerRuleDefinition.cpp @@ -1,11 +1,11 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "UpdatePlayerRuleDefinition.h" -#include "ConsoleGameRules.h" -#include "../../Minecraft.World/Util/Pos.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.food.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" +#include "../../ConsoleGameRules.h" +#include "../../../../../../Minecraft.World/net/minecraft/Pos.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/food/net.minecraft.world.food.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" UpdatePlayerRuleDefinition::UpdatePlayerRuleDefinition() { m_bUpdateHealth = m_bUpdateFood = m_bUpdateYRot = false; diff --git a/Minecraft.Client/Platform/Common/GameRules/UpdatePlayerRuleDefinition.h b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/UpdatePlayerRuleDefinition.h similarity index 100% rename from Minecraft.Client/Platform/Common/GameRules/UpdatePlayerRuleDefinition.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/UpdatePlayerRuleDefinition.h diff --git a/Minecraft.Client/Platform/Common/GameRules/UseTileRuleDefinition.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/UseTileRuleDefinition.cpp similarity index 95% rename from Minecraft.Client/Platform/Common/GameRules/UseTileRuleDefinition.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/UseTileRuleDefinition.cpp index 4650f2210..824d2ffee 100644 --- a/Minecraft.Client/Platform/Common/GameRules/UseTileRuleDefinition.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/UseTileRuleDefinition.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #include "UseTileRuleDefinition.h" UseTileRuleDefinition::UseTileRuleDefinition() { diff --git a/Minecraft.Client/Platform/Common/GameRules/UseTileRuleDefinition.h b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/UseTileRuleDefinition.h similarity index 92% rename from Minecraft.Client/Platform/Common/GameRules/UseTileRuleDefinition.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/UseTileRuleDefinition.h index d4b3e2eff..8fbb597b1 100644 --- a/Minecraft.Client/Platform/Common/GameRules/UseTileRuleDefinition.h +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/RuleDefinitions/UseTileRuleDefinition.h @@ -2,7 +2,7 @@ // using namespace std; #include "GameRuleDefinition.h" -#include "../../Minecraft.World/Util/Pos.h" +#include "../../../../../../Minecraft.World/net/minecraft/Pos.h" class UseTileRuleDefinition : public GameRuleDefinition { private: diff --git a/Minecraft.Client/Platform/Common/GameRules/GameRule.cpp b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/Rules/GameRule.cpp similarity index 95% rename from Minecraft.Client/Platform/Common/GameRules/GameRule.cpp rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/Rules/GameRule.cpp index 35c52fc55..14063d437 100644 --- a/Minecraft.Client/Platform/Common/GameRules/GameRule.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/Rules/GameRule.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "ConsoleGameRules.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../ConsoleGameRules.h" GameRule::GameRule(GameRuleDefinition* definition, Connection* connection) { m_definition = definition; diff --git a/Minecraft.Client/Platform/Common/GameRules/GameRule.h b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/Rules/GameRule.h similarity index 100% rename from Minecraft.Client/Platform/Common/GameRules/GameRule.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/Rules/GameRule.h diff --git a/Minecraft.Client/Platform/Common/GameRules/GameRulesInstance.h b/Minecraft.Client/Common/Source Files/GameRules/LevelRules/Rules/GameRulesInstance.h similarity index 100% rename from Minecraft.Client/Platform/Common/GameRules/GameRulesInstance.h rename to Minecraft.Client/Common/Source Files/GameRules/LevelRules/Rules/GameRulesInstance.h diff --git a/Minecraft.Client/Utils/WstringLookup.cpp b/Minecraft.Client/Common/Source Files/GameRules/WstringLookup.cpp similarity index 94% rename from Minecraft.Client/Utils/WstringLookup.cpp rename to Minecraft.Client/Common/Source Files/GameRules/WstringLookup.cpp index edfd37d40..821feb11d 100644 --- a/Minecraft.Client/Utils/WstringLookup.cpp +++ b/Minecraft.Client/Common/Source Files/GameRules/WstringLookup.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "WstringLookup.h" diff --git a/Minecraft.Client/Utils/WstringLookup.h b/Minecraft.Client/Common/Source Files/GameRules/WstringLookup.h similarity index 100% rename from Minecraft.Client/Utils/WstringLookup.h rename to Minecraft.Client/Common/Source Files/GameRules/WstringLookup.h diff --git a/Minecraft.Client/Platform/Common/Leaderboards/LeaderboardInterface.cpp b/Minecraft.Client/Common/Source Files/Leaderboards/LeaderboardInterface.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/Leaderboards/LeaderboardInterface.cpp rename to Minecraft.Client/Common/Source Files/Leaderboards/LeaderboardInterface.cpp index d7f331577..328a46bea 100644 --- a/Minecraft.Client/Platform/Common/Leaderboards/LeaderboardInterface.cpp +++ b/Minecraft.Client/Common/Source Files/Leaderboards/LeaderboardInterface.cpp @@ -1,4 +1,4 @@ -#include "../../stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "LeaderboardInterface.h" LeaderboardInterface::LeaderboardInterface(LeaderboardManager* man) { diff --git a/Minecraft.Client/Platform/Common/Leaderboards/LeaderboardInterface.h b/Minecraft.Client/Common/Source Files/Leaderboards/LeaderboardInterface.h similarity index 100% rename from Minecraft.Client/Platform/Common/Leaderboards/LeaderboardInterface.h rename to Minecraft.Client/Common/Source Files/Leaderboards/LeaderboardInterface.h diff --git a/Minecraft.Client/Platform/Common/Leaderboards/LeaderboardManager.cpp b/Minecraft.Client/Common/Source Files/Leaderboards/LeaderboardManager.cpp similarity index 96% rename from Minecraft.Client/Platform/Common/Leaderboards/LeaderboardManager.cpp rename to Minecraft.Client/Common/Source Files/Leaderboards/LeaderboardManager.cpp index 454559503..a31d61f4c 100644 --- a/Minecraft.Client/Platform/Common/Leaderboards/LeaderboardManager.cpp +++ b/Minecraft.Client/Common/Source Files/Leaderboards/LeaderboardManager.cpp @@ -1,6 +1,6 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #include "LeaderboardManager.h" diff --git a/Minecraft.Client/Platform/Common/Leaderboards/LeaderboardManager.h b/Minecraft.Client/Common/Source Files/Leaderboards/LeaderboardManager.h similarity index 100% rename from Minecraft.Client/Platform/Common/Leaderboards/LeaderboardManager.h rename to Minecraft.Client/Common/Source Files/Leaderboards/LeaderboardManager.h diff --git a/Minecraft.Client/Platform/Common/Leaderboards/SonyLeaderboardManager.cpp b/Minecraft.Client/Common/Source Files/Leaderboards/SonyLeaderboardManager.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/Leaderboards/SonyLeaderboardManager.cpp rename to Minecraft.Client/Common/Source Files/Leaderboards/SonyLeaderboardManager.cpp index 7397abb93..807bb8aee 100644 --- a/Minecraft.Client/Platform/Common/Leaderboards/SonyLeaderboardManager.cpp +++ b/Minecraft.Client/Common/Source Files/Leaderboards/SonyLeaderboardManager.cpp @@ -1,4 +1,4 @@ -#include "../../stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include #include @@ -10,10 +10,10 @@ #include "base64.h" -#include "Common/Consoles_App.h" +#include "../../Consoles_App.h" #include "Common/Network/Sony/SQRNetworkManager.h" -#include "../../../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #error "SonyLeaderboardManager is included for a non-sony platform." diff --git a/Minecraft.Client/Platform/Common/Leaderboards/SonyLeaderboardManager.h b/Minecraft.Client/Common/Source Files/Leaderboards/SonyLeaderboardManager.h similarity index 98% rename from Minecraft.Client/Platform/Common/Leaderboards/SonyLeaderboardManager.h rename to Minecraft.Client/Common/Source Files/Leaderboards/SonyLeaderboardManager.h index 16eb1fc64..1a68c5bc0 100644 --- a/Minecraft.Client/Platform/Common/Leaderboards/SonyLeaderboardManager.h +++ b/Minecraft.Client/Common/Source Files/Leaderboards/SonyLeaderboardManager.h @@ -1,7 +1,7 @@ #pragma once #include -#include "Common/Leaderboards/LeaderboardManager.h" +#include "LeaderboardManager.h" typedef SceRtcTick SonyRtcTick; diff --git a/Minecraft.Client/Platform/Common/Leaderboards/base64.cpp b/Minecraft.Client/Common/Source Files/Leaderboards/base64.cpp similarity index 100% rename from Minecraft.Client/Platform/Common/Leaderboards/base64.cpp rename to Minecraft.Client/Common/Source Files/Leaderboards/base64.cpp diff --git a/Minecraft.Client/Platform/Common/Leaderboards/base64.h b/Minecraft.Client/Common/Source Files/Leaderboards/base64.h similarity index 100% rename from Minecraft.Client/Platform/Common/Leaderboards/base64.h rename to Minecraft.Client/Common/Source Files/Leaderboards/base64.h diff --git a/Minecraft.Client/Utils/StringTable.cpp b/Minecraft.Client/Common/Source Files/Localisation/StringTable.cpp similarity index 98% rename from Minecraft.Client/Utils/StringTable.cpp rename to Minecraft.Client/Common/Source Files/Localisation/StringTable.cpp index 63f5e2303..0786dab03 100644 --- a/Minecraft.Client/Utils/StringTable.cpp +++ b/Minecraft.Client/Common/Source Files/Localisation/StringTable.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "StringTable.h" StringTable::StringTable(void) {} diff --git a/Minecraft.Client/Utils/StringTable.h b/Minecraft.Client/Common/Source Files/Localisation/StringTable.h similarity index 100% rename from Minecraft.Client/Utils/StringTable.h rename to Minecraft.Client/Common/Source Files/Localisation/StringTable.h diff --git a/Minecraft.Client/Platform/Common/Network/GameNetworkManager.cpp b/Minecraft.Client/Common/Source Files/Network/GameNetworkManager.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/Network/GameNetworkManager.cpp rename to Minecraft.Client/Common/Source Files/Network/GameNetworkManager.cpp index ab700d242..9c0efc7c0 100644 --- a/Minecraft.Client/Platform/Common/Network/GameNetworkManager.cpp +++ b/Minecraft.Client/Common/Source Files/Network/GameNetworkManager.cpp @@ -1,38 +1,38 @@ #include #include -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Util/AABB.h" -#include "../../Minecraft.World/Util/Vec3.h" -#include "../../Minecraft.World/Network/Socket.h" -#include "../../Minecraft.World/Util/ThreadName.h" -#include "../../Minecraft.World/Entities/Entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Recipes/FireworksRecipe.h" -#include "../../Minecraft.Client/Network/ClientConnection.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/User.h" -#include "../../Minecraft.Client/MinecraftServer.h" -#include "../../Minecraft.Client/Network/PlayerList.h" -#include "../../Minecraft.Client/Player/ServerPlayer.h" -#include "../../Minecraft.Client/Network/PlayerConnection.h" -#include "../../Minecraft.Client/Level/MultiPlayerLevel.h" -#include "../../Minecraft.Client/Rendering/EntityRenderers/ProgressRenderer.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.World/Network/Packets/DisconnectPacket.h" -#include "../../Minecraft.World/IO/Streams/Compression.h" -#include "../../Minecraft.World/Level/Storage/OldChunkStorage.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePackRepository.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePack.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../Minecraft.World/net/minecraft/world/phys/AABB.h" +#include "../../../../Minecraft.World/net/minecraft/world/phys/Vec3.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/Socket.h" +#include "../../../../Minecraft.World/ConsoleHelpers/ThreadName.h" +#include "../../../../Minecraft.World/net/minecraft/world/entity/Entity.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../Minecraft.World/net/minecraft/world/item/crafting/FireworksRecipe.h" +#include "../../../net/minecraft/client/multiplayer/ClientConnection.h" +#include "../../../net/minecraft/client/Minecraft.h" +#include "../../../net/minecraft/client/User.h" +#include "../../../net/minecraft/server/MinecraftServer.h" +#include "../../../net/minecraft/server/PlayerList.h" +#include "../../../net/minecraft/server/level/ServerPlayer.h" +#include "../../../net/minecraft/server/network/PlayerConnection.h" +#include "../../../net/minecraft/client/multiplayer/MultiPlayerLevel.h" +#include "../../../net/minecraft/client/ProgressRenderer.h" +#include "../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../Minecraft.World/net/minecraft/network/packet/DisconnectPacket.h" +#include "../../../../Minecraft.World/Header Files/compression.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/chunk/storage/OldChunkStorage.h" +#include "../../../net/minecraft/client/skins/TexturePackRepository.h" +#include "../../../net/minecraft/client/skins/TexturePack.h" -#include "../../Minecraft.Client/UI/Gui.h" -#include "../../Minecraft.Client/Rendering/LevelRenderer.h" +#include "../../../net/minecraft/client/gui/Gui.h" +#include "../../../net/minecraft/client/renderer/LevelRenderer.h" #include "../GameRules/ConsoleGameRules.h" #include "GameNetworkManager.h" #include "../UI/UI.h" -#include "../UI/UIScene_PauseMenu.h" +#include "../UI/Scenes/In-Game Menu Screens/UIScene_PauseMenu.h" // Global instance CGameNetworkManager g_NetworkManager; diff --git a/Minecraft.Client/Platform/Common/Network/GameNetworkManager.h b/Minecraft.Client/Common/Source Files/Network/GameNetworkManager.h similarity index 99% rename from Minecraft.Client/Platform/Common/Network/GameNetworkManager.h rename to Minecraft.Client/Common/Source Files/Network/GameNetworkManager.h index f81e22f32..f93de859a 100644 --- a/Minecraft.Client/Platform/Common/Network/GameNetworkManager.h +++ b/Minecraft.Client/Common/Source Files/Network/GameNetworkManager.h @@ -4,7 +4,7 @@ #if !defined(__linux__) #include #endif -#include "../../Minecraft.World/Util/C4JThread.h" +#include "../../../../Minecraft.World/ConsoleHelpers/C4JThread.h" #include "NetworkPlayerInterface.h" #include "PlatformNetworkManagerStub.h" #include "SessionInfo.h" diff --git a/Minecraft.Client/Platform/Common/Network/NetworkPlayerInterface.h b/Minecraft.Client/Common/Source Files/Network/NetworkPlayerInterface.h similarity index 100% rename from Minecraft.Client/Platform/Common/Network/NetworkPlayerInterface.h rename to Minecraft.Client/Common/Source Files/Network/NetworkPlayerInterface.h diff --git a/Minecraft.Client/Platform/Common/Network/PlatformNetworkManagerInterface.h b/Minecraft.Client/Common/Source Files/Network/PlatformNetworkManagerInterface.h similarity index 98% rename from Minecraft.Client/Platform/Common/Network/PlatformNetworkManagerInterface.h rename to Minecraft.Client/Common/Source Files/Network/PlatformNetworkManagerInterface.h index bd0d40b8a..a836a552d 100644 --- a/Minecraft.Client/Platform/Common/Network/PlatformNetworkManagerInterface.h +++ b/Minecraft.Client/Common/Source Files/Network/PlatformNetworkManagerInterface.h @@ -4,7 +4,7 @@ #if !defined(__linux__) #include #endif -#include "../../Minecraft.World/Util/C4JThread.h" +#include "../../../../Minecraft.World/ConsoleHelpers/C4JThread.h" #include "NetworkPlayerInterface.h" #include "SessionInfo.h" diff --git a/Minecraft.Client/Platform/Common/Network/PlatformNetworkManagerStub.cpp b/Minecraft.Client/Common/Source Files/Network/PlatformNetworkManagerStub.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/Network/PlatformNetworkManagerStub.cpp rename to Minecraft.Client/Common/Source Files/Network/PlatformNetworkManagerStub.cpp index 9bc82654a..962b52957 100644 --- a/Minecraft.Client/Platform/Common/Network/PlatformNetworkManagerStub.cpp +++ b/Minecraft.Client/Common/Source Files/Network/PlatformNetworkManagerStub.cpp @@ -1,6 +1,6 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Network/Socket.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/Socket.h" +#include "../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #include "NetworkPlayerQNet.h" #include "PlatformNetworkManagerStub.h" diff --git a/Minecraft.Client/Platform/Common/Network/PlatformNetworkManagerStub.h b/Minecraft.Client/Common/Source Files/Network/PlatformNetworkManagerStub.h similarity index 99% rename from Minecraft.Client/Platform/Common/Network/PlatformNetworkManagerStub.h rename to Minecraft.Client/Common/Source Files/Network/PlatformNetworkManagerStub.h index dd184f5bc..a9a749b21 100644 --- a/Minecraft.Client/Platform/Common/Network/PlatformNetworkManagerStub.h +++ b/Minecraft.Client/Common/Source Files/Network/PlatformNetworkManagerStub.h @@ -1,7 +1,7 @@ #pragma once // using namespace std; #include -#include "../../Minecraft.World/Util/C4JThread.h" +#include "../../../../Minecraft.World/ConsoleHelpers/C4JThread.h" #include "NetworkPlayerInterface.h" #include "PlatformNetworkManagerInterface.h" #include "SessionInfo.h" diff --git a/Minecraft.Client/Platform/Common/Network/SessionInfo.h b/Minecraft.Client/Common/Source Files/Network/SessionInfo.h similarity index 100% rename from Minecraft.Client/Platform/Common/Network/SessionInfo.h rename to Minecraft.Client/Common/Source Files/Network/SessionInfo.h diff --git a/Minecraft.Client/Platform/Common/Telemetry/TelemetryManager.cpp b/Minecraft.Client/Common/Source Files/Telemetry/TelemetryManager.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/Telemetry/TelemetryManager.cpp rename to Minecraft.Client/Common/Source Files/Telemetry/TelemetryManager.cpp index 8526b0fe7..325ffb37f 100644 --- a/Minecraft.Client/Platform/Common/Telemetry/TelemetryManager.cpp +++ b/Minecraft.Client/Common/Source Files/Telemetry/TelemetryManager.cpp @@ -1,10 +1,10 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" +#include "../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.World/Level/Storage/LevelSettings.h" -#include "../../Minecraft.World/Level/LevelData.h" -#include "../../Minecraft.World/Level/Level.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/LevelSettings.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/storage/LevelData.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/Level.h" #include "TelemetryManager.h" diff --git a/Minecraft.Client/Platform/Common/Telemetry/TelemetryManager.h b/Minecraft.Client/Common/Source Files/Telemetry/TelemetryManager.h similarity index 95% rename from Minecraft.Client/Platform/Common/Telemetry/TelemetryManager.h rename to Minecraft.Client/Common/Source Files/Telemetry/TelemetryManager.h index 8803034c1..4381ab2ed 100644 --- a/Minecraft.Client/Platform/Common/Telemetry/TelemetryManager.h +++ b/Minecraft.Client/Common/Source Files/Telemetry/TelemetryManager.h @@ -4,11 +4,11 @@ // SentientManager.h -> MinecraftTelemetry.h. Using the Windows64 path would // cause duplicate enum definitions. #if defined(__linux__) -#include "../../Minecraft.Client/Platform/Linux/Sentient/TelemetryEnum.h" +#include "../../../Windows64/Source Files/Sentient/TelemetryEnum.h" #else -#include "../../Minecraft.Client/Platform/Windows64/Sentient/TelemetryEnum.h" +#include "../../../Windows64/Source Files/Sentient/TelemetryEnum.h" #endif -#include "../UI/UIEnums.h" +#include "../UI/All Platforms/UIEnums.h" class CTelemetryManager { public: diff --git a/Minecraft.Client/Platform/Common/Trial/TrialMode.cpp b/Minecraft.Client/Common/Source Files/Trial/TrialMode.cpp similarity index 81% rename from Minecraft.Client/Platform/Common/Trial/TrialMode.cpp rename to Minecraft.Client/Common/Source Files/Trial/TrialMode.cpp index fa0b37847..527688565 100644 --- a/Minecraft.Client/Platform/Common/Trial/TrialMode.cpp +++ b/Minecraft.Client/Common/Source Files/Trial/TrialMode.cpp @@ -1,4 +1,4 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "TrialMode.h" #include "../Tutorial/FullTutorial.h" diff --git a/Minecraft.Client/Platform/Common/Trial/TrialMode.h b/Minecraft.Client/Common/Source Files/Trial/TrialMode.h similarity index 100% rename from Minecraft.Client/Platform/Common/Trial/TrialMode.h rename to Minecraft.Client/Common/Source Files/Trial/TrialMode.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/AreaConstraint.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Constraints/AreaConstraint.cpp similarity index 84% rename from Minecraft.Client/Platform/Common/Tutorial/AreaConstraint.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Constraints/AreaConstraint.cpp index 2cf4ab5ee..ab8afef92 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/AreaConstraint.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Constraints/AreaConstraint.cpp @@ -1,9 +1,9 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" #include "AreaConstraint.h" -#include "../../Minecraft.World/Util/AABB.h" +#include "../../../../../Minecraft.World/net/minecraft/world/phys/AABB.h" AreaConstraint::AreaConstraint(int descriptionId, double x0, double y0, double z0, double x1, double y1, double z1, diff --git a/Minecraft.Client/Platform/Common/Tutorial/AreaConstraint.h b/Minecraft.Client/Common/Source Files/Tutorial/Constraints/AreaConstraint.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/AreaConstraint.h rename to Minecraft.Client/Common/Source Files/Tutorial/Constraints/AreaConstraint.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/ChangeStateConstraint.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Constraints/ChangeStateConstraint.cpp similarity index 91% rename from Minecraft.Client/Platform/Common/Tutorial/ChangeStateConstraint.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Constraints/ChangeStateConstraint.cpp index ebcc44bcc..56afc5d4d 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/ChangeStateConstraint.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Constraints/ChangeStateConstraint.cpp @@ -1,13 +1,13 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" -#include "Tutorial.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" +#include "../Tutorial.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" #include "ChangeStateConstraint.h" -#include "../../Minecraft.World/Util/AABB.h" -#include "../../Minecraft.Client/Network/ClientConnection.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.packet.h" +#include "../../../../../Minecraft.World/net/minecraft/world/phys/AABB.h" +#include "../../../../net/minecraft/client/multiplayer/ClientConnection.h" +#include "../../../../../Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h" ChangeStateConstraint::ChangeStateConstraint( Tutorial* tutorial, eTutorial_State targetState, diff --git a/Minecraft.Client/Platform/Common/Tutorial/ChangeStateConstraint.h b/Minecraft.Client/Common/Source Files/Tutorial/Constraints/ChangeStateConstraint.h similarity index 97% rename from Minecraft.Client/Platform/Common/Tutorial/ChangeStateConstraint.h rename to Minecraft.Client/Common/Source Files/Tutorial/Constraints/ChangeStateConstraint.h index 4be844890..66a5d5128 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/ChangeStateConstraint.h +++ b/Minecraft.Client/Common/Source Files/Tutorial/Constraints/ChangeStateConstraint.h @@ -1,6 +1,6 @@ #pragma once -#include "TutorialEnum.h" +#include "../TutorialEnum.h" #include "TutorialConstraint.h" #include diff --git a/Minecraft.Client/Platform/Common/Tutorial/InputConstraint.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Constraints/InputConstraint.cpp similarity index 91% rename from Minecraft.Client/Platform/Common/Tutorial/InputConstraint.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Constraints/InputConstraint.cpp index 5037d260b..67974bcc8 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/InputConstraint.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Constraints/InputConstraint.cpp @@ -1,4 +1,4 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "InputConstraint.h" bool InputConstraint::isMappingConstrained(int iPad, int mapping) { diff --git a/Minecraft.Client/Platform/Common/Tutorial/InputConstraint.h b/Minecraft.Client/Common/Source Files/Tutorial/Constraints/InputConstraint.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/InputConstraint.h rename to Minecraft.Client/Common/Source Files/Tutorial/Constraints/InputConstraint.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/TutorialConstraint.h b/Minecraft.Client/Common/Source Files/Tutorial/Constraints/TutorialConstraint.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/TutorialConstraint.h rename to Minecraft.Client/Common/Source Files/Tutorial/Constraints/TutorialConstraint.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/TutorialConstraints.h b/Minecraft.Client/Common/Source Files/Tutorial/Constraints/TutorialConstraints.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/TutorialConstraints.h rename to Minecraft.Client/Common/Source Files/Tutorial/Constraints/TutorialConstraints.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/FullTutorial.cpp b/Minecraft.Client/Common/Source Files/Tutorial/FullTutorial.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/Tutorial/FullTutorial.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/FullTutorial.cpp index 48259ceae..23271ef87 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/FullTutorial.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/FullTutorial.cpp @@ -1,15 +1,15 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.phys.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.effect.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../Minecraft.World/net/minecraft/world/phys/net.minecraft.world.phys.h" +#include "../../../../Minecraft.World/net/minecraft/world/effect/net.minecraft.world.effect.h" #include "../GameRules/ConsoleGameRules.h" -#include "DiggerItemHint.h" -#include "TutorialTasks.h" -#include "AreaHint.h" +#include "Hints/DiggerItemHint.h" +#include "Tasks/TutorialTasks.h" +#include "Hints/AreaHint.h" #include "FullTutorial.h" -#include "TutorialConstraints.h" +#include "Constraints/TutorialConstraints.h" FullTutorial::FullTutorial(int iPad, bool isTrial /*= false*/) : Tutorial(iPad, true) { diff --git a/Minecraft.Client/Platform/Common/Tutorial/FullTutorial.h b/Minecraft.Client/Common/Source Files/Tutorial/FullTutorial.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/FullTutorial.h rename to Minecraft.Client/Common/Source Files/Tutorial/FullTutorial.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/FullTutorialMode.cpp b/Minecraft.Client/Common/Source Files/Tutorial/FullTutorialMode.cpp similarity index 78% rename from Minecraft.Client/Platform/Common/Tutorial/FullTutorialMode.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/FullTutorialMode.cpp index 274fcb3c8..39be37c03 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/FullTutorialMode.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/FullTutorialMode.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.Client/Minecraft.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../net/minecraft/client/Minecraft.h" #include "FullTutorial.h" #include "FullTutorialMode.h" diff --git a/Minecraft.Client/Platform/Common/Tutorial/FullTutorialMode.h b/Minecraft.Client/Common/Source Files/Tutorial/FullTutorialMode.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/FullTutorialMode.h rename to Minecraft.Client/Common/Source Files/Tutorial/FullTutorialMode.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/AreaHint.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Hints/AreaHint.cpp similarity index 79% rename from Minecraft.Client/Platform/Common/Tutorial/AreaHint.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Hints/AreaHint.cpp index b3ebdf65a..9f84469fd 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/AreaHint.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Hints/AreaHint.cpp @@ -1,10 +1,10 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" #include "AreaHint.h" -#include "../../Minecraft.World/Util/AABB.h" -#include "Tutorial.h" +#include "../../../../../Minecraft.World/net/minecraft/world/phys/AABB.h" +#include "../Tutorial.h" AreaHint::AreaHint(eTutorial_Hint id, Tutorial* tutorial, eTutorial_State displayState, eTutorial_State completeState, diff --git a/Minecraft.Client/Platform/Common/Tutorial/AreaHint.h b/Minecraft.Client/Common/Source Files/Tutorial/Hints/AreaHint.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/AreaHint.h rename to Minecraft.Client/Common/Source Files/Tutorial/Hints/AreaHint.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/DiggerItemHint.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Hints/DiggerItemHint.cpp similarity index 79% rename from Minecraft.Client/Platform/Common/Tutorial/DiggerItemHint.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Hints/DiggerItemHint.cpp index a23dc4853..3082fee8a 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/DiggerItemHint.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Hints/DiggerItemHint.cpp @@ -1,9 +1,9 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "Tutorial.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../Tutorial.h" #include "DiggerItemHint.h" DiggerItemHint::DiggerItemHint(eTutorial_Hint id, Tutorial* tutorial, diff --git a/Minecraft.Client/Platform/Common/Tutorial/DiggerItemHint.h b/Minecraft.Client/Common/Source Files/Tutorial/Hints/DiggerItemHint.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/DiggerItemHint.h rename to Minecraft.Client/Common/Source Files/Tutorial/Hints/DiggerItemHint.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/LookAtEntityHint.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Hints/LookAtEntityHint.cpp similarity index 89% rename from Minecraft.Client/Platform/Common/Tutorial/LookAtEntityHint.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Hints/LookAtEntityHint.cpp index 2c7eff378..58b767536 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/LookAtEntityHint.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Hints/LookAtEntityHint.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "Tutorial.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../Tutorial.h" #include "LookAtEntityHint.h" LookAtEntityHint::LookAtEntityHint(eTutorial_Hint id, Tutorial* tutorial, diff --git a/Minecraft.Client/Platform/Common/Tutorial/LookAtEntityHint.h b/Minecraft.Client/Common/Source Files/Tutorial/Hints/LookAtEntityHint.h similarity index 87% rename from Minecraft.Client/Platform/Common/Tutorial/LookAtEntityHint.h rename to Minecraft.Client/Common/Source Files/Tutorial/Hints/LookAtEntityHint.h index fdd209517..593970070 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/LookAtEntityHint.h +++ b/Minecraft.Client/Common/Source Files/Tutorial/Hints/LookAtEntityHint.h @@ -1,7 +1,7 @@ #pragma once // using namespace std; -#include "../../Minecraft.World/Util/Class.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Class.h" #include "TutorialHint.h" class ItemInstance; diff --git a/Minecraft.Client/Platform/Common/Tutorial/LookAtTileHint.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Hints/LookAtTileHint.cpp similarity index 87% rename from Minecraft.Client/Platform/Common/Tutorial/LookAtTileHint.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Hints/LookAtTileHint.cpp index d79d0e679..d5a2688f4 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/LookAtTileHint.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Hints/LookAtTileHint.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "Tutorial.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../Tutorial.h" #include "LookAtTileHint.h" LookAtTileHint::LookAtTileHint(eTutorial_Hint id, Tutorial* tutorial, diff --git a/Minecraft.Client/Platform/Common/Tutorial/LookAtTileHint.h b/Minecraft.Client/Common/Source Files/Tutorial/Hints/LookAtTileHint.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/LookAtTileHint.h rename to Minecraft.Client/Common/Source Files/Tutorial/Hints/LookAtTileHint.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/TakeItemHint.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Hints/TakeItemHint.cpp similarity index 79% rename from Minecraft.Client/Platform/Common/Tutorial/TakeItemHint.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Hints/TakeItemHint.cpp index ca2dac44b..1cbc6180a 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/TakeItemHint.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Hints/TakeItemHint.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "Tutorial.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../Tutorial.h" #include "TakeItemHint.h" TakeItemHint::TakeItemHint(eTutorial_Hint id, Tutorial* tutorial, int items[], diff --git a/Minecraft.Client/Platform/Common/Tutorial/TakeItemHint.h b/Minecraft.Client/Common/Source Files/Tutorial/Hints/TakeItemHint.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/TakeItemHint.h rename to Minecraft.Client/Common/Source Files/Tutorial/Hints/TakeItemHint.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/TutorialHint.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Hints/TutorialHint.cpp similarity index 84% rename from Minecraft.Client/Platform/Common/Tutorial/TutorialHint.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Hints/TutorialHint.cpp index 91a4797f3..318131b88 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/TutorialHint.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Hints/TutorialHint.cpp @@ -1,11 +1,11 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "Tutorial.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../Tutorial.h" #include "TutorialHint.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" TutorialHint::TutorialHint(eTutorial_Hint id, Tutorial* tutorial, int descriptionId, eHintType type, diff --git a/Minecraft.Client/Platform/Common/Tutorial/TutorialHint.h b/Minecraft.Client/Common/Source Files/Tutorial/Hints/TutorialHint.h similarity index 98% rename from Minecraft.Client/Platform/Common/Tutorial/TutorialHint.h rename to Minecraft.Client/Common/Source Files/Tutorial/Hints/TutorialHint.h index 901713572..171c7b002 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/TutorialHint.h +++ b/Minecraft.Client/Common/Source Files/Tutorial/Hints/TutorialHint.h @@ -1,7 +1,7 @@ #pragma once // using namespace std; -#include "TutorialEnum.h" +#include "../TutorialEnum.h" #define TUTORIAL_HINT_MAX_MINE_REPEATS 20 diff --git a/Minecraft.Client/Platform/Common/Tutorial/TutorialHints.h b/Minecraft.Client/Common/Source Files/Tutorial/Hints/TutorialHints.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/TutorialHints.h rename to Minecraft.Client/Common/Source Files/Tutorial/Hints/TutorialHints.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/AreaTask.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/AreaTask.cpp similarity index 95% rename from Minecraft.Client/Platform/Common/Tutorial/AreaTask.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/AreaTask.cpp index 14ed6b0a6..27fc6464b 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/AreaTask.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/AreaTask.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "Tutorial.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../Tutorial.h" #include "AreaTask.h" AreaTask::AreaTask(eTutorial_State state, Tutorial* tutorial, diff --git a/Minecraft.Client/Platform/Common/Tutorial/AreaTask.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/AreaTask.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/AreaTask.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/AreaTask.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/ChoiceTask.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/ChoiceTask.cpp similarity index 91% rename from Minecraft.Client/Platform/Common/Tutorial/ChoiceTask.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/ChoiceTask.cpp index 985be9647..c55f99d5a 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/ChoiceTask.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/ChoiceTask.cpp @@ -1,12 +1,12 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include #include -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "Tutorial.h" -#include "TutorialConstraints.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../Tutorial.h" +#include "../Constraints/TutorialConstraints.h" #include "ChoiceTask.h" -#include "../../Minecraft.World/Blocks/Material.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/material/Material.h" ChoiceTask::ChoiceTask( Tutorial* tutorial, int descriptionId, int promptId /*= -1*/, diff --git a/Minecraft.Client/Platform/Common/Tutorial/ChoiceTask.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/ChoiceTask.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/ChoiceTask.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/ChoiceTask.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/CompleteUsingItemTask.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/CompleteUsingItemTask.cpp similarity index 87% rename from Minecraft.Client/Platform/Common/Tutorial/CompleteUsingItemTask.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/CompleteUsingItemTask.cpp index bcf5b2002..ef1d8568c 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/CompleteUsingItemTask.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/CompleteUsingItemTask.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Items/ItemInstance.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/ItemInstance.h" #include "CompleteUsingItemTask.h" CompleteUsingItemTask::CompleteUsingItemTask(Tutorial* tutorial, diff --git a/Minecraft.Client/Platform/Common/Tutorial/CompleteUsingItemTask.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/CompleteUsingItemTask.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/CompleteUsingItemTask.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/CompleteUsingItemTask.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/ControllerTask.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/ControllerTask.cpp similarity index 93% rename from Minecraft.Client/Platform/Common/Tutorial/ControllerTask.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/ControllerTask.cpp index 1a82e615f..0ca558da5 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/ControllerTask.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/ControllerTask.cpp @@ -1,10 +1,10 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include #include -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "Tutorial.h" -#include "TutorialConstraints.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../Tutorial.h" +#include "../Constraints/TutorialConstraints.h" #include "ControllerTask.h" ControllerTask::ControllerTask(Tutorial* tutorial, int descriptionId, diff --git a/Minecraft.Client/Platform/Common/Tutorial/ControllerTask.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/ControllerTask.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/ControllerTask.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/ControllerTask.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/CraftTask.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/CraftTask.cpp similarity index 92% rename from Minecraft.Client/Platform/Common/Tutorial/CraftTask.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/CraftTask.cpp index 5d8532e0f..3fab52c5c 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/CraftTask.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/CraftTask.cpp @@ -1,6 +1,6 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "CraftTask.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" CraftTask::CraftTask( int itemId, int auxValue, int quantity, Tutorial* tutorial, diff --git a/Minecraft.Client/Platform/Common/Tutorial/CraftTask.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/CraftTask.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/CraftTask.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/CraftTask.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/EffectChangedTask.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/EffectChangedTask.cpp similarity index 85% rename from Minecraft.Client/Platform/Common/Tutorial/EffectChangedTask.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/EffectChangedTask.cpp index e07d075fb..396fd01b2 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/EffectChangedTask.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/EffectChangedTask.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.effect.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/world/effect/net.minecraft.world.effect.h" #include "EffectChangedTask.h" EffectChangedTask::EffectChangedTask(Tutorial* tutorial, int descriptionId, diff --git a/Minecraft.Client/Platform/Common/Tutorial/EffectChangedTask.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/EffectChangedTask.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/EffectChangedTask.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/EffectChangedTask.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/FullTutorialActiveTask.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/FullTutorialActiveTask.cpp similarity index 86% rename from Minecraft.Client/Platform/Common/Tutorial/FullTutorialActiveTask.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/FullTutorialActiveTask.cpp index 4acc3698b..705575a05 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/FullTutorialActiveTask.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/FullTutorialActiveTask.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "Tutorial.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../Tutorial.h" #include "FullTutorialActiveTask.h" FullTutorialActiveTask::FullTutorialActiveTask( diff --git a/Minecraft.Client/Platform/Common/Tutorial/FullTutorialActiveTask.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/FullTutorialActiveTask.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/FullTutorialActiveTask.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/FullTutorialActiveTask.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/HorseChoiceTask.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/HorseChoiceTask.cpp similarity index 85% rename from Minecraft.Client/Platform/Common/Tutorial/HorseChoiceTask.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/HorseChoiceTask.cpp index aa3214bee..14a69df83 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/HorseChoiceTask.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/HorseChoiceTask.cpp @@ -1,11 +1,11 @@ -#include "../../stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include -#include "../../../Minecraft.h" -#include "Tutorial.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../Tutorial.h" -#include "../../../../Minecraft.World/Entities/Mobs/EntityHorse.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/animal/EntityHorse.h" #include "HorseChoiceTask.h" diff --git a/Minecraft.Client/Platform/Common/Tutorial/HorseChoiceTask.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/HorseChoiceTask.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/HorseChoiceTask.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/HorseChoiceTask.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/InfoTask.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/InfoTask.cpp similarity index 90% rename from Minecraft.Client/Platform/Common/Tutorial/InfoTask.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/InfoTask.cpp index 3d7b9c3bc..7acb74699 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/InfoTask.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/InfoTask.cpp @@ -1,12 +1,12 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include #include -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "Tutorial.h" -#include "TutorialConstraints.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../Tutorial.h" +#include "../Constraints/TutorialConstraints.h" #include "InfoTask.h" -#include "../../Minecraft.World/Blocks/Material.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/material/Material.h" InfoTask::InfoTask( Tutorial* tutorial, int descriptionId, int promptId /*= -1*/, diff --git a/Minecraft.Client/Platform/Common/Tutorial/InfoTask.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/InfoTask.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/InfoTask.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/InfoTask.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/PickupTask.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/PickupTask.cpp similarity index 88% rename from Minecraft.Client/Platform/Common/Tutorial/PickupTask.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/PickupTask.cpp index 544ede0b4..aaf99965f 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/PickupTask.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/PickupTask.cpp @@ -1,4 +1,4 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "PickupTask.h" void PickupTask::onTake(std::shared_ptr item, diff --git a/Minecraft.Client/Platform/Common/Tutorial/PickupTask.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/PickupTask.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/PickupTask.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/PickupTask.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/ProcedureCompoundTask.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/ProcedureCompoundTask.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/Tutorial/ProcedureCompoundTask.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/ProcedureCompoundTask.cpp index 0f90c261b..ba60fea58 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/ProcedureCompoundTask.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/ProcedureCompoundTask.cpp @@ -1,4 +1,4 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ProcedureCompoundTask.h" ProcedureCompoundTask::~ProcedureCompoundTask() { diff --git a/Minecraft.Client/Platform/Common/Tutorial/ProcedureCompoundTask.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/ProcedureCompoundTask.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/ProcedureCompoundTask.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/ProcedureCompoundTask.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/ProgressFlagTask.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/ProgressFlagTask.cpp similarity index 84% rename from Minecraft.Client/Platform/Common/Tutorial/ProgressFlagTask.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/ProgressFlagTask.cpp index 6c849e030..98384cc16 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/ProgressFlagTask.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/ProgressFlagTask.cpp @@ -1,4 +1,4 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ProgressFlagTask.h" bool ProgressFlagTask::isCompleted() { diff --git a/Minecraft.Client/Platform/Common/Tutorial/ProgressFlagTask.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/ProgressFlagTask.h similarity index 96% rename from Minecraft.Client/Platform/Common/Tutorial/ProgressFlagTask.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/ProgressFlagTask.h index 5b14e216d..0dc8ae26a 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/ProgressFlagTask.h +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/ProgressFlagTask.h @@ -1,6 +1,6 @@ #pragma once // using namespace std; -#include "Tutorial.h" +#include "../Tutorial.h" #include "TutorialTask.h" class ProgressFlagTask : public TutorialTask { diff --git a/Minecraft.Client/Platform/Common/Tutorial/RideEntityTask.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/RideEntityTask.cpp similarity index 76% rename from Minecraft.Client/Platform/Common/Tutorial/RideEntityTask.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/RideEntityTask.cpp index 7325da1a6..cb7fae7c4 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/RideEntityTask.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/RideEntityTask.cpp @@ -1,11 +1,11 @@ -#include "../../stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include -#include "../../../Minecraft.h" -#include "Tutorial.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../Tutorial.h" -#include "../../../../Minecraft.World/Entities/Mobs/EntityHorse.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/animal/EntityHorse.h" #include "RideEntityTask.h" diff --git a/Minecraft.Client/Platform/Common/Tutorial/RideEntityTask.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/RideEntityTask.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/RideEntityTask.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/RideEntityTask.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/StatTask.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/StatTask.cpp similarity index 68% rename from Minecraft.Client/Platform/Common/Tutorial/StatTask.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/StatTask.cpp index 321c93c19..d3396c52f 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/StatTask.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/StatTask.cpp @@ -1,8 +1,8 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/LocalPlayer.h" -#include "../../Minecraft.Client/GameState/StatsCounter.h" -#include "../../Minecraft.World/Headers/net.minecraft.stats.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/player/LocalPlayer.h" +#include "../../../../net/minecraft/stats/StatsCounter.h" +#include "../../../../../Minecraft.World/net/minecraft/stats/net.minecraft.stats.h" #include "StatTask.h" StatTask::StatTask(Tutorial* tutorial, int descriptionId, diff --git a/Minecraft.Client/Platform/Common/Tutorial/StatTask.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/StatTask.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/StatTask.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/StatTask.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/StateChangeTask.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/StateChangeTask.h similarity index 97% rename from Minecraft.Client/Platform/Common/Tutorial/StateChangeTask.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/StateChangeTask.h index 9a5e7a83a..17345ee25 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/StateChangeTask.h +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/StateChangeTask.h @@ -1,6 +1,6 @@ #pragma once // using namespace std; -#include "Tutorial.h" +#include "../Tutorial.h" #include "TutorialTask.h" class StateChangeTask : public TutorialTask { diff --git a/Minecraft.Client/Platform/Common/Tutorial/TutorialTask.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/TutorialTask.cpp similarity index 94% rename from Minecraft.Client/Platform/Common/Tutorial/TutorialTask.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/TutorialTask.cpp index 2ae529c40..720e18c99 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/TutorialTask.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/TutorialTask.cpp @@ -1,6 +1,6 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "Tutorial.h" -#include "TutorialConstraints.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../Tutorial.h" +#include "../Constraints/TutorialConstraints.h" #include "TutorialTask.h" TutorialTask::TutorialTask(Tutorial* tutorial, int descriptionId, diff --git a/Minecraft.Client/Platform/Common/Tutorial/TutorialTask.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/TutorialTask.h similarity index 99% rename from Minecraft.Client/Platform/Common/Tutorial/TutorialTask.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/TutorialTask.h index 4eabc3d44..b0fca6d4e 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/TutorialTask.h +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/TutorialTask.h @@ -1,6 +1,6 @@ #pragma once // using namespace std; -#include "TutorialEnum.h" +#include "../TutorialEnum.h" class Level; class Tutorial; diff --git a/Minecraft.Client/Platform/Common/Tutorial/TutorialTasks.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/TutorialTasks.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/TutorialTasks.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/TutorialTasks.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/UseItemTask.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/UseItemTask.cpp similarity index 71% rename from Minecraft.Client/Platform/Common/Tutorial/UseItemTask.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/UseItemTask.cpp index 7874eec5f..3c684e2a6 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/UseItemTask.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/UseItemTask.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Entities/Entity.h" -#include "../../Minecraft.World/Level/Level.h" -#include "../../Minecraft.World/Items/ItemInstance.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/Entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/Level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/ItemInstance.h" #include "UseItemTask.h" UseItemTask::UseItemTask(const int itemId, Tutorial* tutorial, diff --git a/Minecraft.Client/Platform/Common/Tutorial/UseItemTask.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/UseItemTask.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/UseItemTask.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/UseItemTask.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/UseTileTask.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/UseTileTask.cpp similarity index 84% rename from Minecraft.Client/Platform/Common/Tutorial/UseTileTask.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/UseTileTask.cpp index 35d992d14..620189c75 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/UseTileTask.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/UseTileTask.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Entities/Entity.h" -#include "../../Minecraft.World/Level/Level.h" -#include "../../Minecraft.World/Items/ItemInstance.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/Entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/Level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/ItemInstance.h" #include "UseTileTask.h" UseTileTask::UseTileTask(const int tileId, int x, int y, int z, diff --git a/Minecraft.Client/Platform/Common/Tutorial/UseTileTask.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/UseTileTask.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/UseTileTask.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/UseTileTask.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/XuiCraftingTask.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/XuiCraftingTask.cpp similarity index 80% rename from Minecraft.Client/Platform/Common/Tutorial/XuiCraftingTask.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/XuiCraftingTask.cpp index e27f9e052..d63af9aaa 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/XuiCraftingTask.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/XuiCraftingTask.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Items/ItemInstance.h" -#include "../UI/UI.h" -#include "Tutorial.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/ItemInstance.h" +#include "../../UI/UI.h" +#include "../Tutorial.h" #include "XuiCraftingTask.h" bool XuiCraftingTask::isCompleted() { diff --git a/Minecraft.Client/Platform/Common/Tutorial/XuiCraftingTask.h b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/XuiCraftingTask.h similarity index 94% rename from Minecraft.Client/Platform/Common/Tutorial/XuiCraftingTask.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tasks/XuiCraftingTask.h index 3ed6b6d96..d3bcc3e20 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/XuiCraftingTask.h +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tasks/XuiCraftingTask.h @@ -1,6 +1,6 @@ #pragma once #include "TutorialTask.h" -#include "../../Minecraft.World/Recipes/Recipy.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/crafting/Recipy.h" class XuiCraftingTask : public TutorialTask { public: diff --git a/Minecraft.Client/Platform/Common/Tutorial/Tutorial.cpp b/Minecraft.Client/Common/Source Files/Tutorial/Tutorial.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/Tutorial/Tutorial.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/Tutorial.cpp index 7ac952962..9fa1a5f29 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/Tutorial.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tutorial.cpp @@ -1,22 +1,22 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Headers/net.minecraft.stats.h" -#include "../../Minecraft.Client/Player/LocalPlayer.h" -#include "../../Minecraft.World/Entities/Entity.h" -#include "../../Minecraft.World/Level/Level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.Client/MinecraftServer.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.Client/Level/MultiPlayerLevel.h" -#include "../../Minecraft.Client/GameState/SurvivalMode.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../Minecraft.World/net/minecraft/stats/net.minecraft.stats.h" +#include "../../../net/minecraft/client/player/LocalPlayer.h" +#include "../../../../Minecraft.World/net/minecraft/world/entity/Entity.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/Level.h" +#include "../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../net/minecraft/server/MinecraftServer.h" +#include "../../../net/minecraft/client/Minecraft.h" +#include "../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../net/minecraft/client/multiplayer/MultiPlayerLevel.h" +#include "../../../net/minecraft/server/level/SurvivalMode.h" #include "Tutorial.h" #include "TutorialMessage.h" -#include "TutorialTasks.h" -#include "TutorialConstraints.h" -#include "TutorialHints.h" +#include "Tasks/TutorialTasks.h" +#include "Constraints/TutorialConstraints.h" +#include "Hints/TutorialHints.h" std::vector Tutorial::s_completableTasks; diff --git a/Minecraft.Client/Platform/Common/Tutorial/Tutorial.h b/Minecraft.Client/Common/Source Files/Tutorial/Tutorial.h similarity index 98% rename from Minecraft.Client/Platform/Common/Tutorial/Tutorial.h rename to Minecraft.Client/Common/Source Files/Tutorial/Tutorial.h index 17cdac680..77d76ced3 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/Tutorial.h +++ b/Minecraft.Client/Common/Source Files/Tutorial/Tutorial.h @@ -1,8 +1,8 @@ #pragma once // using namespace std; -#include "TutorialTask.h" -#include "TutorialConstraint.h" -#include "TutorialHint.h" +#include "Tasks/TutorialTask.h" +#include "Constraints/TutorialConstraint.h" +#include "Hints/TutorialHint.h" #include "TutorialMessage.h" #include "TutorialEnum.h" diff --git a/Minecraft.Client/Platform/Common/Tutorial/TutorialEnum.h b/Minecraft.Client/Common/Source Files/Tutorial/TutorialEnum.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/TutorialEnum.h rename to Minecraft.Client/Common/Source Files/Tutorial/TutorialEnum.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/TutorialMessage.cpp b/Minecraft.Client/Common/Source Files/Tutorial/TutorialMessage.cpp similarity index 90% rename from Minecraft.Client/Platform/Common/Tutorial/TutorialMessage.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/TutorialMessage.cpp index 30fd6cd1d..b475d8bcd 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/TutorialMessage.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/TutorialMessage.cpp @@ -1,4 +1,4 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "TutorialMessage.h" TutorialMessage::TutorialMessage( diff --git a/Minecraft.Client/Platform/Common/Tutorial/TutorialMessage.h b/Minecraft.Client/Common/Source Files/Tutorial/TutorialMessage.h similarity index 100% rename from Minecraft.Client/Platform/Common/Tutorial/TutorialMessage.h rename to Minecraft.Client/Common/Source Files/Tutorial/TutorialMessage.h diff --git a/Minecraft.Client/Platform/Common/Tutorial/TutorialMode.cpp b/Minecraft.Client/Common/Source Files/Tutorial/TutorialMode.cpp similarity index 83% rename from Minecraft.Client/Platform/Common/Tutorial/TutorialMode.cpp rename to Minecraft.Client/Common/Source Files/Tutorial/TutorialMode.cpp index e6c74cc5b..1e7126e22 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/TutorialMode.cpp +++ b/Minecraft.Client/Common/Source Files/Tutorial/TutorialMode.cpp @@ -1,12 +1,12 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.Client/Level/MultiPlayerLevel.h" -#include "../../Minecraft.World/Containers/Inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" +#include "../../../net/minecraft/client/Minecraft.h" +#include "../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../net/minecraft/client/multiplayer/MultiPlayerLevel.h" +#include "../../../../Minecraft.World/net/minecraft/world/entity/player/Inventory.h" +#include "../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" #include "TutorialMode.h" TutorialMode::TutorialMode(int iPad, Minecraft* minecraft, diff --git a/Minecraft.Client/Platform/Common/Tutorial/TutorialMode.h b/Minecraft.Client/Common/Source Files/Tutorial/TutorialMode.h similarity index 93% rename from Minecraft.Client/Platform/Common/Tutorial/TutorialMode.h rename to Minecraft.Client/Common/Source Files/Tutorial/TutorialMode.h index be3c0bd7e..3277c89b8 100644 --- a/Minecraft.Client/Platform/Common/Tutorial/TutorialMode.h +++ b/Minecraft.Client/Common/Source Files/Tutorial/TutorialMode.h @@ -1,7 +1,7 @@ #pragma once // using namespace std; -#include "../../Minecraft.Client/Player/MultiPlayerGameMode.h" +#include "../../../net/minecraft/client/multiplayer/MultiPlayerGameMode.h" #include "Tutorial.h" class TutorialMode : public MultiPlayerGameMode { diff --git a/Minecraft.Client/Utils/ArchiveFile.cpp b/Minecraft.Client/Common/Source Files/UI/All Platforms/ArchiveFile.cpp similarity index 94% rename from Minecraft.Client/Utils/ArchiveFile.cpp rename to Minecraft.Client/Common/Source Files/UI/All Platforms/ArchiveFile.cpp index 16d952792..6024419df 100644 --- a/Minecraft.Client/Utils/ArchiveFile.cpp +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/ArchiveFile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Util/PortableFileIO.h" -#include "../../Minecraft.World/IO/Streams/Compression.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../Minecraft.World/Header Files/PortableFileIO.h" +#include "../../../../../Minecraft.World/Header Files/compression.h" #include "ArchiveFile.h" diff --git a/Minecraft.Client/Utils/ArchiveFile.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/ArchiveFile.h similarity index 83% rename from Minecraft.Client/Utils/ArchiveFile.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/ArchiveFile.h index 6645a39a9..dc4635ef9 100644 --- a/Minecraft.Client/Utils/ArchiveFile.h +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/ArchiveFile.h @@ -4,8 +4,8 @@ #include #include -#include "../../Minecraft.World/IO/Files/File.h" -#include "../../Minecraft.World/Util/ArrayWithLength.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/File.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/ArrayWithLength.h" class ArchiveFile { protected: diff --git a/Minecraft.Client/Platform/Common/UI/IUIController.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIController.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/IUIController.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIController.h diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_AbstractContainerMenu.cpp b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_AbstractContainerMenu.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/IUIScene_AbstractContainerMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_AbstractContainerMenu.cpp index eef48ca56..4263111e6 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_AbstractContainerMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_AbstractContainerMenu.cpp @@ -1,13 +1,13 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "IUIScene_AbstractContainerMenu.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.crafting.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.Client/Minecraft.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/crafting/net.minecraft.world.item.crafting.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../net/minecraft/client/Minecraft.h" IUIScene_AbstractContainerMenu::IUIScene_AbstractContainerMenu() { m_menu = nullptr; diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_AbstractContainerMenu.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_AbstractContainerMenu.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/IUIScene_AbstractContainerMenu.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_AbstractContainerMenu.h diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_AnvilMenu.cpp b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_AnvilMenu.cpp similarity index 93% rename from Minecraft.Client/Platform/Common/UI/IUIScene_AnvilMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_AnvilMenu.cpp index 9b45900f9..8f8b62b8c 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_AnvilMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_AnvilMenu.cpp @@ -1,11 +1,11 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "IUIScene_AnvilMenu.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/IO/Streams/InputOutputStream.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.packet.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.Client/Network/ClientConnection.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../../../../Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../net/minecraft/client/multiplayer/ClientConnection.h" IUIScene_AnvilMenu::IUIScene_AnvilMenu() { m_inventory = nullptr; diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_AnvilMenu.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_AnvilMenu.h similarity index 94% rename from Minecraft.Client/Platform/Common/UI/IUIScene_AnvilMenu.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_AnvilMenu.h index 5833471f8..cb065f5f8 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_AnvilMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_AnvilMenu.h @@ -1,6 +1,6 @@ #pragma once #include "IUIScene_AbstractContainerMenu.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.ContainerListener.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.ContainerListener.h" // The 0-indexed slot in the inventory list that lines up with the result slot #define ANVIL_SCENE_RESULT_SLOT_UP_OFFSET 5 diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_BeaconMenu.cpp b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_BeaconMenu.cpp similarity index 94% rename from Minecraft.Client/Platform/Common/UI/IUIScene_BeaconMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_BeaconMenu.cpp index 960d24046..871371134 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_BeaconMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_BeaconMenu.cpp @@ -1,13 +1,13 @@ -#include "../../stdafx.h" -#include "../../../../Minecraft.World/Network/Packets/CustomPayloadPacket.h" -#include "../../../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../../../Minecraft.World/Headers/net.minecraft.world.effect.h" -#include "../../../../Minecraft.World/Util/HtmlString.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/network/packet/CustomPayloadPacket.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/effect/net.minecraft.world.effect.h" +#include "../../../../../Minecraft.World/net/minecraft/util/HtmlString.h" #include "IUIScene_BeaconMenu.h" -#include "../../../Minecraft.h" -#include "../../../Player/MultiPlayerLocalPlayer.h" -#include "../../../Network/ClientConnection.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../net/minecraft/client/multiplayer/ClientConnection.h" IUIScene_BeaconMenu::IUIScene_BeaconMenu() { m_beacon = nullptr; diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_BeaconMenu.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_BeaconMenu.h similarity index 96% rename from Minecraft.Client/Platform/Common/UI/IUIScene_BeaconMenu.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_BeaconMenu.h index f09bef038..2636b0f2d 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_BeaconMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_BeaconMenu.h @@ -1,5 +1,5 @@ #pragma once -#include "Common/UI/IUIScene_AbstractContainerMenu.h" +#include "IUIScene_AbstractContainerMenu.h" class BeaconTileEntity; diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_BrewingMenu.cpp b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_BrewingMenu.cpp similarity index 96% rename from Minecraft.Client/Platform/Common/UI/IUIScene_BrewingMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_BrewingMenu.cpp index 3cccef704..22af1e10e 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_BrewingMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_BrewingMenu.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "IUIScene_BrewingMenu.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" IUIScene_AbstractContainerMenu::ESceneSection IUIScene_BrewingMenu::GetSectionAndSlotInDirection(ESceneSection eSection, diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_BrewingMenu.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_BrewingMenu.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/IUIScene_BrewingMenu.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_BrewingMenu.h diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_CommandBlockMenu.cpp b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_CommandBlockMenu.cpp similarity index 69% rename from Minecraft.Client/Platform/Common/UI/IUIScene_CommandBlockMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_CommandBlockMenu.cpp index ae5bbf32f..7abc1c9a6 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_CommandBlockMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_CommandBlockMenu.cpp @@ -1,7 +1,7 @@ -#include "../../stdafx.h" -#include "../../../../Minecraft.World/Network/Packets/CustomPayloadPacket.h" -#include "../../../Player/MultiPlayerLocalPlayer.h" -#include "../../../Network/ClientConnection.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/network/packet/CustomPayloadPacket.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../net/minecraft/client/multiplayer/ClientConnection.h" #include "IUIScene_CommandBlockMenu.h" void IUIScene_CommandBlockMenu::Initialise(CommandBlockEntity* commandBlock) { diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_CommandBlockMenu.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_CommandBlockMenu.h similarity index 76% rename from Minecraft.Client/Platform/Common/UI/IUIScene_CommandBlockMenu.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_CommandBlockMenu.h index ee6b9b295..6522c13f2 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_CommandBlockMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_CommandBlockMenu.h @@ -1,5 +1,5 @@ #pragma once -#include "../../../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" class IUIScene_CommandBlockMenu { public: diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_ContainerMenu.cpp b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_ContainerMenu.cpp similarity index 92% rename from Minecraft.Client/Platform/Common/UI/IUIScene_ContainerMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_ContainerMenu.cpp index b4201cf59..891ab6cb6 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_ContainerMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_ContainerMenu.cpp @@ -1,6 +1,6 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "IUIScene_ContainerMenu.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" IUIScene_AbstractContainerMenu::ESceneSection IUIScene_ContainerMenu::GetSectionAndSlotInDirection(ESceneSection eSection, diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_ContainerMenu.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_ContainerMenu.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/IUIScene_ContainerMenu.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_ContainerMenu.h diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_CraftingMenu.cpp b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_CraftingMenu.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/UI/IUIScene_CraftingMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_CraftingMenu.cpp index c34ebf7a1..7200e8f5f 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_CraftingMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_CraftingMenu.cpp @@ -1,9 +1,9 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.crafting.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Headers/net.minecraft.stats.h" -#include "../../Minecraft.Client/Player/LocalPlayer.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/crafting/net.minecraft.world.item.crafting.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/net/minecraft/stats/net.minecraft.stats.h" +#include "../../../../net/minecraft/client/player/LocalPlayer.h" #include "IUIScene_CraftingMenu.h" Recipy::_eGroupType IUIScene_CraftingMenu::m_GroupTypeMapping4GridA diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_CraftingMenu.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_CraftingMenu.h similarity index 96% rename from Minecraft.Client/Platform/Common/UI/IUIScene_CraftingMenu.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_CraftingMenu.h index f446d8a27..aae4086cd 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_CraftingMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_CraftingMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Minecraft.World/Recipes/Recipy.h" -#include "../../Minecraft.World/Items/Item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/crafting/Recipy.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/Item.h" class LocalPlayer; diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_CreativeMenu.cpp b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_CreativeMenu.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/IUIScene_CreativeMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_CreativeMenu.cpp index 563bfdf27..4cd0d10fd 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_CreativeMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_CreativeMenu.cpp @@ -1,16 +1,16 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "IUIScene_CreativeMenu.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.enchantment.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" -#include "../../Minecraft.World/Util/JavaMath.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/enchantment/net.minecraft.world.item.enchantment.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" // 4J JEV - Images for each tab. IUIScene_CreativeMenu::TabSpec** IUIScene_CreativeMenu::specs = nullptr; diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_CreativeMenu.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_CreativeMenu.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/IUIScene_CreativeMenu.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_CreativeMenu.h index 21f1e40d9..174a2f4d8 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_CreativeMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_CreativeMenu.h @@ -1,6 +1,6 @@ #pragma once #include "IUIScene_AbstractContainerMenu.h" -#include "../../Minecraft.World/Containers/AbstractContainerMenu.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/AbstractContainerMenu.h" // 4J Stu - This class is for code that is common between XUI and Iggy class SimpleContainer; diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_DispenserMenu.cpp b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_DispenserMenu.cpp similarity index 92% rename from Minecraft.Client/Platform/Common/UI/IUIScene_DispenserMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_DispenserMenu.cpp index bd296c080..5e8789185 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_DispenserMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_DispenserMenu.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "IUIScene_DispenserMenu.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" IUIScene_AbstractContainerMenu::ESceneSection IUIScene_DispenserMenu::GetSectionAndSlotInDirection(ESceneSection eSection, diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_DispenserMenu.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_DispenserMenu.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/IUIScene_DispenserMenu.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_DispenserMenu.h diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_EnchantingMenu.cpp b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_EnchantingMenu.cpp similarity index 94% rename from Minecraft.Client/Platform/Common/UI/IUIScene_EnchantingMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_EnchantingMenu.cpp index 8e932e713..9f8dd0510 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_EnchantingMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_EnchantingMenu.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" #include "IUIScene_EnchantingMenu.h" IUIScene_AbstractContainerMenu::ESceneSection diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_EnchantingMenu.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_EnchantingMenu.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/IUIScene_EnchantingMenu.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_EnchantingMenu.h diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_FireworksMenu.cpp b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_FireworksMenu.cpp similarity index 95% rename from Minecraft.Client/Platform/Common/UI/IUIScene_FireworksMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_FireworksMenu.cpp index 585092be1..ce2185540 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_FireworksMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_FireworksMenu.cpp @@ -1,7 +1,7 @@ -#include "../../stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "IUIScene_FireworksMenu.h" -#include "../../../../Minecraft.World/Headers/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" IUIScene_AbstractContainerMenu::ESceneSection IUIScene_FireworksMenu::GetSectionAndSlotInDirection(ESceneSection eSection, diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_FireworksMenu.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_FireworksMenu.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/IUIScene_FireworksMenu.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_FireworksMenu.h diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_FurnaceMenu.cpp b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_FurnaceMenu.cpp similarity index 96% rename from Minecraft.Client/Platform/Common/UI/IUIScene_FurnaceMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_FurnaceMenu.cpp index 30fe84d08..6b3edf5d5 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_FurnaceMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_FurnaceMenu.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "IUIScene_FurnaceMenu.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" IUIScene_AbstractContainerMenu::ESceneSection IUIScene_FurnaceMenu::GetSectionAndSlotInDirection(ESceneSection eSection, diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_FurnaceMenu.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_FurnaceMenu.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/IUIScene_FurnaceMenu.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_FurnaceMenu.h diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_HUD.cpp b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_HUD.cpp similarity index 93% rename from Minecraft.Client/Platform/Common/UI/IUIScene_HUD.cpp rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_HUD.cpp index d6efeca88..9c95b24ac 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_HUD.cpp +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_HUD.cpp @@ -1,10 +1,10 @@ -#include "../../stdafx.h" -#include "../../../Minecraft.h" -#include "../../../Player/MultiPlayerLocalPlayer.h" -#include "../../../../Minecraft.World/Headers/net.minecraft.world.effect.h" -#include "../../../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../../../Minecraft.World/Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../../../Minecraft.World/Headers/net.minecraft.world.entity.monster.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../Minecraft.World/net/minecraft/world/effect/net.minecraft.world.effect.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h" #include "IUIScene_HUD.h" IUIScene_HUD::IUIScene_HUD() { diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_HUD.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_HUD.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/IUIScene_HUD.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_HUD.h diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_HopperMenu.cpp b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_HopperMenu.cpp similarity index 92% rename from Minecraft.Client/Platform/Common/UI/IUIScene_HopperMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_HopperMenu.cpp index f13419f34..0db96d233 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_HopperMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_HopperMenu.cpp @@ -1,6 +1,6 @@ -#include "../../stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "IUIScene_HopperMenu.h" -#include "../../../../Minecraft.World/Headers/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" IUIScene_AbstractContainerMenu::ESceneSection IUIScene_HopperMenu::GetSectionAndSlotInDirection(ESceneSection eSection, diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_HopperMenu.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_HopperMenu.h similarity index 75% rename from Minecraft.Client/Platform/Common/UI/IUIScene_HopperMenu.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_HopperMenu.h index a11d33d85..bfc70de2c 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_HopperMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_HopperMenu.h @@ -1,8 +1,8 @@ #pragma once #include "IUIScene_AbstractContainerMenu.h" -#include "../../../../Minecraft.World/Containers/Container.h" -#include "../../../../Minecraft.World/Containers/Inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/Container.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/Inventory.h" class IUIScene_HopperMenu : public virtual IUIScene_AbstractContainerMenu { public: diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_HorseInventoryMenu.cpp b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_HorseInventoryMenu.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/IUIScene_HorseInventoryMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_HorseInventoryMenu.cpp index edb469933..bddf4ccef 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_HorseInventoryMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_HorseInventoryMenu.cpp @@ -1,6 +1,6 @@ -#include "../../stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "IUIScene_HorseInventoryMenu.h" -#include "../../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" IUIScene_AbstractContainerMenu::ESceneSection IUIScene_HorseInventoryMenu::GetSectionAndSlotInDirection( diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_HorseInventoryMenu.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_HorseInventoryMenu.h similarity index 74% rename from Minecraft.Client/Platform/Common/UI/IUIScene_HorseInventoryMenu.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_HorseInventoryMenu.h index 86a8f09c8..ae02a7fc8 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_HorseInventoryMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_HorseInventoryMenu.h @@ -1,9 +1,9 @@ #pragma once #include "IUIScene_AbstractContainerMenu.h" -#include "../../../../Minecraft.World/Containers/Container.h" -#include "../../../../Minecraft.World/Containers/Inventory.h" -#include "../../../../Minecraft.World/Entities/Mobs/EntityHorse.h" +#include "../../../../../Minecraft.World/net/minecraft/world/Container.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/Inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/animal/EntityHorse.h" class IUIScene_HorseInventoryMenu : public virtual IUIScene_AbstractContainerMenu { diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_InventoryMenu.cpp b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_InventoryMenu.cpp similarity index 92% rename from Minecraft.Client/Platform/Common/UI/IUIScene_InventoryMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_InventoryMenu.cpp index 717d1b481..a804a87ef 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_InventoryMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_InventoryMenu.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "IUIScene_InventoryMenu.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" IUIScene_AbstractContainerMenu::ESceneSection IUIScene_InventoryMenu::GetSectionAndSlotInDirection(ESceneSection eSection, diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_InventoryMenu.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_InventoryMenu.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/IUIScene_InventoryMenu.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_InventoryMenu.h diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_PauseMenu.cpp b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_PauseMenu.cpp similarity index 96% rename from Minecraft.Client/Platform/Common/UI/IUIScene_PauseMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_PauseMenu.cpp index 6ede8262e..70ffcb2b5 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_PauseMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_PauseMenu.cpp @@ -1,19 +1,19 @@ #include #include -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "IUIScene_PauseMenu.h" -#include "UIScene.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/MinecraftServer.h" -#include "../../Minecraft.Client/Level/MultiPlayerLevel.h" -#include "../../Minecraft.Client/Rendering/EntityRenderers/ProgressRenderer.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.phys.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePackRepository.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePack.h" -#include "../../Minecraft.Client/Textures/Packs/DLCTexturePack.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../UIScene.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/server/MinecraftServer.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLevel.h" +#include "../../../../net/minecraft/client/ProgressRenderer.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/phys/net.minecraft.world.phys.h" +#include "../../../../net/minecraft/client/skins/TexturePackRepository.h" +#include "../../../../net/minecraft/client/skins/TexturePack.h" +#include "../../../../net/minecraft/client/skins/DLCTexturePack.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" int IUIScene_PauseMenu::ExitGameDialogReturned( void* pParam, int iPad, C4JStorage::EMessageResult result) { diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_PauseMenu.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_PauseMenu.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/IUIScene_PauseMenu.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_PauseMenu.h diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_TradingMenu.cpp b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_TradingMenu.cpp similarity index 95% rename from Minecraft.Client/Platform/Common/UI/IUIScene_TradingMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_TradingMenu.cpp index 7ed495e3d..d22b36f4d 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_TradingMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_TradingMenu.cpp @@ -1,10 +1,10 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.trading.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.packet.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.Client/Network/ClientConnection.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/trading/net.minecraft.world.item.trading.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../net/minecraft/client/multiplayer/ClientConnection.h" #include "IUIScene_TradingMenu.h" IUIScene_TradingMenu::IUIScene_TradingMenu() { diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_TradingMenu.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_TradingMenu.h similarity index 88% rename from Minecraft.Client/Platform/Common/UI/IUIScene_TradingMenu.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_TradingMenu.h index 4715fefd5..1a7291ed6 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_TradingMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/IUIScene_TradingMenu.h @@ -1,7 +1,7 @@ #pragma once -#include "../../Minecraft.World/Containers/MerchantMenu.h" -#include "../Minecraft.World/Util/HtmlString.h" -#include "../Minecraft.World/Util/Rarity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/MerchantMenu.h" +#include "../../../../../Minecraft.World/net/minecraft/util/HtmlString.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/Rarity.h" class MerchantRecipe; diff --git a/Minecraft.Client/Platform/Common/UI/UIEnums.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/UIEnums.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIEnums.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/UIEnums.h diff --git a/Minecraft.Client/Platform/Common/UI/UIStructs.h b/Minecraft.Client/Common/Source Files/UI/All Platforms/UIStructs.h similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIStructs.h rename to Minecraft.Client/Common/Source Files/UI/All Platforms/UIStructs.h index 4cba8ce6c..afdccb7fc 100644 --- a/Minecraft.Client/Platform/Common/UI/UIStructs.h +++ b/Minecraft.Client/Common/Source Files/UI/All Platforms/UIStructs.h @@ -5,7 +5,7 @@ #include #include "UIEnums.h" -#include "../App_Defines.h" +#include "../../../App_Defines.h" class Container; class Inventory; diff --git a/Minecraft.Client/Platform/Common/UI/UIComponent_Chat.cpp b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Chat.cpp similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIComponent_Chat.cpp rename to Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Chat.cpp index 27e41c3b8..c9fe264b1 100644 --- a/Minecraft.Client/Platform/Common/UI/UIComponent_Chat.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Chat.cpp @@ -1,8 +1,8 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIComponent_Chat.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/UI/Gui.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/gui/Gui.h" UIComponent_Chat::UIComponent_Chat(int iPad, void* initData, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIComponent_Chat.h b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Chat.h similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIComponent_Chat.h rename to Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Chat.h index 7f63fe4e8..e1d85e9a9 100644 --- a/Minecraft.Client/Platform/Common/UI/UIComponent_Chat.h +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Chat.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../UIScene.h" #define CHAT_LINES_COUNT 10 diff --git a/Minecraft.Client/Platform/Common/UI/UIComponent_DebugUIConsole.cpp b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_DebugUIConsole.cpp similarity index 92% rename from Minecraft.Client/Platform/Common/UI/UIComponent_DebugUIConsole.cpp rename to Minecraft.Client/Common/Source Files/UI/Components/UIComponent_DebugUIConsole.cpp index 91e234a56..aec46f569 100644 --- a/Minecraft.Client/Platform/Common/UI/UIComponent_DebugUIConsole.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_DebugUIConsole.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIComponent_DebugUIConsole.h" UIComponent_DebugUIConsole::UIComponent_DebugUIConsole(int iPad, void* initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIComponent_DebugUIConsole.h b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_DebugUIConsole.h similarity index 95% rename from Minecraft.Client/Platform/Common/UI/UIComponent_DebugUIConsole.h rename to Minecraft.Client/Common/Source Files/UI/Components/UIComponent_DebugUIConsole.h index fce2571de..242fa91e9 100644 --- a/Minecraft.Client/Platform/Common/UI/UIComponent_DebugUIConsole.h +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_DebugUIConsole.h @@ -1,7 +1,7 @@ #pragma once -#include "UIScene.h" -#include "UIControl_Label.h" +#include "../UIScene.h" +#include "../Controls/UIControl_Label.h" class UIComponent_DebugUIConsole : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIComponent_DebugUIMarketingGuide.cpp b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_DebugUIMarketingGuide.cpp similarity index 90% rename from Minecraft.Client/Platform/Common/UI/UIComponent_DebugUIMarketingGuide.cpp rename to Minecraft.Client/Common/Source Files/UI/Components/UIComponent_DebugUIMarketingGuide.cpp index bc24f4746..a2c6b50e8 100644 --- a/Minecraft.Client/Platform/Common/UI/UIComponent_DebugUIMarketingGuide.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_DebugUIMarketingGuide.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIComponent_DebugUIMarketingGuide.h" UIComponent_DebugUIMarketingGuide::UIComponent_DebugUIMarketingGuide( diff --git a/Minecraft.Client/Platform/Common/UI/UIComponent_DebugUIMarketingGuide.h b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_DebugUIMarketingGuide.h similarity index 93% rename from Minecraft.Client/Platform/Common/UI/UIComponent_DebugUIMarketingGuide.h rename to Minecraft.Client/Common/Source Files/UI/Components/UIComponent_DebugUIMarketingGuide.h index cad8a03d2..2e550ec1d 100644 --- a/Minecraft.Client/Platform/Common/UI/UIComponent_DebugUIMarketingGuide.h +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_DebugUIMarketingGuide.h @@ -1,7 +1,7 @@ #pragma once -#include "UIScene.h" -#include "UIControl_Label.h" +#include "../UIScene.h" +#include "../Controls/UIControl_Label.h" class UIComponent_DebugUIMarketingGuide : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIComponent_Logo.cpp b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Logo.cpp similarity index 92% rename from Minecraft.Client/Platform/Common/UI/UIComponent_Logo.cpp rename to Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Logo.cpp index 5489c2a7e..ac5024bfd 100644 --- a/Minecraft.Client/Platform/Common/UI/UIComponent_Logo.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Logo.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIComponent_Logo.h" UIComponent_Logo::UIComponent_Logo(int iPad, void* initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIComponent_Logo.h b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Logo.h similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIComponent_Logo.h rename to Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Logo.h index 179eaf512..cde241f03 100644 --- a/Minecraft.Client/Platform/Common/UI/UIComponent_Logo.h +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Logo.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../UIScene.h" class UIComponent_Logo : public UIScene { public: diff --git a/Minecraft.Client/Platform/Common/UI/UIComponent_MenuBackground.cpp b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_MenuBackground.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIComponent_MenuBackground.cpp rename to Minecraft.Client/Common/Source Files/UI/Components/UIComponent_MenuBackground.cpp index 8a8bffe9c..3dcdfd9ed 100644 --- a/Minecraft.Client/Platform/Common/UI/UIComponent_MenuBackground.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_MenuBackground.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIComponent_MenuBackground.h" UIComponent_MenuBackground::UIComponent_MenuBackground(int iPad, void* initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIComponent_MenuBackground.h b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_MenuBackground.h similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIComponent_MenuBackground.h rename to Minecraft.Client/Common/Source Files/UI/Components/UIComponent_MenuBackground.h index 5f8ef4129..ad3f4df24 100644 --- a/Minecraft.Client/Platform/Common/UI/UIComponent_MenuBackground.h +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_MenuBackground.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../UIScene.h" class UIComponent_MenuBackground : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIComponent_Panorama.cpp b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Panorama.cpp similarity index 91% rename from Minecraft.Client/Platform/Common/UI/UIComponent_Panorama.cpp rename to Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Panorama.cpp index 2e096319d..3cc14f485 100644 --- a/Minecraft.Client/Platform/Common/UI/UIComponent_Panorama.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Panorama.cpp @@ -1,10 +1,10 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIComponent_Panorama.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Level/MultiPlayerLevel.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.storage.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLevel.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h" #include UIComponent_Panorama::UIComponent_Panorama(int iPad, void* initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIComponent_Panorama.h b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Panorama.h similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIComponent_Panorama.h rename to Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Panorama.h index 4a8bf858d..48f7634c9 100644 --- a/Minecraft.Client/Platform/Common/UI/UIComponent_Panorama.h +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Panorama.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../UIScene.h" class UIComponent_Panorama : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIComponent_PressStartToPlay.cpp b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_PressStartToPlay.cpp similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIComponent_PressStartToPlay.cpp rename to Minecraft.Client/Common/Source Files/UI/Components/UIComponent_PressStartToPlay.cpp index caf942753..107853ca9 100644 --- a/Minecraft.Client/Platform/Common/UI/UIComponent_PressStartToPlay.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_PressStartToPlay.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIComponent_PressStartToPlay.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" UIComponent_PressStartToPlay::UIComponent_PressStartToPlay(int iPad, void* initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIComponent_PressStartToPlay.h b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_PressStartToPlay.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIComponent_PressStartToPlay.h rename to Minecraft.Client/Common/Source Files/UI/Components/UIComponent_PressStartToPlay.h index 8752c2a5f..e91da7a41 100644 --- a/Minecraft.Client/Platform/Common/UI/UIComponent_PressStartToPlay.h +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_PressStartToPlay.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../UIScene.h" class UIComponent_PressStartToPlay : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIComponent_Tooltips.cpp b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Tooltips.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIComponent_Tooltips.cpp rename to Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Tooltips.cpp index c12ff2083..fcd520fe4 100644 --- a/Minecraft.Client/Platform/Common/UI/UIComponent_Tooltips.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Tooltips.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIComponent_Tooltips.h" UIComponent_Tooltips::UIComponent_Tooltips(int iPad, void* initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIComponent_Tooltips.h b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Tooltips.h similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIComponent_Tooltips.h rename to Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Tooltips.h index c98e847a4..6b54ffb26 100644 --- a/Minecraft.Client/Platform/Common/UI/UIComponent_Tooltips.h +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_Tooltips.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../UIScene.h" class UIComponent_Tooltips : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIComponent_TutorialPopup.cpp b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_TutorialPopup.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIComponent_TutorialPopup.cpp rename to Minecraft.Client/Common/Source Files/UI/Components/UIComponent_TutorialPopup.cpp index caae72b52..a770536e6 100644 --- a/Minecraft.Client/Platform/Common/UI/UIComponent_TutorialPopup.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_TutorialPopup.cpp @@ -1,11 +1,11 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIComponent_TutorialPopup.h" -#include "../Tutorial/Tutorial.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" +#include "../../Tutorial/Tutorial.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" UIComponent_TutorialPopup::UIComponent_TutorialPopup(int iPad, void* initData, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIComponent_TutorialPopup.h b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_TutorialPopup.h similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIComponent_TutorialPopup.h rename to Minecraft.Client/Common/Source Files/UI/Components/UIComponent_TutorialPopup.h index a1fec6513..2477de825 100644 --- a/Minecraft.Client/Platform/Common/UI/UIComponent_TutorialPopup.h +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIComponent_TutorialPopup.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../UIScene.h" #define TUTORIAL_POPUP_FADE_TIMER_ID 0 #define TUTORIAL_POPUP_MOVE_SCENE_TIMER_ID 1 diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_HUD.cpp b/Minecraft.Client/Common/Source Files/UI/Components/UIScene_HUD.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_HUD.cpp rename to Minecraft.Client/Common/Source Files/UI/Components/UIScene_HUD.cpp index af297d586..ad5dc127e 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_HUD.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIScene_HUD.cpp @@ -1,15 +1,15 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIScene_HUD.h" -#include "../../Minecraft.Client/UI/BossMobGuiInfo.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.boss.enderdragon.h" -#include "../../Minecraft.Client/Rendering/EntityRenderers/EnderDragonRenderer.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.effect.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../net/minecraft/client/renderer/BossMobGuiInfo.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/boss/enderdragon/net.minecraft.world.entity.boss.enderdragon.h" +#include "../../../../net/minecraft/client/renderer/entity/EnderDragonRenderer.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/effect/net.minecraft.world.effect.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" UIScene_HUD::UIScene_HUD(int iPad, void* initData, UILayer* parentLayer) : UIScene(iPad, parentLayer) { diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_HUD.h b/Minecraft.Client/Common/Source Files/UI/Components/UIScene_HUD.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_HUD.h rename to Minecraft.Client/Common/Source Files/UI/Components/UIScene_HUD.h index 08757fd17..c1cfd979e 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_HUD.h +++ b/Minecraft.Client/Common/Source Files/UI/Components/UIScene_HUD.h @@ -1,7 +1,7 @@ #pragma once -#include "UIScene.h" -#include "IUIScene_HUD.h" +#include "../UIScene.h" +#include "../All Platforms/IUIScene_HUD.h" #define CHAT_LINES_COUNT 10 diff --git a/Minecraft.Client/Platform/Common/UI/UIControl.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl.cpp similarity index 95% rename from Minecraft.Client/Platform/Common/UI/UIControl.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl.cpp index efe5988ef..1d2060058 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl.cpp @@ -1,8 +1,8 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Util/JavaMath.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" UIControl::UIControl() { m_parentScene = nullptr; diff --git a/Minecraft.Client/Platform/Common/UI/UIControl.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_Base.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Base.cpp similarity index 94% rename from Minecraft.Client/Platform/Common/UI/UIControl_Base.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Base.cpp index 82fc597c3..0ee4054f2 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_Base.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Base.cpp @@ -1,8 +1,8 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Util/JavaMath.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" UIControl_Base::UIControl_Base() { m_bLabelChanged = false; diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_Base.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Base.h similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIControl_Base.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Base.h index 0aa25e053..c7d22f9e8 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_Base.h +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Base.h @@ -1,7 +1,7 @@ #pragma once #include "UIControl.h" -#include "UIString.h" +#include "../UIString.h" // This class maps to the FJ_Base class in actionscript class UIControl_Base : public UIControl { diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_BeaconEffectButton.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_BeaconEffectButton.cpp similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIControl_BeaconEffectButton.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_BeaconEffectButton.cpp index 62578a3ec..e9690f430 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_BeaconEffectButton.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_BeaconEffectButton.cpp @@ -1,5 +1,5 @@ -#include "../../stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_BeaconEffectButton.h" UIControl_BeaconEffectButton::UIControl_BeaconEffectButton() { diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_BeaconEffectButton.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_BeaconEffectButton.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_BeaconEffectButton.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_BeaconEffectButton.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_BitmapIcon.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_BitmapIcon.cpp similarity index 92% rename from Minecraft.Client/Platform/Common/UI/UIControl_BitmapIcon.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_BitmapIcon.cpp index 3afbbf024..4b9795885 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_BitmapIcon.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_BitmapIcon.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_BitmapIcon.h" bool UIControl_BitmapIcon::setupControl(UIScene* scene, IggyValuePath* parent, diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_BitmapIcon.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_BitmapIcon.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_BitmapIcon.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_BitmapIcon.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_Button.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Button.cpp similarity index 95% rename from Minecraft.Client/Platform/Common/UI/UIControl_Button.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Button.cpp index 10799e520..893a5c64b 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_Button.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Button.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_Button.h" UIControl_Button::UIControl_Button() {} diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_Button.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Button.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_Button.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Button.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_ButtonList.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_ButtonList.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIControl_ButtonList.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_ButtonList.cpp index d4f9b2def..ddf756f3d 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_ButtonList.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_ButtonList.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_ButtonList.h" UIControl_ButtonList::UIControl_ButtonList() { diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_ButtonList.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_ButtonList.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_ButtonList.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_ButtonList.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_CheckBox.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_CheckBox.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIControl_CheckBox.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_CheckBox.cpp index 518da6b89..2105c6c77 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_CheckBox.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_CheckBox.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_CheckBox.h" UIControl_CheckBox::UIControl_CheckBox() {} diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_CheckBox.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_CheckBox.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_CheckBox.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_CheckBox.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_Cursor.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Cursor.cpp similarity index 82% rename from Minecraft.Client/Platform/Common/UI/UIControl_Cursor.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Cursor.cpp index 78c430475..2e64a4256 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_Cursor.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Cursor.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_Cursor.h" UIControl_Cursor::UIControl_Cursor() {} diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_Cursor.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Cursor.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_Cursor.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Cursor.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_DLCList.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_DLCList.cpp similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIControl_DLCList.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_DLCList.cpp index ec1e844c5..32031c558 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_DLCList.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_DLCList.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_DLCList.h" bool UIControl_DLCList::setupControl(UIScene* scene, IggyValuePath* parent, diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_DLCList.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_DLCList.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_DLCList.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_DLCList.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_DynamicLabel.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_DynamicLabel.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIControl_DynamicLabel.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_DynamicLabel.cpp index 7b8d6605f..b4aed7327 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_DynamicLabel.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_DynamicLabel.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_DynamicLabel.h" UIControl_DynamicLabel::UIControl_DynamicLabel() {} diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_DynamicLabel.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_DynamicLabel.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_DynamicLabel.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_DynamicLabel.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_EnchantmentBook.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_EnchantmentBook.cpp similarity index 83% rename from Minecraft.Client/Platform/Common/UI/UIControl_EnchantmentBook.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_EnchantmentBook.cpp index dc6c4540f..86a34ba35 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_EnchantmentBook.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_EnchantmentBook.cpp @@ -1,13 +1,13 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_EnchantmentBook.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Rendering/EntityRenderers/TileEntityRenderDispatcher.h" -#include "../../Minecraft.Client/Rendering/EntityRenderers/EnchantTableRenderer.h" -#include "../../Minecraft.Client/Rendering/Lighting.h" -#include "../../Minecraft.Client/Rendering/Models/BookModel.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/renderer/tileentity/TileEntityRenderDispatcher.h" +#include "../../../../net/minecraft/client/renderer/tileentity/EnchantTableRenderer.h" +#include "../../../../net/minecraft/client/Lighting.h" +#include "../../../../net/minecraft/client/model/BookModel.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" UIControl_EnchantmentBook::UIControl_EnchantmentBook() { UIControl::setControlType(UIControl::eEnchantmentBook); diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_EnchantmentBook.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_EnchantmentBook.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_EnchantmentBook.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_EnchantmentBook.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_EnchantmentButton.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_EnchantmentButton.cpp similarity index 94% rename from Minecraft.Client/Platform/Common/UI/UIControl_EnchantmentButton.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_EnchantmentButton.cpp index 465c33554..eb82c79e9 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_EnchantmentButton.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_EnchantmentButton.cpp @@ -1,12 +1,12 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include #include -#include "UI.h" +#include "../UI.h" #include "UIControl_EnchantmentButton.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #include diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_EnchantmentButton.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_EnchantmentButton.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_EnchantmentButton.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_EnchantmentButton.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_HTMLLabel.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_HTMLLabel.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIControl_HTMLLabel.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_HTMLLabel.cpp index b9ca898f8..6321ee22d 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_HTMLLabel.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_HTMLLabel.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_HTMLLabel.h" UIControl_HTMLLabel::UIControl_HTMLLabel() {} diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_HTMLLabel.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_HTMLLabel.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_HTMLLabel.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_HTMLLabel.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_Label.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Label.cpp similarity index 87% rename from Minecraft.Client/Platform/Common/UI/UIControl_Label.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Label.cpp index 11079d42a..f3dc4a12c 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_Label.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Label.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_Label.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" UIControl_Label::UIControl_Label() {} diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_Label.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Label.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_Label.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Label.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_LeaderboardList.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_LeaderboardList.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIControl_LeaderboardList.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_LeaderboardList.cpp index daa8233dc..f06a3fbdb 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_LeaderboardList.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_LeaderboardList.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_LeaderboardList.h" UIControl_LeaderboardList::UIControl_LeaderboardList() {} diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_LeaderboardList.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_LeaderboardList.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_LeaderboardList.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_LeaderboardList.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_MinecraftHorse.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_MinecraftHorse.cpp similarity index 78% rename from Minecraft.Client/Platform/Common/UI/UIControl_MinecraftHorse.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_MinecraftHorse.cpp index 5128cb3ac..53b2b52be 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_MinecraftHorse.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_MinecraftHorse.cpp @@ -1,26 +1,26 @@ -#include "../../stdafx.h" -#include "../../../../Minecraft.Client/Minecraft.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../net/minecraft/client/Minecraft.h" -#include "../../Minecraft.Client/UI/ScreenSizeCalculator.h" -#include "../../Minecraft.Client/Rendering/EntityRenderers/EntityRenderDispatcher.h" +#include "../../../../net/minecraft/client/gui/ScreenSizeCalculator.h" +#include "../../../../net/minecraft/client/renderer/entity/EntityRenderDispatcher.h" -#include "../../Minecraft.Client/Rendering/EntityRenderers/PlayerRenderer.h" -#include "../../Minecraft.Client/Rendering/EntityRenderers/HorseRenderer.h" +#include "../../../../net/minecraft/client/renderer/entity/PlayerRenderer.h" +#include "../../../../net/minecraft/client/renderer/entity/HorseRenderer.h" -#include "../../Minecraft.Client/Rendering/Models/HumanoidModel.h" -#include "../../Minecraft.Client/Rendering/Models/ModelHorse.h" +#include "../../../../net/minecraft/client/model/HumanoidModel.h" +#include "../../../../net/minecraft/client/model/ModelHorse.h" -#include "../../Minecraft.Client/Rendering/Lighting.h" -#include "../../Minecraft.Client/Rendering/Models/ModelPart.h" -#include "../../Minecraft.Client/GameState/Options.h" +#include "../../../../net/minecraft/client/Lighting.h" +#include "../../../../net/minecraft/client/model/geom/ModelPart.h" +#include "../../../../net/minecraft/client/Options.h" -#include "../../../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" // #include // "../../../Minecraft.World/net.minecraft.world.entity.animal.EntityHorse.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" -#include "UI.h" +#include "../UI.h" #include "UIControl_MinecraftHorse.h" UIControl_MinecraftHorse::UIControl_MinecraftHorse() { diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_MinecraftHorse.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_MinecraftHorse.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_MinecraftHorse.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_MinecraftHorse.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_MinecraftPlayer.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_MinecraftPlayer.cpp similarity index 82% rename from Minecraft.Client/Platform/Common/UI/UIControl_MinecraftPlayer.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_MinecraftPlayer.cpp index 5f51122c3..bddfb59e3 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_MinecraftPlayer.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_MinecraftPlayer.cpp @@ -1,15 +1,15 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/UI/ScreenSizeCalculator.h" -#include "../../Minecraft.Client/Rendering/EntityRenderers/EntityRenderDispatcher.h" -#include "../../Minecraft.Client/Rendering/EntityRenderers/PlayerRenderer.h" -#include "../../Minecraft.Client/Rendering/Models/HumanoidModel.h" -#include "../../Minecraft.Client/Rendering/Lighting.h" -#include "../../Minecraft.Client/Rendering/Models/ModelPart.h" -#include "../../Minecraft.Client/GameState/Options.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/gui/ScreenSizeCalculator.h" +#include "../../../../net/minecraft/client/renderer/entity/EntityRenderDispatcher.h" +#include "../../../../net/minecraft/client/renderer/entity/PlayerRenderer.h" +#include "../../../../net/minecraft/client/model/HumanoidModel.h" +#include "../../../../net/minecraft/client/Lighting.h" +#include "../../../../net/minecraft/client/model/geom/ModelPart.h" +#include "../../../../net/minecraft/client/Options.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../UI.h" #include "UIControl_MinecraftPlayer.h" UIControl_MinecraftPlayer::UIControl_MinecraftPlayer() { diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_MinecraftPlayer.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_MinecraftPlayer.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_MinecraftPlayer.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_MinecraftPlayer.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_PlayerList.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_PlayerList.cpp similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIControl_PlayerList.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_PlayerList.cpp index 39662bcf5..dd6be17ae 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_PlayerList.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_PlayerList.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_PlayerList.h" bool UIControl_PlayerList::setupControl(UIScene* scene, IggyValuePath* parent, diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_PlayerList.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_PlayerList.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_PlayerList.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_PlayerList.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_PlayerSkinPreview.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_PlayerSkinPreview.cpp similarity index 95% rename from Minecraft.Client/Platform/Common/UI/UIControl_PlayerSkinPreview.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_PlayerSkinPreview.cpp index 47ff9ad80..879b41538 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_PlayerSkinPreview.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_PlayerSkinPreview.cpp @@ -1,13 +1,13 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/UI/ScreenSizeCalculator.h" -#include "../../Minecraft.Client/Rendering/EntityRenderers/EntityRenderDispatcher.h" -#include "../../Minecraft.Client/Rendering/EntityRenderers/PlayerRenderer.h" -#include "../../Minecraft.Client/Rendering/Models/HumanoidModel.h" -#include "../../Minecraft.Client/Rendering/Lighting.h" -#include "../../Minecraft.Client/Rendering/Models/ModelPart.h" -#include "../../Minecraft.Client/GameState/Options.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/gui/ScreenSizeCalculator.h" +#include "../../../../net/minecraft/client/renderer/entity/EntityRenderDispatcher.h" +#include "../../../../net/minecraft/client/renderer/entity/PlayerRenderer.h" +#include "../../../../net/minecraft/client/model/HumanoidModel.h" +#include "../../../../net/minecraft/client/Lighting.h" +#include "../../../../net/minecraft/client/model/geom/ModelPart.h" +#include "../../../../net/minecraft/client/Options.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" #include "UIControl_PlayerSkinPreview.h" // #define SKIN_PREVIEW_BOB_ANIM diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_PlayerSkinPreview.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_PlayerSkinPreview.h similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIControl_PlayerSkinPreview.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_PlayerSkinPreview.h index a9072a91e..050e7836b 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_PlayerSkinPreview.h +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_PlayerSkinPreview.h @@ -3,7 +3,7 @@ #include #include "UIControl.h" -#include "../../Minecraft.Client/Textures/Textures.h" +#include "../../../../net/minecraft/client/renderer/Textures.h" class ModelPart; class EntityRenderer; diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_Progress.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Progress.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIControl_Progress.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Progress.cpp index 9a66ac7bc..9939d2a2a 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_Progress.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Progress.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_Progress.h" UIControl_Progress::UIControl_Progress() { diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_Progress.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Progress.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_Progress.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Progress.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_SaveList.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_SaveList.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIControl_SaveList.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_SaveList.cpp index 7d8f2393c..fb9b15abb 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_SaveList.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_SaveList.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_SaveList.h" bool UIControl_SaveList::setupControl(UIScene* scene, IggyValuePath* parent, diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_SaveList.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_SaveList.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_SaveList.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_SaveList.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_Slider.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Slider.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIControl_Slider.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Slider.cpp index ca8e9d5ed..93d90df68 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_Slider.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Slider.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_Slider.h" UIControl_Slider::UIControl_Slider() { diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_Slider.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Slider.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_Slider.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Slider.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_SlotList.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_SlotList.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIControl_SlotList.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_SlotList.cpp index a327ef17e..2686570c1 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_SlotList.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_SlotList.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_SlotList.h" UIControl_SlotList::UIControl_SlotList() { m_lastHighlighted = -1; } diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_SlotList.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_SlotList.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_SlotList.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_SlotList.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_SpaceIndicatorBar.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_SpaceIndicatorBar.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIControl_SpaceIndicatorBar.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_SpaceIndicatorBar.cpp index d5c269f72..b6555c351 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_SpaceIndicatorBar.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_SpaceIndicatorBar.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_SpaceIndicatorBar.h" UIControl_SpaceIndicatorBar::UIControl_SpaceIndicatorBar() { diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_SpaceIndicatorBar.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_SpaceIndicatorBar.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_SpaceIndicatorBar.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_SpaceIndicatorBar.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_TextInput.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_TextInput.cpp similarity index 93% rename from Minecraft.Client/Platform/Common/UI/UIControl_TextInput.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_TextInput.cpp index 04aa07fd2..748abfc47 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_TextInput.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_TextInput.cpp @@ -1,7 +1,7 @@ -#include "../../stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_TextInput.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" UIControl_TextInput::UIControl_TextInput() { m_bHasFocus = false; } diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_TextInput.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_TextInput.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_TextInput.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_TextInput.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_TexturePackList.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_TexturePackList.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIControl_TexturePackList.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_TexturePackList.cpp index a6ae9d3d0..5293e3d93 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_TexturePackList.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_TexturePackList.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_TexturePackList.h" UIControl_TexturePackList::UIControl_TexturePackList() {} diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_TexturePackList.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_TexturePackList.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_TexturePackList.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_TexturePackList.h diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_Touch.cpp b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Touch.cpp similarity index 90% rename from Minecraft.Client/Platform/Common/UI/UIControl_Touch.cpp rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Touch.cpp index 1e2af852a..92af973bf 100644 --- a/Minecraft.Client/Platform/Common/UI/UIControl_Touch.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Touch.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIControl_Touch.h" UIControl_Touch::UIControl_Touch() {} diff --git a/Minecraft.Client/Platform/Common/UI/UIControl_Touch.h b/Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Touch.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIControl_Touch.h rename to Minecraft.Client/Common/Source Files/UI/Controls/UIControl_Touch.h diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_DebugCreateSchematic.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugCreateSchematic.cpp similarity index 95% rename from Minecraft.Client/Platform/Common/UI/UIScene_DebugCreateSchematic.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugCreateSchematic.cpp index 6eb2c7bb4..8f25eae73 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_DebugCreateSchematic.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugCreateSchematic.cpp @@ -1,11 +1,11 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #ifdef _DEBUG_MENUS_ENABLED -#include "UI.h" +#include "../../UI.h" #include "UIScene_DebugCreateSchematic.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" +#include "../../../../../net/minecraft/client/Minecraft.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" UIScene_DebugCreateSchematic::UIScene_DebugCreateSchematic(int iPad, void* initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_DebugCreateSchematic.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugCreateSchematic.h similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIScene_DebugCreateSchematic.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugCreateSchematic.h index 5bc0a2fd4..a567bc77c 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_DebugCreateSchematic.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugCreateSchematic.h @@ -1,7 +1,7 @@ #pragma once #ifdef _DEBUG_MENUS_ENABLED -#include "UIScene.h" -#include "../GameRules/ConsoleSchematicFile.h" +#include "../../UIScene.h" +#include "../../../GameRules/LevelGeneration/ConsoleSchematicFile.h" class UIScene_DebugCreateSchematic : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_DebugOptions.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugOptions.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_DebugOptions.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugOptions.cpp index 2222d09af..d6b902812 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_DebugOptions.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugOptions.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_DebugOptions.h" const wchar_t* diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_DebugOptions.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugOptions.h similarity index 95% rename from Minecraft.Client/Platform/Common/UI/UIScene_DebugOptions.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugOptions.h index d0b39feba..69f77b7ee 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_DebugOptions.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugOptions.h @@ -1,7 +1,7 @@ #pragma once -#include "UIScene.h" -#include "UIControl_CheckBox.h" +#include "../../UIScene.h" +#include "../../Controls/UIControl_CheckBox.h" class UIScene_DebugOptionsMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_DebugOverlay.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugOverlay.cpp similarity index 90% rename from Minecraft.Client/Platform/Common/UI/UIScene_DebugOverlay.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugOverlay.cpp index c5ff4f767..5ec04c5ab 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_DebugOverlay.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugOverlay.cpp @@ -1,20 +1,20 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #ifdef _DEBUG_MENUS_ENABLED -#include "UI.h" +#include "../../UI.h" #include "UIScene_DebugOverlay.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/MinecraftServer.h" -#include "../../Minecraft.Client/Rendering/GameRenderer.h" -#include "../../Minecraft.Client/Level/MultiPlayerLevel.h" -#include "../../Minecraft.Client/Network/ClientConnection.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.storage.h" -#include "../../Minecraft.World/Headers/net.minecraft.commands.common.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.enchantment.h" +#include "../../../../../net/minecraft/client/Minecraft.h" +#include "../../../../../net/minecraft/server/MinecraftServer.h" +#include "../../../../../net/minecraft/client/renderer/GameRenderer.h" +#include "../../../../../net/minecraft/client/multiplayer/MultiPlayerLevel.h" +#include "../../../../../net/minecraft/client/multiplayer/ClientConnection.h" +#include "../../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h" +#include "../../../../../../Minecraft.World/net/minecraft/commands/common/net.minecraft.commands.common.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/enchantment/net.minecraft.world.item.enchantment.h" UIScene_DebugOverlay::UIScene_DebugOverlay(int iPad, void* initData, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_DebugOverlay.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugOverlay.h similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIScene_DebugOverlay.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugOverlay.h index 19ea8a6c3..6a4de2247 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_DebugOverlay.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugOverlay.h @@ -1,7 +1,7 @@ #pragma once #ifdef _DEBUG_MENUS_ENABLED -#include "UIScene.h" -#include "UIControl_ButtonList.h" +#include "../../UIScene.h" +#include "../../Controls/UIControl_ButtonList.h" class UIScene_DebugOverlay : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_DebugSetCamera.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugSetCamera.cpp similarity index 94% rename from Minecraft.Client/Platform/Common/UI/UIScene_DebugSetCamera.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugSetCamera.cpp index 12f1b689f..9aa4a6c5c 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_DebugSetCamera.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugSetCamera.cpp @@ -1,11 +1,11 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #ifdef _DEBUG_MENUS_ENABLED -#include "UI.h" +#include "../../UI.h" #include "UIScene_DebugSetCamera.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../net/minecraft/client/Minecraft.h" +#include "../../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" UIScene_DebugSetCamera::UIScene_DebugSetCamera(int iPad, void* initData, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_DebugSetCamera.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugSetCamera.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_DebugSetCamera.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugSetCamera.h index 7eb9e0652..02e6318b9 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_DebugSetCamera.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Debug/UIScene_DebugSetCamera.h @@ -1,6 +1,6 @@ #pragma once #ifdef _DEBUG_MENUS_ENABLED -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_DebugSetCamera : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_StartGame.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/IUIScene_StartGame.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/IUIScene_StartGame.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/IUIScene_StartGame.cpp index 391bc67ae..a37862d60 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_StartGame.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/IUIScene_StartGame.cpp @@ -1,8 +1,8 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePack.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePackRepository.h" -#include "../../Minecraft.Client/Minecraft.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" +#include "../../../../../net/minecraft/client/skins/TexturePack.h" +#include "../../../../../net/minecraft/client/skins/TexturePackRepository.h" +#include "../../../../../net/minecraft/client/Minecraft.h" #include "IUIScene_StartGame.h" IUIScene_StartGame::IUIScene_StartGame(int iPad, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/IUIScene_StartGame.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/IUIScene_StartGame.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/IUIScene_StartGame.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/IUIScene_StartGame.h index 23107b331..a68867da1 100644 --- a/Minecraft.Client/Platform/Common/UI/IUIScene_StartGame.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/IUIScene_StartGame.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" // Shared functions between CreteWorld, Load and Join class IUIScene_StartGame : public UIScene { diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_CreateWorldMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_CreateWorldMenu.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_CreateWorldMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_CreateWorldMenu.cpp index 693870700..429501ed8 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_CreateWorldMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_CreateWorldMenu.cpp @@ -1,21 +1,21 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_CreateWorldMenu.h" -#include "../../Minecraft.Client/MinecraftServer.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/GameState/Options.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePackRepository.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePack.h" -#include "../../Minecraft.World/Level/Storage/LevelSettings.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/WorldGen/Biomes/BiomeSource.h" -#include "../../Minecraft.World/Level/Storage/LevelType.h" -#include "../../Minecraft.Client/Textures/Packs/DLCTexturePack.h" +#include "../../../../../net/minecraft/server/MinecraftServer.h" +#include "../../../../../net/minecraft/client/Minecraft.h" +#include "../../../../../net/minecraft/client/Options.h" +#include "../../../../../net/minecraft/client/skins/TexturePackRepository.h" +#include "../../../../../net/minecraft/client/skins/TexturePack.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/LevelSettings.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/biome/BiomeSource.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/LevelType.h" +#include "../../../../../net/minecraft/client/skins/DLCTexturePack.h" #if defined(_WINDOWS64) #include -#include "../../Minecraft.Client/Platform/Windows64/Resource.h" +#include "../../../../../Windows64/Resource.h" #endif #define GAME_CREATE_ONLINE_TIMER_ID 0 diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_CreateWorldMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_CreateWorldMenu.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIScene_CreateWorldMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_CreateWorldMenu.h diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_DLCMainMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_DLCMainMenu.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_DLCMainMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_DLCMainMenu.cpp index a247ddd5a..31866d974 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_DLCMainMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_DLCMainMenu.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_DLCMainMenu.h" #define PLAYER_ONLINE_TIMER_ID 0 diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_DLCMainMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_DLCMainMenu.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_DLCMainMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_DLCMainMenu.h index 028e8bc77..6a0890c42 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_DLCMainMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_DLCMainMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_DLCMainMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_DLCOffersMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_DLCOffersMenu.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_DLCOffersMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_DLCOffersMenu.cpp index f9152b84e..1b5cbccf5 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_DLCOffersMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_DLCOffersMenu.cpp @@ -1,7 +1,7 @@ -#include "../../stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_DLCOffersMenu.h" -#include "../../../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #define PLAYER_ONLINE_TIMER_ID 0 #define PLAYER_ONLINE_TIMER_TIME 100 diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_DLCOffersMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_DLCOffersMenu.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_DLCOffersMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_DLCOffersMenu.h index 48047e0b1..fa820558a 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_DLCOffersMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_DLCOffersMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_DLCOffersMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_EULA.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_EULA.cpp similarity index 94% rename from Minecraft.Client/Platform/Common/UI/UIScene_EULA.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_EULA.cpp index dac3ec507..9348246d3 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_EULA.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_EULA.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_EULA.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" UIScene_EULA::UIScene_EULA(int iPad, void* initData, UILayer* parentLayer) : UIScene(iPad, parentLayer) { diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_EULA.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_EULA.h similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_EULA.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_EULA.h index 8f6650b80..db3760cd8 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_EULA.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_EULA.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_EULA : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_Intro.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_Intro.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_Intro.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_Intro.cpp index 8b60bc8ce..9bded12c6 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_Intro.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_Intro.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_Intro.h" #if !defined(_ENABLEIGGY) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_Intro.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_Intro.h similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_Intro.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_Intro.h index 457d783f9..79c40cc46 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_Intro.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_Intro.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_Intro : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_JoinMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_JoinMenu.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_JoinMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_JoinMenu.cpp index 75cee2880..aed4abac4 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_JoinMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_JoinMenu.cpp @@ -1,12 +1,12 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_JoinMenu.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePackRepository.h" -#include "../../Minecraft.Client/GameState/Options.h" -#include "../../Minecraft.Client/MinecraftServer.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.h" +#include "../../../../../net/minecraft/client/Minecraft.h" +#include "../../../../../net/minecraft/client/skins/TexturePackRepository.h" +#include "../../../../../net/minecraft/client/Options.h" +#include "../../../../../net/minecraft/server/MinecraftServer.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" #define UPDATE_PLAYERS_TIMER_ID 0 #define UPDATE_PLAYERS_TIMER_TIME 30000 diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_JoinMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_JoinMenu.h similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIScene_JoinMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_JoinMenu.h index f45aafc6f..85cc12898 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_JoinMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_JoinMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_JoinMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LaunchMoreOptionsMenu.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LaunchMoreOptionsMenu.cpp index ce1554059..b1e09a6ce 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_LaunchMoreOptionsMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LaunchMoreOptionsMenu.cpp @@ -1,6 +1,6 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #include "UIScene_LaunchMoreOptionsMenu.h" #define GAME_CREATE_ONLINE_TIMER_ID 0 diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_LaunchMoreOptionsMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LaunchMoreOptionsMenu.h similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIScene_LaunchMoreOptionsMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LaunchMoreOptionsMenu.h index a65ecc7f1..3cc441602 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_LaunchMoreOptionsMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LaunchMoreOptionsMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_LaunchMoreOptionsMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_LeaderboardsMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LeaderboardsMenu.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_LeaderboardsMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LeaderboardsMenu.cpp index 5a6cc07c0..8079441f7 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_LeaderboardsMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LeaderboardsMenu.cpp @@ -1,9 +1,9 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_LeaderboardsMenu.h" -#include "../Leaderboards/LeaderboardManager.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" +#include "../../../Leaderboards/LeaderboardManager.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" #define PLAYER_ONLINE_TIMER_ID 0 #define PLAYER_ONLINE_TIMER_TIME 100 diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_LeaderboardsMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LeaderboardsMenu.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_LeaderboardsMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LeaderboardsMenu.h index 55f98001e..8ce0b84ab 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_LeaderboardsMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LeaderboardsMenu.h @@ -1,7 +1,7 @@ #pragma once -#include "UIScene.h" -#include "../Leaderboards/LeaderboardInterface.h" +#include "../../UIScene.h" +#include "../../../Leaderboards/LeaderboardInterface.h" class UIScene_LeaderboardsMenu : public UIScene, public LeaderboardReadListener { diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_LoadMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LoadMenu.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_LoadMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LoadMenu.cpp index f9a2e53ab..4b94d3f8e 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_LoadMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LoadMenu.cpp @@ -1,13 +1,13 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_LoadMenu.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePackRepository.h" -#include "../../Minecraft.Client/GameState/Options.h" -#include "../../Minecraft.Client/MinecraftServer.h" -#include "../../Minecraft.World/Level/Storage/LevelSettings.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.Client/Textures/Packs/DLCTexturePack.h" +#include "../../../../../net/minecraft/client/Minecraft.h" +#include "../../../../../net/minecraft/client/skins/TexturePackRepository.h" +#include "../../../../../net/minecraft/client/Options.h" +#include "../../../../../net/minecraft/server/MinecraftServer.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/LevelSettings.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../net/minecraft/client/skins/DLCTexturePack.h" #define GAME_CREATE_ONLINE_TIMER_ID 0 #define GAME_CREATE_ONLINE_TIMER_TIME 100 diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_LoadMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LoadMenu.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIScene_LoadMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LoadMenu.h diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_LoadOrJoinMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LoadOrJoinMenu.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_LoadOrJoinMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LoadOrJoinMenu.cpp index 5228a5787..3dca0294e 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_LoadOrJoinMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LoadOrJoinMenu.cpp @@ -1,23 +1,23 @@ #include #include -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_LoadOrJoinMenu.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.chunk.storage.h" -#include "../../Minecraft.World/IO/Files/ConsoleSaveFile.h" -#include "../../Minecraft.World/IO/Files/ConsoleSaveFileOriginal.h" -#include "../../Minecraft.World/IO/Files/ConsoleSaveFileSplit.h" -#include "../../Minecraft.World/Util/PortableFileIO.h" -#include "../../Minecraft.Client/Rendering/EntityRenderers/ProgressRenderer.h" -#include "../../Minecraft.Client/MinecraftServer.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePackRepository.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePack.h" -#include "../Network/SessionInfo.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/chunk/storage/net.minecraft.world.level.chunk.storage.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFile.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileOriginal.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileSplit.h" +#include "../../../../../../Minecraft.World/Header Files/PortableFileIO.h" +#include "../../../../../net/minecraft/client/ProgressRenderer.h" +#include "../../../../../net/minecraft/server/MinecraftServer.h" +#include "../../../../../net/minecraft/client/skins/TexturePackRepository.h" +#include "../../../../../net/minecraft/client/skins/TexturePack.h" +#include "../../../Network/SessionInfo.h" #if defined(SONY_REMOTE_STORAGE_DOWNLOAD) unsigned long UIScene_LoadOrJoinMenu::m_ulFileSize = 0L; diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_LoadOrJoinMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LoadOrJoinMenu.h similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIScene_LoadOrJoinMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LoadOrJoinMenu.h index acbfde22d..3dd391902 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_LoadOrJoinMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_LoadOrJoinMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class LevelGenerationOptions; diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_MainMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_MainMenu.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIScene_MainMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_MainMenu.cpp index 16f493c47..a0803d057 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_MainMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_MainMenu.cpp @@ -1,10 +1,10 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "../../Minecraft.World/Util/Mth.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Util/Random.h" -#include "../../Minecraft.Client/Player/User.h" -#include "../../Minecraft.Client/MinecraftServer.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" +#include "../../../../../net/minecraft/client/User.h" +#include "../../../../../net/minecraft/server/MinecraftServer.h" +#include "../../UI.h" #include "UIScene_MainMenu.h" Random* UIScene_MainMenu::random = new Random(); diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_MainMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_MainMenu.h similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIScene_MainMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_MainMenu.h index fc0030506..bea3971e2 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_MainMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_MainMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_MainMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_NewUpdateMessage.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_NewUpdateMessage.cpp similarity index 95% rename from Minecraft.Client/Platform/Common/UI/UIScene_NewUpdateMessage.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_NewUpdateMessage.cpp index 2db3ae1f9..e95fe5a3f 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_NewUpdateMessage.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_NewUpdateMessage.cpp @@ -1,7 +1,7 @@ -#include "../../stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_NewUpdateMessage.h" -#include "../../../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" UIScene_NewUpdateMessage::UIScene_NewUpdateMessage(int iPad, void* initData, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_NewUpdateMessage.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_NewUpdateMessage.h similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_NewUpdateMessage.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_NewUpdateMessage.h index a0fdb8b4c..bf9c13f19 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_NewUpdateMessage.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_NewUpdateMessage.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_NewUpdateMessage : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_SaveMessage.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_SaveMessage.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_SaveMessage.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_SaveMessage.cpp index dfc01b3c6..97897b478 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_SaveMessage.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_SaveMessage.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_SaveMessage.h" #define PROFILE_LOADED_TIMER_ID 0 diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_SaveMessage.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_SaveMessage.h similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_SaveMessage.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_SaveMessage.h index 2512a08ec..8bf09f2d9 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_SaveMessage.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_SaveMessage.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_SaveMessage : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_TrialExitUpsell.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_TrialExitUpsell.cpp similarity index 95% rename from Minecraft.Client/Platform/Common/UI/UIScene_TrialExitUpsell.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_TrialExitUpsell.cpp index 90a4b3297..da01cfe8d 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_TrialExitUpsell.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_TrialExitUpsell.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_TrialExitUpsell.h" UIScene_TrialExitUpsell::UIScene_TrialExitUpsell(int iPad, void* initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_TrialExitUpsell.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_TrialExitUpsell.h similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIScene_TrialExitUpsell.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_TrialExitUpsell.h index 8f50f7843..45adf15dd 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_TrialExitUpsell.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Frontend Menu screens/UIScene_TrialExitUpsell.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_TrialExitUpsell : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_ControlsMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_ControlsMenu.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_ControlsMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_ControlsMenu.cpp index dfb3e01d4..3e36d53e1 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_ControlsMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_ControlsMenu.cpp @@ -1,8 +1,8 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_ControlsMenu.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" +#include "../../../../../net/minecraft/client/Minecraft.h" +#include "../../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" UIScene_ControlsMenu::UIScene_ControlsMenu(int iPad, void* initData, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_ControlsMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_ControlsMenu.h similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIScene_ControlsMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_ControlsMenu.h index 2ef0d3b60..b89383bd9 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_ControlsMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_ControlsMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_ControlsMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_Credits.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_Credits.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIScene_Credits.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_Credits.cpp index 9b87a1588..e37bbe41a 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_Credits.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_Credits.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_Credits.h" #define CREDIT_ICON -2 diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_Credits.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_Credits.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_Credits.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_Credits.h index 8eaf95be9..decb00435 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_Credits.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_Credits.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" #define PS3_CREDITS_COUNT 80 #define PSVITA_CREDITS_COUNT 82 diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_HelpAndOptionsMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_HelpAndOptionsMenu.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_HelpAndOptionsMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_HelpAndOptionsMenu.cpp index 92ed5f199..c6fd1ff45 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_HelpAndOptionsMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_HelpAndOptionsMenu.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_HelpAndOptionsMenu.h" -#include "../../Minecraft.Client/Minecraft.h" +#include "../../../../../net/minecraft/client/Minecraft.h" UIScene_HelpAndOptionsMenu::UIScene_HelpAndOptionsMenu(int iPad, void* initData, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_HelpAndOptionsMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_HelpAndOptionsMenu.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_HelpAndOptionsMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_HelpAndOptionsMenu.h index 914e6603b..394293a1e 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_HelpAndOptionsMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_HelpAndOptionsMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" #define BUTTON_HAO_CHANGESKIN 0 #define BUTTON_HAO_HOWTOPLAY 1 diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_HowToPlay.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_HowToPlay.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_HowToPlay.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_HowToPlay.cpp index d28faf138..dc46c20af 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_HowToPlay.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_HowToPlay.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_HowToPlay.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" static UIScene_HowToPlay::SHowToPlayPageDef gs_aPageDefs[eHowToPlay_NumPages] = { diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_HowToPlay.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_HowToPlay.h similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIScene_HowToPlay.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_HowToPlay.h index c65c4a450..5fa44c9c9 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_HowToPlay.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_HowToPlay.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_HowToPlay : public UIScene { public: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_HowToPlayMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_HowToPlayMenu.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_HowToPlayMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_HowToPlayMenu.cpp index 59afe3a72..5cf993dff 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_HowToPlayMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_HowToPlayMenu.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_HowToPlayMenu.h" // strings for buttons in the list diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_HowToPlayMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_HowToPlayMenu.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_HowToPlayMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_HowToPlayMenu.h index 21f4a44d6..79d63f959 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_HowToPlayMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_HowToPlayMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_HowToPlayMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_LanguageSelector.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_LanguageSelector.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_LanguageSelector.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_LanguageSelector.cpp index 0b2663c57..063662671 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_LanguageSelector.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_LanguageSelector.cpp @@ -1,5 +1,5 @@ -#include "../../stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_LanguageSelector.h" // strings for buttons in the list diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_LanguageSelector.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_LanguageSelector.h similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIScene_LanguageSelector.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_LanguageSelector.h index 09935308f..bba6e21a7 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_LanguageSelector.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_LanguageSelector.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" #define HAS_LANGUAGE_SYSTEM(exp) exp, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_ReinstallMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_ReinstallMenu.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_ReinstallMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_ReinstallMenu.cpp index 3ce99d9f2..133ebfa54 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_ReinstallMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_ReinstallMenu.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_ReinstallMenu.h" UIScene_ReinstallMenu::UIScene_ReinstallMenu(int iPad, void* initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_ReinstallMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_ReinstallMenu.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_ReinstallMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_ReinstallMenu.h index 083986184..0aba528b7 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_ReinstallMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_ReinstallMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_ReinstallMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsAudioMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsAudioMenu.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_SettingsAudioMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsAudioMenu.cpp index aff54a89c..7b1c78d76 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsAudioMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsAudioMenu.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_SettingsAudioMenu.h" UIScene_SettingsAudioMenu::UIScene_SettingsAudioMenu(int iPad, void* initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsAudioMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsAudioMenu.h similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_SettingsAudioMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsAudioMenu.h index f0230302d..0e9e01ad3 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsAudioMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsAudioMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_SettingsAudioMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsControlMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsControlMenu.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_SettingsControlMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsControlMenu.cpp index e2147cec4..82951966f 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsControlMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsControlMenu.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_SettingsControlMenu.h" UIScene_SettingsControlMenu::UIScene_SettingsControlMenu(int iPad, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsControlMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsControlMenu.h similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_SettingsControlMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsControlMenu.h index fd5ba20be..b07793d40 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsControlMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsControlMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_SettingsControlMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsGraphicsMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsGraphicsMenu.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_SettingsGraphicsMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsGraphicsMenu.cpp index c080340b4..42759d1e6 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsGraphicsMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsGraphicsMenu.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_SettingsGraphicsMenu.h" UIScene_SettingsGraphicsMenu::UIScene_SettingsGraphicsMenu(int iPad, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsGraphicsMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsGraphicsMenu.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_SettingsGraphicsMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsGraphicsMenu.h index 68bc18d6c..858e0242e 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsGraphicsMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsGraphicsMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_SettingsGraphicsMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsMenu.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_SettingsMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsMenu.cpp index 9f0312aa8..1a94f487b 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsMenu.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_SettingsMenu.h" -#include "../../Minecraft.Client/Minecraft.h" +#include "../../../../../net/minecraft/client/Minecraft.h" UIScene_SettingsMenu::UIScene_SettingsMenu(int iPad, void* initData, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsMenu.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_SettingsMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsMenu.h index 68233e66a..050b5bf41 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" #define BUTTON_ALL_OPTIONS 0 #define BUTTON_ALL_AUDIO 1 diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsOptionsMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsOptionsMenu.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIScene_SettingsOptionsMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsOptionsMenu.cpp index a9cb67994..44970b064 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsOptionsMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsOptionsMenu.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_SettingsOptionsMenu.h" int UIScene_SettingsOptionsMenu::m_iDifficultySettingA[4] = { diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsOptionsMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsOptionsMenu.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_SettingsOptionsMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsOptionsMenu.h index 67c30660d..0a9eed586 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsOptionsMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsOptionsMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_SettingsOptionsMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsUIMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsUIMenu.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_SettingsUIMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsUIMenu.cpp index 0dca8b89c..31d604d18 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsUIMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsUIMenu.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_SettingsUIMenu.h" UIScene_SettingsUIMenu::UIScene_SettingsUIMenu(int iPad, void* initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsUIMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsUIMenu.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_SettingsUIMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsUIMenu.h index 672656a4b..5f883615d 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_SettingsUIMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SettingsUIMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_SettingsUIMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_SkinSelectMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SkinSelectMenu.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIScene_SkinSelectMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SkinSelectMenu.cpp index d9ac7d17e..aee986cd3 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_SkinSelectMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SkinSelectMenu.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_SkinSelectMenu.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #define SKIN_SELECT_PACK_DEFAULT 0 #define SKIN_SELECT_PACK_FAVORITES 1 diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_SkinSelectMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SkinSelectMenu.h similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_SkinSelectMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SkinSelectMenu.h index fe73e686b..1fc442359 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_SkinSelectMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/Help & Options/UIScene_SkinSelectMenu.h @@ -1,9 +1,9 @@ #pragma once #include -#include "../../Minecraft.World/Util/Definitions.h" -#include "UIScene.h" -#include "UIControl_PlayerSkinPreview.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/Definitions.h" +#include "../../UIScene.h" +#include "../../Controls/UIControl_PlayerSkinPreview.h" class UIScene_SkinSelectMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_AbstractContainerMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_AbstractContainerMenu.cpp similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIScene_AbstractContainerMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_AbstractContainerMenu.cpp index 8bd607c8e..bb34122e2 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_AbstractContainerMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_AbstractContainerMenu.cpp @@ -1,10 +1,10 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../UI.h" #include "UIScene_AbstractContainerMenu.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" UIScene_AbstractContainerMenu::UIScene_AbstractContainerMenu( int iPad, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_AbstractContainerMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_AbstractContainerMenu.h similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIScene_AbstractContainerMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_AbstractContainerMenu.h index 6af568230..54fe6ecb3 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_AbstractContainerMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_AbstractContainerMenu.h @@ -1,7 +1,7 @@ #pragma once -#include "UIScene.h" -#include "IUIScene_AbstractContainerMenu.h" +#include "../../../UIScene.h" +#include "../../../All Platforms/IUIScene_AbstractContainerMenu.h" class AbstractContainerMenu; diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_AnvilMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_AnvilMenu.cpp similarity index 95% rename from Minecraft.Client/Platform/Common/UI/UIScene_AnvilMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_AnvilMenu.cpp index 429630a1a..dcc3118ab 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_AnvilMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_AnvilMenu.cpp @@ -1,10 +1,10 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../UI.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../../net/minecraft/client/Minecraft.h" +#include "../../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #include "UIScene_AnvilMenu.h" UIScene_AnvilMenu::UIScene_AnvilMenu(int iPad, void* _initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_AnvilMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_AnvilMenu.h similarity index 93% rename from Minecraft.Client/Platform/Common/UI/UIScene_AnvilMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_AnvilMenu.h index b0a49a710..f95398320 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_AnvilMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_AnvilMenu.h @@ -1,8 +1,8 @@ #pragma once #include "UIScene_AbstractContainerMenu.h" -#include "IUIScene_AnvilMenu.h" -#include "../../Minecraft.World/Containers/MerchantMenu.h" +#include "../../../All Platforms/IUIScene_AnvilMenu.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/inventory/MerchantMenu.h" class InventoryMenu; diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_BeaconMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_BeaconMenu.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_BeaconMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_BeaconMenu.cpp index 6ffe67f7c..ac2f43f49 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_BeaconMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_BeaconMenu.cpp @@ -1,8 +1,8 @@ -#include "../../stdafx.h" -#include "UI.h" -#include "../../../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../../../Minecraft.Client/Minecraft.h" +#include "../../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../UI.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../../net/minecraft/client/Minecraft.h" #include "UIScene_BeaconMenu.h" UIScene_BeaconMenu::UIScene_BeaconMenu(int iPad, void* _initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_BeaconMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_BeaconMenu.h similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIScene_BeaconMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_BeaconMenu.h index 6eed4eb70..bf7ce62f6 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_BeaconMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_BeaconMenu.h @@ -1,8 +1,8 @@ #pragma once #include "UIScene_AbstractContainerMenu.h" -#include "UIControl_SlotList.h" -#include "IUIScene_BeaconMenu.h" +#include "../../../Controls/UIControl_SlotList.h" +#include "../../../All Platforms/IUIScene_BeaconMenu.h" class UIScene_BeaconMenu : public UIScene_AbstractContainerMenu, public IUIScene_BeaconMenu { diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_BrewingStandMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_BrewingStandMenu.cpp similarity index 94% rename from Minecraft.Client/Platform/Common/UI/UIScene_BrewingStandMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_BrewingStandMenu.cpp index 58c7f32c9..ff422d42c 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_BrewingStandMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_BrewingStandMenu.cpp @@ -1,9 +1,9 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.alchemy.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Minecraft.Client/Minecraft.h" +#include "../../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../UI.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/item/alchemy/net.minecraft.world.item.alchemy.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../net/minecraft/client/Minecraft.h" #include "UIScene_BrewingStandMenu.h" UIScene_BrewingStandMenu::UIScene_BrewingStandMenu(int iPad, void* _initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_BrewingStandMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_BrewingStandMenu.h similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_BrewingStandMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_BrewingStandMenu.h index 0363645c5..ec81f464b 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_BrewingStandMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_BrewingStandMenu.h @@ -1,7 +1,7 @@ #pragma once #include "UIScene_AbstractContainerMenu.h" -#include "IUIScene_BrewingMenu.h" +#include "../../../All Platforms/IUIScene_BrewingMenu.h" class InventoryMenu; diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_ContainerMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_ContainerMenu.cpp similarity index 90% rename from Minecraft.Client/Platform/Common/UI/UIScene_ContainerMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_ContainerMenu.cpp index 24d866e0e..431a788d0 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_ContainerMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_ContainerMenu.cpp @@ -1,15 +1,15 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../UI.h" #include "UIScene_ContainerMenu.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.stats.h" -#include "../../Minecraft.Client/Player/LocalPlayer.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../Tutorial/Tutorial.h" -#include "../Tutorial/TutorialMode.h" -#include "../Tutorial/TutorialEnum.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../../../Minecraft.World/net/minecraft/stats/net.minecraft.stats.h" +#include "../../../../../../net/minecraft/client/player/LocalPlayer.h" +#include "../../../../../../net/minecraft/client/Minecraft.h" +#include "../../../../Tutorial/Tutorial.h" +#include "../../../../Tutorial/TutorialMode.h" +#include "../../../../Tutorial/TutorialEnum.h" UIScene_ContainerMenu::UIScene_ContainerMenu(int iPad, void* _initData, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_ContainerMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_ContainerMenu.h similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIScene_ContainerMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_ContainerMenu.h index 6e4ab49a4..08895cdfd 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_ContainerMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_ContainerMenu.h @@ -1,7 +1,7 @@ #pragma once #include "UIScene_AbstractContainerMenu.h" -#include "IUIScene_ContainerMenu.h" +#include "../../../All Platforms/IUIScene_ContainerMenu.h" class InventoryMenu; diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_CreativeMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_CreativeMenu.cpp similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIScene_CreativeMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_CreativeMenu.cpp index 6ea862e8e..ead78db11 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_CreativeMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_CreativeMenu.cpp @@ -1,13 +1,13 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../UI.h" #include "UIScene_CreativeMenu.h" -#include "../../Minecraft.World/Util/JavaMath.h" -#include "../../Minecraft.Client/Player/LocalPlayer.h" -#include "../Tutorial/Tutorial.h" -#include "../Tutorial/TutorialMode.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" +#include "../../../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../../../../../../net/minecraft/client/player/LocalPlayer.h" +#include "../../../../Tutorial/Tutorial.h" +#include "../../../../Tutorial/TutorialMode.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" UIScene_CreativeMenu::UIScene_CreativeMenu(int iPad, void* _initData, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_CreativeMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_CreativeMenu.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_CreativeMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_CreativeMenu.h index 6dc6174a4..4baaabc76 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_CreativeMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_CreativeMenu.h @@ -1,7 +1,7 @@ #pragma once #include "UIScene_AbstractContainerMenu.h" -#include "IUIScene_CreativeMenu.h" +#include "../../../All Platforms/IUIScene_CreativeMenu.h" class UIScene_CreativeMenu : public UIScene_AbstractContainerMenu, public IUIScene_CreativeMenu { diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_DispenserMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_DispenserMenu.cpp similarity index 93% rename from Minecraft.Client/Platform/Common/UI/UIScene_DispenserMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_DispenserMenu.cpp index 00bec865d..fcd59af3e 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_DispenserMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_DispenserMenu.cpp @@ -1,8 +1,8 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.Client/Minecraft.h" +#include "../../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../UI.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../../net/minecraft/client/Minecraft.h" #include "UIScene_DispenserMenu.h" UIScene_DispenserMenu::UIScene_DispenserMenu(int iPad, void* _initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_DispenserMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_DispenserMenu.h similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIScene_DispenserMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_DispenserMenu.h index c7c82c8e7..a64ac3f78 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_DispenserMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_DispenserMenu.h @@ -1,7 +1,7 @@ #pragma once #include "UIScene_AbstractContainerMenu.h" -#include "IUIScene_DispenserMenu.h" +#include "../../../All Platforms/IUIScene_DispenserMenu.h" class InventoryMenu; diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_EnchantingMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_EnchantingMenu.cpp similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIScene_EnchantingMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_EnchantingMenu.cpp index 2d6120943..49f011971 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_EnchantingMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_EnchantingMenu.cpp @@ -1,8 +1,8 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.Client/Minecraft.h" +#include "../../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../UI.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../../net/minecraft/client/Minecraft.h" #include "UIScene_EnchantingMenu.h" UIScene_EnchantingMenu::UIScene_EnchantingMenu(int iPad, void* _initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_EnchantingMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_EnchantingMenu.h similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIScene_EnchantingMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_EnchantingMenu.h index 38d64923b..656104bd9 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_EnchantingMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_EnchantingMenu.h @@ -1,7 +1,7 @@ #pragma once #include "UIScene_AbstractContainerMenu.h" -#include "IUIScene_EnchantingMenu.h" +#include "../../../All Platforms/IUIScene_EnchantingMenu.h" class InventoryMenu; diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_FireworksMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_FireworksMenu.cpp similarity index 93% rename from Minecraft.Client/Platform/Common/UI/UIScene_FireworksMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_FireworksMenu.cpp index 14ed8d205..052141519 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_FireworksMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_FireworksMenu.cpp @@ -1,9 +1,9 @@ -#include "../../stdafx.h" -#include "UI.h" -#include "../../../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../../Minecraft.h" -#include "../../../Player/LocalPlayer.h" +#include "../../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../UI.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../../net/minecraft/client/Minecraft.h" +#include "../../../../../../net/minecraft/client/player/LocalPlayer.h" #include "UIScene_FireworksMenu.h" UIScene_FireworksMenu::UIScene_FireworksMenu(int iPad, void* _initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_FireworksMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_FireworksMenu.h similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIScene_FireworksMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_FireworksMenu.h index 12cadef24..8342a6590 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_FireworksMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_FireworksMenu.h @@ -1,7 +1,7 @@ #pragma once #include "UIScene_AbstractContainerMenu.h" -#include "IUIScene_FireworksMenu.h" +#include "../../../All Platforms/IUIScene_FireworksMenu.h" class InventoryMenu; diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_FurnaceMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_FurnaceMenu.cpp similarity index 95% rename from Minecraft.Client/Platform/Common/UI/UIScene_FurnaceMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_FurnaceMenu.cpp index f75c21615..7caef4c35 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_FurnaceMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_FurnaceMenu.cpp @@ -1,8 +1,8 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.Client/Minecraft.h" +#include "../../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../UI.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../../net/minecraft/client/Minecraft.h" #include "UIScene_FurnaceMenu.h" UIScene_FurnaceMenu::UIScene_FurnaceMenu(int iPad, void* _initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_FurnaceMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_FurnaceMenu.h similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_FurnaceMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_FurnaceMenu.h index 6000b1e57..8c371a24c 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_FurnaceMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_FurnaceMenu.h @@ -1,7 +1,7 @@ #pragma once #include "UIScene_AbstractContainerMenu.h" -#include "IUIScene_FurnaceMenu.h" +#include "../../../All Platforms/IUIScene_FurnaceMenu.h" class InventoryMenu; diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_HopperMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_HopperMenu.cpp similarity index 93% rename from Minecraft.Client/Platform/Common/UI/UIScene_HopperMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_HopperMenu.cpp index 7dc4d3132..3a096a6cd 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_HopperMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_HopperMenu.cpp @@ -1,8 +1,8 @@ -#include "../../stdafx.h" -#include "UI.h" -#include "../../../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../../../Minecraft.Client/Minecraft.h" +#include "../../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../UI.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../../net/minecraft/client/Minecraft.h" #include "UIScene_HopperMenu.h" UIScene_HopperMenu::UIScene_HopperMenu(int iPad, void* _initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_HopperMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_HopperMenu.h similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIScene_HopperMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_HopperMenu.h index 39b57109c..e26d76071 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_HopperMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_HopperMenu.h @@ -1,7 +1,7 @@ #pragma once #include "UIScene_AbstractContainerMenu.h" -#include "IUIScene_HopperMenu.h" +#include "../../../All Platforms/IUIScene_HopperMenu.h" class InventoryMenu; diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_HorseInventoryMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_HorseInventoryMenu.cpp similarity index 95% rename from Minecraft.Client/Platform/Common/UI/UIScene_HorseInventoryMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_HorseInventoryMenu.cpp index 74b6af17e..1cfabb286 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_HorseInventoryMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_HorseInventoryMenu.cpp @@ -1,9 +1,9 @@ -#include "../../stdafx.h" -#include "UI.h" -#include "../../../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" -#include "../../../Player/MultiPlayerLocalPlayer.h" -#include "../../../../Minecraft.Client/Minecraft.h" +#include "../../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../UI.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" +#include "../../../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../../net/minecraft/client/Minecraft.h" #include "UIScene_HorseInventoryMenu.h" UIScene_HorseInventoryMenu::UIScene_HorseInventoryMenu(int iPad, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_HorseInventoryMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_HorseInventoryMenu.h similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIScene_HorseInventoryMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_HorseInventoryMenu.h index ef22502db..c0d87d22c 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_HorseInventoryMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_HorseInventoryMenu.h @@ -1,7 +1,7 @@ #pragma once #include "UIScene_AbstractContainerMenu.h" -#include "IUIScene_HorseInventoryMenu.h" +#include "../../../All Platforms/IUIScene_HorseInventoryMenu.h" class InventoryMenu; diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_InventoryMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_InventoryMenu.cpp similarity index 91% rename from Minecraft.Client/Platform/Common/UI/UIScene_InventoryMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_InventoryMenu.cpp index adb0f25ff..da2845e4e 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_InventoryMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_InventoryMenu.cpp @@ -1,19 +1,19 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../UI.h" #include "UIScene_InventoryMenu.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.stats.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.effect.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/GameState/Options.h" -#include "../../Minecraft.Client/Rendering/EntityRenderers/EntityRenderDispatcher.h" -#include "../../Minecraft.Client/Rendering/Lighting.h" -#include "../Tutorial/Tutorial.h" -#include "../Tutorial/TutorialMode.h" -#include "../Tutorial/TutorialEnum.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../../../Minecraft.World/net/minecraft/stats/net.minecraft.stats.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/effect/net.minecraft.world.effect.h" +#include "../../../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../../net/minecraft/client/Minecraft.h" +#include "../../../../../../net/minecraft/client/Options.h" +#include "../../../../../../net/minecraft/client/renderer/entity/EntityRenderDispatcher.h" +#include "../../../../../../net/minecraft/client/Lighting.h" +#include "../../../../Tutorial/Tutorial.h" +#include "../../../../Tutorial/TutorialMode.h" +#include "../../../../Tutorial/TutorialEnum.h" #define INVENTORY_UPDATE_EFFECTS_TIMER_ID (10) #define INVENTORY_UPDATE_EFFECTS_TIMER_TIME (1000) // 1 second diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_InventoryMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_InventoryMenu.h similarity index 92% rename from Minecraft.Client/Platform/Common/UI/UIScene_InventoryMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_InventoryMenu.h index 1f5267310..bc22daafc 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_InventoryMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_InventoryMenu.h @@ -1,9 +1,9 @@ #pragma once #include "UIScene_AbstractContainerMenu.h" -#include "IUIScene_InventoryMenu.h" +#include "../../../All Platforms/IUIScene_InventoryMenu.h" -#include "../../Minecraft.World/Entities/MobEffect.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/effect/MobEffect.h" class InventoryMenu; diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_TradingMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_TradingMenu.cpp similarity index 93% rename from Minecraft.Client/Platform/Common/UI/UIScene_TradingMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_TradingMenu.cpp index 163a31686..7b67926c1 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_TradingMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_TradingMenu.cpp @@ -1,11 +1,11 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" -#include "../../Minecraft.World/Util/HtmlString.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.trading.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.Client/Minecraft.h" +#include "../../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../UI.h" +#include "../../../../../../../Minecraft.World/net/minecraft/util/HtmlString.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/item/trading/net.minecraft.world.item.trading.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../../net/minecraft/client/Minecraft.h" #include "UIScene_TradingMenu.h" UIScene_TradingMenu::UIScene_TradingMenu(int iPad, void* _initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_TradingMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_TradingMenu.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_TradingMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_TradingMenu.h index 472827520..c6f37a777 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_TradingMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/Containers/UIScene_TradingMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "IUIScene_TradingMenu.h" +#include "../../../All Platforms/IUIScene_TradingMenu.h" class InventoryMenu; diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_CraftingMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_CraftingMenu.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_CraftingMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_CraftingMenu.cpp index 45e31d4f3..6c6813809 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_CraftingMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_CraftingMenu.cpp @@ -1,8 +1,8 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" +#include "../../../../../net/minecraft/client/Minecraft.h" +#include "../../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" #include "UIScene_CraftingMenu.h" UIScene_CraftingMenu::UIScene_CraftingMenu(int iPad, void* _initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_CraftingMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_CraftingMenu.h similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_CraftingMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_CraftingMenu.h index aa2fd54fe..5f47bdfbd 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_CraftingMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_CraftingMenu.h @@ -1,9 +1,9 @@ #pragma once -#include "UIScene.h" -#include "UIControl_SlotList.h" -#include "UIControl_Label.h" -#include "IUIScene_CraftingMenu.h" +#include "../../UIScene.h" +#include "../../Controls/UIControl_SlotList.h" +#include "../../Controls/UIControl_Label.h" +#include "../../All Platforms/IUIScene_CraftingMenu.h" #define CRAFTING_INVENTORY_SLOT_START 0 #define CRAFTING_INVENTORY_SLOT_END (CRAFTING_INVENTORY_SLOT_START + 27) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_DeathMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_DeathMenu.cpp similarity index 95% rename from Minecraft.Client/Platform/Common/UI/UIScene_DeathMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_DeathMenu.cpp index d459788e6..00e842b2f 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_DeathMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_DeathMenu.cpp @@ -1,9 +1,9 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_DeathMenu.h" -#include "IUIScene_PauseMenu.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" +#include "../../All Platforms/IUIScene_PauseMenu.h" +#include "../../../../../net/minecraft/client/Minecraft.h" +#include "../../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" UIScene_DeathMenu::UIScene_DeathMenu(int iPad, void* initData, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_DeathMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_DeathMenu.h similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_DeathMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_DeathMenu.h index 8abba0428..5f50ce989 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_DeathMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_DeathMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_DeathMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_EndPoem.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_EndPoem.cpp similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIScene_EndPoem.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_EndPoem.cpp index 921441038..9e6ff946e 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_EndPoem.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_EndPoem.cpp @@ -1,10 +1,10 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_EndPoem.h" -#include "UIBitmapFont.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../UIBitmapFont.h" +#include "../../../../../net/minecraft/client/Minecraft.h" +#include "../../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" UIScene_EndPoem::UIScene_EndPoem(int iPad, void* initData, UILayer* parentLayer) : UIScene(iPad, parentLayer) { diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_EndPoem.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_EndPoem.h similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_EndPoem.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_EndPoem.h index d07072225..249342420 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_EndPoem.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_EndPoem.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_EndPoem : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_InGameHostOptionsMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGameHostOptionsMenu.cpp similarity index 94% rename from Minecraft.Client/Platform/Common/UI/UIScene_InGameHostOptionsMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGameHostOptionsMenu.cpp index 9eaab478e..5cf82770a 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_InGameHostOptionsMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGameHostOptionsMenu.cpp @@ -1,11 +1,11 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_InGameHostOptionsMenu.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.Client/Network/ClientConnection.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.packet.h" +#include "../../../../../net/minecraft/client/Minecraft.h" +#include "../../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../net/minecraft/client/multiplayer/ClientConnection.h" +#include "../../../../../../Minecraft.World/net/minecraft/network/net.minecraft.network.h" +#include "../../../../../../Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h" UIScene_InGameHostOptionsMenu::UIScene_InGameHostOptionsMenu( int iPad, void* initData, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_InGameHostOptionsMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGameHostOptionsMenu.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_InGameHostOptionsMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGameHostOptionsMenu.h index 9ba522936..9556c43f2 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_InGameHostOptionsMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGameHostOptionsMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_InGameHostOptionsMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_InGameInfoMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGameInfoMenu.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_InGameInfoMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGameInfoMenu.cpp index 68989df18..7af0cba82 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_InGameInfoMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGameInfoMenu.cpp @@ -1,10 +1,10 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_InGameInfoMenu.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.packet.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.Client/Network/ClientConnection.h" +#include "../../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../../Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h" +#include "../../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../net/minecraft/client/multiplayer/ClientConnection.h" UIScene_InGameInfoMenu::UIScene_InGameInfoMenu(int iPad, void* initData, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_InGameInfoMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGameInfoMenu.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_InGameInfoMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGameInfoMenu.h index e4141d4b0..ab25fbafd 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_InGameInfoMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGameInfoMenu.h @@ -2,7 +2,7 @@ #include -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_InGameInfoMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGamePlayerOptionsMenu.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGamePlayerOptionsMenu.cpp index 389cb711d..3566fa052 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_InGamePlayerOptionsMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGamePlayerOptionsMenu.cpp @@ -1,10 +1,10 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_InGamePlayerOptionsMenu.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.Client/Network/ClientConnection.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.packet.h" +#include "../../../../../net/minecraft/client/Minecraft.h" +#include "../../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../net/minecraft/client/multiplayer/ClientConnection.h" +#include "../../../../../../Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h" #define CHECKBOXES_TIMER_ID 0 #define CHECKBOXES_TIMER_TIME 100 diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_InGamePlayerOptionsMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGamePlayerOptionsMenu.h similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIScene_InGamePlayerOptionsMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGamePlayerOptionsMenu.h index 07a10c730..2c1a0a49e 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_InGamePlayerOptionsMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGamePlayerOptionsMenu.h @@ -2,7 +2,7 @@ #include -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_InGamePlayerOptionsMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_InGameSaveManagementMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGameSaveManagementMenu.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIScene_InGameSaveManagementMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGameSaveManagementMenu.cpp index ed88edf2a..e81465f04 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_InGameSaveManagementMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGameSaveManagementMenu.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_InGameSaveManagementMenu.h" namespace { diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_InGameSaveManagementMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGameSaveManagementMenu.h similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIScene_InGameSaveManagementMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGameSaveManagementMenu.h index 704b4ae86..f41d824ae 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_InGameSaveManagementMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_InGameSaveManagementMenu.h @@ -2,7 +2,7 @@ #include -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_InGameSaveManagementMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_PauseMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_PauseMenu.cpp similarity index 97% rename from Minecraft.Client/Platform/Common/UI/UIScene_PauseMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_PauseMenu.cpp index 72079ed0a..97cbc916a 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_PauseMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_PauseMenu.cpp @@ -1,12 +1,12 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_PauseMenu.h" -#include "../../Minecraft.Client/MinecraftServer.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePackRepository.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePack.h" -#include "../../Minecraft.Client/Textures/Packs/DLCTexturePack.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../net/minecraft/server/MinecraftServer.h" +#include "../../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../net/minecraft/client/skins/TexturePackRepository.h" +#include "../../../../../net/minecraft/client/skins/TexturePack.h" +#include "../../../../../net/minecraft/client/skins/DLCTexturePack.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" UIScene_PauseMenu::UIScene_PauseMenu(int iPad, void* initData, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_PauseMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_PauseMenu.h similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIScene_PauseMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_PauseMenu.h index 56677c284..8a8b627ff 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_PauseMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_PauseMenu.h @@ -1,7 +1,7 @@ #pragma once -#include "UIScene.h" -#include "IUIScene_PauseMenu.h" +#include "../../UIScene.h" +#include "../../All Platforms/IUIScene_PauseMenu.h" #define BUTTON_PAUSE_RESUMEGAME 0 #define BUTTON_PAUSE_HELPANDOPTIONS 1 diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_SignEntryMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_SignEntryMenu.cpp similarity index 89% rename from Minecraft.Client/Platform/Common/UI/UIScene_SignEntryMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_SignEntryMenu.cpp index 17c04b3aa..617300ebb 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_SignEntryMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_SignEntryMenu.cpp @@ -1,13 +1,13 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #include "UIScene_SignEntryMenu.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.Client/Level/MultiPlayerLevel.h" -#include "../../Minecraft.Client/Network/ClientConnection.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" +#include "../../../../../net/minecraft/client/Minecraft.h" +#include "../../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../net/minecraft/client/multiplayer/MultiPlayerLevel.h" +#include "../../../../../net/minecraft/client/multiplayer/ClientConnection.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" UIScene_SignEntryMenu::UIScene_SignEntryMenu(int iPad, void* _initData, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_SignEntryMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_SignEntryMenu.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_SignEntryMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_SignEntryMenu.h index cc5372947..3635e762b 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_SignEntryMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_SignEntryMenu.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../../UIScene.h" class SignTileEntity; diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_TeleportMenu.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_TeleportMenu.cpp similarity index 95% rename from Minecraft.Client/Platform/Common/UI/UIScene_TeleportMenu.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_TeleportMenu.cpp index 7145df5e2..d18c854e7 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_TeleportMenu.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_TeleportMenu.cpp @@ -1,11 +1,11 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../UI.h" #include "UIScene_TeleportMenu.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.packet.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.Client/Network/ClientConnection.h" -#include "../../Minecraft.Client/Commands/TeleportCommand.h" +#include "../../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../../Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h" +#include "../../../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../net/minecraft/client/multiplayer/ClientConnection.h" +#include "../../../../../net/minecraft/server/commands/TeleportCommand.h" UIScene_TeleportMenu::UIScene_TeleportMenu(int iPad, void* initData, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_TeleportMenu.h b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_TeleportMenu.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_TeleportMenu.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_TeleportMenu.h index 35f684d5b..da2e87a78 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_TeleportMenu.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/In-Game Menu Screens/UIScene_TeleportMenu.h @@ -2,7 +2,7 @@ #include -#include "UIScene.h" +#include "../../UIScene.h" class UIScene_TeleportMenu : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_ConnectingProgress.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_ConnectingProgress.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_ConnectingProgress.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_ConnectingProgress.cpp index c3d9c9a39..c53007dbb 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_ConnectingProgress.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_ConnectingProgress.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIScene_ConnectingProgress.h" -#include "../../Minecraft.Client/Minecraft.h" +#include "../../../../net/minecraft/client/Minecraft.h" UIScene_ConnectingProgress::UIScene_ConnectingProgress(int iPad, void* _initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_ConnectingProgress.h b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_ConnectingProgress.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_ConnectingProgress.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_ConnectingProgress.h index 9491b7a34..b790ef39c 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_ConnectingProgress.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_ConnectingProgress.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../UIScene.h" class UIScene_ConnectingProgress : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_FullscreenProgress.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_FullscreenProgress.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_FullscreenProgress.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_FullscreenProgress.cpp index b03c1b7d5..b85ceb17e 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_FullscreenProgress.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_FullscreenProgress.cpp @@ -1,8 +1,8 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIScene_FullscreenProgress.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Rendering/EntityRenderers/ProgressRenderer.h" +#include "../../../../net/minecraft/client/Minecraft.h" +#include "../../../../net/minecraft/client/ProgressRenderer.h" UIScene_FullscreenProgress::UIScene_FullscreenProgress(int iPad, void* initData, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_FullscreenProgress.h b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_FullscreenProgress.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_FullscreenProgress.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_FullscreenProgress.h index 05e9bbc53..478a4374b 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_FullscreenProgress.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_FullscreenProgress.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../UIScene.h" class UIScene_FullscreenProgress : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_Keyboard.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_Keyboard.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_Keyboard.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_Keyboard.cpp index 1bc3f9730..9c975516a 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_Keyboard.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_Keyboard.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIScene_Keyboard.h" #define KEYBOARD_DONE_TIMER_ID 0 diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_Keyboard.h b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_Keyboard.h similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIScene_Keyboard.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_Keyboard.h index be01bc5ec..12bc5adbb 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_Keyboard.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_Keyboard.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../UIScene.h" class UIScene_Keyboard : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_MessageBox.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_MessageBox.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_MessageBox.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_MessageBox.cpp index beb6d3b68..e05241a1e 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_MessageBox.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_MessageBox.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIScene_MessageBox.h" UIScene_MessageBox::UIScene_MessageBox(int iPad, void* initData, diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_MessageBox.h b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_MessageBox.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_MessageBox.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_MessageBox.h index e2c978561..981133aad 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_MessageBox.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_MessageBox.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../UIScene.h" class UIScene_MessageBox : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_QuadrantSignin.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_QuadrantSignin.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIScene_QuadrantSignin.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_QuadrantSignin.cpp index 1ce080998..f68d84795 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_QuadrantSignin.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_QuadrantSignin.cpp @@ -1,7 +1,7 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIScene_QuadrantSignin.h" -#include "../../Minecraft.Client/Minecraft.h" +#include "../../../../net/minecraft/client/Minecraft.h" UIScene_QuadrantSignin::UIScene_QuadrantSignin(int iPad, void* _initData, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_QuadrantSignin.h b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_QuadrantSignin.h similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIScene_QuadrantSignin.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_QuadrantSignin.h index 8e3b2aa32..d4d6609c4 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_QuadrantSignin.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_QuadrantSignin.h @@ -2,7 +2,7 @@ #include -#include "UIScene.h" +#include "../UIScene.h" class UIScene_QuadrantSignin : public UIScene { private: diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_Timer.cpp b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_Timer.cpp similarity index 88% rename from Minecraft.Client/Platform/Common/UI/UIScene_Timer.cpp rename to Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_Timer.cpp index ab10dfffb..e0c6b96bc 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_Timer.cpp +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_Timer.cpp @@ -1,5 +1,5 @@ -#include "../../Minecraft.World/Platform/stdafx.h" -#include "UI.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../UI.h" #include "UIScene_Timer.h" UIScene_Timer::UIScene_Timer(int iPad, void* initData, UILayer* parentLayer) diff --git a/Minecraft.Client/Platform/Common/UI/UIScene_Timer.h b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_Timer.h similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIScene_Timer.h rename to Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_Timer.h index c13b389cd..f6a807b02 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene_Timer.h +++ b/Minecraft.Client/Common/Source Files/UI/Scenes/UIScene_Timer.h @@ -1,6 +1,6 @@ #pragma once -#include "UIScene.h" +#include "../UIScene.h" class UIScene_Timer : public UIScene { private: diff --git a/Minecraft.Client/Common/Source Files/UI/UI.h b/Minecraft.Client/Common/Source Files/UI/UI.h new file mode 100644 index 000000000..da18cf8eb --- /dev/null +++ b/Minecraft.Client/Common/Source Files/UI/UI.h @@ -0,0 +1,119 @@ +#pragma once + +#include "All Platforms/UIEnums.h" +#include "All Platforms/UIStructs.h" + +#include "UIBitmapFont.h" +#include "UITTFFont.h" + +#include "UIScene.h" +#include "UILayer.h" +#include "UIGroup.h" +#include "UIController.h" + +#include "Controls/UIControl.h" +#include "Controls/UIControl_Base.h" +#include "Controls/UIControl_Button.h" +#include "Controls/UIControl_CheckBox.h" +#include "Controls/UIControl_Slider.h" +#include "Controls/UIControl_Label.h" +#include "Controls/UIControl_TextInput.h" +#include "Controls/UIControl_SlotList.h" +#include "Controls/UIControl_Cursor.h" +#include "Controls/UIControl_ButtonList.h" +#include "Controls/UIControl_Progress.h" +#include "Controls/UIControl_TexturePackList.h" +#include "Controls/UIControl_LeaderboardList.h" +#include "Controls/UIControl_SaveList.h" +#include "Controls/UIControl_PlayerList.h" +#include "Controls/UIControl_BitmapIcon.h" +#include "Controls/UIControl_DLCList.h" +#include "Controls/UIControl_HTMLLabel.h" +#include "Controls/UIControl_DynamicLabel.h" +#include "Controls/UIControl_MinecraftPlayer.h" +#include "Controls/UIControl_MinecraftHorse.h" +#include "Controls/UIControl_PlayerSkinPreview.h" +#include "Controls/UIControl_EnchantmentButton.h" +#include "Controls/UIControl_EnchantmentBook.h" +#include "Controls/UIControl_SpaceIndicatorBar.h" +#include "Controls/UIControl_BeaconEffectButton.h" + +#include "Components/UIScene_HUD.h" +#include "Components/UIComponent_Panorama.h" +#include "Components/UIComponent_Logo.h" +#include "Components/UIComponent_Tooltips.h" +#include "Components/UIComponent_TutorialPopup.h" +#include "Components/UIComponent_Chat.h" +#include "Components/UIComponent_PressStartToPlay.h" +#include "Components/UIComponent_MenuBackground.h" + +#include "Scenes/UIScene_QuadrantSignin.h" +#include "Scenes/UIScene_MessageBox.h" +#include "Scenes/UIScene_Timer.h" +#include "Scenes/UIScene_Keyboard.h" + +#include "Scenes/Debug/UIScene_DebugOverlay.h" +#include "Scenes/Debug/UIScene_DebugOptions.h" +#include "Components/UIComponent_DebugUIConsole.h" +#include "Components/UIComponent_DebugUIMarketingGuide.h" +#include "Scenes/Debug/UIScene_DebugSetCamera.h" +#include "Scenes/Debug/UIScene_DebugCreateSchematic.h" + +#include "Scenes/Frontend Menu screens/UIScene_TrialExitUpsell.h" +#include "Scenes/Frontend Menu screens/UIScene_Intro.h" +#include "Scenes/Frontend Menu screens/UIScene_SaveMessage.h" +#include "Scenes/Frontend Menu screens/UIScene_MainMenu.h" +#include "Scenes/Frontend Menu screens/UIScene_LoadMenu.h" +#include "Scenes/Frontend Menu screens/UIScene_JoinMenu.h" +#include "Scenes/Frontend Menu screens/UIScene_LoadOrJoinMenu.h" +#include "Scenes/Frontend Menu screens/UIScene_CreateWorldMenu.h" +#include "Scenes/Frontend Menu screens/UIScene_LaunchMoreOptionsMenu.h" +#include "Scenes/UIScene_FullscreenProgress.h" +#include "Scenes/Frontend Menu screens/UIScene_LeaderboardsMenu.h" +#include "Scenes/Frontend Menu screens/UIScene_DLCMainMenu.h" +#include "Scenes/Frontend Menu screens/UIScene_DLCOffersMenu.h" +#include "Scenes/Help & Options/UIScene_ReinstallMenu.h" + +#include "Scenes/Help & Options/UIScene_HelpAndOptionsMenu.h" +#include "Scenes/Help & Options/UIScene_SettingsMenu.h" +#include "Scenes/Help & Options/UIScene_SettingsOptionsMenu.h" +#include "Scenes/Help & Options/UIScene_SettingsAudioMenu.h" +#include "Scenes/Help & Options/UIScene_SettingsControlMenu.h" +#include "Scenes/Help & Options/UIScene_SettingsGraphicsMenu.h" +#include "Scenes/Help & Options/UIScene_SettingsUIMenu.h" +#include "Scenes/Help & Options/UIScene_SkinSelectMenu.h" +#include "Scenes/Help & Options/UIScene_HowToPlayMenu.h" +#include "Scenes/Help & Options/UIScene_LanguageSelector.h" +#include "Scenes/Help & Options/UIScene_HowToPlay.h" +#include "Scenes/Help & Options/UIScene_ControlsMenu.h" +#include "Scenes/Help & Options/UIScene_Credits.h" + +#include "Scenes/In-Game Menu Screens/UIScene_PauseMenu.h" + +#include "Scenes/In-Game Menu Screens/Containers/UIScene_AbstractContainerMenu.h" +#include "Scenes/In-Game Menu Screens/Containers/UIScene_BrewingStandMenu.h" +#include "Scenes/In-Game Menu Screens/Containers/UIScene_ContainerMenu.h" +#include "Scenes/In-Game Menu Screens/Containers/UIScene_DispenserMenu.h" +#include "Scenes/In-Game Menu Screens/Containers/UIScene_EnchantingMenu.h" +#include "Scenes/In-Game Menu Screens/Containers/UIScene_InventoryMenu.h" +#include "Scenes/In-Game Menu Screens/Containers/UIScene_FurnaceMenu.h" +#include "Scenes/In-Game Menu Screens/Containers/UIScene_CreativeMenu.h" +#include "Scenes/In-Game Menu Screens/Containers/UIScene_TradingMenu.h" +#include "Scenes/In-Game Menu Screens/Containers/UIScene_AnvilMenu.h" +#include "Scenes/In-Game Menu Screens/Containers/UIScene_HorseInventoryMenu.h" +#include "Scenes/In-Game Menu Screens/Containers/UIScene_HopperMenu.h" +#include "Scenes/In-Game Menu Screens/Containers/UIScene_BeaconMenu.h" +#include "Scenes/In-Game Menu Screens/Containers/UIScene_FireworksMenu.h" + +#include "Scenes/In-Game Menu Screens/UIScene_CraftingMenu.h" +#include "Scenes/In-Game Menu Screens/UIScene_SignEntryMenu.h" + +#include "Scenes/UIScene_ConnectingProgress.h" +#include "Scenes/In-Game Menu Screens/UIScene_DeathMenu.h" +#include "Scenes/In-Game Menu Screens/UIScene_InGameInfoMenu.h" +#include "Scenes/In-Game Menu Screens/UIScene_InGameHostOptionsMenu.h" +#include "Scenes/In-Game Menu Screens/UIScene_InGamePlayerOptionsMenu.h" +#include "Scenes/In-Game Menu Screens/UIScene_TeleportMenu.h" +#include "Scenes/In-Game Menu Screens/UIScene_EndPoem.h" +#include "Scenes/Frontend Menu screens/UIScene_EULA.h" +#include "Scenes/Frontend Menu screens/UIScene_NewUpdateMessage.h" \ No newline at end of file diff --git a/Minecraft.Client/Platform/Common/UI/UIBitmapFont.cpp b/Minecraft.Client/Common/Source Files/UI/UIBitmapFont.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIBitmapFont.cpp rename to Minecraft.Client/Common/Source Files/UI/UIBitmapFont.cpp index f6c0d0603..9c2793dd5 100644 --- a/Minecraft.Client/Platform/Common/UI/UIBitmapFont.cpp +++ b/Minecraft.Client/Common/Source Files/UI/UIBitmapFont.cpp @@ -1,6 +1,6 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" -#include "../../Minecraft.Client/Textures/BufferedImage.h" +#include "../../../Header Files/BufferedImage.h" #include "UIFontData.h" #include diff --git a/Minecraft.Client/Platform/Common/UI/UIBitmapFont.h b/Minecraft.Client/Common/Source Files/UI/UIBitmapFont.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIBitmapFont.h rename to Minecraft.Client/Common/Source Files/UI/UIBitmapFont.h diff --git a/Minecraft.Client/Platform/Common/UI/UIController.cpp b/Minecraft.Client/Common/Source Files/UI/UIController.cpp similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIController.cpp rename to Minecraft.Client/Common/Source Files/UI/UIController.cpp index 341b9d78e..7e25ef816 100644 --- a/Minecraft.Client/Platform/Common/UI/UIController.cpp +++ b/Minecraft.Client/Common/Source Files/UI/UIController.cpp @@ -1,16 +1,16 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "UIController.h" #include "UI.h" #include "UIScene.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.Client/Player/LocalPlayer.h" -#include "../../Minecraft.Client/Textures/Packs/DLCTexturePack.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePackRepository.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.boss.enderdragon.h" -#include "../../Minecraft.Client/Rendering/EntityRenderers/EnderDragonRenderer.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.Client/UI/Screens/TitleScreen.h" +#include "../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../net/minecraft/client/player/LocalPlayer.h" +#include "../../../net/minecraft/client/skins/DLCTexturePack.h" +#include "../../../net/minecraft/client/skins/TexturePackRepository.h" +#include "../../../net/minecraft/client/Minecraft.h" +#include "../../../../Minecraft.World/net/minecraft/world/entity/boss/enderdragon/net.minecraft.world.entity.boss.enderdragon.h" +#include "../../../net/minecraft/client/renderer/entity/EnderDragonRenderer.h" +#include "../../../net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../net/minecraft/client/title/TitleScreen.h" #include "UIFontData.h" // 4J Stu - Enable this to override the Iggy Allocator @@ -19,7 +19,7 @@ // #define ENABLE_IGGY_EXPLORER #if defined(ENABLE_IGGY_EXPLORER) -#include "../../Minecraft.Client/Platform/Windows64/Iggy/include/iggyexpruntime.h" +#include "../../../Windows64/Iggy/include/iggyexpruntime.h" #endif // #define ENABLE_IGGY_PERFMON @@ -29,7 +29,7 @@ #define PM_ORIGIN_Y 34 #if defined(__WINDOWS64) -#include "../../Minecraft.Client/Platform/Windows64/Iggy/include/iggyperfmon.h" +#include "../../../Windows64/Iggy/include/iggyperfmon.h" #endif #endif diff --git a/Minecraft.Client/Platform/Common/UI/UIController.h b/Minecraft.Client/Common/Source Files/UI/UIController.h similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIController.h rename to Minecraft.Client/Common/Source Files/UI/UIController.h index 09223ba6d..903a03b65 100644 --- a/Minecraft.Client/Platform/Common/UI/UIController.h +++ b/Minecraft.Client/Common/Source Files/UI/UIController.h @@ -3,8 +3,8 @@ #include #include -#include "IUIController.h" -#include "UIEnums.h" +#include "All Platforms/IUIController.h" +#include "All Platforms/UIEnums.h" #include "UIGroup.h" class UIAbstractBitmapFont; diff --git a/Minecraft.Client/Platform/Common/UI/UIFontData.cpp b/Minecraft.Client/Common/Source Files/UI/UIFontData.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIFontData.cpp rename to Minecraft.Client/Common/Source Files/UI/UIFontData.cpp index 51dee10e7..34e7139e0 100644 --- a/Minecraft.Client/Platform/Common/UI/UIFontData.cpp +++ b/Minecraft.Client/Common/Source Files/UI/UIFontData.cpp @@ -1,4 +1,4 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "UIFontData.h" ///////////////////////////////////////////////////// diff --git a/Minecraft.Client/Platform/Common/UI/UIFontData.h b/Minecraft.Client/Common/Source Files/UI/UIFontData.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIFontData.h rename to Minecraft.Client/Common/Source Files/UI/UIFontData.h diff --git a/Minecraft.Client/Platform/Common/UI/UIGroup.cpp b/Minecraft.Client/Common/Source Files/UI/UIGroup.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIGroup.cpp rename to Minecraft.Client/Common/Source Files/UI/UIGroup.cpp index 03efb921c..758b00cc7 100644 --- a/Minecraft.Client/Platform/Common/UI/UIGroup.cpp +++ b/Minecraft.Client/Common/Source Files/UI/UIGroup.cpp @@ -1,4 +1,4 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "UIGroup.h" UIGroup::UIGroup(EUIGroup group, int iPad) { diff --git a/Minecraft.Client/Platform/Common/UI/UIGroup.h b/Minecraft.Client/Common/Source Files/UI/UIGroup.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UIGroup.h rename to Minecraft.Client/Common/Source Files/UI/UIGroup.h index 7057b8d12..2bf4046e7 100644 --- a/Minecraft.Client/Platform/Common/UI/UIGroup.h +++ b/Minecraft.Client/Common/Source Files/UI/UIGroup.h @@ -1,6 +1,6 @@ #pragma once #include "UILayer.h" -#include "UIEnums.h" +#include "All Platforms/UIEnums.h" class UIComponent_Tooltips; class UIComponent_TutorialPopup; diff --git a/Minecraft.Client/Platform/Common/UI/UILayer.cpp b/Minecraft.Client/Common/Source Files/UI/UILayer.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UILayer.cpp rename to Minecraft.Client/Common/Source Files/UI/UILayer.cpp index 9be214373..675f9957c 100644 --- a/Minecraft.Client/Platform/Common/UI/UILayer.cpp +++ b/Minecraft.Client/Common/Source Files/UI/UILayer.cpp @@ -1,4 +1,4 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "UI.h" #include "UILayer.h" #include "UIScene.h" diff --git a/Minecraft.Client/Platform/Common/UI/UILayer.h b/Minecraft.Client/Common/Source Files/UI/UILayer.h similarity index 98% rename from Minecraft.Client/Platform/Common/UI/UILayer.h rename to Minecraft.Client/Common/Source Files/UI/UILayer.h index 831b34b66..fb34c1b3c 100644 --- a/Minecraft.Client/Platform/Common/UI/UILayer.h +++ b/Minecraft.Client/Common/Source Files/UI/UILayer.h @@ -1,5 +1,5 @@ #pragma once -#include "UIEnums.h" +#include "All Platforms/UIEnums.h" // using namespace std; class UIScene; class UIGroup; diff --git a/Minecraft.Client/Platform/Common/UI/UIScene.cpp b/Minecraft.Client/Common/Source Files/UI/UIScene.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIScene.cpp rename to Minecraft.Client/Common/Source Files/UI/UIScene.cpp index 632273c6b..77befbd1d 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene.cpp +++ b/Minecraft.Client/Common/Source Files/UI/UIScene.cpp @@ -1,12 +1,12 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include #include "UI.h" #include "UIScene.h" -#include "../../Minecraft.Client/Rendering/Lighting.h" -#include "../../Minecraft.Client/Player/LocalPlayer.h" -#include "../../Minecraft.Client/Rendering/EntityRenderers/ItemRenderer.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" +#include "../../../net/minecraft/client/Lighting.h" +#include "../../../net/minecraft/client/player/LocalPlayer.h" +#include "../../../net/minecraft/client/renderer/entity/ItemRenderer.h" +#include "../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" UIScene::UIScene(int iPad, UILayer* parentLayer) { m_parentLayer = parentLayer; diff --git a/Minecraft.Client/Platform/Common/UI/UIScene.h b/Minecraft.Client/Common/Source Files/UI/UIScene.h similarity index 99% rename from Minecraft.Client/Platform/Common/UI/UIScene.h rename to Minecraft.Client/Common/Source Files/UI/UIScene.h index c7a0edfea..0314f9bcf 100644 --- a/Minecraft.Client/Platform/Common/UI/UIScene.h +++ b/Minecraft.Client/Common/Source Files/UI/UIScene.h @@ -7,8 +7,8 @@ #include -#include "UIEnums.h" -#include "UIControl_Base.h" +#include "All Platforms/UIEnums.h" +#include "Controls/UIControl_Base.h" class ItemRenderer; class UILayer; diff --git a/Minecraft.Client/Platform/Common/UI/UIString.cpp b/Minecraft.Client/Common/Source Files/UI/UIString.cpp similarity index 96% rename from Minecraft.Client/Platform/Common/UI/UIString.cpp rename to Minecraft.Client/Common/Source Files/UI/UIString.cpp index 07afa1eb0..91f59b0c2 100644 --- a/Minecraft.Client/Platform/Common/UI/UIString.cpp +++ b/Minecraft.Client/Common/Source Files/UI/UIString.cpp @@ -1,6 +1,6 @@ -#include "../../stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" -#include "../../../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #include "UIString.h" diff --git a/Minecraft.Client/Platform/Common/UI/UIString.h b/Minecraft.Client/Common/Source Files/UI/UIString.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UIString.h rename to Minecraft.Client/Common/Source Files/UI/UIString.h diff --git a/Minecraft.Client/Platform/Common/UI/UITTFFont.cpp b/Minecraft.Client/Common/Source Files/UI/UITTFFont.cpp similarity index 94% rename from Minecraft.Client/Platform/Common/UI/UITTFFont.cpp rename to Minecraft.Client/Common/Source Files/UI/UITTFFont.cpp index 71db8d0dd..44f0f7ef0 100644 --- a/Minecraft.Client/Platform/Common/UI/UITTFFont.cpp +++ b/Minecraft.Client/Common/Source Files/UI/UITTFFont.cpp @@ -1,6 +1,6 @@ -#include "../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "UI.h" -#include "../../Minecraft.World/Util/PortableFileIO.h" +#include "../../../../Minecraft.World/Header Files/PortableFileIO.h" #include "UITTFFont.h" UITTFFont::UITTFFont(const std::string& name, const std::string& path, diff --git a/Minecraft.Client/Platform/Common/UI/UITTFFont.h b/Minecraft.Client/Common/Source Files/UI/UITTFFont.h similarity index 100% rename from Minecraft.Client/Platform/Common/UI/UITTFFont.h rename to Minecraft.Client/Common/Source Files/UI/UITTFFont.h diff --git a/Minecraft.Client/Platform/Common/C4JMemoryPool.h b/Minecraft.Client/ConsoleHelpers/C4JMemoryPool.h similarity index 100% rename from Minecraft.Client/Platform/Common/C4JMemoryPool.h rename to Minecraft.Client/ConsoleHelpers/C4JMemoryPool.h diff --git a/Minecraft.Client/Platform/Common/C4JMemoryPoolAllocator.h b/Minecraft.Client/ConsoleHelpers/C4JMemoryPoolAllocator.h similarity index 100% rename from Minecraft.Client/Platform/Common/C4JMemoryPoolAllocator.h rename to Minecraft.Client/ConsoleHelpers/C4JMemoryPoolAllocator.h diff --git a/Minecraft.Client/GameState/DispenserBootstrap.cpp b/Minecraft.Client/GameState/DispenserBootstrap.cpp deleted file mode 100644 index 7eaa38011..000000000 --- a/Minecraft.Client/GameState/DispenserBootstrap.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "../Platform/stdafx.h" \ No newline at end of file diff --git a/Minecraft.Client/GameState/StatsSyncer.cpp b/Minecraft.Client/GameState/StatsSyncer.cpp deleted file mode 100644 index 1e33aafa4..000000000 --- a/Minecraft.Client/GameState/StatsSyncer.cpp +++ /dev/null @@ -1,4 +0,0 @@ -#include "../Platform/stdafx.h" -#include "StatsSyncer.h" - -// 4J - TODO \ No newline at end of file diff --git a/Minecraft.Client/Textures/BufferedImage.h b/Minecraft.Client/Header Files/BufferedImage.h similarity index 100% rename from Minecraft.Client/Textures/BufferedImage.h rename to Minecraft.Client/Header Files/BufferedImage.h diff --git a/Minecraft.Client/Utils/FrameProfiler.h b/Minecraft.Client/Header Files/FrameProfiler.h similarity index 100% rename from Minecraft.Client/Utils/FrameProfiler.h rename to Minecraft.Client/Header Files/FrameProfiler.h diff --git a/Minecraft.Client/Textures/MemTexture.h b/Minecraft.Client/Header Files/MemTexture.h similarity index 100% rename from Minecraft.Client/Textures/MemTexture.h rename to Minecraft.Client/Header Files/MemTexture.h diff --git a/Minecraft.Client/Textures/MemTextureProcessor.h b/Minecraft.Client/Header Files/MemTextureProcessor.h similarity index 100% rename from Minecraft.Client/Textures/MemTextureProcessor.h rename to Minecraft.Client/Header Files/MemTextureProcessor.h diff --git a/Minecraft.Client/Platform/Windows64/GameConfig/Minecraft.spa.h b/Minecraft.Client/Header Files/Minecraft.spa.h similarity index 100% rename from Minecraft.Client/Platform/Windows64/GameConfig/Minecraft.spa.h rename to Minecraft.Client/Header Files/Minecraft.spa.h diff --git a/Minecraft.Client/Textures/MobSkinMemTextureProcessor.h b/Minecraft.Client/Header Files/MobSkinMemTextureProcessor.h similarity index 100% rename from Minecraft.Client/Textures/MobSkinMemTextureProcessor.h rename to Minecraft.Client/Header Files/MobSkinMemTextureProcessor.h diff --git a/Minecraft.Client/Rendering/Models/SkinBox.h b/Minecraft.Client/Header Files/SkinBox.h similarity index 100% rename from Minecraft.Client/Rendering/Models/SkinBox.h rename to Minecraft.Client/Header Files/SkinBox.h diff --git a/Minecraft.Client/Platform/extraX64client.h b/Minecraft.Client/Header Files/extraX64client.h similarity index 100% rename from Minecraft.Client/Platform/extraX64client.h rename to Minecraft.Client/Header Files/extraX64client.h diff --git a/Minecraft.Client/Header Files/stdafx.h b/Minecraft.Client/Header Files/stdafx.h new file mode 100644 index 000000000..8dde1a3d9 --- /dev/null +++ b/Minecraft.Client/Header Files/stdafx.h @@ -0,0 +1,153 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// + +#pragma once + +// #include +// #include + +#define __STR2__(x) #x +#define __STR1__(x) __STR2__(x) +#define __LOC__ __FILE__ "(" __STR1__(__LINE__) ") : 4J Warning Msg: " + +// use - #pragma message(__LOC__"Need to do something here") + +#include +#include +#include +#include +#include + +#ifdef __linux__ +#include "../Linux/Stubs/LinuxStubs.h" +#endif + +#ifdef _WINDOWS64 +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +#include +#include +#include +#include +#include +using namespace DirectX; + +#define HRESULT_SUCCEEDED(hr) (((int32_t)(hr)) >= 0) +#endif + +#include "../../Minecraft.World/x64headers/extraX64.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "../../Minecraft.World/ConsoleHelpers/Definitions.h" +#include "../../Minecraft.World/ConsoleJavaLibs/Class.h" +#include "../../Minecraft.World/ConsoleHelpers/ArrayWithLength.h" +#include "../../Minecraft.World/net/minecraft/SharedConstants.h" +#include "../../Minecraft.World/ConsoleJavaLibs/Random.h" +#include "../../Minecraft.World/Header Files/compression.h" +#include "../../Minecraft.World/ConsoleHelpers/PerformanceTimer.h" + +#ifdef _WINDOWS64 +#include "../Platform/Windows64/4JLibs/inc/4J_Input.h" +#include "../Platform/Windows64/4JLibs/inc/4J_Profile.h" +#include "../Platform/Windows64/4JLibs/inc/4J_Render.h" +#include "../Platform/Windows64/4JLibs/inc/4J_Storage.h" +#else +#include "4J_Input.h" +#include "4J_Profile.h" +#include "4J_Render.h" +#include "4J_Storage.h" +#endif + +#include "../net/minecraft/client/renderer/Textures.h" +#include "../net/minecraft/client/gui/Font.h" +#include "../net/minecraft/client/ClientConstants.h" +#include "../net/minecraft/client/gui/Gui.h" +#include "../net/minecraft/client/gui/Screen.h" +#include "../net/minecraft/client/gui/ScreenSizeCalculator.h" +#include "../net/minecraft/client/Minecraft.h" +#include "../net/minecraft/client/MemoryTracker.h" +#include "stubs.h" +#include "BufferedImage.h" + +#include "../Common/Source Files/Network/GameNetworkManager.h" + +#include "../Common/Source Files/UI/All Platforms/UIEnums.h" +#include "../Common/Source Files/UI/All Platforms/UIStructs.h" +#include "../Common/App_Defines.h" +#include "../Common/App_enums.h" +#include "../Common/Source Files/Tutorial/TutorialEnum.h" +#include "../Common/App_structs.h" + +#include "../Common/Consoles_App.h" +#include "../Common/Minecraft_Macros.h" +#include "../Common/Source Files/BuildVer/BuildVer.h" + +// This is generated at build time via scripts/pack_loc.py +#include "strings.h" + +#ifdef _WINDOWS64 +#include "../Windows64/Source Files/Sentient/MinecraftTelemetry.h" +#include "../Windows64/Windows64_App.h" +#include "../Windows64/Source Files/Sentient/DynamicConfigurations.h" +#include "../Windows64/Source Files/Sentient/SentientTelemetryCommon.h" +#include "Minecraft.spa.h" +#include "../Windows64/XML/ATGXmlParser.h" +#include "../Windows64/Source Files/Social/SocialManager.h" +#include "../Common/Source Files/Audio/SoundEngine.h" +#include "../Windows64/Iggy/include/iggy.h" +#include "../Windows64/Iggy/gdraw/gdraw_d3d11.h" +#include "../Windows64/Windows64_UIController.h" +#else +// Linux build: keep the Linux runtime/controller path and use the supported +// Linux/Windows64 metadata headers only. +#include "../Linux/Linux_App.h" +#include "../Windows64/Iggy/include/iggy.h" +#include "../Windows64/Source Files/Sentient/SentientTelemetryCommon.h" +#include "../Windows64/Source Files/Sentient/DynamicConfigurations.h" +#include "Minecraft.spa.h" +#include "../Common/Source Files/Audio/SoundEngine.h" +#include "../Linux/Linux_UIController.h" +#include "../Windows64/Source Files/Social/SocialManager.h" +#endif + +#include "../Common/Source Files/ConsoleGameMode.h" +#include "../Common/Source Files/Console_Debug_enum.h" +#include "../Common/Source Files/Console_Awards_enum.h" +#include "../Common/Source Files/Tutorial/TutorialMode.h" +#include "../Common/Source Files/Tutorial/Tutorial.h" +#include "../Common/Source Files/Tutorial/FullTutorialMode.h" +#include "../Common/Source Files/Trial/TrialMode.h" +#include "../Common/Source Files/GameRules/ConsoleGameRules.h" +#include "../Common/Source Files/GameRules/LevelGeneration/ConsoleSchematicFile.h" +#include "../Common/Source Files/Colours/ColourTable.h" +#include "../Common/Source Files/DLC/DLCSkinFile.h" +#include "../Common/Source Files/DLC/DLCManager.h" +#include "../Common/Source Files/DLC/DLCPack.h" +#include "../Common/Source Files/Telemetry/TelemetryManager.h" + +#include "extraX64client.h" + +#ifdef _FINAL_BUILD +#define printf BREAKTHECOMPILE +#define wprintf BREAKTHECOMPILE +#undef OutputDebugString +#define OutputDebugString BREAKTHECOMPILE +#define OutputDebugStringA BREAKTHECOMPILE +#define OutputDebugStringW BREAKTHECOMPILE +#endif + +void MemSect(int sect); diff --git a/Minecraft.Client/Platform/stubs.h b/Minecraft.Client/Header Files/stubs.h similarity index 100% rename from Minecraft.Client/Platform/stubs.h rename to Minecraft.Client/Header Files/stubs.h diff --git a/Minecraft.Client/Platform/Linux/Iggy/gdraw/gdraw.c b/Minecraft.Client/Linux/Iggy/gdraw/gdraw.c similarity index 99% rename from Minecraft.Client/Platform/Linux/Iggy/gdraw/gdraw.c rename to Minecraft.Client/Linux/Iggy/gdraw/gdraw.c index 4fde9a91f..4670f4c67 100644 --- a/Minecraft.Client/Platform/Linux/Iggy/gdraw/gdraw.c +++ b/Minecraft.Client/Linux/Iggy/gdraw/gdraw.c @@ -1,8 +1,8 @@ #define GDRAW_ASSERTS -#include "../../../Windows64/Iggy/include/iggy.h" -#include "../../../Windows64/Iggy/include/gdraw.h" -#include "gdraw.h" +#include "../../../../Windows64/Iggy/include/iggy.h" +#include "../../../../Windows64/Iggy/include/gdraw.h" +#include "../../../../Windows64/Iggy/include/gdraw.h" #include #include @@ -684,7 +684,7 @@ static void gdraw_FramebufferRenderbufferSafe(GLenum target, GLenum attachment, #define glFramebufferRenderbuffer_SAFE gdraw_FramebufferRenderbufferSafe #define glFramebufferRenderbuffer glFramebufferRenderbuffer_SAFE -#include "../../../Windows64/Iggy/gdraw/gdraw_gl_shared.inl" +#include "../../../../Windows64/Iggy/gdraw/gdraw_gl_shared.inl" #undef glVertexAttribPointer #define glVertexAttribPointer gdraw_real_vtxattrib diff --git a/Minecraft.Client/Platform/Linux/Iggy/gdraw/gdraw.h b/Minecraft.Client/Linux/Iggy/gdraw/gdraw.h similarity index 94% rename from Minecraft.Client/Platform/Linux/Iggy/gdraw/gdraw.h rename to Minecraft.Client/Linux/Iggy/gdraw/gdraw.h index 8e0b3aa17..9852143d8 100644 --- a/Minecraft.Client/Platform/Linux/Iggy/gdraw/gdraw.h +++ b/Minecraft.Client/Linux/Iggy/gdraw/gdraw.h @@ -1,8 +1,8 @@ #ifndef __LINUX_IGGY_GDRAW_H__ #define __LINUX_IGGY_GDRAW_H__ -#include "../../../Windows64/Iggy/include/gdraw.h" -#include "../../../Windows64/Iggy/include/iggy.h" +#include "../../../../Windows64/Iggy/include/gdraw.h" +#include "../../../../Windows64/Iggy/include/iggy.h" #ifdef __cplusplus extern "C" { diff --git a/Minecraft.Client/Platform/Windows64/Iggy/include/gdraw.h b/Minecraft.Client/Linux/Iggy/include/gdraw.h similarity index 99% rename from Minecraft.Client/Platform/Windows64/Iggy/include/gdraw.h rename to Minecraft.Client/Linux/Iggy/include/gdraw.h index ab41d5075..3e28fb560 100644 --- a/Minecraft.Client/Platform/Windows64/Iggy/include/gdraw.h +++ b/Minecraft.Client/Linux/Iggy/include/gdraw.h @@ -6,7 +6,7 @@ #ifndef __RAD_INCLUDE_GDRAW_H__ #define __RAD_INCLUDE_GDRAW_H__ -#include "../../Miles/include/rrcore.h" +#include "../../../../Windows64/Miles Sound System/Include/rrcore.h" #define IDOC diff --git a/Minecraft.Client/Platform/Linux/Iggy/include/iggy.h b/Minecraft.Client/Linux/Iggy/include/iggy.h similarity index 99% rename from Minecraft.Client/Platform/Linux/Iggy/include/iggy.h rename to Minecraft.Client/Linux/Iggy/include/iggy.h index 46e75ea41..5d43d46ac 100644 --- a/Minecraft.Client/Platform/Linux/Iggy/include/iggy.h +++ b/Minecraft.Client/Linux/Iggy/include/iggy.h @@ -8,7 +8,7 @@ #define IggyVersion "1.2.30" #define IggyFlashVersion "9,1,2,30" -#include "../../../Windows64/Miles/include/rrcore.h" // base data types, macros +#include "../../../../Windows64/Miles Sound System/Include/rrcore.h" // base data types, macros RADDEFSTART diff --git a/Minecraft.Client/Platform/Linux/Iggy/include/rrCore.h b/Minecraft.Client/Linux/Iggy/include/rrCore.h similarity index 100% rename from Minecraft.Client/Platform/Linux/Iggy/include/rrCore.h rename to Minecraft.Client/Linux/Iggy/include/rrCore.h diff --git a/Minecraft.Client/Platform/Linux/Leaderboards/LinuxLeaderboardManager.cpp b/Minecraft.Client/Linux/Leaderboards/LinuxLeaderboardManager.cpp similarity index 77% rename from Minecraft.Client/Platform/Linux/Leaderboards/LinuxLeaderboardManager.cpp rename to Minecraft.Client/Linux/Leaderboards/LinuxLeaderboardManager.cpp index 3c82b10a2..a71d37cd6 100644 --- a/Minecraft.Client/Platform/Linux/Leaderboards/LinuxLeaderboardManager.cpp +++ b/Minecraft.Client/Linux/Leaderboards/LinuxLeaderboardManager.cpp @@ -1,4 +1,4 @@ -#include "../../../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "LinuxLeaderboardManager.h" diff --git a/Minecraft.Client/Platform/Linux/Leaderboards/LinuxLeaderboardManager.h b/Minecraft.Client/Linux/Leaderboards/LinuxLeaderboardManager.h similarity index 95% rename from Minecraft.Client/Platform/Linux/Leaderboards/LinuxLeaderboardManager.h rename to Minecraft.Client/Linux/Leaderboards/LinuxLeaderboardManager.h index 641622381..5aa7b1b2d 100644 --- a/Minecraft.Client/Platform/Linux/Leaderboards/LinuxLeaderboardManager.h +++ b/Minecraft.Client/Linux/Leaderboards/LinuxLeaderboardManager.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Common/Leaderboards/LeaderboardManager.h" +#include "../../../Common/Source Files/Leaderboards/LeaderboardManager.h" class LinuxLeaderboardManager : public LeaderboardManager { public: diff --git a/Minecraft.Client/Platform/Linux/LinuxGL.cpp b/Minecraft.Client/Linux/LinuxGL.cpp similarity index 95% rename from Minecraft.Client/Platform/Linux/LinuxGL.cpp rename to Minecraft.Client/Linux/LinuxGL.cpp index c7fff72d5..2d0cd3372 100644 --- a/Minecraft.Client/Platform/Linux/LinuxGL.cpp +++ b/Minecraft.Client/Linux/LinuxGL.cpp @@ -1,11 +1,11 @@ #ifdef __linux__ -#include "../stdafx.h" +#include "../../../Minecraft.World/Header Files/stdafx.h" #include "4J_Render.h" -#include "../../Minecraft.World/IO/Streams/IntBuffer.h" -#include "../../Minecraft.World/IO/Streams/FloatBuffer.h" -#include "../../Minecraft.World/IO/Streams/ByteBuffer.h" +#include "../../../Minecraft.World/ConsoleJavaLibs/IntBuffer.h" +#include "../../../Minecraft.World/ConsoleJavaLibs/FloatBuffer.h" +#include "../../../Minecraft.World/ConsoleJavaLibs/ByteBuffer.h" extern C4JRender RenderManager; diff --git a/Minecraft.Client/Platform/Linux/LinuxGL.h b/Minecraft.Client/Linux/LinuxGL.h similarity index 100% rename from Minecraft.Client/Platform/Linux/LinuxGL.h rename to Minecraft.Client/Linux/LinuxGL.h diff --git a/Minecraft.Client/Platform/Linux/Linux_App.cpp b/Minecraft.Client/Linux/Linux_App.cpp similarity index 87% rename from Minecraft.Client/Platform/Linux/Linux_App.cpp rename to Minecraft.Client/Linux/Linux_App.cpp index e7d5d629a..9065d6e48 100644 --- a/Minecraft.Client/Platform/Linux/Linux_App.cpp +++ b/Minecraft.Client/Linux/Linux_App.cpp @@ -1,14 +1,14 @@ -#include "../../../Minecraft.World/Platform/stdafx.h" -#include "../Common/Consoles_App.h" -#include "../../Player/User.h" -#include "../../Minecraft.h" -#include "../../MinecraftServer.h" -#include "../../Network/PlayerList.h" -#include "../../Player/ServerPlayer.h" -#include "../../../Minecraft.World/Level/Level.h" -#include "../../../Minecraft.World/Level/Storage/LevelSettings.h" -#include "../../../Minecraft.World/WorldGen/Biomes/BiomeSource.h" -#include "../../../Minecraft.World/Level/Storage/LevelType.h" +#include "../../../Minecraft.World/Header Files/stdafx.h" +#include "../../Common/Consoles_App.h" +#include "../../net/minecraft/client/User.h" +#include "../../net/minecraft/client/Minecraft.h" +#include "../../net/minecraft/server/MinecraftServer.h" +#include "../../net/minecraft/server/PlayerList.h" +#include "../../net/minecraft/server/level/ServerPlayer.h" +#include "../../../Minecraft.World/net/minecraft/world/level/Level.h" +#include "../../../Minecraft.World/net/minecraft/world/level/LevelSettings.h" +#include "../../../Minecraft.World/net/minecraft/world/level/biome/BiomeSource.h" +#include "../../../Minecraft.World/net/minecraft/world/level/LevelType.h" #include "Linux_App.h" CConsoleMinecraftApp app; diff --git a/Minecraft.Client/Platform/Linux/Linux_App.h b/Minecraft.Client/Linux/Linux_App.h similarity index 100% rename from Minecraft.Client/Platform/Linux/Linux_App.h rename to Minecraft.Client/Linux/Linux_App.h diff --git a/Minecraft.Client/Platform/Linux/Linux_Minecraft.cpp b/Minecraft.Client/Linux/Linux_Minecraft.cpp similarity index 96% rename from Minecraft.Client/Platform/Linux/Linux_Minecraft.cpp rename to Minecraft.Client/Linux/Linux_Minecraft.cpp index ecfcb7dc5..939bef0a5 100644 --- a/Minecraft.Client/Platform/Linux/Linux_Minecraft.cpp +++ b/Minecraft.Client/Linux/Linux_Minecraft.cpp @@ -1,7 +1,7 @@ // Minecraft.cpp : Defines the entry point for the application. // -#include "../../../Minecraft.World/Platform/stdafx.h" +#include "../../../Minecraft.World/Header Files/stdafx.h" #include #include @@ -38,36 +38,36 @@ static void sigsegv_handler(int sig) { _exit(139); } #endif -#include "../Windows64/GameConfig/Minecraft.spa.h" -#include "../../MinecraftServer.h" -#include "../../Player/LocalPlayer.h" -#include "../../../Minecraft.World/Items/ItemInstance.h" -#include "../../../Minecraft.World/Items/MapItem.h" -#include "../../../Minecraft.World/Recipes/Recipes.h" -#include "../../../Minecraft.World/Recipes/Recipy.h" -#include "../../../Minecraft.World/Util/Language.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" -#include "../../../Minecraft.World/Util/AABB.h" -#include "../../../Minecraft.World/Util/Vec3.h" -#include "../../../Minecraft.World/Level/Level.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" +#include "../../Header Files/Minecraft.spa.h" +#include "../../net/minecraft/server/MinecraftServer.h" +#include "../../net/minecraft/client/player/LocalPlayer.h" +#include "../../../Minecraft.World/net/minecraft/world/item/ItemInstance.h" +#include "../../../Minecraft.World/net/minecraft/world/item/MapItem.h" +#include "../../../Minecraft.World/net/minecraft/world/item/crafting/Recipes.h" +#include "../../../Minecraft.World/net/minecraft/world/item/crafting/Recipy.h" +#include "../../../Minecraft.World/net/minecraft/locale/Language.h" +#include "../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../Minecraft.World/net/minecraft/world/phys/AABB.h" +#include "../../../Minecraft.World/net/minecraft/world/phys/Vec3.h" +#include "../../../Minecraft.World/net/minecraft/world/level/Level.h" +#include "../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" -#include "../../Network/ClientConnection.h" -#include "../../Player/User.h" -#include "../../../Minecraft.World/Network/Socket.h" -#include "../../../Minecraft.World/Util/ThreadName.h" -#include "../../GameState/StatsCounter.h" -#include "../../UI/Screens/ConnectScreen.h" -// #include "../Durango/Social/SocialManager.h" -// #include "../Common/Leaderboards/LeaderboardManager.h" +#include "../../net/minecraft/client/multiplayer/ClientConnection.h" +#include "../../net/minecraft/client/User.h" +#include "../../../Minecraft.World/ConsoleJavaLibs/Socket.h" +#include "../../../Minecraft.World/ConsoleHelpers/ThreadName.h" +#include "../../net/minecraft/stats/StatsCounter.h" +#include "../../net/minecraft/client/multiplayer/ConnectScreen.h" +// #include "../../Windows64/Source Files/Social/SocialManager.h" +// #include "../../Common/Source Files/Leaderboards/LeaderboardManager.h" // #include "../Common/XUI/XUI_Scene_Container.h" // #include "NetworkManager.h" -#include "../../Rendering/Tesselator.h" -#include "../../GameState/Options.h" -#include "../Linux/Sentient/SentientManager.h" -#include "../../Textures/Textures.h" -#include "../../../Minecraft.World/IO/Streams/Compression.h" -#include "../../../Minecraft.World/Level/Storage/OldChunkStorage.h" +#include "../../net/minecraft/client/renderer/Tesselator.h" +#include "../../net/minecraft/client/Options.h" +#include "../../Windows64/Source Files/Sentient/SentientManager.h" +#include "../../net/minecraft/client/renderer/Textures.h" +#include "../../../Minecraft.World/Header Files/compression.h" +#include "../../../Minecraft.World/net/minecraft/world/level/chunk/storage/OldChunkStorage.h" // #include "../Orbis/Leaderboards/OrbisLeaderboardManager.h" // #include "../Orbis/Network/Orbis_NPToolkit.h" diff --git a/Minecraft.Client/Platform/Linux/Linux_ShutdownManager.cpp b/Minecraft.Client/Linux/Linux_ShutdownManager.cpp similarity index 86% rename from Minecraft.Client/Platform/Linux/Linux_ShutdownManager.cpp rename to Minecraft.Client/Linux/Linux_ShutdownManager.cpp index a2137cefb..fc5405d7c 100644 --- a/Minecraft.Client/Platform/Linux/Linux_ShutdownManager.cpp +++ b/Minecraft.Client/Linux/Linux_ShutdownManager.cpp @@ -1,7 +1,7 @@ // Linux stub implementations for ShutdownManager // The PS3/PSVita versions have full implementations; on Linux these are no-ops. -#include "../../Platform/stdafx.h" -#include "../Common/ShutdownManager.h" +#include "../../../Minecraft.World/Header Files/stdafx.h" +#include "../../Common/ShutdownManager.h" void ShutdownManager::Initialise() {} void ShutdownManager::StartShutdown() {} diff --git a/Minecraft.Client/Platform/Linux/Linux_UIController.cpp b/Minecraft.Client/Linux/Linux_UIController.cpp similarity index 97% rename from Minecraft.Client/Platform/Linux/Linux_UIController.cpp rename to Minecraft.Client/Linux/Linux_UIController.cpp index 855c10b9d..c56136a99 100644 --- a/Minecraft.Client/Platform/Linux/Linux_UIController.cpp +++ b/Minecraft.Client/Linux/Linux_UIController.cpp @@ -1,8 +1,8 @@ -#include "../../../Minecraft.World/Platform/stdafx.h" +#include "../../../Minecraft.World/Header Files/stdafx.h" #include "Linux_UIController.h" // GDraw GL backend for Linux -#include "Iggy/gdraw/gdraw.h" +#include "../../Windows64/Iggy/include/gdraw.h" ConsoleUIController ui; diff --git a/Minecraft.Client/Platform/Linux/Linux_UIController.h b/Minecraft.Client/Linux/Linux_UIController.h similarity index 94% rename from Minecraft.Client/Platform/Linux/Linux_UIController.h rename to Minecraft.Client/Linux/Linux_UIController.h index ff0a6521e..9e5037f04 100644 --- a/Minecraft.Client/Platform/Linux/Linux_UIController.h +++ b/Minecraft.Client/Linux/Linux_UIController.h @@ -1,6 +1,6 @@ #pragma once -#include "../Common/UI/UIController.h" +#include "../../Common/Source Files/UI/UIController.h" class ConsoleUIController : public UIController { public: diff --git a/Minecraft.Client/Platform/Linux/Sentient/DynamicConfigurations.h b/Minecraft.Client/Linux/Sentient/DynamicConfigurations.h similarity index 100% rename from Minecraft.Client/Platform/Linux/Sentient/DynamicConfigurations.h rename to Minecraft.Client/Linux/Sentient/DynamicConfigurations.h diff --git a/Minecraft.Client/Linux/Sentient/MinecraftTelemetry.h b/Minecraft.Client/Linux/Sentient/MinecraftTelemetry.h new file mode 100644 index 000000000..9b85def6d --- /dev/null +++ b/Minecraft.Client/Linux/Sentient/MinecraftTelemetry.h @@ -0,0 +1,4 @@ +#pragma once +#include "../../../Windows64/Source Files/Sentient/SentientTelemetryCommon.h" +#include "../../../Windows64/Source Files/Sentient/TelemetryEnum.h" +#include "../../../Windows64/Source Files/Sentient/SentientStats.h" \ No newline at end of file diff --git a/Minecraft.Client/Platform/Windows64/Sentient/SentientManager.h b/Minecraft.Client/Linux/Sentient/SentientManager.h similarity index 98% rename from Minecraft.Client/Platform/Windows64/Sentient/SentientManager.h rename to Minecraft.Client/Linux/Sentient/SentientManager.h index 8101745af..5b2a5f92c 100644 --- a/Minecraft.Client/Platform/Windows64/Sentient/SentientManager.h +++ b/Minecraft.Client/Linux/Sentient/SentientManager.h @@ -1,5 +1,5 @@ #pragma once -#include "MinecraftTelemetry.h" +#include "../../../Windows64/Source Files/Sentient/MinecraftTelemetry.h" class CSentientManager { public: diff --git a/Minecraft.Client/Platform/Linux/Sentient/SentientStats.h b/Minecraft.Client/Linux/Sentient/SentientStats.h similarity index 100% rename from Minecraft.Client/Platform/Linux/Sentient/SentientStats.h rename to Minecraft.Client/Linux/Sentient/SentientStats.h diff --git a/Minecraft.Client/Platform/Linux/Sentient/SentientTelemetryCommon.h b/Minecraft.Client/Linux/Sentient/SentientTelemetryCommon.h similarity index 100% rename from Minecraft.Client/Platform/Linux/Sentient/SentientTelemetryCommon.h rename to Minecraft.Client/Linux/Sentient/SentientTelemetryCommon.h diff --git a/Minecraft.Client/Platform/Linux/Sentient/TelemetryEnum.h b/Minecraft.Client/Linux/Sentient/TelemetryEnum.h similarity index 100% rename from Minecraft.Client/Platform/Linux/Sentient/TelemetryEnum.h rename to Minecraft.Client/Linux/Sentient/TelemetryEnum.h diff --git a/Minecraft.Client/Platform/Linux/Social/SocialManager.h b/Minecraft.Client/Linux/Social/SocialManager.h similarity index 100% rename from Minecraft.Client/Platform/Linux/Social/SocialManager.h rename to Minecraft.Client/Linux/Social/SocialManager.h diff --git a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXCollision.h b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXCollision.h similarity index 97% rename from Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXCollision.h rename to Minecraft.Client/Linux/Stubs/DirectXMath/DirectXCollision.h index b1d24621a..6605197bd 100644 --- a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXCollision.h +++ b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXCollision.h @@ -1,448 +1,448 @@ -//------------------------------------------------------------------------------------- -// DirectXCollision.h -- C++ Collision Math library -// -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. -// -// http://go.microsoft.com/fwlink/?LinkID=615560 -//------------------------------------------------------------------------------------- - -#pragma once - -#include "DirectXMath.h" - -namespace DirectX { - -enum ContainmentType { DISJOINT = 0, INTERSECTS = 1, CONTAINS = 2 }; - -enum PlaneIntersectionType { FRONT = 0, INTERSECTING = 1, BACK = 2 }; - -struct BoundingBox; -struct BoundingOrientedBox; -struct BoundingFrustum; - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4324 4820) -// C4324: alignment padding warnings -// C4820: Off by default noise -#endif - -//------------------------------------------------------------------------------------- -// Bounding sphere -//------------------------------------------------------------------------------------- -struct BoundingSphere { - XMFLOAT3 Center; // Center of the sphere. - float Radius; // Radius of the sphere. - - // Creators - BoundingSphere() noexcept : Center(0, 0, 0), Radius(1.f) {} - - BoundingSphere(const BoundingSphere&) = default; - BoundingSphere& operator=(const BoundingSphere&) = default; - - BoundingSphere(BoundingSphere&&) = default; - BoundingSphere& operator=(BoundingSphere&&) = default; - - constexpr BoundingSphere(_In_ const XMFLOAT3& center, - _In_ float radius) noexcept - : Center(center), Radius(radius) {} - - // Methods - void XM_CALLCONV Transform(_Out_ BoundingSphere& Out, - _In_ FXMMATRIX M) const noexcept; - void XM_CALLCONV Transform(_Out_ BoundingSphere& Out, _In_ float Scale, - _In_ FXMVECTOR Rotation, - _In_ FXMVECTOR Translation) const noexcept; - // Transform the sphere - - ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR Point) const noexcept; - ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, - _In_ FXMVECTOR V2) const noexcept; - ContainmentType Contains(_In_ const BoundingSphere& sh) const noexcept; - ContainmentType Contains(_In_ const BoundingBox& box) const noexcept; - ContainmentType Contains( - _In_ const BoundingOrientedBox& box) const noexcept; - ContainmentType Contains(_In_ const BoundingFrustum& fr) const noexcept; - - bool Intersects(_In_ const BoundingSphere& sh) const noexcept; - bool Intersects(_In_ const BoundingBox& box) const noexcept; - bool Intersects(_In_ const BoundingOrientedBox& box) const noexcept; - bool Intersects(_In_ const BoundingFrustum& fr) const noexcept; - - bool XM_CALLCONV Intersects(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, - _In_ FXMVECTOR V2) const noexcept; - // Triangle-sphere test - - PlaneIntersectionType XM_CALLCONV - Intersects(_In_ FXMVECTOR Plane) const noexcept; - // Plane-sphere test - - bool XM_CALLCONV Intersects(_In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, - _Out_ float& Dist) const noexcept; - // Ray-sphere test - - ContainmentType XM_CALLCONV - ContainedBy(_In_ FXMVECTOR Plane0, _In_ FXMVECTOR Plane1, - _In_ FXMVECTOR Plane2, _In_ GXMVECTOR Plane3, - _In_ HXMVECTOR Plane4, _In_ HXMVECTOR Plane5) const noexcept; - // Test sphere against six planes (see BoundingFrustum::GetPlanes) - - // Static methods - static void CreateMerged(_Out_ BoundingSphere& Out, - _In_ const BoundingSphere& S1, - _In_ const BoundingSphere& S2) noexcept; - - static void CreateFromBoundingBox(_Out_ BoundingSphere& Out, - _In_ const BoundingBox& box) noexcept; - static void CreateFromBoundingBox( - _Out_ BoundingSphere& Out, - _In_ const BoundingOrientedBox& box) noexcept; - - static void CreateFromPoints(_Out_ BoundingSphere& Out, _In_ size_t Count, - _In_reads_bytes_(sizeof(XMFLOAT3) + - Stride * (Count - 1)) - const XMFLOAT3* pPoints, - _In_ size_t Stride) noexcept; - - static void CreateFromFrustum(_Out_ BoundingSphere& Out, - _In_ const BoundingFrustum& fr) noexcept; -}; - -//------------------------------------------------------------------------------------- -// Axis-aligned bounding box -//------------------------------------------------------------------------------------- -struct BoundingBox { - static constexpr size_t CORNER_COUNT = 8; - - XMFLOAT3 Center; // Center of the box. - XMFLOAT3 Extents; // Distance from the center to each side. - - // Creators - BoundingBox() noexcept : Center(0, 0, 0), Extents(1.f, 1.f, 1.f) {} - - BoundingBox(const BoundingBox&) = default; - BoundingBox& operator=(const BoundingBox&) = default; - - BoundingBox(BoundingBox&&) = default; - BoundingBox& operator=(BoundingBox&&) = default; - - constexpr BoundingBox(_In_ const XMFLOAT3& center, - _In_ const XMFLOAT3& extents) noexcept - : Center(center), Extents(extents) {} - - // Methods - void XM_CALLCONV Transform(_Out_ BoundingBox& Out, - _In_ FXMMATRIX M) const noexcept; - void XM_CALLCONV Transform(_Out_ BoundingBox& Out, _In_ float Scale, - _In_ FXMVECTOR Rotation, - _In_ FXMVECTOR Translation) const noexcept; - - void GetCorners(_Out_writes_(8) XMFLOAT3* Corners) const noexcept; - // Gets the 8 corners of the box - - ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR Point) const noexcept; - ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, - _In_ FXMVECTOR V2) const noexcept; - ContainmentType Contains(_In_ const BoundingSphere& sh) const noexcept; - ContainmentType Contains(_In_ const BoundingBox& box) const noexcept; - ContainmentType Contains( - _In_ const BoundingOrientedBox& box) const noexcept; - ContainmentType Contains(_In_ const BoundingFrustum& fr) const noexcept; - - bool Intersects(_In_ const BoundingSphere& sh) const noexcept; - bool Intersects(_In_ const BoundingBox& box) const noexcept; - bool Intersects(_In_ const BoundingOrientedBox& box) const noexcept; - bool Intersects(_In_ const BoundingFrustum& fr) const noexcept; - - bool XM_CALLCONV Intersects(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, - _In_ FXMVECTOR V2) const noexcept; - // Triangle-Box test - - PlaneIntersectionType XM_CALLCONV - Intersects(_In_ FXMVECTOR Plane) const noexcept; - // Plane-box test - - bool XM_CALLCONV Intersects(_In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, - _Out_ float& Dist) const noexcept; - // Ray-Box test - - ContainmentType XM_CALLCONV - ContainedBy(_In_ FXMVECTOR Plane0, _In_ FXMVECTOR Plane1, - _In_ FXMVECTOR Plane2, _In_ GXMVECTOR Plane3, - _In_ HXMVECTOR Plane4, _In_ HXMVECTOR Plane5) const noexcept; - // Test box against six planes (see BoundingFrustum::GetPlanes) - - // Static methods - static void CreateMerged(_Out_ BoundingBox& Out, _In_ const BoundingBox& b1, - _In_ const BoundingBox& b2) noexcept; - - static void CreateFromSphere(_Out_ BoundingBox& Out, - _In_ const BoundingSphere& sh) noexcept; - - static void XM_CALLCONV CreateFromPoints(_Out_ BoundingBox& Out, - _In_ FXMVECTOR pt1, - _In_ FXMVECTOR pt2) noexcept; - static void CreateFromPoints(_Out_ BoundingBox& Out, _In_ size_t Count, - _In_reads_bytes_(sizeof(XMFLOAT3) + - Stride * (Count - 1)) - const XMFLOAT3* pPoints, - _In_ size_t Stride) noexcept; -}; - -//------------------------------------------------------------------------------------- -// Oriented bounding box -//------------------------------------------------------------------------------------- -struct BoundingOrientedBox { - static constexpr size_t CORNER_COUNT = 8; - - XMFLOAT3 Center; // Center of the box. - XMFLOAT3 Extents; // Distance from the center to each side. - XMFLOAT4 - Orientation; // Unit quaternion representing rotation (box -> world). - - // Creators - BoundingOrientedBox() noexcept - : Center(0, 0, 0), Extents(1.f, 1.f, 1.f), Orientation(0, 0, 0, 1.f) {} - - BoundingOrientedBox(const BoundingOrientedBox&) = default; - BoundingOrientedBox& operator=(const BoundingOrientedBox&) = default; - - BoundingOrientedBox(BoundingOrientedBox&&) = default; - BoundingOrientedBox& operator=(BoundingOrientedBox&&) = default; - - constexpr BoundingOrientedBox(_In_ const XMFLOAT3& center, - _In_ const XMFLOAT3& extents, - _In_ const XMFLOAT4& orientation) noexcept - : Center(center), Extents(extents), Orientation(orientation) {} - - // Methods - void XM_CALLCONV Transform(_Out_ BoundingOrientedBox& Out, - _In_ FXMMATRIX M) const noexcept; - void XM_CALLCONV Transform(_Out_ BoundingOrientedBox& Out, _In_ float Scale, - _In_ FXMVECTOR Rotation, - _In_ FXMVECTOR Translation) const noexcept; - - void GetCorners(_Out_writes_(8) XMFLOAT3* Corners) const noexcept; - // Gets the 8 corners of the box - - ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR Point) const noexcept; - ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, - _In_ FXMVECTOR V2) const noexcept; - ContainmentType Contains(_In_ const BoundingSphere& sh) const noexcept; - ContainmentType Contains(_In_ const BoundingBox& box) const noexcept; - ContainmentType Contains( - _In_ const BoundingOrientedBox& box) const noexcept; - ContainmentType Contains(_In_ const BoundingFrustum& fr) const noexcept; - - bool Intersects(_In_ const BoundingSphere& sh) const noexcept; - bool Intersects(_In_ const BoundingBox& box) const noexcept; - bool Intersects(_In_ const BoundingOrientedBox& box) const noexcept; - bool Intersects(_In_ const BoundingFrustum& fr) const noexcept; - - bool XM_CALLCONV Intersects(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, - _In_ FXMVECTOR V2) const noexcept; - // Triangle-OrientedBox test - - PlaneIntersectionType XM_CALLCONV - Intersects(_In_ FXMVECTOR Plane) const noexcept; - // Plane-OrientedBox test - - bool XM_CALLCONV Intersects(_In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, - _Out_ float& Dist) const noexcept; - // Ray-OrientedBox test - - ContainmentType XM_CALLCONV - ContainedBy(_In_ FXMVECTOR Plane0, _In_ FXMVECTOR Plane1, - _In_ FXMVECTOR Plane2, _In_ GXMVECTOR Plane3, - _In_ HXMVECTOR Plane4, _In_ HXMVECTOR Plane5) const noexcept; - // Test OrientedBox against six planes (see BoundingFrustum::GetPlanes) - - // Static methods - static void CreateFromBoundingBox(_Out_ BoundingOrientedBox& Out, - _In_ const BoundingBox& box) noexcept; - - static void CreateFromPoints(_Out_ BoundingOrientedBox& Out, - _In_ size_t Count, - _In_reads_bytes_(sizeof(XMFLOAT3) + - Stride * (Count - 1)) - const XMFLOAT3* pPoints, - _In_ size_t Stride) noexcept; -}; - -//------------------------------------------------------------------------------------- -// Bounding frustum -//------------------------------------------------------------------------------------- -struct BoundingFrustum { - static constexpr size_t CORNER_COUNT = 8; - - XMFLOAT3 Origin; // Origin of the frustum (and projection). - XMFLOAT4 Orientation; // Quaternion representing rotation. - - float RightSlope; // Positive X (X/Z) - float LeftSlope; // Negative X - float TopSlope; // Positive Y (Y/Z) - float BottomSlope; // Negative Y - float Near, Far; // Z of the near plane and far plane. - - // Creators - BoundingFrustum() noexcept - : Origin(0, 0, 0), - Orientation(0, 0, 0, 1.f), - RightSlope(1.f), - LeftSlope(-1.f), - TopSlope(1.f), - BottomSlope(-1.f), - Near(0), - Far(1.f) {} - - BoundingFrustum(const BoundingFrustum&) = default; - BoundingFrustum& operator=(const BoundingFrustum&) = default; - - BoundingFrustum(BoundingFrustum&&) = default; - BoundingFrustum& operator=(BoundingFrustum&&) = default; - - constexpr BoundingFrustum(_In_ const XMFLOAT3& origin, - _In_ const XMFLOAT4& orientation, - _In_ float rightSlope, _In_ float leftSlope, - _In_ float topSlope, _In_ float bottomSlope, - _In_ float nearPlane, - _In_ float farPlane) noexcept - : Origin(origin), - Orientation(orientation), - RightSlope(rightSlope), - LeftSlope(leftSlope), - TopSlope(topSlope), - BottomSlope(bottomSlope), - Near(nearPlane), - Far(farPlane) {} - BoundingFrustum(_In_ CXMMATRIX Projection, bool rhcoords = false) noexcept; - - // Methods - void XM_CALLCONV Transform(_Out_ BoundingFrustum& Out, - _In_ FXMMATRIX M) const noexcept; - void XM_CALLCONV Transform(_Out_ BoundingFrustum& Out, _In_ float Scale, - _In_ FXMVECTOR Rotation, - _In_ FXMVECTOR Translation) const noexcept; - - void GetCorners(_Out_writes_(8) XMFLOAT3* Corners) const noexcept; - // Gets the 8 corners of the frustum - - ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR Point) const noexcept; - ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, - _In_ FXMVECTOR V2) const noexcept; - ContainmentType Contains(_In_ const BoundingSphere& sp) const noexcept; - ContainmentType Contains(_In_ const BoundingBox& box) const noexcept; - ContainmentType Contains( - _In_ const BoundingOrientedBox& box) const noexcept; - ContainmentType Contains(_In_ const BoundingFrustum& fr) const noexcept; - // Frustum-Frustum test - - bool Intersects(_In_ const BoundingSphere& sh) const noexcept; - bool Intersects(_In_ const BoundingBox& box) const noexcept; - bool Intersects(_In_ const BoundingOrientedBox& box) const noexcept; - bool Intersects(_In_ const BoundingFrustum& fr) const noexcept; - - bool XM_CALLCONV Intersects(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, - _In_ FXMVECTOR V2) const noexcept; - // Triangle-Frustum test - - PlaneIntersectionType XM_CALLCONV - Intersects(_In_ FXMVECTOR Plane) const noexcept; - // Plane-Frustum test - - bool XM_CALLCONV Intersects(_In_ FXMVECTOR rayOrigin, - _In_ FXMVECTOR Direction, - _Out_ float& Dist) const noexcept; - // Ray-Frustum test - - ContainmentType XM_CALLCONV - ContainedBy(_In_ FXMVECTOR Plane0, _In_ FXMVECTOR Plane1, - _In_ FXMVECTOR Plane2, _In_ GXMVECTOR Plane3, - _In_ HXMVECTOR Plane4, _In_ HXMVECTOR Plane5) const noexcept; - // Test frustum against six planes (see BoundingFrustum::GetPlanes) - - void GetPlanes(_Out_opt_ XMVECTOR* NearPlane, _Out_opt_ XMVECTOR* FarPlane, - _Out_opt_ XMVECTOR* RightPlane, - _Out_opt_ XMVECTOR* LeftPlane, _Out_opt_ XMVECTOR* TopPlane, - _Out_opt_ XMVECTOR* BottomPlane) const noexcept; - // Create 6 Planes representation of Frustum - - // Static methods - static void XM_CALLCONV CreateFromMatrix(_Out_ BoundingFrustum& Out, - _In_ FXMMATRIX Projection, - bool rhcoords = false) noexcept; -}; - -//----------------------------------------------------------------------------- -// Triangle intersection testing routines. -//----------------------------------------------------------------------------- -namespace TriangleTests { -bool XM_CALLCONV Intersects(_In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, - _In_ FXMVECTOR V0, _In_ GXMVECTOR V1, - _In_ HXMVECTOR V2, _Out_ float& Dist) noexcept; -// Ray-Triangle - -bool XM_CALLCONV Intersects(_In_ FXMVECTOR A0, _In_ FXMVECTOR A1, - _In_ FXMVECTOR A2, _In_ GXMVECTOR B0, - _In_ HXMVECTOR B1, _In_ HXMVECTOR B2) noexcept; -// Triangle-Triangle - -PlaneIntersectionType XM_CALLCONV Intersects(_In_ FXMVECTOR V0, - _In_ FXMVECTOR V1, - _In_ FXMVECTOR V2, - _In_ GXMVECTOR Plane) noexcept; -// Plane-Triangle - -ContainmentType XM_CALLCONV -ContainedBy(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2, - _In_ GXMVECTOR Plane0, _In_ HXMVECTOR Plane1, _In_ HXMVECTOR Plane2, - _In_ CXMVECTOR Plane3, _In_ CXMVECTOR Plane4, - _In_ CXMVECTOR Plane5) noexcept; -// Test a triangle against six planes at once (see BoundingFrustum::GetPlanes) -} // namespace TriangleTests - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -/**************************************************************************** - * - * Implementation - * - ****************************************************************************/ - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4068 4365 4616 6001) -// C4068/4616: ignore unknown pragmas -// C4365: Off by default noise -// C6001: False positives -#endif - -#ifdef _PREFAST_ -#pragma prefast(push) -#pragma prefast(disable : 25000, "FXMVECTOR is 16 bytes") -#pragma prefast(disable : 26495, "Union initialization confuses /analyze") -#endif - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wfloat-equal" -#pragma clang diagnostic ignored "-Wunknown-warning-option" -#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" -#endif - -#include "DirectXCollision.inl" - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif -#ifdef _PREFAST_ -#pragma prefast(pop) -#endif -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -} // namespace DirectX +//------------------------------------------------------------------------------------- +// DirectXCollision.h -- C++ Collision Math library +// +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +// +// http://go.microsoft.com/fwlink/?LinkID=615560 +//------------------------------------------------------------------------------------- + +#pragma once + +#include "DirectXMath.h" + +namespace DirectX { + +enum ContainmentType { DISJOINT = 0, INTERSECTS = 1, CONTAINS = 2 }; + +enum PlaneIntersectionType { FRONT = 0, INTERSECTING = 1, BACK = 2 }; + +struct BoundingBox; +struct BoundingOrientedBox; +struct BoundingFrustum; + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4324 4820) +// C4324: alignment padding warnings +// C4820: Off by default noise +#endif + +//------------------------------------------------------------------------------------- +// Bounding sphere +//------------------------------------------------------------------------------------- +struct BoundingSphere { + XMFLOAT3 Center; // Center of the sphere. + float Radius; // Radius of the sphere. + + // Creators + BoundingSphere() noexcept : Center(0, 0, 0), Radius(1.f) {} + + BoundingSphere(const BoundingSphere&) = default; + BoundingSphere& operator=(const BoundingSphere&) = default; + + BoundingSphere(BoundingSphere&&) = default; + BoundingSphere& operator=(BoundingSphere&&) = default; + + constexpr BoundingSphere(_In_ const XMFLOAT3& center, + _In_ float radius) noexcept + : Center(center), Radius(radius) {} + + // Methods + void XM_CALLCONV Transform(_Out_ BoundingSphere& Out, + _In_ FXMMATRIX M) const noexcept; + void XM_CALLCONV Transform(_Out_ BoundingSphere& Out, _In_ float Scale, + _In_ FXMVECTOR Rotation, + _In_ FXMVECTOR Translation) const noexcept; + // Transform the sphere + + ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR Point) const noexcept; + ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, + _In_ FXMVECTOR V2) const noexcept; + ContainmentType Contains(_In_ const BoundingSphere& sh) const noexcept; + ContainmentType Contains(_In_ const BoundingBox& box) const noexcept; + ContainmentType Contains( + _In_ const BoundingOrientedBox& box) const noexcept; + ContainmentType Contains(_In_ const BoundingFrustum& fr) const noexcept; + + bool Intersects(_In_ const BoundingSphere& sh) const noexcept; + bool Intersects(_In_ const BoundingBox& box) const noexcept; + bool Intersects(_In_ const BoundingOrientedBox& box) const noexcept; + bool Intersects(_In_ const BoundingFrustum& fr) const noexcept; + + bool XM_CALLCONV Intersects(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, + _In_ FXMVECTOR V2) const noexcept; + // Triangle-sphere test + + PlaneIntersectionType XM_CALLCONV + Intersects(_In_ FXMVECTOR Plane) const noexcept; + // Plane-sphere test + + bool XM_CALLCONV Intersects(_In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, + _Out_ float& Dist) const noexcept; + // Ray-sphere test + + ContainmentType XM_CALLCONV + ContainedBy(_In_ FXMVECTOR Plane0, _In_ FXMVECTOR Plane1, + _In_ FXMVECTOR Plane2, _In_ GXMVECTOR Plane3, + _In_ HXMVECTOR Plane4, _In_ HXMVECTOR Plane5) const noexcept; + // Test sphere against six planes (see BoundingFrustum::GetPlanes) + + // Static methods + static void CreateMerged(_Out_ BoundingSphere& Out, + _In_ const BoundingSphere& S1, + _In_ const BoundingSphere& S2) noexcept; + + static void CreateFromBoundingBox(_Out_ BoundingSphere& Out, + _In_ const BoundingBox& box) noexcept; + static void CreateFromBoundingBox( + _Out_ BoundingSphere& Out, + _In_ const BoundingOrientedBox& box) noexcept; + + static void CreateFromPoints(_Out_ BoundingSphere& Out, _In_ size_t Count, + _In_reads_bytes_(sizeof(XMFLOAT3) + + Stride * (Count - 1)) + const XMFLOAT3* pPoints, + _In_ size_t Stride) noexcept; + + static void CreateFromFrustum(_Out_ BoundingSphere& Out, + _In_ const BoundingFrustum& fr) noexcept; +}; + +//------------------------------------------------------------------------------------- +// Axis-aligned bounding box +//------------------------------------------------------------------------------------- +struct BoundingBox { + static constexpr size_t CORNER_COUNT = 8; + + XMFLOAT3 Center; // Center of the box. + XMFLOAT3 Extents; // Distance from the center to each side. + + // Creators + BoundingBox() noexcept : Center(0, 0, 0), Extents(1.f, 1.f, 1.f) {} + + BoundingBox(const BoundingBox&) = default; + BoundingBox& operator=(const BoundingBox&) = default; + + BoundingBox(BoundingBox&&) = default; + BoundingBox& operator=(BoundingBox&&) = default; + + constexpr BoundingBox(_In_ const XMFLOAT3& center, + _In_ const XMFLOAT3& extents) noexcept + : Center(center), Extents(extents) {} + + // Methods + void XM_CALLCONV Transform(_Out_ BoundingBox& Out, + _In_ FXMMATRIX M) const noexcept; + void XM_CALLCONV Transform(_Out_ BoundingBox& Out, _In_ float Scale, + _In_ FXMVECTOR Rotation, + _In_ FXMVECTOR Translation) const noexcept; + + void GetCorners(_Out_writes_(8) XMFLOAT3* Corners) const noexcept; + // Gets the 8 corners of the box + + ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR Point) const noexcept; + ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, + _In_ FXMVECTOR V2) const noexcept; + ContainmentType Contains(_In_ const BoundingSphere& sh) const noexcept; + ContainmentType Contains(_In_ const BoundingBox& box) const noexcept; + ContainmentType Contains( + _In_ const BoundingOrientedBox& box) const noexcept; + ContainmentType Contains(_In_ const BoundingFrustum& fr) const noexcept; + + bool Intersects(_In_ const BoundingSphere& sh) const noexcept; + bool Intersects(_In_ const BoundingBox& box) const noexcept; + bool Intersects(_In_ const BoundingOrientedBox& box) const noexcept; + bool Intersects(_In_ const BoundingFrustum& fr) const noexcept; + + bool XM_CALLCONV Intersects(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, + _In_ FXMVECTOR V2) const noexcept; + // Triangle-Box test + + PlaneIntersectionType XM_CALLCONV + Intersects(_In_ FXMVECTOR Plane) const noexcept; + // Plane-box test + + bool XM_CALLCONV Intersects(_In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, + _Out_ float& Dist) const noexcept; + // Ray-Box test + + ContainmentType XM_CALLCONV + ContainedBy(_In_ FXMVECTOR Plane0, _In_ FXMVECTOR Plane1, + _In_ FXMVECTOR Plane2, _In_ GXMVECTOR Plane3, + _In_ HXMVECTOR Plane4, _In_ HXMVECTOR Plane5) const noexcept; + // Test box against six planes (see BoundingFrustum::GetPlanes) + + // Static methods + static void CreateMerged(_Out_ BoundingBox& Out, _In_ const BoundingBox& b1, + _In_ const BoundingBox& b2) noexcept; + + static void CreateFromSphere(_Out_ BoundingBox& Out, + _In_ const BoundingSphere& sh) noexcept; + + static void XM_CALLCONV CreateFromPoints(_Out_ BoundingBox& Out, + _In_ FXMVECTOR pt1, + _In_ FXMVECTOR pt2) noexcept; + static void CreateFromPoints(_Out_ BoundingBox& Out, _In_ size_t Count, + _In_reads_bytes_(sizeof(XMFLOAT3) + + Stride * (Count - 1)) + const XMFLOAT3* pPoints, + _In_ size_t Stride) noexcept; +}; + +//------------------------------------------------------------------------------------- +// Oriented bounding box +//------------------------------------------------------------------------------------- +struct BoundingOrientedBox { + static constexpr size_t CORNER_COUNT = 8; + + XMFLOAT3 Center; // Center of the box. + XMFLOAT3 Extents; // Distance from the center to each side. + XMFLOAT4 + Orientation; // Unit quaternion representing rotation (box -> world). + + // Creators + BoundingOrientedBox() noexcept + : Center(0, 0, 0), Extents(1.f, 1.f, 1.f), Orientation(0, 0, 0, 1.f) {} + + BoundingOrientedBox(const BoundingOrientedBox&) = default; + BoundingOrientedBox& operator=(const BoundingOrientedBox&) = default; + + BoundingOrientedBox(BoundingOrientedBox&&) = default; + BoundingOrientedBox& operator=(BoundingOrientedBox&&) = default; + + constexpr BoundingOrientedBox(_In_ const XMFLOAT3& center, + _In_ const XMFLOAT3& extents, + _In_ const XMFLOAT4& orientation) noexcept + : Center(center), Extents(extents), Orientation(orientation) {} + + // Methods + void XM_CALLCONV Transform(_Out_ BoundingOrientedBox& Out, + _In_ FXMMATRIX M) const noexcept; + void XM_CALLCONV Transform(_Out_ BoundingOrientedBox& Out, _In_ float Scale, + _In_ FXMVECTOR Rotation, + _In_ FXMVECTOR Translation) const noexcept; + + void GetCorners(_Out_writes_(8) XMFLOAT3* Corners) const noexcept; + // Gets the 8 corners of the box + + ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR Point) const noexcept; + ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, + _In_ FXMVECTOR V2) const noexcept; + ContainmentType Contains(_In_ const BoundingSphere& sh) const noexcept; + ContainmentType Contains(_In_ const BoundingBox& box) const noexcept; + ContainmentType Contains( + _In_ const BoundingOrientedBox& box) const noexcept; + ContainmentType Contains(_In_ const BoundingFrustum& fr) const noexcept; + + bool Intersects(_In_ const BoundingSphere& sh) const noexcept; + bool Intersects(_In_ const BoundingBox& box) const noexcept; + bool Intersects(_In_ const BoundingOrientedBox& box) const noexcept; + bool Intersects(_In_ const BoundingFrustum& fr) const noexcept; + + bool XM_CALLCONV Intersects(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, + _In_ FXMVECTOR V2) const noexcept; + // Triangle-OrientedBox test + + PlaneIntersectionType XM_CALLCONV + Intersects(_In_ FXMVECTOR Plane) const noexcept; + // Plane-OrientedBox test + + bool XM_CALLCONV Intersects(_In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, + _Out_ float& Dist) const noexcept; + // Ray-OrientedBox test + + ContainmentType XM_CALLCONV + ContainedBy(_In_ FXMVECTOR Plane0, _In_ FXMVECTOR Plane1, + _In_ FXMVECTOR Plane2, _In_ GXMVECTOR Plane3, + _In_ HXMVECTOR Plane4, _In_ HXMVECTOR Plane5) const noexcept; + // Test OrientedBox against six planes (see BoundingFrustum::GetPlanes) + + // Static methods + static void CreateFromBoundingBox(_Out_ BoundingOrientedBox& Out, + _In_ const BoundingBox& box) noexcept; + + static void CreateFromPoints(_Out_ BoundingOrientedBox& Out, + _In_ size_t Count, + _In_reads_bytes_(sizeof(XMFLOAT3) + + Stride * (Count - 1)) + const XMFLOAT3* pPoints, + _In_ size_t Stride) noexcept; +}; + +//------------------------------------------------------------------------------------- +// Bounding frustum +//------------------------------------------------------------------------------------- +struct BoundingFrustum { + static constexpr size_t CORNER_COUNT = 8; + + XMFLOAT3 Origin; // Origin of the frustum (and projection). + XMFLOAT4 Orientation; // Quaternion representing rotation. + + float RightSlope; // Positive X (X/Z) + float LeftSlope; // Negative X + float TopSlope; // Positive Y (Y/Z) + float BottomSlope; // Negative Y + float Near, Far; // Z of the near plane and far plane. + + // Creators + BoundingFrustum() noexcept + : Origin(0, 0, 0), + Orientation(0, 0, 0, 1.f), + RightSlope(1.f), + LeftSlope(-1.f), + TopSlope(1.f), + BottomSlope(-1.f), + Near(0), + Far(1.f) {} + + BoundingFrustum(const BoundingFrustum&) = default; + BoundingFrustum& operator=(const BoundingFrustum&) = default; + + BoundingFrustum(BoundingFrustum&&) = default; + BoundingFrustum& operator=(BoundingFrustum&&) = default; + + constexpr BoundingFrustum(_In_ const XMFLOAT3& origin, + _In_ const XMFLOAT4& orientation, + _In_ float rightSlope, _In_ float leftSlope, + _In_ float topSlope, _In_ float bottomSlope, + _In_ float nearPlane, + _In_ float farPlane) noexcept + : Origin(origin), + Orientation(orientation), + RightSlope(rightSlope), + LeftSlope(leftSlope), + TopSlope(topSlope), + BottomSlope(bottomSlope), + Near(nearPlane), + Far(farPlane) {} + BoundingFrustum(_In_ CXMMATRIX Projection, bool rhcoords = false) noexcept; + + // Methods + void XM_CALLCONV Transform(_Out_ BoundingFrustum& Out, + _In_ FXMMATRIX M) const noexcept; + void XM_CALLCONV Transform(_Out_ BoundingFrustum& Out, _In_ float Scale, + _In_ FXMVECTOR Rotation, + _In_ FXMVECTOR Translation) const noexcept; + + void GetCorners(_Out_writes_(8) XMFLOAT3* Corners) const noexcept; + // Gets the 8 corners of the frustum + + ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR Point) const noexcept; + ContainmentType XM_CALLCONV Contains(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, + _In_ FXMVECTOR V2) const noexcept; + ContainmentType Contains(_In_ const BoundingSphere& sp) const noexcept; + ContainmentType Contains(_In_ const BoundingBox& box) const noexcept; + ContainmentType Contains( + _In_ const BoundingOrientedBox& box) const noexcept; + ContainmentType Contains(_In_ const BoundingFrustum& fr) const noexcept; + // Frustum-Frustum test + + bool Intersects(_In_ const BoundingSphere& sh) const noexcept; + bool Intersects(_In_ const BoundingBox& box) const noexcept; + bool Intersects(_In_ const BoundingOrientedBox& box) const noexcept; + bool Intersects(_In_ const BoundingFrustum& fr) const noexcept; + + bool XM_CALLCONV Intersects(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, + _In_ FXMVECTOR V2) const noexcept; + // Triangle-Frustum test + + PlaneIntersectionType XM_CALLCONV + Intersects(_In_ FXMVECTOR Plane) const noexcept; + // Plane-Frustum test + + bool XM_CALLCONV Intersects(_In_ FXMVECTOR rayOrigin, + _In_ FXMVECTOR Direction, + _Out_ float& Dist) const noexcept; + // Ray-Frustum test + + ContainmentType XM_CALLCONV + ContainedBy(_In_ FXMVECTOR Plane0, _In_ FXMVECTOR Plane1, + _In_ FXMVECTOR Plane2, _In_ GXMVECTOR Plane3, + _In_ HXMVECTOR Plane4, _In_ HXMVECTOR Plane5) const noexcept; + // Test frustum against six planes (see BoundingFrustum::GetPlanes) + + void GetPlanes(_Out_opt_ XMVECTOR* NearPlane, _Out_opt_ XMVECTOR* FarPlane, + _Out_opt_ XMVECTOR* RightPlane, + _Out_opt_ XMVECTOR* LeftPlane, _Out_opt_ XMVECTOR* TopPlane, + _Out_opt_ XMVECTOR* BottomPlane) const noexcept; + // Create 6 Planes representation of Frustum + + // Static methods + static void XM_CALLCONV CreateFromMatrix(_Out_ BoundingFrustum& Out, + _In_ FXMMATRIX Projection, + bool rhcoords = false) noexcept; +}; + +//----------------------------------------------------------------------------- +// Triangle intersection testing routines. +//----------------------------------------------------------------------------- +namespace TriangleTests { +bool XM_CALLCONV Intersects(_In_ FXMVECTOR Origin, _In_ FXMVECTOR Direction, + _In_ FXMVECTOR V0, _In_ GXMVECTOR V1, + _In_ HXMVECTOR V2, _Out_ float& Dist) noexcept; +// Ray-Triangle + +bool XM_CALLCONV Intersects(_In_ FXMVECTOR A0, _In_ FXMVECTOR A1, + _In_ FXMVECTOR A2, _In_ GXMVECTOR B0, + _In_ HXMVECTOR B1, _In_ HXMVECTOR B2) noexcept; +// Triangle-Triangle + +PlaneIntersectionType XM_CALLCONV Intersects(_In_ FXMVECTOR V0, + _In_ FXMVECTOR V1, + _In_ FXMVECTOR V2, + _In_ GXMVECTOR Plane) noexcept; +// Plane-Triangle + +ContainmentType XM_CALLCONV +ContainedBy(_In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ FXMVECTOR V2, + _In_ GXMVECTOR Plane0, _In_ HXMVECTOR Plane1, _In_ HXMVECTOR Plane2, + _In_ CXMVECTOR Plane3, _In_ CXMVECTOR Plane4, + _In_ CXMVECTOR Plane5) noexcept; +// Test a triangle against six planes at once (see BoundingFrustum::GetPlanes) +} // namespace TriangleTests + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +/**************************************************************************** + * + * Implementation + * + ****************************************************************************/ + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4068 4365 4616 6001) +// C4068/4616: ignore unknown pragmas +// C4365: Off by default noise +// C6001: False positives +#endif + +#ifdef _PREFAST_ +#pragma prefast(push) +#pragma prefast(disable : 25000, "FXMVECTOR is 16 bytes") +#pragma prefast(disable : 26495, "Union initialization confuses /analyze") +#endif + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wfloat-equal" +#pragma clang diagnostic ignored "-Wunknown-warning-option" +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" +#endif + +#include "DirectXCollision.inl" + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +#ifdef _PREFAST_ +#pragma prefast(pop) +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +} // namespace DirectX diff --git a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXCollision.inl b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXCollision.inl similarity index 97% rename from Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXCollision.inl rename to Minecraft.Client/Linux/Stubs/DirectXMath/DirectXCollision.inl index ab8b68396..39bb5ac7c 100644 --- a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXCollision.inl +++ b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXCollision.inl @@ -1,4816 +1,4816 @@ -//------------------------------------------------------------------------------------- -// DirectXCollision.inl -- C++ Collision Math library -// -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. -// -// http://go.microsoft.com/fwlink/?LinkID=615560 -//------------------------------------------------------------------------------------- - -#pragma once - -XMGLOBALCONST XMVECTORF32 g_BoxOffset[8] = -{ - { { { -1.0f, -1.0f, 1.0f, 0.0f } } }, - { { { 1.0f, -1.0f, 1.0f, 0.0f } } }, - { { { 1.0f, 1.0f, 1.0f, 0.0f } } }, - { { { -1.0f, 1.0f, 1.0f, 0.0f } } }, - { { { -1.0f, -1.0f, -1.0f, 0.0f } } }, - { { { 1.0f, -1.0f, -1.0f, 0.0f } } }, - { { { 1.0f, 1.0f, -1.0f, 0.0f } } }, - { { { -1.0f, 1.0f, -1.0f, 0.0f } } }, -}; - -XMGLOBALCONST XMVECTORF32 g_RayEpsilon = { { { 1e-20f, 1e-20f, 1e-20f, 1e-20f } } }; -XMGLOBALCONST XMVECTORF32 g_RayNegEpsilon = { { { -1e-20f, -1e-20f, -1e-20f, -1e-20f } } }; -XMGLOBALCONST XMVECTORF32 g_FltMin = { { { -FLT_MAX, -FLT_MAX, -FLT_MAX, -FLT_MAX } } }; -XMGLOBALCONST XMVECTORF32 g_FltMax = { { { FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX } } }; - -namespace MathInternal -{ - - //----------------------------------------------------------------------------- - // Return true if any of the elements of a 3 vector are equal to 0xffffffff. - // Slightly more efficient than using XMVector3EqualInt. - //----------------------------------------------------------------------------- - inline bool XMVector3AnyTrue(_In_ FXMVECTOR V) noexcept - { - // Duplicate the fourth element from the first element. - XMVECTOR C = XMVectorSwizzle(V); - - return XMComparisonAnyTrue(XMVector4EqualIntR(C, XMVectorTrueInt())); - } - - - //----------------------------------------------------------------------------- - // Return true if all of the elements of a 3 vector are equal to 0xffffffff. - // Slightly more efficient than using XMVector3EqualInt. - //----------------------------------------------------------------------------- - inline bool XMVector3AllTrue(_In_ FXMVECTOR V) noexcept - { - // Duplicate the fourth element from the first element. - XMVECTOR C = XMVectorSwizzle(V); - - return XMComparisonAllTrue(XMVector4EqualIntR(C, XMVectorTrueInt())); - } - -#if defined(_PREFAST_) || !defined(NDEBUG) - - XMGLOBALCONST XMVECTORF32 g_UnitVectorEpsilon = { { { 1.0e-4f, 1.0e-4f, 1.0e-4f, 1.0e-4f } } }; - XMGLOBALCONST XMVECTORF32 g_UnitQuaternionEpsilon = { { { 1.0e-4f, 1.0e-4f, 1.0e-4f, 1.0e-4f } } }; - XMGLOBALCONST XMVECTORF32 g_UnitPlaneEpsilon = { { { 1.0e-4f, 1.0e-4f, 1.0e-4f, 1.0e-4f } } }; - - //----------------------------------------------------------------------------- - // Return true if the vector is a unit vector (length == 1). - //----------------------------------------------------------------------------- - inline bool XMVector3IsUnit(_In_ FXMVECTOR V) noexcept - { - XMVECTOR Difference = XMVectorSubtract(XMVector3Length(V), XMVectorSplatOne()); - return XMVector4Less(XMVectorAbs(Difference), g_UnitVectorEpsilon); - } - - //----------------------------------------------------------------------------- - // Return true if the quaterion is a unit quaternion. - //----------------------------------------------------------------------------- - inline bool XMQuaternionIsUnit(_In_ FXMVECTOR Q) noexcept - { - XMVECTOR Difference = XMVectorSubtract(XMVector4Length(Q), XMVectorSplatOne()); - return XMVector4Less(XMVectorAbs(Difference), g_UnitQuaternionEpsilon); - } - - //----------------------------------------------------------------------------- - // Return true if the plane is a unit plane. - //----------------------------------------------------------------------------- - inline bool XMPlaneIsUnit(_In_ FXMVECTOR Plane) noexcept - { - XMVECTOR Difference = XMVectorSubtract(XMVector3Length(Plane), XMVectorSplatOne()); - return XMVector4Less(XMVectorAbs(Difference), g_UnitPlaneEpsilon); - } - -#endif // _PREFAST_ || !NDEBUG - - //----------------------------------------------------------------------------- - inline XMVECTOR XMPlaneTransform(_In_ FXMVECTOR Plane, _In_ FXMVECTOR Rotation, _In_ FXMVECTOR Translation) noexcept - { - XMVECTOR vNormal = XMVector3Rotate(Plane, Rotation); - XMVECTOR vD = XMVectorSubtract(XMVectorSplatW(Plane), XMVector3Dot(vNormal, Translation)); - - return XMVectorInsert<0, 0, 0, 0, 1>(vNormal, vD); - } - - //----------------------------------------------------------------------------- - // Return the point on the line segement (S1, S2) nearest the point P. - //----------------------------------------------------------------------------- - inline XMVECTOR PointOnLineSegmentNearestPoint(_In_ FXMVECTOR S1, _In_ FXMVECTOR S2, _In_ FXMVECTOR P) noexcept - { - XMVECTOR Dir = XMVectorSubtract(S2, S1); - XMVECTOR Projection = XMVectorSubtract(XMVector3Dot(P, Dir), XMVector3Dot(S1, Dir)); - XMVECTOR LengthSq = XMVector3Dot(Dir, Dir); - - XMVECTOR t = XMVectorMultiply(Projection, XMVectorReciprocal(LengthSq)); - XMVECTOR Point = XMVectorMultiplyAdd(t, Dir, S1); - - // t < 0 - XMVECTOR SelectS1 = XMVectorLess(Projection, XMVectorZero()); - Point = XMVectorSelect(Point, S1, SelectS1); - - // t > 1 - XMVECTOR SelectS2 = XMVectorGreater(Projection, LengthSq); - Point = XMVectorSelect(Point, S2, SelectS2); - - return Point; - } - - //----------------------------------------------------------------------------- - // Test if the point (P) on the plane of the triangle is inside the triangle - // (V0, V1, V2). - //----------------------------------------------------------------------------- - inline XMVECTOR XM_CALLCONV PointOnPlaneInsideTriangle(_In_ FXMVECTOR P, _In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ GXMVECTOR V2) noexcept - { - // Compute the triangle normal. - XMVECTOR N = XMVector3Cross(XMVectorSubtract(V2, V0), XMVectorSubtract(V1, V0)); - - // Compute the cross products of the vector from the base of each edge to - // the point with each edge vector. - XMVECTOR C0 = XMVector3Cross(XMVectorSubtract(P, V0), XMVectorSubtract(V1, V0)); - XMVECTOR C1 = XMVector3Cross(XMVectorSubtract(P, V1), XMVectorSubtract(V2, V1)); - XMVECTOR C2 = XMVector3Cross(XMVectorSubtract(P, V2), XMVectorSubtract(V0, V2)); - - // If the cross product points in the same direction as the normal the the - // point is inside the edge (it is zero if is on the edge). - XMVECTOR Zero = XMVectorZero(); - XMVECTOR Inside0 = XMVectorGreaterOrEqual(XMVector3Dot(C0, N), Zero); - XMVECTOR Inside1 = XMVectorGreaterOrEqual(XMVector3Dot(C1, N), Zero); - XMVECTOR Inside2 = XMVectorGreaterOrEqual(XMVector3Dot(C2, N), Zero); - - // If the point inside all of the edges it is inside. - return XMVectorAndInt(XMVectorAndInt(Inside0, Inside1), Inside2); - } - - //----------------------------------------------------------------------------- - inline bool SolveCubic(_In_ float e, _In_ float f, _In_ float g, _Out_ float* t, _Out_ float* u, _Out_ float* v) noexcept - { - float p, q, h, rc, d, theta, costh3, sinth3; - - p = f - e * e / 3.0f; - q = g - e * f / 3.0f + e * e * e * 2.0f / 27.0f; - h = q * q / 4.0f + p * p * p / 27.0f; - - if (h > 0) - { - *t = *u = *v = 0.f; - return false; // only one real root - } - - if ((h == 0) && (q == 0)) // all the same root - { - *t = -e / 3; - *u = -e / 3; - *v = -e / 3; - - return true; - } - - d = sqrtf(q * q / 4.0f - h); - if (d < 0) - rc = -powf(-d, 1.0f / 3.0f); - else - rc = powf(d, 1.0f / 3.0f); - - theta = XMScalarACos(-q / (2.0f * d)); - costh3 = XMScalarCos(theta / 3.0f); - sinth3 = sqrtf(3.0f) * XMScalarSin(theta / 3.0f); - *t = 2.0f * rc * costh3 - e / 3.0f; - *u = -rc * (costh3 + sinth3) - e / 3.0f; - *v = -rc * (costh3 - sinth3) - e / 3.0f; - - return true; - } - - //----------------------------------------------------------------------------- - inline XMVECTOR CalculateEigenVector(_In_ float m11, _In_ float m12, _In_ float m13, - _In_ float m22, _In_ float m23, _In_ float m33, _In_ float e) noexcept - { - float fTmp[3]; - fTmp[0] = m12 * m23 - m13 * (m22 - e); - fTmp[1] = m13 * m12 - m23 * (m11 - e); - fTmp[2] = (m11 - e) * (m22 - e) - m12 * m12; - - XMVECTOR vTmp = XMLoadFloat3(reinterpret_cast(fTmp)); - - if (XMVector3Equal(vTmp, XMVectorZero())) // planar or linear - { - float f1, f2, f3; - - // we only have one equation - find a valid one - if ((m11 - e != 0) || (m12 != 0) || (m13 != 0)) - { - f1 = m11 - e; f2 = m12; f3 = m13; - } - else if ((m12 != 0) || (m22 - e != 0) || (m23 != 0)) - { - f1 = m12; f2 = m22 - e; f3 = m23; - } - else if ((m13 != 0) || (m23 != 0) || (m33 - e != 0)) - { - f1 = m13; f2 = m23; f3 = m33 - e; - } - else - { - // error, we'll just make something up - we have NO context - f1 = 1.0f; f2 = 0.0f; f3 = 0.0f; - } - - if (f1 == 0) - vTmp = XMVectorSetX(vTmp, 0.0f); - else - vTmp = XMVectorSetX(vTmp, 1.0f); - - if (f2 == 0) - vTmp = XMVectorSetY(vTmp, 0.0f); - else - vTmp = XMVectorSetY(vTmp, 1.0f); - - if (f3 == 0) - { - vTmp = XMVectorSetZ(vTmp, 0.0f); - // recalculate y to make equation work - if (m12 != 0) - vTmp = XMVectorSetY(vTmp, -f1 / f2); - } - else - { - vTmp = XMVectorSetZ(vTmp, (f2 - f1) / f3); - } - } - - if (XMVectorGetX(XMVector3LengthSq(vTmp)) > 1e-5f) - { - return XMVector3Normalize(vTmp); - } - else - { - // Multiply by a value large enough to make the vector non-zero. - vTmp = XMVectorScale(vTmp, 1e5f); - return XMVector3Normalize(vTmp); - } - } - - //----------------------------------------------------------------------------- - inline bool CalculateEigenVectors(_In_ float m11, _In_ float m12, _In_ float m13, - _In_ float m22, _In_ float m23, _In_ float m33, - _In_ float e1, _In_ float e2, _In_ float e3, - _Out_ XMVECTOR* pV1, _Out_ XMVECTOR* pV2, _Out_ XMVECTOR* pV3) noexcept - { - *pV1 = DirectX::MathInternal::CalculateEigenVector(m11, m12, m13, m22, m23, m33, e1); - *pV2 = DirectX::MathInternal::CalculateEigenVector(m11, m12, m13, m22, m23, m33, e2); - *pV3 = DirectX::MathInternal::CalculateEigenVector(m11, m12, m13, m22, m23, m33, e3); - - bool v1z = false; - bool v2z = false; - bool v3z = false; - - XMVECTOR Zero = XMVectorZero(); - - if (XMVector3Equal(*pV1, Zero)) - v1z = true; - - if (XMVector3Equal(*pV2, Zero)) - v2z = true; - - if (XMVector3Equal(*pV3, Zero)) - v3z = true; - - bool e12 = (fabsf(XMVectorGetX(XMVector3Dot(*pV1, *pV2))) > 0.1f); // check for non-orthogonal vectors - bool e13 = (fabsf(XMVectorGetX(XMVector3Dot(*pV1, *pV3))) > 0.1f); - bool e23 = (fabsf(XMVectorGetX(XMVector3Dot(*pV2, *pV3))) > 0.1f); - - if ((v1z && v2z && v3z) || (e12 && e13 && e23) || - (e12 && v3z) || (e13 && v2z) || (e23 && v1z)) // all eigenvectors are 0- any basis set - { - *pV1 = g_XMIdentityR0.v; - *pV2 = g_XMIdentityR1.v; - *pV3 = g_XMIdentityR2.v; - return true; - } - - if (v1z && v2z) - { - XMVECTOR vTmp = XMVector3Cross(g_XMIdentityR1, *pV3); - if (XMVectorGetX(XMVector3LengthSq(vTmp)) < 1e-5f) - { - vTmp = XMVector3Cross(g_XMIdentityR0, *pV3); - } - *pV1 = XMVector3Normalize(vTmp); - *pV2 = XMVector3Cross(*pV3, *pV1); - return true; - } - - if (v3z && v1z) - { - XMVECTOR vTmp = XMVector3Cross(g_XMIdentityR1, *pV2); - if (XMVectorGetX(XMVector3LengthSq(vTmp)) < 1e-5f) - { - vTmp = XMVector3Cross(g_XMIdentityR0, *pV2); - } - *pV3 = XMVector3Normalize(vTmp); - *pV1 = XMVector3Cross(*pV2, *pV3); - return true; - } - - if (v2z && v3z) - { - XMVECTOR vTmp = XMVector3Cross(g_XMIdentityR1, *pV1); - if (XMVectorGetX(XMVector3LengthSq(vTmp)) < 1e-5f) - { - vTmp = XMVector3Cross(g_XMIdentityR0, *pV1); - } - *pV2 = XMVector3Normalize(vTmp); - *pV3 = XMVector3Cross(*pV1, *pV2); - return true; - } - - if ((v1z) || e12) - { - *pV1 = XMVector3Cross(*pV2, *pV3); - return true; - } - - if ((v2z) || e23) - { - *pV2 = XMVector3Cross(*pV3, *pV1); - return true; - } - - if ((v3z) || e13) - { - *pV3 = XMVector3Cross(*pV1, *pV2); - return true; - } - - return true; - } - - //----------------------------------------------------------------------------- - inline bool CalculateEigenVectorsFromCovarianceMatrix(_In_ float Cxx, _In_ float Cyy, _In_ float Czz, - _In_ float Cxy, _In_ float Cxz, _In_ float Cyz, - _Out_ XMVECTOR* pV1, _Out_ XMVECTOR* pV2, _Out_ XMVECTOR* pV3) noexcept - { - // Calculate the eigenvalues by solving a cubic equation. - float e = -(Cxx + Cyy + Czz); - float f = Cxx * Cyy + Cyy * Czz + Czz * Cxx - Cxy * Cxy - Cxz * Cxz - Cyz * Cyz; - float g = Cxy * Cxy * Czz + Cxz * Cxz * Cyy + Cyz * Cyz * Cxx - Cxy * Cyz * Cxz * 2.0f - Cxx * Cyy * Czz; - - float ev1, ev2, ev3; - if (!DirectX::MathInternal::SolveCubic(e, f, g, &ev1, &ev2, &ev3)) - { - // set them to arbitrary orthonormal basis set - *pV1 = g_XMIdentityR0.v; - *pV2 = g_XMIdentityR1.v; - *pV3 = g_XMIdentityR2.v; - return false; - } - - return DirectX::MathInternal::CalculateEigenVectors(Cxx, Cxy, Cxz, Cyy, Cyz, Czz, ev1, ev2, ev3, pV1, pV2, pV3); - } - - //----------------------------------------------------------------------------- - inline void XM_CALLCONV FastIntersectTrianglePlane( - FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2, - GXMVECTOR Plane, - XMVECTOR& Outside, XMVECTOR& Inside) noexcept - { - // Plane0 - XMVECTOR Dist0 = XMVector4Dot(V0, Plane); - XMVECTOR Dist1 = XMVector4Dot(V1, Plane); - XMVECTOR Dist2 = XMVector4Dot(V2, Plane); - - XMVECTOR MinDist = XMVectorMin(Dist0, Dist1); - MinDist = XMVectorMin(MinDist, Dist2); - - XMVECTOR MaxDist = XMVectorMax(Dist0, Dist1); - MaxDist = XMVectorMax(MaxDist, Dist2); - - XMVECTOR Zero = XMVectorZero(); - - // Outside the plane? - Outside = XMVectorGreater(MinDist, Zero); - - // Fully inside the plane? - Inside = XMVectorLess(MaxDist, Zero); - } - - //----------------------------------------------------------------------------- - inline void FastIntersectSpherePlane(_In_ FXMVECTOR Center, _In_ FXMVECTOR Radius, _In_ FXMVECTOR Plane, - _Out_ XMVECTOR& Outside, _Out_ XMVECTOR& Inside) noexcept - { - XMVECTOR Dist = XMVector4Dot(Center, Plane); - - // Outside the plane? - Outside = XMVectorGreater(Dist, Radius); - - // Fully inside the plane? - Inside = XMVectorLess(Dist, XMVectorNegate(Radius)); - } - - //----------------------------------------------------------------------------- - inline void FastIntersectAxisAlignedBoxPlane(_In_ FXMVECTOR Center, _In_ FXMVECTOR Extents, _In_ FXMVECTOR Plane, - _Out_ XMVECTOR& Outside, _Out_ XMVECTOR& Inside) noexcept - { - // Compute the distance to the center of the box. - XMVECTOR Dist = XMVector4Dot(Center, Plane); - - // Project the axes of the box onto the normal of the plane. Half the - // length of the projection (sometime called the "radius") is equal to - // h(u) * abs(n dot b(u))) + h(v) * abs(n dot b(v)) + h(w) * abs(n dot b(w)) - // where h(i) are extents of the box, n is the plane normal, and b(i) are the - // axes of the box. In this case b(i) = [(1,0,0), (0,1,0), (0,0,1)]. - XMVECTOR Radius = XMVector3Dot(Extents, XMVectorAbs(Plane)); - - // Outside the plane? - Outside = XMVectorGreater(Dist, Radius); - - // Fully inside the plane? - Inside = XMVectorLess(Dist, XMVectorNegate(Radius)); - } - - //----------------------------------------------------------------------------- - inline void XM_CALLCONV FastIntersectOrientedBoxPlane( - _In_ FXMVECTOR Center, _In_ FXMVECTOR Extents, _In_ FXMVECTOR Axis0, - _In_ GXMVECTOR Axis1, - _In_ HXMVECTOR Axis2, _In_ HXMVECTOR Plane, - _Out_ XMVECTOR& Outside, _Out_ XMVECTOR& Inside) noexcept - { - // Compute the distance to the center of the box. - XMVECTOR Dist = XMVector4Dot(Center, Plane); - - // Project the axes of the box onto the normal of the plane. Half the - // length of the projection (sometime called the "radius") is equal to - // h(u) * abs(n dot b(u))) + h(v) * abs(n dot b(v)) + h(w) * abs(n dot b(w)) - // where h(i) are extents of the box, n is the plane normal, and b(i) are the - // axes of the box. - XMVECTOR Radius = XMVector3Dot(Plane, Axis0); - Radius = XMVectorInsert<0, 0, 1, 0, 0>(Radius, XMVector3Dot(Plane, Axis1)); - Radius = XMVectorInsert<0, 0, 0, 1, 0>(Radius, XMVector3Dot(Plane, Axis2)); - Radius = XMVector3Dot(Extents, XMVectorAbs(Radius)); - - // Outside the plane? - Outside = XMVectorGreater(Dist, Radius); - - // Fully inside the plane? - Inside = XMVectorLess(Dist, XMVectorNegate(Radius)); - } - - //----------------------------------------------------------------------------- - inline void XM_CALLCONV FastIntersectFrustumPlane( - _In_ FXMVECTOR Point0, _In_ FXMVECTOR Point1, _In_ FXMVECTOR Point2, - _In_ GXMVECTOR Point3, - _In_ HXMVECTOR Point4, _In_ HXMVECTOR Point5, - _In_ CXMVECTOR Point6, _In_ CXMVECTOR Point7, _In_ CXMVECTOR Plane, - _Out_ XMVECTOR& Outside, _Out_ XMVECTOR& Inside) noexcept - { - // Find the min/max projection of the frustum onto the plane normal. - XMVECTOR Min, Max, Dist; - - Min = Max = XMVector3Dot(Plane, Point0); - - Dist = XMVector3Dot(Plane, Point1); - Min = XMVectorMin(Min, Dist); - Max = XMVectorMax(Max, Dist); - - Dist = XMVector3Dot(Plane, Point2); - Min = XMVectorMin(Min, Dist); - Max = XMVectorMax(Max, Dist); - - Dist = XMVector3Dot(Plane, Point3); - Min = XMVectorMin(Min, Dist); - Max = XMVectorMax(Max, Dist); - - Dist = XMVector3Dot(Plane, Point4); - Min = XMVectorMin(Min, Dist); - Max = XMVectorMax(Max, Dist); - - Dist = XMVector3Dot(Plane, Point5); - Min = XMVectorMin(Min, Dist); - Max = XMVectorMax(Max, Dist); - - Dist = XMVector3Dot(Plane, Point6); - Min = XMVectorMin(Min, Dist); - Max = XMVectorMax(Max, Dist); - - Dist = XMVector3Dot(Plane, Point7); - Min = XMVectorMin(Min, Dist); - Max = XMVectorMax(Max, Dist); - - XMVECTOR PlaneDist = XMVectorNegate(XMVectorSplatW(Plane)); - - // Outside the plane? - Outside = XMVectorGreater(Min, PlaneDist); - - // Fully inside the plane? - Inside = XMVectorLess(Max, PlaneDist); - } - -} // namespace MathInternal - - -/**************************************************************************** - * - * BoundingSphere - * - ****************************************************************************/ - -//----------------------------------------------------------------------------- -// Transform a sphere by an angle preserving transform. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingSphere::Transform(BoundingSphere& Out, FXMMATRIX M) const noexcept -{ - // Load the center of the sphere. - XMVECTOR vCenter = XMLoadFloat3(&Center); - - // Transform the center of the sphere. - XMVECTOR C = XMVector3Transform(vCenter, M); - - XMVECTOR dX = XMVector3Dot(M.r[0], M.r[0]); - XMVECTOR dY = XMVector3Dot(M.r[1], M.r[1]); - XMVECTOR dZ = XMVector3Dot(M.r[2], M.r[2]); - - XMVECTOR d = XMVectorMax(dX, XMVectorMax(dY, dZ)); - - // Store the center sphere. - XMStoreFloat3(&Out.Center, C); - - // Scale the radius of the pshere. - float Scale = sqrtf(XMVectorGetX(d)); - Out.Radius = Radius * Scale; -} - -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingSphere::Transform(BoundingSphere& Out, float Scale, FXMVECTOR Rotation, FXMVECTOR Translation) const noexcept -{ - // Load the center of the sphere. - XMVECTOR vCenter = XMLoadFloat3(&Center); - - // Transform the center of the sphere. - vCenter = XMVectorAdd(XMVector3Rotate(XMVectorScale(vCenter, Scale), Rotation), Translation); - - // Store the center sphere. - XMStoreFloat3(&Out.Center, vCenter); - - // Scale the radius of the pshere. - Out.Radius = Radius * Scale; -} - - -//----------------------------------------------------------------------------- -// Point in sphere test. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingSphere::Contains(FXMVECTOR Point) const noexcept -{ - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); - - XMVECTOR DistanceSquared = XMVector3LengthSq(XMVectorSubtract(Point, vCenter)); - XMVECTOR RadiusSquared = XMVectorMultiply(vRadius, vRadius); - - return XMVector3LessOrEqual(DistanceSquared, RadiusSquared) ? CONTAINS : DISJOINT; -} - - -//----------------------------------------------------------------------------- -// Triangle in sphere test -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingSphere::Contains(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept -{ - if (!Intersects(V0, V1, V2)) - return DISJOINT; - - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); - XMVECTOR RadiusSquared = XMVectorMultiply(vRadius, vRadius); - - XMVECTOR DistanceSquared = XMVector3LengthSq(XMVectorSubtract(V0, vCenter)); - XMVECTOR Inside = XMVectorLessOrEqual(DistanceSquared, RadiusSquared); - - DistanceSquared = XMVector3LengthSq(XMVectorSubtract(V1, vCenter)); - Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(DistanceSquared, RadiusSquared)); - - DistanceSquared = XMVector3LengthSq(XMVectorSubtract(V2, vCenter)); - Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(DistanceSquared, RadiusSquared)); - - return (XMVector3EqualInt(Inside, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; -} - - -//----------------------------------------------------------------------------- -// Sphere in sphere test. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingSphere::Contains(const BoundingSphere& sh) const noexcept -{ - XMVECTOR Center1 = XMLoadFloat3(&Center); - float r1 = Radius; - - XMVECTOR Center2 = XMLoadFloat3(&sh.Center); - float r2 = sh.Radius; - - XMVECTOR V = XMVectorSubtract(Center2, Center1); - - XMVECTOR Dist = XMVector3Length(V); - - float d = XMVectorGetX(Dist); - - return (r1 + r2 >= d) ? ((r1 - r2 >= d) ? CONTAINS : INTERSECTS) : DISJOINT; -} - - -//----------------------------------------------------------------------------- -// Axis-aligned box in sphere test -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingSphere::Contains(const BoundingBox& box) const noexcept -{ - if (!box.Intersects(*this)) - return DISJOINT; - - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); - XMVECTOR RadiusSq = XMVectorMultiply(vRadius, vRadius); - - XMVECTOR boxCenter = XMLoadFloat3(&box.Center); - XMVECTOR boxExtents = XMLoadFloat3(&box.Extents); - - XMVECTOR InsideAll = XMVectorTrueInt(); - - XMVECTOR offset = XMVectorSubtract(boxCenter, vCenter); - - for (size_t i = 0; i < BoundingBox::CORNER_COUNT; ++i) - { - XMVECTOR C = XMVectorMultiplyAdd(boxExtents, g_BoxOffset[i], offset); - XMVECTOR d = XMVector3LengthSq(C); - InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(d, RadiusSq)); - } - - return (XMVector3EqualInt(InsideAll, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; -} - - -//----------------------------------------------------------------------------- -// Oriented box in sphere test -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingSphere::Contains(const BoundingOrientedBox& box) const noexcept -{ - if (!box.Intersects(*this)) - return DISJOINT; - - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); - XMVECTOR RadiusSq = XMVectorMultiply(vRadius, vRadius); - - XMVECTOR boxCenter = XMLoadFloat3(&box.Center); - XMVECTOR boxExtents = XMLoadFloat3(&box.Extents); - XMVECTOR boxOrientation = XMLoadFloat4(&box.Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(boxOrientation)); - - XMVECTOR InsideAll = XMVectorTrueInt(); - - for (size_t i = 0; i < BoundingOrientedBox::CORNER_COUNT; ++i) - { - XMVECTOR C = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(boxExtents, g_BoxOffset[i]), boxOrientation), boxCenter); - XMVECTOR d = XMVector3LengthSq(XMVectorSubtract(vCenter, C)); - InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(d, RadiusSq)); - } - - return (XMVector3EqualInt(InsideAll, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; - -} - - -//----------------------------------------------------------------------------- -// Frustum in sphere test -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingSphere::Contains(const BoundingFrustum& fr) const noexcept -{ - if (!fr.Intersects(*this)) - return DISJOINT; - - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); - XMVECTOR RadiusSq = XMVectorMultiply(vRadius, vRadius); - - XMVECTOR vOrigin = XMLoadFloat3(&fr.Origin); - XMVECTOR vOrientation = XMLoadFloat4(&fr.Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); - - // Build the corners of the frustum. - XMVECTOR vRightTop = XMVectorSet(fr.RightSlope, fr.TopSlope, 1.0f, 0.0f); - XMVECTOR vRightBottom = XMVectorSet(fr.RightSlope, fr.BottomSlope, 1.0f, 0.0f); - XMVECTOR vLeftTop = XMVectorSet(fr.LeftSlope, fr.TopSlope, 1.0f, 0.0f); - XMVECTOR vLeftBottom = XMVectorSet(fr.LeftSlope, fr.BottomSlope, 1.0f, 0.0f); - XMVECTOR vNear = XMVectorReplicatePtr(&fr.Near); - XMVECTOR vFar = XMVectorReplicatePtr(&fr.Far); - - XMVECTOR Corners[BoundingFrustum::CORNER_COUNT]; - Corners[0] = XMVectorMultiply(vRightTop, vNear); - Corners[1] = XMVectorMultiply(vRightBottom, vNear); - Corners[2] = XMVectorMultiply(vLeftTop, vNear); - Corners[3] = XMVectorMultiply(vLeftBottom, vNear); - Corners[4] = XMVectorMultiply(vRightTop, vFar); - Corners[5] = XMVectorMultiply(vRightBottom, vFar); - Corners[6] = XMVectorMultiply(vLeftTop, vFar); - Corners[7] = XMVectorMultiply(vLeftBottom, vFar); - - XMVECTOR InsideAll = XMVectorTrueInt(); - for (size_t i = 0; i < BoundingFrustum::CORNER_COUNT; ++i) - { - XMVECTOR C = XMVectorAdd(XMVector3Rotate(Corners[i], vOrientation), vOrigin); - XMVECTOR d = XMVector3LengthSq(XMVectorSubtract(vCenter, C)); - InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(d, RadiusSq)); - } - - return (XMVector3EqualInt(InsideAll, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; -} - - -//----------------------------------------------------------------------------- -// Sphere vs. sphere test. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingSphere::Intersects(const BoundingSphere& sh) const noexcept -{ - // Load A. - XMVECTOR vCenterA = XMLoadFloat3(&Center); - XMVECTOR vRadiusA = XMVectorReplicatePtr(&Radius); - - // Load B. - XMVECTOR vCenterB = XMLoadFloat3(&sh.Center); - XMVECTOR vRadiusB = XMVectorReplicatePtr(&sh.Radius); - - // Distance squared between centers. - XMVECTOR Delta = XMVectorSubtract(vCenterB, vCenterA); - XMVECTOR DistanceSquared = XMVector3LengthSq(Delta); - - // Sum of the radii squared. - XMVECTOR RadiusSquared = XMVectorAdd(vRadiusA, vRadiusB); - RadiusSquared = XMVectorMultiply(RadiusSquared, RadiusSquared); - - return XMVector3LessOrEqual(DistanceSquared, RadiusSquared); -} - - -//----------------------------------------------------------------------------- -// Box vs. sphere test. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingSphere::Intersects(const BoundingBox& box) const noexcept -{ - return box.Intersects(*this); -} - -_Use_decl_annotations_ -inline bool BoundingSphere::Intersects(const BoundingOrientedBox& box) const noexcept -{ - return box.Intersects(*this); -} - - -//----------------------------------------------------------------------------- -// Frustum vs. sphere test. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingSphere::Intersects(const BoundingFrustum& fr) const noexcept -{ - return fr.Intersects(*this); -} - - -//----------------------------------------------------------------------------- -// Triangle vs sphere test -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool XM_CALLCONV BoundingSphere::Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept -{ - // Load the sphere. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); - - // Compute the plane of the triangle (has to be normalized). - XMVECTOR N = XMVector3Normalize(XMVector3Cross(XMVectorSubtract(V1, V0), XMVectorSubtract(V2, V0))); - - // Assert that the triangle is not degenerate. - assert(!XMVector3Equal(N, XMVectorZero())); - - // Find the nearest feature on the triangle to the sphere. - XMVECTOR Dist = XMVector3Dot(XMVectorSubtract(vCenter, V0), N); - - // If the center of the sphere is farther from the plane of the triangle than - // the radius of the sphere, then there cannot be an intersection. - XMVECTOR NoIntersection = XMVectorLess(Dist, XMVectorNegate(vRadius)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Dist, vRadius)); - - // Project the center of the sphere onto the plane of the triangle. - XMVECTOR Point = XMVectorNegativeMultiplySubtract(N, Dist, vCenter); - - // Is it inside all the edges? If so we intersect because the distance - // to the plane is less than the radius. - XMVECTOR Intersection = DirectX::MathInternal::PointOnPlaneInsideTriangle(Point, V0, V1, V2); - - // Find the nearest point on each edge. - XMVECTOR RadiusSq = XMVectorMultiply(vRadius, vRadius); - - // Edge 0,1 - Point = DirectX::MathInternal::PointOnLineSegmentNearestPoint(V0, V1, vCenter); - - // If the distance to the center of the sphere to the point is less than - // the radius of the sphere then it must intersect. - Intersection = XMVectorOrInt(Intersection, XMVectorLessOrEqual(XMVector3LengthSq(XMVectorSubtract(vCenter, Point)), RadiusSq)); - - // Edge 1,2 - Point = DirectX::MathInternal::PointOnLineSegmentNearestPoint(V1, V2, vCenter); - - // If the distance to the center of the sphere to the point is less than - // the radius of the sphere then it must intersect. - Intersection = XMVectorOrInt(Intersection, XMVectorLessOrEqual(XMVector3LengthSq(XMVectorSubtract(vCenter, Point)), RadiusSq)); - - // Edge 2,0 - Point = DirectX::MathInternal::PointOnLineSegmentNearestPoint(V2, V0, vCenter); - - // If the distance to the center of the sphere to the point is less than - // the radius of the sphere then it must intersect. - Intersection = XMVectorOrInt(Intersection, XMVectorLessOrEqual(XMVector3LengthSq(XMVectorSubtract(vCenter, Point)), RadiusSq)); - - return XMVector4EqualInt(XMVectorAndCInt(Intersection, NoIntersection), XMVectorTrueInt()); -} - - -//----------------------------------------------------------------------------- -// Sphere-plane intersection -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline PlaneIntersectionType XM_CALLCONV BoundingSphere::Intersects(FXMVECTOR Plane) const noexcept -{ - assert(DirectX::MathInternal::XMPlaneIsUnit(Plane)); - - // Load the sphere. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); - - // Set w of the center to one so we can dot4 with a plane. - vCenter = XMVectorInsert<0, 0, 0, 0, 1>(vCenter, XMVectorSplatOne()); - - XMVECTOR Outside, Inside; - DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane, Outside, Inside); - - // If the sphere is outside any plane it is outside. - if (XMVector4EqualInt(Outside, XMVectorTrueInt())) - return FRONT; - - // If the sphere is inside all planes it is inside. - if (XMVector4EqualInt(Inside, XMVectorTrueInt())) - return BACK; - - // The sphere is not inside all planes or outside a plane it intersects. - return INTERSECTING; -} - - -//----------------------------------------------------------------------------- -// Compute the intersection of a ray (Origin, Direction) with a sphere. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool XM_CALLCONV BoundingSphere::Intersects(FXMVECTOR Origin, FXMVECTOR Direction, float& Dist) const noexcept -{ - assert(DirectX::MathInternal::XMVector3IsUnit(Direction)); - - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); - - // l is the vector from the ray origin to the center of the sphere. - XMVECTOR l = XMVectorSubtract(vCenter, Origin); - - // s is the projection of the l onto the ray direction. - XMVECTOR s = XMVector3Dot(l, Direction); - - XMVECTOR l2 = XMVector3Dot(l, l); - - XMVECTOR r2 = XMVectorMultiply(vRadius, vRadius); - - // m2 is squared distance from the center of the sphere to the projection. - XMVECTOR m2 = XMVectorNegativeMultiplySubtract(s, s, l2); - - XMVECTOR NoIntersection; - - // If the ray origin is outside the sphere and the center of the sphere is - // behind the ray origin there is no intersection. - NoIntersection = XMVectorAndInt(XMVectorLess(s, XMVectorZero()), XMVectorGreater(l2, r2)); - - // If the squared distance from the center of the sphere to the projection - // is greater than the radius squared the ray will miss the sphere. - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(m2, r2)); - - // The ray hits the sphere, compute the nearest intersection point. - XMVECTOR q = XMVectorSqrt(XMVectorSubtract(r2, m2)); - XMVECTOR t1 = XMVectorSubtract(s, q); - XMVECTOR t2 = XMVectorAdd(s, q); - - XMVECTOR OriginInside = XMVectorLessOrEqual(l2, r2); - XMVECTOR t = XMVectorSelect(t1, t2, OriginInside); - - if (XMVector4NotEqualInt(NoIntersection, XMVectorTrueInt())) - { - // Store the x-component to *pDist. - XMStoreFloat(&Dist, t); - return true; - } - - Dist = 0.f; - return false; -} - - -//----------------------------------------------------------------------------- -// Test a sphere vs 6 planes (typically forming a frustum). -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingSphere::ContainedBy( - FXMVECTOR Plane0, FXMVECTOR Plane1, FXMVECTOR Plane2, - GXMVECTOR Plane3, - HXMVECTOR Plane4, HXMVECTOR Plane5) const noexcept -{ - // Load the sphere. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); - - // Set w of the center to one so we can dot4 with a plane. - vCenter = XMVectorInsert<0, 0, 0, 0, 1>(vCenter, XMVectorSplatOne()); - - XMVECTOR Outside, Inside; - - // Test against each plane. - DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane0, Outside, Inside); - - XMVECTOR AnyOutside = Outside; - XMVECTOR AllInside = Inside; - - DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane1, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane2, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane3, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane4, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane5, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - // If the sphere is outside any plane it is outside. - if (XMVector4EqualInt(AnyOutside, XMVectorTrueInt())) - return DISJOINT; - - // If the sphere is inside all planes it is inside. - if (XMVector4EqualInt(AllInside, XMVectorTrueInt())) - return CONTAINS; - - // The sphere is not inside all planes or outside a plane, it may intersect. - return INTERSECTS; -} - - -//----------------------------------------------------------------------------- -// Creates a bounding sphere that contains two other bounding spheres -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingSphere::CreateMerged(BoundingSphere& Out, const BoundingSphere& S1, const BoundingSphere& S2) noexcept -{ - XMVECTOR Center1 = XMLoadFloat3(&S1.Center); - float r1 = S1.Radius; - - XMVECTOR Center2 = XMLoadFloat3(&S2.Center); - float r2 = S2.Radius; - - XMVECTOR V = XMVectorSubtract(Center2, Center1); - - XMVECTOR Dist = XMVector3Length(V); - - float d = XMVectorGetX(Dist); - - if (r1 + r2 >= d) - { - if (r1 - r2 >= d) - { - Out = S1; - return; - } - else if (r2 - r1 >= d) - { - Out = S2; - return; - } - } - - XMVECTOR N = XMVectorDivide(V, Dist); - - float t1 = XMMin(-r1, d - r2); - float t2 = XMMax(r1, d + r2); - float t_5 = (t2 - t1) * 0.5f; - - XMVECTOR NCenter = XMVectorAdd(Center1, XMVectorMultiply(N, XMVectorReplicate(t_5 + t1))); - - XMStoreFloat3(&Out.Center, NCenter); - Out.Radius = t_5; -} - - -//----------------------------------------------------------------------------- -// Create sphere enscribing bounding box -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingSphere::CreateFromBoundingBox(BoundingSphere& Out, const BoundingBox& box) noexcept -{ - Out.Center = box.Center; - XMVECTOR vExtents = XMLoadFloat3(&box.Extents); - Out.Radius = XMVectorGetX(XMVector3Length(vExtents)); -} - -_Use_decl_annotations_ -inline void BoundingSphere::CreateFromBoundingBox(BoundingSphere& Out, const BoundingOrientedBox& box) noexcept -{ - // Bounding box orientation is irrelevant because a sphere is rotationally invariant - Out.Center = box.Center; - XMVECTOR vExtents = XMLoadFloat3(&box.Extents); - Out.Radius = XMVectorGetX(XMVector3Length(vExtents)); -} - - -//----------------------------------------------------------------------------- -// Find the approximate smallest enclosing bounding sphere for a set of -// points. Exact computation of the smallest enclosing bounding sphere is -// possible but is slower and requires a more complex algorithm. -// The algorithm is based on Jack Ritter, "An Efficient Bounding Sphere", -// Graphics Gems. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingSphere::CreateFromPoints(BoundingSphere& Out, size_t Count, const XMFLOAT3* pPoints, size_t Stride) noexcept -{ - assert(Count > 0); - assert(pPoints); - - // Find the points with minimum and maximum x, y, and z - XMVECTOR MinX, MaxX, MinY, MaxY, MinZ, MaxZ; - - MinX = MaxX = MinY = MaxY = MinZ = MaxZ = XMLoadFloat3(pPoints); - - for (size_t i = 1; i < Count; ++i) - { - XMVECTOR Point = XMLoadFloat3(reinterpret_cast(reinterpret_cast(pPoints) + i * Stride)); - - float px = XMVectorGetX(Point); - float py = XMVectorGetY(Point); - float pz = XMVectorGetZ(Point); - - if (px < XMVectorGetX(MinX)) - MinX = Point; - - if (px > XMVectorGetX(MaxX)) - MaxX = Point; - - if (py < XMVectorGetY(MinY)) - MinY = Point; - - if (py > XMVectorGetY(MaxY)) - MaxY = Point; - - if (pz < XMVectorGetZ(MinZ)) - MinZ = Point; - - if (pz > XMVectorGetZ(MaxZ)) - MaxZ = Point; - } - - // Use the min/max pair that are farthest apart to form the initial sphere. - XMVECTOR DeltaX = XMVectorSubtract(MaxX, MinX); - XMVECTOR DistX = XMVector3Length(DeltaX); - - XMVECTOR DeltaY = XMVectorSubtract(MaxY, MinY); - XMVECTOR DistY = XMVector3Length(DeltaY); - - XMVECTOR DeltaZ = XMVectorSubtract(MaxZ, MinZ); - XMVECTOR DistZ = XMVector3Length(DeltaZ); - - XMVECTOR vCenter; - XMVECTOR vRadius; - - if (XMVector3Greater(DistX, DistY)) - { - if (XMVector3Greater(DistX, DistZ)) - { - // Use min/max x. - vCenter = XMVectorLerp(MaxX, MinX, 0.5f); - vRadius = XMVectorScale(DistX, 0.5f); - } - else - { - // Use min/max z. - vCenter = XMVectorLerp(MaxZ, MinZ, 0.5f); - vRadius = XMVectorScale(DistZ, 0.5f); - } - } - else // Y >= X - { - if (XMVector3Greater(DistY, DistZ)) - { - // Use min/max y. - vCenter = XMVectorLerp(MaxY, MinY, 0.5f); - vRadius = XMVectorScale(DistY, 0.5f); - } - else - { - // Use min/max z. - vCenter = XMVectorLerp(MaxZ, MinZ, 0.5f); - vRadius = XMVectorScale(DistZ, 0.5f); - } - } - - // Add any points not inside the sphere. - for (size_t i = 0; i < Count; ++i) - { - XMVECTOR Point = XMLoadFloat3(reinterpret_cast(reinterpret_cast(pPoints) + i * Stride)); - - XMVECTOR Delta = XMVectorSubtract(Point, vCenter); - - XMVECTOR Dist = XMVector3Length(Delta); - - if (XMVector3Greater(Dist, vRadius)) - { - // Adjust sphere to include the new point. - vRadius = XMVectorScale(XMVectorAdd(vRadius, Dist), 0.5f); - vCenter = XMVectorAdd(vCenter, XMVectorMultiply(XMVectorSubtract(XMVectorReplicate(1.0f), XMVectorDivide(vRadius, Dist)), Delta)); - } - } - - XMStoreFloat3(&Out.Center, vCenter); - XMStoreFloat(&Out.Radius, vRadius); -} - - -//----------------------------------------------------------------------------- -// Create sphere containing frustum -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingSphere::CreateFromFrustum(BoundingSphere& Out, const BoundingFrustum& fr) noexcept -{ - XMFLOAT3 Corners[BoundingFrustum::CORNER_COUNT]; - fr.GetCorners(Corners); - CreateFromPoints(Out, BoundingFrustum::CORNER_COUNT, Corners, sizeof(XMFLOAT3)); -} - - -/**************************************************************************** - * - * BoundingBox - * - ****************************************************************************/ - -//----------------------------------------------------------------------------- -// Transform an axis aligned box by an angle preserving transform. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingBox::Transform(BoundingBox& Out, FXMMATRIX M) const noexcept -{ - // Load center and extents. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); - - // Compute and transform the corners and find new min/max bounds. - XMVECTOR Corner = XMVectorMultiplyAdd(vExtents, g_BoxOffset[0], vCenter); - Corner = XMVector3Transform(Corner, M); - - XMVECTOR Min, Max; - Min = Max = Corner; - - for (size_t i = 1; i < CORNER_COUNT; ++i) - { - Corner = XMVectorMultiplyAdd(vExtents, g_BoxOffset[i], vCenter); - Corner = XMVector3Transform(Corner, M); - - Min = XMVectorMin(Min, Corner); - Max = XMVectorMax(Max, Corner); - } - - // Store center and extents. - XMStoreFloat3(&Out.Center, XMVectorScale(XMVectorAdd(Min, Max), 0.5f)); - XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(Max, Min), 0.5f)); -} - -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingBox::Transform(BoundingBox& Out, float Scale, FXMVECTOR Rotation, FXMVECTOR Translation) const noexcept -{ - assert(DirectX::MathInternal::XMQuaternionIsUnit(Rotation)); - - // Load center and extents. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); - - XMVECTOR VectorScale = XMVectorReplicate(Scale); - - // Compute and transform the corners and find new min/max bounds. - XMVECTOR Corner = XMVectorMultiplyAdd(vExtents, g_BoxOffset[0], vCenter); - Corner = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(Corner, VectorScale), Rotation), Translation); - - XMVECTOR Min, Max; - Min = Max = Corner; - - for (size_t i = 1; i < CORNER_COUNT; ++i) - { - Corner = XMVectorMultiplyAdd(vExtents, g_BoxOffset[i], vCenter); - Corner = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(Corner, VectorScale), Rotation), Translation); - - Min = XMVectorMin(Min, Corner); - Max = XMVectorMax(Max, Corner); - } - - // Store center and extents. - XMStoreFloat3(&Out.Center, XMVectorScale(XMVectorAdd(Min, Max), 0.5f)); - XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(Max, Min), 0.5f)); -} - - -//----------------------------------------------------------------------------- -// Get the corner points of the box -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingBox::GetCorners(XMFLOAT3* Corners) const noexcept -{ - assert(Corners != nullptr); - - // Load the box - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); - - for (size_t i = 0; i < CORNER_COUNT; ++i) - { - XMVECTOR C = XMVectorMultiplyAdd(vExtents, g_BoxOffset[i], vCenter); - XMStoreFloat3(&Corners[i], C); - } -} - - -//----------------------------------------------------------------------------- -// Point in axis-aligned box test -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingBox::Contains(FXMVECTOR Point) const noexcept -{ - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); - - return XMVector3InBounds(XMVectorSubtract(Point, vCenter), vExtents) ? CONTAINS : DISJOINT; -} - - -//----------------------------------------------------------------------------- -// Triangle in axis-aligned box test -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingBox::Contains(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept -{ - if (!Intersects(V0, V1, V2)) - return DISJOINT; - - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); - - XMVECTOR d = XMVectorAbs(XMVectorSubtract(V0, vCenter)); - XMVECTOR Inside = XMVectorLessOrEqual(d, vExtents); - - d = XMVectorAbs(XMVectorSubtract(V1, vCenter)); - Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(d, vExtents)); - - d = XMVectorAbs(XMVectorSubtract(V2, vCenter)); - Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(d, vExtents)); - - return (XMVector3EqualInt(Inside, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; -} - - -//----------------------------------------------------------------------------- -// Sphere in axis-aligned box test -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingBox::Contains(const BoundingSphere& sh) const noexcept -{ - XMVECTOR SphereCenter = XMLoadFloat3(&sh.Center); - XMVECTOR SphereRadius = XMVectorReplicatePtr(&sh.Radius); - - XMVECTOR BoxCenter = XMLoadFloat3(&Center); - XMVECTOR BoxExtents = XMLoadFloat3(&Extents); - - XMVECTOR BoxMin = XMVectorSubtract(BoxCenter, BoxExtents); - XMVECTOR BoxMax = XMVectorAdd(BoxCenter, BoxExtents); - - // Find the distance to the nearest point on the box. - // for each i in (x, y, z) - // if (SphereCenter(i) < BoxMin(i)) d2 += (SphereCenter(i) - BoxMin(i)) ^ 2 - // else if (SphereCenter(i) > BoxMax(i)) d2 += (SphereCenter(i) - BoxMax(i)) ^ 2 - - XMVECTOR d = XMVectorZero(); - - // Compute d for each dimension. - XMVECTOR LessThanMin = XMVectorLess(SphereCenter, BoxMin); - XMVECTOR GreaterThanMax = XMVectorGreater(SphereCenter, BoxMax); - - XMVECTOR MinDelta = XMVectorSubtract(SphereCenter, BoxMin); - XMVECTOR MaxDelta = XMVectorSubtract(SphereCenter, BoxMax); - - // Choose value for each dimension based on the comparison. - d = XMVectorSelect(d, MinDelta, LessThanMin); - d = XMVectorSelect(d, MaxDelta, GreaterThanMax); - - // Use a dot-product to square them and sum them together. - XMVECTOR d2 = XMVector3Dot(d, d); - - if (XMVector3Greater(d2, XMVectorMultiply(SphereRadius, SphereRadius))) - return DISJOINT; - - XMVECTOR InsideAll = XMVectorLessOrEqual(XMVectorAdd(BoxMin, SphereRadius), SphereCenter); - InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(SphereCenter, XMVectorSubtract(BoxMax, SphereRadius))); - InsideAll = XMVectorAndInt(InsideAll, XMVectorGreater(XMVectorSubtract(BoxMax, BoxMin), SphereRadius)); - - return (XMVector3EqualInt(InsideAll, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; -} - - -//----------------------------------------------------------------------------- -// Axis-aligned box in axis-aligned box test -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingBox::Contains(const BoundingBox& box) const noexcept -{ - XMVECTOR CenterA = XMLoadFloat3(&Center); - XMVECTOR ExtentsA = XMLoadFloat3(&Extents); - - XMVECTOR CenterB = XMLoadFloat3(&box.Center); - XMVECTOR ExtentsB = XMLoadFloat3(&box.Extents); - - XMVECTOR MinA = XMVectorSubtract(CenterA, ExtentsA); - XMVECTOR MaxA = XMVectorAdd(CenterA, ExtentsA); - - XMVECTOR MinB = XMVectorSubtract(CenterB, ExtentsB); - XMVECTOR MaxB = XMVectorAdd(CenterB, ExtentsB); - - // for each i in (x, y, z) if a_min(i) > b_max(i) or b_min(i) > a_max(i) then return false - XMVECTOR Disjoint = XMVectorOrInt(XMVectorGreater(MinA, MaxB), XMVectorGreater(MinB, MaxA)); - - if (DirectX::MathInternal::XMVector3AnyTrue(Disjoint)) - return DISJOINT; - - // for each i in (x, y, z) if a_min(i) <= b_min(i) and b_max(i) <= a_max(i) then A contains B - XMVECTOR Inside = XMVectorAndInt(XMVectorLessOrEqual(MinA, MinB), XMVectorLessOrEqual(MaxB, MaxA)); - - return DirectX::MathInternal::XMVector3AllTrue(Inside) ? CONTAINS : INTERSECTS; -} - - -//----------------------------------------------------------------------------- -// Oriented box in axis-aligned box test -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingBox::Contains(const BoundingOrientedBox& box) const noexcept -{ - if (!box.Intersects(*this)) - return DISJOINT; - - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); - - // Subtract off the AABB center to remove a subtract below - XMVECTOR oCenter = XMVectorSubtract(XMLoadFloat3(&box.Center), vCenter); - - XMVECTOR oExtents = XMLoadFloat3(&box.Extents); - XMVECTOR oOrientation = XMLoadFloat4(&box.Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(oOrientation)); - - XMVECTOR Inside = XMVectorTrueInt(); - - for (size_t i = 0; i < BoundingOrientedBox::CORNER_COUNT; ++i) - { - XMVECTOR C = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(oExtents, g_BoxOffset[i]), oOrientation), oCenter); - XMVECTOR d = XMVectorAbs(C); - Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(d, vExtents)); - } - - return (XMVector3EqualInt(Inside, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; -} - - -//----------------------------------------------------------------------------- -// Frustum in axis-aligned box test -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingBox::Contains(const BoundingFrustum& fr) const noexcept -{ - if (!fr.Intersects(*this)) - return DISJOINT; - - XMFLOAT3 Corners[BoundingFrustum::CORNER_COUNT]; - fr.GetCorners(Corners); - - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); - - XMVECTOR Inside = XMVectorTrueInt(); - - for (size_t i = 0; i < BoundingFrustum::CORNER_COUNT; ++i) - { - XMVECTOR Point = XMLoadFloat3(&Corners[i]); - XMVECTOR d = XMVectorAbs(XMVectorSubtract(Point, vCenter)); - Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(d, vExtents)); - } - - return (XMVector3EqualInt(Inside, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; -} - - -//----------------------------------------------------------------------------- -// Sphere vs axis-aligned box test -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingBox::Intersects(const BoundingSphere& sh) const noexcept -{ - XMVECTOR SphereCenter = XMLoadFloat3(&sh.Center); - XMVECTOR SphereRadius = XMVectorReplicatePtr(&sh.Radius); - - XMVECTOR BoxCenter = XMLoadFloat3(&Center); - XMVECTOR BoxExtents = XMLoadFloat3(&Extents); - - XMVECTOR BoxMin = XMVectorSubtract(BoxCenter, BoxExtents); - XMVECTOR BoxMax = XMVectorAdd(BoxCenter, BoxExtents); - - // Find the distance to the nearest point on the box. - // for each i in (x, y, z) - // if (SphereCenter(i) < BoxMin(i)) d2 += (SphereCenter(i) - BoxMin(i)) ^ 2 - // else if (SphereCenter(i) > BoxMax(i)) d2 += (SphereCenter(i) - BoxMax(i)) ^ 2 - - XMVECTOR d = XMVectorZero(); - - // Compute d for each dimension. - XMVECTOR LessThanMin = XMVectorLess(SphereCenter, BoxMin); - XMVECTOR GreaterThanMax = XMVectorGreater(SphereCenter, BoxMax); - - XMVECTOR MinDelta = XMVectorSubtract(SphereCenter, BoxMin); - XMVECTOR MaxDelta = XMVectorSubtract(SphereCenter, BoxMax); - - // Choose value for each dimension based on the comparison. - d = XMVectorSelect(d, MinDelta, LessThanMin); - d = XMVectorSelect(d, MaxDelta, GreaterThanMax); - - // Use a dot-product to square them and sum them together. - XMVECTOR d2 = XMVector3Dot(d, d); - - return XMVector3LessOrEqual(d2, XMVectorMultiply(SphereRadius, SphereRadius)); -} - - -//----------------------------------------------------------------------------- -// Axis-aligned box vs. axis-aligned box test -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingBox::Intersects(const BoundingBox& box) const noexcept -{ - XMVECTOR CenterA = XMLoadFloat3(&Center); - XMVECTOR ExtentsA = XMLoadFloat3(&Extents); - - XMVECTOR CenterB = XMLoadFloat3(&box.Center); - XMVECTOR ExtentsB = XMLoadFloat3(&box.Extents); - - XMVECTOR MinA = XMVectorSubtract(CenterA, ExtentsA); - XMVECTOR MaxA = XMVectorAdd(CenterA, ExtentsA); - - XMVECTOR MinB = XMVectorSubtract(CenterB, ExtentsB); - XMVECTOR MaxB = XMVectorAdd(CenterB, ExtentsB); - - // for each i in (x, y, z) if a_min(i) > b_max(i) or b_min(i) > a_max(i) then return false - XMVECTOR Disjoint = XMVectorOrInt(XMVectorGreater(MinA, MaxB), XMVectorGreater(MinB, MaxA)); - - return !DirectX::MathInternal::XMVector3AnyTrue(Disjoint); -} - - -//----------------------------------------------------------------------------- -// Oriented box vs. axis-aligned box test -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingBox::Intersects(const BoundingOrientedBox& box) const noexcept -{ - return box.Intersects(*this); -} - - -//----------------------------------------------------------------------------- -// Frustum vs. axis-aligned box test -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingBox::Intersects(const BoundingFrustum& fr) const noexcept -{ - return fr.Intersects(*this); -} - - -//----------------------------------------------------------------------------- -// Triangle vs. axis aligned box test -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool XM_CALLCONV BoundingBox::Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept -{ - XMVECTOR Zero = XMVectorZero(); - - // Load the box. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); - - XMVECTOR BoxMin = XMVectorSubtract(vCenter, vExtents); - XMVECTOR BoxMax = XMVectorAdd(vCenter, vExtents); - - // Test the axes of the box (in effect test the AAB against the minimal AAB - // around the triangle). - XMVECTOR TriMin = XMVectorMin(XMVectorMin(V0, V1), V2); - XMVECTOR TriMax = XMVectorMax(XMVectorMax(V0, V1), V2); - - // for each i in (x, y, z) if a_min(i) > b_max(i) or b_min(i) > a_max(i) then disjoint - XMVECTOR Disjoint = XMVectorOrInt(XMVectorGreater(TriMin, BoxMax), XMVectorGreater(BoxMin, TriMax)); - if (DirectX::MathInternal::XMVector3AnyTrue(Disjoint)) - return false; - - // Test the plane of the triangle. - XMVECTOR Normal = XMVector3Cross(XMVectorSubtract(V1, V0), XMVectorSubtract(V2, V0)); - XMVECTOR Dist = XMVector3Dot(Normal, V0); - - // Assert that the triangle is not degenerate. - assert(!XMVector3Equal(Normal, Zero)); - - // for each i in (x, y, z) if n(i) >= 0 then v_min(i)=b_min(i), v_max(i)=b_max(i) - // else v_min(i)=b_max(i), v_max(i)=b_min(i) - XMVECTOR NormalSelect = XMVectorGreater(Normal, Zero); - XMVECTOR V_Min = XMVectorSelect(BoxMax, BoxMin, NormalSelect); - XMVECTOR V_Max = XMVectorSelect(BoxMin, BoxMax, NormalSelect); - - // if n dot v_min + d > 0 || n dot v_max + d < 0 then disjoint - XMVECTOR MinDist = XMVector3Dot(V_Min, Normal); - XMVECTOR MaxDist = XMVector3Dot(V_Max, Normal); - - XMVECTOR NoIntersection = XMVectorGreater(MinDist, Dist); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(MaxDist, Dist)); - - // Move the box center to zero to simplify the following tests. - XMVECTOR TV0 = XMVectorSubtract(V0, vCenter); - XMVECTOR TV1 = XMVectorSubtract(V1, vCenter); - XMVECTOR TV2 = XMVectorSubtract(V2, vCenter); - - // Test the edge/edge axes (3*3). - XMVECTOR e0 = XMVectorSubtract(TV1, TV0); - XMVECTOR e1 = XMVectorSubtract(TV2, TV1); - XMVECTOR e2 = XMVectorSubtract(TV0, TV2); - - // Make w zero. - e0 = XMVectorInsert<0, 0, 0, 0, 1>(e0, Zero); - e1 = XMVectorInsert<0, 0, 0, 0, 1>(e1, Zero); - e2 = XMVectorInsert<0, 0, 0, 0, 1>(e2, Zero); - - XMVECTOR Axis; - XMVECTOR p0, p1, p2; - XMVECTOR Min, Max; - XMVECTOR Radius; - - // Axis == (1,0,0) x e0 = (0, -e0.z, e0.y) - Axis = XMVectorPermute(e0, XMVectorNegate(e0)); - p0 = XMVector3Dot(TV0, Axis); - // p1 = XMVector3Dot( V1, Axis ); // p1 = p0; - p2 = XMVector3Dot(TV2, Axis); - Min = XMVectorMin(p0, p2); - Max = XMVectorMax(p0, p2); - Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); - - // Axis == (1,0,0) x e1 = (0, -e1.z, e1.y) - Axis = XMVectorPermute(e1, XMVectorNegate(e1)); - p0 = XMVector3Dot(TV0, Axis); - p1 = XMVector3Dot(TV1, Axis); - // p2 = XMVector3Dot( V2, Axis ); // p2 = p1; - Min = XMVectorMin(p0, p1); - Max = XMVectorMax(p0, p1); - Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); - - // Axis == (1,0,0) x e2 = (0, -e2.z, e2.y) - Axis = XMVectorPermute(e2, XMVectorNegate(e2)); - p0 = XMVector3Dot(TV0, Axis); - p1 = XMVector3Dot(TV1, Axis); - // p2 = XMVector3Dot( V2, Axis ); // p2 = p0; - Min = XMVectorMin(p0, p1); - Max = XMVectorMax(p0, p1); - Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); - - // Axis == (0,1,0) x e0 = (e0.z, 0, -e0.x) - Axis = XMVectorPermute(e0, XMVectorNegate(e0)); - p0 = XMVector3Dot(TV0, Axis); - // p1 = XMVector3Dot( V1, Axis ); // p1 = p0; - p2 = XMVector3Dot(TV2, Axis); - Min = XMVectorMin(p0, p2); - Max = XMVectorMax(p0, p2); - Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); - - // Axis == (0,1,0) x e1 = (e1.z, 0, -e1.x) - Axis = XMVectorPermute(e1, XMVectorNegate(e1)); - p0 = XMVector3Dot(TV0, Axis); - p1 = XMVector3Dot(TV1, Axis); - // p2 = XMVector3Dot( V2, Axis ); // p2 = p1; - Min = XMVectorMin(p0, p1); - Max = XMVectorMax(p0, p1); - Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); - - // Axis == (0,0,1) x e2 = (e2.z, 0, -e2.x) - Axis = XMVectorPermute(e2, XMVectorNegate(e2)); - p0 = XMVector3Dot(TV0, Axis); - p1 = XMVector3Dot(TV1, Axis); - // p2 = XMVector3Dot( V2, Axis ); // p2 = p0; - Min = XMVectorMin(p0, p1); - Max = XMVectorMax(p0, p1); - Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); - - // Axis == (0,0,1) x e0 = (-e0.y, e0.x, 0) - Axis = XMVectorPermute(e0, XMVectorNegate(e0)); - p0 = XMVector3Dot(TV0, Axis); - // p1 = XMVector3Dot( V1, Axis ); // p1 = p0; - p2 = XMVector3Dot(TV2, Axis); - Min = XMVectorMin(p0, p2); - Max = XMVectorMax(p0, p2); - Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); - - // Axis == (0,0,1) x e1 = (-e1.y, e1.x, 0) - Axis = XMVectorPermute(e1, XMVectorNegate(e1)); - p0 = XMVector3Dot(TV0, Axis); - p1 = XMVector3Dot(TV1, Axis); - // p2 = XMVector3Dot( V2, Axis ); // p2 = p1; - Min = XMVectorMin(p0, p1); - Max = XMVectorMax(p0, p1); - Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); - - // Axis == (0,0,1) x e2 = (-e2.y, e2.x, 0) - Axis = XMVectorPermute(e2, XMVectorNegate(e2)); - p0 = XMVector3Dot(TV0, Axis); - p1 = XMVector3Dot(TV1, Axis); - // p2 = XMVector3Dot( V2, Axis ); // p2 = p0; - Min = XMVectorMin(p0, p1); - Max = XMVectorMax(p0, p1); - Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); - - return XMVector4NotEqualInt(NoIntersection, XMVectorTrueInt()); -} - - -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline PlaneIntersectionType XM_CALLCONV BoundingBox::Intersects(FXMVECTOR Plane) const noexcept -{ - assert(DirectX::MathInternal::XMPlaneIsUnit(Plane)); - - // Load the box. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); - - // Set w of the center to one so we can dot4 with a plane. - vCenter = XMVectorInsert<0, 0, 0, 0, 1>(vCenter, XMVectorSplatOne()); - - XMVECTOR Outside, Inside; - DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane, Outside, Inside); - - // If the box is outside any plane it is outside. - if (XMVector4EqualInt(Outside, XMVectorTrueInt())) - return FRONT; - - // If the box is inside all planes it is inside. - if (XMVector4EqualInt(Inside, XMVectorTrueInt())) - return BACK; - - // The box is not inside all planes or outside a plane it intersects. - return INTERSECTING; -} - - -//----------------------------------------------------------------------------- -// Compute the intersection of a ray (Origin, Direction) with an axis aligned -// box using the slabs method. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool XM_CALLCONV BoundingBox::Intersects(FXMVECTOR Origin, FXMVECTOR Direction, float& Dist) const noexcept -{ - assert(DirectX::MathInternal::XMVector3IsUnit(Direction)); - - // Load the box. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); - - // Adjust ray origin to be relative to center of the box. - XMVECTOR TOrigin = XMVectorSubtract(vCenter, Origin); - - // Compute the dot product againt each axis of the box. - // Since the axii are (1,0,0), (0,1,0), (0,0,1) no computation is necessary. - XMVECTOR AxisDotOrigin = TOrigin; - XMVECTOR AxisDotDirection = Direction; - - // if (fabs(AxisDotDirection) <= Epsilon) the ray is nearly parallel to the slab. - XMVECTOR IsParallel = XMVectorLessOrEqual(XMVectorAbs(AxisDotDirection), g_RayEpsilon); - - // Test against all three axii simultaneously. - XMVECTOR InverseAxisDotDirection = XMVectorReciprocal(AxisDotDirection); - XMVECTOR t1 = XMVectorMultiply(XMVectorSubtract(AxisDotOrigin, vExtents), InverseAxisDotDirection); - XMVECTOR t2 = XMVectorMultiply(XMVectorAdd(AxisDotOrigin, vExtents), InverseAxisDotDirection); - - // Compute the max of min(t1,t2) and the min of max(t1,t2) ensuring we don't - // use the results from any directions parallel to the slab. - XMVECTOR t_min = XMVectorSelect(XMVectorMin(t1, t2), g_FltMin, IsParallel); - XMVECTOR t_max = XMVectorSelect(XMVectorMax(t1, t2), g_FltMax, IsParallel); - - // t_min.x = maximum( t_min.x, t_min.y, t_min.z ); - // t_max.x = minimum( t_max.x, t_max.y, t_max.z ); - t_min = XMVectorMax(t_min, XMVectorSplatY(t_min)); // x = max(x,y) - t_min = XMVectorMax(t_min, XMVectorSplatZ(t_min)); // x = max(max(x,y),z) - t_max = XMVectorMin(t_max, XMVectorSplatY(t_max)); // x = min(x,y) - t_max = XMVectorMin(t_max, XMVectorSplatZ(t_max)); // x = min(min(x,y),z) - - // if ( t_min > t_max ) return false; - XMVECTOR NoIntersection = XMVectorGreater(XMVectorSplatX(t_min), XMVectorSplatX(t_max)); - - // if ( t_max < 0.0f ) return false; - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(XMVectorSplatX(t_max), XMVectorZero())); - - // if (IsParallel && (-Extents > AxisDotOrigin || Extents < AxisDotOrigin)) return false; - XMVECTOR ParallelOverlap = XMVectorInBounds(AxisDotOrigin, vExtents); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorAndCInt(IsParallel, ParallelOverlap)); - - if (!DirectX::MathInternal::XMVector3AnyTrue(NoIntersection)) - { - // Store the x-component to *pDist - XMStoreFloat(&Dist, t_min); - return true; - } - - Dist = 0.f; - return false; -} - - -//----------------------------------------------------------------------------- -// Test an axis alinged box vs 6 planes (typically forming a frustum). -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingBox::ContainedBy( - FXMVECTOR Plane0, FXMVECTOR Plane1, FXMVECTOR Plane2, - GXMVECTOR Plane3, - HXMVECTOR Plane4, HXMVECTOR Plane5) const noexcept -{ - // Load the box. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); - - // Set w of the center to one so we can dot4 with a plane. - vCenter = XMVectorInsert<0, 0, 0, 0, 1>(vCenter, XMVectorSplatOne()); - - XMVECTOR Outside, Inside; - - // Test against each plane. - DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane0, Outside, Inside); - - XMVECTOR AnyOutside = Outside; - XMVECTOR AllInside = Inside; - - DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane1, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane2, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane3, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane4, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane5, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - // If the box is outside any plane it is outside. - if (XMVector4EqualInt(AnyOutside, XMVectorTrueInt())) - return DISJOINT; - - // If the box is inside all planes it is inside. - if (XMVector4EqualInt(AllInside, XMVectorTrueInt())) - return CONTAINS; - - // The box is not inside all planes or outside a plane, it may intersect. - return INTERSECTS; -} - - -//----------------------------------------------------------------------------- -// Create axis-aligned box that contains two other bounding boxes -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingBox::CreateMerged(BoundingBox& Out, const BoundingBox& b1, const BoundingBox& b2) noexcept -{ - XMVECTOR b1Center = XMLoadFloat3(&b1.Center); - XMVECTOR b1Extents = XMLoadFloat3(&b1.Extents); - - XMVECTOR b2Center = XMLoadFloat3(&b2.Center); - XMVECTOR b2Extents = XMLoadFloat3(&b2.Extents); - - XMVECTOR Min = XMVectorSubtract(b1Center, b1Extents); - Min = XMVectorMin(Min, XMVectorSubtract(b2Center, b2Extents)); - - XMVECTOR Max = XMVectorAdd(b1Center, b1Extents); - Max = XMVectorMax(Max, XMVectorAdd(b2Center, b2Extents)); - - assert(XMVector3LessOrEqual(Min, Max)); - - XMStoreFloat3(&Out.Center, XMVectorScale(XMVectorAdd(Min, Max), 0.5f)); - XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(Max, Min), 0.5f)); -} - - -//----------------------------------------------------------------------------- -// Create axis-aligned box that contains a bounding sphere -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingBox::CreateFromSphere(BoundingBox& Out, const BoundingSphere& sh) noexcept -{ - XMVECTOR spCenter = XMLoadFloat3(&sh.Center); - XMVECTOR shRadius = XMVectorReplicatePtr(&sh.Radius); - - XMVECTOR Min = XMVectorSubtract(spCenter, shRadius); - XMVECTOR Max = XMVectorAdd(spCenter, shRadius); - - assert(XMVector3LessOrEqual(Min, Max)); - - XMStoreFloat3(&Out.Center, XMVectorScale(XMVectorAdd(Min, Max), 0.5f)); - XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(Max, Min), 0.5f)); -} - - -//----------------------------------------------------------------------------- -// Create axis-aligned box from min/max points -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingBox::CreateFromPoints(BoundingBox& Out, FXMVECTOR pt1, FXMVECTOR pt2) noexcept -{ - XMVECTOR Min = XMVectorMin(pt1, pt2); - XMVECTOR Max = XMVectorMax(pt1, pt2); - - // Store center and extents. - XMStoreFloat3(&Out.Center, XMVectorScale(XMVectorAdd(Min, Max), 0.5f)); - XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(Max, Min), 0.5f)); -} - - -//----------------------------------------------------------------------------- -// Find the minimum axis aligned bounding box containing a set of points. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingBox::CreateFromPoints(BoundingBox& Out, size_t Count, const XMFLOAT3* pPoints, size_t Stride) noexcept -{ - assert(Count > 0); - assert(pPoints); - - // Find the minimum and maximum x, y, and z - XMVECTOR vMin, vMax; - - vMin = vMax = XMLoadFloat3(pPoints); - - for (size_t i = 1; i < Count; ++i) - { - XMVECTOR Point = XMLoadFloat3(reinterpret_cast(reinterpret_cast(pPoints) + i * Stride)); - - vMin = XMVectorMin(vMin, Point); - vMax = XMVectorMax(vMax, Point); - } - - // Store center and extents. - XMStoreFloat3(&Out.Center, XMVectorScale(XMVectorAdd(vMin, vMax), 0.5f)); - XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(vMax, vMin), 0.5f)); -} - - -/**************************************************************************** - * - * BoundingOrientedBox - * - ****************************************************************************/ - -//----------------------------------------------------------------------------- -// Transform an oriented box by an angle preserving transform. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingOrientedBox::Transform(BoundingOrientedBox& Out, FXMMATRIX M) const noexcept -{ - // Load the box. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); - - // Composite the box rotation and the transform rotation. - XMMATRIX nM; - nM.r[0] = XMVector3Normalize(M.r[0]); - nM.r[1] = XMVector3Normalize(M.r[1]); - nM.r[2] = XMVector3Normalize(M.r[2]); - nM.r[3] = g_XMIdentityR3; - XMVECTOR Rotation = XMQuaternionRotationMatrix(nM); - vOrientation = XMQuaternionMultiply(vOrientation, Rotation); - - // Transform the center. - vCenter = XMVector3Transform(vCenter, M); - - // Scale the box extents. - XMVECTOR dX = XMVector3Length(M.r[0]); - XMVECTOR dY = XMVector3Length(M.r[1]); - XMVECTOR dZ = XMVector3Length(M.r[2]); - - XMVECTOR VectorScale = XMVectorSelect(dY, dX, g_XMSelect1000); - VectorScale = XMVectorSelect(dZ, VectorScale, g_XMSelect1100); - vExtents = XMVectorMultiply(vExtents, VectorScale); - - // Store the box. - XMStoreFloat3(&Out.Center, vCenter); - XMStoreFloat3(&Out.Extents, vExtents); - XMStoreFloat4(&Out.Orientation, vOrientation); -} - -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingOrientedBox::Transform(BoundingOrientedBox& Out, float Scale, FXMVECTOR Rotation, FXMVECTOR Translation) const noexcept -{ - assert(DirectX::MathInternal::XMQuaternionIsUnit(Rotation)); - - // Load the box. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); - - // Composite the box rotation and the transform rotation. - vOrientation = XMQuaternionMultiply(vOrientation, Rotation); - - // Transform the center. - XMVECTOR VectorScale = XMVectorReplicate(Scale); - vCenter = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(vCenter, VectorScale), Rotation), Translation); - - // Scale the box extents. - vExtents = XMVectorMultiply(vExtents, VectorScale); - - // Store the box. - XMStoreFloat3(&Out.Center, vCenter); - XMStoreFloat3(&Out.Extents, vExtents); - XMStoreFloat4(&Out.Orientation, vOrientation); -} - - -//----------------------------------------------------------------------------- -// Get the corner points of the box -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingOrientedBox::GetCorners(XMFLOAT3* Corners) const noexcept -{ - assert(Corners != nullptr); - - // Load the box - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); - - for (size_t i = 0; i < CORNER_COUNT; ++i) - { - XMVECTOR C = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(vExtents, g_BoxOffset[i]), vOrientation), vCenter); - XMStoreFloat3(&Corners[i], C); - } -} - - -//----------------------------------------------------------------------------- -// Point in oriented box test. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingOrientedBox::Contains(FXMVECTOR Point) const noexcept -{ - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - // Transform the point to be local to the box. - XMVECTOR TPoint = XMVector3InverseRotate(XMVectorSubtract(Point, vCenter), vOrientation); - - return XMVector3InBounds(TPoint, vExtents) ? CONTAINS : DISJOINT; -} - - -//----------------------------------------------------------------------------- -// Triangle in oriented bounding box -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingOrientedBox::Contains(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept -{ - // Load the box center & orientation. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - // Transform the triangle vertices into the space of the box. - XMVECTOR TV0 = XMVector3InverseRotate(XMVectorSubtract(V0, vCenter), vOrientation); - XMVECTOR TV1 = XMVector3InverseRotate(XMVectorSubtract(V1, vCenter), vOrientation); - XMVECTOR TV2 = XMVector3InverseRotate(XMVectorSubtract(V2, vCenter), vOrientation); - - BoundingBox box; - box.Center = XMFLOAT3(0.0f, 0.0f, 0.0f); - box.Extents = Extents; - - // Use the triangle vs axis aligned box intersection routine. - return box.Contains(TV0, TV1, TV2); -} - - -//----------------------------------------------------------------------------- -// Sphere in oriented bounding box -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingOrientedBox::Contains(const BoundingSphere& sh) const noexcept -{ - XMVECTOR SphereCenter = XMLoadFloat3(&sh.Center); - XMVECTOR SphereRadius = XMVectorReplicatePtr(&sh.Radius); - - XMVECTOR BoxCenter = XMLoadFloat3(&Center); - XMVECTOR BoxExtents = XMLoadFloat3(&Extents); - XMVECTOR BoxOrientation = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(BoxOrientation)); - - // Transform the center of the sphere to be local to the box. - // BoxMin = -BoxExtents - // BoxMax = +BoxExtents - SphereCenter = XMVector3InverseRotate(XMVectorSubtract(SphereCenter, BoxCenter), BoxOrientation); - - // Find the distance to the nearest point on the box. - // for each i in (x, y, z) - // if (SphereCenter(i) < BoxMin(i)) d2 += (SphereCenter(i) - BoxMin(i)) ^ 2 - // else if (SphereCenter(i) > BoxMax(i)) d2 += (SphereCenter(i) - BoxMax(i)) ^ 2 - - XMVECTOR d = XMVectorZero(); - - // Compute d for each dimension. - XMVECTOR LessThanMin = XMVectorLess(SphereCenter, XMVectorNegate(BoxExtents)); - XMVECTOR GreaterThanMax = XMVectorGreater(SphereCenter, BoxExtents); - - XMVECTOR MinDelta = XMVectorAdd(SphereCenter, BoxExtents); - XMVECTOR MaxDelta = XMVectorSubtract(SphereCenter, BoxExtents); - - // Choose value for each dimension based on the comparison. - d = XMVectorSelect(d, MinDelta, LessThanMin); - d = XMVectorSelect(d, MaxDelta, GreaterThanMax); - - // Use a dot-product to square them and sum them together. - XMVECTOR d2 = XMVector3Dot(d, d); - XMVECTOR SphereRadiusSq = XMVectorMultiply(SphereRadius, SphereRadius); - - if (XMVector4Greater(d2, SphereRadiusSq)) - return DISJOINT; - - // See if we are completely inside the box - XMVECTOR SMin = XMVectorSubtract(SphereCenter, SphereRadius); - XMVECTOR SMax = XMVectorAdd(SphereCenter, SphereRadius); - - return (XMVector3InBounds(SMin, BoxExtents) && XMVector3InBounds(SMax, BoxExtents)) ? CONTAINS : INTERSECTS; -} - - -//----------------------------------------------------------------------------- -// Axis aligned box vs. oriented box. Constructs an oriented box and uses -// the oriented box vs. oriented box test. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingOrientedBox::Contains(const BoundingBox& box) const noexcept -{ - // Make the axis aligned box oriented and do an OBB vs OBB test. - BoundingOrientedBox obox(box.Center, box.Extents, XMFLOAT4(0.f, 0.f, 0.f, 1.f)); - return Contains(obox); -} - - -//----------------------------------------------------------------------------- -// Oriented bounding box in oriented bounding box -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingOrientedBox::Contains(const BoundingOrientedBox& box) const noexcept -{ - if (!Intersects(box)) - return DISJOINT; - - // Load the boxes - XMVECTOR aCenter = XMLoadFloat3(&Center); - XMVECTOR aExtents = XMLoadFloat3(&Extents); - XMVECTOR aOrientation = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(aOrientation)); - - XMVECTOR bCenter = XMLoadFloat3(&box.Center); - XMVECTOR bExtents = XMLoadFloat3(&box.Extents); - XMVECTOR bOrientation = XMLoadFloat4(&box.Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(bOrientation)); - - XMVECTOR offset = XMVectorSubtract(bCenter, aCenter); - - for (size_t i = 0; i < CORNER_COUNT; ++i) - { - // Cb = rotate( bExtents * corneroffset[i], bOrientation ) + bcenter - // Ca = invrotate( Cb - aCenter, aOrientation ) - - XMVECTOR C = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(bExtents, g_BoxOffset[i]), bOrientation), offset); - C = XMVector3InverseRotate(C, aOrientation); - - if (!XMVector3InBounds(C, aExtents)) - return INTERSECTS; - } - - return CONTAINS; -} - - -//----------------------------------------------------------------------------- -// Frustum in oriented bounding box -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingOrientedBox::Contains(const BoundingFrustum& fr) const noexcept -{ - if (!fr.Intersects(*this)) - return DISJOINT; - - XMFLOAT3 Corners[BoundingFrustum::CORNER_COUNT]; - fr.GetCorners(Corners); - - // Load the box - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); - - for (size_t i = 0; i < BoundingFrustum::CORNER_COUNT; ++i) - { - XMVECTOR C = XMVector3InverseRotate(XMVectorSubtract(XMLoadFloat3(&Corners[i]), vCenter), vOrientation); - - if (!XMVector3InBounds(C, vExtents)) - return INTERSECTS; - } - - return CONTAINS; -} - - -//----------------------------------------------------------------------------- -// Sphere vs. oriented box test -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingOrientedBox::Intersects(const BoundingSphere& sh) const noexcept -{ - XMVECTOR SphereCenter = XMLoadFloat3(&sh.Center); - XMVECTOR SphereRadius = XMVectorReplicatePtr(&sh.Radius); - - XMVECTOR BoxCenter = XMLoadFloat3(&Center); - XMVECTOR BoxExtents = XMLoadFloat3(&Extents); - XMVECTOR BoxOrientation = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(BoxOrientation)); - - // Transform the center of the sphere to be local to the box. - // BoxMin = -BoxExtents - // BoxMax = +BoxExtents - SphereCenter = XMVector3InverseRotate(XMVectorSubtract(SphereCenter, BoxCenter), BoxOrientation); - - // Find the distance to the nearest point on the box. - // for each i in (x, y, z) - // if (SphereCenter(i) < BoxMin(i)) d2 += (SphereCenter(i) - BoxMin(i)) ^ 2 - // else if (SphereCenter(i) > BoxMax(i)) d2 += (SphereCenter(i) - BoxMax(i)) ^ 2 - - XMVECTOR d = XMVectorZero(); - - // Compute d for each dimension. - XMVECTOR LessThanMin = XMVectorLess(SphereCenter, XMVectorNegate(BoxExtents)); - XMVECTOR GreaterThanMax = XMVectorGreater(SphereCenter, BoxExtents); - - XMVECTOR MinDelta = XMVectorAdd(SphereCenter, BoxExtents); - XMVECTOR MaxDelta = XMVectorSubtract(SphereCenter, BoxExtents); - - // Choose value for each dimension based on the comparison. - d = XMVectorSelect(d, MinDelta, LessThanMin); - d = XMVectorSelect(d, MaxDelta, GreaterThanMax); - - // Use a dot-product to square them and sum them together. - XMVECTOR d2 = XMVector3Dot(d, d); - - return XMVector4LessOrEqual(d2, XMVectorMultiply(SphereRadius, SphereRadius)) ? true : false; -} - - -//----------------------------------------------------------------------------- -// Axis aligned box vs. oriented box. Constructs an oriented box and uses -// the oriented box vs. oriented box test. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingOrientedBox::Intersects(const BoundingBox& box) const noexcept -{ - // Make the axis aligned box oriented and do an OBB vs OBB test. - BoundingOrientedBox obox(box.Center, box.Extents, XMFLOAT4(0.f, 0.f, 0.f, 1.f)); - return Intersects(obox); -} - - -//----------------------------------------------------------------------------- -// Fast oriented box / oriented box intersection test using the separating axis -// theorem. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingOrientedBox::Intersects(const BoundingOrientedBox& box) const noexcept -{ - // Build the 3x3 rotation matrix that defines the orientation of B relative to A. - XMVECTOR A_quat = XMLoadFloat4(&Orientation); - XMVECTOR B_quat = XMLoadFloat4(&box.Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(A_quat)); - assert(DirectX::MathInternal::XMQuaternionIsUnit(B_quat)); - - XMVECTOR Q = XMQuaternionMultiply(A_quat, XMQuaternionConjugate(B_quat)); - XMMATRIX R = XMMatrixRotationQuaternion(Q); - - // Compute the translation of B relative to A. - XMVECTOR A_cent = XMLoadFloat3(&Center); - XMVECTOR B_cent = XMLoadFloat3(&box.Center); - XMVECTOR t = XMVector3InverseRotate(XMVectorSubtract(B_cent, A_cent), A_quat); - - // - // h(A) = extents of A. - // h(B) = extents of B. - // - // a(u) = axes of A = (1,0,0), (0,1,0), (0,0,1) - // b(u) = axes of B relative to A = (r00,r10,r20), (r01,r11,r21), (r02,r12,r22) - // - // For each possible separating axis l: - // d(A) = sum (for i = u,v,w) h(A)(i) * abs( a(i) dot l ) - // d(B) = sum (for i = u,v,w) h(B)(i) * abs( b(i) dot l ) - // if abs( t dot l ) > d(A) + d(B) then disjoint - // - - // Load extents of A and B. - XMVECTOR h_A = XMLoadFloat3(&Extents); - XMVECTOR h_B = XMLoadFloat3(&box.Extents); - - // Rows. Note R[0,1,2]X.w = 0. - XMVECTOR R0X = R.r[0]; - XMVECTOR R1X = R.r[1]; - XMVECTOR R2X = R.r[2]; - - R = XMMatrixTranspose(R); - - // Columns. Note RX[0,1,2].w = 0. - XMVECTOR RX0 = R.r[0]; - XMVECTOR RX1 = R.r[1]; - XMVECTOR RX2 = R.r[2]; - - // Absolute value of rows. - XMVECTOR AR0X = XMVectorAbs(R0X); - XMVECTOR AR1X = XMVectorAbs(R1X); - XMVECTOR AR2X = XMVectorAbs(R2X); - - // Absolute value of columns. - XMVECTOR ARX0 = XMVectorAbs(RX0); - XMVECTOR ARX1 = XMVectorAbs(RX1); - XMVECTOR ARX2 = XMVectorAbs(RX2); - - // Test each of the 15 possible seperating axii. - XMVECTOR d, d_A, d_B; - - // l = a(u) = (1, 0, 0) - // t dot l = t.x - // d(A) = h(A).x - // d(B) = h(B) dot abs(r00, r01, r02) - d = XMVectorSplatX(t); - d_A = XMVectorSplatX(h_A); - d_B = XMVector3Dot(h_B, AR0X); - XMVECTOR NoIntersection = XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B)); - - // l = a(v) = (0, 1, 0) - // t dot l = t.y - // d(A) = h(A).y - // d(B) = h(B) dot abs(r10, r11, r12) - d = XMVectorSplatY(t); - d_A = XMVectorSplatY(h_A); - d_B = XMVector3Dot(h_B, AR1X); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); - - // l = a(w) = (0, 0, 1) - // t dot l = t.z - // d(A) = h(A).z - // d(B) = h(B) dot abs(r20, r21, r22) - d = XMVectorSplatZ(t); - d_A = XMVectorSplatZ(h_A); - d_B = XMVector3Dot(h_B, AR2X); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); - - // l = b(u) = (r00, r10, r20) - // d(A) = h(A) dot abs(r00, r10, r20) - // d(B) = h(B).x - d = XMVector3Dot(t, RX0); - d_A = XMVector3Dot(h_A, ARX0); - d_B = XMVectorSplatX(h_B); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); - - // l = b(v) = (r01, r11, r21) - // d(A) = h(A) dot abs(r01, r11, r21) - // d(B) = h(B).y - d = XMVector3Dot(t, RX1); - d_A = XMVector3Dot(h_A, ARX1); - d_B = XMVectorSplatY(h_B); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); - - // l = b(w) = (r02, r12, r22) - // d(A) = h(A) dot abs(r02, r12, r22) - // d(B) = h(B).z - d = XMVector3Dot(t, RX2); - d_A = XMVector3Dot(h_A, ARX2); - d_B = XMVectorSplatZ(h_B); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); - - // l = a(u) x b(u) = (0, -r20, r10) - // d(A) = h(A) dot abs(0, r20, r10) - // d(B) = h(B) dot abs(0, r02, r01) - d = XMVector3Dot(t, XMVectorPermute(RX0, XMVectorNegate(RX0))); - d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX0)); - d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR0X)); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); - - // l = a(u) x b(v) = (0, -r21, r11) - // d(A) = h(A) dot abs(0, r21, r11) - // d(B) = h(B) dot abs(r02, 0, r00) - d = XMVector3Dot(t, XMVectorPermute(RX1, XMVectorNegate(RX1))); - d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX1)); - d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR0X)); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); - - // l = a(u) x b(w) = (0, -r22, r12) - // d(A) = h(A) dot abs(0, r22, r12) - // d(B) = h(B) dot abs(r01, r00, 0) - d = XMVector3Dot(t, XMVectorPermute(RX2, XMVectorNegate(RX2))); - d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX2)); - d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR0X)); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); - - // l = a(v) x b(u) = (r20, 0, -r00) - // d(A) = h(A) dot abs(r20, 0, r00) - // d(B) = h(B) dot abs(0, r12, r11) - d = XMVector3Dot(t, XMVectorPermute(RX0, XMVectorNegate(RX0))); - d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX0)); - d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR1X)); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); - - // l = a(v) x b(v) = (r21, 0, -r01) - // d(A) = h(A) dot abs(r21, 0, r01) - // d(B) = h(B) dot abs(r12, 0, r10) - d = XMVector3Dot(t, XMVectorPermute(RX1, XMVectorNegate(RX1))); - d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX1)); - d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR1X)); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); - - // l = a(v) x b(w) = (r22, 0, -r02) - // d(A) = h(A) dot abs(r22, 0, r02) - // d(B) = h(B) dot abs(r11, r10, 0) - d = XMVector3Dot(t, XMVectorPermute(RX2, XMVectorNegate(RX2))); - d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX2)); - d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR1X)); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); - - // l = a(w) x b(u) = (-r10, r00, 0) - // d(A) = h(A) dot abs(r10, r00, 0) - // d(B) = h(B) dot abs(0, r22, r21) - d = XMVector3Dot(t, XMVectorPermute(RX0, XMVectorNegate(RX0))); - d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX0)); - d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR2X)); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); - - // l = a(w) x b(v) = (-r11, r01, 0) - // d(A) = h(A) dot abs(r11, r01, 0) - // d(B) = h(B) dot abs(r22, 0, r20) - d = XMVector3Dot(t, XMVectorPermute(RX1, XMVectorNegate(RX1))); - d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX1)); - d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR2X)); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); - - // l = a(w) x b(w) = (-r12, r02, 0) - // d(A) = h(A) dot abs(r12, r02, 0) - // d(B) = h(B) dot abs(r21, r20, 0) - d = XMVector3Dot(t, XMVectorPermute(RX2, XMVectorNegate(RX2))); - d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX2)); - d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR2X)); - NoIntersection = XMVectorOrInt(NoIntersection, - XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); - - // No seperating axis found, boxes must intersect. - return XMVector4NotEqualInt(NoIntersection, XMVectorTrueInt()) ? true : false; -} - - -//----------------------------------------------------------------------------- -// Frustum vs. oriented box test -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingOrientedBox::Intersects(const BoundingFrustum& fr) const noexcept -{ - return fr.Intersects(*this); -} - - -//----------------------------------------------------------------------------- -// Triangle vs. oriented box test. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool XM_CALLCONV BoundingOrientedBox::Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept -{ - // Load the box center & orientation. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - // Transform the triangle vertices into the space of the box. - XMVECTOR TV0 = XMVector3InverseRotate(XMVectorSubtract(V0, vCenter), vOrientation); - XMVECTOR TV1 = XMVector3InverseRotate(XMVectorSubtract(V1, vCenter), vOrientation); - XMVECTOR TV2 = XMVector3InverseRotate(XMVectorSubtract(V2, vCenter), vOrientation); - - BoundingBox box; - box.Center = XMFLOAT3(0.0f, 0.0f, 0.0f); - box.Extents = Extents; - - // Use the triangle vs axis aligned box intersection routine. - return box.Intersects(TV0, TV1, TV2); -} - - -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline PlaneIntersectionType XM_CALLCONV BoundingOrientedBox::Intersects(FXMVECTOR Plane) const noexcept -{ - assert(DirectX::MathInternal::XMPlaneIsUnit(Plane)); - - // Load the box. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); - XMVECTOR BoxOrientation = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(BoxOrientation)); - - // Set w of the center to one so we can dot4 with a plane. - vCenter = XMVectorInsert<0, 0, 0, 0, 1>(vCenter, XMVectorSplatOne()); - - // Build the 3x3 rotation matrix that defines the box axes. - XMMATRIX R = XMMatrixRotationQuaternion(BoxOrientation); - - XMVECTOR Outside, Inside; - DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane, Outside, Inside); - - // If the box is outside any plane it is outside. - if (XMVector4EqualInt(Outside, XMVectorTrueInt())) - return FRONT; - - // If the box is inside all planes it is inside. - if (XMVector4EqualInt(Inside, XMVectorTrueInt())) - return BACK; - - // The box is not inside all planes or outside a plane it intersects. - return INTERSECTING; -} - - -//----------------------------------------------------------------------------- -// Compute the intersection of a ray (Origin, Direction) with an oriented box -// using the slabs method. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool XM_CALLCONV BoundingOrientedBox::Intersects(FXMVECTOR Origin, FXMVECTOR Direction, float& Dist) const noexcept -{ - assert(DirectX::MathInternal::XMVector3IsUnit(Direction)); - - static const XMVECTORU32 SelectY = { { { XM_SELECT_0, XM_SELECT_1, XM_SELECT_0, XM_SELECT_0 } } }; - static const XMVECTORU32 SelectZ = { { { XM_SELECT_0, XM_SELECT_0, XM_SELECT_1, XM_SELECT_0 } } }; - - // Load the box. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); - - // Get the boxes normalized side directions. - XMMATRIX R = XMMatrixRotationQuaternion(vOrientation); - - // Adjust ray origin to be relative to center of the box. - XMVECTOR TOrigin = XMVectorSubtract(vCenter, Origin); - - // Compute the dot product againt each axis of the box. - XMVECTOR AxisDotOrigin = XMVector3Dot(R.r[0], TOrigin); - AxisDotOrigin = XMVectorSelect(AxisDotOrigin, XMVector3Dot(R.r[1], TOrigin), SelectY); - AxisDotOrigin = XMVectorSelect(AxisDotOrigin, XMVector3Dot(R.r[2], TOrigin), SelectZ); - - XMVECTOR AxisDotDirection = XMVector3Dot(R.r[0], Direction); - AxisDotDirection = XMVectorSelect(AxisDotDirection, XMVector3Dot(R.r[1], Direction), SelectY); - AxisDotDirection = XMVectorSelect(AxisDotDirection, XMVector3Dot(R.r[2], Direction), SelectZ); - - // if (fabs(AxisDotDirection) <= Epsilon) the ray is nearly parallel to the slab. - XMVECTOR IsParallel = XMVectorLessOrEqual(XMVectorAbs(AxisDotDirection), g_RayEpsilon); - - // Test against all three axes simultaneously. - XMVECTOR InverseAxisDotDirection = XMVectorReciprocal(AxisDotDirection); - XMVECTOR t1 = XMVectorMultiply(XMVectorSubtract(AxisDotOrigin, vExtents), InverseAxisDotDirection); - XMVECTOR t2 = XMVectorMultiply(XMVectorAdd(AxisDotOrigin, vExtents), InverseAxisDotDirection); - - // Compute the max of min(t1,t2) and the min of max(t1,t2) ensuring we don't - // use the results from any directions parallel to the slab. - XMVECTOR t_min = XMVectorSelect(XMVectorMin(t1, t2), g_FltMin, IsParallel); - XMVECTOR t_max = XMVectorSelect(XMVectorMax(t1, t2), g_FltMax, IsParallel); - - // t_min.x = maximum( t_min.x, t_min.y, t_min.z ); - // t_max.x = minimum( t_max.x, t_max.y, t_max.z ); - t_min = XMVectorMax(t_min, XMVectorSplatY(t_min)); // x = max(x,y) - t_min = XMVectorMax(t_min, XMVectorSplatZ(t_min)); // x = max(std::max(x,y),z) - t_max = XMVectorMin(t_max, XMVectorSplatY(t_max)); // x = min(x,y) - t_max = XMVectorMin(t_max, XMVectorSplatZ(t_max)); // x = min(std::min(x,y),z) - - // if ( t_min > t_max ) return false; - XMVECTOR NoIntersection = XMVectorGreater(XMVectorSplatX(t_min), XMVectorSplatX(t_max)); - - // if ( t_max < 0.0f ) return false; - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(XMVectorSplatX(t_max), XMVectorZero())); - - // if (IsParallel && (-Extents > AxisDotOrigin || Extents < AxisDotOrigin)) return false; - XMVECTOR ParallelOverlap = XMVectorInBounds(AxisDotOrigin, vExtents); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorAndCInt(IsParallel, ParallelOverlap)); - - if (!DirectX::MathInternal::XMVector3AnyTrue(NoIntersection)) - { - // Store the x-component to *pDist - XMStoreFloat(&Dist, t_min); - return true; - } - - Dist = 0.f; - return false; -} - - -//----------------------------------------------------------------------------- -// Test an oriented box vs 6 planes (typically forming a frustum). -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingOrientedBox::ContainedBy( - FXMVECTOR Plane0, FXMVECTOR Plane1, FXMVECTOR Plane2, - GXMVECTOR Plane3, - HXMVECTOR Plane4, HXMVECTOR Plane5) const noexcept -{ - // Load the box. - XMVECTOR vCenter = XMLoadFloat3(&Center); - XMVECTOR vExtents = XMLoadFloat3(&Extents); - XMVECTOR BoxOrientation = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(BoxOrientation)); - - // Set w of the center to one so we can dot4 with a plane. - vCenter = XMVectorInsert<0, 0, 0, 0, 1>(vCenter, XMVectorSplatOne()); - - // Build the 3x3 rotation matrix that defines the box axes. - XMMATRIX R = XMMatrixRotationQuaternion(BoxOrientation); - - XMVECTOR Outside, Inside; - - // Test against each plane. - DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane0, Outside, Inside); - - XMVECTOR AnyOutside = Outside; - XMVECTOR AllInside = Inside; - - DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane1, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane2, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane3, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane4, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane5, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - // If the box is outside any plane it is outside. - if (XMVector4EqualInt(AnyOutside, XMVectorTrueInt())) - return DISJOINT; - - // If the box is inside all planes it is inside. - if (XMVector4EqualInt(AllInside, XMVectorTrueInt())) - return CONTAINS; - - // The box is not inside all planes or outside a plane, it may intersect. - return INTERSECTS; -} - - -//----------------------------------------------------------------------------- -// Create oriented bounding box from axis-aligned bounding box -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingOrientedBox::CreateFromBoundingBox(BoundingOrientedBox& Out, const BoundingBox& box) noexcept -{ - Out.Center = box.Center; - Out.Extents = box.Extents; - Out.Orientation = XMFLOAT4(0.f, 0.f, 0.f, 1.f); -} - - -//----------------------------------------------------------------------------- -// Find the approximate minimum oriented bounding box containing a set of -// points. Exact computation of minimum oriented bounding box is possible but -// is slower and requires a more complex algorithm. -// The algorithm works by computing the inertia tensor of the points and then -// using the eigenvectors of the intertia tensor as the axes of the box. -// Computing the intertia tensor of the convex hull of the points will usually -// result in better bounding box but the computation is more complex. -// Exact computation of the minimum oriented bounding box is possible but the -// best know algorithm is O(N^3) and is significanly more complex to implement. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingOrientedBox::CreateFromPoints(BoundingOrientedBox& Out, size_t Count, const XMFLOAT3* pPoints, size_t Stride) noexcept -{ - assert(Count > 0); - assert(pPoints != nullptr); - - XMVECTOR CenterOfMass = XMVectorZero(); - - // Compute the center of mass and inertia tensor of the points. - for (size_t i = 0; i < Count; ++i) - { - XMVECTOR Point = XMLoadFloat3(reinterpret_cast(reinterpret_cast(pPoints) + i * Stride)); - - CenterOfMass = XMVectorAdd(CenterOfMass, Point); - } - - CenterOfMass = XMVectorMultiply(CenterOfMass, XMVectorReciprocal(XMVectorReplicate(float(Count)))); - - // Compute the inertia tensor of the points around the center of mass. - // Using the center of mass is not strictly necessary, but will hopefully - // improve the stability of finding the eigenvectors. - XMVECTOR XX_YY_ZZ = XMVectorZero(); - XMVECTOR XY_XZ_YZ = XMVectorZero(); - - for (size_t i = 0; i < Count; ++i) - { - XMVECTOR Point = XMVectorSubtract(XMLoadFloat3(reinterpret_cast(reinterpret_cast(pPoints) + i * Stride)), CenterOfMass); - - XX_YY_ZZ = XMVectorAdd(XX_YY_ZZ, XMVectorMultiply(Point, Point)); - - XMVECTOR XXY = XMVectorSwizzle(Point); - XMVECTOR YZZ = XMVectorSwizzle(Point); - - XY_XZ_YZ = XMVectorAdd(XY_XZ_YZ, XMVectorMultiply(XXY, YZZ)); - } - - XMVECTOR v1, v2, v3; - - // Compute the eigenvectors of the inertia tensor. - DirectX::MathInternal::CalculateEigenVectorsFromCovarianceMatrix(XMVectorGetX(XX_YY_ZZ), XMVectorGetY(XX_YY_ZZ), - XMVectorGetZ(XX_YY_ZZ), - XMVectorGetX(XY_XZ_YZ), XMVectorGetY(XY_XZ_YZ), - XMVectorGetZ(XY_XZ_YZ), - &v1, &v2, &v3); - - // Put them in a matrix. - XMMATRIX R; - - R.r[0] = XMVectorSetW(v1, 0.f); - R.r[1] = XMVectorSetW(v2, 0.f); - R.r[2] = XMVectorSetW(v3, 0.f); - R.r[3] = g_XMIdentityR3.v; - - // Multiply by -1 to convert the matrix into a right handed coordinate - // system (Det ~= 1) in case the eigenvectors form a left handed - // coordinate system (Det ~= -1) because XMQuaternionRotationMatrix only - // works on right handed matrices. - XMVECTOR Det = XMMatrixDeterminant(R); - - if (XMVector4Less(Det, XMVectorZero())) - { - R.r[0] = XMVectorMultiply(R.r[0], g_XMNegativeOne.v); - R.r[1] = XMVectorMultiply(R.r[1], g_XMNegativeOne.v); - R.r[2] = XMVectorMultiply(R.r[2], g_XMNegativeOne.v); - } - - // Get the rotation quaternion from the matrix. - XMVECTOR vOrientation = XMQuaternionRotationMatrix(R); - - // Make sure it is normal (in case the vectors are slightly non-orthogonal). - vOrientation = XMQuaternionNormalize(vOrientation); - - // Rebuild the rotation matrix from the quaternion. - R = XMMatrixRotationQuaternion(vOrientation); - - // Build the rotation into the rotated space. - XMMATRIX InverseR = XMMatrixTranspose(R); - - // Find the minimum OBB using the eigenvectors as the axes. - XMVECTOR vMin, vMax; - - vMin = vMax = XMVector3TransformNormal(XMLoadFloat3(pPoints), InverseR); - - for (size_t i = 1; i < Count; ++i) - { - XMVECTOR Point = XMVector3TransformNormal(XMLoadFloat3(reinterpret_cast(reinterpret_cast(pPoints) + i * Stride)), - InverseR); - - vMin = XMVectorMin(vMin, Point); - vMax = XMVectorMax(vMax, Point); - } - - // Rotate the center into world space. - XMVECTOR vCenter = XMVectorScale(XMVectorAdd(vMin, vMax), 0.5f); - vCenter = XMVector3TransformNormal(vCenter, R); - - // Store center, extents, and orientation. - XMStoreFloat3(&Out.Center, vCenter); - XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(vMax, vMin), 0.5f)); - XMStoreFloat4(&Out.Orientation, vOrientation); -} - - -/**************************************************************************** - * - * BoundingFrustum - * - ****************************************************************************/ - -_Use_decl_annotations_ -inline BoundingFrustum::BoundingFrustum(CXMMATRIX Projection, bool rhcoords) noexcept -{ - CreateFromMatrix(*this, Projection, rhcoords); -} - - -//----------------------------------------------------------------------------- -// Transform a frustum by an angle preserving transform. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingFrustum::Transform(BoundingFrustum& Out, FXMMATRIX M) const noexcept -{ - // Load the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); - - // Composite the frustum rotation and the transform rotation - XMMATRIX nM; - nM.r[0] = XMVector3Normalize(M.r[0]); - nM.r[1] = XMVector3Normalize(M.r[1]); - nM.r[2] = XMVector3Normalize(M.r[2]); - nM.r[3] = g_XMIdentityR3; - XMVECTOR Rotation = XMQuaternionRotationMatrix(nM); - vOrientation = XMQuaternionMultiply(vOrientation, Rotation); - - // Transform the center. - vOrigin = XMVector3Transform(vOrigin, M); - - // Store the frustum. - XMStoreFloat3(&Out.Origin, vOrigin); - XMStoreFloat4(&Out.Orientation, vOrientation); - - // Scale the near and far distances (the slopes remain the same). - XMVECTOR dX = XMVector3Dot(M.r[0], M.r[0]); - XMVECTOR dY = XMVector3Dot(M.r[1], M.r[1]); - XMVECTOR dZ = XMVector3Dot(M.r[2], M.r[2]); - - XMVECTOR d = XMVectorMax(dX, XMVectorMax(dY, dZ)); - float Scale = sqrtf(XMVectorGetX(d)); - - Out.Near = Near * Scale; - Out.Far = Far * Scale; - - // Copy the slopes. - Out.RightSlope = RightSlope; - Out.LeftSlope = LeftSlope; - Out.TopSlope = TopSlope; - Out.BottomSlope = BottomSlope; -} - -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingFrustum::Transform(BoundingFrustum& Out, float Scale, FXMVECTOR Rotation, FXMVECTOR Translation) const noexcept -{ - assert(DirectX::MathInternal::XMQuaternionIsUnit(Rotation)); - - // Load the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); - - // Composite the frustum rotation and the transform rotation. - vOrientation = XMQuaternionMultiply(vOrientation, Rotation); - - // Transform the origin. - vOrigin = XMVectorAdd(XMVector3Rotate(XMVectorScale(vOrigin, Scale), Rotation), Translation); - - // Store the frustum. - XMStoreFloat3(&Out.Origin, vOrigin); - XMStoreFloat4(&Out.Orientation, vOrientation); - - // Scale the near and far distances (the slopes remain the same). - Out.Near = Near * Scale; - Out.Far = Far * Scale; - - // Copy the slopes. - Out.RightSlope = RightSlope; - Out.LeftSlope = LeftSlope; - Out.TopSlope = TopSlope; - Out.BottomSlope = BottomSlope; -} - - -//----------------------------------------------------------------------------- -// Get the corner points of the frustum -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingFrustum::GetCorners(XMFLOAT3* Corners) const noexcept -{ - assert(Corners != nullptr); - - // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); - - // Build the corners of the frustum. - XMVECTOR vRightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR vRightBottom = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vLeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR vLeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vNear = XMVectorReplicatePtr(&Near); - XMVECTOR vFar = XMVectorReplicatePtr(&Far); - - // Returns 8 corners position of bounding frustum. - // Near Far - // 0----1 4----5 - // | | | | - // | | | | - // 3----2 7----6 - - XMVECTOR vCorners[CORNER_COUNT]; - vCorners[0] = XMVectorMultiply(vLeftTop, vNear); - vCorners[1] = XMVectorMultiply(vRightTop, vNear); - vCorners[2] = XMVectorMultiply(vRightBottom, vNear); - vCorners[3] = XMVectorMultiply(vLeftBottom, vNear); - vCorners[4] = XMVectorMultiply(vLeftTop, vFar); - vCorners[5] = XMVectorMultiply(vRightTop, vFar); - vCorners[6] = XMVectorMultiply(vRightBottom, vFar); - vCorners[7] = XMVectorMultiply(vLeftBottom, vFar); - - for (size_t i = 0; i < CORNER_COUNT; ++i) - { - XMVECTOR C = XMVectorAdd(XMVector3Rotate(vCorners[i], vOrientation), vOrigin); - XMStoreFloat3(&Corners[i], C); - } -} - - -//----------------------------------------------------------------------------- -// Point in frustum test. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingFrustum::Contains(FXMVECTOR Point) const noexcept -{ - // Build frustum planes. - XMVECTOR Planes[6]; - Planes[0] = XMVectorSet(0.0f, 0.0f, -1.0f, Near); - Planes[1] = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); - Planes[2] = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); - Planes[3] = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); - Planes[4] = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); - Planes[5] = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); - - // Load origin and orientation. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); - - // Transform point into local space of frustum. - XMVECTOR TPoint = XMVector3InverseRotate(XMVectorSubtract(Point, vOrigin), vOrientation); - - // Set w to one. - TPoint = XMVectorInsert<0, 0, 0, 0, 1>(TPoint, XMVectorSplatOne()); - - XMVECTOR Zero = XMVectorZero(); - XMVECTOR Outside = Zero; - - // Test point against each plane of the frustum. - for (size_t i = 0; i < 6; ++i) - { - XMVECTOR Dot = XMVector4Dot(TPoint, Planes[i]); - Outside = XMVectorOrInt(Outside, XMVectorGreater(Dot, Zero)); - } - - return XMVector4NotEqualInt(Outside, XMVectorTrueInt()) ? CONTAINS : DISJOINT; -} - - -//----------------------------------------------------------------------------- -// Triangle vs frustum test. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingFrustum::Contains(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept -{ - // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - // Create 6 planes (do it inline to encourage use of registers) - XMVECTOR NearPlane = XMVectorSet(0.0f, 0.0f, -1.0f, Near); - NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); - NearPlane = XMPlaneNormalize(NearPlane); - - XMVECTOR FarPlane = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); - FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); - FarPlane = XMPlaneNormalize(FarPlane); - - XMVECTOR RightPlane = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); - RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); - RightPlane = XMPlaneNormalize(RightPlane); - - XMVECTOR LeftPlane = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); - LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); - LeftPlane = XMPlaneNormalize(LeftPlane); - - XMVECTOR TopPlane = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); - TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); - TopPlane = XMPlaneNormalize(TopPlane); - - XMVECTOR BottomPlane = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); - BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); - BottomPlane = XMPlaneNormalize(BottomPlane); - - return TriangleTests::ContainedBy(V0, V1, V2, NearPlane, FarPlane, RightPlane, LeftPlane, TopPlane, BottomPlane); -} - - -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingFrustum::Contains(const BoundingSphere& sh) const noexcept -{ - // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - // Create 6 planes (do it inline to encourage use of registers) - XMVECTOR NearPlane = XMVectorSet(0.0f, 0.0f, -1.0f, Near); - NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); - NearPlane = XMPlaneNormalize(NearPlane); - - XMVECTOR FarPlane = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); - FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); - FarPlane = XMPlaneNormalize(FarPlane); - - XMVECTOR RightPlane = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); - RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); - RightPlane = XMPlaneNormalize(RightPlane); - - XMVECTOR LeftPlane = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); - LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); - LeftPlane = XMPlaneNormalize(LeftPlane); - - XMVECTOR TopPlane = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); - TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); - TopPlane = XMPlaneNormalize(TopPlane); - - XMVECTOR BottomPlane = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); - BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); - BottomPlane = XMPlaneNormalize(BottomPlane); - - return sh.ContainedBy(NearPlane, FarPlane, RightPlane, LeftPlane, TopPlane, BottomPlane); -} - - -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingFrustum::Contains(const BoundingBox& box) const noexcept -{ - // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - // Create 6 planes (do it inline to encourage use of registers) - XMVECTOR NearPlane = XMVectorSet(0.0f, 0.0f, -1.0f, Near); - NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); - NearPlane = XMPlaneNormalize(NearPlane); - - XMVECTOR FarPlane = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); - FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); - FarPlane = XMPlaneNormalize(FarPlane); - - XMVECTOR RightPlane = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); - RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); - RightPlane = XMPlaneNormalize(RightPlane); - - XMVECTOR LeftPlane = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); - LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); - LeftPlane = XMPlaneNormalize(LeftPlane); - - XMVECTOR TopPlane = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); - TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); - TopPlane = XMPlaneNormalize(TopPlane); - - XMVECTOR BottomPlane = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); - BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); - BottomPlane = XMPlaneNormalize(BottomPlane); - - return box.ContainedBy(NearPlane, FarPlane, RightPlane, LeftPlane, TopPlane, BottomPlane); -} - - -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingFrustum::Contains(const BoundingOrientedBox& box) const noexcept -{ - // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - // Create 6 planes (do it inline to encourage use of registers) - XMVECTOR NearPlane = XMVectorSet(0.0f, 0.0f, -1.0f, Near); - NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); - NearPlane = XMPlaneNormalize(NearPlane); - - XMVECTOR FarPlane = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); - FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); - FarPlane = XMPlaneNormalize(FarPlane); - - XMVECTOR RightPlane = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); - RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); - RightPlane = XMPlaneNormalize(RightPlane); - - XMVECTOR LeftPlane = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); - LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); - LeftPlane = XMPlaneNormalize(LeftPlane); - - XMVECTOR TopPlane = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); - TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); - TopPlane = XMPlaneNormalize(TopPlane); - - XMVECTOR BottomPlane = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); - BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); - BottomPlane = XMPlaneNormalize(BottomPlane); - - return box.ContainedBy(NearPlane, FarPlane, RightPlane, LeftPlane, TopPlane, BottomPlane); -} - - -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType BoundingFrustum::Contains(const BoundingFrustum& fr) const noexcept -{ - // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - // Create 6 planes (do it inline to encourage use of registers) - XMVECTOR NearPlane = XMVectorSet(0.0f, 0.0f, -1.0f, Near); - NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); - NearPlane = XMPlaneNormalize(NearPlane); - - XMVECTOR FarPlane = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); - FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); - FarPlane = XMPlaneNormalize(FarPlane); - - XMVECTOR RightPlane = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); - RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); - RightPlane = XMPlaneNormalize(RightPlane); - - XMVECTOR LeftPlane = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); - LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); - LeftPlane = XMPlaneNormalize(LeftPlane); - - XMVECTOR TopPlane = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); - TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); - TopPlane = XMPlaneNormalize(TopPlane); - - XMVECTOR BottomPlane = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); - BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); - BottomPlane = XMPlaneNormalize(BottomPlane); - - return fr.ContainedBy(NearPlane, FarPlane, RightPlane, LeftPlane, TopPlane, BottomPlane); -} - - -//----------------------------------------------------------------------------- -// Exact sphere vs frustum test. The algorithm first checks the sphere against -// the planes of the frustum, then if the plane checks were indeterminate finds -// the nearest feature (plane, line, point) on the frustum to the center of the -// sphere and compares the distance to the nearest feature to the radius of the -// sphere -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingFrustum::Intersects(const BoundingSphere& sh) const noexcept -{ - XMVECTOR Zero = XMVectorZero(); - - // Build the frustum planes. - XMVECTOR Planes[6]; - Planes[0] = XMVectorSet(0.0f, 0.0f, -1.0f, Near); - Planes[1] = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); - Planes[2] = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); - Planes[3] = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); - Planes[4] = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); - Planes[5] = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); - - // Normalize the planes so we can compare to the sphere radius. - Planes[2] = XMVector3Normalize(Planes[2]); - Planes[3] = XMVector3Normalize(Planes[3]); - Planes[4] = XMVector3Normalize(Planes[4]); - Planes[5] = XMVector3Normalize(Planes[5]); - - // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); - - // Load the sphere. - XMVECTOR vCenter = XMLoadFloat3(&sh.Center); - XMVECTOR vRadius = XMVectorReplicatePtr(&sh.Radius); - - // Transform the center of the sphere into the local space of frustum. - vCenter = XMVector3InverseRotate(XMVectorSubtract(vCenter, vOrigin), vOrientation); - - // Set w of the center to one so we can dot4 with the plane. - vCenter = XMVectorInsert<0, 0, 0, 0, 1>(vCenter, XMVectorSplatOne()); - - // Check against each plane of the frustum. - XMVECTOR Outside = XMVectorFalseInt(); - XMVECTOR InsideAll = XMVectorTrueInt(); - XMVECTOR CenterInsideAll = XMVectorTrueInt(); - - XMVECTOR Dist[6]; - - for (size_t i = 0; i < 6; ++i) - { - Dist[i] = XMVector4Dot(vCenter, Planes[i]); - - // Outside the plane? - Outside = XMVectorOrInt(Outside, XMVectorGreater(Dist[i], vRadius)); - - // Fully inside the plane? - InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(Dist[i], XMVectorNegate(vRadius))); - - // Check if the center is inside the plane. - CenterInsideAll = XMVectorAndInt(CenterInsideAll, XMVectorLessOrEqual(Dist[i], Zero)); - } - - // If the sphere is outside any of the planes it is outside. - if (XMVector4EqualInt(Outside, XMVectorTrueInt())) - return false; - - // If the sphere is inside all planes it is fully inside. - if (XMVector4EqualInt(InsideAll, XMVectorTrueInt())) - return true; - - // If the center of the sphere is inside all planes and the sphere intersects - // one or more planes then it must intersect. - if (XMVector4EqualInt(CenterInsideAll, XMVectorTrueInt())) - return true; - - // The sphere may be outside the frustum or intersecting the frustum. - // Find the nearest feature (face, edge, or corner) on the frustum - // to the sphere. - - // The faces adjacent to each face are: - static const size_t adjacent_faces[6][4] = - { - { 2, 3, 4, 5 }, // 0 - { 2, 3, 4, 5 }, // 1 - { 0, 1, 4, 5 }, // 2 - { 0, 1, 4, 5 }, // 3 - { 0, 1, 2, 3 }, // 4 - { 0, 1, 2, 3 } - }; // 5 - - XMVECTOR Intersects = XMVectorFalseInt(); - - // Check to see if the nearest feature is one of the planes. - for (size_t i = 0; i < 6; ++i) - { - // Find the nearest point on the plane to the center of the sphere. - XMVECTOR Point = XMVectorNegativeMultiplySubtract(Planes[i], Dist[i], vCenter); - - // Set w of the point to one. - Point = XMVectorInsert<0, 0, 0, 0, 1>(Point, XMVectorSplatOne()); - - // If the point is inside the face (inside the adjacent planes) then - // this plane is the nearest feature. - XMVECTOR InsideFace = XMVectorTrueInt(); - - for (size_t j = 0; j < 4; j++) - { - size_t plane_index = adjacent_faces[i][j]; - - InsideFace = XMVectorAndInt(InsideFace, - XMVectorLessOrEqual(XMVector4Dot(Point, Planes[plane_index]), Zero)); - } - - // Since we have already checked distance from the plane we know that the - // sphere must intersect if this plane is the nearest feature. - Intersects = XMVectorOrInt(Intersects, - XMVectorAndInt(XMVectorGreater(Dist[i], Zero), InsideFace)); - } - - if (XMVector4EqualInt(Intersects, XMVectorTrueInt())) - return true; - - // Build the corners of the frustum. - XMVECTOR vRightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR vRightBottom = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vLeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR vLeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vNear = XMVectorReplicatePtr(&Near); - XMVECTOR vFar = XMVectorReplicatePtr(&Far); - - XMVECTOR Corners[CORNER_COUNT]; - Corners[0] = XMVectorMultiply(vRightTop, vNear); - Corners[1] = XMVectorMultiply(vRightBottom, vNear); - Corners[2] = XMVectorMultiply(vLeftTop, vNear); - Corners[3] = XMVectorMultiply(vLeftBottom, vNear); - Corners[4] = XMVectorMultiply(vRightTop, vFar); - Corners[5] = XMVectorMultiply(vRightBottom, vFar); - Corners[6] = XMVectorMultiply(vLeftTop, vFar); - Corners[7] = XMVectorMultiply(vLeftBottom, vFar); - - // The Edges are: - static const size_t edges[12][2] = - { - { 0, 1 }, { 2, 3 }, { 0, 2 }, { 1, 3 }, // Near plane - { 4, 5 }, { 6, 7 }, { 4, 6 }, { 5, 7 }, // Far plane - { 0, 4 }, { 1, 5 }, { 2, 6 }, { 3, 7 }, - }; // Near to far - - XMVECTOR RadiusSq = XMVectorMultiply(vRadius, vRadius); - - // Check to see if the nearest feature is one of the edges (or corners). - for (size_t i = 0; i < 12; ++i) - { - size_t ei0 = edges[i][0]; - size_t ei1 = edges[i][1]; - - // Find the nearest point on the edge to the center of the sphere. - // The corners of the frustum are included as the endpoints of the edges. - XMVECTOR Point = DirectX::MathInternal::PointOnLineSegmentNearestPoint(Corners[ei0], Corners[ei1], vCenter); - - XMVECTOR Delta = XMVectorSubtract(vCenter, Point); - - XMVECTOR DistSq = XMVector3Dot(Delta, Delta); - - // If the distance to the center of the sphere to the point is less than - // the radius of the sphere then it must intersect. - Intersects = XMVectorOrInt(Intersects, XMVectorLessOrEqual(DistSq, RadiusSq)); - } - - if (XMVector4EqualInt(Intersects, XMVectorTrueInt())) - return true; - - // The sphere must be outside the frustum. - return false; -} - - -//----------------------------------------------------------------------------- -// Exact axis aligned box vs frustum test. Constructs an oriented box and uses -// the oriented box vs frustum test. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingFrustum::Intersects(const BoundingBox& box) const noexcept -{ - // Make the axis aligned box oriented and do an OBB vs frustum test. - BoundingOrientedBox obox(box.Center, box.Extents, XMFLOAT4(0.f, 0.f, 0.f, 1.f)); - return Intersects(obox); -} - - -//----------------------------------------------------------------------------- -// Exact oriented box vs frustum test. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingFrustum::Intersects(const BoundingOrientedBox& box) const noexcept -{ - static const XMVECTORU32 SelectY = { { { XM_SELECT_0, XM_SELECT_1, XM_SELECT_0, XM_SELECT_0 } } }; - static const XMVECTORU32 SelectZ = { { { XM_SELECT_0, XM_SELECT_0, XM_SELECT_1, XM_SELECT_0 } } }; - - XMVECTOR Zero = XMVectorZero(); - - // Build the frustum planes. - XMVECTOR Planes[6]; - Planes[0] = XMVectorSet(0.0f, 0.0f, -1.0f, Near); - Planes[1] = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); - Planes[2] = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); - Planes[3] = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); - Planes[4] = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); - Planes[5] = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); - - // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); - XMVECTOR FrustumOrientation = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(FrustumOrientation)); - - // Load the box. - XMVECTOR Center = XMLoadFloat3(&box.Center); - XMVECTOR Extents = XMLoadFloat3(&box.Extents); - XMVECTOR BoxOrientation = XMLoadFloat4(&box.Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(BoxOrientation)); - - // Transform the oriented box into the space of the frustum in order to - // minimize the number of transforms we have to do. - Center = XMVector3InverseRotate(XMVectorSubtract(Center, vOrigin), FrustumOrientation); - BoxOrientation = XMQuaternionMultiply(BoxOrientation, XMQuaternionConjugate(FrustumOrientation)); - - // Set w of the center to one so we can dot4 with the plane. - Center = XMVectorInsert<0, 0, 0, 0, 1>(Center, XMVectorSplatOne()); - - // Build the 3x3 rotation matrix that defines the box axes. - XMMATRIX R = XMMatrixRotationQuaternion(BoxOrientation); - - // Check against each plane of the frustum. - XMVECTOR Outside = XMVectorFalseInt(); - XMVECTOR InsideAll = XMVectorTrueInt(); - XMVECTOR CenterInsideAll = XMVectorTrueInt(); - - for (size_t i = 0; i < 6; ++i) - { - // Compute the distance to the center of the box. - XMVECTOR Dist = XMVector4Dot(Center, Planes[i]); - - // Project the axes of the box onto the normal of the plane. Half the - // length of the projection (sometime called the "radius") is equal to - // h(u) * abs(n dot b(u))) + h(v) * abs(n dot b(v)) + h(w) * abs(n dot b(w)) - // where h(i) are extents of the box, n is the plane normal, and b(i) are the - // axes of the box. - XMVECTOR Radius = XMVector3Dot(Planes[i], R.r[0]); - Radius = XMVectorSelect(Radius, XMVector3Dot(Planes[i], R.r[1]), SelectY); - Radius = XMVectorSelect(Radius, XMVector3Dot(Planes[i], R.r[2]), SelectZ); - Radius = XMVector3Dot(Extents, XMVectorAbs(Radius)); - - // Outside the plane? - Outside = XMVectorOrInt(Outside, XMVectorGreater(Dist, Radius)); - - // Fully inside the plane? - InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(Dist, XMVectorNegate(Radius))); - - // Check if the center is inside the plane. - CenterInsideAll = XMVectorAndInt(CenterInsideAll, XMVectorLessOrEqual(Dist, Zero)); - } - - // If the box is outside any of the planes it is outside. - if (XMVector4EqualInt(Outside, XMVectorTrueInt())) - return false; - - // If the box is inside all planes it is fully inside. - if (XMVector4EqualInt(InsideAll, XMVectorTrueInt())) - return true; - - // If the center of the box is inside all planes and the box intersects - // one or more planes then it must intersect. - if (XMVector4EqualInt(CenterInsideAll, XMVectorTrueInt())) - return true; - - // Build the corners of the frustum. - XMVECTOR vRightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR vRightBottom = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vLeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR vLeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vNear = XMVectorReplicatePtr(&Near); - XMVECTOR vFar = XMVectorReplicatePtr(&Far); - - XMVECTOR Corners[CORNER_COUNT]; - Corners[0] = XMVectorMultiply(vRightTop, vNear); - Corners[1] = XMVectorMultiply(vRightBottom, vNear); - Corners[2] = XMVectorMultiply(vLeftTop, vNear); - Corners[3] = XMVectorMultiply(vLeftBottom, vNear); - Corners[4] = XMVectorMultiply(vRightTop, vFar); - Corners[5] = XMVectorMultiply(vRightBottom, vFar); - Corners[6] = XMVectorMultiply(vLeftTop, vFar); - Corners[7] = XMVectorMultiply(vLeftBottom, vFar); - - // Test against box axes (3) - { - // Find the min/max values of the projection of the frustum onto each axis. - XMVECTOR FrustumMin, FrustumMax; - - FrustumMin = XMVector3Dot(Corners[0], R.r[0]); - FrustumMin = XMVectorSelect(FrustumMin, XMVector3Dot(Corners[0], R.r[1]), SelectY); - FrustumMin = XMVectorSelect(FrustumMin, XMVector3Dot(Corners[0], R.r[2]), SelectZ); - FrustumMax = FrustumMin; - - for (size_t i = 1; i < BoundingOrientedBox::CORNER_COUNT; ++i) - { - XMVECTOR Temp = XMVector3Dot(Corners[i], R.r[0]); - Temp = XMVectorSelect(Temp, XMVector3Dot(Corners[i], R.r[1]), SelectY); - Temp = XMVectorSelect(Temp, XMVector3Dot(Corners[i], R.r[2]), SelectZ); - - FrustumMin = XMVectorMin(FrustumMin, Temp); - FrustumMax = XMVectorMax(FrustumMax, Temp); - } - - // Project the center of the box onto the axes. - XMVECTOR BoxDist = XMVector3Dot(Center, R.r[0]); - BoxDist = XMVectorSelect(BoxDist, XMVector3Dot(Center, R.r[1]), SelectY); - BoxDist = XMVectorSelect(BoxDist, XMVector3Dot(Center, R.r[2]), SelectZ); - - // The projection of the box onto the axis is just its Center and Extents. - // if (min > box_max || max < box_min) reject; - XMVECTOR Result = XMVectorOrInt(XMVectorGreater(FrustumMin, XMVectorAdd(BoxDist, Extents)), - XMVectorLess(FrustumMax, XMVectorSubtract(BoxDist, Extents))); - - if (DirectX::MathInternal::XMVector3AnyTrue(Result)) - return false; - } - - // Test against edge/edge axes (3*6). - XMVECTOR FrustumEdgeAxis[6]; - - FrustumEdgeAxis[0] = vRightTop; - FrustumEdgeAxis[1] = vRightBottom; - FrustumEdgeAxis[2] = vLeftTop; - FrustumEdgeAxis[3] = vLeftBottom; - FrustumEdgeAxis[4] = XMVectorSubtract(vRightTop, vLeftTop); - FrustumEdgeAxis[5] = XMVectorSubtract(vLeftBottom, vLeftTop); - - for (size_t i = 0; i < 3; ++i) - { - for (size_t j = 0; j < 6; j++) - { - // Compute the axis we are going to test. - XMVECTOR Axis = XMVector3Cross(R.r[i], FrustumEdgeAxis[j]); - - // Find the min/max values of the projection of the frustum onto the axis. - XMVECTOR FrustumMin, FrustumMax; - - FrustumMin = FrustumMax = XMVector3Dot(Axis, Corners[0]); - - for (size_t k = 1; k < CORNER_COUNT; k++) - { - XMVECTOR Temp = XMVector3Dot(Axis, Corners[k]); - FrustumMin = XMVectorMin(FrustumMin, Temp); - FrustumMax = XMVectorMax(FrustumMax, Temp); - } - - // Project the center of the box onto the axis. - XMVECTOR Dist = XMVector3Dot(Center, Axis); - - // Project the axes of the box onto the axis to find the "radius" of the box. - XMVECTOR Radius = XMVector3Dot(Axis, R.r[0]); - Radius = XMVectorSelect(Radius, XMVector3Dot(Axis, R.r[1]), SelectY); - Radius = XMVectorSelect(Radius, XMVector3Dot(Axis, R.r[2]), SelectZ); - Radius = XMVector3Dot(Extents, XMVectorAbs(Radius)); - - // if (center > max + radius || center < min - radius) reject; - Outside = XMVectorOrInt(Outside, XMVectorGreater(Dist, XMVectorAdd(FrustumMax, Radius))); - Outside = XMVectorOrInt(Outside, XMVectorLess(Dist, XMVectorSubtract(FrustumMin, Radius))); - } - } - - if (XMVector4EqualInt(Outside, XMVectorTrueInt())) - return false; - - // If we did not find a separating plane then the box must intersect the frustum. - return true; -} - - -//----------------------------------------------------------------------------- -// Exact frustum vs frustum test. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool BoundingFrustum::Intersects(const BoundingFrustum& fr) const noexcept -{ - // Load origin and orientation of frustum B. - XMVECTOR OriginB = XMLoadFloat3(&Origin); - XMVECTOR OrientationB = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(OrientationB)); - - // Build the planes of frustum B. - XMVECTOR AxisB[6]; - AxisB[0] = XMVectorSet(0.0f, 0.0f, -1.0f, 0.0f); - AxisB[1] = XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f); - AxisB[2] = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); - AxisB[3] = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); - AxisB[4] = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); - AxisB[5] = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); - - XMVECTOR PlaneDistB[6]; - PlaneDistB[0] = XMVectorNegate(XMVectorReplicatePtr(&Near)); - PlaneDistB[1] = XMVectorReplicatePtr(&Far); - PlaneDistB[2] = XMVectorZero(); - PlaneDistB[3] = XMVectorZero(); - PlaneDistB[4] = XMVectorZero(); - PlaneDistB[5] = XMVectorZero(); - - // Load origin and orientation of frustum A. - XMVECTOR OriginA = XMLoadFloat3(&fr.Origin); - XMVECTOR OrientationA = XMLoadFloat4(&fr.Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(OrientationA)); - - // Transform frustum A into the space of the frustum B in order to - // minimize the number of transforms we have to do. - OriginA = XMVector3InverseRotate(XMVectorSubtract(OriginA, OriginB), OrientationB); - OrientationA = XMQuaternionMultiply(OrientationA, XMQuaternionConjugate(OrientationB)); - - // Build the corners of frustum A (in the local space of B). - XMVECTOR RightTopA = XMVectorSet(fr.RightSlope, fr.TopSlope, 1.0f, 0.0f); - XMVECTOR RightBottomA = XMVectorSet(fr.RightSlope, fr.BottomSlope, 1.0f, 0.0f); - XMVECTOR LeftTopA = XMVectorSet(fr.LeftSlope, fr.TopSlope, 1.0f, 0.0f); - XMVECTOR LeftBottomA = XMVectorSet(fr.LeftSlope, fr.BottomSlope, 1.0f, 0.0f); - XMVECTOR NearA = XMVectorReplicatePtr(&fr.Near); - XMVECTOR FarA = XMVectorReplicatePtr(&fr.Far); - - RightTopA = XMVector3Rotate(RightTopA, OrientationA); - RightBottomA = XMVector3Rotate(RightBottomA, OrientationA); - LeftTopA = XMVector3Rotate(LeftTopA, OrientationA); - LeftBottomA = XMVector3Rotate(LeftBottomA, OrientationA); - - XMVECTOR CornersA[CORNER_COUNT]; - CornersA[0] = XMVectorMultiplyAdd(RightTopA, NearA, OriginA); - CornersA[1] = XMVectorMultiplyAdd(RightBottomA, NearA, OriginA); - CornersA[2] = XMVectorMultiplyAdd(LeftTopA, NearA, OriginA); - CornersA[3] = XMVectorMultiplyAdd(LeftBottomA, NearA, OriginA); - CornersA[4] = XMVectorMultiplyAdd(RightTopA, FarA, OriginA); - CornersA[5] = XMVectorMultiplyAdd(RightBottomA, FarA, OriginA); - CornersA[6] = XMVectorMultiplyAdd(LeftTopA, FarA, OriginA); - CornersA[7] = XMVectorMultiplyAdd(LeftBottomA, FarA, OriginA); - - // Check frustum A against each plane of frustum B. - XMVECTOR Outside = XMVectorFalseInt(); - XMVECTOR InsideAll = XMVectorTrueInt(); - - for (size_t i = 0; i < 6; ++i) - { - // Find the min/max projection of the frustum onto the plane normal. - XMVECTOR Min, Max; - - Min = Max = XMVector3Dot(AxisB[i], CornersA[0]); - - for (size_t j = 1; j < CORNER_COUNT; j++) - { - XMVECTOR Temp = XMVector3Dot(AxisB[i], CornersA[j]); - Min = XMVectorMin(Min, Temp); - Max = XMVectorMax(Max, Temp); - } - - // Outside the plane? - Outside = XMVectorOrInt(Outside, XMVectorGreater(Min, PlaneDistB[i])); - - // Fully inside the plane? - InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(Max, PlaneDistB[i])); - } - - // If the frustum A is outside any of the planes of frustum B it is outside. - if (XMVector4EqualInt(Outside, XMVectorTrueInt())) - return false; - - // If frustum A is inside all planes of frustum B it is fully inside. - if (XMVector4EqualInt(InsideAll, XMVectorTrueInt())) - return true; - - // Build the corners of frustum B. - XMVECTOR RightTopB = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR RightBottomB = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR LeftTopB = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR LeftBottomB = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR NearB = XMVectorReplicatePtr(&Near); - XMVECTOR FarB = XMVectorReplicatePtr(&Far); - - XMVECTOR CornersB[BoundingFrustum::CORNER_COUNT]; - CornersB[0] = XMVectorMultiply(RightTopB, NearB); - CornersB[1] = XMVectorMultiply(RightBottomB, NearB); - CornersB[2] = XMVectorMultiply(LeftTopB, NearB); - CornersB[3] = XMVectorMultiply(LeftBottomB, NearB); - CornersB[4] = XMVectorMultiply(RightTopB, FarB); - CornersB[5] = XMVectorMultiply(RightBottomB, FarB); - CornersB[6] = XMVectorMultiply(LeftTopB, FarB); - CornersB[7] = XMVectorMultiply(LeftBottomB, FarB); - - // Build the planes of frustum A (in the local space of B). - XMVECTOR AxisA[6]; - XMVECTOR PlaneDistA[6]; - - AxisA[0] = XMVectorSet(0.0f, 0.0f, -1.0f, 0.0f); - AxisA[1] = XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f); - AxisA[2] = XMVectorSet(1.0f, 0.0f, -fr.RightSlope, 0.0f); - AxisA[3] = XMVectorSet(-1.0f, 0.0f, fr.LeftSlope, 0.0f); - AxisA[4] = XMVectorSet(0.0f, 1.0f, -fr.TopSlope, 0.0f); - AxisA[5] = XMVectorSet(0.0f, -1.0f, fr.BottomSlope, 0.0f); - - AxisA[0] = XMVector3Rotate(AxisA[0], OrientationA); - AxisA[1] = XMVectorNegate(AxisA[0]); - AxisA[2] = XMVector3Rotate(AxisA[2], OrientationA); - AxisA[3] = XMVector3Rotate(AxisA[3], OrientationA); - AxisA[4] = XMVector3Rotate(AxisA[4], OrientationA); - AxisA[5] = XMVector3Rotate(AxisA[5], OrientationA); - - PlaneDistA[0] = XMVector3Dot(AxisA[0], CornersA[0]); // Re-use corner on near plane. - PlaneDistA[1] = XMVector3Dot(AxisA[1], CornersA[4]); // Re-use corner on far plane. - PlaneDistA[2] = XMVector3Dot(AxisA[2], OriginA); - PlaneDistA[3] = XMVector3Dot(AxisA[3], OriginA); - PlaneDistA[4] = XMVector3Dot(AxisA[4], OriginA); - PlaneDistA[5] = XMVector3Dot(AxisA[5], OriginA); - - // Check each axis of frustum A for a seperating plane (5). - for (size_t i = 0; i < 6; ++i) - { - // Find the minimum projection of the frustum onto the plane normal. - XMVECTOR Min; - - Min = XMVector3Dot(AxisA[i], CornersB[0]); - - for (size_t j = 1; j < CORNER_COUNT; j++) - { - XMVECTOR Temp = XMVector3Dot(AxisA[i], CornersB[j]); - Min = XMVectorMin(Min, Temp); - } - - // Outside the plane? - Outside = XMVectorOrInt(Outside, XMVectorGreater(Min, PlaneDistA[i])); - } - - // If the frustum B is outside any of the planes of frustum A it is outside. - if (XMVector4EqualInt(Outside, XMVectorTrueInt())) - return false; - - // Check edge/edge axes (6 * 6). - XMVECTOR FrustumEdgeAxisA[6]; - FrustumEdgeAxisA[0] = RightTopA; - FrustumEdgeAxisA[1] = RightBottomA; - FrustumEdgeAxisA[2] = LeftTopA; - FrustumEdgeAxisA[3] = LeftBottomA; - FrustumEdgeAxisA[4] = XMVectorSubtract(RightTopA, LeftTopA); - FrustumEdgeAxisA[5] = XMVectorSubtract(LeftBottomA, LeftTopA); - - XMVECTOR FrustumEdgeAxisB[6]; - FrustumEdgeAxisB[0] = RightTopB; - FrustumEdgeAxisB[1] = RightBottomB; - FrustumEdgeAxisB[2] = LeftTopB; - FrustumEdgeAxisB[3] = LeftBottomB; - FrustumEdgeAxisB[4] = XMVectorSubtract(RightTopB, LeftTopB); - FrustumEdgeAxisB[5] = XMVectorSubtract(LeftBottomB, LeftTopB); - - for (size_t i = 0; i < 6; ++i) - { - for (size_t j = 0; j < 6; j++) - { - // Compute the axis we are going to test. - XMVECTOR Axis = XMVector3Cross(FrustumEdgeAxisA[i], FrustumEdgeAxisB[j]); - - // Find the min/max values of the projection of both frustums onto the axis. - XMVECTOR MinA, MaxA; - XMVECTOR MinB, MaxB; - - MinA = MaxA = XMVector3Dot(Axis, CornersA[0]); - MinB = MaxB = XMVector3Dot(Axis, CornersB[0]); - - for (size_t k = 1; k < CORNER_COUNT; k++) - { - XMVECTOR TempA = XMVector3Dot(Axis, CornersA[k]); - MinA = XMVectorMin(MinA, TempA); - MaxA = XMVectorMax(MaxA, TempA); - - XMVECTOR TempB = XMVector3Dot(Axis, CornersB[k]); - MinB = XMVectorMin(MinB, TempB); - MaxB = XMVectorMax(MaxB, TempB); - } - - // if (MinA > MaxB || MinB > MaxA) reject - Outside = XMVectorOrInt(Outside, XMVectorGreater(MinA, MaxB)); - Outside = XMVectorOrInt(Outside, XMVectorGreater(MinB, MaxA)); - } - } - - // If there is a seperating plane, then the frustums do not intersect. - if (XMVector4EqualInt(Outside, XMVectorTrueInt())) - return false; - - // If we did not find a separating plane then the frustums intersect. - return true; -} - - -//----------------------------------------------------------------------------- -// Triangle vs frustum test. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept -{ - // Build the frustum planes (NOTE: D is negated from the usual). - XMVECTOR Planes[6]; - Planes[0] = XMVectorSet(0.0f, 0.0f, -1.0f, -Near); - Planes[1] = XMVectorSet(0.0f, 0.0f, 1.0f, Far); - Planes[2] = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); - Planes[3] = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); - Planes[4] = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); - Planes[5] = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); - - // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); - - // Transform triangle into the local space of frustum. - XMVECTOR TV0 = XMVector3InverseRotate(XMVectorSubtract(V0, vOrigin), vOrientation); - XMVECTOR TV1 = XMVector3InverseRotate(XMVectorSubtract(V1, vOrigin), vOrientation); - XMVECTOR TV2 = XMVector3InverseRotate(XMVectorSubtract(V2, vOrigin), vOrientation); - - // Test each vertex of the triangle against the frustum planes. - XMVECTOR Outside = XMVectorFalseInt(); - XMVECTOR InsideAll = XMVectorTrueInt(); - - for (size_t i = 0; i < 6; ++i) - { - XMVECTOR Dist0 = XMVector3Dot(TV0, Planes[i]); - XMVECTOR Dist1 = XMVector3Dot(TV1, Planes[i]); - XMVECTOR Dist2 = XMVector3Dot(TV2, Planes[i]); - - XMVECTOR MinDist = XMVectorMin(Dist0, Dist1); - MinDist = XMVectorMin(MinDist, Dist2); - XMVECTOR MaxDist = XMVectorMax(Dist0, Dist1); - MaxDist = XMVectorMax(MaxDist, Dist2); - - XMVECTOR PlaneDist = XMVectorSplatW(Planes[i]); - - // Outside the plane? - Outside = XMVectorOrInt(Outside, XMVectorGreater(MinDist, PlaneDist)); - - // Fully inside the plane? - InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(MaxDist, PlaneDist)); - } - - // If the triangle is outside any of the planes it is outside. - if (XMVector4EqualInt(Outside, XMVectorTrueInt())) - return false; - - // If the triangle is inside all planes it is fully inside. - if (XMVector4EqualInt(InsideAll, XMVectorTrueInt())) - return true; - - // Build the corners of the frustum. - XMVECTOR vRightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR vRightBottom = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vLeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR vLeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vNear = XMVectorReplicatePtr(&Near); - XMVECTOR vFar = XMVectorReplicatePtr(&Far); - - XMVECTOR Corners[CORNER_COUNT]; - Corners[0] = XMVectorMultiply(vRightTop, vNear); - Corners[1] = XMVectorMultiply(vRightBottom, vNear); - Corners[2] = XMVectorMultiply(vLeftTop, vNear); - Corners[3] = XMVectorMultiply(vLeftBottom, vNear); - Corners[4] = XMVectorMultiply(vRightTop, vFar); - Corners[5] = XMVectorMultiply(vRightBottom, vFar); - Corners[6] = XMVectorMultiply(vLeftTop, vFar); - Corners[7] = XMVectorMultiply(vLeftBottom, vFar); - - // Test the plane of the triangle. - XMVECTOR Normal = XMVector3Cross(XMVectorSubtract(V1, V0), XMVectorSubtract(V2, V0)); - XMVECTOR Dist = XMVector3Dot(Normal, V0); - - XMVECTOR MinDist, MaxDist; - MinDist = MaxDist = XMVector3Dot(Corners[0], Normal); - for (size_t i = 1; i < CORNER_COUNT; ++i) - { - XMVECTOR Temp = XMVector3Dot(Corners[i], Normal); - MinDist = XMVectorMin(MinDist, Temp); - MaxDist = XMVectorMax(MaxDist, Temp); - } - - Outside = XMVectorOrInt(XMVectorGreater(MinDist, Dist), XMVectorLess(MaxDist, Dist)); - if (XMVector4EqualInt(Outside, XMVectorTrueInt())) - return false; - - // Check the edge/edge axes (3*6). - XMVECTOR TriangleEdgeAxis[3]; - TriangleEdgeAxis[0] = XMVectorSubtract(V1, V0); - TriangleEdgeAxis[1] = XMVectorSubtract(V2, V1); - TriangleEdgeAxis[2] = XMVectorSubtract(V0, V2); - - XMVECTOR FrustumEdgeAxis[6]; - FrustumEdgeAxis[0] = vRightTop; - FrustumEdgeAxis[1] = vRightBottom; - FrustumEdgeAxis[2] = vLeftTop; - FrustumEdgeAxis[3] = vLeftBottom; - FrustumEdgeAxis[4] = XMVectorSubtract(vRightTop, vLeftTop); - FrustumEdgeAxis[5] = XMVectorSubtract(vLeftBottom, vLeftTop); - - for (size_t i = 0; i < 3; ++i) - { - for (size_t j = 0; j < 6; j++) - { - // Compute the axis we are going to test. - XMVECTOR Axis = XMVector3Cross(TriangleEdgeAxis[i], FrustumEdgeAxis[j]); - - // Find the min/max of the projection of the triangle onto the axis. - XMVECTOR MinA, MaxA; - - XMVECTOR Dist0 = XMVector3Dot(V0, Axis); - XMVECTOR Dist1 = XMVector3Dot(V1, Axis); - XMVECTOR Dist2 = XMVector3Dot(V2, Axis); - - MinA = XMVectorMin(Dist0, Dist1); - MinA = XMVectorMin(MinA, Dist2); - MaxA = XMVectorMax(Dist0, Dist1); - MaxA = XMVectorMax(MaxA, Dist2); - - // Find the min/max of the projection of the frustum onto the axis. - XMVECTOR MinB, MaxB; - - MinB = MaxB = XMVector3Dot(Axis, Corners[0]); - - for (size_t k = 1; k < CORNER_COUNT; k++) - { - XMVECTOR Temp = XMVector3Dot(Axis, Corners[k]); - MinB = XMVectorMin(MinB, Temp); - MaxB = XMVectorMax(MaxB, Temp); - } - - // if (MinA > MaxB || MinB > MaxA) reject; - Outside = XMVectorOrInt(Outside, XMVectorGreater(MinA, MaxB)); - Outside = XMVectorOrInt(Outside, XMVectorGreater(MinB, MaxA)); - } - } - - if (XMVector4EqualInt(Outside, XMVectorTrueInt())) - return false; - - // If we did not find a separating plane then the triangle must intersect the frustum. - return true; -} - - -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline PlaneIntersectionType XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR Plane) const noexcept -{ - assert(DirectX::MathInternal::XMPlaneIsUnit(Plane)); - - // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); - - // Set w of the origin to one so we can dot4 with a plane. - vOrigin = XMVectorInsert<0, 0, 0, 0, 1>(vOrigin, XMVectorSplatOne()); - - // Build the corners of the frustum (in world space). - XMVECTOR RightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR RightBottom = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR LeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR LeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vNear = XMVectorReplicatePtr(&Near); - XMVECTOR vFar = XMVectorReplicatePtr(&Far); - - RightTop = XMVector3Rotate(RightTop, vOrientation); - RightBottom = XMVector3Rotate(RightBottom, vOrientation); - LeftTop = XMVector3Rotate(LeftTop, vOrientation); - LeftBottom = XMVector3Rotate(LeftBottom, vOrientation); - - XMVECTOR Corners0 = XMVectorMultiplyAdd(RightTop, vNear, vOrigin); - XMVECTOR Corners1 = XMVectorMultiplyAdd(RightBottom, vNear, vOrigin); - XMVECTOR Corners2 = XMVectorMultiplyAdd(LeftTop, vNear, vOrigin); - XMVECTOR Corners3 = XMVectorMultiplyAdd(LeftBottom, vNear, vOrigin); - XMVECTOR Corners4 = XMVectorMultiplyAdd(RightTop, vFar, vOrigin); - XMVECTOR Corners5 = XMVectorMultiplyAdd(RightBottom, vFar, vOrigin); - XMVECTOR Corners6 = XMVectorMultiplyAdd(LeftTop, vFar, vOrigin); - XMVECTOR Corners7 = XMVectorMultiplyAdd(LeftBottom, vFar, vOrigin); - - XMVECTOR Outside, Inside; - DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, - Corners4, Corners5, Corners6, Corners7, - Plane, Outside, Inside); - - // If the frustum is outside any plane it is outside. - if (XMVector4EqualInt(Outside, XMVectorTrueInt())) - return FRONT; - - // If the frustum is inside all planes it is inside. - if (XMVector4EqualInt(Inside, XMVectorTrueInt())) - return BACK; - - // The frustum is not inside all planes or outside a plane it intersects. - return INTERSECTING; -} - - -//----------------------------------------------------------------------------- -// Ray vs. frustum test -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline bool XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR rayOrigin, FXMVECTOR Direction, float& Dist) const noexcept -{ - // If ray starts inside the frustum, return a distance of 0 for the hit - if (Contains(rayOrigin) == CONTAINS) - { - Dist = 0.0f; - return true; - } - - // Build the frustum planes. - XMVECTOR Planes[6]; - Planes[0] = XMVectorSet(0.0f, 0.0f, -1.0f, Near); - Planes[1] = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); - Planes[2] = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); - Planes[3] = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); - Planes[4] = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); - Planes[5] = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); - - // Load origin and orientation of the frustum. - XMVECTOR frOrigin = XMLoadFloat3(&Origin); - XMVECTOR frOrientation = XMLoadFloat4(&Orientation); - - // This algorithm based on "Fast Ray-Convex Polyhedron Intersectin," in James Arvo, ed., Graphics Gems II pp. 247-250 - float tnear = -FLT_MAX; - float tfar = FLT_MAX; - - for (size_t i = 0; i < 6; ++i) - { - XMVECTOR Plane = DirectX::MathInternal::XMPlaneTransform(Planes[i], frOrientation, frOrigin); - Plane = XMPlaneNormalize(Plane); - - XMVECTOR AxisDotOrigin = XMPlaneDotCoord(Plane, rayOrigin); - XMVECTOR AxisDotDirection = XMVector3Dot(Plane, Direction); - - if (XMVector3LessOrEqual(XMVectorAbs(AxisDotDirection), g_RayEpsilon)) - { - // Ray is parallel to plane - check if ray origin is inside plane's - if (XMVector3Greater(AxisDotOrigin, g_XMZero)) - { - // Ray origin is outside half-space. - Dist = 0.f; - return false; - } - } - else - { - // Ray not parallel - get distance to plane. - float vd = XMVectorGetX(AxisDotDirection); - float vn = XMVectorGetX(AxisDotOrigin); - float t = -vn / vd; - if (vd < 0.0f) - { - // Front face - T is a near point. - if (t > tfar) - { - Dist = 0.f; - return false; - } - if (t > tnear) - { - // Hit near face. - tnear = t; - } - } - else - { - // back face - T is far point. - if (t < tnear) - { - Dist = 0.f; - return false; - } - if (t < tfar) - { - // Hit far face. - tfar = t; - } - } - } - } - - // Survived all tests. - // Note: if ray originates on polyhedron, may want to change 0.0f to some - // epsilon to avoid intersecting the originating face. - float distance = (tnear >= 0.0f) ? tnear : tfar; - if (distance >= 0.0f) - { - Dist = distance; - return true; - } - - Dist = 0.f; - return false; -} - - -//----------------------------------------------------------------------------- -// Test a frustum vs 6 planes (typically forming another frustum). -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline ContainmentType XM_CALLCONV BoundingFrustum::ContainedBy( - FXMVECTOR Plane0, FXMVECTOR Plane1, FXMVECTOR Plane2, - GXMVECTOR Plane3, - HXMVECTOR Plane4, HXMVECTOR Plane5) const noexcept -{ - // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); - - // Set w of the origin to one so we can dot4 with a plane. - vOrigin = XMVectorInsert<0, 0, 0, 0, 1>(vOrigin, XMVectorSplatOne()); - - // Build the corners of the frustum (in world space). - XMVECTOR RightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR RightBottom = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR LeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); - XMVECTOR LeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); - XMVECTOR vNear = XMVectorReplicatePtr(&Near); - XMVECTOR vFar = XMVectorReplicatePtr(&Far); - - RightTop = XMVector3Rotate(RightTop, vOrientation); - RightBottom = XMVector3Rotate(RightBottom, vOrientation); - LeftTop = XMVector3Rotate(LeftTop, vOrientation); - LeftBottom = XMVector3Rotate(LeftBottom, vOrientation); - - XMVECTOR Corners0 = XMVectorMultiplyAdd(RightTop, vNear, vOrigin); - XMVECTOR Corners1 = XMVectorMultiplyAdd(RightBottom, vNear, vOrigin); - XMVECTOR Corners2 = XMVectorMultiplyAdd(LeftTop, vNear, vOrigin); - XMVECTOR Corners3 = XMVectorMultiplyAdd(LeftBottom, vNear, vOrigin); - XMVECTOR Corners4 = XMVectorMultiplyAdd(RightTop, vFar, vOrigin); - XMVECTOR Corners5 = XMVectorMultiplyAdd(RightBottom, vFar, vOrigin); - XMVECTOR Corners6 = XMVectorMultiplyAdd(LeftTop, vFar, vOrigin); - XMVECTOR Corners7 = XMVectorMultiplyAdd(LeftBottom, vFar, vOrigin); - - XMVECTOR Outside, Inside; - - // Test against each plane. - DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, - Corners4, Corners5, Corners6, Corners7, - Plane0, Outside, Inside); - - XMVECTOR AnyOutside = Outside; - XMVECTOR AllInside = Inside; - - DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, - Corners4, Corners5, Corners6, Corners7, - Plane1, Outside, Inside); - - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, - Corners4, Corners5, Corners6, Corners7, - Plane2, Outside, Inside); - - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, - Corners4, Corners5, Corners6, Corners7, - Plane3, Outside, Inside); - - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, - Corners4, Corners5, Corners6, Corners7, - Plane4, Outside, Inside); - - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, - Corners4, Corners5, Corners6, Corners7, - Plane5, Outside, Inside); - - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - // If the frustum is outside any plane it is outside. - if (XMVector4EqualInt(AnyOutside, XMVectorTrueInt())) - return DISJOINT; - - // If the frustum is inside all planes it is inside. - if (XMVector4EqualInt(AllInside, XMVectorTrueInt())) - return CONTAINS; - - // The frustum is not inside all planes or outside a plane, it may intersect. - return INTERSECTS; -} - - -//----------------------------------------------------------------------------- -// Build the 6 frustum planes from a frustum. -// -// The intended use for these routines is for fast culling to a view frustum. -// When the volume being tested against a view frustum is small relative to the -// view frustum it is usually either inside all six planes of the frustum -// (CONTAINS) or outside one of the planes of the frustum (DISJOINT). If neither -// of these cases is true then it may or may not be intersecting the frustum -// (INTERSECTS) -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void BoundingFrustum::GetPlanes(XMVECTOR* NearPlane, XMVECTOR* FarPlane, XMVECTOR* RightPlane, - XMVECTOR* LeftPlane, XMVECTOR* TopPlane, XMVECTOR* BottomPlane) const noexcept -{ - // Load origin and orientation of the frustum. - XMVECTOR vOrigin = XMLoadFloat3(&Origin); - XMVECTOR vOrientation = XMLoadFloat4(&Orientation); - - if (NearPlane) - { - XMVECTOR vNearPlane = XMVectorSet(0.0f, 0.0f, -1.0f, Near); - vNearPlane = DirectX::MathInternal::XMPlaneTransform(vNearPlane, vOrientation, vOrigin); - *NearPlane = XMPlaneNormalize(vNearPlane); - } - - if (FarPlane) - { - XMVECTOR vFarPlane = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); - vFarPlane = DirectX::MathInternal::XMPlaneTransform(vFarPlane, vOrientation, vOrigin); - *FarPlane = XMPlaneNormalize(vFarPlane); - } - - if (RightPlane) - { - XMVECTOR vRightPlane = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); - vRightPlane = DirectX::MathInternal::XMPlaneTransform(vRightPlane, vOrientation, vOrigin); - *RightPlane = XMPlaneNormalize(vRightPlane); - } - - if (LeftPlane) - { - XMVECTOR vLeftPlane = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); - vLeftPlane = DirectX::MathInternal::XMPlaneTransform(vLeftPlane, vOrientation, vOrigin); - *LeftPlane = XMPlaneNormalize(vLeftPlane); - } - - if (TopPlane) - { - XMVECTOR vTopPlane = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); - vTopPlane = DirectX::MathInternal::XMPlaneTransform(vTopPlane, vOrientation, vOrigin); - *TopPlane = XMPlaneNormalize(vTopPlane); - } - - if (BottomPlane) - { - XMVECTOR vBottomPlane = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); - vBottomPlane = DirectX::MathInternal::XMPlaneTransform(vBottomPlane, vOrientation, vOrigin); - *BottomPlane = XMPlaneNormalize(vBottomPlane); - } -} - - -//----------------------------------------------------------------------------- -// Build a frustum from a persepective projection matrix. The matrix may only -// contain a projection; any rotation, translation or scale will cause the -// constructed frustum to be incorrect. -//----------------------------------------------------------------------------- -_Use_decl_annotations_ -inline void XM_CALLCONV BoundingFrustum::CreateFromMatrix(BoundingFrustum& Out, FXMMATRIX Projection, bool rhcoords) noexcept -{ - // Corners of the projection frustum in NDC space. - static XMVECTORF32 NDCPoints[6] = - { - { { { 1.0f, 0.0f, 1.0f, 1.0f } } }, // right (at far plane) - { { { -1.0f, 0.0f, 1.0f, 1.0f } } }, // left - { { { 0.0f, 1.0f, 1.0f, 1.0f } } }, // top - { { { 0.0f, -1.0f, 1.0f, 1.0f } } }, // bottom - - { { { 0.0f, 0.0f, 0.0f, 1.0f } } }, // near - { { { 0.0f, 0.0f, 1.0f, 1.0f } } } // far - }; - - XMVECTOR Determinant; - XMMATRIX matInverse = XMMatrixInverse(&Determinant, Projection); - - // Compute the frustum corners in world space. - XMVECTOR Points[6]; - - for (size_t i = 0; i < 6; ++i) - { - // Transform point. - Points[i] = XMVector4Transform(NDCPoints[i], matInverse); - } - - Out.Origin = XMFLOAT3(0.0f, 0.0f, 0.0f); - Out.Orientation = XMFLOAT4(0.0f, 0.0f, 0.0f, 1.0f); - - // Compute the slopes. - Points[0] = XMVectorMultiply(Points[0], XMVectorReciprocal(XMVectorSplatZ(Points[0]))); - Points[1] = XMVectorMultiply(Points[1], XMVectorReciprocal(XMVectorSplatZ(Points[1]))); - Points[2] = XMVectorMultiply(Points[2], XMVectorReciprocal(XMVectorSplatZ(Points[2]))); - Points[3] = XMVectorMultiply(Points[3], XMVectorReciprocal(XMVectorSplatZ(Points[3]))); - - Out.RightSlope = XMVectorGetX(Points[0]); - Out.LeftSlope = XMVectorGetX(Points[1]); - Out.TopSlope = XMVectorGetY(Points[2]); - Out.BottomSlope = XMVectorGetY(Points[3]); - - // Compute near and far. - Points[4] = XMVectorMultiply(Points[4], XMVectorReciprocal(XMVectorSplatW(Points[4]))); - Points[5] = XMVectorMultiply(Points[5], XMVectorReciprocal(XMVectorSplatW(Points[5]))); - - if (rhcoords) - { - Out.Near = XMVectorGetZ(Points[5]); - Out.Far = XMVectorGetZ(Points[4]); - } - else - { - Out.Near = XMVectorGetZ(Points[4]); - Out.Far = XMVectorGetZ(Points[5]); - } -} - - -/**************************************************************************** - * - * TriangleTests - * - ****************************************************************************/ - -namespace TriangleTests -{ - - //----------------------------------------------------------------------------- - // Compute the intersection of a ray (Origin, Direction) with a triangle - // (V0, V1, V2). Return true if there is an intersection and also set *pDist - // to the distance along the ray to the intersection. - // - // The algorithm is based on Moller, Tomas and Trumbore, "Fast, Minimum Storage - // Ray-Triangle Intersection", Journal of Graphics Tools, vol. 2, no. 1, - // pp 21-28, 1997. - //----------------------------------------------------------------------------- - _Use_decl_annotations_ - inline bool XM_CALLCONV Intersects( - FXMVECTOR Origin, FXMVECTOR Direction, FXMVECTOR V0, - GXMVECTOR V1, - HXMVECTOR V2, float& Dist) noexcept - { - assert(DirectX::MathInternal::XMVector3IsUnit(Direction)); - - XMVECTOR Zero = XMVectorZero(); - - XMVECTOR e1 = XMVectorSubtract(V1, V0); - XMVECTOR e2 = XMVectorSubtract(V2, V0); - - // p = Direction ^ e2; - XMVECTOR p = XMVector3Cross(Direction, e2); - - // det = e1 * p; - XMVECTOR det = XMVector3Dot(e1, p); - - XMVECTOR u, v, t; - - if (XMVector3GreaterOrEqual(det, g_RayEpsilon)) - { - // Determinate is positive (front side of the triangle). - XMVECTOR s = XMVectorSubtract(Origin, V0); - - // u = s * p; - u = XMVector3Dot(s, p); - - XMVECTOR NoIntersection = XMVectorLess(u, Zero); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(u, det)); - - // q = s ^ e1; - XMVECTOR q = XMVector3Cross(s, e1); - - // v = Direction * q; - v = XMVector3Dot(Direction, q); - - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(v, Zero)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(XMVectorAdd(u, v), det)); - - // t = e2 * q; - t = XMVector3Dot(e2, q); - - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(t, Zero)); - - if (XMVector4EqualInt(NoIntersection, XMVectorTrueInt())) - { - Dist = 0.f; - return false; - } - } - else if (XMVector3LessOrEqual(det, g_RayNegEpsilon)) - { - // Determinate is negative (back side of the triangle). - XMVECTOR s = XMVectorSubtract(Origin, V0); - - // u = s * p; - u = XMVector3Dot(s, p); - - XMVECTOR NoIntersection = XMVectorGreater(u, Zero); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(u, det)); - - // q = s ^ e1; - XMVECTOR q = XMVector3Cross(s, e1); - - // v = Direction * q; - v = XMVector3Dot(Direction, q); - - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(v, Zero)); - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(XMVectorAdd(u, v), det)); - - // t = e2 * q; - t = XMVector3Dot(e2, q); - - NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(t, Zero)); - - if (XMVector4EqualInt(NoIntersection, XMVectorTrueInt())) - { - Dist = 0.f; - return false; - } - } - else - { - // Parallel ray. - Dist = 0.f; - return false; - } - - t = XMVectorDivide(t, det); - - // (u / det) and (v / dev) are the barycentric cooridinates of the intersection. - - // Store the x-component to *pDist - XMStoreFloat(&Dist, t); - - return true; - } - - - //----------------------------------------------------------------------------- - // Test if two triangles intersect. - // - // The final test of algorithm is based on Shen, Heng, and Tang, "A Fast - // Triangle-Triangle Overlap Test Using Signed Distances", Journal of Graphics - // Tools, vol. 8, no. 1, pp 17-23, 2003 and Guigue and Devillers, "Fast and - // Robust Triangle-Triangle Overlap Test Using Orientation Predicates", Journal - // of Graphics Tools, vol. 8, no. 1, pp 25-32, 2003. - // - // The final test could be considered an edge-edge separating plane test with - // the 9 possible cases narrowed down to the only two pairs of edges that can - // actaully result in a seperation. - //----------------------------------------------------------------------------- - _Use_decl_annotations_ - inline bool XM_CALLCONV Intersects(FXMVECTOR A0, FXMVECTOR A1, FXMVECTOR A2, GXMVECTOR B0, HXMVECTOR B1, HXMVECTOR B2) noexcept - { - static const XMVECTORU32 SelectY = { { { XM_SELECT_0, XM_SELECT_1, XM_SELECT_0, XM_SELECT_0 } } }; - static const XMVECTORU32 SelectZ = { { { XM_SELECT_0, XM_SELECT_0, XM_SELECT_1, XM_SELECT_0 } } }; - static const XMVECTORU32 Select0111 = { { { XM_SELECT_0, XM_SELECT_1, XM_SELECT_1, XM_SELECT_1 } } }; - static const XMVECTORU32 Select1011 = { { { XM_SELECT_1, XM_SELECT_0, XM_SELECT_1, XM_SELECT_1 } } }; - static const XMVECTORU32 Select1101 = { { { XM_SELECT_1, XM_SELECT_1, XM_SELECT_0, XM_SELECT_1 } } }; - - XMVECTOR Zero = XMVectorZero(); - - // Compute the normal of triangle A. - XMVECTOR N1 = XMVector3Cross(XMVectorSubtract(A1, A0), XMVectorSubtract(A2, A0)); - - // Assert that the triangle is not degenerate. - assert(!XMVector3Equal(N1, Zero)); - - // Test points of B against the plane of A. - XMVECTOR BDist = XMVector3Dot(N1, XMVectorSubtract(B0, A0)); - BDist = XMVectorSelect(BDist, XMVector3Dot(N1, XMVectorSubtract(B1, A0)), SelectY); - BDist = XMVectorSelect(BDist, XMVector3Dot(N1, XMVectorSubtract(B2, A0)), SelectZ); - - // Ensure robustness with co-planar triangles by zeroing small distances. - uint32_t BDistIsZeroCR; - XMVECTOR BDistIsZero = XMVectorGreaterR(&BDistIsZeroCR, g_RayEpsilon, XMVectorAbs(BDist)); - BDist = XMVectorSelect(BDist, Zero, BDistIsZero); - - uint32_t BDistIsLessCR; - XMVECTOR BDistIsLess = XMVectorGreaterR(&BDistIsLessCR, Zero, BDist); - - uint32_t BDistIsGreaterCR; - XMVECTOR BDistIsGreater = XMVectorGreaterR(&BDistIsGreaterCR, BDist, Zero); - - // If all the points are on the same side we don't intersect. - if (XMComparisonAllTrue(BDistIsLessCR) || XMComparisonAllTrue(BDistIsGreaterCR)) - return false; - - // Compute the normal of triangle B. - XMVECTOR N2 = XMVector3Cross(XMVectorSubtract(B1, B0), XMVectorSubtract(B2, B0)); - - // Assert that the triangle is not degenerate. - assert(!XMVector3Equal(N2, Zero)); - - // Test points of A against the plane of B. - XMVECTOR ADist = XMVector3Dot(N2, XMVectorSubtract(A0, B0)); - ADist = XMVectorSelect(ADist, XMVector3Dot(N2, XMVectorSubtract(A1, B0)), SelectY); - ADist = XMVectorSelect(ADist, XMVector3Dot(N2, XMVectorSubtract(A2, B0)), SelectZ); - - // Ensure robustness with co-planar triangles by zeroing small distances. - uint32_t ADistIsZeroCR; - XMVECTOR ADistIsZero = XMVectorGreaterR(&ADistIsZeroCR, g_RayEpsilon, XMVectorAbs(ADist)); - ADist = XMVectorSelect(ADist, Zero, ADistIsZero); - - uint32_t ADistIsLessCR; - XMVECTOR ADistIsLess = XMVectorGreaterR(&ADistIsLessCR, Zero, ADist); - - uint32_t ADistIsGreaterCR; - XMVECTOR ADistIsGreater = XMVectorGreaterR(&ADistIsGreaterCR, ADist, Zero); - - // If all the points are on the same side we don't intersect. - if (XMComparisonAllTrue(ADistIsLessCR) || XMComparisonAllTrue(ADistIsGreaterCR)) - return false; - - // Special case for co-planar triangles. - if (XMComparisonAllTrue(ADistIsZeroCR) || XMComparisonAllTrue(BDistIsZeroCR)) - { - XMVECTOR Axis, Dist, MinDist; - - // Compute an axis perpindicular to the edge (points out). - Axis = XMVector3Cross(N1, XMVectorSubtract(A1, A0)); - Dist = XMVector3Dot(Axis, A0); - - // Test points of B against the axis. - MinDist = XMVector3Dot(B0, Axis); - MinDist = XMVectorMin(MinDist, XMVector3Dot(B1, Axis)); - MinDist = XMVectorMin(MinDist, XMVector3Dot(B2, Axis)); - if (XMVector4GreaterOrEqual(MinDist, Dist)) - return false; - - // Edge (A1, A2) - Axis = XMVector3Cross(N1, XMVectorSubtract(A2, A1)); - Dist = XMVector3Dot(Axis, A1); - - MinDist = XMVector3Dot(B0, Axis); - MinDist = XMVectorMin(MinDist, XMVector3Dot(B1, Axis)); - MinDist = XMVectorMin(MinDist, XMVector3Dot(B2, Axis)); - if (XMVector4GreaterOrEqual(MinDist, Dist)) - return false; - - // Edge (A2, A0) - Axis = XMVector3Cross(N1, XMVectorSubtract(A0, A2)); - Dist = XMVector3Dot(Axis, A2); - - MinDist = XMVector3Dot(B0, Axis); - MinDist = XMVectorMin(MinDist, XMVector3Dot(B1, Axis)); - MinDist = XMVectorMin(MinDist, XMVector3Dot(B2, Axis)); - if (XMVector4GreaterOrEqual(MinDist, Dist)) - return false; - - // Edge (B0, B1) - Axis = XMVector3Cross(N2, XMVectorSubtract(B1, B0)); - Dist = XMVector3Dot(Axis, B0); - - MinDist = XMVector3Dot(A0, Axis); - MinDist = XMVectorMin(MinDist, XMVector3Dot(A1, Axis)); - MinDist = XMVectorMin(MinDist, XMVector3Dot(A2, Axis)); - if (XMVector4GreaterOrEqual(MinDist, Dist)) - return false; - - // Edge (B1, B2) - Axis = XMVector3Cross(N2, XMVectorSubtract(B2, B1)); - Dist = XMVector3Dot(Axis, B1); - - MinDist = XMVector3Dot(A0, Axis); - MinDist = XMVectorMin(MinDist, XMVector3Dot(A1, Axis)); - MinDist = XMVectorMin(MinDist, XMVector3Dot(A2, Axis)); - if (XMVector4GreaterOrEqual(MinDist, Dist)) - return false; - - // Edge (B2,B0) - Axis = XMVector3Cross(N2, XMVectorSubtract(B0, B2)); - Dist = XMVector3Dot(Axis, B2); - - MinDist = XMVector3Dot(A0, Axis); - MinDist = XMVectorMin(MinDist, XMVector3Dot(A1, Axis)); - MinDist = XMVectorMin(MinDist, XMVector3Dot(A2, Axis)); - if (XMVector4GreaterOrEqual(MinDist, Dist)) - return false; - - return true; - } - - // - // Find the single vertex of A and B (ie the vertex on the opposite side - // of the plane from the other two) and reorder the edges so we can compute - // the signed edge/edge distances. - // - // if ( (V0 >= 0 && V1 < 0 && V2 < 0) || - // (V0 > 0 && V1 <= 0 && V2 <= 0) || - // (V0 <= 0 && V1 > 0 && V2 > 0) || - // (V0 < 0 && V1 >= 0 && V2 >= 0) ) then V0 is singular; - // - // If our singular vertex is not on the positive side of the plane we reverse - // the triangle winding so that the overlap comparisons will compare the - // correct edges with the correct signs. - // - XMVECTOR ADistIsLessEqual = XMVectorOrInt(ADistIsLess, ADistIsZero); - XMVECTOR ADistIsGreaterEqual = XMVectorOrInt(ADistIsGreater, ADistIsZero); - - XMVECTOR AA0, AA1, AA2; - bool bPositiveA; - - if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreaterEqual, ADistIsLess, Select0111)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreater, ADistIsLessEqual, Select0111))) - { - // A0 is singular, crossing from positive to negative. - AA0 = A0; AA1 = A1; AA2 = A2; - bPositiveA = true; - } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLessEqual, ADistIsGreater, Select0111)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLess, ADistIsGreaterEqual, Select0111))) - { - // A0 is singular, crossing from negative to positive. - AA0 = A0; AA1 = A2; AA2 = A1; - bPositiveA = false; - } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreaterEqual, ADistIsLess, Select1011)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreater, ADistIsLessEqual, Select1011))) - { - // A1 is singular, crossing from positive to negative. - AA0 = A1; AA1 = A2; AA2 = A0; - bPositiveA = true; - } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLessEqual, ADistIsGreater, Select1011)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLess, ADistIsGreaterEqual, Select1011))) - { - // A1 is singular, crossing from negative to positive. - AA0 = A1; AA1 = A0; AA2 = A2; - bPositiveA = false; - } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreaterEqual, ADistIsLess, Select1101)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreater, ADistIsLessEqual, Select1101))) - { - // A2 is singular, crossing from positive to negative. - AA0 = A2; AA1 = A0; AA2 = A1; - bPositiveA = true; - } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLessEqual, ADistIsGreater, Select1101)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLess, ADistIsGreaterEqual, Select1101))) - { - // A2 is singular, crossing from negative to positive. - AA0 = A2; AA1 = A1; AA2 = A0; - bPositiveA = false; - } - else - { - assert(false); - return false; - } - - XMVECTOR BDistIsLessEqual = XMVectorOrInt(BDistIsLess, BDistIsZero); - XMVECTOR BDistIsGreaterEqual = XMVectorOrInt(BDistIsGreater, BDistIsZero); - - XMVECTOR BB0, BB1, BB2; - bool bPositiveB; - - if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreaterEqual, BDistIsLess, Select0111)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreater, BDistIsLessEqual, Select0111))) - { - // B0 is singular, crossing from positive to negative. - BB0 = B0; BB1 = B1; BB2 = B2; - bPositiveB = true; - } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLessEqual, BDistIsGreater, Select0111)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLess, BDistIsGreaterEqual, Select0111))) - { - // B0 is singular, crossing from negative to positive. - BB0 = B0; BB1 = B2; BB2 = B1; - bPositiveB = false; - } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreaterEqual, BDistIsLess, Select1011)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreater, BDistIsLessEqual, Select1011))) - { - // B1 is singular, crossing from positive to negative. - BB0 = B1; BB1 = B2; BB2 = B0; - bPositiveB = true; - } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLessEqual, BDistIsGreater, Select1011)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLess, BDistIsGreaterEqual, Select1011))) - { - // B1 is singular, crossing from negative to positive. - BB0 = B1; BB1 = B0; BB2 = B2; - bPositiveB = false; - } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreaterEqual, BDistIsLess, Select1101)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreater, BDistIsLessEqual, Select1101))) - { - // B2 is singular, crossing from positive to negative. - BB0 = B2; BB1 = B0; BB2 = B1; - bPositiveB = true; - } - else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLessEqual, BDistIsGreater, Select1101)) || - DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLess, BDistIsGreaterEqual, Select1101))) - { - // B2 is singular, crossing from negative to positive. - BB0 = B2; BB1 = B1; BB2 = B0; - bPositiveB = false; - } - else - { - assert(false); - return false; - } - - XMVECTOR Delta0, Delta1; - - // Reverse the direction of the test depending on whether the singular vertices are - // the same sign or different signs. - if (bPositiveA ^ bPositiveB) - { - Delta0 = XMVectorSubtract(BB0, AA0); - Delta1 = XMVectorSubtract(AA0, BB0); - } - else - { - Delta0 = XMVectorSubtract(AA0, BB0); - Delta1 = XMVectorSubtract(BB0, AA0); - } - - // Check if the triangles overlap on the line of intersection between the - // planes of the two triangles by finding the signed line distances. - XMVECTOR Dist0 = XMVector3Dot(Delta0, XMVector3Cross(XMVectorSubtract(BB2, BB0), XMVectorSubtract(AA2, AA0))); - if (XMVector4Greater(Dist0, Zero)) - return false; - - XMVECTOR Dist1 = XMVector3Dot(Delta1, XMVector3Cross(XMVectorSubtract(BB1, BB0), XMVectorSubtract(AA1, AA0))); - if (XMVector4Greater(Dist1, Zero)) - return false; - - return true; - } - - - //----------------------------------------------------------------------------- - // Ray-triangle test - //----------------------------------------------------------------------------- - _Use_decl_annotations_ - inline PlaneIntersectionType XM_CALLCONV Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2, GXMVECTOR Plane) noexcept - { - XMVECTOR One = XMVectorSplatOne(); - - assert(DirectX::MathInternal::XMPlaneIsUnit(Plane)); - - // Set w of the points to one so we can dot4 with a plane. - XMVECTOR TV0 = XMVectorInsert<0, 0, 0, 0, 1>(V0, One); - XMVECTOR TV1 = XMVectorInsert<0, 0, 0, 0, 1>(V1, One); - XMVECTOR TV2 = XMVectorInsert<0, 0, 0, 0, 1>(V2, One); - - XMVECTOR Outside, Inside; - DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane, Outside, Inside); - - // If the triangle is outside any plane it is outside. - if (XMVector4EqualInt(Outside, XMVectorTrueInt())) - return FRONT; - - // If the triangle is inside all planes it is inside. - if (XMVector4EqualInt(Inside, XMVectorTrueInt())) - return BACK; - - // The triangle is not inside all planes or outside a plane it intersects. - return INTERSECTING; - } - - - //----------------------------------------------------------------------------- - // Test a triangle vs 6 planes (typically forming a frustum). - //----------------------------------------------------------------------------- - _Use_decl_annotations_ - inline ContainmentType XM_CALLCONV ContainedBy( - FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2, - GXMVECTOR Plane0, - HXMVECTOR Plane1, HXMVECTOR Plane2, - CXMVECTOR Plane3, CXMVECTOR Plane4, CXMVECTOR Plane5) noexcept - { - XMVECTOR One = XMVectorSplatOne(); - - // Set w of the points to one so we can dot4 with a plane. - XMVECTOR TV0 = XMVectorInsert<0, 0, 0, 0, 1>(V0, One); - XMVECTOR TV1 = XMVectorInsert<0, 0, 0, 0, 1>(V1, One); - XMVECTOR TV2 = XMVectorInsert<0, 0, 0, 0, 1>(V2, One); - - XMVECTOR Outside, Inside; - - // Test against each plane. - DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane0, Outside, Inside); - - XMVECTOR AnyOutside = Outside; - XMVECTOR AllInside = Inside; - - DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane1, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane2, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane3, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane4, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane5, Outside, Inside); - AnyOutside = XMVectorOrInt(AnyOutside, Outside); - AllInside = XMVectorAndInt(AllInside, Inside); - - // If the triangle is outside any plane it is outside. - if (XMVector4EqualInt(AnyOutside, XMVectorTrueInt())) - return DISJOINT; - - // If the triangle is inside all planes it is inside. - if (XMVector4EqualInt(AllInside, XMVectorTrueInt())) - return CONTAINS; - - // The triangle is not inside all planes or outside a plane, it may intersect. - return INTERSECTS; - } - -} // namespace TriangleTests - +//------------------------------------------------------------------------------------- +// DirectXCollision.inl -- C++ Collision Math library +// +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +// +// http://go.microsoft.com/fwlink/?LinkID=615560 +//------------------------------------------------------------------------------------- + +#pragma once + +XMGLOBALCONST XMVECTORF32 g_BoxOffset[8] = +{ + { { { -1.0f, -1.0f, 1.0f, 0.0f } } }, + { { { 1.0f, -1.0f, 1.0f, 0.0f } } }, + { { { 1.0f, 1.0f, 1.0f, 0.0f } } }, + { { { -1.0f, 1.0f, 1.0f, 0.0f } } }, + { { { -1.0f, -1.0f, -1.0f, 0.0f } } }, + { { { 1.0f, -1.0f, -1.0f, 0.0f } } }, + { { { 1.0f, 1.0f, -1.0f, 0.0f } } }, + { { { -1.0f, 1.0f, -1.0f, 0.0f } } }, +}; + +XMGLOBALCONST XMVECTORF32 g_RayEpsilon = { { { 1e-20f, 1e-20f, 1e-20f, 1e-20f } } }; +XMGLOBALCONST XMVECTORF32 g_RayNegEpsilon = { { { -1e-20f, -1e-20f, -1e-20f, -1e-20f } } }; +XMGLOBALCONST XMVECTORF32 g_FltMin = { { { -FLT_MAX, -FLT_MAX, -FLT_MAX, -FLT_MAX } } }; +XMGLOBALCONST XMVECTORF32 g_FltMax = { { { FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX } } }; + +namespace MathInternal +{ + + //----------------------------------------------------------------------------- + // Return true if any of the elements of a 3 vector are equal to 0xffffffff. + // Slightly more efficient than using XMVector3EqualInt. + //----------------------------------------------------------------------------- + inline bool XMVector3AnyTrue(_In_ FXMVECTOR V) noexcept + { + // Duplicate the fourth element from the first element. + XMVECTOR C = XMVectorSwizzle(V); + + return XMComparisonAnyTrue(XMVector4EqualIntR(C, XMVectorTrueInt())); + } + + + //----------------------------------------------------------------------------- + // Return true if all of the elements of a 3 vector are equal to 0xffffffff. + // Slightly more efficient than using XMVector3EqualInt. + //----------------------------------------------------------------------------- + inline bool XMVector3AllTrue(_In_ FXMVECTOR V) noexcept + { + // Duplicate the fourth element from the first element. + XMVECTOR C = XMVectorSwizzle(V); + + return XMComparisonAllTrue(XMVector4EqualIntR(C, XMVectorTrueInt())); + } + +#if defined(_PREFAST_) || !defined(NDEBUG) + + XMGLOBALCONST XMVECTORF32 g_UnitVectorEpsilon = { { { 1.0e-4f, 1.0e-4f, 1.0e-4f, 1.0e-4f } } }; + XMGLOBALCONST XMVECTORF32 g_UnitQuaternionEpsilon = { { { 1.0e-4f, 1.0e-4f, 1.0e-4f, 1.0e-4f } } }; + XMGLOBALCONST XMVECTORF32 g_UnitPlaneEpsilon = { { { 1.0e-4f, 1.0e-4f, 1.0e-4f, 1.0e-4f } } }; + + //----------------------------------------------------------------------------- + // Return true if the vector is a unit vector (length == 1). + //----------------------------------------------------------------------------- + inline bool XMVector3IsUnit(_In_ FXMVECTOR V) noexcept + { + XMVECTOR Difference = XMVectorSubtract(XMVector3Length(V), XMVectorSplatOne()); + return XMVector4Less(XMVectorAbs(Difference), g_UnitVectorEpsilon); + } + + //----------------------------------------------------------------------------- + // Return true if the quaterion is a unit quaternion. + //----------------------------------------------------------------------------- + inline bool XMQuaternionIsUnit(_In_ FXMVECTOR Q) noexcept + { + XMVECTOR Difference = XMVectorSubtract(XMVector4Length(Q), XMVectorSplatOne()); + return XMVector4Less(XMVectorAbs(Difference), g_UnitQuaternionEpsilon); + } + + //----------------------------------------------------------------------------- + // Return true if the plane is a unit plane. + //----------------------------------------------------------------------------- + inline bool XMPlaneIsUnit(_In_ FXMVECTOR Plane) noexcept + { + XMVECTOR Difference = XMVectorSubtract(XMVector3Length(Plane), XMVectorSplatOne()); + return XMVector4Less(XMVectorAbs(Difference), g_UnitPlaneEpsilon); + } + +#endif // _PREFAST_ || !NDEBUG + + //----------------------------------------------------------------------------- + inline XMVECTOR XMPlaneTransform(_In_ FXMVECTOR Plane, _In_ FXMVECTOR Rotation, _In_ FXMVECTOR Translation) noexcept + { + XMVECTOR vNormal = XMVector3Rotate(Plane, Rotation); + XMVECTOR vD = XMVectorSubtract(XMVectorSplatW(Plane), XMVector3Dot(vNormal, Translation)); + + return XMVectorInsert<0, 0, 0, 0, 1>(vNormal, vD); + } + + //----------------------------------------------------------------------------- + // Return the point on the line segement (S1, S2) nearest the point P. + //----------------------------------------------------------------------------- + inline XMVECTOR PointOnLineSegmentNearestPoint(_In_ FXMVECTOR S1, _In_ FXMVECTOR S2, _In_ FXMVECTOR P) noexcept + { + XMVECTOR Dir = XMVectorSubtract(S2, S1); + XMVECTOR Projection = XMVectorSubtract(XMVector3Dot(P, Dir), XMVector3Dot(S1, Dir)); + XMVECTOR LengthSq = XMVector3Dot(Dir, Dir); + + XMVECTOR t = XMVectorMultiply(Projection, XMVectorReciprocal(LengthSq)); + XMVECTOR Point = XMVectorMultiplyAdd(t, Dir, S1); + + // t < 0 + XMVECTOR SelectS1 = XMVectorLess(Projection, XMVectorZero()); + Point = XMVectorSelect(Point, S1, SelectS1); + + // t > 1 + XMVECTOR SelectS2 = XMVectorGreater(Projection, LengthSq); + Point = XMVectorSelect(Point, S2, SelectS2); + + return Point; + } + + //----------------------------------------------------------------------------- + // Test if the point (P) on the plane of the triangle is inside the triangle + // (V0, V1, V2). + //----------------------------------------------------------------------------- + inline XMVECTOR XM_CALLCONV PointOnPlaneInsideTriangle(_In_ FXMVECTOR P, _In_ FXMVECTOR V0, _In_ FXMVECTOR V1, _In_ GXMVECTOR V2) noexcept + { + // Compute the triangle normal. + XMVECTOR N = XMVector3Cross(XMVectorSubtract(V2, V0), XMVectorSubtract(V1, V0)); + + // Compute the cross products of the vector from the base of each edge to + // the point with each edge vector. + XMVECTOR C0 = XMVector3Cross(XMVectorSubtract(P, V0), XMVectorSubtract(V1, V0)); + XMVECTOR C1 = XMVector3Cross(XMVectorSubtract(P, V1), XMVectorSubtract(V2, V1)); + XMVECTOR C2 = XMVector3Cross(XMVectorSubtract(P, V2), XMVectorSubtract(V0, V2)); + + // If the cross product points in the same direction as the normal the the + // point is inside the edge (it is zero if is on the edge). + XMVECTOR Zero = XMVectorZero(); + XMVECTOR Inside0 = XMVectorGreaterOrEqual(XMVector3Dot(C0, N), Zero); + XMVECTOR Inside1 = XMVectorGreaterOrEqual(XMVector3Dot(C1, N), Zero); + XMVECTOR Inside2 = XMVectorGreaterOrEqual(XMVector3Dot(C2, N), Zero); + + // If the point inside all of the edges it is inside. + return XMVectorAndInt(XMVectorAndInt(Inside0, Inside1), Inside2); + } + + //----------------------------------------------------------------------------- + inline bool SolveCubic(_In_ float e, _In_ float f, _In_ float g, _Out_ float* t, _Out_ float* u, _Out_ float* v) noexcept + { + float p, q, h, rc, d, theta, costh3, sinth3; + + p = f - e * e / 3.0f; + q = g - e * f / 3.0f + e * e * e * 2.0f / 27.0f; + h = q * q / 4.0f + p * p * p / 27.0f; + + if (h > 0) + { + *t = *u = *v = 0.f; + return false; // only one real root + } + + if ((h == 0) && (q == 0)) // all the same root + { + *t = -e / 3; + *u = -e / 3; + *v = -e / 3; + + return true; + } + + d = sqrtf(q * q / 4.0f - h); + if (d < 0) + rc = -powf(-d, 1.0f / 3.0f); + else + rc = powf(d, 1.0f / 3.0f); + + theta = XMScalarACos(-q / (2.0f * d)); + costh3 = XMScalarCos(theta / 3.0f); + sinth3 = sqrtf(3.0f) * XMScalarSin(theta / 3.0f); + *t = 2.0f * rc * costh3 - e / 3.0f; + *u = -rc * (costh3 + sinth3) - e / 3.0f; + *v = -rc * (costh3 - sinth3) - e / 3.0f; + + return true; + } + + //----------------------------------------------------------------------------- + inline XMVECTOR CalculateEigenVector(_In_ float m11, _In_ float m12, _In_ float m13, + _In_ float m22, _In_ float m23, _In_ float m33, _In_ float e) noexcept + { + float fTmp[3]; + fTmp[0] = m12 * m23 - m13 * (m22 - e); + fTmp[1] = m13 * m12 - m23 * (m11 - e); + fTmp[2] = (m11 - e) * (m22 - e) - m12 * m12; + + XMVECTOR vTmp = XMLoadFloat3(reinterpret_cast(fTmp)); + + if (XMVector3Equal(vTmp, XMVectorZero())) // planar or linear + { + float f1, f2, f3; + + // we only have one equation - find a valid one + if ((m11 - e != 0) || (m12 != 0) || (m13 != 0)) + { + f1 = m11 - e; f2 = m12; f3 = m13; + } + else if ((m12 != 0) || (m22 - e != 0) || (m23 != 0)) + { + f1 = m12; f2 = m22 - e; f3 = m23; + } + else if ((m13 != 0) || (m23 != 0) || (m33 - e != 0)) + { + f1 = m13; f2 = m23; f3 = m33 - e; + } + else + { + // error, we'll just make something up - we have NO context + f1 = 1.0f; f2 = 0.0f; f3 = 0.0f; + } + + if (f1 == 0) + vTmp = XMVectorSetX(vTmp, 0.0f); + else + vTmp = XMVectorSetX(vTmp, 1.0f); + + if (f2 == 0) + vTmp = XMVectorSetY(vTmp, 0.0f); + else + vTmp = XMVectorSetY(vTmp, 1.0f); + + if (f3 == 0) + { + vTmp = XMVectorSetZ(vTmp, 0.0f); + // recalculate y to make equation work + if (m12 != 0) + vTmp = XMVectorSetY(vTmp, -f1 / f2); + } + else + { + vTmp = XMVectorSetZ(vTmp, (f2 - f1) / f3); + } + } + + if (XMVectorGetX(XMVector3LengthSq(vTmp)) > 1e-5f) + { + return XMVector3Normalize(vTmp); + } + else + { + // Multiply by a value large enough to make the vector non-zero. + vTmp = XMVectorScale(vTmp, 1e5f); + return XMVector3Normalize(vTmp); + } + } + + //----------------------------------------------------------------------------- + inline bool CalculateEigenVectors(_In_ float m11, _In_ float m12, _In_ float m13, + _In_ float m22, _In_ float m23, _In_ float m33, + _In_ float e1, _In_ float e2, _In_ float e3, + _Out_ XMVECTOR* pV1, _Out_ XMVECTOR* pV2, _Out_ XMVECTOR* pV3) noexcept + { + *pV1 = DirectX::MathInternal::CalculateEigenVector(m11, m12, m13, m22, m23, m33, e1); + *pV2 = DirectX::MathInternal::CalculateEigenVector(m11, m12, m13, m22, m23, m33, e2); + *pV3 = DirectX::MathInternal::CalculateEigenVector(m11, m12, m13, m22, m23, m33, e3); + + bool v1z = false; + bool v2z = false; + bool v3z = false; + + XMVECTOR Zero = XMVectorZero(); + + if (XMVector3Equal(*pV1, Zero)) + v1z = true; + + if (XMVector3Equal(*pV2, Zero)) + v2z = true; + + if (XMVector3Equal(*pV3, Zero)) + v3z = true; + + bool e12 = (fabsf(XMVectorGetX(XMVector3Dot(*pV1, *pV2))) > 0.1f); // check for non-orthogonal vectors + bool e13 = (fabsf(XMVectorGetX(XMVector3Dot(*pV1, *pV3))) > 0.1f); + bool e23 = (fabsf(XMVectorGetX(XMVector3Dot(*pV2, *pV3))) > 0.1f); + + if ((v1z && v2z && v3z) || (e12 && e13 && e23) || + (e12 && v3z) || (e13 && v2z) || (e23 && v1z)) // all eigenvectors are 0- any basis set + { + *pV1 = g_XMIdentityR0.v; + *pV2 = g_XMIdentityR1.v; + *pV3 = g_XMIdentityR2.v; + return true; + } + + if (v1z && v2z) + { + XMVECTOR vTmp = XMVector3Cross(g_XMIdentityR1, *pV3); + if (XMVectorGetX(XMVector3LengthSq(vTmp)) < 1e-5f) + { + vTmp = XMVector3Cross(g_XMIdentityR0, *pV3); + } + *pV1 = XMVector3Normalize(vTmp); + *pV2 = XMVector3Cross(*pV3, *pV1); + return true; + } + + if (v3z && v1z) + { + XMVECTOR vTmp = XMVector3Cross(g_XMIdentityR1, *pV2); + if (XMVectorGetX(XMVector3LengthSq(vTmp)) < 1e-5f) + { + vTmp = XMVector3Cross(g_XMIdentityR0, *pV2); + } + *pV3 = XMVector3Normalize(vTmp); + *pV1 = XMVector3Cross(*pV2, *pV3); + return true; + } + + if (v2z && v3z) + { + XMVECTOR vTmp = XMVector3Cross(g_XMIdentityR1, *pV1); + if (XMVectorGetX(XMVector3LengthSq(vTmp)) < 1e-5f) + { + vTmp = XMVector3Cross(g_XMIdentityR0, *pV1); + } + *pV2 = XMVector3Normalize(vTmp); + *pV3 = XMVector3Cross(*pV1, *pV2); + return true; + } + + if ((v1z) || e12) + { + *pV1 = XMVector3Cross(*pV2, *pV3); + return true; + } + + if ((v2z) || e23) + { + *pV2 = XMVector3Cross(*pV3, *pV1); + return true; + } + + if ((v3z) || e13) + { + *pV3 = XMVector3Cross(*pV1, *pV2); + return true; + } + + return true; + } + + //----------------------------------------------------------------------------- + inline bool CalculateEigenVectorsFromCovarianceMatrix(_In_ float Cxx, _In_ float Cyy, _In_ float Czz, + _In_ float Cxy, _In_ float Cxz, _In_ float Cyz, + _Out_ XMVECTOR* pV1, _Out_ XMVECTOR* pV2, _Out_ XMVECTOR* pV3) noexcept + { + // Calculate the eigenvalues by solving a cubic equation. + float e = -(Cxx + Cyy + Czz); + float f = Cxx * Cyy + Cyy * Czz + Czz * Cxx - Cxy * Cxy - Cxz * Cxz - Cyz * Cyz; + float g = Cxy * Cxy * Czz + Cxz * Cxz * Cyy + Cyz * Cyz * Cxx - Cxy * Cyz * Cxz * 2.0f - Cxx * Cyy * Czz; + + float ev1, ev2, ev3; + if (!DirectX::MathInternal::SolveCubic(e, f, g, &ev1, &ev2, &ev3)) + { + // set them to arbitrary orthonormal basis set + *pV1 = g_XMIdentityR0.v; + *pV2 = g_XMIdentityR1.v; + *pV3 = g_XMIdentityR2.v; + return false; + } + + return DirectX::MathInternal::CalculateEigenVectors(Cxx, Cxy, Cxz, Cyy, Cyz, Czz, ev1, ev2, ev3, pV1, pV2, pV3); + } + + //----------------------------------------------------------------------------- + inline void XM_CALLCONV FastIntersectTrianglePlane( + FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2, + GXMVECTOR Plane, + XMVECTOR& Outside, XMVECTOR& Inside) noexcept + { + // Plane0 + XMVECTOR Dist0 = XMVector4Dot(V0, Plane); + XMVECTOR Dist1 = XMVector4Dot(V1, Plane); + XMVECTOR Dist2 = XMVector4Dot(V2, Plane); + + XMVECTOR MinDist = XMVectorMin(Dist0, Dist1); + MinDist = XMVectorMin(MinDist, Dist2); + + XMVECTOR MaxDist = XMVectorMax(Dist0, Dist1); + MaxDist = XMVectorMax(MaxDist, Dist2); + + XMVECTOR Zero = XMVectorZero(); + + // Outside the plane? + Outside = XMVectorGreater(MinDist, Zero); + + // Fully inside the plane? + Inside = XMVectorLess(MaxDist, Zero); + } + + //----------------------------------------------------------------------------- + inline void FastIntersectSpherePlane(_In_ FXMVECTOR Center, _In_ FXMVECTOR Radius, _In_ FXMVECTOR Plane, + _Out_ XMVECTOR& Outside, _Out_ XMVECTOR& Inside) noexcept + { + XMVECTOR Dist = XMVector4Dot(Center, Plane); + + // Outside the plane? + Outside = XMVectorGreater(Dist, Radius); + + // Fully inside the plane? + Inside = XMVectorLess(Dist, XMVectorNegate(Radius)); + } + + //----------------------------------------------------------------------------- + inline void FastIntersectAxisAlignedBoxPlane(_In_ FXMVECTOR Center, _In_ FXMVECTOR Extents, _In_ FXMVECTOR Plane, + _Out_ XMVECTOR& Outside, _Out_ XMVECTOR& Inside) noexcept + { + // Compute the distance to the center of the box. + XMVECTOR Dist = XMVector4Dot(Center, Plane); + + // Project the axes of the box onto the normal of the plane. Half the + // length of the projection (sometime called the "radius") is equal to + // h(u) * abs(n dot b(u))) + h(v) * abs(n dot b(v)) + h(w) * abs(n dot b(w)) + // where h(i) are extents of the box, n is the plane normal, and b(i) are the + // axes of the box. In this case b(i) = [(1,0,0), (0,1,0), (0,0,1)]. + XMVECTOR Radius = XMVector3Dot(Extents, XMVectorAbs(Plane)); + + // Outside the plane? + Outside = XMVectorGreater(Dist, Radius); + + // Fully inside the plane? + Inside = XMVectorLess(Dist, XMVectorNegate(Radius)); + } + + //----------------------------------------------------------------------------- + inline void XM_CALLCONV FastIntersectOrientedBoxPlane( + _In_ FXMVECTOR Center, _In_ FXMVECTOR Extents, _In_ FXMVECTOR Axis0, + _In_ GXMVECTOR Axis1, + _In_ HXMVECTOR Axis2, _In_ HXMVECTOR Plane, + _Out_ XMVECTOR& Outside, _Out_ XMVECTOR& Inside) noexcept + { + // Compute the distance to the center of the box. + XMVECTOR Dist = XMVector4Dot(Center, Plane); + + // Project the axes of the box onto the normal of the plane. Half the + // length of the projection (sometime called the "radius") is equal to + // h(u) * abs(n dot b(u))) + h(v) * abs(n dot b(v)) + h(w) * abs(n dot b(w)) + // where h(i) are extents of the box, n is the plane normal, and b(i) are the + // axes of the box. + XMVECTOR Radius = XMVector3Dot(Plane, Axis0); + Radius = XMVectorInsert<0, 0, 1, 0, 0>(Radius, XMVector3Dot(Plane, Axis1)); + Radius = XMVectorInsert<0, 0, 0, 1, 0>(Radius, XMVector3Dot(Plane, Axis2)); + Radius = XMVector3Dot(Extents, XMVectorAbs(Radius)); + + // Outside the plane? + Outside = XMVectorGreater(Dist, Radius); + + // Fully inside the plane? + Inside = XMVectorLess(Dist, XMVectorNegate(Radius)); + } + + //----------------------------------------------------------------------------- + inline void XM_CALLCONV FastIntersectFrustumPlane( + _In_ FXMVECTOR Point0, _In_ FXMVECTOR Point1, _In_ FXMVECTOR Point2, + _In_ GXMVECTOR Point3, + _In_ HXMVECTOR Point4, _In_ HXMVECTOR Point5, + _In_ CXMVECTOR Point6, _In_ CXMVECTOR Point7, _In_ CXMVECTOR Plane, + _Out_ XMVECTOR& Outside, _Out_ XMVECTOR& Inside) noexcept + { + // Find the min/max projection of the frustum onto the plane normal. + XMVECTOR Min, Max, Dist; + + Min = Max = XMVector3Dot(Plane, Point0); + + Dist = XMVector3Dot(Plane, Point1); + Min = XMVectorMin(Min, Dist); + Max = XMVectorMax(Max, Dist); + + Dist = XMVector3Dot(Plane, Point2); + Min = XMVectorMin(Min, Dist); + Max = XMVectorMax(Max, Dist); + + Dist = XMVector3Dot(Plane, Point3); + Min = XMVectorMin(Min, Dist); + Max = XMVectorMax(Max, Dist); + + Dist = XMVector3Dot(Plane, Point4); + Min = XMVectorMin(Min, Dist); + Max = XMVectorMax(Max, Dist); + + Dist = XMVector3Dot(Plane, Point5); + Min = XMVectorMin(Min, Dist); + Max = XMVectorMax(Max, Dist); + + Dist = XMVector3Dot(Plane, Point6); + Min = XMVectorMin(Min, Dist); + Max = XMVectorMax(Max, Dist); + + Dist = XMVector3Dot(Plane, Point7); + Min = XMVectorMin(Min, Dist); + Max = XMVectorMax(Max, Dist); + + XMVECTOR PlaneDist = XMVectorNegate(XMVectorSplatW(Plane)); + + // Outside the plane? + Outside = XMVectorGreater(Min, PlaneDist); + + // Fully inside the plane? + Inside = XMVectorLess(Max, PlaneDist); + } + +} // namespace MathInternal + + +/**************************************************************************** + * + * BoundingSphere + * + ****************************************************************************/ + +//----------------------------------------------------------------------------- +// Transform a sphere by an angle preserving transform. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline void XM_CALLCONV BoundingSphere::Transform(BoundingSphere& Out, FXMMATRIX M) const noexcept +{ + // Load the center of the sphere. + XMVECTOR vCenter = XMLoadFloat3(&Center); + + // Transform the center of the sphere. + XMVECTOR C = XMVector3Transform(vCenter, M); + + XMVECTOR dX = XMVector3Dot(M.r[0], M.r[0]); + XMVECTOR dY = XMVector3Dot(M.r[1], M.r[1]); + XMVECTOR dZ = XMVector3Dot(M.r[2], M.r[2]); + + XMVECTOR d = XMVectorMax(dX, XMVectorMax(dY, dZ)); + + // Store the center sphere. + XMStoreFloat3(&Out.Center, C); + + // Scale the radius of the pshere. + float Scale = sqrtf(XMVectorGetX(d)); + Out.Radius = Radius * Scale; +} + +_Use_decl_annotations_ +inline void XM_CALLCONV BoundingSphere::Transform(BoundingSphere& Out, float Scale, FXMVECTOR Rotation, FXMVECTOR Translation) const noexcept +{ + // Load the center of the sphere. + XMVECTOR vCenter = XMLoadFloat3(&Center); + + // Transform the center of the sphere. + vCenter = XMVectorAdd(XMVector3Rotate(XMVectorScale(vCenter, Scale), Rotation), Translation); + + // Store the center sphere. + XMStoreFloat3(&Out.Center, vCenter); + + // Scale the radius of the pshere. + Out.Radius = Radius * Scale; +} + + +//----------------------------------------------------------------------------- +// Point in sphere test. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType XM_CALLCONV BoundingSphere::Contains(FXMVECTOR Point) const noexcept +{ + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); + + XMVECTOR DistanceSquared = XMVector3LengthSq(XMVectorSubtract(Point, vCenter)); + XMVECTOR RadiusSquared = XMVectorMultiply(vRadius, vRadius); + + return XMVector3LessOrEqual(DistanceSquared, RadiusSquared) ? CONTAINS : DISJOINT; +} + + +//----------------------------------------------------------------------------- +// Triangle in sphere test +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType XM_CALLCONV BoundingSphere::Contains(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept +{ + if (!Intersects(V0, V1, V2)) + return DISJOINT; + + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); + XMVECTOR RadiusSquared = XMVectorMultiply(vRadius, vRadius); + + XMVECTOR DistanceSquared = XMVector3LengthSq(XMVectorSubtract(V0, vCenter)); + XMVECTOR Inside = XMVectorLessOrEqual(DistanceSquared, RadiusSquared); + + DistanceSquared = XMVector3LengthSq(XMVectorSubtract(V1, vCenter)); + Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(DistanceSquared, RadiusSquared)); + + DistanceSquared = XMVector3LengthSq(XMVectorSubtract(V2, vCenter)); + Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(DistanceSquared, RadiusSquared)); + + return (XMVector3EqualInt(Inside, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; +} + + +//----------------------------------------------------------------------------- +// Sphere in sphere test. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType BoundingSphere::Contains(const BoundingSphere& sh) const noexcept +{ + XMVECTOR Center1 = XMLoadFloat3(&Center); + float r1 = Radius; + + XMVECTOR Center2 = XMLoadFloat3(&sh.Center); + float r2 = sh.Radius; + + XMVECTOR V = XMVectorSubtract(Center2, Center1); + + XMVECTOR Dist = XMVector3Length(V); + + float d = XMVectorGetX(Dist); + + return (r1 + r2 >= d) ? ((r1 - r2 >= d) ? CONTAINS : INTERSECTS) : DISJOINT; +} + + +//----------------------------------------------------------------------------- +// Axis-aligned box in sphere test +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType BoundingSphere::Contains(const BoundingBox& box) const noexcept +{ + if (!box.Intersects(*this)) + return DISJOINT; + + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); + XMVECTOR RadiusSq = XMVectorMultiply(vRadius, vRadius); + + XMVECTOR boxCenter = XMLoadFloat3(&box.Center); + XMVECTOR boxExtents = XMLoadFloat3(&box.Extents); + + XMVECTOR InsideAll = XMVectorTrueInt(); + + XMVECTOR offset = XMVectorSubtract(boxCenter, vCenter); + + for (size_t i = 0; i < BoundingBox::CORNER_COUNT; ++i) + { + XMVECTOR C = XMVectorMultiplyAdd(boxExtents, g_BoxOffset[i], offset); + XMVECTOR d = XMVector3LengthSq(C); + InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(d, RadiusSq)); + } + + return (XMVector3EqualInt(InsideAll, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; +} + + +//----------------------------------------------------------------------------- +// Oriented box in sphere test +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType BoundingSphere::Contains(const BoundingOrientedBox& box) const noexcept +{ + if (!box.Intersects(*this)) + return DISJOINT; + + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); + XMVECTOR RadiusSq = XMVectorMultiply(vRadius, vRadius); + + XMVECTOR boxCenter = XMLoadFloat3(&box.Center); + XMVECTOR boxExtents = XMLoadFloat3(&box.Extents); + XMVECTOR boxOrientation = XMLoadFloat4(&box.Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(boxOrientation)); + + XMVECTOR InsideAll = XMVectorTrueInt(); + + for (size_t i = 0; i < BoundingOrientedBox::CORNER_COUNT; ++i) + { + XMVECTOR C = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(boxExtents, g_BoxOffset[i]), boxOrientation), boxCenter); + XMVECTOR d = XMVector3LengthSq(XMVectorSubtract(vCenter, C)); + InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(d, RadiusSq)); + } + + return (XMVector3EqualInt(InsideAll, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; + +} + + +//----------------------------------------------------------------------------- +// Frustum in sphere test +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType BoundingSphere::Contains(const BoundingFrustum& fr) const noexcept +{ + if (!fr.Intersects(*this)) + return DISJOINT; + + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); + XMVECTOR RadiusSq = XMVectorMultiply(vRadius, vRadius); + + XMVECTOR vOrigin = XMLoadFloat3(&fr.Origin); + XMVECTOR vOrientation = XMLoadFloat4(&fr.Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); + + // Build the corners of the frustum. + XMVECTOR vRightTop = XMVectorSet(fr.RightSlope, fr.TopSlope, 1.0f, 0.0f); + XMVECTOR vRightBottom = XMVectorSet(fr.RightSlope, fr.BottomSlope, 1.0f, 0.0f); + XMVECTOR vLeftTop = XMVectorSet(fr.LeftSlope, fr.TopSlope, 1.0f, 0.0f); + XMVECTOR vLeftBottom = XMVectorSet(fr.LeftSlope, fr.BottomSlope, 1.0f, 0.0f); + XMVECTOR vNear = XMVectorReplicatePtr(&fr.Near); + XMVECTOR vFar = XMVectorReplicatePtr(&fr.Far); + + XMVECTOR Corners[BoundingFrustum::CORNER_COUNT]; + Corners[0] = XMVectorMultiply(vRightTop, vNear); + Corners[1] = XMVectorMultiply(vRightBottom, vNear); + Corners[2] = XMVectorMultiply(vLeftTop, vNear); + Corners[3] = XMVectorMultiply(vLeftBottom, vNear); + Corners[4] = XMVectorMultiply(vRightTop, vFar); + Corners[5] = XMVectorMultiply(vRightBottom, vFar); + Corners[6] = XMVectorMultiply(vLeftTop, vFar); + Corners[7] = XMVectorMultiply(vLeftBottom, vFar); + + XMVECTOR InsideAll = XMVectorTrueInt(); + for (size_t i = 0; i < BoundingFrustum::CORNER_COUNT; ++i) + { + XMVECTOR C = XMVectorAdd(XMVector3Rotate(Corners[i], vOrientation), vOrigin); + XMVECTOR d = XMVector3LengthSq(XMVectorSubtract(vCenter, C)); + InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(d, RadiusSq)); + } + + return (XMVector3EqualInt(InsideAll, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; +} + + +//----------------------------------------------------------------------------- +// Sphere vs. sphere test. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool BoundingSphere::Intersects(const BoundingSphere& sh) const noexcept +{ + // Load A. + XMVECTOR vCenterA = XMLoadFloat3(&Center); + XMVECTOR vRadiusA = XMVectorReplicatePtr(&Radius); + + // Load B. + XMVECTOR vCenterB = XMLoadFloat3(&sh.Center); + XMVECTOR vRadiusB = XMVectorReplicatePtr(&sh.Radius); + + // Distance squared between centers. + XMVECTOR Delta = XMVectorSubtract(vCenterB, vCenterA); + XMVECTOR DistanceSquared = XMVector3LengthSq(Delta); + + // Sum of the radii squared. + XMVECTOR RadiusSquared = XMVectorAdd(vRadiusA, vRadiusB); + RadiusSquared = XMVectorMultiply(RadiusSquared, RadiusSquared); + + return XMVector3LessOrEqual(DistanceSquared, RadiusSquared); +} + + +//----------------------------------------------------------------------------- +// Box vs. sphere test. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool BoundingSphere::Intersects(const BoundingBox& box) const noexcept +{ + return box.Intersects(*this); +} + +_Use_decl_annotations_ +inline bool BoundingSphere::Intersects(const BoundingOrientedBox& box) const noexcept +{ + return box.Intersects(*this); +} + + +//----------------------------------------------------------------------------- +// Frustum vs. sphere test. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool BoundingSphere::Intersects(const BoundingFrustum& fr) const noexcept +{ + return fr.Intersects(*this); +} + + +//----------------------------------------------------------------------------- +// Triangle vs sphere test +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool XM_CALLCONV BoundingSphere::Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept +{ + // Load the sphere. + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); + + // Compute the plane of the triangle (has to be normalized). + XMVECTOR N = XMVector3Normalize(XMVector3Cross(XMVectorSubtract(V1, V0), XMVectorSubtract(V2, V0))); + + // Assert that the triangle is not degenerate. + assert(!XMVector3Equal(N, XMVectorZero())); + + // Find the nearest feature on the triangle to the sphere. + XMVECTOR Dist = XMVector3Dot(XMVectorSubtract(vCenter, V0), N); + + // If the center of the sphere is farther from the plane of the triangle than + // the radius of the sphere, then there cannot be an intersection. + XMVECTOR NoIntersection = XMVectorLess(Dist, XMVectorNegate(vRadius)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Dist, vRadius)); + + // Project the center of the sphere onto the plane of the triangle. + XMVECTOR Point = XMVectorNegativeMultiplySubtract(N, Dist, vCenter); + + // Is it inside all the edges? If so we intersect because the distance + // to the plane is less than the radius. + XMVECTOR Intersection = DirectX::MathInternal::PointOnPlaneInsideTriangle(Point, V0, V1, V2); + + // Find the nearest point on each edge. + XMVECTOR RadiusSq = XMVectorMultiply(vRadius, vRadius); + + // Edge 0,1 + Point = DirectX::MathInternal::PointOnLineSegmentNearestPoint(V0, V1, vCenter); + + // If the distance to the center of the sphere to the point is less than + // the radius of the sphere then it must intersect. + Intersection = XMVectorOrInt(Intersection, XMVectorLessOrEqual(XMVector3LengthSq(XMVectorSubtract(vCenter, Point)), RadiusSq)); + + // Edge 1,2 + Point = DirectX::MathInternal::PointOnLineSegmentNearestPoint(V1, V2, vCenter); + + // If the distance to the center of the sphere to the point is less than + // the radius of the sphere then it must intersect. + Intersection = XMVectorOrInt(Intersection, XMVectorLessOrEqual(XMVector3LengthSq(XMVectorSubtract(vCenter, Point)), RadiusSq)); + + // Edge 2,0 + Point = DirectX::MathInternal::PointOnLineSegmentNearestPoint(V2, V0, vCenter); + + // If the distance to the center of the sphere to the point is less than + // the radius of the sphere then it must intersect. + Intersection = XMVectorOrInt(Intersection, XMVectorLessOrEqual(XMVector3LengthSq(XMVectorSubtract(vCenter, Point)), RadiusSq)); + + return XMVector4EqualInt(XMVectorAndCInt(Intersection, NoIntersection), XMVectorTrueInt()); +} + + +//----------------------------------------------------------------------------- +// Sphere-plane intersection +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline PlaneIntersectionType XM_CALLCONV BoundingSphere::Intersects(FXMVECTOR Plane) const noexcept +{ + assert(DirectX::MathInternal::XMPlaneIsUnit(Plane)); + + // Load the sphere. + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); + + // Set w of the center to one so we can dot4 with a plane. + vCenter = XMVectorInsert<0, 0, 0, 0, 1>(vCenter, XMVectorSplatOne()); + + XMVECTOR Outside, Inside; + DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane, Outside, Inside); + + // If the sphere is outside any plane it is outside. + if (XMVector4EqualInt(Outside, XMVectorTrueInt())) + return FRONT; + + // If the sphere is inside all planes it is inside. + if (XMVector4EqualInt(Inside, XMVectorTrueInt())) + return BACK; + + // The sphere is not inside all planes or outside a plane it intersects. + return INTERSECTING; +} + + +//----------------------------------------------------------------------------- +// Compute the intersection of a ray (Origin, Direction) with a sphere. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool XM_CALLCONV BoundingSphere::Intersects(FXMVECTOR Origin, FXMVECTOR Direction, float& Dist) const noexcept +{ + assert(DirectX::MathInternal::XMVector3IsUnit(Direction)); + + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); + + // l is the vector from the ray origin to the center of the sphere. + XMVECTOR l = XMVectorSubtract(vCenter, Origin); + + // s is the projection of the l onto the ray direction. + XMVECTOR s = XMVector3Dot(l, Direction); + + XMVECTOR l2 = XMVector3Dot(l, l); + + XMVECTOR r2 = XMVectorMultiply(vRadius, vRadius); + + // m2 is squared distance from the center of the sphere to the projection. + XMVECTOR m2 = XMVectorNegativeMultiplySubtract(s, s, l2); + + XMVECTOR NoIntersection; + + // If the ray origin is outside the sphere and the center of the sphere is + // behind the ray origin there is no intersection. + NoIntersection = XMVectorAndInt(XMVectorLess(s, XMVectorZero()), XMVectorGreater(l2, r2)); + + // If the squared distance from the center of the sphere to the projection + // is greater than the radius squared the ray will miss the sphere. + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(m2, r2)); + + // The ray hits the sphere, compute the nearest intersection point. + XMVECTOR q = XMVectorSqrt(XMVectorSubtract(r2, m2)); + XMVECTOR t1 = XMVectorSubtract(s, q); + XMVECTOR t2 = XMVectorAdd(s, q); + + XMVECTOR OriginInside = XMVectorLessOrEqual(l2, r2); + XMVECTOR t = XMVectorSelect(t1, t2, OriginInside); + + if (XMVector4NotEqualInt(NoIntersection, XMVectorTrueInt())) + { + // Store the x-component to *pDist. + XMStoreFloat(&Dist, t); + return true; + } + + Dist = 0.f; + return false; +} + + +//----------------------------------------------------------------------------- +// Test a sphere vs 6 planes (typically forming a frustum). +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType XM_CALLCONV BoundingSphere::ContainedBy( + FXMVECTOR Plane0, FXMVECTOR Plane1, FXMVECTOR Plane2, + GXMVECTOR Plane3, + HXMVECTOR Plane4, HXMVECTOR Plane5) const noexcept +{ + // Load the sphere. + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vRadius = XMVectorReplicatePtr(&Radius); + + // Set w of the center to one so we can dot4 with a plane. + vCenter = XMVectorInsert<0, 0, 0, 0, 1>(vCenter, XMVectorSplatOne()); + + XMVECTOR Outside, Inside; + + // Test against each plane. + DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane0, Outside, Inside); + + XMVECTOR AnyOutside = Outside; + XMVECTOR AllInside = Inside; + + DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane1, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane2, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane3, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane4, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectSpherePlane(vCenter, vRadius, Plane5, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + // If the sphere is outside any plane it is outside. + if (XMVector4EqualInt(AnyOutside, XMVectorTrueInt())) + return DISJOINT; + + // If the sphere is inside all planes it is inside. + if (XMVector4EqualInt(AllInside, XMVectorTrueInt())) + return CONTAINS; + + // The sphere is not inside all planes or outside a plane, it may intersect. + return INTERSECTS; +} + + +//----------------------------------------------------------------------------- +// Creates a bounding sphere that contains two other bounding spheres +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline void BoundingSphere::CreateMerged(BoundingSphere& Out, const BoundingSphere& S1, const BoundingSphere& S2) noexcept +{ + XMVECTOR Center1 = XMLoadFloat3(&S1.Center); + float r1 = S1.Radius; + + XMVECTOR Center2 = XMLoadFloat3(&S2.Center); + float r2 = S2.Radius; + + XMVECTOR V = XMVectorSubtract(Center2, Center1); + + XMVECTOR Dist = XMVector3Length(V); + + float d = XMVectorGetX(Dist); + + if (r1 + r2 >= d) + { + if (r1 - r2 >= d) + { + Out = S1; + return; + } + else if (r2 - r1 >= d) + { + Out = S2; + return; + } + } + + XMVECTOR N = XMVectorDivide(V, Dist); + + float t1 = XMMin(-r1, d - r2); + float t2 = XMMax(r1, d + r2); + float t_5 = (t2 - t1) * 0.5f; + + XMVECTOR NCenter = XMVectorAdd(Center1, XMVectorMultiply(N, XMVectorReplicate(t_5 + t1))); + + XMStoreFloat3(&Out.Center, NCenter); + Out.Radius = t_5; +} + + +//----------------------------------------------------------------------------- +// Create sphere enscribing bounding box +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline void BoundingSphere::CreateFromBoundingBox(BoundingSphere& Out, const BoundingBox& box) noexcept +{ + Out.Center = box.Center; + XMVECTOR vExtents = XMLoadFloat3(&box.Extents); + Out.Radius = XMVectorGetX(XMVector3Length(vExtents)); +} + +_Use_decl_annotations_ +inline void BoundingSphere::CreateFromBoundingBox(BoundingSphere& Out, const BoundingOrientedBox& box) noexcept +{ + // Bounding box orientation is irrelevant because a sphere is rotationally invariant + Out.Center = box.Center; + XMVECTOR vExtents = XMLoadFloat3(&box.Extents); + Out.Radius = XMVectorGetX(XMVector3Length(vExtents)); +} + + +//----------------------------------------------------------------------------- +// Find the approximate smallest enclosing bounding sphere for a set of +// points. Exact computation of the smallest enclosing bounding sphere is +// possible but is slower and requires a more complex algorithm. +// The algorithm is based on Jack Ritter, "An Efficient Bounding Sphere", +// Graphics Gems. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline void BoundingSphere::CreateFromPoints(BoundingSphere& Out, size_t Count, const XMFLOAT3* pPoints, size_t Stride) noexcept +{ + assert(Count > 0); + assert(pPoints); + + // Find the points with minimum and maximum x, y, and z + XMVECTOR MinX, MaxX, MinY, MaxY, MinZ, MaxZ; + + MinX = MaxX = MinY = MaxY = MinZ = MaxZ = XMLoadFloat3(pPoints); + + for (size_t i = 1; i < Count; ++i) + { + XMVECTOR Point = XMLoadFloat3(reinterpret_cast(reinterpret_cast(pPoints) + i * Stride)); + + float px = XMVectorGetX(Point); + float py = XMVectorGetY(Point); + float pz = XMVectorGetZ(Point); + + if (px < XMVectorGetX(MinX)) + MinX = Point; + + if (px > XMVectorGetX(MaxX)) + MaxX = Point; + + if (py < XMVectorGetY(MinY)) + MinY = Point; + + if (py > XMVectorGetY(MaxY)) + MaxY = Point; + + if (pz < XMVectorGetZ(MinZ)) + MinZ = Point; + + if (pz > XMVectorGetZ(MaxZ)) + MaxZ = Point; + } + + // Use the min/max pair that are farthest apart to form the initial sphere. + XMVECTOR DeltaX = XMVectorSubtract(MaxX, MinX); + XMVECTOR DistX = XMVector3Length(DeltaX); + + XMVECTOR DeltaY = XMVectorSubtract(MaxY, MinY); + XMVECTOR DistY = XMVector3Length(DeltaY); + + XMVECTOR DeltaZ = XMVectorSubtract(MaxZ, MinZ); + XMVECTOR DistZ = XMVector3Length(DeltaZ); + + XMVECTOR vCenter; + XMVECTOR vRadius; + + if (XMVector3Greater(DistX, DistY)) + { + if (XMVector3Greater(DistX, DistZ)) + { + // Use min/max x. + vCenter = XMVectorLerp(MaxX, MinX, 0.5f); + vRadius = XMVectorScale(DistX, 0.5f); + } + else + { + // Use min/max z. + vCenter = XMVectorLerp(MaxZ, MinZ, 0.5f); + vRadius = XMVectorScale(DistZ, 0.5f); + } + } + else // Y >= X + { + if (XMVector3Greater(DistY, DistZ)) + { + // Use min/max y. + vCenter = XMVectorLerp(MaxY, MinY, 0.5f); + vRadius = XMVectorScale(DistY, 0.5f); + } + else + { + // Use min/max z. + vCenter = XMVectorLerp(MaxZ, MinZ, 0.5f); + vRadius = XMVectorScale(DistZ, 0.5f); + } + } + + // Add any points not inside the sphere. + for (size_t i = 0; i < Count; ++i) + { + XMVECTOR Point = XMLoadFloat3(reinterpret_cast(reinterpret_cast(pPoints) + i * Stride)); + + XMVECTOR Delta = XMVectorSubtract(Point, vCenter); + + XMVECTOR Dist = XMVector3Length(Delta); + + if (XMVector3Greater(Dist, vRadius)) + { + // Adjust sphere to include the new point. + vRadius = XMVectorScale(XMVectorAdd(vRadius, Dist), 0.5f); + vCenter = XMVectorAdd(vCenter, XMVectorMultiply(XMVectorSubtract(XMVectorReplicate(1.0f), XMVectorDivide(vRadius, Dist)), Delta)); + } + } + + XMStoreFloat3(&Out.Center, vCenter); + XMStoreFloat(&Out.Radius, vRadius); +} + + +//----------------------------------------------------------------------------- +// Create sphere containing frustum +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline void BoundingSphere::CreateFromFrustum(BoundingSphere& Out, const BoundingFrustum& fr) noexcept +{ + XMFLOAT3 Corners[BoundingFrustum::CORNER_COUNT]; + fr.GetCorners(Corners); + CreateFromPoints(Out, BoundingFrustum::CORNER_COUNT, Corners, sizeof(XMFLOAT3)); +} + + +/**************************************************************************** + * + * BoundingBox + * + ****************************************************************************/ + +//----------------------------------------------------------------------------- +// Transform an axis aligned box by an angle preserving transform. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline void XM_CALLCONV BoundingBox::Transform(BoundingBox& Out, FXMMATRIX M) const noexcept +{ + // Load center and extents. + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); + + // Compute and transform the corners and find new min/max bounds. + XMVECTOR Corner = XMVectorMultiplyAdd(vExtents, g_BoxOffset[0], vCenter); + Corner = XMVector3Transform(Corner, M); + + XMVECTOR Min, Max; + Min = Max = Corner; + + for (size_t i = 1; i < CORNER_COUNT; ++i) + { + Corner = XMVectorMultiplyAdd(vExtents, g_BoxOffset[i], vCenter); + Corner = XMVector3Transform(Corner, M); + + Min = XMVectorMin(Min, Corner); + Max = XMVectorMax(Max, Corner); + } + + // Store center and extents. + XMStoreFloat3(&Out.Center, XMVectorScale(XMVectorAdd(Min, Max), 0.5f)); + XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(Max, Min), 0.5f)); +} + +_Use_decl_annotations_ +inline void XM_CALLCONV BoundingBox::Transform(BoundingBox& Out, float Scale, FXMVECTOR Rotation, FXMVECTOR Translation) const noexcept +{ + assert(DirectX::MathInternal::XMQuaternionIsUnit(Rotation)); + + // Load center and extents. + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); + + XMVECTOR VectorScale = XMVectorReplicate(Scale); + + // Compute and transform the corners and find new min/max bounds. + XMVECTOR Corner = XMVectorMultiplyAdd(vExtents, g_BoxOffset[0], vCenter); + Corner = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(Corner, VectorScale), Rotation), Translation); + + XMVECTOR Min, Max; + Min = Max = Corner; + + for (size_t i = 1; i < CORNER_COUNT; ++i) + { + Corner = XMVectorMultiplyAdd(vExtents, g_BoxOffset[i], vCenter); + Corner = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(Corner, VectorScale), Rotation), Translation); + + Min = XMVectorMin(Min, Corner); + Max = XMVectorMax(Max, Corner); + } + + // Store center and extents. + XMStoreFloat3(&Out.Center, XMVectorScale(XMVectorAdd(Min, Max), 0.5f)); + XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(Max, Min), 0.5f)); +} + + +//----------------------------------------------------------------------------- +// Get the corner points of the box +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline void BoundingBox::GetCorners(XMFLOAT3* Corners) const noexcept +{ + assert(Corners != nullptr); + + // Load the box + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); + + for (size_t i = 0; i < CORNER_COUNT; ++i) + { + XMVECTOR C = XMVectorMultiplyAdd(vExtents, g_BoxOffset[i], vCenter); + XMStoreFloat3(&Corners[i], C); + } +} + + +//----------------------------------------------------------------------------- +// Point in axis-aligned box test +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType XM_CALLCONV BoundingBox::Contains(FXMVECTOR Point) const noexcept +{ + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); + + return XMVector3InBounds(XMVectorSubtract(Point, vCenter), vExtents) ? CONTAINS : DISJOINT; +} + + +//----------------------------------------------------------------------------- +// Triangle in axis-aligned box test +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType XM_CALLCONV BoundingBox::Contains(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept +{ + if (!Intersects(V0, V1, V2)) + return DISJOINT; + + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); + + XMVECTOR d = XMVectorAbs(XMVectorSubtract(V0, vCenter)); + XMVECTOR Inside = XMVectorLessOrEqual(d, vExtents); + + d = XMVectorAbs(XMVectorSubtract(V1, vCenter)); + Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(d, vExtents)); + + d = XMVectorAbs(XMVectorSubtract(V2, vCenter)); + Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(d, vExtents)); + + return (XMVector3EqualInt(Inside, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; +} + + +//----------------------------------------------------------------------------- +// Sphere in axis-aligned box test +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType BoundingBox::Contains(const BoundingSphere& sh) const noexcept +{ + XMVECTOR SphereCenter = XMLoadFloat3(&sh.Center); + XMVECTOR SphereRadius = XMVectorReplicatePtr(&sh.Radius); + + XMVECTOR BoxCenter = XMLoadFloat3(&Center); + XMVECTOR BoxExtents = XMLoadFloat3(&Extents); + + XMVECTOR BoxMin = XMVectorSubtract(BoxCenter, BoxExtents); + XMVECTOR BoxMax = XMVectorAdd(BoxCenter, BoxExtents); + + // Find the distance to the nearest point on the box. + // for each i in (x, y, z) + // if (SphereCenter(i) < BoxMin(i)) d2 += (SphereCenter(i) - BoxMin(i)) ^ 2 + // else if (SphereCenter(i) > BoxMax(i)) d2 += (SphereCenter(i) - BoxMax(i)) ^ 2 + + XMVECTOR d = XMVectorZero(); + + // Compute d for each dimension. + XMVECTOR LessThanMin = XMVectorLess(SphereCenter, BoxMin); + XMVECTOR GreaterThanMax = XMVectorGreater(SphereCenter, BoxMax); + + XMVECTOR MinDelta = XMVectorSubtract(SphereCenter, BoxMin); + XMVECTOR MaxDelta = XMVectorSubtract(SphereCenter, BoxMax); + + // Choose value for each dimension based on the comparison. + d = XMVectorSelect(d, MinDelta, LessThanMin); + d = XMVectorSelect(d, MaxDelta, GreaterThanMax); + + // Use a dot-product to square them and sum them together. + XMVECTOR d2 = XMVector3Dot(d, d); + + if (XMVector3Greater(d2, XMVectorMultiply(SphereRadius, SphereRadius))) + return DISJOINT; + + XMVECTOR InsideAll = XMVectorLessOrEqual(XMVectorAdd(BoxMin, SphereRadius), SphereCenter); + InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(SphereCenter, XMVectorSubtract(BoxMax, SphereRadius))); + InsideAll = XMVectorAndInt(InsideAll, XMVectorGreater(XMVectorSubtract(BoxMax, BoxMin), SphereRadius)); + + return (XMVector3EqualInt(InsideAll, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; +} + + +//----------------------------------------------------------------------------- +// Axis-aligned box in axis-aligned box test +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType BoundingBox::Contains(const BoundingBox& box) const noexcept +{ + XMVECTOR CenterA = XMLoadFloat3(&Center); + XMVECTOR ExtentsA = XMLoadFloat3(&Extents); + + XMVECTOR CenterB = XMLoadFloat3(&box.Center); + XMVECTOR ExtentsB = XMLoadFloat3(&box.Extents); + + XMVECTOR MinA = XMVectorSubtract(CenterA, ExtentsA); + XMVECTOR MaxA = XMVectorAdd(CenterA, ExtentsA); + + XMVECTOR MinB = XMVectorSubtract(CenterB, ExtentsB); + XMVECTOR MaxB = XMVectorAdd(CenterB, ExtentsB); + + // for each i in (x, y, z) if a_min(i) > b_max(i) or b_min(i) > a_max(i) then return false + XMVECTOR Disjoint = XMVectorOrInt(XMVectorGreater(MinA, MaxB), XMVectorGreater(MinB, MaxA)); + + if (DirectX::MathInternal::XMVector3AnyTrue(Disjoint)) + return DISJOINT; + + // for each i in (x, y, z) if a_min(i) <= b_min(i) and b_max(i) <= a_max(i) then A contains B + XMVECTOR Inside = XMVectorAndInt(XMVectorLessOrEqual(MinA, MinB), XMVectorLessOrEqual(MaxB, MaxA)); + + return DirectX::MathInternal::XMVector3AllTrue(Inside) ? CONTAINS : INTERSECTS; +} + + +//----------------------------------------------------------------------------- +// Oriented box in axis-aligned box test +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType BoundingBox::Contains(const BoundingOrientedBox& box) const noexcept +{ + if (!box.Intersects(*this)) + return DISJOINT; + + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); + + // Subtract off the AABB center to remove a subtract below + XMVECTOR oCenter = XMVectorSubtract(XMLoadFloat3(&box.Center), vCenter); + + XMVECTOR oExtents = XMLoadFloat3(&box.Extents); + XMVECTOR oOrientation = XMLoadFloat4(&box.Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(oOrientation)); + + XMVECTOR Inside = XMVectorTrueInt(); + + for (size_t i = 0; i < BoundingOrientedBox::CORNER_COUNT; ++i) + { + XMVECTOR C = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(oExtents, g_BoxOffset[i]), oOrientation), oCenter); + XMVECTOR d = XMVectorAbs(C); + Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(d, vExtents)); + } + + return (XMVector3EqualInt(Inside, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; +} + + +//----------------------------------------------------------------------------- +// Frustum in axis-aligned box test +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType BoundingBox::Contains(const BoundingFrustum& fr) const noexcept +{ + if (!fr.Intersects(*this)) + return DISJOINT; + + XMFLOAT3 Corners[BoundingFrustum::CORNER_COUNT]; + fr.GetCorners(Corners); + + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); + + XMVECTOR Inside = XMVectorTrueInt(); + + for (size_t i = 0; i < BoundingFrustum::CORNER_COUNT; ++i) + { + XMVECTOR Point = XMLoadFloat3(&Corners[i]); + XMVECTOR d = XMVectorAbs(XMVectorSubtract(Point, vCenter)); + Inside = XMVectorAndInt(Inside, XMVectorLessOrEqual(d, vExtents)); + } + + return (XMVector3EqualInt(Inside, XMVectorTrueInt())) ? CONTAINS : INTERSECTS; +} + + +//----------------------------------------------------------------------------- +// Sphere vs axis-aligned box test +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool BoundingBox::Intersects(const BoundingSphere& sh) const noexcept +{ + XMVECTOR SphereCenter = XMLoadFloat3(&sh.Center); + XMVECTOR SphereRadius = XMVectorReplicatePtr(&sh.Radius); + + XMVECTOR BoxCenter = XMLoadFloat3(&Center); + XMVECTOR BoxExtents = XMLoadFloat3(&Extents); + + XMVECTOR BoxMin = XMVectorSubtract(BoxCenter, BoxExtents); + XMVECTOR BoxMax = XMVectorAdd(BoxCenter, BoxExtents); + + // Find the distance to the nearest point on the box. + // for each i in (x, y, z) + // if (SphereCenter(i) < BoxMin(i)) d2 += (SphereCenter(i) - BoxMin(i)) ^ 2 + // else if (SphereCenter(i) > BoxMax(i)) d2 += (SphereCenter(i) - BoxMax(i)) ^ 2 + + XMVECTOR d = XMVectorZero(); + + // Compute d for each dimension. + XMVECTOR LessThanMin = XMVectorLess(SphereCenter, BoxMin); + XMVECTOR GreaterThanMax = XMVectorGreater(SphereCenter, BoxMax); + + XMVECTOR MinDelta = XMVectorSubtract(SphereCenter, BoxMin); + XMVECTOR MaxDelta = XMVectorSubtract(SphereCenter, BoxMax); + + // Choose value for each dimension based on the comparison. + d = XMVectorSelect(d, MinDelta, LessThanMin); + d = XMVectorSelect(d, MaxDelta, GreaterThanMax); + + // Use a dot-product to square them and sum them together. + XMVECTOR d2 = XMVector3Dot(d, d); + + return XMVector3LessOrEqual(d2, XMVectorMultiply(SphereRadius, SphereRadius)); +} + + +//----------------------------------------------------------------------------- +// Axis-aligned box vs. axis-aligned box test +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool BoundingBox::Intersects(const BoundingBox& box) const noexcept +{ + XMVECTOR CenterA = XMLoadFloat3(&Center); + XMVECTOR ExtentsA = XMLoadFloat3(&Extents); + + XMVECTOR CenterB = XMLoadFloat3(&box.Center); + XMVECTOR ExtentsB = XMLoadFloat3(&box.Extents); + + XMVECTOR MinA = XMVectorSubtract(CenterA, ExtentsA); + XMVECTOR MaxA = XMVectorAdd(CenterA, ExtentsA); + + XMVECTOR MinB = XMVectorSubtract(CenterB, ExtentsB); + XMVECTOR MaxB = XMVectorAdd(CenterB, ExtentsB); + + // for each i in (x, y, z) if a_min(i) > b_max(i) or b_min(i) > a_max(i) then return false + XMVECTOR Disjoint = XMVectorOrInt(XMVectorGreater(MinA, MaxB), XMVectorGreater(MinB, MaxA)); + + return !DirectX::MathInternal::XMVector3AnyTrue(Disjoint); +} + + +//----------------------------------------------------------------------------- +// Oriented box vs. axis-aligned box test +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool BoundingBox::Intersects(const BoundingOrientedBox& box) const noexcept +{ + return box.Intersects(*this); +} + + +//----------------------------------------------------------------------------- +// Frustum vs. axis-aligned box test +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool BoundingBox::Intersects(const BoundingFrustum& fr) const noexcept +{ + return fr.Intersects(*this); +} + + +//----------------------------------------------------------------------------- +// Triangle vs. axis aligned box test +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool XM_CALLCONV BoundingBox::Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept +{ + XMVECTOR Zero = XMVectorZero(); + + // Load the box. + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); + + XMVECTOR BoxMin = XMVectorSubtract(vCenter, vExtents); + XMVECTOR BoxMax = XMVectorAdd(vCenter, vExtents); + + // Test the axes of the box (in effect test the AAB against the minimal AAB + // around the triangle). + XMVECTOR TriMin = XMVectorMin(XMVectorMin(V0, V1), V2); + XMVECTOR TriMax = XMVectorMax(XMVectorMax(V0, V1), V2); + + // for each i in (x, y, z) if a_min(i) > b_max(i) or b_min(i) > a_max(i) then disjoint + XMVECTOR Disjoint = XMVectorOrInt(XMVectorGreater(TriMin, BoxMax), XMVectorGreater(BoxMin, TriMax)); + if (DirectX::MathInternal::XMVector3AnyTrue(Disjoint)) + return false; + + // Test the plane of the triangle. + XMVECTOR Normal = XMVector3Cross(XMVectorSubtract(V1, V0), XMVectorSubtract(V2, V0)); + XMVECTOR Dist = XMVector3Dot(Normal, V0); + + // Assert that the triangle is not degenerate. + assert(!XMVector3Equal(Normal, Zero)); + + // for each i in (x, y, z) if n(i) >= 0 then v_min(i)=b_min(i), v_max(i)=b_max(i) + // else v_min(i)=b_max(i), v_max(i)=b_min(i) + XMVECTOR NormalSelect = XMVectorGreater(Normal, Zero); + XMVECTOR V_Min = XMVectorSelect(BoxMax, BoxMin, NormalSelect); + XMVECTOR V_Max = XMVectorSelect(BoxMin, BoxMax, NormalSelect); + + // if n dot v_min + d > 0 || n dot v_max + d < 0 then disjoint + XMVECTOR MinDist = XMVector3Dot(V_Min, Normal); + XMVECTOR MaxDist = XMVector3Dot(V_Max, Normal); + + XMVECTOR NoIntersection = XMVectorGreater(MinDist, Dist); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(MaxDist, Dist)); + + // Move the box center to zero to simplify the following tests. + XMVECTOR TV0 = XMVectorSubtract(V0, vCenter); + XMVECTOR TV1 = XMVectorSubtract(V1, vCenter); + XMVECTOR TV2 = XMVectorSubtract(V2, vCenter); + + // Test the edge/edge axes (3*3). + XMVECTOR e0 = XMVectorSubtract(TV1, TV0); + XMVECTOR e1 = XMVectorSubtract(TV2, TV1); + XMVECTOR e2 = XMVectorSubtract(TV0, TV2); + + // Make w zero. + e0 = XMVectorInsert<0, 0, 0, 0, 1>(e0, Zero); + e1 = XMVectorInsert<0, 0, 0, 0, 1>(e1, Zero); + e2 = XMVectorInsert<0, 0, 0, 0, 1>(e2, Zero); + + XMVECTOR Axis; + XMVECTOR p0, p1, p2; + XMVECTOR Min, Max; + XMVECTOR Radius; + + // Axis == (1,0,0) x e0 = (0, -e0.z, e0.y) + Axis = XMVectorPermute(e0, XMVectorNegate(e0)); + p0 = XMVector3Dot(TV0, Axis); + // p1 = XMVector3Dot( V1, Axis ); // p1 = p0; + p2 = XMVector3Dot(TV2, Axis); + Min = XMVectorMin(p0, p2); + Max = XMVectorMax(p0, p2); + Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); + + // Axis == (1,0,0) x e1 = (0, -e1.z, e1.y) + Axis = XMVectorPermute(e1, XMVectorNegate(e1)); + p0 = XMVector3Dot(TV0, Axis); + p1 = XMVector3Dot(TV1, Axis); + // p2 = XMVector3Dot( V2, Axis ); // p2 = p1; + Min = XMVectorMin(p0, p1); + Max = XMVectorMax(p0, p1); + Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); + + // Axis == (1,0,0) x e2 = (0, -e2.z, e2.y) + Axis = XMVectorPermute(e2, XMVectorNegate(e2)); + p0 = XMVector3Dot(TV0, Axis); + p1 = XMVector3Dot(TV1, Axis); + // p2 = XMVector3Dot( V2, Axis ); // p2 = p0; + Min = XMVectorMin(p0, p1); + Max = XMVectorMax(p0, p1); + Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); + + // Axis == (0,1,0) x e0 = (e0.z, 0, -e0.x) + Axis = XMVectorPermute(e0, XMVectorNegate(e0)); + p0 = XMVector3Dot(TV0, Axis); + // p1 = XMVector3Dot( V1, Axis ); // p1 = p0; + p2 = XMVector3Dot(TV2, Axis); + Min = XMVectorMin(p0, p2); + Max = XMVectorMax(p0, p2); + Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); + + // Axis == (0,1,0) x e1 = (e1.z, 0, -e1.x) + Axis = XMVectorPermute(e1, XMVectorNegate(e1)); + p0 = XMVector3Dot(TV0, Axis); + p1 = XMVector3Dot(TV1, Axis); + // p2 = XMVector3Dot( V2, Axis ); // p2 = p1; + Min = XMVectorMin(p0, p1); + Max = XMVectorMax(p0, p1); + Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); + + // Axis == (0,0,1) x e2 = (e2.z, 0, -e2.x) + Axis = XMVectorPermute(e2, XMVectorNegate(e2)); + p0 = XMVector3Dot(TV0, Axis); + p1 = XMVector3Dot(TV1, Axis); + // p2 = XMVector3Dot( V2, Axis ); // p2 = p0; + Min = XMVectorMin(p0, p1); + Max = XMVectorMax(p0, p1); + Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); + + // Axis == (0,0,1) x e0 = (-e0.y, e0.x, 0) + Axis = XMVectorPermute(e0, XMVectorNegate(e0)); + p0 = XMVector3Dot(TV0, Axis); + // p1 = XMVector3Dot( V1, Axis ); // p1 = p0; + p2 = XMVector3Dot(TV2, Axis); + Min = XMVectorMin(p0, p2); + Max = XMVectorMax(p0, p2); + Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); + + // Axis == (0,0,1) x e1 = (-e1.y, e1.x, 0) + Axis = XMVectorPermute(e1, XMVectorNegate(e1)); + p0 = XMVector3Dot(TV0, Axis); + p1 = XMVector3Dot(TV1, Axis); + // p2 = XMVector3Dot( V2, Axis ); // p2 = p1; + Min = XMVectorMin(p0, p1); + Max = XMVectorMax(p0, p1); + Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); + + // Axis == (0,0,1) x e2 = (-e2.y, e2.x, 0) + Axis = XMVectorPermute(e2, XMVectorNegate(e2)); + p0 = XMVector3Dot(TV0, Axis); + p1 = XMVector3Dot(TV1, Axis); + // p2 = XMVector3Dot( V2, Axis ); // p2 = p0; + Min = XMVectorMin(p0, p1); + Max = XMVectorMax(p0, p1); + Radius = XMVector3Dot(vExtents, XMVectorAbs(Axis)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(Min, Radius)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(Max, XMVectorNegate(Radius))); + + return XMVector4NotEqualInt(NoIntersection, XMVectorTrueInt()); +} + + +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline PlaneIntersectionType XM_CALLCONV BoundingBox::Intersects(FXMVECTOR Plane) const noexcept +{ + assert(DirectX::MathInternal::XMPlaneIsUnit(Plane)); + + // Load the box. + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); + + // Set w of the center to one so we can dot4 with a plane. + vCenter = XMVectorInsert<0, 0, 0, 0, 1>(vCenter, XMVectorSplatOne()); + + XMVECTOR Outside, Inside; + DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane, Outside, Inside); + + // If the box is outside any plane it is outside. + if (XMVector4EqualInt(Outside, XMVectorTrueInt())) + return FRONT; + + // If the box is inside all planes it is inside. + if (XMVector4EqualInt(Inside, XMVectorTrueInt())) + return BACK; + + // The box is not inside all planes or outside a plane it intersects. + return INTERSECTING; +} + + +//----------------------------------------------------------------------------- +// Compute the intersection of a ray (Origin, Direction) with an axis aligned +// box using the slabs method. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool XM_CALLCONV BoundingBox::Intersects(FXMVECTOR Origin, FXMVECTOR Direction, float& Dist) const noexcept +{ + assert(DirectX::MathInternal::XMVector3IsUnit(Direction)); + + // Load the box. + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); + + // Adjust ray origin to be relative to center of the box. + XMVECTOR TOrigin = XMVectorSubtract(vCenter, Origin); + + // Compute the dot product againt each axis of the box. + // Since the axii are (1,0,0), (0,1,0), (0,0,1) no computation is necessary. + XMVECTOR AxisDotOrigin = TOrigin; + XMVECTOR AxisDotDirection = Direction; + + // if (fabs(AxisDotDirection) <= Epsilon) the ray is nearly parallel to the slab. + XMVECTOR IsParallel = XMVectorLessOrEqual(XMVectorAbs(AxisDotDirection), g_RayEpsilon); + + // Test against all three axii simultaneously. + XMVECTOR InverseAxisDotDirection = XMVectorReciprocal(AxisDotDirection); + XMVECTOR t1 = XMVectorMultiply(XMVectorSubtract(AxisDotOrigin, vExtents), InverseAxisDotDirection); + XMVECTOR t2 = XMVectorMultiply(XMVectorAdd(AxisDotOrigin, vExtents), InverseAxisDotDirection); + + // Compute the max of min(t1,t2) and the min of max(t1,t2) ensuring we don't + // use the results from any directions parallel to the slab. + XMVECTOR t_min = XMVectorSelect(XMVectorMin(t1, t2), g_FltMin, IsParallel); + XMVECTOR t_max = XMVectorSelect(XMVectorMax(t1, t2), g_FltMax, IsParallel); + + // t_min.x = maximum( t_min.x, t_min.y, t_min.z ); + // t_max.x = minimum( t_max.x, t_max.y, t_max.z ); + t_min = XMVectorMax(t_min, XMVectorSplatY(t_min)); // x = max(x,y) + t_min = XMVectorMax(t_min, XMVectorSplatZ(t_min)); // x = max(max(x,y),z) + t_max = XMVectorMin(t_max, XMVectorSplatY(t_max)); // x = min(x,y) + t_max = XMVectorMin(t_max, XMVectorSplatZ(t_max)); // x = min(min(x,y),z) + + // if ( t_min > t_max ) return false; + XMVECTOR NoIntersection = XMVectorGreater(XMVectorSplatX(t_min), XMVectorSplatX(t_max)); + + // if ( t_max < 0.0f ) return false; + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(XMVectorSplatX(t_max), XMVectorZero())); + + // if (IsParallel && (-Extents > AxisDotOrigin || Extents < AxisDotOrigin)) return false; + XMVECTOR ParallelOverlap = XMVectorInBounds(AxisDotOrigin, vExtents); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorAndCInt(IsParallel, ParallelOverlap)); + + if (!DirectX::MathInternal::XMVector3AnyTrue(NoIntersection)) + { + // Store the x-component to *pDist + XMStoreFloat(&Dist, t_min); + return true; + } + + Dist = 0.f; + return false; +} + + +//----------------------------------------------------------------------------- +// Test an axis alinged box vs 6 planes (typically forming a frustum). +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType XM_CALLCONV BoundingBox::ContainedBy( + FXMVECTOR Plane0, FXMVECTOR Plane1, FXMVECTOR Plane2, + GXMVECTOR Plane3, + HXMVECTOR Plane4, HXMVECTOR Plane5) const noexcept +{ + // Load the box. + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); + + // Set w of the center to one so we can dot4 with a plane. + vCenter = XMVectorInsert<0, 0, 0, 0, 1>(vCenter, XMVectorSplatOne()); + + XMVECTOR Outside, Inside; + + // Test against each plane. + DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane0, Outside, Inside); + + XMVECTOR AnyOutside = Outside; + XMVECTOR AllInside = Inside; + + DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane1, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane2, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane3, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane4, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectAxisAlignedBoxPlane(vCenter, vExtents, Plane5, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + // If the box is outside any plane it is outside. + if (XMVector4EqualInt(AnyOutside, XMVectorTrueInt())) + return DISJOINT; + + // If the box is inside all planes it is inside. + if (XMVector4EqualInt(AllInside, XMVectorTrueInt())) + return CONTAINS; + + // The box is not inside all planes or outside a plane, it may intersect. + return INTERSECTS; +} + + +//----------------------------------------------------------------------------- +// Create axis-aligned box that contains two other bounding boxes +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline void BoundingBox::CreateMerged(BoundingBox& Out, const BoundingBox& b1, const BoundingBox& b2) noexcept +{ + XMVECTOR b1Center = XMLoadFloat3(&b1.Center); + XMVECTOR b1Extents = XMLoadFloat3(&b1.Extents); + + XMVECTOR b2Center = XMLoadFloat3(&b2.Center); + XMVECTOR b2Extents = XMLoadFloat3(&b2.Extents); + + XMVECTOR Min = XMVectorSubtract(b1Center, b1Extents); + Min = XMVectorMin(Min, XMVectorSubtract(b2Center, b2Extents)); + + XMVECTOR Max = XMVectorAdd(b1Center, b1Extents); + Max = XMVectorMax(Max, XMVectorAdd(b2Center, b2Extents)); + + assert(XMVector3LessOrEqual(Min, Max)); + + XMStoreFloat3(&Out.Center, XMVectorScale(XMVectorAdd(Min, Max), 0.5f)); + XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(Max, Min), 0.5f)); +} + + +//----------------------------------------------------------------------------- +// Create axis-aligned box that contains a bounding sphere +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline void BoundingBox::CreateFromSphere(BoundingBox& Out, const BoundingSphere& sh) noexcept +{ + XMVECTOR spCenter = XMLoadFloat3(&sh.Center); + XMVECTOR shRadius = XMVectorReplicatePtr(&sh.Radius); + + XMVECTOR Min = XMVectorSubtract(spCenter, shRadius); + XMVECTOR Max = XMVectorAdd(spCenter, shRadius); + + assert(XMVector3LessOrEqual(Min, Max)); + + XMStoreFloat3(&Out.Center, XMVectorScale(XMVectorAdd(Min, Max), 0.5f)); + XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(Max, Min), 0.5f)); +} + + +//----------------------------------------------------------------------------- +// Create axis-aligned box from min/max points +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline void XM_CALLCONV BoundingBox::CreateFromPoints(BoundingBox& Out, FXMVECTOR pt1, FXMVECTOR pt2) noexcept +{ + XMVECTOR Min = XMVectorMin(pt1, pt2); + XMVECTOR Max = XMVectorMax(pt1, pt2); + + // Store center and extents. + XMStoreFloat3(&Out.Center, XMVectorScale(XMVectorAdd(Min, Max), 0.5f)); + XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(Max, Min), 0.5f)); +} + + +//----------------------------------------------------------------------------- +// Find the minimum axis aligned bounding box containing a set of points. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline void BoundingBox::CreateFromPoints(BoundingBox& Out, size_t Count, const XMFLOAT3* pPoints, size_t Stride) noexcept +{ + assert(Count > 0); + assert(pPoints); + + // Find the minimum and maximum x, y, and z + XMVECTOR vMin, vMax; + + vMin = vMax = XMLoadFloat3(pPoints); + + for (size_t i = 1; i < Count; ++i) + { + XMVECTOR Point = XMLoadFloat3(reinterpret_cast(reinterpret_cast(pPoints) + i * Stride)); + + vMin = XMVectorMin(vMin, Point); + vMax = XMVectorMax(vMax, Point); + } + + // Store center and extents. + XMStoreFloat3(&Out.Center, XMVectorScale(XMVectorAdd(vMin, vMax), 0.5f)); + XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(vMax, vMin), 0.5f)); +} + + +/**************************************************************************** + * + * BoundingOrientedBox + * + ****************************************************************************/ + +//----------------------------------------------------------------------------- +// Transform an oriented box by an angle preserving transform. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline void XM_CALLCONV BoundingOrientedBox::Transform(BoundingOrientedBox& Out, FXMMATRIX M) const noexcept +{ + // Load the box. + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); + + // Composite the box rotation and the transform rotation. + XMMATRIX nM; + nM.r[0] = XMVector3Normalize(M.r[0]); + nM.r[1] = XMVector3Normalize(M.r[1]); + nM.r[2] = XMVector3Normalize(M.r[2]); + nM.r[3] = g_XMIdentityR3; + XMVECTOR Rotation = XMQuaternionRotationMatrix(nM); + vOrientation = XMQuaternionMultiply(vOrientation, Rotation); + + // Transform the center. + vCenter = XMVector3Transform(vCenter, M); + + // Scale the box extents. + XMVECTOR dX = XMVector3Length(M.r[0]); + XMVECTOR dY = XMVector3Length(M.r[1]); + XMVECTOR dZ = XMVector3Length(M.r[2]); + + XMVECTOR VectorScale = XMVectorSelect(dY, dX, g_XMSelect1000); + VectorScale = XMVectorSelect(dZ, VectorScale, g_XMSelect1100); + vExtents = XMVectorMultiply(vExtents, VectorScale); + + // Store the box. + XMStoreFloat3(&Out.Center, vCenter); + XMStoreFloat3(&Out.Extents, vExtents); + XMStoreFloat4(&Out.Orientation, vOrientation); +} + +_Use_decl_annotations_ +inline void XM_CALLCONV BoundingOrientedBox::Transform(BoundingOrientedBox& Out, float Scale, FXMVECTOR Rotation, FXMVECTOR Translation) const noexcept +{ + assert(DirectX::MathInternal::XMQuaternionIsUnit(Rotation)); + + // Load the box. + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); + + // Composite the box rotation and the transform rotation. + vOrientation = XMQuaternionMultiply(vOrientation, Rotation); + + // Transform the center. + XMVECTOR VectorScale = XMVectorReplicate(Scale); + vCenter = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(vCenter, VectorScale), Rotation), Translation); + + // Scale the box extents. + vExtents = XMVectorMultiply(vExtents, VectorScale); + + // Store the box. + XMStoreFloat3(&Out.Center, vCenter); + XMStoreFloat3(&Out.Extents, vExtents); + XMStoreFloat4(&Out.Orientation, vOrientation); +} + + +//----------------------------------------------------------------------------- +// Get the corner points of the box +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline void BoundingOrientedBox::GetCorners(XMFLOAT3* Corners) const noexcept +{ + assert(Corners != nullptr); + + // Load the box + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); + + for (size_t i = 0; i < CORNER_COUNT; ++i) + { + XMVECTOR C = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(vExtents, g_BoxOffset[i]), vOrientation), vCenter); + XMStoreFloat3(&Corners[i], C); + } +} + + +//----------------------------------------------------------------------------- +// Point in oriented box test. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType XM_CALLCONV BoundingOrientedBox::Contains(FXMVECTOR Point) const noexcept +{ + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + // Transform the point to be local to the box. + XMVECTOR TPoint = XMVector3InverseRotate(XMVectorSubtract(Point, vCenter), vOrientation); + + return XMVector3InBounds(TPoint, vExtents) ? CONTAINS : DISJOINT; +} + + +//----------------------------------------------------------------------------- +// Triangle in oriented bounding box +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType XM_CALLCONV BoundingOrientedBox::Contains(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept +{ + // Load the box center & orientation. + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + // Transform the triangle vertices into the space of the box. + XMVECTOR TV0 = XMVector3InverseRotate(XMVectorSubtract(V0, vCenter), vOrientation); + XMVECTOR TV1 = XMVector3InverseRotate(XMVectorSubtract(V1, vCenter), vOrientation); + XMVECTOR TV2 = XMVector3InverseRotate(XMVectorSubtract(V2, vCenter), vOrientation); + + BoundingBox box; + box.Center = XMFLOAT3(0.0f, 0.0f, 0.0f); + box.Extents = Extents; + + // Use the triangle vs axis aligned box intersection routine. + return box.Contains(TV0, TV1, TV2); +} + + +//----------------------------------------------------------------------------- +// Sphere in oriented bounding box +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType BoundingOrientedBox::Contains(const BoundingSphere& sh) const noexcept +{ + XMVECTOR SphereCenter = XMLoadFloat3(&sh.Center); + XMVECTOR SphereRadius = XMVectorReplicatePtr(&sh.Radius); + + XMVECTOR BoxCenter = XMLoadFloat3(&Center); + XMVECTOR BoxExtents = XMLoadFloat3(&Extents); + XMVECTOR BoxOrientation = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(BoxOrientation)); + + // Transform the center of the sphere to be local to the box. + // BoxMin = -BoxExtents + // BoxMax = +BoxExtents + SphereCenter = XMVector3InverseRotate(XMVectorSubtract(SphereCenter, BoxCenter), BoxOrientation); + + // Find the distance to the nearest point on the box. + // for each i in (x, y, z) + // if (SphereCenter(i) < BoxMin(i)) d2 += (SphereCenter(i) - BoxMin(i)) ^ 2 + // else if (SphereCenter(i) > BoxMax(i)) d2 += (SphereCenter(i) - BoxMax(i)) ^ 2 + + XMVECTOR d = XMVectorZero(); + + // Compute d for each dimension. + XMVECTOR LessThanMin = XMVectorLess(SphereCenter, XMVectorNegate(BoxExtents)); + XMVECTOR GreaterThanMax = XMVectorGreater(SphereCenter, BoxExtents); + + XMVECTOR MinDelta = XMVectorAdd(SphereCenter, BoxExtents); + XMVECTOR MaxDelta = XMVectorSubtract(SphereCenter, BoxExtents); + + // Choose value for each dimension based on the comparison. + d = XMVectorSelect(d, MinDelta, LessThanMin); + d = XMVectorSelect(d, MaxDelta, GreaterThanMax); + + // Use a dot-product to square them and sum them together. + XMVECTOR d2 = XMVector3Dot(d, d); + XMVECTOR SphereRadiusSq = XMVectorMultiply(SphereRadius, SphereRadius); + + if (XMVector4Greater(d2, SphereRadiusSq)) + return DISJOINT; + + // See if we are completely inside the box + XMVECTOR SMin = XMVectorSubtract(SphereCenter, SphereRadius); + XMVECTOR SMax = XMVectorAdd(SphereCenter, SphereRadius); + + return (XMVector3InBounds(SMin, BoxExtents) && XMVector3InBounds(SMax, BoxExtents)) ? CONTAINS : INTERSECTS; +} + + +//----------------------------------------------------------------------------- +// Axis aligned box vs. oriented box. Constructs an oriented box and uses +// the oriented box vs. oriented box test. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType BoundingOrientedBox::Contains(const BoundingBox& box) const noexcept +{ + // Make the axis aligned box oriented and do an OBB vs OBB test. + BoundingOrientedBox obox(box.Center, box.Extents, XMFLOAT4(0.f, 0.f, 0.f, 1.f)); + return Contains(obox); +} + + +//----------------------------------------------------------------------------- +// Oriented bounding box in oriented bounding box +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType BoundingOrientedBox::Contains(const BoundingOrientedBox& box) const noexcept +{ + if (!Intersects(box)) + return DISJOINT; + + // Load the boxes + XMVECTOR aCenter = XMLoadFloat3(&Center); + XMVECTOR aExtents = XMLoadFloat3(&Extents); + XMVECTOR aOrientation = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(aOrientation)); + + XMVECTOR bCenter = XMLoadFloat3(&box.Center); + XMVECTOR bExtents = XMLoadFloat3(&box.Extents); + XMVECTOR bOrientation = XMLoadFloat4(&box.Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(bOrientation)); + + XMVECTOR offset = XMVectorSubtract(bCenter, aCenter); + + for (size_t i = 0; i < CORNER_COUNT; ++i) + { + // Cb = rotate( bExtents * corneroffset[i], bOrientation ) + bcenter + // Ca = invrotate( Cb - aCenter, aOrientation ) + + XMVECTOR C = XMVectorAdd(XMVector3Rotate(XMVectorMultiply(bExtents, g_BoxOffset[i]), bOrientation), offset); + C = XMVector3InverseRotate(C, aOrientation); + + if (!XMVector3InBounds(C, aExtents)) + return INTERSECTS; + } + + return CONTAINS; +} + + +//----------------------------------------------------------------------------- +// Frustum in oriented bounding box +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType BoundingOrientedBox::Contains(const BoundingFrustum& fr) const noexcept +{ + if (!fr.Intersects(*this)) + return DISJOINT; + + XMFLOAT3 Corners[BoundingFrustum::CORNER_COUNT]; + fr.GetCorners(Corners); + + // Load the box + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); + + for (size_t i = 0; i < BoundingFrustum::CORNER_COUNT; ++i) + { + XMVECTOR C = XMVector3InverseRotate(XMVectorSubtract(XMLoadFloat3(&Corners[i]), vCenter), vOrientation); + + if (!XMVector3InBounds(C, vExtents)) + return INTERSECTS; + } + + return CONTAINS; +} + + +//----------------------------------------------------------------------------- +// Sphere vs. oriented box test +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool BoundingOrientedBox::Intersects(const BoundingSphere& sh) const noexcept +{ + XMVECTOR SphereCenter = XMLoadFloat3(&sh.Center); + XMVECTOR SphereRadius = XMVectorReplicatePtr(&sh.Radius); + + XMVECTOR BoxCenter = XMLoadFloat3(&Center); + XMVECTOR BoxExtents = XMLoadFloat3(&Extents); + XMVECTOR BoxOrientation = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(BoxOrientation)); + + // Transform the center of the sphere to be local to the box. + // BoxMin = -BoxExtents + // BoxMax = +BoxExtents + SphereCenter = XMVector3InverseRotate(XMVectorSubtract(SphereCenter, BoxCenter), BoxOrientation); + + // Find the distance to the nearest point on the box. + // for each i in (x, y, z) + // if (SphereCenter(i) < BoxMin(i)) d2 += (SphereCenter(i) - BoxMin(i)) ^ 2 + // else if (SphereCenter(i) > BoxMax(i)) d2 += (SphereCenter(i) - BoxMax(i)) ^ 2 + + XMVECTOR d = XMVectorZero(); + + // Compute d for each dimension. + XMVECTOR LessThanMin = XMVectorLess(SphereCenter, XMVectorNegate(BoxExtents)); + XMVECTOR GreaterThanMax = XMVectorGreater(SphereCenter, BoxExtents); + + XMVECTOR MinDelta = XMVectorAdd(SphereCenter, BoxExtents); + XMVECTOR MaxDelta = XMVectorSubtract(SphereCenter, BoxExtents); + + // Choose value for each dimension based on the comparison. + d = XMVectorSelect(d, MinDelta, LessThanMin); + d = XMVectorSelect(d, MaxDelta, GreaterThanMax); + + // Use a dot-product to square them and sum them together. + XMVECTOR d2 = XMVector3Dot(d, d); + + return XMVector4LessOrEqual(d2, XMVectorMultiply(SphereRadius, SphereRadius)) ? true : false; +} + + +//----------------------------------------------------------------------------- +// Axis aligned box vs. oriented box. Constructs an oriented box and uses +// the oriented box vs. oriented box test. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool BoundingOrientedBox::Intersects(const BoundingBox& box) const noexcept +{ + // Make the axis aligned box oriented and do an OBB vs OBB test. + BoundingOrientedBox obox(box.Center, box.Extents, XMFLOAT4(0.f, 0.f, 0.f, 1.f)); + return Intersects(obox); +} + + +//----------------------------------------------------------------------------- +// Fast oriented box / oriented box intersection test using the separating axis +// theorem. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool BoundingOrientedBox::Intersects(const BoundingOrientedBox& box) const noexcept +{ + // Build the 3x3 rotation matrix that defines the orientation of B relative to A. + XMVECTOR A_quat = XMLoadFloat4(&Orientation); + XMVECTOR B_quat = XMLoadFloat4(&box.Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(A_quat)); + assert(DirectX::MathInternal::XMQuaternionIsUnit(B_quat)); + + XMVECTOR Q = XMQuaternionMultiply(A_quat, XMQuaternionConjugate(B_quat)); + XMMATRIX R = XMMatrixRotationQuaternion(Q); + + // Compute the translation of B relative to A. + XMVECTOR A_cent = XMLoadFloat3(&Center); + XMVECTOR B_cent = XMLoadFloat3(&box.Center); + XMVECTOR t = XMVector3InverseRotate(XMVectorSubtract(B_cent, A_cent), A_quat); + + // + // h(A) = extents of A. + // h(B) = extents of B. + // + // a(u) = axes of A = (1,0,0), (0,1,0), (0,0,1) + // b(u) = axes of B relative to A = (r00,r10,r20), (r01,r11,r21), (r02,r12,r22) + // + // For each possible separating axis l: + // d(A) = sum (for i = u,v,w) h(A)(i) * abs( a(i) dot l ) + // d(B) = sum (for i = u,v,w) h(B)(i) * abs( b(i) dot l ) + // if abs( t dot l ) > d(A) + d(B) then disjoint + // + + // Load extents of A and B. + XMVECTOR h_A = XMLoadFloat3(&Extents); + XMVECTOR h_B = XMLoadFloat3(&box.Extents); + + // Rows. Note R[0,1,2]X.w = 0. + XMVECTOR R0X = R.r[0]; + XMVECTOR R1X = R.r[1]; + XMVECTOR R2X = R.r[2]; + + R = XMMatrixTranspose(R); + + // Columns. Note RX[0,1,2].w = 0. + XMVECTOR RX0 = R.r[0]; + XMVECTOR RX1 = R.r[1]; + XMVECTOR RX2 = R.r[2]; + + // Absolute value of rows. + XMVECTOR AR0X = XMVectorAbs(R0X); + XMVECTOR AR1X = XMVectorAbs(R1X); + XMVECTOR AR2X = XMVectorAbs(R2X); + + // Absolute value of columns. + XMVECTOR ARX0 = XMVectorAbs(RX0); + XMVECTOR ARX1 = XMVectorAbs(RX1); + XMVECTOR ARX2 = XMVectorAbs(RX2); + + // Test each of the 15 possible seperating axii. + XMVECTOR d, d_A, d_B; + + // l = a(u) = (1, 0, 0) + // t dot l = t.x + // d(A) = h(A).x + // d(B) = h(B) dot abs(r00, r01, r02) + d = XMVectorSplatX(t); + d_A = XMVectorSplatX(h_A); + d_B = XMVector3Dot(h_B, AR0X); + XMVECTOR NoIntersection = XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B)); + + // l = a(v) = (0, 1, 0) + // t dot l = t.y + // d(A) = h(A).y + // d(B) = h(B) dot abs(r10, r11, r12) + d = XMVectorSplatY(t); + d_A = XMVectorSplatY(h_A); + d_B = XMVector3Dot(h_B, AR1X); + NoIntersection = XMVectorOrInt(NoIntersection, + XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + + // l = a(w) = (0, 0, 1) + // t dot l = t.z + // d(A) = h(A).z + // d(B) = h(B) dot abs(r20, r21, r22) + d = XMVectorSplatZ(t); + d_A = XMVectorSplatZ(h_A); + d_B = XMVector3Dot(h_B, AR2X); + NoIntersection = XMVectorOrInt(NoIntersection, + XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + + // l = b(u) = (r00, r10, r20) + // d(A) = h(A) dot abs(r00, r10, r20) + // d(B) = h(B).x + d = XMVector3Dot(t, RX0); + d_A = XMVector3Dot(h_A, ARX0); + d_B = XMVectorSplatX(h_B); + NoIntersection = XMVectorOrInt(NoIntersection, + XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + + // l = b(v) = (r01, r11, r21) + // d(A) = h(A) dot abs(r01, r11, r21) + // d(B) = h(B).y + d = XMVector3Dot(t, RX1); + d_A = XMVector3Dot(h_A, ARX1); + d_B = XMVectorSplatY(h_B); + NoIntersection = XMVectorOrInt(NoIntersection, + XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + + // l = b(w) = (r02, r12, r22) + // d(A) = h(A) dot abs(r02, r12, r22) + // d(B) = h(B).z + d = XMVector3Dot(t, RX2); + d_A = XMVector3Dot(h_A, ARX2); + d_B = XMVectorSplatZ(h_B); + NoIntersection = XMVectorOrInt(NoIntersection, + XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + + // l = a(u) x b(u) = (0, -r20, r10) + // d(A) = h(A) dot abs(0, r20, r10) + // d(B) = h(B) dot abs(0, r02, r01) + d = XMVector3Dot(t, XMVectorPermute(RX0, XMVectorNegate(RX0))); + d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX0)); + d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR0X)); + NoIntersection = XMVectorOrInt(NoIntersection, + XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + + // l = a(u) x b(v) = (0, -r21, r11) + // d(A) = h(A) dot abs(0, r21, r11) + // d(B) = h(B) dot abs(r02, 0, r00) + d = XMVector3Dot(t, XMVectorPermute(RX1, XMVectorNegate(RX1))); + d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX1)); + d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR0X)); + NoIntersection = XMVectorOrInt(NoIntersection, + XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + + // l = a(u) x b(w) = (0, -r22, r12) + // d(A) = h(A) dot abs(0, r22, r12) + // d(B) = h(B) dot abs(r01, r00, 0) + d = XMVector3Dot(t, XMVectorPermute(RX2, XMVectorNegate(RX2))); + d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX2)); + d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR0X)); + NoIntersection = XMVectorOrInt(NoIntersection, + XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + + // l = a(v) x b(u) = (r20, 0, -r00) + // d(A) = h(A) dot abs(r20, 0, r00) + // d(B) = h(B) dot abs(0, r12, r11) + d = XMVector3Dot(t, XMVectorPermute(RX0, XMVectorNegate(RX0))); + d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX0)); + d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR1X)); + NoIntersection = XMVectorOrInt(NoIntersection, + XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + + // l = a(v) x b(v) = (r21, 0, -r01) + // d(A) = h(A) dot abs(r21, 0, r01) + // d(B) = h(B) dot abs(r12, 0, r10) + d = XMVector3Dot(t, XMVectorPermute(RX1, XMVectorNegate(RX1))); + d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX1)); + d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR1X)); + NoIntersection = XMVectorOrInt(NoIntersection, + XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + + // l = a(v) x b(w) = (r22, 0, -r02) + // d(A) = h(A) dot abs(r22, 0, r02) + // d(B) = h(B) dot abs(r11, r10, 0) + d = XMVector3Dot(t, XMVectorPermute(RX2, XMVectorNegate(RX2))); + d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX2)); + d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR1X)); + NoIntersection = XMVectorOrInt(NoIntersection, + XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + + // l = a(w) x b(u) = (-r10, r00, 0) + // d(A) = h(A) dot abs(r10, r00, 0) + // d(B) = h(B) dot abs(0, r22, r21) + d = XMVector3Dot(t, XMVectorPermute(RX0, XMVectorNegate(RX0))); + d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX0)); + d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR2X)); + NoIntersection = XMVectorOrInt(NoIntersection, + XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + + // l = a(w) x b(v) = (-r11, r01, 0) + // d(A) = h(A) dot abs(r11, r01, 0) + // d(B) = h(B) dot abs(r22, 0, r20) + d = XMVector3Dot(t, XMVectorPermute(RX1, XMVectorNegate(RX1))); + d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX1)); + d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR2X)); + NoIntersection = XMVectorOrInt(NoIntersection, + XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + + // l = a(w) x b(w) = (-r12, r02, 0) + // d(A) = h(A) dot abs(r12, r02, 0) + // d(B) = h(B) dot abs(r21, r20, 0) + d = XMVector3Dot(t, XMVectorPermute(RX2, XMVectorNegate(RX2))); + d_A = XMVector3Dot(h_A, XMVectorSwizzle(ARX2)); + d_B = XMVector3Dot(h_B, XMVectorSwizzle(AR2X)); + NoIntersection = XMVectorOrInt(NoIntersection, + XMVectorGreater(XMVectorAbs(d), XMVectorAdd(d_A, d_B))); + + // No seperating axis found, boxes must intersect. + return XMVector4NotEqualInt(NoIntersection, XMVectorTrueInt()) ? true : false; +} + + +//----------------------------------------------------------------------------- +// Frustum vs. oriented box test +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool BoundingOrientedBox::Intersects(const BoundingFrustum& fr) const noexcept +{ + return fr.Intersects(*this); +} + + +//----------------------------------------------------------------------------- +// Triangle vs. oriented box test. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool XM_CALLCONV BoundingOrientedBox::Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept +{ + // Load the box center & orientation. + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + // Transform the triangle vertices into the space of the box. + XMVECTOR TV0 = XMVector3InverseRotate(XMVectorSubtract(V0, vCenter), vOrientation); + XMVECTOR TV1 = XMVector3InverseRotate(XMVectorSubtract(V1, vCenter), vOrientation); + XMVECTOR TV2 = XMVector3InverseRotate(XMVectorSubtract(V2, vCenter), vOrientation); + + BoundingBox box; + box.Center = XMFLOAT3(0.0f, 0.0f, 0.0f); + box.Extents = Extents; + + // Use the triangle vs axis aligned box intersection routine. + return box.Intersects(TV0, TV1, TV2); +} + + +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline PlaneIntersectionType XM_CALLCONV BoundingOrientedBox::Intersects(FXMVECTOR Plane) const noexcept +{ + assert(DirectX::MathInternal::XMPlaneIsUnit(Plane)); + + // Load the box. + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); + XMVECTOR BoxOrientation = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(BoxOrientation)); + + // Set w of the center to one so we can dot4 with a plane. + vCenter = XMVectorInsert<0, 0, 0, 0, 1>(vCenter, XMVectorSplatOne()); + + // Build the 3x3 rotation matrix that defines the box axes. + XMMATRIX R = XMMatrixRotationQuaternion(BoxOrientation); + + XMVECTOR Outside, Inside; + DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane, Outside, Inside); + + // If the box is outside any plane it is outside. + if (XMVector4EqualInt(Outside, XMVectorTrueInt())) + return FRONT; + + // If the box is inside all planes it is inside. + if (XMVector4EqualInt(Inside, XMVectorTrueInt())) + return BACK; + + // The box is not inside all planes or outside a plane it intersects. + return INTERSECTING; +} + + +//----------------------------------------------------------------------------- +// Compute the intersection of a ray (Origin, Direction) with an oriented box +// using the slabs method. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool XM_CALLCONV BoundingOrientedBox::Intersects(FXMVECTOR Origin, FXMVECTOR Direction, float& Dist) const noexcept +{ + assert(DirectX::MathInternal::XMVector3IsUnit(Direction)); + + static const XMVECTORU32 SelectY = { { { XM_SELECT_0, XM_SELECT_1, XM_SELECT_0, XM_SELECT_0 } } }; + static const XMVECTORU32 SelectZ = { { { XM_SELECT_0, XM_SELECT_0, XM_SELECT_1, XM_SELECT_0 } } }; + + // Load the box. + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); + + // Get the boxes normalized side directions. + XMMATRIX R = XMMatrixRotationQuaternion(vOrientation); + + // Adjust ray origin to be relative to center of the box. + XMVECTOR TOrigin = XMVectorSubtract(vCenter, Origin); + + // Compute the dot product againt each axis of the box. + XMVECTOR AxisDotOrigin = XMVector3Dot(R.r[0], TOrigin); + AxisDotOrigin = XMVectorSelect(AxisDotOrigin, XMVector3Dot(R.r[1], TOrigin), SelectY); + AxisDotOrigin = XMVectorSelect(AxisDotOrigin, XMVector3Dot(R.r[2], TOrigin), SelectZ); + + XMVECTOR AxisDotDirection = XMVector3Dot(R.r[0], Direction); + AxisDotDirection = XMVectorSelect(AxisDotDirection, XMVector3Dot(R.r[1], Direction), SelectY); + AxisDotDirection = XMVectorSelect(AxisDotDirection, XMVector3Dot(R.r[2], Direction), SelectZ); + + // if (fabs(AxisDotDirection) <= Epsilon) the ray is nearly parallel to the slab. + XMVECTOR IsParallel = XMVectorLessOrEqual(XMVectorAbs(AxisDotDirection), g_RayEpsilon); + + // Test against all three axes simultaneously. + XMVECTOR InverseAxisDotDirection = XMVectorReciprocal(AxisDotDirection); + XMVECTOR t1 = XMVectorMultiply(XMVectorSubtract(AxisDotOrigin, vExtents), InverseAxisDotDirection); + XMVECTOR t2 = XMVectorMultiply(XMVectorAdd(AxisDotOrigin, vExtents), InverseAxisDotDirection); + + // Compute the max of min(t1,t2) and the min of max(t1,t2) ensuring we don't + // use the results from any directions parallel to the slab. + XMVECTOR t_min = XMVectorSelect(XMVectorMin(t1, t2), g_FltMin, IsParallel); + XMVECTOR t_max = XMVectorSelect(XMVectorMax(t1, t2), g_FltMax, IsParallel); + + // t_min.x = maximum( t_min.x, t_min.y, t_min.z ); + // t_max.x = minimum( t_max.x, t_max.y, t_max.z ); + t_min = XMVectorMax(t_min, XMVectorSplatY(t_min)); // x = max(x,y) + t_min = XMVectorMax(t_min, XMVectorSplatZ(t_min)); // x = max(std::max(x,y),z) + t_max = XMVectorMin(t_max, XMVectorSplatY(t_max)); // x = min(x,y) + t_max = XMVectorMin(t_max, XMVectorSplatZ(t_max)); // x = min(std::min(x,y),z) + + // if ( t_min > t_max ) return false; + XMVECTOR NoIntersection = XMVectorGreater(XMVectorSplatX(t_min), XMVectorSplatX(t_max)); + + // if ( t_max < 0.0f ) return false; + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(XMVectorSplatX(t_max), XMVectorZero())); + + // if (IsParallel && (-Extents > AxisDotOrigin || Extents < AxisDotOrigin)) return false; + XMVECTOR ParallelOverlap = XMVectorInBounds(AxisDotOrigin, vExtents); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorAndCInt(IsParallel, ParallelOverlap)); + + if (!DirectX::MathInternal::XMVector3AnyTrue(NoIntersection)) + { + // Store the x-component to *pDist + XMStoreFloat(&Dist, t_min); + return true; + } + + Dist = 0.f; + return false; +} + + +//----------------------------------------------------------------------------- +// Test an oriented box vs 6 planes (typically forming a frustum). +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType XM_CALLCONV BoundingOrientedBox::ContainedBy( + FXMVECTOR Plane0, FXMVECTOR Plane1, FXMVECTOR Plane2, + GXMVECTOR Plane3, + HXMVECTOR Plane4, HXMVECTOR Plane5) const noexcept +{ + // Load the box. + XMVECTOR vCenter = XMLoadFloat3(&Center); + XMVECTOR vExtents = XMLoadFloat3(&Extents); + XMVECTOR BoxOrientation = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(BoxOrientation)); + + // Set w of the center to one so we can dot4 with a plane. + vCenter = XMVectorInsert<0, 0, 0, 0, 1>(vCenter, XMVectorSplatOne()); + + // Build the 3x3 rotation matrix that defines the box axes. + XMMATRIX R = XMMatrixRotationQuaternion(BoxOrientation); + + XMVECTOR Outside, Inside; + + // Test against each plane. + DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane0, Outside, Inside); + + XMVECTOR AnyOutside = Outside; + XMVECTOR AllInside = Inside; + + DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane1, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane2, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane3, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane4, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectOrientedBoxPlane(vCenter, vExtents, R.r[0], R.r[1], R.r[2], Plane5, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + // If the box is outside any plane it is outside. + if (XMVector4EqualInt(AnyOutside, XMVectorTrueInt())) + return DISJOINT; + + // If the box is inside all planes it is inside. + if (XMVector4EqualInt(AllInside, XMVectorTrueInt())) + return CONTAINS; + + // The box is not inside all planes or outside a plane, it may intersect. + return INTERSECTS; +} + + +//----------------------------------------------------------------------------- +// Create oriented bounding box from axis-aligned bounding box +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline void BoundingOrientedBox::CreateFromBoundingBox(BoundingOrientedBox& Out, const BoundingBox& box) noexcept +{ + Out.Center = box.Center; + Out.Extents = box.Extents; + Out.Orientation = XMFLOAT4(0.f, 0.f, 0.f, 1.f); +} + + +//----------------------------------------------------------------------------- +// Find the approximate minimum oriented bounding box containing a set of +// points. Exact computation of minimum oriented bounding box is possible but +// is slower and requires a more complex algorithm. +// The algorithm works by computing the inertia tensor of the points and then +// using the eigenvectors of the intertia tensor as the axes of the box. +// Computing the intertia tensor of the convex hull of the points will usually +// result in better bounding box but the computation is more complex. +// Exact computation of the minimum oriented bounding box is possible but the +// best know algorithm is O(N^3) and is significanly more complex to implement. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline void BoundingOrientedBox::CreateFromPoints(BoundingOrientedBox& Out, size_t Count, const XMFLOAT3* pPoints, size_t Stride) noexcept +{ + assert(Count > 0); + assert(pPoints != nullptr); + + XMVECTOR CenterOfMass = XMVectorZero(); + + // Compute the center of mass and inertia tensor of the points. + for (size_t i = 0; i < Count; ++i) + { + XMVECTOR Point = XMLoadFloat3(reinterpret_cast(reinterpret_cast(pPoints) + i * Stride)); + + CenterOfMass = XMVectorAdd(CenterOfMass, Point); + } + + CenterOfMass = XMVectorMultiply(CenterOfMass, XMVectorReciprocal(XMVectorReplicate(float(Count)))); + + // Compute the inertia tensor of the points around the center of mass. + // Using the center of mass is not strictly necessary, but will hopefully + // improve the stability of finding the eigenvectors. + XMVECTOR XX_YY_ZZ = XMVectorZero(); + XMVECTOR XY_XZ_YZ = XMVectorZero(); + + for (size_t i = 0; i < Count; ++i) + { + XMVECTOR Point = XMVectorSubtract(XMLoadFloat3(reinterpret_cast(reinterpret_cast(pPoints) + i * Stride)), CenterOfMass); + + XX_YY_ZZ = XMVectorAdd(XX_YY_ZZ, XMVectorMultiply(Point, Point)); + + XMVECTOR XXY = XMVectorSwizzle(Point); + XMVECTOR YZZ = XMVectorSwizzle(Point); + + XY_XZ_YZ = XMVectorAdd(XY_XZ_YZ, XMVectorMultiply(XXY, YZZ)); + } + + XMVECTOR v1, v2, v3; + + // Compute the eigenvectors of the inertia tensor. + DirectX::MathInternal::CalculateEigenVectorsFromCovarianceMatrix(XMVectorGetX(XX_YY_ZZ), XMVectorGetY(XX_YY_ZZ), + XMVectorGetZ(XX_YY_ZZ), + XMVectorGetX(XY_XZ_YZ), XMVectorGetY(XY_XZ_YZ), + XMVectorGetZ(XY_XZ_YZ), + &v1, &v2, &v3); + + // Put them in a matrix. + XMMATRIX R; + + R.r[0] = XMVectorSetW(v1, 0.f); + R.r[1] = XMVectorSetW(v2, 0.f); + R.r[2] = XMVectorSetW(v3, 0.f); + R.r[3] = g_XMIdentityR3.v; + + // Multiply by -1 to convert the matrix into a right handed coordinate + // system (Det ~= 1) in case the eigenvectors form a left handed + // coordinate system (Det ~= -1) because XMQuaternionRotationMatrix only + // works on right handed matrices. + XMVECTOR Det = XMMatrixDeterminant(R); + + if (XMVector4Less(Det, XMVectorZero())) + { + R.r[0] = XMVectorMultiply(R.r[0], g_XMNegativeOne.v); + R.r[1] = XMVectorMultiply(R.r[1], g_XMNegativeOne.v); + R.r[2] = XMVectorMultiply(R.r[2], g_XMNegativeOne.v); + } + + // Get the rotation quaternion from the matrix. + XMVECTOR vOrientation = XMQuaternionRotationMatrix(R); + + // Make sure it is normal (in case the vectors are slightly non-orthogonal). + vOrientation = XMQuaternionNormalize(vOrientation); + + // Rebuild the rotation matrix from the quaternion. + R = XMMatrixRotationQuaternion(vOrientation); + + // Build the rotation into the rotated space. + XMMATRIX InverseR = XMMatrixTranspose(R); + + // Find the minimum OBB using the eigenvectors as the axes. + XMVECTOR vMin, vMax; + + vMin = vMax = XMVector3TransformNormal(XMLoadFloat3(pPoints), InverseR); + + for (size_t i = 1; i < Count; ++i) + { + XMVECTOR Point = XMVector3TransformNormal(XMLoadFloat3(reinterpret_cast(reinterpret_cast(pPoints) + i * Stride)), + InverseR); + + vMin = XMVectorMin(vMin, Point); + vMax = XMVectorMax(vMax, Point); + } + + // Rotate the center into world space. + XMVECTOR vCenter = XMVectorScale(XMVectorAdd(vMin, vMax), 0.5f); + vCenter = XMVector3TransformNormal(vCenter, R); + + // Store center, extents, and orientation. + XMStoreFloat3(&Out.Center, vCenter); + XMStoreFloat3(&Out.Extents, XMVectorScale(XMVectorSubtract(vMax, vMin), 0.5f)); + XMStoreFloat4(&Out.Orientation, vOrientation); +} + + +/**************************************************************************** + * + * BoundingFrustum + * + ****************************************************************************/ + +_Use_decl_annotations_ +inline BoundingFrustum::BoundingFrustum(CXMMATRIX Projection, bool rhcoords) noexcept +{ + CreateFromMatrix(*this, Projection, rhcoords); +} + + +//----------------------------------------------------------------------------- +// Transform a frustum by an angle preserving transform. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline void XM_CALLCONV BoundingFrustum::Transform(BoundingFrustum& Out, FXMMATRIX M) const noexcept +{ + // Load the frustum. + XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); + + // Composite the frustum rotation and the transform rotation + XMMATRIX nM; + nM.r[0] = XMVector3Normalize(M.r[0]); + nM.r[1] = XMVector3Normalize(M.r[1]); + nM.r[2] = XMVector3Normalize(M.r[2]); + nM.r[3] = g_XMIdentityR3; + XMVECTOR Rotation = XMQuaternionRotationMatrix(nM); + vOrientation = XMQuaternionMultiply(vOrientation, Rotation); + + // Transform the center. + vOrigin = XMVector3Transform(vOrigin, M); + + // Store the frustum. + XMStoreFloat3(&Out.Origin, vOrigin); + XMStoreFloat4(&Out.Orientation, vOrientation); + + // Scale the near and far distances (the slopes remain the same). + XMVECTOR dX = XMVector3Dot(M.r[0], M.r[0]); + XMVECTOR dY = XMVector3Dot(M.r[1], M.r[1]); + XMVECTOR dZ = XMVector3Dot(M.r[2], M.r[2]); + + XMVECTOR d = XMVectorMax(dX, XMVectorMax(dY, dZ)); + float Scale = sqrtf(XMVectorGetX(d)); + + Out.Near = Near * Scale; + Out.Far = Far * Scale; + + // Copy the slopes. + Out.RightSlope = RightSlope; + Out.LeftSlope = LeftSlope; + Out.TopSlope = TopSlope; + Out.BottomSlope = BottomSlope; +} + +_Use_decl_annotations_ +inline void XM_CALLCONV BoundingFrustum::Transform(BoundingFrustum& Out, float Scale, FXMVECTOR Rotation, FXMVECTOR Translation) const noexcept +{ + assert(DirectX::MathInternal::XMQuaternionIsUnit(Rotation)); + + // Load the frustum. + XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); + + // Composite the frustum rotation and the transform rotation. + vOrientation = XMQuaternionMultiply(vOrientation, Rotation); + + // Transform the origin. + vOrigin = XMVectorAdd(XMVector3Rotate(XMVectorScale(vOrigin, Scale), Rotation), Translation); + + // Store the frustum. + XMStoreFloat3(&Out.Origin, vOrigin); + XMStoreFloat4(&Out.Orientation, vOrientation); + + // Scale the near and far distances (the slopes remain the same). + Out.Near = Near * Scale; + Out.Far = Far * Scale; + + // Copy the slopes. + Out.RightSlope = RightSlope; + Out.LeftSlope = LeftSlope; + Out.TopSlope = TopSlope; + Out.BottomSlope = BottomSlope; +} + + +//----------------------------------------------------------------------------- +// Get the corner points of the frustum +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline void BoundingFrustum::GetCorners(XMFLOAT3* Corners) const noexcept +{ + assert(Corners != nullptr); + + // Load origin and orientation of the frustum. + XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); + + // Build the corners of the frustum. + XMVECTOR vRightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR vRightBottom = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR vLeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR vLeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR vNear = XMVectorReplicatePtr(&Near); + XMVECTOR vFar = XMVectorReplicatePtr(&Far); + + // Returns 8 corners position of bounding frustum. + // Near Far + // 0----1 4----5 + // | | | | + // | | | | + // 3----2 7----6 + + XMVECTOR vCorners[CORNER_COUNT]; + vCorners[0] = XMVectorMultiply(vLeftTop, vNear); + vCorners[1] = XMVectorMultiply(vRightTop, vNear); + vCorners[2] = XMVectorMultiply(vRightBottom, vNear); + vCorners[3] = XMVectorMultiply(vLeftBottom, vNear); + vCorners[4] = XMVectorMultiply(vLeftTop, vFar); + vCorners[5] = XMVectorMultiply(vRightTop, vFar); + vCorners[6] = XMVectorMultiply(vRightBottom, vFar); + vCorners[7] = XMVectorMultiply(vLeftBottom, vFar); + + for (size_t i = 0; i < CORNER_COUNT; ++i) + { + XMVECTOR C = XMVectorAdd(XMVector3Rotate(vCorners[i], vOrientation), vOrigin); + XMStoreFloat3(&Corners[i], C); + } +} + + +//----------------------------------------------------------------------------- +// Point in frustum test. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType XM_CALLCONV BoundingFrustum::Contains(FXMVECTOR Point) const noexcept +{ + // Build frustum planes. + XMVECTOR Planes[6]; + Planes[0] = XMVectorSet(0.0f, 0.0f, -1.0f, Near); + Planes[1] = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); + Planes[2] = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); + Planes[3] = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); + Planes[4] = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); + Planes[5] = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); + + // Load origin and orientation. + XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); + + // Transform point into local space of frustum. + XMVECTOR TPoint = XMVector3InverseRotate(XMVectorSubtract(Point, vOrigin), vOrientation); + + // Set w to one. + TPoint = XMVectorInsert<0, 0, 0, 0, 1>(TPoint, XMVectorSplatOne()); + + XMVECTOR Zero = XMVectorZero(); + XMVECTOR Outside = Zero; + + // Test point against each plane of the frustum. + for (size_t i = 0; i < 6; ++i) + { + XMVECTOR Dot = XMVector4Dot(TPoint, Planes[i]); + Outside = XMVectorOrInt(Outside, XMVectorGreater(Dot, Zero)); + } + + return XMVector4NotEqualInt(Outside, XMVectorTrueInt()) ? CONTAINS : DISJOINT; +} + + +//----------------------------------------------------------------------------- +// Triangle vs frustum test. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType XM_CALLCONV BoundingFrustum::Contains(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept +{ + // Load origin and orientation of the frustum. + XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + // Create 6 planes (do it inline to encourage use of registers) + XMVECTOR NearPlane = XMVectorSet(0.0f, 0.0f, -1.0f, Near); + NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); + NearPlane = XMPlaneNormalize(NearPlane); + + XMVECTOR FarPlane = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); + FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); + FarPlane = XMPlaneNormalize(FarPlane); + + XMVECTOR RightPlane = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); + RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); + RightPlane = XMPlaneNormalize(RightPlane); + + XMVECTOR LeftPlane = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); + LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); + LeftPlane = XMPlaneNormalize(LeftPlane); + + XMVECTOR TopPlane = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); + TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); + TopPlane = XMPlaneNormalize(TopPlane); + + XMVECTOR BottomPlane = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); + BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); + BottomPlane = XMPlaneNormalize(BottomPlane); + + return TriangleTests::ContainedBy(V0, V1, V2, NearPlane, FarPlane, RightPlane, LeftPlane, TopPlane, BottomPlane); +} + + +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType BoundingFrustum::Contains(const BoundingSphere& sh) const noexcept +{ + // Load origin and orientation of the frustum. + XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + // Create 6 planes (do it inline to encourage use of registers) + XMVECTOR NearPlane = XMVectorSet(0.0f, 0.0f, -1.0f, Near); + NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); + NearPlane = XMPlaneNormalize(NearPlane); + + XMVECTOR FarPlane = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); + FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); + FarPlane = XMPlaneNormalize(FarPlane); + + XMVECTOR RightPlane = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); + RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); + RightPlane = XMPlaneNormalize(RightPlane); + + XMVECTOR LeftPlane = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); + LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); + LeftPlane = XMPlaneNormalize(LeftPlane); + + XMVECTOR TopPlane = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); + TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); + TopPlane = XMPlaneNormalize(TopPlane); + + XMVECTOR BottomPlane = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); + BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); + BottomPlane = XMPlaneNormalize(BottomPlane); + + return sh.ContainedBy(NearPlane, FarPlane, RightPlane, LeftPlane, TopPlane, BottomPlane); +} + + +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType BoundingFrustum::Contains(const BoundingBox& box) const noexcept +{ + // Load origin and orientation of the frustum. + XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + // Create 6 planes (do it inline to encourage use of registers) + XMVECTOR NearPlane = XMVectorSet(0.0f, 0.0f, -1.0f, Near); + NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); + NearPlane = XMPlaneNormalize(NearPlane); + + XMVECTOR FarPlane = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); + FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); + FarPlane = XMPlaneNormalize(FarPlane); + + XMVECTOR RightPlane = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); + RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); + RightPlane = XMPlaneNormalize(RightPlane); + + XMVECTOR LeftPlane = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); + LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); + LeftPlane = XMPlaneNormalize(LeftPlane); + + XMVECTOR TopPlane = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); + TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); + TopPlane = XMPlaneNormalize(TopPlane); + + XMVECTOR BottomPlane = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); + BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); + BottomPlane = XMPlaneNormalize(BottomPlane); + + return box.ContainedBy(NearPlane, FarPlane, RightPlane, LeftPlane, TopPlane, BottomPlane); +} + + +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType BoundingFrustum::Contains(const BoundingOrientedBox& box) const noexcept +{ + // Load origin and orientation of the frustum. + XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + // Create 6 planes (do it inline to encourage use of registers) + XMVECTOR NearPlane = XMVectorSet(0.0f, 0.0f, -1.0f, Near); + NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); + NearPlane = XMPlaneNormalize(NearPlane); + + XMVECTOR FarPlane = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); + FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); + FarPlane = XMPlaneNormalize(FarPlane); + + XMVECTOR RightPlane = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); + RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); + RightPlane = XMPlaneNormalize(RightPlane); + + XMVECTOR LeftPlane = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); + LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); + LeftPlane = XMPlaneNormalize(LeftPlane); + + XMVECTOR TopPlane = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); + TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); + TopPlane = XMPlaneNormalize(TopPlane); + + XMVECTOR BottomPlane = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); + BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); + BottomPlane = XMPlaneNormalize(BottomPlane); + + return box.ContainedBy(NearPlane, FarPlane, RightPlane, LeftPlane, TopPlane, BottomPlane); +} + + +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType BoundingFrustum::Contains(const BoundingFrustum& fr) const noexcept +{ + // Load origin and orientation of the frustum. + XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + // Create 6 planes (do it inline to encourage use of registers) + XMVECTOR NearPlane = XMVectorSet(0.0f, 0.0f, -1.0f, Near); + NearPlane = DirectX::MathInternal::XMPlaneTransform(NearPlane, vOrientation, vOrigin); + NearPlane = XMPlaneNormalize(NearPlane); + + XMVECTOR FarPlane = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); + FarPlane = DirectX::MathInternal::XMPlaneTransform(FarPlane, vOrientation, vOrigin); + FarPlane = XMPlaneNormalize(FarPlane); + + XMVECTOR RightPlane = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); + RightPlane = DirectX::MathInternal::XMPlaneTransform(RightPlane, vOrientation, vOrigin); + RightPlane = XMPlaneNormalize(RightPlane); + + XMVECTOR LeftPlane = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); + LeftPlane = DirectX::MathInternal::XMPlaneTransform(LeftPlane, vOrientation, vOrigin); + LeftPlane = XMPlaneNormalize(LeftPlane); + + XMVECTOR TopPlane = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); + TopPlane = DirectX::MathInternal::XMPlaneTransform(TopPlane, vOrientation, vOrigin); + TopPlane = XMPlaneNormalize(TopPlane); + + XMVECTOR BottomPlane = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); + BottomPlane = DirectX::MathInternal::XMPlaneTransform(BottomPlane, vOrientation, vOrigin); + BottomPlane = XMPlaneNormalize(BottomPlane); + + return fr.ContainedBy(NearPlane, FarPlane, RightPlane, LeftPlane, TopPlane, BottomPlane); +} + + +//----------------------------------------------------------------------------- +// Exact sphere vs frustum test. The algorithm first checks the sphere against +// the planes of the frustum, then if the plane checks were indeterminate finds +// the nearest feature (plane, line, point) on the frustum to the center of the +// sphere and compares the distance to the nearest feature to the radius of the +// sphere +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool BoundingFrustum::Intersects(const BoundingSphere& sh) const noexcept +{ + XMVECTOR Zero = XMVectorZero(); + + // Build the frustum planes. + XMVECTOR Planes[6]; + Planes[0] = XMVectorSet(0.0f, 0.0f, -1.0f, Near); + Planes[1] = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); + Planes[2] = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); + Planes[3] = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); + Planes[4] = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); + Planes[5] = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); + + // Normalize the planes so we can compare to the sphere radius. + Planes[2] = XMVector3Normalize(Planes[2]); + Planes[3] = XMVector3Normalize(Planes[3]); + Planes[4] = XMVector3Normalize(Planes[4]); + Planes[5] = XMVector3Normalize(Planes[5]); + + // Load origin and orientation of the frustum. + XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); + + // Load the sphere. + XMVECTOR vCenter = XMLoadFloat3(&sh.Center); + XMVECTOR vRadius = XMVectorReplicatePtr(&sh.Radius); + + // Transform the center of the sphere into the local space of frustum. + vCenter = XMVector3InverseRotate(XMVectorSubtract(vCenter, vOrigin), vOrientation); + + // Set w of the center to one so we can dot4 with the plane. + vCenter = XMVectorInsert<0, 0, 0, 0, 1>(vCenter, XMVectorSplatOne()); + + // Check against each plane of the frustum. + XMVECTOR Outside = XMVectorFalseInt(); + XMVECTOR InsideAll = XMVectorTrueInt(); + XMVECTOR CenterInsideAll = XMVectorTrueInt(); + + XMVECTOR Dist[6]; + + for (size_t i = 0; i < 6; ++i) + { + Dist[i] = XMVector4Dot(vCenter, Planes[i]); + + // Outside the plane? + Outside = XMVectorOrInt(Outside, XMVectorGreater(Dist[i], vRadius)); + + // Fully inside the plane? + InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(Dist[i], XMVectorNegate(vRadius))); + + // Check if the center is inside the plane. + CenterInsideAll = XMVectorAndInt(CenterInsideAll, XMVectorLessOrEqual(Dist[i], Zero)); + } + + // If the sphere is outside any of the planes it is outside. + if (XMVector4EqualInt(Outside, XMVectorTrueInt())) + return false; + + // If the sphere is inside all planes it is fully inside. + if (XMVector4EqualInt(InsideAll, XMVectorTrueInt())) + return true; + + // If the center of the sphere is inside all planes and the sphere intersects + // one or more planes then it must intersect. + if (XMVector4EqualInt(CenterInsideAll, XMVectorTrueInt())) + return true; + + // The sphere may be outside the frustum or intersecting the frustum. + // Find the nearest feature (face, edge, or corner) on the frustum + // to the sphere. + + // The faces adjacent to each face are: + static const size_t adjacent_faces[6][4] = + { + { 2, 3, 4, 5 }, // 0 + { 2, 3, 4, 5 }, // 1 + { 0, 1, 4, 5 }, // 2 + { 0, 1, 4, 5 }, // 3 + { 0, 1, 2, 3 }, // 4 + { 0, 1, 2, 3 } + }; // 5 + + XMVECTOR Intersects = XMVectorFalseInt(); + + // Check to see if the nearest feature is one of the planes. + for (size_t i = 0; i < 6; ++i) + { + // Find the nearest point on the plane to the center of the sphere. + XMVECTOR Point = XMVectorNegativeMultiplySubtract(Planes[i], Dist[i], vCenter); + + // Set w of the point to one. + Point = XMVectorInsert<0, 0, 0, 0, 1>(Point, XMVectorSplatOne()); + + // If the point is inside the face (inside the adjacent planes) then + // this plane is the nearest feature. + XMVECTOR InsideFace = XMVectorTrueInt(); + + for (size_t j = 0; j < 4; j++) + { + size_t plane_index = adjacent_faces[i][j]; + + InsideFace = XMVectorAndInt(InsideFace, + XMVectorLessOrEqual(XMVector4Dot(Point, Planes[plane_index]), Zero)); + } + + // Since we have already checked distance from the plane we know that the + // sphere must intersect if this plane is the nearest feature. + Intersects = XMVectorOrInt(Intersects, + XMVectorAndInt(XMVectorGreater(Dist[i], Zero), InsideFace)); + } + + if (XMVector4EqualInt(Intersects, XMVectorTrueInt())) + return true; + + // Build the corners of the frustum. + XMVECTOR vRightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR vRightBottom = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR vLeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR vLeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR vNear = XMVectorReplicatePtr(&Near); + XMVECTOR vFar = XMVectorReplicatePtr(&Far); + + XMVECTOR Corners[CORNER_COUNT]; + Corners[0] = XMVectorMultiply(vRightTop, vNear); + Corners[1] = XMVectorMultiply(vRightBottom, vNear); + Corners[2] = XMVectorMultiply(vLeftTop, vNear); + Corners[3] = XMVectorMultiply(vLeftBottom, vNear); + Corners[4] = XMVectorMultiply(vRightTop, vFar); + Corners[5] = XMVectorMultiply(vRightBottom, vFar); + Corners[6] = XMVectorMultiply(vLeftTop, vFar); + Corners[7] = XMVectorMultiply(vLeftBottom, vFar); + + // The Edges are: + static const size_t edges[12][2] = + { + { 0, 1 }, { 2, 3 }, { 0, 2 }, { 1, 3 }, // Near plane + { 4, 5 }, { 6, 7 }, { 4, 6 }, { 5, 7 }, // Far plane + { 0, 4 }, { 1, 5 }, { 2, 6 }, { 3, 7 }, + }; // Near to far + + XMVECTOR RadiusSq = XMVectorMultiply(vRadius, vRadius); + + // Check to see if the nearest feature is one of the edges (or corners). + for (size_t i = 0; i < 12; ++i) + { + size_t ei0 = edges[i][0]; + size_t ei1 = edges[i][1]; + + // Find the nearest point on the edge to the center of the sphere. + // The corners of the frustum are included as the endpoints of the edges. + XMVECTOR Point = DirectX::MathInternal::PointOnLineSegmentNearestPoint(Corners[ei0], Corners[ei1], vCenter); + + XMVECTOR Delta = XMVectorSubtract(vCenter, Point); + + XMVECTOR DistSq = XMVector3Dot(Delta, Delta); + + // If the distance to the center of the sphere to the point is less than + // the radius of the sphere then it must intersect. + Intersects = XMVectorOrInt(Intersects, XMVectorLessOrEqual(DistSq, RadiusSq)); + } + + if (XMVector4EqualInt(Intersects, XMVectorTrueInt())) + return true; + + // The sphere must be outside the frustum. + return false; +} + + +//----------------------------------------------------------------------------- +// Exact axis aligned box vs frustum test. Constructs an oriented box and uses +// the oriented box vs frustum test. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool BoundingFrustum::Intersects(const BoundingBox& box) const noexcept +{ + // Make the axis aligned box oriented and do an OBB vs frustum test. + BoundingOrientedBox obox(box.Center, box.Extents, XMFLOAT4(0.f, 0.f, 0.f, 1.f)); + return Intersects(obox); +} + + +//----------------------------------------------------------------------------- +// Exact oriented box vs frustum test. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool BoundingFrustum::Intersects(const BoundingOrientedBox& box) const noexcept +{ + static const XMVECTORU32 SelectY = { { { XM_SELECT_0, XM_SELECT_1, XM_SELECT_0, XM_SELECT_0 } } }; + static const XMVECTORU32 SelectZ = { { { XM_SELECT_0, XM_SELECT_0, XM_SELECT_1, XM_SELECT_0 } } }; + + XMVECTOR Zero = XMVectorZero(); + + // Build the frustum planes. + XMVECTOR Planes[6]; + Planes[0] = XMVectorSet(0.0f, 0.0f, -1.0f, Near); + Planes[1] = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); + Planes[2] = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); + Planes[3] = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); + Planes[4] = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); + Planes[5] = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); + + // Load origin and orientation of the frustum. + XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR FrustumOrientation = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(FrustumOrientation)); + + // Load the box. + XMVECTOR Center = XMLoadFloat3(&box.Center); + XMVECTOR Extents = XMLoadFloat3(&box.Extents); + XMVECTOR BoxOrientation = XMLoadFloat4(&box.Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(BoxOrientation)); + + // Transform the oriented box into the space of the frustum in order to + // minimize the number of transforms we have to do. + Center = XMVector3InverseRotate(XMVectorSubtract(Center, vOrigin), FrustumOrientation); + BoxOrientation = XMQuaternionMultiply(BoxOrientation, XMQuaternionConjugate(FrustumOrientation)); + + // Set w of the center to one so we can dot4 with the plane. + Center = XMVectorInsert<0, 0, 0, 0, 1>(Center, XMVectorSplatOne()); + + // Build the 3x3 rotation matrix that defines the box axes. + XMMATRIX R = XMMatrixRotationQuaternion(BoxOrientation); + + // Check against each plane of the frustum. + XMVECTOR Outside = XMVectorFalseInt(); + XMVECTOR InsideAll = XMVectorTrueInt(); + XMVECTOR CenterInsideAll = XMVectorTrueInt(); + + for (size_t i = 0; i < 6; ++i) + { + // Compute the distance to the center of the box. + XMVECTOR Dist = XMVector4Dot(Center, Planes[i]); + + // Project the axes of the box onto the normal of the plane. Half the + // length of the projection (sometime called the "radius") is equal to + // h(u) * abs(n dot b(u))) + h(v) * abs(n dot b(v)) + h(w) * abs(n dot b(w)) + // where h(i) are extents of the box, n is the plane normal, and b(i) are the + // axes of the box. + XMVECTOR Radius = XMVector3Dot(Planes[i], R.r[0]); + Radius = XMVectorSelect(Radius, XMVector3Dot(Planes[i], R.r[1]), SelectY); + Radius = XMVectorSelect(Radius, XMVector3Dot(Planes[i], R.r[2]), SelectZ); + Radius = XMVector3Dot(Extents, XMVectorAbs(Radius)); + + // Outside the plane? + Outside = XMVectorOrInt(Outside, XMVectorGreater(Dist, Radius)); + + // Fully inside the plane? + InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(Dist, XMVectorNegate(Radius))); + + // Check if the center is inside the plane. + CenterInsideAll = XMVectorAndInt(CenterInsideAll, XMVectorLessOrEqual(Dist, Zero)); + } + + // If the box is outside any of the planes it is outside. + if (XMVector4EqualInt(Outside, XMVectorTrueInt())) + return false; + + // If the box is inside all planes it is fully inside. + if (XMVector4EqualInt(InsideAll, XMVectorTrueInt())) + return true; + + // If the center of the box is inside all planes and the box intersects + // one or more planes then it must intersect. + if (XMVector4EqualInt(CenterInsideAll, XMVectorTrueInt())) + return true; + + // Build the corners of the frustum. + XMVECTOR vRightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR vRightBottom = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR vLeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR vLeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR vNear = XMVectorReplicatePtr(&Near); + XMVECTOR vFar = XMVectorReplicatePtr(&Far); + + XMVECTOR Corners[CORNER_COUNT]; + Corners[0] = XMVectorMultiply(vRightTop, vNear); + Corners[1] = XMVectorMultiply(vRightBottom, vNear); + Corners[2] = XMVectorMultiply(vLeftTop, vNear); + Corners[3] = XMVectorMultiply(vLeftBottom, vNear); + Corners[4] = XMVectorMultiply(vRightTop, vFar); + Corners[5] = XMVectorMultiply(vRightBottom, vFar); + Corners[6] = XMVectorMultiply(vLeftTop, vFar); + Corners[7] = XMVectorMultiply(vLeftBottom, vFar); + + // Test against box axes (3) + { + // Find the min/max values of the projection of the frustum onto each axis. + XMVECTOR FrustumMin, FrustumMax; + + FrustumMin = XMVector3Dot(Corners[0], R.r[0]); + FrustumMin = XMVectorSelect(FrustumMin, XMVector3Dot(Corners[0], R.r[1]), SelectY); + FrustumMin = XMVectorSelect(FrustumMin, XMVector3Dot(Corners[0], R.r[2]), SelectZ); + FrustumMax = FrustumMin; + + for (size_t i = 1; i < BoundingOrientedBox::CORNER_COUNT; ++i) + { + XMVECTOR Temp = XMVector3Dot(Corners[i], R.r[0]); + Temp = XMVectorSelect(Temp, XMVector3Dot(Corners[i], R.r[1]), SelectY); + Temp = XMVectorSelect(Temp, XMVector3Dot(Corners[i], R.r[2]), SelectZ); + + FrustumMin = XMVectorMin(FrustumMin, Temp); + FrustumMax = XMVectorMax(FrustumMax, Temp); + } + + // Project the center of the box onto the axes. + XMVECTOR BoxDist = XMVector3Dot(Center, R.r[0]); + BoxDist = XMVectorSelect(BoxDist, XMVector3Dot(Center, R.r[1]), SelectY); + BoxDist = XMVectorSelect(BoxDist, XMVector3Dot(Center, R.r[2]), SelectZ); + + // The projection of the box onto the axis is just its Center and Extents. + // if (min > box_max || max < box_min) reject; + XMVECTOR Result = XMVectorOrInt(XMVectorGreater(FrustumMin, XMVectorAdd(BoxDist, Extents)), + XMVectorLess(FrustumMax, XMVectorSubtract(BoxDist, Extents))); + + if (DirectX::MathInternal::XMVector3AnyTrue(Result)) + return false; + } + + // Test against edge/edge axes (3*6). + XMVECTOR FrustumEdgeAxis[6]; + + FrustumEdgeAxis[0] = vRightTop; + FrustumEdgeAxis[1] = vRightBottom; + FrustumEdgeAxis[2] = vLeftTop; + FrustumEdgeAxis[3] = vLeftBottom; + FrustumEdgeAxis[4] = XMVectorSubtract(vRightTop, vLeftTop); + FrustumEdgeAxis[5] = XMVectorSubtract(vLeftBottom, vLeftTop); + + for (size_t i = 0; i < 3; ++i) + { + for (size_t j = 0; j < 6; j++) + { + // Compute the axis we are going to test. + XMVECTOR Axis = XMVector3Cross(R.r[i], FrustumEdgeAxis[j]); + + // Find the min/max values of the projection of the frustum onto the axis. + XMVECTOR FrustumMin, FrustumMax; + + FrustumMin = FrustumMax = XMVector3Dot(Axis, Corners[0]); + + for (size_t k = 1; k < CORNER_COUNT; k++) + { + XMVECTOR Temp = XMVector3Dot(Axis, Corners[k]); + FrustumMin = XMVectorMin(FrustumMin, Temp); + FrustumMax = XMVectorMax(FrustumMax, Temp); + } + + // Project the center of the box onto the axis. + XMVECTOR Dist = XMVector3Dot(Center, Axis); + + // Project the axes of the box onto the axis to find the "radius" of the box. + XMVECTOR Radius = XMVector3Dot(Axis, R.r[0]); + Radius = XMVectorSelect(Radius, XMVector3Dot(Axis, R.r[1]), SelectY); + Radius = XMVectorSelect(Radius, XMVector3Dot(Axis, R.r[2]), SelectZ); + Radius = XMVector3Dot(Extents, XMVectorAbs(Radius)); + + // if (center > max + radius || center < min - radius) reject; + Outside = XMVectorOrInt(Outside, XMVectorGreater(Dist, XMVectorAdd(FrustumMax, Radius))); + Outside = XMVectorOrInt(Outside, XMVectorLess(Dist, XMVectorSubtract(FrustumMin, Radius))); + } + } + + if (XMVector4EqualInt(Outside, XMVectorTrueInt())) + return false; + + // If we did not find a separating plane then the box must intersect the frustum. + return true; +} + + +//----------------------------------------------------------------------------- +// Exact frustum vs frustum test. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool BoundingFrustum::Intersects(const BoundingFrustum& fr) const noexcept +{ + // Load origin and orientation of frustum B. + XMVECTOR OriginB = XMLoadFloat3(&Origin); + XMVECTOR OrientationB = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(OrientationB)); + + // Build the planes of frustum B. + XMVECTOR AxisB[6]; + AxisB[0] = XMVectorSet(0.0f, 0.0f, -1.0f, 0.0f); + AxisB[1] = XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f); + AxisB[2] = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); + AxisB[3] = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); + AxisB[4] = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); + AxisB[5] = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); + + XMVECTOR PlaneDistB[6]; + PlaneDistB[0] = XMVectorNegate(XMVectorReplicatePtr(&Near)); + PlaneDistB[1] = XMVectorReplicatePtr(&Far); + PlaneDistB[2] = XMVectorZero(); + PlaneDistB[3] = XMVectorZero(); + PlaneDistB[4] = XMVectorZero(); + PlaneDistB[5] = XMVectorZero(); + + // Load origin and orientation of frustum A. + XMVECTOR OriginA = XMLoadFloat3(&fr.Origin); + XMVECTOR OrientationA = XMLoadFloat4(&fr.Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(OrientationA)); + + // Transform frustum A into the space of the frustum B in order to + // minimize the number of transforms we have to do. + OriginA = XMVector3InverseRotate(XMVectorSubtract(OriginA, OriginB), OrientationB); + OrientationA = XMQuaternionMultiply(OrientationA, XMQuaternionConjugate(OrientationB)); + + // Build the corners of frustum A (in the local space of B). + XMVECTOR RightTopA = XMVectorSet(fr.RightSlope, fr.TopSlope, 1.0f, 0.0f); + XMVECTOR RightBottomA = XMVectorSet(fr.RightSlope, fr.BottomSlope, 1.0f, 0.0f); + XMVECTOR LeftTopA = XMVectorSet(fr.LeftSlope, fr.TopSlope, 1.0f, 0.0f); + XMVECTOR LeftBottomA = XMVectorSet(fr.LeftSlope, fr.BottomSlope, 1.0f, 0.0f); + XMVECTOR NearA = XMVectorReplicatePtr(&fr.Near); + XMVECTOR FarA = XMVectorReplicatePtr(&fr.Far); + + RightTopA = XMVector3Rotate(RightTopA, OrientationA); + RightBottomA = XMVector3Rotate(RightBottomA, OrientationA); + LeftTopA = XMVector3Rotate(LeftTopA, OrientationA); + LeftBottomA = XMVector3Rotate(LeftBottomA, OrientationA); + + XMVECTOR CornersA[CORNER_COUNT]; + CornersA[0] = XMVectorMultiplyAdd(RightTopA, NearA, OriginA); + CornersA[1] = XMVectorMultiplyAdd(RightBottomA, NearA, OriginA); + CornersA[2] = XMVectorMultiplyAdd(LeftTopA, NearA, OriginA); + CornersA[3] = XMVectorMultiplyAdd(LeftBottomA, NearA, OriginA); + CornersA[4] = XMVectorMultiplyAdd(RightTopA, FarA, OriginA); + CornersA[5] = XMVectorMultiplyAdd(RightBottomA, FarA, OriginA); + CornersA[6] = XMVectorMultiplyAdd(LeftTopA, FarA, OriginA); + CornersA[7] = XMVectorMultiplyAdd(LeftBottomA, FarA, OriginA); + + // Check frustum A against each plane of frustum B. + XMVECTOR Outside = XMVectorFalseInt(); + XMVECTOR InsideAll = XMVectorTrueInt(); + + for (size_t i = 0; i < 6; ++i) + { + // Find the min/max projection of the frustum onto the plane normal. + XMVECTOR Min, Max; + + Min = Max = XMVector3Dot(AxisB[i], CornersA[0]); + + for (size_t j = 1; j < CORNER_COUNT; j++) + { + XMVECTOR Temp = XMVector3Dot(AxisB[i], CornersA[j]); + Min = XMVectorMin(Min, Temp); + Max = XMVectorMax(Max, Temp); + } + + // Outside the plane? + Outside = XMVectorOrInt(Outside, XMVectorGreater(Min, PlaneDistB[i])); + + // Fully inside the plane? + InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(Max, PlaneDistB[i])); + } + + // If the frustum A is outside any of the planes of frustum B it is outside. + if (XMVector4EqualInt(Outside, XMVectorTrueInt())) + return false; + + // If frustum A is inside all planes of frustum B it is fully inside. + if (XMVector4EqualInt(InsideAll, XMVectorTrueInt())) + return true; + + // Build the corners of frustum B. + XMVECTOR RightTopB = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR RightBottomB = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR LeftTopB = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR LeftBottomB = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR NearB = XMVectorReplicatePtr(&Near); + XMVECTOR FarB = XMVectorReplicatePtr(&Far); + + XMVECTOR CornersB[BoundingFrustum::CORNER_COUNT]; + CornersB[0] = XMVectorMultiply(RightTopB, NearB); + CornersB[1] = XMVectorMultiply(RightBottomB, NearB); + CornersB[2] = XMVectorMultiply(LeftTopB, NearB); + CornersB[3] = XMVectorMultiply(LeftBottomB, NearB); + CornersB[4] = XMVectorMultiply(RightTopB, FarB); + CornersB[5] = XMVectorMultiply(RightBottomB, FarB); + CornersB[6] = XMVectorMultiply(LeftTopB, FarB); + CornersB[7] = XMVectorMultiply(LeftBottomB, FarB); + + // Build the planes of frustum A (in the local space of B). + XMVECTOR AxisA[6]; + XMVECTOR PlaneDistA[6]; + + AxisA[0] = XMVectorSet(0.0f, 0.0f, -1.0f, 0.0f); + AxisA[1] = XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f); + AxisA[2] = XMVectorSet(1.0f, 0.0f, -fr.RightSlope, 0.0f); + AxisA[3] = XMVectorSet(-1.0f, 0.0f, fr.LeftSlope, 0.0f); + AxisA[4] = XMVectorSet(0.0f, 1.0f, -fr.TopSlope, 0.0f); + AxisA[5] = XMVectorSet(0.0f, -1.0f, fr.BottomSlope, 0.0f); + + AxisA[0] = XMVector3Rotate(AxisA[0], OrientationA); + AxisA[1] = XMVectorNegate(AxisA[0]); + AxisA[2] = XMVector3Rotate(AxisA[2], OrientationA); + AxisA[3] = XMVector3Rotate(AxisA[3], OrientationA); + AxisA[4] = XMVector3Rotate(AxisA[4], OrientationA); + AxisA[5] = XMVector3Rotate(AxisA[5], OrientationA); + + PlaneDistA[0] = XMVector3Dot(AxisA[0], CornersA[0]); // Re-use corner on near plane. + PlaneDistA[1] = XMVector3Dot(AxisA[1], CornersA[4]); // Re-use corner on far plane. + PlaneDistA[2] = XMVector3Dot(AxisA[2], OriginA); + PlaneDistA[3] = XMVector3Dot(AxisA[3], OriginA); + PlaneDistA[4] = XMVector3Dot(AxisA[4], OriginA); + PlaneDistA[5] = XMVector3Dot(AxisA[5], OriginA); + + // Check each axis of frustum A for a seperating plane (5). + for (size_t i = 0; i < 6; ++i) + { + // Find the minimum projection of the frustum onto the plane normal. + XMVECTOR Min; + + Min = XMVector3Dot(AxisA[i], CornersB[0]); + + for (size_t j = 1; j < CORNER_COUNT; j++) + { + XMVECTOR Temp = XMVector3Dot(AxisA[i], CornersB[j]); + Min = XMVectorMin(Min, Temp); + } + + // Outside the plane? + Outside = XMVectorOrInt(Outside, XMVectorGreater(Min, PlaneDistA[i])); + } + + // If the frustum B is outside any of the planes of frustum A it is outside. + if (XMVector4EqualInt(Outside, XMVectorTrueInt())) + return false; + + // Check edge/edge axes (6 * 6). + XMVECTOR FrustumEdgeAxisA[6]; + FrustumEdgeAxisA[0] = RightTopA; + FrustumEdgeAxisA[1] = RightBottomA; + FrustumEdgeAxisA[2] = LeftTopA; + FrustumEdgeAxisA[3] = LeftBottomA; + FrustumEdgeAxisA[4] = XMVectorSubtract(RightTopA, LeftTopA); + FrustumEdgeAxisA[5] = XMVectorSubtract(LeftBottomA, LeftTopA); + + XMVECTOR FrustumEdgeAxisB[6]; + FrustumEdgeAxisB[0] = RightTopB; + FrustumEdgeAxisB[1] = RightBottomB; + FrustumEdgeAxisB[2] = LeftTopB; + FrustumEdgeAxisB[3] = LeftBottomB; + FrustumEdgeAxisB[4] = XMVectorSubtract(RightTopB, LeftTopB); + FrustumEdgeAxisB[5] = XMVectorSubtract(LeftBottomB, LeftTopB); + + for (size_t i = 0; i < 6; ++i) + { + for (size_t j = 0; j < 6; j++) + { + // Compute the axis we are going to test. + XMVECTOR Axis = XMVector3Cross(FrustumEdgeAxisA[i], FrustumEdgeAxisB[j]); + + // Find the min/max values of the projection of both frustums onto the axis. + XMVECTOR MinA, MaxA; + XMVECTOR MinB, MaxB; + + MinA = MaxA = XMVector3Dot(Axis, CornersA[0]); + MinB = MaxB = XMVector3Dot(Axis, CornersB[0]); + + for (size_t k = 1; k < CORNER_COUNT; k++) + { + XMVECTOR TempA = XMVector3Dot(Axis, CornersA[k]); + MinA = XMVectorMin(MinA, TempA); + MaxA = XMVectorMax(MaxA, TempA); + + XMVECTOR TempB = XMVector3Dot(Axis, CornersB[k]); + MinB = XMVectorMin(MinB, TempB); + MaxB = XMVectorMax(MaxB, TempB); + } + + // if (MinA > MaxB || MinB > MaxA) reject + Outside = XMVectorOrInt(Outside, XMVectorGreater(MinA, MaxB)); + Outside = XMVectorOrInt(Outside, XMVectorGreater(MinB, MaxA)); + } + } + + // If there is a seperating plane, then the frustums do not intersect. + if (XMVector4EqualInt(Outside, XMVectorTrueInt())) + return false; + + // If we did not find a separating plane then the frustums intersect. + return true; +} + + +//----------------------------------------------------------------------------- +// Triangle vs frustum test. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2) const noexcept +{ + // Build the frustum planes (NOTE: D is negated from the usual). + XMVECTOR Planes[6]; + Planes[0] = XMVectorSet(0.0f, 0.0f, -1.0f, -Near); + Planes[1] = XMVectorSet(0.0f, 0.0f, 1.0f, Far); + Planes[2] = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); + Planes[3] = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); + Planes[4] = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); + Planes[5] = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); + + // Load origin and orientation of the frustum. + XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); + + // Transform triangle into the local space of frustum. + XMVECTOR TV0 = XMVector3InverseRotate(XMVectorSubtract(V0, vOrigin), vOrientation); + XMVECTOR TV1 = XMVector3InverseRotate(XMVectorSubtract(V1, vOrigin), vOrientation); + XMVECTOR TV2 = XMVector3InverseRotate(XMVectorSubtract(V2, vOrigin), vOrientation); + + // Test each vertex of the triangle against the frustum planes. + XMVECTOR Outside = XMVectorFalseInt(); + XMVECTOR InsideAll = XMVectorTrueInt(); + + for (size_t i = 0; i < 6; ++i) + { + XMVECTOR Dist0 = XMVector3Dot(TV0, Planes[i]); + XMVECTOR Dist1 = XMVector3Dot(TV1, Planes[i]); + XMVECTOR Dist2 = XMVector3Dot(TV2, Planes[i]); + + XMVECTOR MinDist = XMVectorMin(Dist0, Dist1); + MinDist = XMVectorMin(MinDist, Dist2); + XMVECTOR MaxDist = XMVectorMax(Dist0, Dist1); + MaxDist = XMVectorMax(MaxDist, Dist2); + + XMVECTOR PlaneDist = XMVectorSplatW(Planes[i]); + + // Outside the plane? + Outside = XMVectorOrInt(Outside, XMVectorGreater(MinDist, PlaneDist)); + + // Fully inside the plane? + InsideAll = XMVectorAndInt(InsideAll, XMVectorLessOrEqual(MaxDist, PlaneDist)); + } + + // If the triangle is outside any of the planes it is outside. + if (XMVector4EqualInt(Outside, XMVectorTrueInt())) + return false; + + // If the triangle is inside all planes it is fully inside. + if (XMVector4EqualInt(InsideAll, XMVectorTrueInt())) + return true; + + // Build the corners of the frustum. + XMVECTOR vRightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR vRightBottom = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR vLeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR vLeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR vNear = XMVectorReplicatePtr(&Near); + XMVECTOR vFar = XMVectorReplicatePtr(&Far); + + XMVECTOR Corners[CORNER_COUNT]; + Corners[0] = XMVectorMultiply(vRightTop, vNear); + Corners[1] = XMVectorMultiply(vRightBottom, vNear); + Corners[2] = XMVectorMultiply(vLeftTop, vNear); + Corners[3] = XMVectorMultiply(vLeftBottom, vNear); + Corners[4] = XMVectorMultiply(vRightTop, vFar); + Corners[5] = XMVectorMultiply(vRightBottom, vFar); + Corners[6] = XMVectorMultiply(vLeftTop, vFar); + Corners[7] = XMVectorMultiply(vLeftBottom, vFar); + + // Test the plane of the triangle. + XMVECTOR Normal = XMVector3Cross(XMVectorSubtract(V1, V0), XMVectorSubtract(V2, V0)); + XMVECTOR Dist = XMVector3Dot(Normal, V0); + + XMVECTOR MinDist, MaxDist; + MinDist = MaxDist = XMVector3Dot(Corners[0], Normal); + for (size_t i = 1; i < CORNER_COUNT; ++i) + { + XMVECTOR Temp = XMVector3Dot(Corners[i], Normal); + MinDist = XMVectorMin(MinDist, Temp); + MaxDist = XMVectorMax(MaxDist, Temp); + } + + Outside = XMVectorOrInt(XMVectorGreater(MinDist, Dist), XMVectorLess(MaxDist, Dist)); + if (XMVector4EqualInt(Outside, XMVectorTrueInt())) + return false; + + // Check the edge/edge axes (3*6). + XMVECTOR TriangleEdgeAxis[3]; + TriangleEdgeAxis[0] = XMVectorSubtract(V1, V0); + TriangleEdgeAxis[1] = XMVectorSubtract(V2, V1); + TriangleEdgeAxis[2] = XMVectorSubtract(V0, V2); + + XMVECTOR FrustumEdgeAxis[6]; + FrustumEdgeAxis[0] = vRightTop; + FrustumEdgeAxis[1] = vRightBottom; + FrustumEdgeAxis[2] = vLeftTop; + FrustumEdgeAxis[3] = vLeftBottom; + FrustumEdgeAxis[4] = XMVectorSubtract(vRightTop, vLeftTop); + FrustumEdgeAxis[5] = XMVectorSubtract(vLeftBottom, vLeftTop); + + for (size_t i = 0; i < 3; ++i) + { + for (size_t j = 0; j < 6; j++) + { + // Compute the axis we are going to test. + XMVECTOR Axis = XMVector3Cross(TriangleEdgeAxis[i], FrustumEdgeAxis[j]); + + // Find the min/max of the projection of the triangle onto the axis. + XMVECTOR MinA, MaxA; + + XMVECTOR Dist0 = XMVector3Dot(V0, Axis); + XMVECTOR Dist1 = XMVector3Dot(V1, Axis); + XMVECTOR Dist2 = XMVector3Dot(V2, Axis); + + MinA = XMVectorMin(Dist0, Dist1); + MinA = XMVectorMin(MinA, Dist2); + MaxA = XMVectorMax(Dist0, Dist1); + MaxA = XMVectorMax(MaxA, Dist2); + + // Find the min/max of the projection of the frustum onto the axis. + XMVECTOR MinB, MaxB; + + MinB = MaxB = XMVector3Dot(Axis, Corners[0]); + + for (size_t k = 1; k < CORNER_COUNT; k++) + { + XMVECTOR Temp = XMVector3Dot(Axis, Corners[k]); + MinB = XMVectorMin(MinB, Temp); + MaxB = XMVectorMax(MaxB, Temp); + } + + // if (MinA > MaxB || MinB > MaxA) reject; + Outside = XMVectorOrInt(Outside, XMVectorGreater(MinA, MaxB)); + Outside = XMVectorOrInt(Outside, XMVectorGreater(MinB, MaxA)); + } + } + + if (XMVector4EqualInt(Outside, XMVectorTrueInt())) + return false; + + // If we did not find a separating plane then the triangle must intersect the frustum. + return true; +} + + +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline PlaneIntersectionType XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR Plane) const noexcept +{ + assert(DirectX::MathInternal::XMPlaneIsUnit(Plane)); + + // Load origin and orientation of the frustum. + XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); + + // Set w of the origin to one so we can dot4 with a plane. + vOrigin = XMVectorInsert<0, 0, 0, 0, 1>(vOrigin, XMVectorSplatOne()); + + // Build the corners of the frustum (in world space). + XMVECTOR RightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR RightBottom = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR LeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR LeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR vNear = XMVectorReplicatePtr(&Near); + XMVECTOR vFar = XMVectorReplicatePtr(&Far); + + RightTop = XMVector3Rotate(RightTop, vOrientation); + RightBottom = XMVector3Rotate(RightBottom, vOrientation); + LeftTop = XMVector3Rotate(LeftTop, vOrientation); + LeftBottom = XMVector3Rotate(LeftBottom, vOrientation); + + XMVECTOR Corners0 = XMVectorMultiplyAdd(RightTop, vNear, vOrigin); + XMVECTOR Corners1 = XMVectorMultiplyAdd(RightBottom, vNear, vOrigin); + XMVECTOR Corners2 = XMVectorMultiplyAdd(LeftTop, vNear, vOrigin); + XMVECTOR Corners3 = XMVectorMultiplyAdd(LeftBottom, vNear, vOrigin); + XMVECTOR Corners4 = XMVectorMultiplyAdd(RightTop, vFar, vOrigin); + XMVECTOR Corners5 = XMVectorMultiplyAdd(RightBottom, vFar, vOrigin); + XMVECTOR Corners6 = XMVectorMultiplyAdd(LeftTop, vFar, vOrigin); + XMVECTOR Corners7 = XMVectorMultiplyAdd(LeftBottom, vFar, vOrigin); + + XMVECTOR Outside, Inside; + DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, + Corners4, Corners5, Corners6, Corners7, + Plane, Outside, Inside); + + // If the frustum is outside any plane it is outside. + if (XMVector4EqualInt(Outside, XMVectorTrueInt())) + return FRONT; + + // If the frustum is inside all planes it is inside. + if (XMVector4EqualInt(Inside, XMVectorTrueInt())) + return BACK; + + // The frustum is not inside all planes or outside a plane it intersects. + return INTERSECTING; +} + + +//----------------------------------------------------------------------------- +// Ray vs. frustum test +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline bool XM_CALLCONV BoundingFrustum::Intersects(FXMVECTOR rayOrigin, FXMVECTOR Direction, float& Dist) const noexcept +{ + // If ray starts inside the frustum, return a distance of 0 for the hit + if (Contains(rayOrigin) == CONTAINS) + { + Dist = 0.0f; + return true; + } + + // Build the frustum planes. + XMVECTOR Planes[6]; + Planes[0] = XMVectorSet(0.0f, 0.0f, -1.0f, Near); + Planes[1] = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); + Planes[2] = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); + Planes[3] = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); + Planes[4] = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); + Planes[5] = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); + + // Load origin and orientation of the frustum. + XMVECTOR frOrigin = XMLoadFloat3(&Origin); + XMVECTOR frOrientation = XMLoadFloat4(&Orientation); + + // This algorithm based on "Fast Ray-Convex Polyhedron Intersectin," in James Arvo, ed., Graphics Gems II pp. 247-250 + float tnear = -FLT_MAX; + float tfar = FLT_MAX; + + for (size_t i = 0; i < 6; ++i) + { + XMVECTOR Plane = DirectX::MathInternal::XMPlaneTransform(Planes[i], frOrientation, frOrigin); + Plane = XMPlaneNormalize(Plane); + + XMVECTOR AxisDotOrigin = XMPlaneDotCoord(Plane, rayOrigin); + XMVECTOR AxisDotDirection = XMVector3Dot(Plane, Direction); + + if (XMVector3LessOrEqual(XMVectorAbs(AxisDotDirection), g_RayEpsilon)) + { + // Ray is parallel to plane - check if ray origin is inside plane's + if (XMVector3Greater(AxisDotOrigin, g_XMZero)) + { + // Ray origin is outside half-space. + Dist = 0.f; + return false; + } + } + else + { + // Ray not parallel - get distance to plane. + float vd = XMVectorGetX(AxisDotDirection); + float vn = XMVectorGetX(AxisDotOrigin); + float t = -vn / vd; + if (vd < 0.0f) + { + // Front face - T is a near point. + if (t > tfar) + { + Dist = 0.f; + return false; + } + if (t > tnear) + { + // Hit near face. + tnear = t; + } + } + else + { + // back face - T is far point. + if (t < tnear) + { + Dist = 0.f; + return false; + } + if (t < tfar) + { + // Hit far face. + tfar = t; + } + } + } + } + + // Survived all tests. + // Note: if ray originates on polyhedron, may want to change 0.0f to some + // epsilon to avoid intersecting the originating face. + float distance = (tnear >= 0.0f) ? tnear : tfar; + if (distance >= 0.0f) + { + Dist = distance; + return true; + } + + Dist = 0.f; + return false; +} + + +//----------------------------------------------------------------------------- +// Test a frustum vs 6 planes (typically forming another frustum). +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline ContainmentType XM_CALLCONV BoundingFrustum::ContainedBy( + FXMVECTOR Plane0, FXMVECTOR Plane1, FXMVECTOR Plane2, + GXMVECTOR Plane3, + HXMVECTOR Plane4, HXMVECTOR Plane5) const noexcept +{ + // Load origin and orientation of the frustum. + XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + assert(DirectX::MathInternal::XMQuaternionIsUnit(vOrientation)); + + // Set w of the origin to one so we can dot4 with a plane. + vOrigin = XMVectorInsert<0, 0, 0, 0, 1>(vOrigin, XMVectorSplatOne()); + + // Build the corners of the frustum (in world space). + XMVECTOR RightTop = XMVectorSet(RightSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR RightBottom = XMVectorSet(RightSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR LeftTop = XMVectorSet(LeftSlope, TopSlope, 1.0f, 0.0f); + XMVECTOR LeftBottom = XMVectorSet(LeftSlope, BottomSlope, 1.0f, 0.0f); + XMVECTOR vNear = XMVectorReplicatePtr(&Near); + XMVECTOR vFar = XMVectorReplicatePtr(&Far); + + RightTop = XMVector3Rotate(RightTop, vOrientation); + RightBottom = XMVector3Rotate(RightBottom, vOrientation); + LeftTop = XMVector3Rotate(LeftTop, vOrientation); + LeftBottom = XMVector3Rotate(LeftBottom, vOrientation); + + XMVECTOR Corners0 = XMVectorMultiplyAdd(RightTop, vNear, vOrigin); + XMVECTOR Corners1 = XMVectorMultiplyAdd(RightBottom, vNear, vOrigin); + XMVECTOR Corners2 = XMVectorMultiplyAdd(LeftTop, vNear, vOrigin); + XMVECTOR Corners3 = XMVectorMultiplyAdd(LeftBottom, vNear, vOrigin); + XMVECTOR Corners4 = XMVectorMultiplyAdd(RightTop, vFar, vOrigin); + XMVECTOR Corners5 = XMVectorMultiplyAdd(RightBottom, vFar, vOrigin); + XMVECTOR Corners6 = XMVectorMultiplyAdd(LeftTop, vFar, vOrigin); + XMVECTOR Corners7 = XMVectorMultiplyAdd(LeftBottom, vFar, vOrigin); + + XMVECTOR Outside, Inside; + + // Test against each plane. + DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, + Corners4, Corners5, Corners6, Corners7, + Plane0, Outside, Inside); + + XMVECTOR AnyOutside = Outside; + XMVECTOR AllInside = Inside; + + DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, + Corners4, Corners5, Corners6, Corners7, + Plane1, Outside, Inside); + + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, + Corners4, Corners5, Corners6, Corners7, + Plane2, Outside, Inside); + + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, + Corners4, Corners5, Corners6, Corners7, + Plane3, Outside, Inside); + + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, + Corners4, Corners5, Corners6, Corners7, + Plane4, Outside, Inside); + + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectFrustumPlane(Corners0, Corners1, Corners2, Corners3, + Corners4, Corners5, Corners6, Corners7, + Plane5, Outside, Inside); + + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + // If the frustum is outside any plane it is outside. + if (XMVector4EqualInt(AnyOutside, XMVectorTrueInt())) + return DISJOINT; + + // If the frustum is inside all planes it is inside. + if (XMVector4EqualInt(AllInside, XMVectorTrueInt())) + return CONTAINS; + + // The frustum is not inside all planes or outside a plane, it may intersect. + return INTERSECTS; +} + + +//----------------------------------------------------------------------------- +// Build the 6 frustum planes from a frustum. +// +// The intended use for these routines is for fast culling to a view frustum. +// When the volume being tested against a view frustum is small relative to the +// view frustum it is usually either inside all six planes of the frustum +// (CONTAINS) or outside one of the planes of the frustum (DISJOINT). If neither +// of these cases is true then it may or may not be intersecting the frustum +// (INTERSECTS) +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline void BoundingFrustum::GetPlanes(XMVECTOR* NearPlane, XMVECTOR* FarPlane, XMVECTOR* RightPlane, + XMVECTOR* LeftPlane, XMVECTOR* TopPlane, XMVECTOR* BottomPlane) const noexcept +{ + // Load origin and orientation of the frustum. + XMVECTOR vOrigin = XMLoadFloat3(&Origin); + XMVECTOR vOrientation = XMLoadFloat4(&Orientation); + + if (NearPlane) + { + XMVECTOR vNearPlane = XMVectorSet(0.0f, 0.0f, -1.0f, Near); + vNearPlane = DirectX::MathInternal::XMPlaneTransform(vNearPlane, vOrientation, vOrigin); + *NearPlane = XMPlaneNormalize(vNearPlane); + } + + if (FarPlane) + { + XMVECTOR vFarPlane = XMVectorSet(0.0f, 0.0f, 1.0f, -Far); + vFarPlane = DirectX::MathInternal::XMPlaneTransform(vFarPlane, vOrientation, vOrigin); + *FarPlane = XMPlaneNormalize(vFarPlane); + } + + if (RightPlane) + { + XMVECTOR vRightPlane = XMVectorSet(1.0f, 0.0f, -RightSlope, 0.0f); + vRightPlane = DirectX::MathInternal::XMPlaneTransform(vRightPlane, vOrientation, vOrigin); + *RightPlane = XMPlaneNormalize(vRightPlane); + } + + if (LeftPlane) + { + XMVECTOR vLeftPlane = XMVectorSet(-1.0f, 0.0f, LeftSlope, 0.0f); + vLeftPlane = DirectX::MathInternal::XMPlaneTransform(vLeftPlane, vOrientation, vOrigin); + *LeftPlane = XMPlaneNormalize(vLeftPlane); + } + + if (TopPlane) + { + XMVECTOR vTopPlane = XMVectorSet(0.0f, 1.0f, -TopSlope, 0.0f); + vTopPlane = DirectX::MathInternal::XMPlaneTransform(vTopPlane, vOrientation, vOrigin); + *TopPlane = XMPlaneNormalize(vTopPlane); + } + + if (BottomPlane) + { + XMVECTOR vBottomPlane = XMVectorSet(0.0f, -1.0f, BottomSlope, 0.0f); + vBottomPlane = DirectX::MathInternal::XMPlaneTransform(vBottomPlane, vOrientation, vOrigin); + *BottomPlane = XMPlaneNormalize(vBottomPlane); + } +} + + +//----------------------------------------------------------------------------- +// Build a frustum from a persepective projection matrix. The matrix may only +// contain a projection; any rotation, translation or scale will cause the +// constructed frustum to be incorrect. +//----------------------------------------------------------------------------- +_Use_decl_annotations_ +inline void XM_CALLCONV BoundingFrustum::CreateFromMatrix(BoundingFrustum& Out, FXMMATRIX Projection, bool rhcoords) noexcept +{ + // Corners of the projection frustum in NDC space. + static XMVECTORF32 NDCPoints[6] = + { + { { { 1.0f, 0.0f, 1.0f, 1.0f } } }, // right (at far plane) + { { { -1.0f, 0.0f, 1.0f, 1.0f } } }, // left + { { { 0.0f, 1.0f, 1.0f, 1.0f } } }, // top + { { { 0.0f, -1.0f, 1.0f, 1.0f } } }, // bottom + + { { { 0.0f, 0.0f, 0.0f, 1.0f } } }, // near + { { { 0.0f, 0.0f, 1.0f, 1.0f } } } // far + }; + + XMVECTOR Determinant; + XMMATRIX matInverse = XMMatrixInverse(&Determinant, Projection); + + // Compute the frustum corners in world space. + XMVECTOR Points[6]; + + for (size_t i = 0; i < 6; ++i) + { + // Transform point. + Points[i] = XMVector4Transform(NDCPoints[i], matInverse); + } + + Out.Origin = XMFLOAT3(0.0f, 0.0f, 0.0f); + Out.Orientation = XMFLOAT4(0.0f, 0.0f, 0.0f, 1.0f); + + // Compute the slopes. + Points[0] = XMVectorMultiply(Points[0], XMVectorReciprocal(XMVectorSplatZ(Points[0]))); + Points[1] = XMVectorMultiply(Points[1], XMVectorReciprocal(XMVectorSplatZ(Points[1]))); + Points[2] = XMVectorMultiply(Points[2], XMVectorReciprocal(XMVectorSplatZ(Points[2]))); + Points[3] = XMVectorMultiply(Points[3], XMVectorReciprocal(XMVectorSplatZ(Points[3]))); + + Out.RightSlope = XMVectorGetX(Points[0]); + Out.LeftSlope = XMVectorGetX(Points[1]); + Out.TopSlope = XMVectorGetY(Points[2]); + Out.BottomSlope = XMVectorGetY(Points[3]); + + // Compute near and far. + Points[4] = XMVectorMultiply(Points[4], XMVectorReciprocal(XMVectorSplatW(Points[4]))); + Points[5] = XMVectorMultiply(Points[5], XMVectorReciprocal(XMVectorSplatW(Points[5]))); + + if (rhcoords) + { + Out.Near = XMVectorGetZ(Points[5]); + Out.Far = XMVectorGetZ(Points[4]); + } + else + { + Out.Near = XMVectorGetZ(Points[4]); + Out.Far = XMVectorGetZ(Points[5]); + } +} + + +/**************************************************************************** + * + * TriangleTests + * + ****************************************************************************/ + +namespace TriangleTests +{ + + //----------------------------------------------------------------------------- + // Compute the intersection of a ray (Origin, Direction) with a triangle + // (V0, V1, V2). Return true if there is an intersection and also set *pDist + // to the distance along the ray to the intersection. + // + // The algorithm is based on Moller, Tomas and Trumbore, "Fast, Minimum Storage + // Ray-Triangle Intersection", Journal of Graphics Tools, vol. 2, no. 1, + // pp 21-28, 1997. + //----------------------------------------------------------------------------- + _Use_decl_annotations_ + inline bool XM_CALLCONV Intersects( + FXMVECTOR Origin, FXMVECTOR Direction, FXMVECTOR V0, + GXMVECTOR V1, + HXMVECTOR V2, float& Dist) noexcept + { + assert(DirectX::MathInternal::XMVector3IsUnit(Direction)); + + XMVECTOR Zero = XMVectorZero(); + + XMVECTOR e1 = XMVectorSubtract(V1, V0); + XMVECTOR e2 = XMVectorSubtract(V2, V0); + + // p = Direction ^ e2; + XMVECTOR p = XMVector3Cross(Direction, e2); + + // det = e1 * p; + XMVECTOR det = XMVector3Dot(e1, p); + + XMVECTOR u, v, t; + + if (XMVector3GreaterOrEqual(det, g_RayEpsilon)) + { + // Determinate is positive (front side of the triangle). + XMVECTOR s = XMVectorSubtract(Origin, V0); + + // u = s * p; + u = XMVector3Dot(s, p); + + XMVECTOR NoIntersection = XMVectorLess(u, Zero); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(u, det)); + + // q = s ^ e1; + XMVECTOR q = XMVector3Cross(s, e1); + + // v = Direction * q; + v = XMVector3Dot(Direction, q); + + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(v, Zero)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(XMVectorAdd(u, v), det)); + + // t = e2 * q; + t = XMVector3Dot(e2, q); + + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(t, Zero)); + + if (XMVector4EqualInt(NoIntersection, XMVectorTrueInt())) + { + Dist = 0.f; + return false; + } + } + else if (XMVector3LessOrEqual(det, g_RayNegEpsilon)) + { + // Determinate is negative (back side of the triangle). + XMVECTOR s = XMVectorSubtract(Origin, V0); + + // u = s * p; + u = XMVector3Dot(s, p); + + XMVECTOR NoIntersection = XMVectorGreater(u, Zero); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(u, det)); + + // q = s ^ e1; + XMVECTOR q = XMVector3Cross(s, e1); + + // v = Direction * q; + v = XMVector3Dot(Direction, q); + + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(v, Zero)); + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorLess(XMVectorAdd(u, v), det)); + + // t = e2 * q; + t = XMVector3Dot(e2, q); + + NoIntersection = XMVectorOrInt(NoIntersection, XMVectorGreater(t, Zero)); + + if (XMVector4EqualInt(NoIntersection, XMVectorTrueInt())) + { + Dist = 0.f; + return false; + } + } + else + { + // Parallel ray. + Dist = 0.f; + return false; + } + + t = XMVectorDivide(t, det); + + // (u / det) and (v / dev) are the barycentric cooridinates of the intersection. + + // Store the x-component to *pDist + XMStoreFloat(&Dist, t); + + return true; + } + + + //----------------------------------------------------------------------------- + // Test if two triangles intersect. + // + // The final test of algorithm is based on Shen, Heng, and Tang, "A Fast + // Triangle-Triangle Overlap Test Using Signed Distances", Journal of Graphics + // Tools, vol. 8, no. 1, pp 17-23, 2003 and Guigue and Devillers, "Fast and + // Robust Triangle-Triangle Overlap Test Using Orientation Predicates", Journal + // of Graphics Tools, vol. 8, no. 1, pp 25-32, 2003. + // + // The final test could be considered an edge-edge separating plane test with + // the 9 possible cases narrowed down to the only two pairs of edges that can + // actaully result in a seperation. + //----------------------------------------------------------------------------- + _Use_decl_annotations_ + inline bool XM_CALLCONV Intersects(FXMVECTOR A0, FXMVECTOR A1, FXMVECTOR A2, GXMVECTOR B0, HXMVECTOR B1, HXMVECTOR B2) noexcept + { + static const XMVECTORU32 SelectY = { { { XM_SELECT_0, XM_SELECT_1, XM_SELECT_0, XM_SELECT_0 } } }; + static const XMVECTORU32 SelectZ = { { { XM_SELECT_0, XM_SELECT_0, XM_SELECT_1, XM_SELECT_0 } } }; + static const XMVECTORU32 Select0111 = { { { XM_SELECT_0, XM_SELECT_1, XM_SELECT_1, XM_SELECT_1 } } }; + static const XMVECTORU32 Select1011 = { { { XM_SELECT_1, XM_SELECT_0, XM_SELECT_1, XM_SELECT_1 } } }; + static const XMVECTORU32 Select1101 = { { { XM_SELECT_1, XM_SELECT_1, XM_SELECT_0, XM_SELECT_1 } } }; + + XMVECTOR Zero = XMVectorZero(); + + // Compute the normal of triangle A. + XMVECTOR N1 = XMVector3Cross(XMVectorSubtract(A1, A0), XMVectorSubtract(A2, A0)); + + // Assert that the triangle is not degenerate. + assert(!XMVector3Equal(N1, Zero)); + + // Test points of B against the plane of A. + XMVECTOR BDist = XMVector3Dot(N1, XMVectorSubtract(B0, A0)); + BDist = XMVectorSelect(BDist, XMVector3Dot(N1, XMVectorSubtract(B1, A0)), SelectY); + BDist = XMVectorSelect(BDist, XMVector3Dot(N1, XMVectorSubtract(B2, A0)), SelectZ); + + // Ensure robustness with co-planar triangles by zeroing small distances. + uint32_t BDistIsZeroCR; + XMVECTOR BDistIsZero = XMVectorGreaterR(&BDistIsZeroCR, g_RayEpsilon, XMVectorAbs(BDist)); + BDist = XMVectorSelect(BDist, Zero, BDistIsZero); + + uint32_t BDistIsLessCR; + XMVECTOR BDistIsLess = XMVectorGreaterR(&BDistIsLessCR, Zero, BDist); + + uint32_t BDistIsGreaterCR; + XMVECTOR BDistIsGreater = XMVectorGreaterR(&BDistIsGreaterCR, BDist, Zero); + + // If all the points are on the same side we don't intersect. + if (XMComparisonAllTrue(BDistIsLessCR) || XMComparisonAllTrue(BDistIsGreaterCR)) + return false; + + // Compute the normal of triangle B. + XMVECTOR N2 = XMVector3Cross(XMVectorSubtract(B1, B0), XMVectorSubtract(B2, B0)); + + // Assert that the triangle is not degenerate. + assert(!XMVector3Equal(N2, Zero)); + + // Test points of A against the plane of B. + XMVECTOR ADist = XMVector3Dot(N2, XMVectorSubtract(A0, B0)); + ADist = XMVectorSelect(ADist, XMVector3Dot(N2, XMVectorSubtract(A1, B0)), SelectY); + ADist = XMVectorSelect(ADist, XMVector3Dot(N2, XMVectorSubtract(A2, B0)), SelectZ); + + // Ensure robustness with co-planar triangles by zeroing small distances. + uint32_t ADistIsZeroCR; + XMVECTOR ADistIsZero = XMVectorGreaterR(&ADistIsZeroCR, g_RayEpsilon, XMVectorAbs(ADist)); + ADist = XMVectorSelect(ADist, Zero, ADistIsZero); + + uint32_t ADistIsLessCR; + XMVECTOR ADistIsLess = XMVectorGreaterR(&ADistIsLessCR, Zero, ADist); + + uint32_t ADistIsGreaterCR; + XMVECTOR ADistIsGreater = XMVectorGreaterR(&ADistIsGreaterCR, ADist, Zero); + + // If all the points are on the same side we don't intersect. + if (XMComparisonAllTrue(ADistIsLessCR) || XMComparisonAllTrue(ADistIsGreaterCR)) + return false; + + // Special case for co-planar triangles. + if (XMComparisonAllTrue(ADistIsZeroCR) || XMComparisonAllTrue(BDistIsZeroCR)) + { + XMVECTOR Axis, Dist, MinDist; + + // Compute an axis perpindicular to the edge (points out). + Axis = XMVector3Cross(N1, XMVectorSubtract(A1, A0)); + Dist = XMVector3Dot(Axis, A0); + + // Test points of B against the axis. + MinDist = XMVector3Dot(B0, Axis); + MinDist = XMVectorMin(MinDist, XMVector3Dot(B1, Axis)); + MinDist = XMVectorMin(MinDist, XMVector3Dot(B2, Axis)); + if (XMVector4GreaterOrEqual(MinDist, Dist)) + return false; + + // Edge (A1, A2) + Axis = XMVector3Cross(N1, XMVectorSubtract(A2, A1)); + Dist = XMVector3Dot(Axis, A1); + + MinDist = XMVector3Dot(B0, Axis); + MinDist = XMVectorMin(MinDist, XMVector3Dot(B1, Axis)); + MinDist = XMVectorMin(MinDist, XMVector3Dot(B2, Axis)); + if (XMVector4GreaterOrEqual(MinDist, Dist)) + return false; + + // Edge (A2, A0) + Axis = XMVector3Cross(N1, XMVectorSubtract(A0, A2)); + Dist = XMVector3Dot(Axis, A2); + + MinDist = XMVector3Dot(B0, Axis); + MinDist = XMVectorMin(MinDist, XMVector3Dot(B1, Axis)); + MinDist = XMVectorMin(MinDist, XMVector3Dot(B2, Axis)); + if (XMVector4GreaterOrEqual(MinDist, Dist)) + return false; + + // Edge (B0, B1) + Axis = XMVector3Cross(N2, XMVectorSubtract(B1, B0)); + Dist = XMVector3Dot(Axis, B0); + + MinDist = XMVector3Dot(A0, Axis); + MinDist = XMVectorMin(MinDist, XMVector3Dot(A1, Axis)); + MinDist = XMVectorMin(MinDist, XMVector3Dot(A2, Axis)); + if (XMVector4GreaterOrEqual(MinDist, Dist)) + return false; + + // Edge (B1, B2) + Axis = XMVector3Cross(N2, XMVectorSubtract(B2, B1)); + Dist = XMVector3Dot(Axis, B1); + + MinDist = XMVector3Dot(A0, Axis); + MinDist = XMVectorMin(MinDist, XMVector3Dot(A1, Axis)); + MinDist = XMVectorMin(MinDist, XMVector3Dot(A2, Axis)); + if (XMVector4GreaterOrEqual(MinDist, Dist)) + return false; + + // Edge (B2,B0) + Axis = XMVector3Cross(N2, XMVectorSubtract(B0, B2)); + Dist = XMVector3Dot(Axis, B2); + + MinDist = XMVector3Dot(A0, Axis); + MinDist = XMVectorMin(MinDist, XMVector3Dot(A1, Axis)); + MinDist = XMVectorMin(MinDist, XMVector3Dot(A2, Axis)); + if (XMVector4GreaterOrEqual(MinDist, Dist)) + return false; + + return true; + } + + // + // Find the single vertex of A and B (ie the vertex on the opposite side + // of the plane from the other two) and reorder the edges so we can compute + // the signed edge/edge distances. + // + // if ( (V0 >= 0 && V1 < 0 && V2 < 0) || + // (V0 > 0 && V1 <= 0 && V2 <= 0) || + // (V0 <= 0 && V1 > 0 && V2 > 0) || + // (V0 < 0 && V1 >= 0 && V2 >= 0) ) then V0 is singular; + // + // If our singular vertex is not on the positive side of the plane we reverse + // the triangle winding so that the overlap comparisons will compare the + // correct edges with the correct signs. + // + XMVECTOR ADistIsLessEqual = XMVectorOrInt(ADistIsLess, ADistIsZero); + XMVECTOR ADistIsGreaterEqual = XMVectorOrInt(ADistIsGreater, ADistIsZero); + + XMVECTOR AA0, AA1, AA2; + bool bPositiveA; + + if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreaterEqual, ADistIsLess, Select0111)) || + DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreater, ADistIsLessEqual, Select0111))) + { + // A0 is singular, crossing from positive to negative. + AA0 = A0; AA1 = A1; AA2 = A2; + bPositiveA = true; + } + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLessEqual, ADistIsGreater, Select0111)) || + DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLess, ADistIsGreaterEqual, Select0111))) + { + // A0 is singular, crossing from negative to positive. + AA0 = A0; AA1 = A2; AA2 = A1; + bPositiveA = false; + } + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreaterEqual, ADistIsLess, Select1011)) || + DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreater, ADistIsLessEqual, Select1011))) + { + // A1 is singular, crossing from positive to negative. + AA0 = A1; AA1 = A2; AA2 = A0; + bPositiveA = true; + } + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLessEqual, ADistIsGreater, Select1011)) || + DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLess, ADistIsGreaterEqual, Select1011))) + { + // A1 is singular, crossing from negative to positive. + AA0 = A1; AA1 = A0; AA2 = A2; + bPositiveA = false; + } + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreaterEqual, ADistIsLess, Select1101)) || + DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsGreater, ADistIsLessEqual, Select1101))) + { + // A2 is singular, crossing from positive to negative. + AA0 = A2; AA1 = A0; AA2 = A1; + bPositiveA = true; + } + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLessEqual, ADistIsGreater, Select1101)) || + DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(ADistIsLess, ADistIsGreaterEqual, Select1101))) + { + // A2 is singular, crossing from negative to positive. + AA0 = A2; AA1 = A1; AA2 = A0; + bPositiveA = false; + } + else + { + assert(false); + return false; + } + + XMVECTOR BDistIsLessEqual = XMVectorOrInt(BDistIsLess, BDistIsZero); + XMVECTOR BDistIsGreaterEqual = XMVectorOrInt(BDistIsGreater, BDistIsZero); + + XMVECTOR BB0, BB1, BB2; + bool bPositiveB; + + if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreaterEqual, BDistIsLess, Select0111)) || + DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreater, BDistIsLessEqual, Select0111))) + { + // B0 is singular, crossing from positive to negative. + BB0 = B0; BB1 = B1; BB2 = B2; + bPositiveB = true; + } + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLessEqual, BDistIsGreater, Select0111)) || + DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLess, BDistIsGreaterEqual, Select0111))) + { + // B0 is singular, crossing from negative to positive. + BB0 = B0; BB1 = B2; BB2 = B1; + bPositiveB = false; + } + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreaterEqual, BDistIsLess, Select1011)) || + DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreater, BDistIsLessEqual, Select1011))) + { + // B1 is singular, crossing from positive to negative. + BB0 = B1; BB1 = B2; BB2 = B0; + bPositiveB = true; + } + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLessEqual, BDistIsGreater, Select1011)) || + DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLess, BDistIsGreaterEqual, Select1011))) + { + // B1 is singular, crossing from negative to positive. + BB0 = B1; BB1 = B0; BB2 = B2; + bPositiveB = false; + } + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreaterEqual, BDistIsLess, Select1101)) || + DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsGreater, BDistIsLessEqual, Select1101))) + { + // B2 is singular, crossing from positive to negative. + BB0 = B2; BB1 = B0; BB2 = B1; + bPositiveB = true; + } + else if (DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLessEqual, BDistIsGreater, Select1101)) || + DirectX::MathInternal::XMVector3AllTrue(XMVectorSelect(BDistIsLess, BDistIsGreaterEqual, Select1101))) + { + // B2 is singular, crossing from negative to positive. + BB0 = B2; BB1 = B1; BB2 = B0; + bPositiveB = false; + } + else + { + assert(false); + return false; + } + + XMVECTOR Delta0, Delta1; + + // Reverse the direction of the test depending on whether the singular vertices are + // the same sign or different signs. + if (bPositiveA ^ bPositiveB) + { + Delta0 = XMVectorSubtract(BB0, AA0); + Delta1 = XMVectorSubtract(AA0, BB0); + } + else + { + Delta0 = XMVectorSubtract(AA0, BB0); + Delta1 = XMVectorSubtract(BB0, AA0); + } + + // Check if the triangles overlap on the line of intersection between the + // planes of the two triangles by finding the signed line distances. + XMVECTOR Dist0 = XMVector3Dot(Delta0, XMVector3Cross(XMVectorSubtract(BB2, BB0), XMVectorSubtract(AA2, AA0))); + if (XMVector4Greater(Dist0, Zero)) + return false; + + XMVECTOR Dist1 = XMVector3Dot(Delta1, XMVector3Cross(XMVectorSubtract(BB1, BB0), XMVectorSubtract(AA1, AA0))); + if (XMVector4Greater(Dist1, Zero)) + return false; + + return true; + } + + + //----------------------------------------------------------------------------- + // Ray-triangle test + //----------------------------------------------------------------------------- + _Use_decl_annotations_ + inline PlaneIntersectionType XM_CALLCONV Intersects(FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2, GXMVECTOR Plane) noexcept + { + XMVECTOR One = XMVectorSplatOne(); + + assert(DirectX::MathInternal::XMPlaneIsUnit(Plane)); + + // Set w of the points to one so we can dot4 with a plane. + XMVECTOR TV0 = XMVectorInsert<0, 0, 0, 0, 1>(V0, One); + XMVECTOR TV1 = XMVectorInsert<0, 0, 0, 0, 1>(V1, One); + XMVECTOR TV2 = XMVectorInsert<0, 0, 0, 0, 1>(V2, One); + + XMVECTOR Outside, Inside; + DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane, Outside, Inside); + + // If the triangle is outside any plane it is outside. + if (XMVector4EqualInt(Outside, XMVectorTrueInt())) + return FRONT; + + // If the triangle is inside all planes it is inside. + if (XMVector4EqualInt(Inside, XMVectorTrueInt())) + return BACK; + + // The triangle is not inside all planes or outside a plane it intersects. + return INTERSECTING; + } + + + //----------------------------------------------------------------------------- + // Test a triangle vs 6 planes (typically forming a frustum). + //----------------------------------------------------------------------------- + _Use_decl_annotations_ + inline ContainmentType XM_CALLCONV ContainedBy( + FXMVECTOR V0, FXMVECTOR V1, FXMVECTOR V2, + GXMVECTOR Plane0, + HXMVECTOR Plane1, HXMVECTOR Plane2, + CXMVECTOR Plane3, CXMVECTOR Plane4, CXMVECTOR Plane5) noexcept + { + XMVECTOR One = XMVectorSplatOne(); + + // Set w of the points to one so we can dot4 with a plane. + XMVECTOR TV0 = XMVectorInsert<0, 0, 0, 0, 1>(V0, One); + XMVECTOR TV1 = XMVectorInsert<0, 0, 0, 0, 1>(V1, One); + XMVECTOR TV2 = XMVectorInsert<0, 0, 0, 0, 1>(V2, One); + + XMVECTOR Outside, Inside; + + // Test against each plane. + DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane0, Outside, Inside); + + XMVECTOR AnyOutside = Outside; + XMVECTOR AllInside = Inside; + + DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane1, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane2, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane3, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane4, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + DirectX::MathInternal::FastIntersectTrianglePlane(TV0, TV1, TV2, Plane5, Outside, Inside); + AnyOutside = XMVectorOrInt(AnyOutside, Outside); + AllInside = XMVectorAndInt(AllInside, Inside); + + // If the triangle is outside any plane it is outside. + if (XMVector4EqualInt(AnyOutside, XMVectorTrueInt())) + return DISJOINT; + + // If the triangle is inside all planes it is inside. + if (XMVector4EqualInt(AllInside, XMVectorTrueInt())) + return CONTAINS; + + // The triangle is not inside all planes or outside a plane, it may intersect. + return INTERSECTS; + } + +} // namespace TriangleTests + diff --git a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXColors.h b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXColors.h similarity index 98% rename from Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXColors.h rename to Minecraft.Client/Linux/Stubs/DirectXMath/DirectXColors.h index 30bd3d852..218fe17c6 100644 --- a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXColors.h +++ b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXColors.h @@ -1,500 +1,500 @@ -//------------------------------------------------------------------------------------- -// DirectXColors.h -- C++ Color Math library -// -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. -// -// http://go.microsoft.com/fwlink/?LinkID=615560 -//------------------------------------------------------------------------------------- - -#pragma once - -#include "DirectXMath.h" - -namespace DirectX { - -namespace Colors { -// Standard colors (Red/Green/Blue/Alpha) in sRGB colorspace -XMGLOBALCONST XMVECTORF32 AliceBlue = { - {{0.941176534f, 0.972549081f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 AntiqueWhite = { - {{0.980392218f, 0.921568692f, 0.843137324f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Aqua = {{{0.f, 1.f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Aquamarine = { - {{0.498039246f, 1.f, 0.831372619f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Azure = {{{0.941176534f, 1.f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Beige = { - {{0.960784376f, 0.960784376f, 0.862745166f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Bisque = {{{1.f, 0.894117713f, 0.768627524f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Black = {{{0.f, 0.f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 BlanchedAlmond = { - {{1.f, 0.921568692f, 0.803921640f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Blue = {{{0.f, 0.f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 BlueViolet = { - {{0.541176498f, 0.168627456f, 0.886274576f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Brown = { - {{0.647058845f, 0.164705887f, 0.164705887f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 BurlyWood = { - {{0.870588303f, 0.721568644f, 0.529411793f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 CadetBlue = { - {{0.372549027f, 0.619607866f, 0.627451003f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Chartreuse = {{{0.498039246f, 1.f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Chocolate = { - {{0.823529482f, 0.411764741f, 0.117647067f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Coral = {{{1.f, 0.498039246f, 0.313725501f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 CornflowerBlue = { - {{0.392156899f, 0.584313750f, 0.929411829f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Cornsilk = {{{1.f, 0.972549081f, 0.862745166f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Crimson = { - {{0.862745166f, 0.078431375f, 0.235294133f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Cyan = {{{0.f, 1.f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkBlue = {{{0.f, 0.f, 0.545098066f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkCyan = {{{0.f, 0.545098066f, 0.545098066f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkGoldenrod = { - {{0.721568644f, 0.525490224f, 0.043137256f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkGray = { - {{0.662745118f, 0.662745118f, 0.662745118f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkGreen = {{{0.f, 0.392156899f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkKhaki = { - {{0.741176486f, 0.717647076f, 0.419607878f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkMagenta = { - {{0.545098066f, 0.f, 0.545098066f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkOliveGreen = { - {{0.333333343f, 0.419607878f, 0.184313729f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkOrange = {{{1.f, 0.549019635f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkOrchid = { - {{0.600000024f, 0.196078449f, 0.800000072f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkRed = {{{0.545098066f, 0.f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkSalmon = { - {{0.913725555f, 0.588235319f, 0.478431404f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkSeaGreen = { - {{0.560784340f, 0.737254918f, 0.545098066f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkSlateBlue = { - {{0.282352954f, 0.239215702f, 0.545098066f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkSlateGray = { - {{0.184313729f, 0.309803933f, 0.309803933f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkTurquoise = { - {{0.f, 0.807843208f, 0.819607913f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkViolet = { - {{0.580392182f, 0.f, 0.827451050f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DeepPink = {{{1.f, 0.078431375f, 0.576470613f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DeepSkyBlue = {{{0.f, 0.749019623f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DimGray = { - {{0.411764741f, 0.411764741f, 0.411764741f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DodgerBlue = { - {{0.117647067f, 0.564705908f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Firebrick = { - {{0.698039234f, 0.133333340f, 0.133333340f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 FloralWhite = { - {{1.f, 0.980392218f, 0.941176534f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 ForestGreen = { - {{0.133333340f, 0.545098066f, 0.133333340f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Fuchsia = {{{1.f, 0.f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Gainsboro = { - {{0.862745166f, 0.862745166f, 0.862745166f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 GhostWhite = { - {{0.972549081f, 0.972549081f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Gold = {{{1.f, 0.843137324f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Goldenrod = { - {{0.854902029f, 0.647058845f, 0.125490203f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Gray = { - {{0.501960814f, 0.501960814f, 0.501960814f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Green = {{{0.f, 0.501960814f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 GreenYellow = { - {{0.678431392f, 1.f, 0.184313729f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Honeydew = {{{0.941176534f, 1.f, 0.941176534f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 HotPink = {{{1.f, 0.411764741f, 0.705882370f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 IndianRed = { - {{0.803921640f, 0.360784322f, 0.360784322f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Indigo = {{{0.294117659f, 0.f, 0.509803951f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Ivory = {{{1.f, 1.f, 0.941176534f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Khaki = { - {{0.941176534f, 0.901960850f, 0.549019635f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Lavender = { - {{0.901960850f, 0.901960850f, 0.980392218f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LavenderBlush = { - {{1.f, 0.941176534f, 0.960784376f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LawnGreen = { - {{0.486274540f, 0.988235354f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LemonChiffon = { - {{1.f, 0.980392218f, 0.803921640f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightBlue = { - {{0.678431392f, 0.847058892f, 0.901960850f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightCoral = { - {{0.941176534f, 0.501960814f, 0.501960814f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightCyan = {{{0.878431439f, 1.f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightGoldenrodYellow = { - {{0.980392218f, 0.980392218f, 0.823529482f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightGray = { - {{0.827451050f, 0.827451050f, 0.827451050f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightGreen = { - {{0.564705908f, 0.933333397f, 0.564705908f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightPink = { - {{1.f, 0.713725507f, 0.756862819f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightSalmon = { - {{1.f, 0.627451003f, 0.478431404f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightSeaGreen = { - {{0.125490203f, 0.698039234f, 0.666666687f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightSkyBlue = { - {{0.529411793f, 0.807843208f, 0.980392218f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightSlateGray = { - {{0.466666698f, 0.533333361f, 0.600000024f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightSteelBlue = { - {{0.690196097f, 0.768627524f, 0.870588303f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightYellow = {{{1.f, 1.f, 0.878431439f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Lime = {{{0.f, 1.f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LimeGreen = { - {{0.196078449f, 0.803921640f, 0.196078449f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Linen = { - {{0.980392218f, 0.941176534f, 0.901960850f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Magenta = {{{1.f, 0.f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Maroon = {{{0.501960814f, 0.f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MediumAquamarine = { - {{0.400000036f, 0.803921640f, 0.666666687f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MediumBlue = {{{0.f, 0.f, 0.803921640f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MediumOrchid = { - {{0.729411781f, 0.333333343f, 0.827451050f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MediumPurple = { - {{0.576470613f, 0.439215720f, 0.858823597f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MediumSeaGreen = { - {{0.235294133f, 0.701960802f, 0.443137288f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MediumSlateBlue = { - {{0.482352972f, 0.407843173f, 0.933333397f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MediumSpringGreen = { - {{0.f, 0.980392218f, 0.603921592f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MediumTurquoise = { - {{0.282352954f, 0.819607913f, 0.800000072f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MediumVioletRed = { - {{0.780392230f, 0.082352944f, 0.521568656f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MidnightBlue = { - {{0.098039225f, 0.098039225f, 0.439215720f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MintCream = { - {{0.960784376f, 1.f, 0.980392218f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MistyRose = { - {{1.f, 0.894117713f, 0.882353008f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Moccasin = {{{1.f, 0.894117713f, 0.709803939f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 NavajoWhite = { - {{1.f, 0.870588303f, 0.678431392f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Navy = {{{0.f, 0.f, 0.501960814f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 OldLace = { - {{0.992156923f, 0.960784376f, 0.901960850f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Olive = {{{0.501960814f, 0.501960814f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 OliveDrab = { - {{0.419607878f, 0.556862772f, 0.137254909f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Orange = {{{1.f, 0.647058845f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 OrangeRed = {{{1.f, 0.270588249f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Orchid = { - {{0.854902029f, 0.439215720f, 0.839215755f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 PaleGoldenrod = { - {{0.933333397f, 0.909803987f, 0.666666687f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 PaleGreen = { - {{0.596078455f, 0.984313786f, 0.596078455f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 PaleTurquoise = { - {{0.686274529f, 0.933333397f, 0.933333397f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 PaleVioletRed = { - {{0.858823597f, 0.439215720f, 0.576470613f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 PapayaWhip = { - {{1.f, 0.937254965f, 0.835294187f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 PeachPuff = { - {{1.f, 0.854902029f, 0.725490212f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Peru = { - {{0.803921640f, 0.521568656f, 0.247058839f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Pink = {{{1.f, 0.752941251f, 0.796078503f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Plum = { - {{0.866666734f, 0.627451003f, 0.866666734f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 PowderBlue = { - {{0.690196097f, 0.878431439f, 0.901960850f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Purple = {{{0.501960814f, 0.f, 0.501960814f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Red = {{{1.f, 0.f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 RosyBrown = { - {{0.737254918f, 0.560784340f, 0.560784340f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 RoyalBlue = { - {{0.254901975f, 0.411764741f, 0.882353008f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 SaddleBrown = { - {{0.545098066f, 0.270588249f, 0.074509807f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Salmon = { - {{0.980392218f, 0.501960814f, 0.447058856f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 SandyBrown = { - {{0.956862807f, 0.643137276f, 0.376470625f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 SeaGreen = { - {{0.180392161f, 0.545098066f, 0.341176480f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 SeaShell = {{{1.f, 0.960784376f, 0.933333397f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Sienna = { - {{0.627451003f, 0.321568638f, 0.176470593f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Silver = { - {{0.752941251f, 0.752941251f, 0.752941251f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 SkyBlue = { - {{0.529411793f, 0.807843208f, 0.921568692f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 SlateBlue = { - {{0.415686309f, 0.352941185f, 0.803921640f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 SlateGray = { - {{0.439215720f, 0.501960814f, 0.564705908f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Snow = {{{1.f, 0.980392218f, 0.980392218f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 SpringGreen = {{{0.f, 1.f, 0.498039246f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 SteelBlue = { - {{0.274509817f, 0.509803951f, 0.705882370f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Tan = { - {{0.823529482f, 0.705882370f, 0.549019635f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Teal = {{{0.f, 0.501960814f, 0.501960814f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Thistle = { - {{0.847058892f, 0.749019623f, 0.847058892f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Tomato = {{{1.f, 0.388235331f, 0.278431386f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Transparent = {{{0.f, 0.f, 0.f, 0.f}}}; -XMGLOBALCONST XMVECTORF32 Turquoise = { - {{0.250980407f, 0.878431439f, 0.815686345f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Violet = { - {{0.933333397f, 0.509803951f, 0.933333397f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Wheat = { - {{0.960784376f, 0.870588303f, 0.701960802f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 White = {{{1.f, 1.f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 WhiteSmoke = { - {{0.960784376f, 0.960784376f, 0.960784376f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Yellow = {{{1.f, 1.f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 YellowGreen = { - {{0.603921592f, 0.803921640f, 0.196078449f, 1.f}}}; - -} // namespace Colors - -namespace ColorsLinear { -// Standard colors (Red/Green/Blue/Alpha) in linear colorspace -XMGLOBALCONST XMVECTORF32 AliceBlue = { - {{0.871367335f, 0.938685894f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 AntiqueWhite = { - {{0.955973506f, 0.830770075f, 0.679542601f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Aqua = {{{0.f, 1.f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Aquamarine = { - {{0.212230787f, 1.f, 0.658374965f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Azure = {{{0.871367335f, 1.f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Beige = { - {{0.913098991f, 0.913098991f, 0.715693772f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Bisque = {{{1.f, 0.775822461f, 0.552011609f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Black = {{{0.f, 0.f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 BlanchedAlmond = { - {{1.f, 0.830770075f, 0.610495746f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Blue = {{{0.f, 0.f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 BlueViolet = { - {{0.254152179f, 0.024157630f, 0.760524750f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Brown = { - {{0.376262218f, 0.023153365f, 0.023153365f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 BurlyWood = { - {{0.730461001f, 0.479320228f, 0.242281199f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 CadetBlue = { - {{0.114435382f, 0.341914445f, 0.351532698f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Chartreuse = {{{0.212230787f, 1.f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Chocolate = { - {{0.644479871f, 0.141263321f, 0.012983031f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Coral = {{{1.f, 0.212230787f, 0.080219828f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 CornflowerBlue = { - {{0.127437726f, 0.300543845f, 0.846873462f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Cornsilk = {{{1.f, 0.938685894f, 0.715693772f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Crimson = { - {{0.715693772f, 0.006995410f, 0.045186214f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Cyan = {{{0.f, 1.f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkBlue = {{{0.f, 0.f, 0.258182913f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkCyan = {{{0.f, 0.258182913f, 0.258182913f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkGoldenrod = { - {{0.479320228f, 0.238397658f, 0.003346536f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkGray = { - {{0.396755308f, 0.396755308f, 0.396755308f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkGreen = {{{0.f, 0.127437726f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkKhaki = { - {{0.508881450f, 0.473531544f, 0.147027299f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkMagenta = { - {{0.258182913f, 0.f, 0.258182913f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkOliveGreen = { - {{0.090841733f, 0.147027299f, 0.028426038f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkOrange = {{{1.f, 0.262250721f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkOrchid = { - {{0.318546832f, 0.031896040f, 0.603827536f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkRed = {{{0.258182913f, 0.f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkSalmon = { - {{0.814846814f, 0.304987371f, 0.194617867f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkSeaGreen = { - {{0.274677366f, 0.502886593f, 0.258182913f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkSlateBlue = { - {{0.064803280f, 0.046665095f, 0.258182913f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkSlateGray = { - {{0.028426038f, 0.078187428f, 0.078187428f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkTurquoise = { - {{0.f, 0.617206752f, 0.637597024f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DarkViolet = { - {{0.296138316f, 0.f, 0.651405811f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DeepPink = {{{1.f, 0.006995410f, 0.291770697f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DeepSkyBlue = {{{0.f, 0.520995677f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DimGray = { - {{0.141263321f, 0.141263321f, 0.141263321f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 DodgerBlue = { - {{0.012983031f, 0.278894335f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Firebrick = { - {{0.445201248f, 0.015996292f, 0.015996292f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 FloralWhite = { - {{1.f, 0.955973506f, 0.871367335f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 ForestGreen = { - {{0.015996292f, 0.258182913f, 0.015996292f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Fuchsia = {{{1.f, 0.f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Gainsboro = { - {{0.715693772f, 0.715693772f, 0.715693772f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 GhostWhite = { - {{0.938685894f, 0.938685894f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Gold = {{{1.f, 0.679542601f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Goldenrod = { - {{0.701102138f, 0.376262218f, 0.014443844f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Gray = { - {{0.215860531f, 0.215860531f, 0.215860531f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Green = {{{0.f, 0.215860531f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 GreenYellow = { - {{0.417885154f, 1.f, 0.028426038f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Honeydew = {{{0.871367335f, 1.f, 0.871367335f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 HotPink = {{{1.f, 0.141263321f, 0.456411064f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 IndianRed = { - {{0.610495746f, 0.107023112f, 0.107023112f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Indigo = {{{0.070360109f, 0.f, 0.223227978f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Ivory = {{{1.f, 1.f, 0.871367335f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Khaki = { - {{0.871367335f, 0.791298151f, 0.262250721f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Lavender = { - {{0.791298151f, 0.791298151f, 0.955973506f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LavenderBlush = { - {{1.f, 0.871367335f, 0.913098991f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LawnGreen = { - {{0.201556295f, 0.973445475f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LemonChiffon = { - {{1.f, 0.955973506f, 0.610495746f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightBlue = { - {{0.417885154f, 0.686685443f, 0.791298151f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightCoral = { - {{0.871367335f, 0.215860531f, 0.215860531f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightCyan = {{{0.745404482f, 1.f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightGoldenrodYellow = { - {{0.955973506f, 0.955973506f, 0.644479871f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightGray = { - {{0.651405811f, 0.651405811f, 0.651405811f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightGreen = { - {{0.278894335f, 0.854992807f, 0.278894335f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightPink = { - {{1.f, 0.467783839f, 0.533276618f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightSalmon = { - {{1.f, 0.351532698f, 0.194617867f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightSeaGreen = { - {{0.014443844f, 0.445201248f, 0.401977867f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightSkyBlue = { - {{0.242281199f, 0.617206752f, 0.955973506f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightSlateGray = { - {{0.184475034f, 0.246201396f, 0.318546832f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightSteelBlue = { - {{0.434153706f, 0.552011609f, 0.730461001f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LightYellow = {{{1.f, 1.f, 0.745404482f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Lime = {{{0.f, 1.f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 LimeGreen = { - {{0.031896040f, 0.610495746f, 0.031896040f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Linen = { - {{0.955973506f, 0.871367335f, 0.791298151f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Magenta = {{{1.f, 0.f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Maroon = {{{0.215860531f, 0.f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MediumAquamarine = { - {{0.132868364f, 0.610495746f, 0.401977867f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MediumBlue = {{{0.f, 0.f, 0.610495746f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MediumOrchid = { - {{0.491020888f, 0.090841733f, 0.651405811f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MediumPurple = { - {{0.291770697f, 0.162029430f, 0.708376050f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MediumSeaGreen = { - {{0.045186214f, 0.450785846f, 0.165132239f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MediumSlateBlue = { - {{0.198069349f, 0.138431653f, 0.854992807f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MediumSpringGreen = { - {{0.f, 0.955973506f, 0.323143244f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MediumTurquoise = { - {{0.064803280f, 0.637597024f, 0.603827536f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MediumVioletRed = { - {{0.571125031f, 0.007499032f, 0.234550655f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MidnightBlue = { - {{0.009721218f, 0.009721218f, 0.162029430f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MintCream = { - {{0.913098991f, 1.f, 0.955973506f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 MistyRose = { - {{1.f, 0.775822461f, 0.752942443f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Moccasin = {{{1.f, 0.775822461f, 0.462077051f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 NavajoWhite = { - {{1.f, 0.730461001f, 0.417885154f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Navy = {{{0.f, 0.f, 0.215860531f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 OldLace = { - {{0.982250869f, 0.913098991f, 0.791298151f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Olive = {{{0.215860531f, 0.215860531f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 OliveDrab = { - {{0.147027299f, 0.270497859f, 0.016807375f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Orange = {{{1.f, 0.376262218f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 OrangeRed = {{{1.f, 0.059511241f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Orchid = { - {{0.701102138f, 0.162029430f, 0.672443330f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 PaleGoldenrod = { - {{0.854992807f, 0.806952477f, 0.401977867f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 PaleGreen = { - {{0.313988745f, 0.964686573f, 0.313988745f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 PaleTurquoise = { - {{0.428690553f, 0.854992807f, 0.854992807f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 PaleVioletRed = { - {{0.708376050f, 0.162029430f, 0.291770697f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 PapayaWhip = { - {{1.f, 0.863157392f, 0.665387452f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 PeachPuff = { - {{1.f, 0.701102138f, 0.485149980f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Peru = { - {{0.610495746f, 0.234550655f, 0.049706575f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Pink = {{{1.f, 0.527115345f, 0.597202003f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Plum = { - {{0.723055363f, 0.351532698f, 0.723055363f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 PowderBlue = { - {{0.434153706f, 0.745404482f, 0.791298151f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Purple = {{{0.215860531f, 0.f, 0.215860531f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Red = {{{1.f, 0.f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 RosyBrown = { - {{0.502886593f, 0.274677366f, 0.274677366f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 RoyalBlue = { - {{0.052860655f, 0.141263321f, 0.752942443f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 SaddleBrown = { - {{0.258182913f, 0.059511241f, 0.006512091f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Salmon = { - {{0.955973506f, 0.215860531f, 0.168269455f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 SandyBrown = { - {{0.904661357f, 0.371237785f, 0.116970696f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 SeaGreen = { - {{0.027320892f, 0.258182913f, 0.095307484f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 SeaShell = {{{1.f, 0.913098991f, 0.854992807f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Sienna = { - {{0.351532698f, 0.084376216f, 0.026241222f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Silver = { - {{0.527115345f, 0.527115345f, 0.527115345f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 SkyBlue = { - {{0.242281199f, 0.617206752f, 0.830770075f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 SlateBlue = { - {{0.144128501f, 0.102241747f, 0.610495746f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 SlateGray = { - {{0.162029430f, 0.215860531f, 0.278894335f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Snow = {{{1.f, 0.955973506f, 0.955973506f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 SpringGreen = {{{0.f, 1.f, 0.212230787f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 SteelBlue = { - {{0.061246071f, 0.223227978f, 0.456411064f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Tan = { - {{0.644479871f, 0.456411064f, 0.262250721f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Teal = {{{0.f, 0.215860531f, 0.215860531f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Thistle = { - {{0.686685443f, 0.520995677f, 0.686685443f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Tomato = {{{1.f, 0.124771863f, 0.063010029f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Transparent = {{{0.f, 0.f, 0.f, 0.f}}}; -XMGLOBALCONST XMVECTORF32 Turquoise = { - {{0.051269468f, 0.745404482f, 0.630757332f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Violet = { - {{0.854992807f, 0.223227978f, 0.854992807f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Wheat = { - {{0.913098991f, 0.730461001f, 0.450785846f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 White = {{{1.f, 1.f, 1.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 WhiteSmoke = { - {{0.913098991f, 0.913098991f, 0.913098991f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 Yellow = {{{1.f, 1.f, 0.f, 1.f}}}; -XMGLOBALCONST XMVECTORF32 YellowGreen = { - {{0.323143244f, 0.610495746f, 0.031896040f, 1.f}}}; - -} // namespace ColorsLinear - -} // namespace DirectX +//------------------------------------------------------------------------------------- +// DirectXColors.h -- C++ Color Math library +// +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +// +// http://go.microsoft.com/fwlink/?LinkID=615560 +//------------------------------------------------------------------------------------- + +#pragma once + +#include "DirectXMath.h" + +namespace DirectX { + +namespace Colors { +// Standard colors (Red/Green/Blue/Alpha) in sRGB colorspace +XMGLOBALCONST XMVECTORF32 AliceBlue = { + {{0.941176534f, 0.972549081f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 AntiqueWhite = { + {{0.980392218f, 0.921568692f, 0.843137324f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Aqua = {{{0.f, 1.f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Aquamarine = { + {{0.498039246f, 1.f, 0.831372619f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Azure = {{{0.941176534f, 1.f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Beige = { + {{0.960784376f, 0.960784376f, 0.862745166f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Bisque = {{{1.f, 0.894117713f, 0.768627524f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Black = {{{0.f, 0.f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 BlanchedAlmond = { + {{1.f, 0.921568692f, 0.803921640f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Blue = {{{0.f, 0.f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 BlueViolet = { + {{0.541176498f, 0.168627456f, 0.886274576f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Brown = { + {{0.647058845f, 0.164705887f, 0.164705887f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 BurlyWood = { + {{0.870588303f, 0.721568644f, 0.529411793f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 CadetBlue = { + {{0.372549027f, 0.619607866f, 0.627451003f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Chartreuse = {{{0.498039246f, 1.f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Chocolate = { + {{0.823529482f, 0.411764741f, 0.117647067f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Coral = {{{1.f, 0.498039246f, 0.313725501f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 CornflowerBlue = { + {{0.392156899f, 0.584313750f, 0.929411829f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Cornsilk = {{{1.f, 0.972549081f, 0.862745166f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Crimson = { + {{0.862745166f, 0.078431375f, 0.235294133f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Cyan = {{{0.f, 1.f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkBlue = {{{0.f, 0.f, 0.545098066f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkCyan = {{{0.f, 0.545098066f, 0.545098066f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkGoldenrod = { + {{0.721568644f, 0.525490224f, 0.043137256f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkGray = { + {{0.662745118f, 0.662745118f, 0.662745118f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkGreen = {{{0.f, 0.392156899f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkKhaki = { + {{0.741176486f, 0.717647076f, 0.419607878f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkMagenta = { + {{0.545098066f, 0.f, 0.545098066f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkOliveGreen = { + {{0.333333343f, 0.419607878f, 0.184313729f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkOrange = {{{1.f, 0.549019635f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkOrchid = { + {{0.600000024f, 0.196078449f, 0.800000072f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkRed = {{{0.545098066f, 0.f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkSalmon = { + {{0.913725555f, 0.588235319f, 0.478431404f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkSeaGreen = { + {{0.560784340f, 0.737254918f, 0.545098066f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkSlateBlue = { + {{0.282352954f, 0.239215702f, 0.545098066f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkSlateGray = { + {{0.184313729f, 0.309803933f, 0.309803933f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkTurquoise = { + {{0.f, 0.807843208f, 0.819607913f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkViolet = { + {{0.580392182f, 0.f, 0.827451050f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DeepPink = {{{1.f, 0.078431375f, 0.576470613f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DeepSkyBlue = {{{0.f, 0.749019623f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DimGray = { + {{0.411764741f, 0.411764741f, 0.411764741f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DodgerBlue = { + {{0.117647067f, 0.564705908f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Firebrick = { + {{0.698039234f, 0.133333340f, 0.133333340f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 FloralWhite = { + {{1.f, 0.980392218f, 0.941176534f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 ForestGreen = { + {{0.133333340f, 0.545098066f, 0.133333340f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Fuchsia = {{{1.f, 0.f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Gainsboro = { + {{0.862745166f, 0.862745166f, 0.862745166f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 GhostWhite = { + {{0.972549081f, 0.972549081f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Gold = {{{1.f, 0.843137324f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Goldenrod = { + {{0.854902029f, 0.647058845f, 0.125490203f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Gray = { + {{0.501960814f, 0.501960814f, 0.501960814f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Green = {{{0.f, 0.501960814f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 GreenYellow = { + {{0.678431392f, 1.f, 0.184313729f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Honeydew = {{{0.941176534f, 1.f, 0.941176534f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 HotPink = {{{1.f, 0.411764741f, 0.705882370f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 IndianRed = { + {{0.803921640f, 0.360784322f, 0.360784322f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Indigo = {{{0.294117659f, 0.f, 0.509803951f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Ivory = {{{1.f, 1.f, 0.941176534f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Khaki = { + {{0.941176534f, 0.901960850f, 0.549019635f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Lavender = { + {{0.901960850f, 0.901960850f, 0.980392218f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LavenderBlush = { + {{1.f, 0.941176534f, 0.960784376f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LawnGreen = { + {{0.486274540f, 0.988235354f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LemonChiffon = { + {{1.f, 0.980392218f, 0.803921640f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightBlue = { + {{0.678431392f, 0.847058892f, 0.901960850f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightCoral = { + {{0.941176534f, 0.501960814f, 0.501960814f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightCyan = {{{0.878431439f, 1.f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightGoldenrodYellow = { + {{0.980392218f, 0.980392218f, 0.823529482f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightGray = { + {{0.827451050f, 0.827451050f, 0.827451050f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightGreen = { + {{0.564705908f, 0.933333397f, 0.564705908f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightPink = { + {{1.f, 0.713725507f, 0.756862819f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightSalmon = { + {{1.f, 0.627451003f, 0.478431404f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightSeaGreen = { + {{0.125490203f, 0.698039234f, 0.666666687f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightSkyBlue = { + {{0.529411793f, 0.807843208f, 0.980392218f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightSlateGray = { + {{0.466666698f, 0.533333361f, 0.600000024f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightSteelBlue = { + {{0.690196097f, 0.768627524f, 0.870588303f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightYellow = {{{1.f, 1.f, 0.878431439f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Lime = {{{0.f, 1.f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LimeGreen = { + {{0.196078449f, 0.803921640f, 0.196078449f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Linen = { + {{0.980392218f, 0.941176534f, 0.901960850f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Magenta = {{{1.f, 0.f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Maroon = {{{0.501960814f, 0.f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MediumAquamarine = { + {{0.400000036f, 0.803921640f, 0.666666687f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MediumBlue = {{{0.f, 0.f, 0.803921640f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MediumOrchid = { + {{0.729411781f, 0.333333343f, 0.827451050f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MediumPurple = { + {{0.576470613f, 0.439215720f, 0.858823597f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MediumSeaGreen = { + {{0.235294133f, 0.701960802f, 0.443137288f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MediumSlateBlue = { + {{0.482352972f, 0.407843173f, 0.933333397f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MediumSpringGreen = { + {{0.f, 0.980392218f, 0.603921592f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MediumTurquoise = { + {{0.282352954f, 0.819607913f, 0.800000072f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MediumVioletRed = { + {{0.780392230f, 0.082352944f, 0.521568656f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MidnightBlue = { + {{0.098039225f, 0.098039225f, 0.439215720f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MintCream = { + {{0.960784376f, 1.f, 0.980392218f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MistyRose = { + {{1.f, 0.894117713f, 0.882353008f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Moccasin = {{{1.f, 0.894117713f, 0.709803939f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 NavajoWhite = { + {{1.f, 0.870588303f, 0.678431392f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Navy = {{{0.f, 0.f, 0.501960814f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 OldLace = { + {{0.992156923f, 0.960784376f, 0.901960850f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Olive = {{{0.501960814f, 0.501960814f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 OliveDrab = { + {{0.419607878f, 0.556862772f, 0.137254909f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Orange = {{{1.f, 0.647058845f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 OrangeRed = {{{1.f, 0.270588249f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Orchid = { + {{0.854902029f, 0.439215720f, 0.839215755f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 PaleGoldenrod = { + {{0.933333397f, 0.909803987f, 0.666666687f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 PaleGreen = { + {{0.596078455f, 0.984313786f, 0.596078455f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 PaleTurquoise = { + {{0.686274529f, 0.933333397f, 0.933333397f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 PaleVioletRed = { + {{0.858823597f, 0.439215720f, 0.576470613f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 PapayaWhip = { + {{1.f, 0.937254965f, 0.835294187f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 PeachPuff = { + {{1.f, 0.854902029f, 0.725490212f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Peru = { + {{0.803921640f, 0.521568656f, 0.247058839f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Pink = {{{1.f, 0.752941251f, 0.796078503f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Plum = { + {{0.866666734f, 0.627451003f, 0.866666734f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 PowderBlue = { + {{0.690196097f, 0.878431439f, 0.901960850f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Purple = {{{0.501960814f, 0.f, 0.501960814f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Red = {{{1.f, 0.f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 RosyBrown = { + {{0.737254918f, 0.560784340f, 0.560784340f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 RoyalBlue = { + {{0.254901975f, 0.411764741f, 0.882353008f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 SaddleBrown = { + {{0.545098066f, 0.270588249f, 0.074509807f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Salmon = { + {{0.980392218f, 0.501960814f, 0.447058856f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 SandyBrown = { + {{0.956862807f, 0.643137276f, 0.376470625f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 SeaGreen = { + {{0.180392161f, 0.545098066f, 0.341176480f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 SeaShell = {{{1.f, 0.960784376f, 0.933333397f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Sienna = { + {{0.627451003f, 0.321568638f, 0.176470593f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Silver = { + {{0.752941251f, 0.752941251f, 0.752941251f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 SkyBlue = { + {{0.529411793f, 0.807843208f, 0.921568692f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 SlateBlue = { + {{0.415686309f, 0.352941185f, 0.803921640f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 SlateGray = { + {{0.439215720f, 0.501960814f, 0.564705908f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Snow = {{{1.f, 0.980392218f, 0.980392218f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 SpringGreen = {{{0.f, 1.f, 0.498039246f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 SteelBlue = { + {{0.274509817f, 0.509803951f, 0.705882370f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Tan = { + {{0.823529482f, 0.705882370f, 0.549019635f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Teal = {{{0.f, 0.501960814f, 0.501960814f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Thistle = { + {{0.847058892f, 0.749019623f, 0.847058892f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Tomato = {{{1.f, 0.388235331f, 0.278431386f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Transparent = {{{0.f, 0.f, 0.f, 0.f}}}; +XMGLOBALCONST XMVECTORF32 Turquoise = { + {{0.250980407f, 0.878431439f, 0.815686345f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Violet = { + {{0.933333397f, 0.509803951f, 0.933333397f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Wheat = { + {{0.960784376f, 0.870588303f, 0.701960802f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 White = {{{1.f, 1.f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 WhiteSmoke = { + {{0.960784376f, 0.960784376f, 0.960784376f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Yellow = {{{1.f, 1.f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 YellowGreen = { + {{0.603921592f, 0.803921640f, 0.196078449f, 1.f}}}; + +} // namespace Colors + +namespace ColorsLinear { +// Standard colors (Red/Green/Blue/Alpha) in linear colorspace +XMGLOBALCONST XMVECTORF32 AliceBlue = { + {{0.871367335f, 0.938685894f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 AntiqueWhite = { + {{0.955973506f, 0.830770075f, 0.679542601f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Aqua = {{{0.f, 1.f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Aquamarine = { + {{0.212230787f, 1.f, 0.658374965f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Azure = {{{0.871367335f, 1.f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Beige = { + {{0.913098991f, 0.913098991f, 0.715693772f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Bisque = {{{1.f, 0.775822461f, 0.552011609f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Black = {{{0.f, 0.f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 BlanchedAlmond = { + {{1.f, 0.830770075f, 0.610495746f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Blue = {{{0.f, 0.f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 BlueViolet = { + {{0.254152179f, 0.024157630f, 0.760524750f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Brown = { + {{0.376262218f, 0.023153365f, 0.023153365f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 BurlyWood = { + {{0.730461001f, 0.479320228f, 0.242281199f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 CadetBlue = { + {{0.114435382f, 0.341914445f, 0.351532698f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Chartreuse = {{{0.212230787f, 1.f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Chocolate = { + {{0.644479871f, 0.141263321f, 0.012983031f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Coral = {{{1.f, 0.212230787f, 0.080219828f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 CornflowerBlue = { + {{0.127437726f, 0.300543845f, 0.846873462f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Cornsilk = {{{1.f, 0.938685894f, 0.715693772f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Crimson = { + {{0.715693772f, 0.006995410f, 0.045186214f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Cyan = {{{0.f, 1.f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkBlue = {{{0.f, 0.f, 0.258182913f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkCyan = {{{0.f, 0.258182913f, 0.258182913f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkGoldenrod = { + {{0.479320228f, 0.238397658f, 0.003346536f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkGray = { + {{0.396755308f, 0.396755308f, 0.396755308f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkGreen = {{{0.f, 0.127437726f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkKhaki = { + {{0.508881450f, 0.473531544f, 0.147027299f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkMagenta = { + {{0.258182913f, 0.f, 0.258182913f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkOliveGreen = { + {{0.090841733f, 0.147027299f, 0.028426038f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkOrange = {{{1.f, 0.262250721f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkOrchid = { + {{0.318546832f, 0.031896040f, 0.603827536f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkRed = {{{0.258182913f, 0.f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkSalmon = { + {{0.814846814f, 0.304987371f, 0.194617867f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkSeaGreen = { + {{0.274677366f, 0.502886593f, 0.258182913f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkSlateBlue = { + {{0.064803280f, 0.046665095f, 0.258182913f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkSlateGray = { + {{0.028426038f, 0.078187428f, 0.078187428f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkTurquoise = { + {{0.f, 0.617206752f, 0.637597024f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DarkViolet = { + {{0.296138316f, 0.f, 0.651405811f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DeepPink = {{{1.f, 0.006995410f, 0.291770697f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DeepSkyBlue = {{{0.f, 0.520995677f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DimGray = { + {{0.141263321f, 0.141263321f, 0.141263321f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 DodgerBlue = { + {{0.012983031f, 0.278894335f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Firebrick = { + {{0.445201248f, 0.015996292f, 0.015996292f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 FloralWhite = { + {{1.f, 0.955973506f, 0.871367335f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 ForestGreen = { + {{0.015996292f, 0.258182913f, 0.015996292f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Fuchsia = {{{1.f, 0.f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Gainsboro = { + {{0.715693772f, 0.715693772f, 0.715693772f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 GhostWhite = { + {{0.938685894f, 0.938685894f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Gold = {{{1.f, 0.679542601f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Goldenrod = { + {{0.701102138f, 0.376262218f, 0.014443844f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Gray = { + {{0.215860531f, 0.215860531f, 0.215860531f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Green = {{{0.f, 0.215860531f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 GreenYellow = { + {{0.417885154f, 1.f, 0.028426038f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Honeydew = {{{0.871367335f, 1.f, 0.871367335f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 HotPink = {{{1.f, 0.141263321f, 0.456411064f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 IndianRed = { + {{0.610495746f, 0.107023112f, 0.107023112f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Indigo = {{{0.070360109f, 0.f, 0.223227978f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Ivory = {{{1.f, 1.f, 0.871367335f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Khaki = { + {{0.871367335f, 0.791298151f, 0.262250721f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Lavender = { + {{0.791298151f, 0.791298151f, 0.955973506f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LavenderBlush = { + {{1.f, 0.871367335f, 0.913098991f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LawnGreen = { + {{0.201556295f, 0.973445475f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LemonChiffon = { + {{1.f, 0.955973506f, 0.610495746f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightBlue = { + {{0.417885154f, 0.686685443f, 0.791298151f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightCoral = { + {{0.871367335f, 0.215860531f, 0.215860531f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightCyan = {{{0.745404482f, 1.f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightGoldenrodYellow = { + {{0.955973506f, 0.955973506f, 0.644479871f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightGray = { + {{0.651405811f, 0.651405811f, 0.651405811f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightGreen = { + {{0.278894335f, 0.854992807f, 0.278894335f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightPink = { + {{1.f, 0.467783839f, 0.533276618f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightSalmon = { + {{1.f, 0.351532698f, 0.194617867f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightSeaGreen = { + {{0.014443844f, 0.445201248f, 0.401977867f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightSkyBlue = { + {{0.242281199f, 0.617206752f, 0.955973506f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightSlateGray = { + {{0.184475034f, 0.246201396f, 0.318546832f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightSteelBlue = { + {{0.434153706f, 0.552011609f, 0.730461001f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LightYellow = {{{1.f, 1.f, 0.745404482f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Lime = {{{0.f, 1.f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 LimeGreen = { + {{0.031896040f, 0.610495746f, 0.031896040f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Linen = { + {{0.955973506f, 0.871367335f, 0.791298151f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Magenta = {{{1.f, 0.f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Maroon = {{{0.215860531f, 0.f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MediumAquamarine = { + {{0.132868364f, 0.610495746f, 0.401977867f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MediumBlue = {{{0.f, 0.f, 0.610495746f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MediumOrchid = { + {{0.491020888f, 0.090841733f, 0.651405811f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MediumPurple = { + {{0.291770697f, 0.162029430f, 0.708376050f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MediumSeaGreen = { + {{0.045186214f, 0.450785846f, 0.165132239f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MediumSlateBlue = { + {{0.198069349f, 0.138431653f, 0.854992807f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MediumSpringGreen = { + {{0.f, 0.955973506f, 0.323143244f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MediumTurquoise = { + {{0.064803280f, 0.637597024f, 0.603827536f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MediumVioletRed = { + {{0.571125031f, 0.007499032f, 0.234550655f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MidnightBlue = { + {{0.009721218f, 0.009721218f, 0.162029430f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MintCream = { + {{0.913098991f, 1.f, 0.955973506f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 MistyRose = { + {{1.f, 0.775822461f, 0.752942443f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Moccasin = {{{1.f, 0.775822461f, 0.462077051f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 NavajoWhite = { + {{1.f, 0.730461001f, 0.417885154f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Navy = {{{0.f, 0.f, 0.215860531f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 OldLace = { + {{0.982250869f, 0.913098991f, 0.791298151f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Olive = {{{0.215860531f, 0.215860531f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 OliveDrab = { + {{0.147027299f, 0.270497859f, 0.016807375f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Orange = {{{1.f, 0.376262218f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 OrangeRed = {{{1.f, 0.059511241f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Orchid = { + {{0.701102138f, 0.162029430f, 0.672443330f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 PaleGoldenrod = { + {{0.854992807f, 0.806952477f, 0.401977867f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 PaleGreen = { + {{0.313988745f, 0.964686573f, 0.313988745f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 PaleTurquoise = { + {{0.428690553f, 0.854992807f, 0.854992807f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 PaleVioletRed = { + {{0.708376050f, 0.162029430f, 0.291770697f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 PapayaWhip = { + {{1.f, 0.863157392f, 0.665387452f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 PeachPuff = { + {{1.f, 0.701102138f, 0.485149980f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Peru = { + {{0.610495746f, 0.234550655f, 0.049706575f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Pink = {{{1.f, 0.527115345f, 0.597202003f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Plum = { + {{0.723055363f, 0.351532698f, 0.723055363f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 PowderBlue = { + {{0.434153706f, 0.745404482f, 0.791298151f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Purple = {{{0.215860531f, 0.f, 0.215860531f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Red = {{{1.f, 0.f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 RosyBrown = { + {{0.502886593f, 0.274677366f, 0.274677366f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 RoyalBlue = { + {{0.052860655f, 0.141263321f, 0.752942443f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 SaddleBrown = { + {{0.258182913f, 0.059511241f, 0.006512091f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Salmon = { + {{0.955973506f, 0.215860531f, 0.168269455f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 SandyBrown = { + {{0.904661357f, 0.371237785f, 0.116970696f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 SeaGreen = { + {{0.027320892f, 0.258182913f, 0.095307484f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 SeaShell = {{{1.f, 0.913098991f, 0.854992807f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Sienna = { + {{0.351532698f, 0.084376216f, 0.026241222f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Silver = { + {{0.527115345f, 0.527115345f, 0.527115345f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 SkyBlue = { + {{0.242281199f, 0.617206752f, 0.830770075f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 SlateBlue = { + {{0.144128501f, 0.102241747f, 0.610495746f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 SlateGray = { + {{0.162029430f, 0.215860531f, 0.278894335f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Snow = {{{1.f, 0.955973506f, 0.955973506f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 SpringGreen = {{{0.f, 1.f, 0.212230787f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 SteelBlue = { + {{0.061246071f, 0.223227978f, 0.456411064f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Tan = { + {{0.644479871f, 0.456411064f, 0.262250721f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Teal = {{{0.f, 0.215860531f, 0.215860531f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Thistle = { + {{0.686685443f, 0.520995677f, 0.686685443f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Tomato = {{{1.f, 0.124771863f, 0.063010029f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Transparent = {{{0.f, 0.f, 0.f, 0.f}}}; +XMGLOBALCONST XMVECTORF32 Turquoise = { + {{0.051269468f, 0.745404482f, 0.630757332f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Violet = { + {{0.854992807f, 0.223227978f, 0.854992807f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Wheat = { + {{0.913098991f, 0.730461001f, 0.450785846f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 White = {{{1.f, 1.f, 1.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 WhiteSmoke = { + {{0.913098991f, 0.913098991f, 0.913098991f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 Yellow = {{{1.f, 1.f, 0.f, 1.f}}}; +XMGLOBALCONST XMVECTORF32 YellowGreen = { + {{0.323143244f, 0.610495746f, 0.031896040f, 1.f}}}; + +} // namespace ColorsLinear + +} // namespace DirectX diff --git a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXMath.h b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXMath.h similarity index 97% rename from Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXMath.h rename to Minecraft.Client/Linux/Stubs/DirectXMath/DirectXMath.h index 68711f406..0d5ebecec 100644 --- a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXMath.h +++ b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXMath.h @@ -1,3091 +1,3091 @@ -//------------------------------------------------------------------------------------- -// DirectXMath.h -- SIMD C++ Math library -// -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. -// -// http://go.microsoft.com/fwlink/?LinkID=615560 -//------------------------------------------------------------------------------------- - -#pragma once - -#ifndef __cplusplus -#error DirectX Math requires C++ -#endif - -#define DIRECTX_MATH_VERSION 320 - -#if defined(_MSC_VER) && (_MSC_VER < 1910) -#error DirectX Math requires Visual C++ 2017 or later. -#endif - -#if defined(_MSC_VER) && !defined(_M_ARM) && !defined(_M_ARM64) && \ - !defined(_M_HYBRID_X86_ARM64) && !defined(_M_ARM64EC) && (!_MANAGED) && \ - (!_M_CEE) && (!defined(_M_IX86_FP) || (_M_IX86_FP > 1)) && \ - !defined(_XM_NO_INTRINSICS_) && !defined(_XM_VECTORCALL_) -#define _XM_VECTORCALL_ 1 -#endif - -#if _XM_VECTORCALL_ -#define XM_CALLCONV __vectorcall -#elif defined(__GNUC__) -#define XM_CALLCONV -#else -#define XM_CALLCONV __fastcall -#endif - -#ifndef XM_DEPRECATED -#if (__cplusplus >= 201402L) -#define XM_DEPRECATED [[deprecated]] -#elif defined(__GNUC__) -#define XM_DEPRECATED __attribute__((deprecated)) -#else -#define XM_DEPRECATED \ - __declspec(deprecated( \ - "This is deprecated and will be removed in a future version.")) -#endif -#endif - -#if !defined(_XM_AVX2_INTRINSICS_) && defined(__AVX2__) && \ - !defined(_XM_NO_INTRINSICS_) -#define _XM_AVX2_INTRINSICS_ -#endif - -#if !defined(_XM_FMA3_INTRINSICS_) && defined(_XM_AVX2_INTRINSICS_) && \ - !defined(_XM_NO_INTRINSICS_) -#define _XM_FMA3_INTRINSICS_ -#endif - -#if !defined(_XM_F16C_INTRINSICS_) && defined(_XM_AVX2_INTRINSICS_) && \ - !defined(_XM_NO_INTRINSICS_) -#define _XM_F16C_INTRINSICS_ -#endif - -#if !defined(_XM_F16C_INTRINSICS_) && defined(__F16C__) && \ - !defined(_XM_NO_INTRINSICS_) -#define _XM_F16C_INTRINSICS_ -#endif - -#if defined(_XM_FMA3_INTRINSICS_) && !defined(_XM_AVX_INTRINSICS_) -#define _XM_AVX_INTRINSICS_ -#endif - -#if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_AVX_INTRINSICS_) -#define _XM_AVX_INTRINSICS_ -#endif - -#if !defined(_XM_AVX_INTRINSICS_) && defined(__AVX__) && \ - !defined(_XM_NO_INTRINSICS_) -#define _XM_AVX_INTRINSICS_ -#endif - -#if defined(_XM_AVX_INTRINSICS_) && !defined(_XM_SSE4_INTRINSICS_) -#define _XM_SSE4_INTRINSICS_ -#endif - -#if defined(_XM_SSE4_INTRINSICS_) && !defined(_XM_SSE3_INTRINSICS_) -#define _XM_SSE3_INTRINSICS_ -#endif - -#if defined(_XM_SSE3_INTRINSICS_) && !defined(_XM_SSE_INTRINSICS_) -#define _XM_SSE_INTRINSICS_ -#endif - -#if !defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_SSE_INTRINSICS_) && \ - !defined(_XM_NO_INTRINSICS_) -#if (defined(_M_IX86) || defined(_M_X64) || __i386__ || __x86_64__) && \ - !defined(_M_HYBRID_X86_ARM64) && !defined(_M_ARM64EC) -#define _XM_SSE_INTRINSICS_ -#elif defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || \ - defined(_M_ARM64EC) || __arm__ || __aarch64__ -#define _XM_ARM_NEON_INTRINSICS_ -#elif !defined(_XM_NO_INTRINSICS_) -#error DirectX Math does not support this target -#endif -#endif // !_XM_ARM_NEON_INTRINSICS_ && !_XM_SSE_INTRINSICS_ && - // !_XM_NO_INTRINSICS_ - -#if defined(_XM_SSE_INTRINSICS_) && defined(_MSC_VER) && (_MSC_VER >= 1920) && \ - !defined(__clang__) && !defined(_XM_SVML_INTRINSICS_) && \ - !defined(_XM_DISABLE_INTEL_SVML_) -#define _XM_SVML_INTRINSICS_ -#endif - -#if !defined(_XM_NO_XMVECTOR_OVERLOADS_) && \ - (defined(__clang__) || defined(__GNUC__)) && !defined(_XM_NO_INTRINSICS_) -#define _XM_NO_XMVECTOR_OVERLOADS_ -#endif - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4514 4820) -// C4514/4820: Off by default noise -#endif -#include -#include -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#ifndef _XM_NO_INTRINSICS_ - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4987) -// C4987: Off by default noise -#endif -#if defined(_MSC_VER) || defined(__MINGW32__) -#include -#endif -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#if (defined(__clang__) || defined(__GNUC__)) && (__x86_64__ || __i386__) && \ - !defined(__MINGW32__) -#include -#endif - -#ifdef _XM_SSE_INTRINSICS_ -#include -#include - -#ifdef _XM_SSE3_INTRINSICS_ -#include -#endif - -#ifdef _XM_SSE4_INTRINSICS_ -#include -#endif - -#ifdef _XM_AVX_INTRINSICS_ -#include -#endif - -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_MSC_VER) && !defined(__clang__) && \ - (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC)) -#include -#else -#include -#endif -#endif -#endif // !_XM_NO_INTRINSICS_ - -#include "sal.h" -#include - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4005 4668) -// C4005/4668: Old header issue -#endif -#include -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#if (__cplusplus >= 201703L) -#define XM_ALIGNED_DATA(x) alignas(x) -#define XM_ALIGNED_STRUCT(x) struct alignas(x) -#elif defined(__GNUC__) -#define XM_ALIGNED_DATA(x) __attribute__((aligned(x))) -#define XM_ALIGNED_STRUCT(x) struct __attribute__((aligned(x))) -#else -#define XM_ALIGNED_DATA(x) __declspec(align(x)) -#define XM_ALIGNED_STRUCT(x) __declspec(align(x)) struct -#endif - -#if (__cplusplus >= 202002L) -#include -#endif - -/**************************************************************************** - * - * Conditional intrinsics - * - ****************************************************************************/ - -#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - -#if defined(_XM_NO_MOVNT_) -#define XM_STREAM_PS(p, a) _mm_store_ps((p), (a)) -#define XM256_STREAM_PS(p, a) _mm256_store_ps((p), (a)) -#define XM_SFENCE() -#else -#define XM_STREAM_PS(p, a) _mm_stream_ps((p), (a)) -#define XM256_STREAM_PS(p, a) _mm256_stream_ps((p), (a)) -#define XM_SFENCE() _mm_sfence() -#endif - -#if defined(_XM_FMA3_INTRINSICS_) -#define XM_FMADD_PS(a, b, c) _mm_fmadd_ps((a), (b), (c)) -#define XM_FNMADD_PS(a, b, c) _mm_fnmadd_ps((a), (b), (c)) -#else -#define XM_FMADD_PS(a, b, c) _mm_add_ps(_mm_mul_ps((a), (b)), (c)) -#define XM_FNMADD_PS(a, b, c) _mm_sub_ps((c), _mm_mul_ps((a), (b))) -#endif - -#if defined(_XM_AVX_INTRINSICS_) && defined(_XM_FAVOR_INTEL_) -#define XM_PERMUTE_PS(v, c) _mm_permute_ps((v), c) -#else -#define XM_PERMUTE_PS(v, c) _mm_shuffle_ps((v), (v), c) -#endif - -#if defined(__GNUC__) && !defined(__clang__) && (__GNUC__ < 11) -#define XM_LOADU_SI16(p) \ - _mm_cvtsi32_si128(*reinterpret_cast(p)) -#else -#define XM_LOADU_SI16(p) _mm_loadu_si16(p) -#endif - -#endif // _XM_SSE_INTRINSICS_ && !_XM_NO_INTRINSICS_ - -#if defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - -#if defined(__clang__) || defined(__GNUC__) -#define XM_PREFETCH(a) __builtin_prefetch(a) -#elif defined(_MSC_VER) -#define XM_PREFETCH(a) __prefetch(a) -#else -#define XM_PREFETCH(a) -#endif - -#endif // _XM_ARM_NEON_INTRINSICS_ && !_XM_NO_INTRINSICS_ - -namespace DirectX { - -/**************************************************************************** - * - * Constant definitions - * - ****************************************************************************/ - -#if defined(__XNAMATH_H__) && defined(XM_PI) -#undef XM_PI -#undef XM_2PI -#undef XM_1DIVPI -#undef XM_1DIV2PI -#undef XM_PIDIV2 -#undef XM_PIDIV4 -#undef XM_SELECT_0 -#undef XM_SELECT_1 -#undef XM_PERMUTE_0X -#undef XM_PERMUTE_0Y -#undef XM_PERMUTE_0Z -#undef XM_PERMUTE_0W -#undef XM_PERMUTE_1X -#undef XM_PERMUTE_1Y -#undef XM_PERMUTE_1Z -#undef XM_PERMUTE_1W -#undef XM_CRMASK_CR6 -#undef XM_CRMASK_CR6TRUE -#undef XM_CRMASK_CR6FALSE -#undef XM_CRMASK_CR6BOUNDS -#undef XM_CACHE_LINE_SIZE -#endif - -constexpr float XM_PI = 3.141592654f; -constexpr float XM_2PI = 6.283185307f; -constexpr float XM_1DIVPI = 0.318309886f; -constexpr float XM_1DIV2PI = 0.159154943f; -constexpr float XM_PIDIV2 = 1.570796327f; -constexpr float XM_PIDIV4 = 0.785398163f; - -constexpr uint32_t XM_SELECT_0 = 0x00000000; -constexpr uint32_t XM_SELECT_1 = 0xFFFFFFFF; - -constexpr uint32_t XM_PERMUTE_0X = 0; -constexpr uint32_t XM_PERMUTE_0Y = 1; -constexpr uint32_t XM_PERMUTE_0Z = 2; -constexpr uint32_t XM_PERMUTE_0W = 3; -constexpr uint32_t XM_PERMUTE_1X = 4; -constexpr uint32_t XM_PERMUTE_1Y = 5; -constexpr uint32_t XM_PERMUTE_1Z = 6; -constexpr uint32_t XM_PERMUTE_1W = 7; - -constexpr uint32_t XM_SWIZZLE_X = 0; -constexpr uint32_t XM_SWIZZLE_Y = 1; -constexpr uint32_t XM_SWIZZLE_Z = 2; -constexpr uint32_t XM_SWIZZLE_W = 3; - -constexpr uint32_t XM_CRMASK_CR6 = 0x000000F0; -constexpr uint32_t XM_CRMASK_CR6TRUE = 0x00000080; -constexpr uint32_t XM_CRMASK_CR6FALSE = 0x00000020; -constexpr uint32_t XM_CRMASK_CR6BOUNDS = XM_CRMASK_CR6FALSE; - -#if defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || \ - defined(_M_ARM64EC) || __arm__ || __aarch64__ -constexpr size_t XM_CACHE_LINE_SIZE = 128; -#else -constexpr size_t XM_CACHE_LINE_SIZE = 64; -#endif - -/**************************************************************************** - * - * Macros - * - ****************************************************************************/ - -#if defined(__XNAMATH_H__) && defined(XMComparisonAllTrue) -#undef XMComparisonAllTrue -#undef XMComparisonAnyTrue -#undef XMComparisonAllFalse -#undef XMComparisonAnyFalse -#undef XMComparisonMixed -#undef XMComparisonAllInBounds -#undef XMComparisonAnyOutOfBounds -#endif - -// Unit conversion - -constexpr float XMConvertToRadians(float fDegrees) noexcept { - return fDegrees * (XM_PI / 180.0f); -} -constexpr float XMConvertToDegrees(float fRadians) noexcept { - return fRadians * (180.0f / XM_PI); -} - -// Condition register evaluation proceeding a recording (R) comparison - -constexpr bool XMComparisonAllTrue(uint32_t CR) noexcept { - return (CR & XM_CRMASK_CR6TRUE) == XM_CRMASK_CR6TRUE; -} -constexpr bool XMComparisonAnyTrue(uint32_t CR) noexcept { - return (CR & XM_CRMASK_CR6FALSE) != XM_CRMASK_CR6FALSE; -} -constexpr bool XMComparisonAllFalse(uint32_t CR) noexcept { - return (CR & XM_CRMASK_CR6FALSE) == XM_CRMASK_CR6FALSE; -} -constexpr bool XMComparisonAnyFalse(uint32_t CR) noexcept { - return (CR & XM_CRMASK_CR6TRUE) != XM_CRMASK_CR6TRUE; -} -constexpr bool XMComparisonMixed(uint32_t CR) noexcept { - return (CR & XM_CRMASK_CR6) == 0; -} -constexpr bool XMComparisonAllInBounds(uint32_t CR) noexcept { - return (CR & XM_CRMASK_CR6BOUNDS) == XM_CRMASK_CR6BOUNDS; -} -constexpr bool XMComparisonAnyOutOfBounds(uint32_t CR) noexcept { - return (CR & XM_CRMASK_CR6BOUNDS) != XM_CRMASK_CR6BOUNDS; -} - -/**************************************************************************** - * - * Data types - * - ****************************************************************************/ - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4068 4201 4365 4324 4820) -// C4068: ignore unknown pragmas -// C4201: nonstandard extension used : nameless struct/union -// C4365: Off by default noise -// C4324/4820: padding warnings -#endif - -#ifdef _PREFAST_ -#pragma prefast(push) -#pragma prefast(disable : 25000, "FXMVECTOR is 16 bytes") -#endif - -//------------------------------------------------------------------------------ -#if defined(_XM_NO_INTRINSICS_) -struct __vector4 { - union { - float vector4_f32[4]; - uint32_t vector4_u32[4]; - }; -}; -#endif // _XM_NO_INTRINSICS_ - -//------------------------------------------------------------------------------ -// Vector intrinsic: Four 32 bit floating point components aligned on a 16 byte -// boundary and mapped to hardware vector registers -#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) -using XMVECTOR = __m128; -#elif defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) -using XMVECTOR = float32x4_t; -#else -using XMVECTOR = __vector4; -#endif - -// Fix-up for (1st-3rd) XMVECTOR parameters that are pass-in-register for x86, -// ARM, ARM64, and vector call; by reference otherwise -#if (defined(_M_IX86) || defined(_M_ARM) || defined(_M_ARM64) || \ - _XM_VECTORCALL_ || __i386__ || __arm__ || __aarch64__) && \ - !defined(_XM_NO_INTRINSICS_) -typedef const XMVECTOR FXMVECTOR; -#else -typedef const XMVECTOR& FXMVECTOR; -#endif - -// Fix-up for (4th) XMVECTOR parameter to pass in-register for ARM, ARM64, and -// vector call; by reference otherwise -#if (defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || \ - defined(_M_ARM64EC) || _XM_VECTORCALL_ || __arm__ || __aarch64__) && \ - !defined(_XM_NO_INTRINSICS_) -typedef const XMVECTOR GXMVECTOR; -#else -typedef const XMVECTOR& GXMVECTOR; -#endif - -// Fix-up for (5th & 6th) XMVECTOR parameter to pass in-register for ARM64 and -// vector call; by reference otherwise -#if (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || \ - defined(_M_ARM64EC) || _XM_VECTORCALL_ || __aarch64__) && \ - !defined(_XM_NO_INTRINSICS_) -typedef const XMVECTOR HXMVECTOR; -#else -typedef const XMVECTOR& HXMVECTOR; -#endif - -// Fix-up for (7th+) XMVECTOR parameters to pass by reference -typedef const XMVECTOR& CXMVECTOR; - -//------------------------------------------------------------------------------ -// Conversion types for constants -XM_ALIGNED_STRUCT(16) XMVECTORF32 { - union { - float f[4]; - XMVECTOR v; - }; - - inline operator XMVECTOR() const noexcept { return v; } - inline operator const float*() const noexcept { return f; } -#ifdef _XM_NO_INTRINSICS_ -#elif defined(_XM_SSE_INTRINSICS_) - inline operator __m128i() const noexcept { return _mm_castps_si128(v); } - inline operator __m128d() const noexcept { return _mm_castps_pd(v); } -#elif defined(_XM_ARM_NEON_INTRINSICS_) && \ - (defined(__GNUC__) || defined(_ARM64_DISTINCT_NEON_TYPES)) - inline operator int32x4_t() const noexcept { - return vreinterpretq_s32_f32(v); - } - inline operator uint32x4_t() const noexcept { - return vreinterpretq_u32_f32(v); - } -#endif -}; - -XM_ALIGNED_STRUCT(16) XMVECTORI32 { - union { - int32_t i[4]; - XMVECTOR v; - }; - - inline operator XMVECTOR() const noexcept { return v; } -#ifdef _XM_NO_INTRINSICS_ -#elif defined(_XM_SSE_INTRINSICS_) - inline operator __m128i() const noexcept { return _mm_castps_si128(v); } - inline operator __m128d() const noexcept { return _mm_castps_pd(v); } -#elif defined(_XM_ARM_NEON_INTRINSICS_) && \ - (defined(__GNUC__) || defined(_ARM64_DISTINCT_NEON_TYPES)) - inline operator int32x4_t() const noexcept { - return vreinterpretq_s32_f32(v); - } - inline operator uint32x4_t() const noexcept { - return vreinterpretq_u32_f32(v); - } -#endif -}; - -XM_ALIGNED_STRUCT(16) XMVECTORU8 { - union { - uint8_t u[16]; - XMVECTOR v; - }; - - inline operator XMVECTOR() const noexcept { return v; } -#ifdef _XM_NO_INTRINSICS_ -#elif defined(_XM_SSE_INTRINSICS_) - inline operator __m128i() const noexcept { return _mm_castps_si128(v); } - inline operator __m128d() const noexcept { return _mm_castps_pd(v); } -#elif defined(_XM_ARM_NEON_INTRINSICS_) && \ - (defined(__GNUC__) || defined(_ARM64_DISTINCT_NEON_TYPES)) - inline operator int32x4_t() const noexcept { - return vreinterpretq_s32_f32(v); - } - inline operator uint32x4_t() const noexcept { - return vreinterpretq_u32_f32(v); - } -#endif -}; - -XM_ALIGNED_STRUCT(16) XMVECTORU32 { - union { - uint32_t u[4]; - XMVECTOR v; - }; - - inline operator XMVECTOR() const noexcept { return v; } -#ifdef _XM_NO_INTRINSICS_ -#elif defined(_XM_SSE_INTRINSICS_) - inline operator __m128i() const noexcept { return _mm_castps_si128(v); } - inline operator __m128d() const noexcept { return _mm_castps_pd(v); } -#elif defined(_XM_ARM_NEON_INTRINSICS_) && \ - (defined(__GNUC__) || defined(_ARM64_DISTINCT_NEON_TYPES)) - inline operator int32x4_t() const noexcept { - return vreinterpretq_s32_f32(v); - } - inline operator uint32x4_t() const noexcept { - return vreinterpretq_u32_f32(v); - } -#endif -}; - -//------------------------------------------------------------------------------ -// Vector operators - -#ifndef _XM_NO_XMVECTOR_OVERLOADS_ -XMVECTOR XM_CALLCONV operator+(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV operator-(FXMVECTOR V) noexcept; - -XMVECTOR& XM_CALLCONV operator+=(XMVECTOR& V1, FXMVECTOR V2) noexcept; -XMVECTOR& XM_CALLCONV operator-=(XMVECTOR& V1, FXMVECTOR V2) noexcept; -XMVECTOR& XM_CALLCONV operator*=(XMVECTOR& V1, FXMVECTOR V2) noexcept; -XMVECTOR& XM_CALLCONV operator/=(XMVECTOR& V1, FXMVECTOR V2) noexcept; - -XMVECTOR& operator*=(XMVECTOR& V, float S) noexcept; -XMVECTOR& operator/=(XMVECTOR& V, float S) noexcept; - -XMVECTOR XM_CALLCONV operator+(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV operator-(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV operator*(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV operator/(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV operator*(FXMVECTOR V, float S) noexcept; -XMVECTOR XM_CALLCONV operator*(float S, FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV operator/(FXMVECTOR V, float S) noexcept; -#endif /* !_XM_NO_XMVECTOR_OVERLOADS_ */ - -//------------------------------------------------------------------------------ -// Matrix type: Sixteen 32 bit floating point components aligned on a -// 16 byte boundary and mapped to four hardware vector registers - -struct XMMATRIX; - -// Fix-up for (1st) XMMATRIX parameter to pass in-register for ARM64 and vector -// call; by reference otherwise -#if (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || \ - defined(_M_ARM64EC) || _XM_VECTORCALL_ || __aarch64__) && \ - !defined(_XM_NO_INTRINSICS_) -typedef const XMMATRIX FXMMATRIX; -#else -typedef const XMMATRIX& FXMMATRIX; -#endif - -// Fix-up for (2nd+) XMMATRIX parameters to pass by reference -typedef const XMMATRIX& CXMMATRIX; - -#ifdef _XM_NO_INTRINSICS_ -struct XMMATRIX -#else -XM_ALIGNED_STRUCT(16) -XMMATRIX -#endif -{ -#ifdef _XM_NO_INTRINSICS_ - union { - XMVECTOR r[4]; - struct { - float _11, _12, _13, _14; - float _21, _22, _23, _24; - float _31, _32, _33, _34; - float _41, _42, _43, _44; - }; - float m[4][4]; - }; -#else - XMVECTOR r[4]; -#endif - - XMMATRIX() = default; - - XMMATRIX(const XMMATRIX&) = default; - -#if defined(_MSC_VER) && (_MSC_FULL_VER < 191426431) - XMMATRIX& operator=(const XMMATRIX& M) noexcept { - r[0] = M.r[0]; - r[1] = M.r[1]; - r[2] = M.r[2]; - r[3] = M.r[3]; - return *this; - } -#else - XMMATRIX& operator=(const XMMATRIX&) = default; - - XMMATRIX(XMMATRIX&&) = default; - XMMATRIX& operator=(XMMATRIX&&) = default; -#endif - - constexpr XMMATRIX(FXMVECTOR R0, FXMVECTOR R1, FXMVECTOR R2, - CXMVECTOR R3) noexcept - : r{R0, R1, R2, R3} {} - XMMATRIX(float m00, float m01, float m02, float m03, float m10, float m11, - float m12, float m13, float m20, float m21, float m22, float m23, - float m30, float m31, float m32, float m33) noexcept; - explicit XMMATRIX(_In_reads_(16) const float* pArray) noexcept; - -#ifdef _XM_NO_INTRINSICS_ - float operator()(size_t Row, size_t Column) const noexcept { - return m[Row][Column]; - } - float& operator()(size_t Row, size_t Column) noexcept { - return m[Row][Column]; - } -#endif - - XMMATRIX operator+() const noexcept { return *this; } - XMMATRIX operator-() const noexcept; - - XMMATRIX& XM_CALLCONV operator+=(FXMMATRIX M) noexcept; - XMMATRIX& XM_CALLCONV operator-=(FXMMATRIX M) noexcept; - XMMATRIX& XM_CALLCONV operator*=(FXMMATRIX M) noexcept; - XMMATRIX& operator*=(float S) noexcept; - XMMATRIX& operator/=(float S) noexcept; - - XMMATRIX XM_CALLCONV operator+(FXMMATRIX M) const noexcept; - XMMATRIX XM_CALLCONV operator-(FXMMATRIX M) const noexcept; - XMMATRIX XM_CALLCONV operator*(FXMMATRIX M) const noexcept; - XMMATRIX operator*(float S) const noexcept; - XMMATRIX operator/(float S) const noexcept; - - friend XMMATRIX XM_CALLCONV operator*(float S, FXMMATRIX M) noexcept; -}; - -//------------------------------------------------------------------------------ -// 2D Vector; 32 bit floating point components -struct XMFLOAT2 { - float x; - float y; - - XMFLOAT2() = default; - - XMFLOAT2(const XMFLOAT2&) = default; - XMFLOAT2& operator=(const XMFLOAT2&) = default; - - XMFLOAT2(XMFLOAT2&&) = default; - XMFLOAT2& operator=(XMFLOAT2&&) = default; - - constexpr XMFLOAT2(float _x, float _y) noexcept : x(_x), y(_y) {} - explicit XMFLOAT2(_In_reads_(2) const float* pArray) noexcept - : x(pArray[0]), y(pArray[1]) {} - -#if (__cplusplus >= 202002L) - bool operator==(const XMFLOAT2&) const = default; - auto operator<=>(const XMFLOAT2&) const = default; -#endif -}; - -// 2D Vector; 32 bit floating point components aligned on a 16 byte boundary -XM_ALIGNED_STRUCT(16) XMFLOAT2A : public XMFLOAT2 { using XMFLOAT2::XMFLOAT2; }; - -//------------------------------------------------------------------------------ -// 2D Vector; 32 bit signed integer components -struct XMINT2 { - int32_t x; - int32_t y; - - XMINT2() = default; - - XMINT2(const XMINT2&) = default; - XMINT2& operator=(const XMINT2&) = default; - - XMINT2(XMINT2&&) = default; - XMINT2& operator=(XMINT2&&) = default; - - constexpr XMINT2(int32_t _x, int32_t _y) noexcept : x(_x), y(_y) {} - explicit XMINT2(_In_reads_(2) const int32_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]) {} - -#if (__cplusplus >= 202002L) - bool operator==(const XMINT2&) const = default; - auto operator<=>(const XMINT2&) const = default; -#endif -}; - -// 2D Vector; 32 bit unsigned integer components -struct XMUINT2 { - uint32_t x; - uint32_t y; - - XMUINT2() = default; - - XMUINT2(const XMUINT2&) = default; - XMUINT2& operator=(const XMUINT2&) = default; - - XMUINT2(XMUINT2&&) = default; - XMUINT2& operator=(XMUINT2&&) = default; - - constexpr XMUINT2(uint32_t _x, uint32_t _y) noexcept : x(_x), y(_y) {} - explicit XMUINT2(_In_reads_(2) const uint32_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]) {} - -#if (__cplusplus >= 202002L) - bool operator==(const XMUINT2&) const = default; - auto operator<=>(const XMUINT2&) const = default; -#endif -}; - -//------------------------------------------------------------------------------ -// 3D Vector; 32 bit floating point components -struct XMFLOAT3 { - float x; - float y; - float z; - - XMFLOAT3() = default; - - XMFLOAT3(const XMFLOAT3&) = default; - XMFLOAT3& operator=(const XMFLOAT3&) = default; - - XMFLOAT3(XMFLOAT3&&) = default; - XMFLOAT3& operator=(XMFLOAT3&&) = default; - - constexpr XMFLOAT3(float _x, float _y, float _z) noexcept - : x(_x), y(_y), z(_z) {} - explicit XMFLOAT3(_In_reads_(3) const float* pArray) noexcept - : x(pArray[0]), y(pArray[1]), z(pArray[2]) {} -}; - -// 3D Vector; 32 bit floating point components aligned on a 16 byte boundary -XM_ALIGNED_STRUCT(16) XMFLOAT3A : public XMFLOAT3 { using XMFLOAT3::XMFLOAT3; }; - -//------------------------------------------------------------------------------ -// 3D Vector; 32 bit signed integer components -struct XMINT3 { - int32_t x; - int32_t y; - int32_t z; - - XMINT3() = default; - - XMINT3(const XMINT3&) = default; - XMINT3& operator=(const XMINT3&) = default; - - XMINT3(XMINT3&&) = default; - XMINT3& operator=(XMINT3&&) = default; - - constexpr XMINT3(int32_t _x, int32_t _y, int32_t _z) noexcept - : x(_x), y(_y), z(_z) {} - explicit XMINT3(_In_reads_(3) const int32_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]), z(pArray[2]) {} - -#if (__cplusplus >= 202002L) - bool operator==(const XMINT3&) const = default; - auto operator<=>(const XMINT3&) const = default; -#endif -}; - -// 3D Vector; 32 bit unsigned integer components -struct XMUINT3 { - uint32_t x; - uint32_t y; - uint32_t z; - - XMUINT3() = default; - - XMUINT3(const XMUINT3&) = default; - XMUINT3& operator=(const XMUINT3&) = default; - - XMUINT3(XMUINT3&&) = default; - XMUINT3& operator=(XMUINT3&&) = default; - - constexpr XMUINT3(uint32_t _x, uint32_t _y, uint32_t _z) noexcept - : x(_x), y(_y), z(_z) {} - explicit XMUINT3(_In_reads_(3) const uint32_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]), z(pArray[2]) {} - -#if (__cplusplus >= 202002L) - bool operator==(const XMUINT3&) const = default; - auto operator<=>(const XMUINT3&) const = default; -#endif -}; - -//------------------------------------------------------------------------------ -// 4D Vector; 32 bit floating point components -struct XMFLOAT4 { - float x; - float y; - float z; - float w; - - XMFLOAT4() = default; - - XMFLOAT4(const XMFLOAT4&) = default; - XMFLOAT4& operator=(const XMFLOAT4&) = default; - - XMFLOAT4(XMFLOAT4&&) = default; - XMFLOAT4& operator=(XMFLOAT4&&) = default; - - constexpr XMFLOAT4(float _x, float _y, float _z, float _w) noexcept - : x(_x), y(_y), z(_z), w(_w) {} - explicit XMFLOAT4(_In_reads_(4) const float* pArray) noexcept - : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} - -#if (__cplusplus >= 202002L) - bool operator==(const XMFLOAT4&) const = default; - auto operator<=>(const XMFLOAT4&) const = default; -#endif -}; - -// 4D Vector; 32 bit floating point components aligned on a 16 byte boundary -XM_ALIGNED_STRUCT(16) XMFLOAT4A : public XMFLOAT4 { using XMFLOAT4::XMFLOAT4; }; - -//------------------------------------------------------------------------------ -// 4D Vector; 32 bit signed integer components -struct XMINT4 { - int32_t x; - int32_t y; - int32_t z; - int32_t w; - - XMINT4() = default; - - XMINT4(const XMINT4&) = default; - XMINT4& operator=(const XMINT4&) = default; - - XMINT4(XMINT4&&) = default; - XMINT4& operator=(XMINT4&&) = default; - - constexpr XMINT4(int32_t _x, int32_t _y, int32_t _z, int32_t _w) noexcept - : x(_x), y(_y), z(_z), w(_w) {} - explicit XMINT4(_In_reads_(4) const int32_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} - -#if (__cplusplus >= 202002L) - bool operator==(const XMINT4&) const = default; - auto operator<=>(const XMINT4&) const = default; -#endif -}; - -// 4D Vector; 32 bit unsigned integer components -struct XMUINT4 { - uint32_t x; - uint32_t y; - uint32_t z; - uint32_t w; - - XMUINT4() = default; - - XMUINT4(const XMUINT4&) = default; - XMUINT4& operator=(const XMUINT4&) = default; - - XMUINT4(XMUINT4&&) = default; - XMUINT4& operator=(XMUINT4&&) = default; - - constexpr XMUINT4(uint32_t _x, uint32_t _y, uint32_t _z, - uint32_t _w) noexcept - : x(_x), y(_y), z(_z), w(_w) {} - explicit XMUINT4(_In_reads_(4) const uint32_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} - -#if (__cplusplus >= 202002L) - bool operator==(const XMUINT4&) const = default; - auto operator<=>(const XMUINT4&) const = default; -#endif -}; - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgnu-anonymous-struct" -#pragma clang diagnostic ignored "-Wnested-anon-types" -#pragma clang diagnostic ignored "-Wunknown-warning-option" -#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" -#endif - -//------------------------------------------------------------------------------ -// 3x3 Matrix: 32 bit floating point components -struct XMFLOAT3X3 { - union { - struct { - float _11, _12, _13; - float _21, _22, _23; - float _31, _32, _33; - }; - float m[3][3]; - }; - - XMFLOAT3X3() = default; - - XMFLOAT3X3(const XMFLOAT3X3&) = default; - XMFLOAT3X3& operator=(const XMFLOAT3X3&) = default; - - XMFLOAT3X3(XMFLOAT3X3&&) = default; - XMFLOAT3X3& operator=(XMFLOAT3X3&&) = default; - - constexpr XMFLOAT3X3(float m00, float m01, float m02, float m10, float m11, - float m12, float m20, float m21, float m22) noexcept - : _11(m00), - _12(m01), - _13(m02), - _21(m10), - _22(m11), - _23(m12), - _31(m20), - _32(m21), - _33(m22) {} - explicit XMFLOAT3X3(_In_reads_(9) const float* pArray) noexcept; - - float operator()(size_t Row, size_t Column) const noexcept { - return m[Row][Column]; - } - float& operator()(size_t Row, size_t Column) noexcept { - return m[Row][Column]; - } - -#if (__cplusplus >= 202002L) - bool operator==(const XMFLOAT3X3&) const = delete; - auto operator<=>(const XMFLOAT3X3&) const = delete; -#endif -}; - -//------------------------------------------------------------------------------ -// 4x3 Row-major Matrix: 32 bit floating point components -struct XMFLOAT4X3 { - union { - struct { - float _11, _12, _13; - float _21, _22, _23; - float _31, _32, _33; - float _41, _42, _43; - }; - float m[4][3]; - float f[12]; - }; - - XMFLOAT4X3() = default; - - XMFLOAT4X3(const XMFLOAT4X3&) = default; - XMFLOAT4X3& operator=(const XMFLOAT4X3&) = default; - - XMFLOAT4X3(XMFLOAT4X3&&) = default; - XMFLOAT4X3& operator=(XMFLOAT4X3&&) = default; - - constexpr XMFLOAT4X3(float m00, float m01, float m02, float m10, float m11, - float m12, float m20, float m21, float m22, float m30, - float m31, float m32) noexcept - : _11(m00), - _12(m01), - _13(m02), - _21(m10), - _22(m11), - _23(m12), - _31(m20), - _32(m21), - _33(m22), - _41(m30), - _42(m31), - _43(m32) {} - explicit XMFLOAT4X3(_In_reads_(12) const float* pArray) noexcept; - - float operator()(size_t Row, size_t Column) const noexcept { - return m[Row][Column]; - } - float& operator()(size_t Row, size_t Column) noexcept { - return m[Row][Column]; - } - -#if (__cplusplus >= 202002L) - bool operator==(const XMFLOAT4X3&) const = delete; - auto operator<=>(const XMFLOAT4X3&) const = delete; -#endif -}; - -// 4x3 Row-major Matrix: 32 bit floating point components aligned on a 16 byte -// boundary -XM_ALIGNED_STRUCT(16) XMFLOAT4X3A : public XMFLOAT4X3 { - using XMFLOAT4X3::XMFLOAT4X3; -}; - -//------------------------------------------------------------------------------ -// 3x4 Column-major Matrix: 32 bit floating point components -struct XMFLOAT3X4 { - union { - struct { - float _11, _12, _13, _14; - float _21, _22, _23, _24; - float _31, _32, _33, _34; - }; - float m[3][4]; - float f[12]; - }; - - XMFLOAT3X4() = default; - - XMFLOAT3X4(const XMFLOAT3X4&) = default; - XMFLOAT3X4& operator=(const XMFLOAT3X4&) = default; - - XMFLOAT3X4(XMFLOAT3X4&&) = default; - XMFLOAT3X4& operator=(XMFLOAT3X4&&) = default; - - constexpr XMFLOAT3X4(float m00, float m01, float m02, float m03, float m10, - float m11, float m12, float m13, float m20, float m21, - float m22, float m23) noexcept - : _11(m00), - _12(m01), - _13(m02), - _14(m03), - _21(m10), - _22(m11), - _23(m12), - _24(m13), - _31(m20), - _32(m21), - _33(m22), - _34(m23) {} - explicit XMFLOAT3X4(_In_reads_(12) const float* pArray) noexcept; - - float operator()(size_t Row, size_t Column) const noexcept { - return m[Row][Column]; - } - float& operator()(size_t Row, size_t Column) noexcept { - return m[Row][Column]; - } - -#if (__cplusplus >= 202002L) - bool operator==(const XMFLOAT3X4&) const = delete; - auto operator<=>(const XMFLOAT3X4&) const = delete; -#endif -}; - -// 3x4 Column-major Matrix: 32 bit floating point components aligned on a 16 -// byte boundary -XM_ALIGNED_STRUCT(16) XMFLOAT3X4A : public XMFLOAT3X4 { - using XMFLOAT3X4::XMFLOAT3X4; -}; - -//------------------------------------------------------------------------------ -// 4x4 Matrix: 32 bit floating point components -struct XMFLOAT4X4 { - union { - struct { - float _11, _12, _13, _14; - float _21, _22, _23, _24; - float _31, _32, _33, _34; - float _41, _42, _43, _44; - }; - float m[4][4]; - }; - - XMFLOAT4X4() = default; - - XMFLOAT4X4(const XMFLOAT4X4&) = default; - XMFLOAT4X4& operator=(const XMFLOAT4X4&) = default; - - XMFLOAT4X4(XMFLOAT4X4&&) = default; - XMFLOAT4X4& operator=(XMFLOAT4X4&&) = default; - - constexpr XMFLOAT4X4(float m00, float m01, float m02, float m03, float m10, - float m11, float m12, float m13, float m20, float m21, - float m22, float m23, float m30, float m31, float m32, - float m33) noexcept - : _11(m00), - _12(m01), - _13(m02), - _14(m03), - _21(m10), - _22(m11), - _23(m12), - _24(m13), - _31(m20), - _32(m21), - _33(m22), - _34(m23), - _41(m30), - _42(m31), - _43(m32), - _44(m33) {} - explicit XMFLOAT4X4(_In_reads_(16) const float* pArray) noexcept; - - float operator()(size_t Row, size_t Column) const noexcept { - return m[Row][Column]; - } - float& operator()(size_t Row, size_t Column) noexcept { - return m[Row][Column]; - } - -#if (__cplusplus >= 202002L) - bool operator==(const XMFLOAT4X4&) const = delete; - auto operator<=>(const XMFLOAT4X4&) const = delete; -#endif -}; - -// 4x4 Matrix: 32 bit floating point components aligned on a 16 byte boundary -XM_ALIGNED_STRUCT(16) XMFLOAT4X4A : public XMFLOAT4X4 { - using XMFLOAT4X4::XMFLOAT4X4; -}; - -//////////////////////////////////////////////////////////////////////////////// - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif -#ifdef _PREFAST_ -#pragma prefast(pop) -#endif -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -/**************************************************************************** - * - * Data conversion operations - * - ****************************************************************************/ - -XMVECTOR XM_CALLCONV XMConvertVectorIntToFloat(FXMVECTOR VInt, - uint32_t DivExponent) noexcept; -XMVECTOR XM_CALLCONV XMConvertVectorFloatToInt(FXMVECTOR VFloat, - uint32_t MulExponent) noexcept; -XMVECTOR XM_CALLCONV XMConvertVectorUIntToFloat(FXMVECTOR VUInt, - uint32_t DivExponent) noexcept; -XMVECTOR XM_CALLCONV XMConvertVectorFloatToUInt(FXMVECTOR VFloat, - uint32_t MulExponent) noexcept; - -#if defined(__XNAMATH_H__) && defined(XMVectorSetBinaryConstant) -#undef XMVectorSetBinaryConstant -#undef XMVectorSplatConstant -#undef XMVectorSplatConstantInt -#endif - -XMVECTOR XM_CALLCONV XMVectorSetBinaryConstant(uint32_t C0, uint32_t C1, - uint32_t C2, - uint32_t C3) noexcept; -XMVECTOR XM_CALLCONV XMVectorSplatConstant(int32_t IntConstant, - uint32_t DivExponent) noexcept; -XMVECTOR XM_CALLCONV XMVectorSplatConstantInt(int32_t IntConstant) noexcept; - -/**************************************************************************** - * - * Load operations - * - ****************************************************************************/ - -XMVECTOR XM_CALLCONV XMLoadInt(_In_ const uint32_t* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadFloat(_In_ const float* pSource) noexcept; - -XMVECTOR XM_CALLCONV XMLoadInt2(_In_reads_(2) const uint32_t* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadInt2A(_In_reads_(2) - const uint32_t* PSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadFloat2(_In_ const XMFLOAT2* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadFloat2A(_In_ const XMFLOAT2A* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadSInt2(_In_ const XMINT2* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadUInt2(_In_ const XMUINT2* pSource) noexcept; - -XMVECTOR XM_CALLCONV XMLoadInt3(_In_reads_(3) const uint32_t* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadInt3A(_In_reads_(3) - const uint32_t* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadFloat3(_In_ const XMFLOAT3* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadFloat3A(_In_ const XMFLOAT3A* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadSInt3(_In_ const XMINT3* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadUInt3(_In_ const XMUINT3* pSource) noexcept; - -XMVECTOR XM_CALLCONV XMLoadInt4(_In_reads_(4) const uint32_t* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadInt4A(_In_reads_(4) - const uint32_t* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadFloat4(_In_ const XMFLOAT4* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadFloat4A(_In_ const XMFLOAT4A* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadSInt4(_In_ const XMINT4* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadUInt4(_In_ const XMUINT4* pSource) noexcept; - -XMMATRIX XM_CALLCONV XMLoadFloat3x3(_In_ const XMFLOAT3X3* pSource) noexcept; -XMMATRIX XM_CALLCONV XMLoadFloat4x3(_In_ const XMFLOAT4X3* pSource) noexcept; -XMMATRIX XM_CALLCONV XMLoadFloat4x3A(_In_ const XMFLOAT4X3A* pSource) noexcept; -XMMATRIX XM_CALLCONV XMLoadFloat3x4(_In_ const XMFLOAT3X4* pSource) noexcept; -XMMATRIX XM_CALLCONV XMLoadFloat3x4A(_In_ const XMFLOAT3X4A* pSource) noexcept; -XMMATRIX XM_CALLCONV XMLoadFloat4x4(_In_ const XMFLOAT4X4* pSource) noexcept; -XMMATRIX XM_CALLCONV XMLoadFloat4x4A(_In_ const XMFLOAT4X4A* pSource) noexcept; - -/**************************************************************************** - * - * Store operations - * - ****************************************************************************/ - -void XM_CALLCONV XMStoreInt(_Out_ uint32_t* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreFloat(_Out_ float* pDestination, - _In_ FXMVECTOR V) noexcept; - -void XM_CALLCONV XMStoreInt2(_Out_writes_(2) uint32_t* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreInt2A(_Out_writes_(2) uint32_t* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreFloat2(_Out_ XMFLOAT2* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreFloat2A(_Out_ XMFLOAT2A* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreSInt2(_Out_ XMINT2* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreUInt2(_Out_ XMUINT2* pDestination, - _In_ FXMVECTOR V) noexcept; - -void XM_CALLCONV XMStoreInt3(_Out_writes_(3) uint32_t* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreInt3A(_Out_writes_(3) uint32_t* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreFloat3(_Out_ XMFLOAT3* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreFloat3A(_Out_ XMFLOAT3A* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreSInt3(_Out_ XMINT3* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreUInt3(_Out_ XMUINT3* pDestination, - _In_ FXMVECTOR V) noexcept; - -void XM_CALLCONV XMStoreInt4(_Out_writes_(4) uint32_t* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreInt4A(_Out_writes_(4) uint32_t* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreFloat4(_Out_ XMFLOAT4* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreFloat4A(_Out_ XMFLOAT4A* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreSInt4(_Out_ XMINT4* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreUInt4(_Out_ XMUINT4* pDestination, - _In_ FXMVECTOR V) noexcept; - -void XM_CALLCONV XMStoreFloat3x3(_Out_ XMFLOAT3X3* pDestination, - _In_ FXMMATRIX M) noexcept; -void XM_CALLCONV XMStoreFloat4x3(_Out_ XMFLOAT4X3* pDestination, - _In_ FXMMATRIX M) noexcept; -void XM_CALLCONV XMStoreFloat4x3A(_Out_ XMFLOAT4X3A* pDestination, - _In_ FXMMATRIX M) noexcept; -void XM_CALLCONV XMStoreFloat3x4(_Out_ XMFLOAT3X4* pDestination, - _In_ FXMMATRIX M) noexcept; -void XM_CALLCONV XMStoreFloat3x4A(_Out_ XMFLOAT3X4A* pDestination, - _In_ FXMMATRIX M) noexcept; -void XM_CALLCONV XMStoreFloat4x4(_Out_ XMFLOAT4X4* pDestination, - _In_ FXMMATRIX M) noexcept; -void XM_CALLCONV XMStoreFloat4x4A(_Out_ XMFLOAT4X4A* pDestination, - _In_ FXMMATRIX M) noexcept; - -/**************************************************************************** - * - * General vector operations - * - ****************************************************************************/ - -XMVECTOR XM_CALLCONV XMVectorZero() noexcept; -XMVECTOR XM_CALLCONV XMVectorSet(float x, float y, float z, float w) noexcept; -XMVECTOR XM_CALLCONV XMVectorSetInt(uint32_t x, uint32_t y, uint32_t z, - uint32_t w) noexcept; -XMVECTOR XM_CALLCONV XMVectorReplicate(float Value) noexcept; -XMVECTOR XM_CALLCONV XMVectorReplicatePtr(_In_ const float* pValue) noexcept; -XMVECTOR XM_CALLCONV XMVectorReplicateInt(uint32_t Value) noexcept; -XMVECTOR XM_CALLCONV -XMVectorReplicateIntPtr(_In_ const uint32_t* pValue) noexcept; -XMVECTOR XM_CALLCONV XMVectorTrueInt() noexcept; -XMVECTOR XM_CALLCONV XMVectorFalseInt() noexcept; -XMVECTOR XM_CALLCONV XMVectorSplatX(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorSplatY(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorSplatZ(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorSplatW(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorSplatOne() noexcept; -XMVECTOR XM_CALLCONV XMVectorSplatInfinity() noexcept; -XMVECTOR XM_CALLCONV XMVectorSplatQNaN() noexcept; -XMVECTOR XM_CALLCONV XMVectorSplatEpsilon() noexcept; -XMVECTOR XM_CALLCONV XMVectorSplatSignMask() noexcept; - -float XM_CALLCONV XMVectorGetByIndex(FXMVECTOR V, size_t i) noexcept; -float XM_CALLCONV XMVectorGetX(FXMVECTOR V) noexcept; -float XM_CALLCONV XMVectorGetY(FXMVECTOR V) noexcept; -float XM_CALLCONV XMVectorGetZ(FXMVECTOR V) noexcept; -float XM_CALLCONV XMVectorGetW(FXMVECTOR V) noexcept; - -void XM_CALLCONV XMVectorGetByIndexPtr(_Out_ float* f, _In_ FXMVECTOR V, - _In_ size_t i) noexcept; -void XM_CALLCONV XMVectorGetXPtr(_Out_ float* x, _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMVectorGetYPtr(_Out_ float* y, _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMVectorGetZPtr(_Out_ float* z, _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMVectorGetWPtr(_Out_ float* w, _In_ FXMVECTOR V) noexcept; - -uint32_t XM_CALLCONV XMVectorGetIntByIndex(FXMVECTOR V, size_t i) noexcept; -uint32_t XM_CALLCONV XMVectorGetIntX(FXMVECTOR V) noexcept; -uint32_t XM_CALLCONV XMVectorGetIntY(FXMVECTOR V) noexcept; -uint32_t XM_CALLCONV XMVectorGetIntZ(FXMVECTOR V) noexcept; -uint32_t XM_CALLCONV XMVectorGetIntW(FXMVECTOR V) noexcept; - -void XM_CALLCONV XMVectorGetIntByIndexPtr(_Out_ uint32_t* x, _In_ FXMVECTOR V, - _In_ size_t i) noexcept; -void XM_CALLCONV XMVectorGetIntXPtr(_Out_ uint32_t* x, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMVectorGetIntYPtr(_Out_ uint32_t* y, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMVectorGetIntZPtr(_Out_ uint32_t* z, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMVectorGetIntWPtr(_Out_ uint32_t* w, - _In_ FXMVECTOR V) noexcept; - -XMVECTOR XM_CALLCONV XMVectorSetByIndex(FXMVECTOR V, float f, - size_t i) noexcept; -XMVECTOR XM_CALLCONV XMVectorSetX(FXMVECTOR V, float x) noexcept; -XMVECTOR XM_CALLCONV XMVectorSetY(FXMVECTOR V, float y) noexcept; -XMVECTOR XM_CALLCONV XMVectorSetZ(FXMVECTOR V, float z) noexcept; -XMVECTOR XM_CALLCONV XMVectorSetW(FXMVECTOR V, float w) noexcept; - -XMVECTOR XM_CALLCONV XMVectorSetByIndexPtr(_In_ FXMVECTOR V, - _In_ const float* f, - _In_ size_t i) noexcept; -XMVECTOR XM_CALLCONV XMVectorSetXPtr(_In_ FXMVECTOR V, - _In_ const float* x) noexcept; -XMVECTOR XM_CALLCONV XMVectorSetYPtr(_In_ FXMVECTOR V, - _In_ const float* y) noexcept; -XMVECTOR XM_CALLCONV XMVectorSetZPtr(_In_ FXMVECTOR V, - _In_ const float* z) noexcept; -XMVECTOR XM_CALLCONV XMVectorSetWPtr(_In_ FXMVECTOR V, - _In_ const float* w) noexcept; - -XMVECTOR XM_CALLCONV XMVectorSetIntByIndex(FXMVECTOR V, uint32_t x, - size_t i) noexcept; -XMVECTOR XM_CALLCONV XMVectorSetIntX(FXMVECTOR V, uint32_t x) noexcept; -XMVECTOR XM_CALLCONV XMVectorSetIntY(FXMVECTOR V, uint32_t y) noexcept; -XMVECTOR XM_CALLCONV XMVectorSetIntZ(FXMVECTOR V, uint32_t z) noexcept; -XMVECTOR XM_CALLCONV XMVectorSetIntW(FXMVECTOR V, uint32_t w) noexcept; - -XMVECTOR XM_CALLCONV XMVectorSetIntByIndexPtr(_In_ FXMVECTOR V, - _In_ const uint32_t* x, - _In_ size_t i) noexcept; -XMVECTOR XM_CALLCONV XMVectorSetIntXPtr(_In_ FXMVECTOR V, - _In_ const uint32_t* x) noexcept; -XMVECTOR XM_CALLCONV XMVectorSetIntYPtr(_In_ FXMVECTOR V, - _In_ const uint32_t* y) noexcept; -XMVECTOR XM_CALLCONV XMVectorSetIntZPtr(_In_ FXMVECTOR V, - _In_ const uint32_t* z) noexcept; -XMVECTOR XM_CALLCONV XMVectorSetIntWPtr(_In_ FXMVECTOR V, - _In_ const uint32_t* w) noexcept; - -#if defined(__XNAMATH_H__) && defined(XMVectorSwizzle) -#undef XMVectorSwizzle -#endif - -XMVECTOR XM_CALLCONV XMVectorSwizzle(FXMVECTOR V, uint32_t E0, uint32_t E1, - uint32_t E2, uint32_t E3) noexcept; -XMVECTOR XM_CALLCONV XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, - uint32_t PermuteX, uint32_t PermuteY, - uint32_t PermuteZ, - uint32_t PermuteW) noexcept; -XMVECTOR XM_CALLCONV XMVectorSelectControl(uint32_t VectorIndex0, - uint32_t VectorIndex1, - uint32_t VectorIndex2, - uint32_t VectorIndex3) noexcept; -XMVECTOR XM_CALLCONV XMVectorSelect(FXMVECTOR V1, FXMVECTOR V2, - FXMVECTOR Control) noexcept; -XMVECTOR XM_CALLCONV XMVectorMergeXY(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorMergeZW(FXMVECTOR V1, FXMVECTOR V2) noexcept; - -#if defined(__XNAMATH_H__) && defined(XMVectorShiftLeft) -#undef XMVectorShiftLeft -#undef XMVectorRotateLeft -#undef XMVectorRotateRight -#undef XMVectorInsert -#endif - -XMVECTOR XM_CALLCONV XMVectorShiftLeft(FXMVECTOR V1, FXMVECTOR V2, - uint32_t Elements) noexcept; -XMVECTOR XM_CALLCONV XMVectorRotateLeft(FXMVECTOR V, - uint32_t Elements) noexcept; -XMVECTOR XM_CALLCONV XMVectorRotateRight(FXMVECTOR V, - uint32_t Elements) noexcept; -XMVECTOR XM_CALLCONV XMVectorInsert(FXMVECTOR VD, FXMVECTOR VS, - uint32_t VSLeftRotateElements, - uint32_t Select0, uint32_t Select1, - uint32_t Select2, - uint32_t Select3) noexcept; - -XMVECTOR XM_CALLCONV XMVectorEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorEqualR(_Out_ uint32_t* pCR, _In_ FXMVECTOR V1, - _In_ FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorEqualIntR(_Out_ uint32_t* pCR, _In_ FXMVECTOR V, - _In_ FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorNearEqual(FXMVECTOR V1, FXMVECTOR V2, - FXMVECTOR Epsilon) noexcept; -XMVECTOR XM_CALLCONV XMVectorNotEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorNotEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorGreater(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorGreaterR(_Out_ uint32_t* pCR, _In_ FXMVECTOR V1, - _In_ FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorGreaterOrEqual(FXMVECTOR V1, - FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorGreaterOrEqualR(_Out_ uint32_t* pCR, - _In_ FXMVECTOR V1, - _In_ FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorLess(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorLessOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorInBounds(FXMVECTOR V, FXMVECTOR Bounds) noexcept; -XMVECTOR XM_CALLCONV XMVectorInBoundsR(_Out_ uint32_t* pCR, _In_ FXMVECTOR V, - _In_ FXMVECTOR Bounds) noexcept; - -XMVECTOR XM_CALLCONV XMVectorIsNaN(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorIsInfinite(FXMVECTOR V) noexcept; - -XMVECTOR XM_CALLCONV XMVectorMin(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorMax(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorRound(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorTruncate(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorFloor(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorCeiling(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorClamp(FXMVECTOR V, FXMVECTOR Min, - FXMVECTOR Max) noexcept; -XMVECTOR XM_CALLCONV XMVectorSaturate(FXMVECTOR V) noexcept; - -XMVECTOR XM_CALLCONV XMVectorAndInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorAndCInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorOrInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorNorInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorXorInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; - -XMVECTOR XM_CALLCONV XMVectorNegate(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorAdd(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorSum(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorAddAngles(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorSubtract(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorSubtractAngles(FXMVECTOR V1, - FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorMultiply(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorMultiplyAdd(FXMVECTOR V1, FXMVECTOR V2, - FXMVECTOR V3) noexcept; -XMVECTOR XM_CALLCONV XMVectorDivide(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorNegativeMultiplySubtract(FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR V3) noexcept; -XMVECTOR XM_CALLCONV XMVectorScale(FXMVECTOR V, float ScaleFactor) noexcept; -XMVECTOR XM_CALLCONV XMVectorReciprocalEst(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorReciprocal(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorSqrtEst(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorSqrt(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorReciprocalSqrtEst(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorReciprocalSqrt(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorExp2(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorExp10(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorExpE(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorExp(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorLog2(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorLog10(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorLogE(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorLog(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorPow(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorAbs(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorMod(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVectorModAngles(FXMVECTOR Angles) noexcept; -XMVECTOR XM_CALLCONV XMVectorSin(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorSinEst(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorCos(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorCosEst(FXMVECTOR V) noexcept; -void XM_CALLCONV XMVectorSinCos(_Out_ XMVECTOR* pSin, _Out_ XMVECTOR* pCos, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMVectorSinCosEst(_Out_ XMVECTOR* pSin, _Out_ XMVECTOR* pCos, - _In_ FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorTan(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorTanEst(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorSinH(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorCosH(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorTanH(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorASin(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorASinEst(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorACos(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorACosEst(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorATan(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorATanEst(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVectorATan2(FXMVECTOR Y, FXMVECTOR X) noexcept; -XMVECTOR XM_CALLCONV XMVectorATan2Est(FXMVECTOR Y, FXMVECTOR X) noexcept; -XMVECTOR XM_CALLCONV XMVectorLerp(FXMVECTOR V0, FXMVECTOR V1, float t) noexcept; -XMVECTOR XM_CALLCONV XMVectorLerpV(FXMVECTOR V0, FXMVECTOR V1, - FXMVECTOR T) noexcept; -XMVECTOR XM_CALLCONV XMVectorHermite(FXMVECTOR Position0, FXMVECTOR Tangent0, - FXMVECTOR Position1, GXMVECTOR Tangent1, - float t) noexcept; -XMVECTOR XM_CALLCONV XMVectorHermiteV(FXMVECTOR Position0, FXMVECTOR Tangent0, - FXMVECTOR Position1, GXMVECTOR Tangent1, - HXMVECTOR T) noexcept; -XMVECTOR XM_CALLCONV XMVectorCatmullRom(FXMVECTOR Position0, - FXMVECTOR Position1, - FXMVECTOR Position2, - GXMVECTOR Position3, float t) noexcept; -XMVECTOR XM_CALLCONV XMVectorCatmullRomV(FXMVECTOR Position0, - FXMVECTOR Position1, - FXMVECTOR Position2, - GXMVECTOR Position3, - HXMVECTOR T) noexcept; -XMVECTOR XM_CALLCONV XMVectorBaryCentric(FXMVECTOR Position0, - FXMVECTOR Position1, - FXMVECTOR Position2, float f, - float g) noexcept; -XMVECTOR XM_CALLCONV XMVectorBaryCentricV(FXMVECTOR Position0, - FXMVECTOR Position1, - FXMVECTOR Position2, GXMVECTOR F, - HXMVECTOR G) noexcept; - -/**************************************************************************** - * - * 2D vector operations - * - ****************************************************************************/ - -bool XM_CALLCONV XMVector2Equal(FXMVECTOR V1, FXMVECTOR V2) noexcept; -uint32_t XM_CALLCONV XMVector2EqualR(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector2EqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; -uint32_t XM_CALLCONV XMVector2EqualIntR(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector2NearEqual(FXMVECTOR V1, FXMVECTOR V2, - FXMVECTOR Epsilon) noexcept; -bool XM_CALLCONV XMVector2NotEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector2NotEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector2Greater(FXMVECTOR V1, FXMVECTOR V2) noexcept; -uint32_t XM_CALLCONV XMVector2GreaterR(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector2GreaterOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; -uint32_t XM_CALLCONV XMVector2GreaterOrEqualR(FXMVECTOR V1, - FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector2Less(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector2LessOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector2InBounds(FXMVECTOR V, FXMVECTOR Bounds) noexcept; - -bool XM_CALLCONV XMVector2IsNaN(FXMVECTOR V) noexcept; -bool XM_CALLCONV XMVector2IsInfinite(FXMVECTOR V) noexcept; - -XMVECTOR XM_CALLCONV XMVector2Dot(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVector2Cross(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVector2LengthSq(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector2ReciprocalLengthEst(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector2ReciprocalLength(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector2LengthEst(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector2Length(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector2NormalizeEst(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector2Normalize(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector2ClampLength(FXMVECTOR V, float LengthMin, - float LengthMax) noexcept; -XMVECTOR XM_CALLCONV XMVector2ClampLengthV(FXMVECTOR V, FXMVECTOR LengthMin, - FXMVECTOR LengthMax) noexcept; -XMVECTOR XM_CALLCONV XMVector2Reflect(FXMVECTOR Incident, - FXMVECTOR Normal) noexcept; -XMVECTOR XM_CALLCONV XMVector2Refract(FXMVECTOR Incident, FXMVECTOR Normal, - float RefractionIndex) noexcept; -XMVECTOR XM_CALLCONV XMVector2RefractV(FXMVECTOR Incident, FXMVECTOR Normal, - FXMVECTOR RefractionIndex) noexcept; -XMVECTOR XM_CALLCONV XMVector2Orthogonal(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector2AngleBetweenNormalsEst(FXMVECTOR N1, - FXMVECTOR N2) noexcept; -XMVECTOR XM_CALLCONV XMVector2AngleBetweenNormals(FXMVECTOR N1, - FXMVECTOR N2) noexcept; -XMVECTOR XM_CALLCONV XMVector2AngleBetweenVectors(FXMVECTOR V1, - FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVector2LinePointDistance(FXMVECTOR LinePoint1, - FXMVECTOR LinePoint2, - FXMVECTOR Point) noexcept; -XMVECTOR XM_CALLCONV XMVector2IntersectLine(FXMVECTOR Line1Point1, - FXMVECTOR Line1Point2, - FXMVECTOR Line2Point1, - GXMVECTOR Line2Point2) noexcept; -XMVECTOR XM_CALLCONV XMVector2Transform(FXMVECTOR V, FXMMATRIX M) noexcept; -XMFLOAT4* XM_CALLCONV XMVector2TransformStream( - _Out_writes_bytes_(sizeof(XMFLOAT4) + OutputStride * (VectorCount - 1)) - XMFLOAT4* pOutputStream, - _In_ size_t OutputStride, - _In_reads_bytes_(sizeof(XMFLOAT2) + InputStride * (VectorCount - 1)) - const XMFLOAT2* pInputStream, - _In_ size_t InputStride, _In_ size_t VectorCount, - _In_ FXMMATRIX M) noexcept; -XMVECTOR XM_CALLCONV XMVector2TransformCoord(FXMVECTOR V, FXMMATRIX M) noexcept; -XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream( - _Out_writes_bytes_(sizeof(XMFLOAT2) + OutputStride * (VectorCount - 1)) - XMFLOAT2* pOutputStream, - _In_ size_t OutputStride, - _In_reads_bytes_(sizeof(XMFLOAT2) + InputStride * (VectorCount - 1)) - const XMFLOAT2* pInputStream, - _In_ size_t InputStride, _In_ size_t VectorCount, - _In_ FXMMATRIX M) noexcept; -XMVECTOR XM_CALLCONV XMVector2TransformNormal(FXMVECTOR V, - FXMMATRIX M) noexcept; -XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream( - _Out_writes_bytes_(sizeof(XMFLOAT2) + OutputStride * (VectorCount - 1)) - XMFLOAT2* pOutputStream, - _In_ size_t OutputStride, - _In_reads_bytes_(sizeof(XMFLOAT2) + InputStride * (VectorCount - 1)) - const XMFLOAT2* pInputStream, - _In_ size_t InputStride, _In_ size_t VectorCount, - _In_ FXMMATRIX M) noexcept; - -/**************************************************************************** - * - * 3D vector operations - * - ****************************************************************************/ - -bool XM_CALLCONV XMVector3Equal(FXMVECTOR V1, FXMVECTOR V2) noexcept; -uint32_t XM_CALLCONV XMVector3EqualR(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector3EqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; -uint32_t XM_CALLCONV XMVector3EqualIntR(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector3NearEqual(FXMVECTOR V1, FXMVECTOR V2, - FXMVECTOR Epsilon) noexcept; -bool XM_CALLCONV XMVector3NotEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector3NotEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector3Greater(FXMVECTOR V1, FXMVECTOR V2) noexcept; -uint32_t XM_CALLCONV XMVector3GreaterR(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector3GreaterOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; -uint32_t XM_CALLCONV XMVector3GreaterOrEqualR(FXMVECTOR V1, - FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector3Less(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector3LessOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector3InBounds(FXMVECTOR V, FXMVECTOR Bounds) noexcept; - -bool XM_CALLCONV XMVector3IsNaN(FXMVECTOR V) noexcept; -bool XM_CALLCONV XMVector3IsInfinite(FXMVECTOR V) noexcept; - -XMVECTOR XM_CALLCONV XMVector3Dot(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVector3Cross(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVector3LengthSq(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector3ReciprocalLengthEst(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector3ReciprocalLength(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector3LengthEst(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector3Length(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector3NormalizeEst(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector3Normalize(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector3ClampLength(FXMVECTOR V, float LengthMin, - float LengthMax) noexcept; -XMVECTOR XM_CALLCONV XMVector3ClampLengthV(FXMVECTOR V, FXMVECTOR LengthMin, - FXMVECTOR LengthMax) noexcept; -XMVECTOR XM_CALLCONV XMVector3Reflect(FXMVECTOR Incident, - FXMVECTOR Normal) noexcept; -XMVECTOR XM_CALLCONV XMVector3Refract(FXMVECTOR Incident, FXMVECTOR Normal, - float RefractionIndex) noexcept; -XMVECTOR XM_CALLCONV XMVector3RefractV(FXMVECTOR Incident, FXMVECTOR Normal, - FXMVECTOR RefractionIndex) noexcept; -XMVECTOR XM_CALLCONV XMVector3Orthogonal(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector3AngleBetweenNormalsEst(FXMVECTOR N1, - FXMVECTOR N2) noexcept; -XMVECTOR XM_CALLCONV XMVector3AngleBetweenNormals(FXMVECTOR N1, - FXMVECTOR N2) noexcept; -XMVECTOR XM_CALLCONV XMVector3AngleBetweenVectors(FXMVECTOR V1, - FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVector3LinePointDistance(FXMVECTOR LinePoint1, - FXMVECTOR LinePoint2, - FXMVECTOR Point) noexcept; -void XM_CALLCONV XMVector3ComponentsFromNormal(_Out_ XMVECTOR* pParallel, - _Out_ XMVECTOR* pPerpendicular, - _In_ FXMVECTOR V, - _In_ FXMVECTOR Normal) noexcept; -XMVECTOR XM_CALLCONV XMVector3Rotate(FXMVECTOR V, - FXMVECTOR RotationQuaternion) noexcept; -XMVECTOR XM_CALLCONV -XMVector3InverseRotate(FXMVECTOR V, FXMVECTOR RotationQuaternion) noexcept; -XMVECTOR XM_CALLCONV XMVector3Transform(FXMVECTOR V, FXMMATRIX M) noexcept; -XMFLOAT4* XM_CALLCONV XMVector3TransformStream( - _Out_writes_bytes_(sizeof(XMFLOAT4) + OutputStride * (VectorCount - 1)) - XMFLOAT4* pOutputStream, - _In_ size_t OutputStride, - _In_reads_bytes_(sizeof(XMFLOAT3) + InputStride * (VectorCount - 1)) - const XMFLOAT3* pInputStream, - _In_ size_t InputStride, _In_ size_t VectorCount, - _In_ FXMMATRIX M) noexcept; -XMVECTOR XM_CALLCONV XMVector3TransformCoord(FXMVECTOR V, FXMMATRIX M) noexcept; -XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream( - _Out_writes_bytes_(sizeof(XMFLOAT3) + OutputStride * (VectorCount - 1)) - XMFLOAT3* pOutputStream, - _In_ size_t OutputStride, - _In_reads_bytes_(sizeof(XMFLOAT3) + InputStride * (VectorCount - 1)) - const XMFLOAT3* pInputStream, - _In_ size_t InputStride, _In_ size_t VectorCount, - _In_ FXMMATRIX M) noexcept; -XMVECTOR XM_CALLCONV XMVector3TransformNormal(FXMVECTOR V, - FXMMATRIX M) noexcept; -XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream( - _Out_writes_bytes_(sizeof(XMFLOAT3) + OutputStride * (VectorCount - 1)) - XMFLOAT3* pOutputStream, - _In_ size_t OutputStride, - _In_reads_bytes_(sizeof(XMFLOAT3) + InputStride * (VectorCount - 1)) - const XMFLOAT3* pInputStream, - _In_ size_t InputStride, _In_ size_t VectorCount, - _In_ FXMMATRIX M) noexcept; -XMVECTOR XM_CALLCONV XMVector3Project(FXMVECTOR V, float ViewportX, - float ViewportY, float ViewportWidth, - float ViewportHeight, float ViewportMinZ, - float ViewportMaxZ, FXMMATRIX Projection, - CXMMATRIX View, CXMMATRIX World) noexcept; -XMFLOAT3* XM_CALLCONV XMVector3ProjectStream( - _Out_writes_bytes_(sizeof(XMFLOAT3) + OutputStride * (VectorCount - 1)) - XMFLOAT3* pOutputStream, - _In_ size_t OutputStride, - _In_reads_bytes_(sizeof(XMFLOAT3) + InputStride * (VectorCount - 1)) - const XMFLOAT3* pInputStream, - _In_ size_t InputStride, _In_ size_t VectorCount, _In_ float ViewportX, - _In_ float ViewportY, _In_ float ViewportWidth, _In_ float ViewportHeight, - _In_ float ViewportMinZ, _In_ float ViewportMaxZ, _In_ FXMMATRIX Projection, - _In_ CXMMATRIX View, _In_ CXMMATRIX World) noexcept; -XMVECTOR XM_CALLCONV XMVector3Unproject(FXMVECTOR V, float ViewportX, - float ViewportY, float ViewportWidth, - float ViewportHeight, - float ViewportMinZ, float ViewportMaxZ, - FXMMATRIX Projection, CXMMATRIX View, - CXMMATRIX World) noexcept; -XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream( - _Out_writes_bytes_(sizeof(XMFLOAT3) + OutputStride * (VectorCount - 1)) - XMFLOAT3* pOutputStream, - _In_ size_t OutputStride, - _In_reads_bytes_(sizeof(XMFLOAT3) + InputStride * (VectorCount - 1)) - const XMFLOAT3* pInputStream, - _In_ size_t InputStride, _In_ size_t VectorCount, _In_ float ViewportX, - _In_ float ViewportY, _In_ float ViewportWidth, _In_ float ViewportHeight, - _In_ float ViewportMinZ, _In_ float ViewportMaxZ, _In_ FXMMATRIX Projection, - _In_ CXMMATRIX View, _In_ CXMMATRIX World) noexcept; - -/**************************************************************************** - * - * 4D vector operations - * - ****************************************************************************/ - -bool XM_CALLCONV XMVector4Equal(FXMVECTOR V1, FXMVECTOR V2) noexcept; -uint32_t XM_CALLCONV XMVector4EqualR(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector4EqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; -uint32_t XM_CALLCONV XMVector4EqualIntR(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector4NearEqual(FXMVECTOR V1, FXMVECTOR V2, - FXMVECTOR Epsilon) noexcept; -bool XM_CALLCONV XMVector4NotEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector4NotEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector4Greater(FXMVECTOR V1, FXMVECTOR V2) noexcept; -uint32_t XM_CALLCONV XMVector4GreaterR(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector4GreaterOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; -uint32_t XM_CALLCONV XMVector4GreaterOrEqualR(FXMVECTOR V1, - FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector4Less(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector4LessOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; -bool XM_CALLCONV XMVector4InBounds(FXMVECTOR V, FXMVECTOR Bounds) noexcept; - -bool XM_CALLCONV XMVector4IsNaN(FXMVECTOR V) noexcept; -bool XM_CALLCONV XMVector4IsInfinite(FXMVECTOR V) noexcept; - -XMVECTOR XM_CALLCONV XMVector4Dot(FXMVECTOR V1, FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVector4Cross(FXMVECTOR V1, FXMVECTOR V2, - FXMVECTOR V3) noexcept; -XMVECTOR XM_CALLCONV XMVector4LengthSq(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector4ReciprocalLengthEst(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector4ReciprocalLength(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector4LengthEst(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector4Length(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector4NormalizeEst(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector4Normalize(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector4ClampLength(FXMVECTOR V, float LengthMin, - float LengthMax) noexcept; -XMVECTOR XM_CALLCONV XMVector4ClampLengthV(FXMVECTOR V, FXMVECTOR LengthMin, - FXMVECTOR LengthMax) noexcept; -XMVECTOR XM_CALLCONV XMVector4Reflect(FXMVECTOR Incident, - FXMVECTOR Normal) noexcept; -XMVECTOR XM_CALLCONV XMVector4Refract(FXMVECTOR Incident, FXMVECTOR Normal, - float RefractionIndex) noexcept; -XMVECTOR XM_CALLCONV XMVector4RefractV(FXMVECTOR Incident, FXMVECTOR Normal, - FXMVECTOR RefractionIndex) noexcept; -XMVECTOR XM_CALLCONV XMVector4Orthogonal(FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMVector4AngleBetweenNormalsEst(FXMVECTOR N1, - FXMVECTOR N2) noexcept; -XMVECTOR XM_CALLCONV XMVector4AngleBetweenNormals(FXMVECTOR N1, - FXMVECTOR N2) noexcept; -XMVECTOR XM_CALLCONV XMVector4AngleBetweenVectors(FXMVECTOR V1, - FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMVector4Transform(FXMVECTOR V, FXMMATRIX M) noexcept; -XMFLOAT4* XM_CALLCONV XMVector4TransformStream( - _Out_writes_bytes_(sizeof(XMFLOAT4) + OutputStride * (VectorCount - 1)) - XMFLOAT4* pOutputStream, - _In_ size_t OutputStride, - _In_reads_bytes_(sizeof(XMFLOAT4) + InputStride * (VectorCount - 1)) - const XMFLOAT4* pInputStream, - _In_ size_t InputStride, _In_ size_t VectorCount, - _In_ FXMMATRIX M) noexcept; - -/**************************************************************************** - * - * Matrix operations - * - ****************************************************************************/ - -bool XM_CALLCONV XMMatrixIsNaN(FXMMATRIX M) noexcept; -bool XM_CALLCONV XMMatrixIsInfinite(FXMMATRIX M) noexcept; -bool XM_CALLCONV XMMatrixIsIdentity(FXMMATRIX M) noexcept; - -XMMATRIX XM_CALLCONV XMMatrixMultiply(FXMMATRIX M1, CXMMATRIX M2) noexcept; -XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose(FXMMATRIX M1, - CXMMATRIX M2) noexcept; -XMMATRIX XM_CALLCONV XMMatrixTranspose(FXMMATRIX M) noexcept; -XMMATRIX XM_CALLCONV XMMatrixInverse(_Out_opt_ XMVECTOR* pDeterminant, - _In_ FXMMATRIX M) noexcept; -XMMATRIX XM_CALLCONV XMMatrixVectorTensorProduct(FXMVECTOR V1, - FXMVECTOR V2) noexcept; -XMVECTOR XM_CALLCONV XMMatrixDeterminant(FXMMATRIX M) noexcept; - -_Success_(return) bool XM_CALLCONV - XMMatrixDecompose(_Out_ XMVECTOR* outScale, _Out_ XMVECTOR* outRotQuat, - _Out_ XMVECTOR* outTrans, _In_ FXMMATRIX M) noexcept; - -XMMATRIX XM_CALLCONV XMMatrixIdentity() noexcept; -XMMATRIX XM_CALLCONV XMMatrixSet(float m00, float m01, float m02, float m03, - float m10, float m11, float m12, float m13, - float m20, float m21, float m22, float m23, - float m30, float m31, float m32, - float m33) noexcept; -XMMATRIX XM_CALLCONV XMMatrixTranslation(float OffsetX, float OffsetY, - float OffsetZ) noexcept; -XMMATRIX XM_CALLCONV XMMatrixTranslationFromVector(FXMVECTOR Offset) noexcept; -XMMATRIX XM_CALLCONV XMMatrixScaling(float ScaleX, float ScaleY, - float ScaleZ) noexcept; -XMMATRIX XM_CALLCONV XMMatrixScalingFromVector(FXMVECTOR Scale) noexcept; -XMMATRIX XM_CALLCONV XMMatrixRotationX(float Angle) noexcept; -XMMATRIX XM_CALLCONV XMMatrixRotationY(float Angle) noexcept; -XMMATRIX XM_CALLCONV XMMatrixRotationZ(float Angle) noexcept; - -// Rotates about y-axis (Yaw), then x-axis (Pitch), then z-axis (Roll) -XMMATRIX XM_CALLCONV XMMatrixRotationRollPitchYaw(float Pitch, float Yaw, - float Roll) noexcept; - -// Rotates about y-axis (Angles.y), then x-axis (Angles.x), then z-axis -// (Angles.z) -XMMATRIX XM_CALLCONV -XMMatrixRotationRollPitchYawFromVector(FXMVECTOR Angles) noexcept; - -XMMATRIX XM_CALLCONV XMMatrixRotationNormal(FXMVECTOR NormalAxis, - float Angle) noexcept; -XMMATRIX XM_CALLCONV XMMatrixRotationAxis(FXMVECTOR Axis, float Angle) noexcept; -XMMATRIX XM_CALLCONV XMMatrixRotationQuaternion(FXMVECTOR Quaternion) noexcept; -XMMATRIX XM_CALLCONV XMMatrixTransformation2D( - FXMVECTOR ScalingOrigin, float ScalingOrientation, FXMVECTOR Scaling, - FXMVECTOR RotationOrigin, float Rotation, GXMVECTOR Translation) noexcept; -XMMATRIX XM_CALLCONV XMMatrixTransformation( - FXMVECTOR ScalingOrigin, FXMVECTOR ScalingOrientationQuaternion, - FXMVECTOR Scaling, GXMVECTOR RotationOrigin, HXMVECTOR RotationQuaternion, - HXMVECTOR Translation) noexcept; -XMMATRIX XM_CALLCONV -XMMatrixAffineTransformation2D(FXMVECTOR Scaling, FXMVECTOR RotationOrigin, - float Rotation, FXMVECTOR Translation) noexcept; -XMMATRIX XM_CALLCONV XMMatrixAffineTransformation( - FXMVECTOR Scaling, FXMVECTOR RotationOrigin, FXMVECTOR RotationQuaternion, - GXMVECTOR Translation) noexcept; -XMMATRIX XM_CALLCONV XMMatrixReflect(FXMVECTOR ReflectionPlane) noexcept; -XMMATRIX XM_CALLCONV XMMatrixShadow(FXMVECTOR ShadowPlane, - FXMVECTOR LightPosition) noexcept; - -XMMATRIX XM_CALLCONV XMMatrixLookAtLH(FXMVECTOR EyePosition, - FXMVECTOR FocusPosition, - FXMVECTOR UpDirection) noexcept; -XMMATRIX XM_CALLCONV XMMatrixLookAtRH(FXMVECTOR EyePosition, - FXMVECTOR FocusPosition, - FXMVECTOR UpDirection) noexcept; -XMMATRIX XM_CALLCONV XMMatrixLookToLH(FXMVECTOR EyePosition, - FXMVECTOR EyeDirection, - FXMVECTOR UpDirection) noexcept; -XMMATRIX XM_CALLCONV XMMatrixLookToRH(FXMVECTOR EyePosition, - FXMVECTOR EyeDirection, - FXMVECTOR UpDirection) noexcept; -XMMATRIX XM_CALLCONV XMMatrixPerspectiveLH(float ViewWidth, float ViewHeight, - float NearZ, float FarZ) noexcept; -XMMATRIX XM_CALLCONV XMMatrixPerspectiveRH(float ViewWidth, float ViewHeight, - float NearZ, float FarZ) noexcept; -XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovLH(float FovAngleY, - float AspectRatio, float NearZ, - float FarZ) noexcept; -XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovRH(float FovAngleY, - float AspectRatio, float NearZ, - float FarZ) noexcept; -XMMATRIX XM_CALLCONV XMMatrixPerspectiveOffCenterLH(float ViewLeft, - float ViewRight, - float ViewBottom, - float ViewTop, float NearZ, - float FarZ) noexcept; -XMMATRIX XM_CALLCONV XMMatrixPerspectiveOffCenterRH(float ViewLeft, - float ViewRight, - float ViewBottom, - float ViewTop, float NearZ, - float FarZ) noexcept; -XMMATRIX XM_CALLCONV XMMatrixOrthographicLH(float ViewWidth, float ViewHeight, - float NearZ, float FarZ) noexcept; -XMMATRIX XM_CALLCONV XMMatrixOrthographicRH(float ViewWidth, float ViewHeight, - float NearZ, float FarZ) noexcept; -XMMATRIX XM_CALLCONV XMMatrixOrthographicOffCenterLH(float ViewLeft, - float ViewRight, - float ViewBottom, - float ViewTop, float NearZ, - float FarZ) noexcept; -XMMATRIX XM_CALLCONV XMMatrixOrthographicOffCenterRH(float ViewLeft, - float ViewRight, - float ViewBottom, - float ViewTop, float NearZ, - float FarZ) noexcept; - -/**************************************************************************** - * - * Quaternion operations - * - ****************************************************************************/ - -bool XM_CALLCONV XMQuaternionEqual(FXMVECTOR Q1, FXMVECTOR Q2) noexcept; -bool XM_CALLCONV XMQuaternionNotEqual(FXMVECTOR Q1, FXMVECTOR Q2) noexcept; - -bool XM_CALLCONV XMQuaternionIsNaN(FXMVECTOR Q) noexcept; -bool XM_CALLCONV XMQuaternionIsInfinite(FXMVECTOR Q) noexcept; -bool XM_CALLCONV XMQuaternionIsIdentity(FXMVECTOR Q) noexcept; - -XMVECTOR XM_CALLCONV XMQuaternionDot(FXMVECTOR Q1, FXMVECTOR Q2) noexcept; -XMVECTOR XM_CALLCONV XMQuaternionMultiply(FXMVECTOR Q1, FXMVECTOR Q2) noexcept; -XMVECTOR XM_CALLCONV XMQuaternionLengthSq(FXMVECTOR Q) noexcept; -XMVECTOR XM_CALLCONV XMQuaternionReciprocalLength(FXMVECTOR Q) noexcept; -XMVECTOR XM_CALLCONV XMQuaternionLength(FXMVECTOR Q) noexcept; -XMVECTOR XM_CALLCONV XMQuaternionNormalizeEst(FXMVECTOR Q) noexcept; -XMVECTOR XM_CALLCONV XMQuaternionNormalize(FXMVECTOR Q) noexcept; -XMVECTOR XM_CALLCONV XMQuaternionConjugate(FXMVECTOR Q) noexcept; -XMVECTOR XM_CALLCONV XMQuaternionInverse(FXMVECTOR Q) noexcept; -XMVECTOR XM_CALLCONV XMQuaternionLn(FXMVECTOR Q) noexcept; -XMVECTOR XM_CALLCONV XMQuaternionExp(FXMVECTOR Q) noexcept; -XMVECTOR XM_CALLCONV XMQuaternionSlerp(FXMVECTOR Q0, FXMVECTOR Q1, - float t) noexcept; -XMVECTOR XM_CALLCONV XMQuaternionSlerpV(FXMVECTOR Q0, FXMVECTOR Q1, - FXMVECTOR T) noexcept; -XMVECTOR XM_CALLCONV XMQuaternionSquad(FXMVECTOR Q0, FXMVECTOR Q1, FXMVECTOR Q2, - GXMVECTOR Q3, float t) noexcept; -XMVECTOR XM_CALLCONV XMQuaternionSquadV(FXMVECTOR Q0, FXMVECTOR Q1, - FXMVECTOR Q2, GXMVECTOR Q3, - HXMVECTOR T) noexcept; -void XM_CALLCONV XMQuaternionSquadSetup(_Out_ XMVECTOR* pA, _Out_ XMVECTOR* pB, - _Out_ XMVECTOR* pC, _In_ FXMVECTOR Q0, - _In_ FXMVECTOR Q1, _In_ FXMVECTOR Q2, - _In_ GXMVECTOR Q3) noexcept; -XMVECTOR XM_CALLCONV XMQuaternionBaryCentric(FXMVECTOR Q0, FXMVECTOR Q1, - FXMVECTOR Q2, float f, - float g) noexcept; -XMVECTOR XM_CALLCONV XMQuaternionBaryCentricV(FXMVECTOR Q0, FXMVECTOR Q1, - FXMVECTOR Q2, GXMVECTOR F, - HXMVECTOR G) noexcept; - -XMVECTOR XM_CALLCONV XMQuaternionIdentity() noexcept; - -// Rotates about y-axis (Yaw), then x-axis (Pitch), then z-axis (Roll) -XMVECTOR XM_CALLCONV XMQuaternionRotationRollPitchYaw(float Pitch, float Yaw, - float Roll) noexcept; - -// Rotates about y-axis (Angles.y), then x-axis (Angles.x), then z-axis -// (Angles.z) -XMVECTOR XM_CALLCONV -XMQuaternionRotationRollPitchYawFromVector(FXMVECTOR Angles) noexcept; - -XMVECTOR XM_CALLCONV XMQuaternionRotationNormal(FXMVECTOR NormalAxis, - float Angle) noexcept; -XMVECTOR XM_CALLCONV XMQuaternionRotationAxis(FXMVECTOR Axis, - float Angle) noexcept; -XMVECTOR XM_CALLCONV XMQuaternionRotationMatrix(FXMMATRIX M) noexcept; - -void XM_CALLCONV XMQuaternionToAxisAngle(_Out_ XMVECTOR* pAxis, - _Out_ float* pAngle, - _In_ FXMVECTOR Q) noexcept; - -/**************************************************************************** - * - * Plane operations - * - ****************************************************************************/ - -bool XM_CALLCONV XMPlaneEqual(FXMVECTOR P1, FXMVECTOR P2) noexcept; -bool XM_CALLCONV XMPlaneNearEqual(FXMVECTOR P1, FXMVECTOR P2, - FXMVECTOR Epsilon) noexcept; -bool XM_CALLCONV XMPlaneNotEqual(FXMVECTOR P1, FXMVECTOR P2) noexcept; - -bool XM_CALLCONV XMPlaneIsNaN(FXMVECTOR P) noexcept; -bool XM_CALLCONV XMPlaneIsInfinite(FXMVECTOR P) noexcept; - -XMVECTOR XM_CALLCONV XMPlaneDot(FXMVECTOR P, FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMPlaneDotCoord(FXMVECTOR P, FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMPlaneDotNormal(FXMVECTOR P, FXMVECTOR V) noexcept; -XMVECTOR XM_CALLCONV XMPlaneNormalizeEst(FXMVECTOR P) noexcept; -XMVECTOR XM_CALLCONV XMPlaneNormalize(FXMVECTOR P) noexcept; -XMVECTOR XM_CALLCONV XMPlaneIntersectLine(FXMVECTOR P, FXMVECTOR LinePoint1, - FXMVECTOR LinePoint2) noexcept; -void XM_CALLCONV XMPlaneIntersectPlane(_Out_ XMVECTOR* pLinePoint1, - _Out_ XMVECTOR* pLinePoint2, - _In_ FXMVECTOR P1, - _In_ FXMVECTOR P2) noexcept; - -// Transforms a plane given an inverse transpose matrix -XMVECTOR XM_CALLCONV XMPlaneTransform(FXMVECTOR P, FXMMATRIX ITM) noexcept; - -// Transforms an array of planes given an inverse transpose matrix -XMFLOAT4* XM_CALLCONV XMPlaneTransformStream( - _Out_writes_bytes_(sizeof(XMFLOAT4) + OutputStride * (PlaneCount - 1)) - XMFLOAT4* pOutputStream, - _In_ size_t OutputStride, - _In_reads_bytes_(sizeof(XMFLOAT4) + InputStride * (PlaneCount - 1)) - const XMFLOAT4* pInputStream, - _In_ size_t InputStride, _In_ size_t PlaneCount, - _In_ FXMMATRIX ITM) noexcept; - -XMVECTOR XM_CALLCONV XMPlaneFromPointNormal(FXMVECTOR Point, - FXMVECTOR Normal) noexcept; -XMVECTOR XM_CALLCONV XMPlaneFromPoints(FXMVECTOR Point1, FXMVECTOR Point2, - FXMVECTOR Point3) noexcept; - -/**************************************************************************** - * - * Color operations - * - ****************************************************************************/ - -bool XM_CALLCONV XMColorEqual(FXMVECTOR C1, FXMVECTOR C2) noexcept; -bool XM_CALLCONV XMColorNotEqual(FXMVECTOR C1, FXMVECTOR C2) noexcept; -bool XM_CALLCONV XMColorGreater(FXMVECTOR C1, FXMVECTOR C2) noexcept; -bool XM_CALLCONV XMColorGreaterOrEqual(FXMVECTOR C1, FXMVECTOR C2) noexcept; -bool XM_CALLCONV XMColorLess(FXMVECTOR C1, FXMVECTOR C2) noexcept; -bool XM_CALLCONV XMColorLessOrEqual(FXMVECTOR C1, FXMVECTOR C2) noexcept; - -bool XM_CALLCONV XMColorIsNaN(FXMVECTOR C) noexcept; -bool XM_CALLCONV XMColorIsInfinite(FXMVECTOR C) noexcept; - -XMVECTOR XM_CALLCONV XMColorNegative(FXMVECTOR C) noexcept; -XMVECTOR XM_CALLCONV XMColorModulate(FXMVECTOR C1, FXMVECTOR C2) noexcept; -XMVECTOR XM_CALLCONV XMColorAdjustSaturation(FXMVECTOR C, - float Saturation) noexcept; -XMVECTOR XM_CALLCONV XMColorAdjustContrast(FXMVECTOR C, - float Contrast) noexcept; - -XMVECTOR XM_CALLCONV XMColorRGBToHSL(FXMVECTOR rgb) noexcept; -XMVECTOR XM_CALLCONV XMColorHSLToRGB(FXMVECTOR hsl) noexcept; - -XMVECTOR XM_CALLCONV XMColorRGBToHSV(FXMVECTOR rgb) noexcept; -XMVECTOR XM_CALLCONV XMColorHSVToRGB(FXMVECTOR hsv) noexcept; - -XMVECTOR XM_CALLCONV XMColorRGBToYUV(FXMVECTOR rgb) noexcept; -XMVECTOR XM_CALLCONV XMColorYUVToRGB(FXMVECTOR yuv) noexcept; - -XMVECTOR XM_CALLCONV XMColorRGBToYUV_HD(FXMVECTOR rgb) noexcept; -XMVECTOR XM_CALLCONV XMColorYUVToRGB_HD(FXMVECTOR yuv) noexcept; - -XMVECTOR XM_CALLCONV XMColorRGBToYUV_UHD(FXMVECTOR rgb) noexcept; -XMVECTOR XM_CALLCONV XMColorYUVToRGB_UHD(FXMVECTOR yuv) noexcept; - -XMVECTOR XM_CALLCONV XMColorRGBToXYZ(FXMVECTOR rgb) noexcept; -XMVECTOR XM_CALLCONV XMColorXYZToRGB(FXMVECTOR xyz) noexcept; - -XMVECTOR XM_CALLCONV XMColorXYZToSRGB(FXMVECTOR xyz) noexcept; -XMVECTOR XM_CALLCONV XMColorSRGBToXYZ(FXMVECTOR srgb) noexcept; - -XMVECTOR XM_CALLCONV XMColorRGBToSRGB(FXMVECTOR rgb) noexcept; -XMVECTOR XM_CALLCONV XMColorSRGBToRGB(FXMVECTOR srgb) noexcept; - -/**************************************************************************** - * - * Miscellaneous operations - * - ****************************************************************************/ - -bool XMVerifyCPUSupport() noexcept; - -XMVECTOR XM_CALLCONV XMFresnelTerm(FXMVECTOR CosIncidentAngle, - FXMVECTOR RefractionIndex) noexcept; - -bool XMScalarNearEqual(float S1, float S2, float Epsilon) noexcept; -float XMScalarModAngle(float Value) noexcept; - -float XMScalarSin(float Value) noexcept; -float XMScalarSinEst(float Value) noexcept; - -float XMScalarCos(float Value) noexcept; -float XMScalarCosEst(float Value) noexcept; - -void XMScalarSinCos(_Out_ float* pSin, _Out_ float* pCos, float Value) noexcept; -void XMScalarSinCosEst(_Out_ float* pSin, _Out_ float* pCos, - float Value) noexcept; - -float XMScalarASin(float Value) noexcept; -float XMScalarASinEst(float Value) noexcept; - -float XMScalarACos(float Value) noexcept; -float XMScalarACosEst(float Value) noexcept; - -/**************************************************************************** - * - * Templates - * - ****************************************************************************/ - -#if defined(__XNAMATH_H__) && defined(XMMin) -#undef XMMin -#undef XMMax -#endif - -template -inline T XMMin(T a, T b) noexcept { - return (a < b) ? a : b; -} -template -inline T XMMax(T a, T b) noexcept { - return (a > b) ? a : b; -} - -//------------------------------------------------------------------------------ - -#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - -// PermuteHelper internal template (SSE only) -namespace MathInternal { -// Slow path fallback for permutes that do not map to a single SSE shuffle -// opcode. -template -struct PermuteHelper { - static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) noexcept { - static const XMVECTORU32 selectMask = {{{ - WhichX ? 0xFFFFFFFF : 0, - WhichY ? 0xFFFFFFFF : 0, - WhichZ ? 0xFFFFFFFF : 0, - WhichW ? 0xFFFFFFFF : 0, - }}}; - - XMVECTOR shuffled1 = XM_PERMUTE_PS(v1, Shuffle); - XMVECTOR shuffled2 = XM_PERMUTE_PS(v2, Shuffle); - - XMVECTOR masked1 = _mm_andnot_ps(selectMask, shuffled1); - XMVECTOR masked2 = _mm_and_ps(selectMask, shuffled2); - - return _mm_or_ps(masked1, masked2); - } -}; - -// Fast path for permutes that only read from the first vector. -template -struct PermuteHelper { - static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR) noexcept { - return XM_PERMUTE_PS(v1, Shuffle); - } -}; - -// Fast path for permutes that only read from the second vector. -template -struct PermuteHelper { - static XMVECTOR XM_CALLCONV Permute(FXMVECTOR, FXMVECTOR v2) noexcept { - return XM_PERMUTE_PS(v2, Shuffle); - } -}; - -// Fast path for permutes that read XY from the first vector, ZW from the -// second. -template -struct PermuteHelper { - static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) noexcept { - return _mm_shuffle_ps(v1, v2, Shuffle); - } -}; - -// Fast path for permutes that read XY from the second vector, ZW from the -// first. -template -struct PermuteHelper { - static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) noexcept { - return _mm_shuffle_ps(v2, v1, Shuffle); - } -}; -} // namespace MathInternal - -#endif // _XM_SSE_INTRINSICS_ && !_XM_NO_INTRINSICS_ - -// General permute template -template -inline XMVECTOR XM_CALLCONV XMVectorPermute(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - static_assert(PermuteX <= 7, "PermuteX template parameter out of range"); - static_assert(PermuteY <= 7, "PermuteY template parameter out of range"); - static_assert(PermuteZ <= 7, "PermuteZ template parameter out of range"); - static_assert(PermuteW <= 7, "PermuteW template parameter out of range"); - -#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - constexpr uint32_t Shuffle = - _MM_SHUFFLE(PermuteW & 3, PermuteZ & 3, PermuteY & 3, PermuteX & 3); - - constexpr bool WhichX = PermuteX > 3; - constexpr bool WhichY = PermuteY > 3; - constexpr bool WhichZ = PermuteZ > 3; - constexpr bool WhichW = PermuteW > 3; - - return MathInternal::PermuteHelper::Permute(V1, V2); -#else - - return XMVectorPermute(V1, V2, PermuteX, PermuteY, PermuteZ, PermuteW); - -#endif -} - -// Special-case permute templates -template <> -constexpr XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 2, 3>(FXMVECTOR V1, - FXMVECTOR) noexcept { - return V1; -} -template <> -constexpr XMVECTOR XM_CALLCONV -XMVectorPermute<4, 5, 6, 7>(FXMVECTOR, FXMVECTOR V2) noexcept { - return V2; -} - -#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 4, 5>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return _mm_movelh_ps(V1, V2); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<6, 7, 2, 3>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return _mm_movehl_ps(V1, V2); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 4, 1, 5>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return _mm_unpacklo_ps(V1, V2); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 6, 3, 7>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return _mm_unpackhi_ps(V1, V2); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 3, 6, 7>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return _mm_castpd_ps(_mm_unpackhi_pd(_mm_castps_pd(V1), _mm_castps_pd(V2))); -} -#endif - -#if defined(_XM_SSE4_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 2, 3>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return _mm_blend_ps(V1, V2, 0x1); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 2, 3>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return _mm_blend_ps(V1, V2, 0x2); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 2, 3>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return _mm_blend_ps(V1, V2, 0x3); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 6, 3>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return _mm_blend_ps(V1, V2, 0x4); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 6, 3>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return _mm_blend_ps(V1, V2, 0x5); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 6, 3>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return _mm_blend_ps(V1, V2, 0x6); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 6, 3>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return _mm_blend_ps(V1, V2, 0x7); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 2, 7>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return _mm_blend_ps(V1, V2, 0x8); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 2, 7>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return _mm_blend_ps(V1, V2, 0x9); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 2, 7>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return _mm_blend_ps(V1, V2, 0xA); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 2, 7>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return _mm_blend_ps(V1, V2, 0xB); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 6, 7>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return _mm_blend_ps(V1, V2, 0xC); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 6, 7>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return _mm_blend_ps(V1, V2, 0xD); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 6, 7>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return _mm_blend_ps(V1, V2, 0xE); -} -#endif - -#if defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - -// If the indices are all in the range 0-3 or 4-7, then use XMVectorSwizzle -// instead The mirror cases are not spelled out here as the programmer can -// always swap the arguments (i.e. prefer permutes where the X element comes -// from the V1 vector instead of the V2 vector) - -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 4, 5>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vcombine_f32(vget_low_f32(V1), vget_low_f32(V2)); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 0, 4, 5>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vcombine_f32(vrev64_f32(vget_low_f32(V1)), vget_low_f32(V2)); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 5, 4>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vcombine_f32(vget_low_f32(V1), vrev64_f32(vget_low_f32(V2))); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 0, 5, 4>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vcombine_f32(vrev64_f32(vget_low_f32(V1)), - vrev64_f32(vget_low_f32(V2))); -} - -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 3, 6, 7>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vcombine_f32(vget_high_f32(V1), vget_high_f32(V2)); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<3, 2, 6, 7>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vcombine_f32(vrev64_f32(vget_high_f32(V1)), vget_high_f32(V2)); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 3, 7, 6>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vcombine_f32(vget_high_f32(V1), vrev64_f32(vget_high_f32(V2))); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<3, 2, 7, 6>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vcombine_f32(vrev64_f32(vget_high_f32(V1)), - vrev64_f32(vget_high_f32(V2))); -} - -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 6, 7>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vcombine_f32(vget_low_f32(V1), vget_high_f32(V2)); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 0, 6, 7>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vcombine_f32(vrev64_f32(vget_low_f32(V1)), vget_high_f32(V2)); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 7, 6>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vcombine_f32(vget_low_f32(V1), vrev64_f32(vget_high_f32(V2))); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 0, 7, 6>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vcombine_f32(vrev64_f32(vget_low_f32(V1)), - vrev64_f32(vget_high_f32(V2))); -} - -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<3, 2, 4, 5>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vcombine_f32(vrev64_f32(vget_high_f32(V1)), vget_low_f32(V2)); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 3, 5, 4>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vcombine_f32(vget_high_f32(V1), vrev64_f32(vget_low_f32(V2))); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<3, 2, 5, 4>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vcombine_f32(vrev64_f32(vget_high_f32(V1)), - vrev64_f32(vget_low_f32(V2))); -} - -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 4, 2, 6>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vtrnq_f32(V1, V2).val[0]; -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 5, 3, 7>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vtrnq_f32(V1, V2).val[1]; -} - -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 4, 1, 5>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vzipq_f32(V1, V2).val[0]; -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 6, 3, 7>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vzipq_f32(V1, V2).val[1]; -} - -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 2, 4, 6>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vuzpq_f32(V1, V2).val[0]; -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 3, 5, 7>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vuzpq_f32(V1, V2).val[1]; -} - -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 2, 3, 4>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vextq_f32(V1, V2, 1); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 3, 4, 5>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vextq_f32(V1, V2, 2); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorPermute<3, 4, 5, 6>(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - return vextq_f32(V1, V2, 3); -} - -#endif // _XM_ARM_NEON_INTRINSICS_ && !_XM_NO_INTRINSICS_ - -//------------------------------------------------------------------------------ - -// General swizzle template -template -inline XMVECTOR XM_CALLCONV XMVectorSwizzle(FXMVECTOR V) noexcept { - static_assert(SwizzleX <= 3, "SwizzleX template parameter out of range"); - static_assert(SwizzleY <= 3, "SwizzleY template parameter out of range"); - static_assert(SwizzleZ <= 3, "SwizzleZ template parameter out of range"); - static_assert(SwizzleW <= 3, "SwizzleW template parameter out of range"); - -#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - return XM_PERMUTE_PS(V, - _MM_SHUFFLE(SwizzleW, SwizzleZ, SwizzleY, SwizzleX)); -#else - - return XMVectorSwizzle(V, SwizzleX, SwizzleY, SwizzleZ, SwizzleW); - -#endif -} - -// Specialized swizzles -template <> -constexpr XMVECTOR XM_CALLCONV -XMVectorSwizzle<0, 1, 2, 3>(FXMVECTOR V) noexcept { - return V; -} - -#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 1, 0, 1>(FXMVECTOR V) noexcept { - return _mm_movelh_ps(V, V); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 3, 2, 3>(FXMVECTOR V) noexcept { - return _mm_movehl_ps(V, V); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 1, 1>(FXMVECTOR V) noexcept { - return _mm_unpacklo_ps(V, V); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 2, 3, 3>(FXMVECTOR V) noexcept { - return _mm_unpackhi_ps(V, V); -} -#endif - -#if defined(_XM_SSE3_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 2, 2>(FXMVECTOR V) noexcept { - return _mm_moveldup_ps(V); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 1, 3, 3>(FXMVECTOR V) noexcept { - return _mm_movehdup_ps(V); -} -#endif - -#if defined(_XM_AVX2_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) && \ - defined(_XM_FAVOR_INTEL_) -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 0, 0>(FXMVECTOR V) noexcept { - return _mm_broadcastss_ps(V); -} -#endif - -#if defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 0, 0>(FXMVECTOR V) noexcept { - return vdupq_lane_f32(vget_low_f32(V), 0); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 1, 1, 1>(FXMVECTOR V) noexcept { - return vdupq_lane_f32(vget_low_f32(V), 1); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 2, 2, 2>(FXMVECTOR V) noexcept { - return vdupq_lane_f32(vget_high_f32(V), 0); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<3, 3, 3, 3>(FXMVECTOR V) noexcept { - return vdupq_lane_f32(vget_high_f32(V), 1); -} - -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 0, 3, 2>(FXMVECTOR V) noexcept { - return vrev64q_f32(V); -} - -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 1, 0, 1>(FXMVECTOR V) noexcept { - float32x2_t vt = vget_low_f32(V); - return vcombine_f32(vt, vt); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 3, 2, 3>(FXMVECTOR V) noexcept { - float32x2_t vt = vget_high_f32(V); - return vcombine_f32(vt, vt); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 0, 1, 0>(FXMVECTOR V) noexcept { - float32x2_t vt = vrev64_f32(vget_low_f32(V)); - return vcombine_f32(vt, vt); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<3, 2, 3, 2>(FXMVECTOR V) noexcept { - float32x2_t vt = vrev64_f32(vget_high_f32(V)); - return vcombine_f32(vt, vt); -} - -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 1, 3, 2>(FXMVECTOR V) noexcept { - return vcombine_f32(vget_low_f32(V), vrev64_f32(vget_high_f32(V))); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 0, 2, 3>(FXMVECTOR V) noexcept { - return vcombine_f32(vrev64_f32(vget_low_f32(V)), vget_high_f32(V)); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 3, 1, 0>(FXMVECTOR V) noexcept { - return vcombine_f32(vget_high_f32(V), vrev64_f32(vget_low_f32(V))); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<3, 2, 0, 1>(FXMVECTOR V) noexcept { - return vcombine_f32(vrev64_f32(vget_high_f32(V)), vget_low_f32(V)); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<3, 2, 1, 0>(FXMVECTOR V) noexcept { - return vcombine_f32(vrev64_f32(vget_high_f32(V)), - vrev64_f32(vget_low_f32(V))); -} - -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 2, 2>(FXMVECTOR V) noexcept { - return vtrnq_f32(V, V).val[0]; -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 1, 3, 3>(FXMVECTOR V) noexcept { - return vtrnq_f32(V, V).val[1]; -} - -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 1, 1>(FXMVECTOR V) noexcept { - return vzipq_f32(V, V).val[0]; -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 2, 3, 3>(FXMVECTOR V) noexcept { - return vzipq_f32(V, V).val[1]; -} - -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 2, 0, 2>(FXMVECTOR V) noexcept { - return vuzpq_f32(V, V).val[0]; -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 3, 1, 3>(FXMVECTOR V) noexcept { - return vuzpq_f32(V, V).val[1]; -} - -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 2, 3, 0>(FXMVECTOR V) noexcept { - return vextq_f32(V, V, 1); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 3, 0, 1>(FXMVECTOR V) noexcept { - return vextq_f32(V, V, 2); -} -template <> -inline XMVECTOR XM_CALLCONV XMVectorSwizzle<3, 0, 1, 2>(FXMVECTOR V) noexcept { - return vextq_f32(V, V, 3); -} - -#endif // _XM_ARM_NEON_INTRINSICS_ && !_XM_NO_INTRINSICS_ - -//------------------------------------------------------------------------------ - -template -inline XMVECTOR XM_CALLCONV XMVectorShiftLeft(FXMVECTOR V1, - FXMVECTOR V2) noexcept { - static_assert(Elements < 4, "Elements template parameter out of range"); - return XMVectorPermute(V1, V2); -} - -template -inline XMVECTOR XM_CALLCONV XMVectorRotateLeft(FXMVECTOR V) noexcept { - static_assert(Elements < 4, "Elements template parameter out of range"); - return XMVectorSwizzle(V); -} - -template -inline XMVECTOR XM_CALLCONV XMVectorRotateRight(FXMVECTOR V) noexcept { - static_assert(Elements < 4, "Elements template parameter out of range"); - return XMVectorSwizzle<(4 - Elements) & 3, (5 - Elements) & 3, - (6 - Elements) & 3, (7 - Elements) & 3>(V); -} - -template -inline XMVECTOR XM_CALLCONV XMVectorInsert(FXMVECTOR VD, - FXMVECTOR VS) noexcept { - XMVECTOR Control = XMVectorSelectControl(Select0 & 1, Select1 & 1, - Select2 & 1, Select3 & 1); - return XMVectorSelect(VD, XMVectorRotateLeft(VS), - Control); -} - -/**************************************************************************** - * - * Globals - * - ****************************************************************************/ - -// The purpose of the following global constants is to prevent redundant -// reloading of the constants when they are referenced by more than one -// separate inline math routine called within the same function. Declaring -// a constant locally within a routine is sufficient to prevent redundant -// reloads of that constant when that single routine is called multiple -// times in a function, but if the constant is used (and declared) in a -// separate math routine it would be reloaded. - -#ifndef XMGLOBALCONST -#if defined(__GNUC__) && !defined(__MINGW32__) -#define XMGLOBALCONST extern const __attribute__((weak)) -#else -#define XMGLOBALCONST extern const __declspec(selectany) -#endif -#endif - -XMGLOBALCONST XMVECTORF32 g_XMSinCoefficients0 = { - {{-0.16666667f, +0.0083333310f, -0.00019840874f, +2.7525562e-06f}}}; -XMGLOBALCONST XMVECTORF32 g_XMSinCoefficients1 = { - {{-2.3889859e-08f, -0.16665852f /*Est1*/, +0.0083139502f /*Est2*/, - -0.00018524670f /*Est3*/}}}; -XMGLOBALCONST XMVECTORF32 g_XMCosCoefficients0 = { - {{-0.5f, +0.041666638f, -0.0013888378f, +2.4760495e-05f}}}; -XMGLOBALCONST XMVECTORF32 g_XMCosCoefficients1 = { - {{-2.6051615e-07f, -0.49992746f /*Est1*/, +0.041493919f /*Est2*/, - -0.0012712436f /*Est3*/}}}; -XMGLOBALCONST XMVECTORF32 g_XMTanCoefficients0 = { - {{1.0f, 0.333333333f, 0.133333333f, 5.396825397e-2f}}}; -XMGLOBALCONST XMVECTORF32 g_XMTanCoefficients1 = { - {{2.186948854e-2f, 8.863235530e-3f, 3.592128167e-3f, 1.455834485e-3f}}}; -XMGLOBALCONST XMVECTORF32 g_XMTanCoefficients2 = { - {{5.900274264e-4f, 2.391290764e-4f, 9.691537707e-5f, 3.927832950e-5f}}}; -XMGLOBALCONST XMVECTORF32 g_XMArcCoefficients0 = { - {{+1.5707963050f, -0.2145988016f, +0.0889789874f, -0.0501743046f}}}; -XMGLOBALCONST XMVECTORF32 g_XMArcCoefficients1 = { - {{+0.0308918810f, -0.0170881256f, +0.0066700901f, -0.0012624911f}}}; -XMGLOBALCONST XMVECTORF32 g_XMATanCoefficients0 = { - {{-0.3333314528f, +0.1999355085f, -0.1420889944f, +0.1065626393f}}}; -XMGLOBALCONST XMVECTORF32 g_XMATanCoefficients1 = { - {{-0.0752896400f, +0.0429096138f, -0.0161657367f, +0.0028662257f}}}; -XMGLOBALCONST XMVECTORF32 g_XMATanEstCoefficients0 = { - {{+0.999866f, +0.999866f, +0.999866f, +0.999866f}}}; -XMGLOBALCONST XMVECTORF32 g_XMATanEstCoefficients1 = { - {{-0.3302995f, +0.180141f, -0.085133f, +0.0208351f}}}; -XMGLOBALCONST XMVECTORF32 g_XMTanEstCoefficients = { - {{2.484f, -1.954923183e-1f, 2.467401101f, XM_1DIVPI}}}; -XMGLOBALCONST XMVECTORF32 g_XMArcEstCoefficients = { - {{+1.5707288f, -0.2121144f, +0.0742610f, -0.0187293f}}}; -XMGLOBALCONST XMVECTORF32 g_XMPiConstants0 = { - {{XM_PI, XM_2PI, XM_1DIVPI, XM_1DIV2PI}}}; -XMGLOBALCONST XMVECTORF32 g_XMIdentityR0 = {{{1.0f, 0.0f, 0.0f, 0.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMIdentityR1 = {{{0.0f, 1.0f, 0.0f, 0.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMIdentityR2 = {{{0.0f, 0.0f, 1.0f, 0.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMIdentityR3 = {{{0.0f, 0.0f, 0.0f, 1.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMNegIdentityR0 = {{{-1.0f, 0.0f, 0.0f, 0.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMNegIdentityR1 = {{{0.0f, -1.0f, 0.0f, 0.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMNegIdentityR2 = {{{0.0f, 0.0f, -1.0f, 0.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMNegIdentityR3 = {{{0.0f, 0.0f, 0.0f, -1.0f}}}; -XMGLOBALCONST XMVECTORU32 g_XMNegativeZero = { - {{0x80000000, 0x80000000, 0x80000000, 0x80000000}}}; -XMGLOBALCONST XMVECTORU32 g_XMNegate3 = { - {{0x80000000, 0x80000000, 0x80000000, 0x00000000}}}; -XMGLOBALCONST XMVECTORU32 g_XMMaskXY = { - {{0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000}}}; -XMGLOBALCONST XMVECTORU32 g_XMMask3 = { - {{0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000}}}; -XMGLOBALCONST XMVECTORU32 g_XMMaskX = { - {{0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000}}}; -XMGLOBALCONST XMVECTORU32 g_XMMaskY = { - {{0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000}}}; -XMGLOBALCONST XMVECTORU32 g_XMMaskZ = { - {{0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000}}}; -XMGLOBALCONST XMVECTORU32 g_XMMaskW = { - {{0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF}}}; -XMGLOBALCONST XMVECTORF32 g_XMOne = {{{1.0f, 1.0f, 1.0f, 1.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMOne3 = {{{1.0f, 1.0f, 1.0f, 0.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMZero = {{{0.0f, 0.0f, 0.0f, 0.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMTwo = {{{2.f, 2.f, 2.f, 2.f}}}; -XMGLOBALCONST XMVECTORF32 g_XMFour = {{{4.f, 4.f, 4.f, 4.f}}}; -XMGLOBALCONST XMVECTORF32 g_XMSix = {{{6.f, 6.f, 6.f, 6.f}}}; -XMGLOBALCONST XMVECTORF32 g_XMNegativeOne = {{{-1.0f, -1.0f, -1.0f, -1.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMOneHalf = {{{0.5f, 0.5f, 0.5f, 0.5f}}}; -XMGLOBALCONST XMVECTORF32 g_XMNegativeOneHalf = { - {{-0.5f, -0.5f, -0.5f, -0.5f}}}; -XMGLOBALCONST XMVECTORF32 g_XMNegativeTwoPi = { - {{-XM_2PI, -XM_2PI, -XM_2PI, -XM_2PI}}}; -XMGLOBALCONST XMVECTORF32 g_XMNegativePi = {{{-XM_PI, -XM_PI, -XM_PI, -XM_PI}}}; -XMGLOBALCONST XMVECTORF32 g_XMHalfPi = { - {{XM_PIDIV2, XM_PIDIV2, XM_PIDIV2, XM_PIDIV2}}}; -XMGLOBALCONST XMVECTORF32 g_XMPi = {{{XM_PI, XM_PI, XM_PI, XM_PI}}}; -XMGLOBALCONST XMVECTORF32 g_XMReciprocalPi = { - {{XM_1DIVPI, XM_1DIVPI, XM_1DIVPI, XM_1DIVPI}}}; -XMGLOBALCONST XMVECTORF32 g_XMTwoPi = {{{XM_2PI, XM_2PI, XM_2PI, XM_2PI}}}; -XMGLOBALCONST XMVECTORF32 g_XMReciprocalTwoPi = { - {{XM_1DIV2PI, XM_1DIV2PI, XM_1DIV2PI, XM_1DIV2PI}}}; -XMGLOBALCONST XMVECTORF32 g_XMEpsilon = { - {{1.192092896e-7f, 1.192092896e-7f, 1.192092896e-7f, 1.192092896e-7f}}}; -XMGLOBALCONST XMVECTORI32 g_XMInfinity = { - {{0x7F800000, 0x7F800000, 0x7F800000, 0x7F800000}}}; -XMGLOBALCONST XMVECTORI32 g_XMQNaN = { - {{0x7FC00000, 0x7FC00000, 0x7FC00000, 0x7FC00000}}}; -XMGLOBALCONST XMVECTORI32 g_XMQNaNTest = { - {{0x007FFFFF, 0x007FFFFF, 0x007FFFFF, 0x007FFFFF}}}; -XMGLOBALCONST XMVECTORI32 g_XMAbsMask = { - {{0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF}}}; -XMGLOBALCONST XMVECTORI32 g_XMFltMin = { - {{0x00800000, 0x00800000, 0x00800000, 0x00800000}}}; -XMGLOBALCONST XMVECTORI32 g_XMFltMax = { - {{0x7F7FFFFF, 0x7F7FFFFF, 0x7F7FFFFF, 0x7F7FFFFF}}}; -XMGLOBALCONST XMVECTORU32 g_XMNegOneMask = { - {{0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF}}}; -XMGLOBALCONST XMVECTORU32 g_XMMaskA8R8G8B8 = { - {{0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000}}}; -XMGLOBALCONST XMVECTORU32 g_XMFlipA8R8G8B8 = { - {{0x00000000, 0x00000000, 0x00000000, 0x80000000}}}; -XMGLOBALCONST XMVECTORF32 g_XMFixAA8R8G8B8 = { - {{0.0f, 0.0f, 0.0f, float(0x80000000U)}}}; -XMGLOBALCONST XMVECTORF32 g_XMNormalizeA8R8G8B8 = { - {{1.0f / (255.0f * float(0x10000)), 1.0f / (255.0f * float(0x100)), - 1.0f / 255.0f, 1.0f / (255.0f * float(0x1000000))}}}; -XMGLOBALCONST XMVECTORU32 g_XMMaskA2B10G10R10 = { - {{0x000003FF, 0x000FFC00, 0x3FF00000, 0xC0000000}}}; -XMGLOBALCONST XMVECTORU32 g_XMFlipA2B10G10R10 = { - {{0x00000200, 0x00080000, 0x20000000, 0x80000000}}}; -XMGLOBALCONST XMVECTORF32 g_XMFixAA2B10G10R10 = { - {{-512.0f, -512.0f * float(0x400), -512.0f * float(0x100000), - float(0x80000000U)}}}; -XMGLOBALCONST XMVECTORF32 g_XMNormalizeA2B10G10R10 = { - {{1.0f / 511.0f, 1.0f / (511.0f * float(0x400)), - 1.0f / (511.0f * float(0x100000)), 1.0f / (3.0f * float(0x40000000))}}}; -XMGLOBALCONST XMVECTORU32 g_XMMaskX16Y16 = { - {{0x0000FFFF, 0xFFFF0000, 0x00000000, 0x00000000}}}; -XMGLOBALCONST XMVECTORI32 g_XMFlipX16Y16 = { - {{0x00008000, 0x00000000, 0x00000000, 0x00000000}}}; -XMGLOBALCONST XMVECTORF32 g_XMFixX16Y16 = {{{-32768.0f, 0.0f, 0.0f, 0.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMNormalizeX16Y16 = { - {{1.0f / 32767.0f, 1.0f / (32767.0f * 65536.0f), 0.0f, 0.0f}}}; -XMGLOBALCONST XMVECTORU32 g_XMMaskX16Y16Z16W16 = { - {{0x0000FFFF, 0x0000FFFF, 0xFFFF0000, 0xFFFF0000}}}; -XMGLOBALCONST XMVECTORI32 g_XMFlipX16Y16Z16W16 = { - {{0x00008000, 0x00008000, 0x00000000, 0x00000000}}}; -XMGLOBALCONST XMVECTORF32 g_XMFixX16Y16Z16W16 = { - {{-32768.0f, -32768.0f, 0.0f, 0.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMNormalizeX16Y16Z16W16 = { - {{1.0f / 32767.0f, 1.0f / 32767.0f, 1.0f / (32767.0f * 65536.0f), - 1.0f / (32767.0f * 65536.0f)}}}; -XMGLOBALCONST XMVECTORF32 g_XMNoFraction = { - {{8388608.0f, 8388608.0f, 8388608.0f, 8388608.0f}}}; -XMGLOBALCONST XMVECTORI32 g_XMMaskByte = { - {{0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF}}}; -XMGLOBALCONST XMVECTORF32 g_XMNegateX = {{{-1.0f, 1.0f, 1.0f, 1.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMNegateY = {{{1.0f, -1.0f, 1.0f, 1.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMNegateZ = {{{1.0f, 1.0f, -1.0f, 1.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMNegateW = {{{1.0f, 1.0f, 1.0f, -1.0f}}}; -XMGLOBALCONST XMVECTORU32 g_XMSelect0101 = { - {{XM_SELECT_0, XM_SELECT_1, XM_SELECT_0, XM_SELECT_1}}}; -XMGLOBALCONST XMVECTORU32 g_XMSelect1010 = { - {{XM_SELECT_1, XM_SELECT_0, XM_SELECT_1, XM_SELECT_0}}}; -XMGLOBALCONST XMVECTORI32 g_XMOneHalfMinusEpsilon = { - {{0x3EFFFFFD, 0x3EFFFFFD, 0x3EFFFFFD, 0x3EFFFFFD}}}; -XMGLOBALCONST XMVECTORU32 g_XMSelect1000 = { - {{XM_SELECT_1, XM_SELECT_0, XM_SELECT_0, XM_SELECT_0}}}; -XMGLOBALCONST XMVECTORU32 g_XMSelect1100 = { - {{XM_SELECT_1, XM_SELECT_1, XM_SELECT_0, XM_SELECT_0}}}; -XMGLOBALCONST XMVECTORU32 g_XMSelect1110 = { - {{XM_SELECT_1, XM_SELECT_1, XM_SELECT_1, XM_SELECT_0}}}; -XMGLOBALCONST XMVECTORU32 g_XMSelect1011 = { - {{XM_SELECT_1, XM_SELECT_0, XM_SELECT_1, XM_SELECT_1}}}; -XMGLOBALCONST XMVECTORF32 g_XMFixupY16 = { - {{1.0f, 1.0f / 65536.0f, 0.0f, 0.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMFixupY16W16 = { - {{1.0f, 1.0f, 1.0f / 65536.0f, 1.0f / 65536.0f}}}; -XMGLOBALCONST XMVECTORU32 g_XMFlipY = {{{0, 0x80000000, 0, 0}}}; -XMGLOBALCONST XMVECTORU32 g_XMFlipZ = {{{0, 0, 0x80000000, 0}}}; -XMGLOBALCONST XMVECTORU32 g_XMFlipW = {{{0, 0, 0, 0x80000000}}}; -XMGLOBALCONST XMVECTORU32 g_XMFlipYZ = {{{0, 0x80000000, 0x80000000, 0}}}; -XMGLOBALCONST XMVECTORU32 g_XMFlipZW = {{{0, 0, 0x80000000, 0x80000000}}}; -XMGLOBALCONST XMVECTORU32 g_XMFlipYW = {{{0, 0x80000000, 0, 0x80000000}}}; -XMGLOBALCONST XMVECTORI32 g_XMMaskDec4 = { - {{0x3FF, 0x3FF << 10, 0x3FF << 20, static_cast(0xC0000000)}}}; -XMGLOBALCONST XMVECTORI32 g_XMXorDec4 = { - {{0x200, 0x200 << 10, 0x200 << 20, 0}}}; -XMGLOBALCONST XMVECTORF32 g_XMAddUDec4 = {{{0, 0, 0, 32768.0f * 65536.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMAddDec4 = { - {{-512.0f, -512.0f * 1024.0f, -512.0f * 1024.0f * 1024.0f, 0}}}; -XMGLOBALCONST XMVECTORF32 g_XMMulDec4 = { - {{1.0f, 1.0f / 1024.0f, 1.0f / (1024.0f * 1024.0f), - 1.0f / (1024.0f * 1024.0f * 1024.0f)}}}; -XMGLOBALCONST XMVECTORU32 g_XMMaskByte4 = { - {{0xFF, 0xFF00, 0xFF0000, 0xFF000000}}}; -XMGLOBALCONST XMVECTORI32 g_XMXorByte4 = { - {{0x80, 0x8000, 0x800000, 0x00000000}}}; -XMGLOBALCONST XMVECTORF32 g_XMAddByte4 = { - {{-128.0f, -128.0f * 256.0f, -128.0f * 65536.0f, 0}}}; -XMGLOBALCONST XMVECTORF32 g_XMFixUnsigned = { - {{32768.0f * 65536.0f, 32768.0f * 65536.0f, 32768.0f * 65536.0f, - 32768.0f * 65536.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMMaxInt = { - {{65536.0f * 32768.0f - 128.0f, 65536.0f * 32768.0f - 128.0f, - 65536.0f * 32768.0f - 128.0f, 65536.0f * 32768.0f - 128.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMMaxUInt = { - {{65536.0f * 65536.0f - 256.0f, 65536.0f * 65536.0f - 256.0f, - 65536.0f * 65536.0f - 256.0f, 65536.0f * 65536.0f - 256.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMUnsignedFix = { - {{32768.0f * 65536.0f, 32768.0f * 65536.0f, 32768.0f * 65536.0f, - 32768.0f * 65536.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMsrgbScale = {{{12.92f, 12.92f, 12.92f, 1.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMsrgbA = {{{0.055f, 0.055f, 0.055f, 0.0f}}}; -XMGLOBALCONST XMVECTORF32 g_XMsrgbA1 = {{{1.055f, 1.055f, 1.055f, 1.0f}}}; -XMGLOBALCONST XMVECTORI32 g_XMExponentBias = {{{127, 127, 127, 127}}}; -XMGLOBALCONST XMVECTORI32 g_XMSubnormalExponent = {{{-126, -126, -126, -126}}}; -XMGLOBALCONST XMVECTORI32 g_XMNumTrailing = {{{23, 23, 23, 23}}}; -XMGLOBALCONST XMVECTORI32 g_XMMinNormal = { - {{0x00800000, 0x00800000, 0x00800000, 0x00800000}}}; -XMGLOBALCONST XMVECTORU32 g_XMNegInfinity = { - {{0xFF800000, 0xFF800000, 0xFF800000, 0xFF800000}}}; -XMGLOBALCONST XMVECTORU32 g_XMNegQNaN = { - {{0xFFC00000, 0xFFC00000, 0xFFC00000, 0xFFC00000}}}; -XMGLOBALCONST XMVECTORI32 g_XMBin128 = { - {{0x43000000, 0x43000000, 0x43000000, 0x43000000}}}; -XMGLOBALCONST XMVECTORU32 g_XMBinNeg150 = { - {{0xC3160000, 0xC3160000, 0xC3160000, 0xC3160000}}}; -XMGLOBALCONST XMVECTORI32 g_XM253 = {{{253, 253, 253, 253}}}; -XMGLOBALCONST XMVECTORF32 g_XMExpEst1 = { - {{-6.93147182e-1f, -6.93147182e-1f, -6.93147182e-1f, -6.93147182e-1f}}}; -XMGLOBALCONST XMVECTORF32 g_XMExpEst2 = { - {{+2.40226462e-1f, +2.40226462e-1f, +2.40226462e-1f, +2.40226462e-1f}}}; -XMGLOBALCONST XMVECTORF32 g_XMExpEst3 = { - {{-5.55036440e-2f, -5.55036440e-2f, -5.55036440e-2f, -5.55036440e-2f}}}; -XMGLOBALCONST XMVECTORF32 g_XMExpEst4 = { - {{+9.61597636e-3f, +9.61597636e-3f, +9.61597636e-3f, +9.61597636e-3f}}}; -XMGLOBALCONST XMVECTORF32 g_XMExpEst5 = { - {{-1.32823968e-3f, -1.32823968e-3f, -1.32823968e-3f, -1.32823968e-3f}}}; -XMGLOBALCONST XMVECTORF32 g_XMExpEst6 = { - {{+1.47491097e-4f, +1.47491097e-4f, +1.47491097e-4f, +1.47491097e-4f}}}; -XMGLOBALCONST XMVECTORF32 g_XMExpEst7 = { - {{-1.08635004e-5f, -1.08635004e-5f, -1.08635004e-5f, -1.08635004e-5f}}}; -XMGLOBALCONST XMVECTORF32 g_XMLogEst0 = { - {{+1.442693f, +1.442693f, +1.442693f, +1.442693f}}}; -XMGLOBALCONST XMVECTORF32 g_XMLogEst1 = { - {{-0.721242f, -0.721242f, -0.721242f, -0.721242f}}}; -XMGLOBALCONST XMVECTORF32 g_XMLogEst2 = { - {{+0.479384f, +0.479384f, +0.479384f, +0.479384f}}}; -XMGLOBALCONST XMVECTORF32 g_XMLogEst3 = { - {{-0.350295f, -0.350295f, -0.350295f, -0.350295f}}}; -XMGLOBALCONST XMVECTORF32 g_XMLogEst4 = { - {{+0.248590f, +0.248590f, +0.248590f, +0.248590f}}}; -XMGLOBALCONST XMVECTORF32 g_XMLogEst5 = { - {{-0.145700f, -0.145700f, -0.145700f, -0.145700f}}}; -XMGLOBALCONST XMVECTORF32 g_XMLogEst6 = { - {{+0.057148f, +0.057148f, +0.057148f, +0.057148f}}}; -XMGLOBALCONST XMVECTORF32 g_XMLogEst7 = { - {{-0.010578f, -0.010578f, -0.010578f, -0.010578f}}}; -XMGLOBALCONST XMVECTORF32 g_XMLgE = { - {{+1.442695f, +1.442695f, +1.442695f, +1.442695f}}}; -XMGLOBALCONST XMVECTORF32 g_XMInvLgE = { - {{+6.93147182e-1f, +6.93147182e-1f, +6.93147182e-1f, +6.93147182e-1f}}}; -XMGLOBALCONST XMVECTORF32 g_XMLg10 = { - {{+3.321928f, +3.321928f, +3.321928f, +3.321928f}}}; -XMGLOBALCONST XMVECTORF32 g_XMInvLg10 = { - {{+3.010299956e-1f, +3.010299956e-1f, +3.010299956e-1f, +3.010299956e-1f}}}; -XMGLOBALCONST XMVECTORF32 g_UByteMax = {{{255.0f, 255.0f, 255.0f, 255.0f}}}; -XMGLOBALCONST XMVECTORF32 g_ByteMin = {{{-127.0f, -127.0f, -127.0f, -127.0f}}}; -XMGLOBALCONST XMVECTORF32 g_ByteMax = {{{127.0f, 127.0f, 127.0f, 127.0f}}}; -XMGLOBALCONST XMVECTORF32 g_ShortMin = { - {{-32767.0f, -32767.0f, -32767.0f, -32767.0f}}}; -XMGLOBALCONST XMVECTORF32 g_ShortMax = { - {{32767.0f, 32767.0f, 32767.0f, 32767.0f}}}; -XMGLOBALCONST XMVECTORF32 g_UShortMax = { - {{65535.0f, 65535.0f, 65535.0f, 65535.0f}}}; - -/**************************************************************************** - * - * Implementation - * - ****************************************************************************/ - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4068 4214 4204 4365 4616 4640 6001 6101) -// C4068/4616: ignore unknown pragmas -// C4214/4204: nonstandard extension used -// C4365/4640: Off by default noise -// C6001/6101: False positives -#endif - -#ifdef _PREFAST_ -#pragma prefast(push) -#pragma prefast(disable : 25000, "FXMVECTOR is 16 bytes") -#pragma prefast(disable : 26495, "Union initialization confuses /analyze") -#endif - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wfloat-equal" -#pragma clang diagnostic ignored "-Wundefined-reinterpret-cast" -#pragma clang diagnostic ignored "-Wunknown-warning-option" -#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" -#endif - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorSetBinaryConstant(uint32_t C0, uint32_t C1, - uint32_t C2, - uint32_t C3) noexcept { -#if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 vResult; - vResult.u[0] = (0 - (C0 & 1)) & 0x3F800000; - vResult.u[1] = (0 - (C1 & 1)) & 0x3F800000; - vResult.u[2] = (0 - (C2 & 1)) & 0x3F800000; - vResult.u[3] = (0 - (C3 & 1)) & 0x3F800000; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - XMVECTORU32 vResult; - vResult.u[0] = (0 - (C0 & 1)) & 0x3F800000; - vResult.u[1] = (0 - (C1 & 1)) & 0x3F800000; - vResult.u[2] = (0 - (C2 & 1)) & 0x3F800000; - vResult.u[3] = (0 - (C3 & 1)) & 0x3F800000; - return vResult.v; -#else // XM_SSE_INTRINSICS_ - static const XMVECTORU32 g_vMask1 = {{{1, 1, 1, 1}}}; - // Move the parms to a vector - __m128i vTemp = _mm_set_epi32(static_cast(C3), static_cast(C2), - static_cast(C1), static_cast(C0)); - // Mask off the low bits - vTemp = _mm_and_si128(vTemp, g_vMask1); - // 0xFFFFFFFF on true bits - vTemp = _mm_cmpeq_epi32(vTemp, g_vMask1); - // 0xFFFFFFFF -> 1.0f, 0x00000000 -> 0.0f - vTemp = _mm_and_si128(vTemp, g_XMOne); - return _mm_castsi128_ps(vTemp); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV -XMVectorSplatConstant(int32_t IntConstant, uint32_t DivExponent) noexcept { - assert(IntConstant >= -16 && IntConstant <= 15); - assert(DivExponent < 32); -#if defined(_XM_NO_INTRINSICS_) - - using DirectX::XMConvertVectorIntToFloat; - - XMVECTORI32 V = {{{IntConstant, IntConstant, IntConstant, IntConstant}}}; - return XMConvertVectorIntToFloat(V.v, DivExponent); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Splat the int - int32x4_t vScale = vdupq_n_s32(IntConstant); - // Convert to a float - XMVECTOR vResult = vcvtq_f32_s32(vScale); - // Convert DivExponent into 1.0f/(1<(&vScale)[0]); - return vResult; -#else // XM_SSE_INTRINSICS_ - // Splat the int - __m128i vScale = _mm_set1_epi32(IntConstant); - // Convert to a float - XMVECTOR vResult = _mm_cvtepi32_ps(vScale); - // Convert DivExponent into 1.0f/(1<(uScale)); - // Multiply by the reciprocal (Perform a right shift by DivExponent) - vResult = _mm_mul_ps(vResult, _mm_castsi128_ps(vScale)); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV -XMVectorSplatConstantInt(int32_t IntConstant) noexcept { - assert(IntConstant >= -16 && IntConstant <= 15); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORI32 V = {{{IntConstant, IntConstant, IntConstant, IntConstant}}}; - return V.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - int32x4_t V = vdupq_n_s32(IntConstant); - return reinterpret_cast(&V)[0]; -#else // XM_SSE_INTRINSICS_ - __m128i V = _mm_set1_epi32(IntConstant); - return _mm_castsi128_ps(V); -#endif -} - -#include "DirectXMathConvert.inl" -#include "DirectXMathVector.inl" -#include "DirectXMathMatrix.inl" -#include "DirectXMathMisc.inl" - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif -#ifdef _PREFAST_ -#pragma prefast(pop) -#endif -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -} // namespace DirectX +//------------------------------------------------------------------------------------- +// DirectXMath.h -- SIMD C++ Math library +// +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +// +// http://go.microsoft.com/fwlink/?LinkID=615560 +//------------------------------------------------------------------------------------- + +#pragma once + +#ifndef __cplusplus +#error DirectX Math requires C++ +#endif + +#define DIRECTX_MATH_VERSION 320 + +#if defined(_MSC_VER) && (_MSC_VER < 1910) +#error DirectX Math requires Visual C++ 2017 or later. +#endif + +#if defined(_MSC_VER) && !defined(_M_ARM) && !defined(_M_ARM64) && \ + !defined(_M_HYBRID_X86_ARM64) && !defined(_M_ARM64EC) && (!_MANAGED) && \ + (!_M_CEE) && (!defined(_M_IX86_FP) || (_M_IX86_FP > 1)) && \ + !defined(_XM_NO_INTRINSICS_) && !defined(_XM_VECTORCALL_) +#define _XM_VECTORCALL_ 1 +#endif + +#if _XM_VECTORCALL_ +#define XM_CALLCONV __vectorcall +#elif defined(__GNUC__) +#define XM_CALLCONV +#else +#define XM_CALLCONV __fastcall +#endif + +#ifndef XM_DEPRECATED +#if (__cplusplus >= 201402L) +#define XM_DEPRECATED [[deprecated]] +#elif defined(__GNUC__) +#define XM_DEPRECATED __attribute__((deprecated)) +#else +#define XM_DEPRECATED \ + __declspec(deprecated( \ + "This is deprecated and will be removed in a future version.")) +#endif +#endif + +#if !defined(_XM_AVX2_INTRINSICS_) && defined(__AVX2__) && \ + !defined(_XM_NO_INTRINSICS_) +#define _XM_AVX2_INTRINSICS_ +#endif + +#if !defined(_XM_FMA3_INTRINSICS_) && defined(_XM_AVX2_INTRINSICS_) && \ + !defined(_XM_NO_INTRINSICS_) +#define _XM_FMA3_INTRINSICS_ +#endif + +#if !defined(_XM_F16C_INTRINSICS_) && defined(_XM_AVX2_INTRINSICS_) && \ + !defined(_XM_NO_INTRINSICS_) +#define _XM_F16C_INTRINSICS_ +#endif + +#if !defined(_XM_F16C_INTRINSICS_) && defined(__F16C__) && \ + !defined(_XM_NO_INTRINSICS_) +#define _XM_F16C_INTRINSICS_ +#endif + +#if defined(_XM_FMA3_INTRINSICS_) && !defined(_XM_AVX_INTRINSICS_) +#define _XM_AVX_INTRINSICS_ +#endif + +#if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_AVX_INTRINSICS_) +#define _XM_AVX_INTRINSICS_ +#endif + +#if !defined(_XM_AVX_INTRINSICS_) && defined(__AVX__) && \ + !defined(_XM_NO_INTRINSICS_) +#define _XM_AVX_INTRINSICS_ +#endif + +#if defined(_XM_AVX_INTRINSICS_) && !defined(_XM_SSE4_INTRINSICS_) +#define _XM_SSE4_INTRINSICS_ +#endif + +#if defined(_XM_SSE4_INTRINSICS_) && !defined(_XM_SSE3_INTRINSICS_) +#define _XM_SSE3_INTRINSICS_ +#endif + +#if defined(_XM_SSE3_INTRINSICS_) && !defined(_XM_SSE_INTRINSICS_) +#define _XM_SSE_INTRINSICS_ +#endif + +#if !defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_SSE_INTRINSICS_) && \ + !defined(_XM_NO_INTRINSICS_) +#if (defined(_M_IX86) || defined(_M_X64) || __i386__ || __x86_64__) && \ + !defined(_M_HYBRID_X86_ARM64) && !defined(_M_ARM64EC) +#define _XM_SSE_INTRINSICS_ +#elif defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || \ + defined(_M_ARM64EC) || __arm__ || __aarch64__ +#define _XM_ARM_NEON_INTRINSICS_ +#elif !defined(_XM_NO_INTRINSICS_) +#error DirectX Math does not support this target +#endif +#endif // !_XM_ARM_NEON_INTRINSICS_ && !_XM_SSE_INTRINSICS_ && + // !_XM_NO_INTRINSICS_ + +#if defined(_XM_SSE_INTRINSICS_) && defined(_MSC_VER) && (_MSC_VER >= 1920) && \ + !defined(__clang__) && !defined(_XM_SVML_INTRINSICS_) && \ + !defined(_XM_DISABLE_INTEL_SVML_) +#define _XM_SVML_INTRINSICS_ +#endif + +#if !defined(_XM_NO_XMVECTOR_OVERLOADS_) && \ + (defined(__clang__) || defined(__GNUC__)) && !defined(_XM_NO_INTRINSICS_) +#define _XM_NO_XMVECTOR_OVERLOADS_ +#endif + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4514 4820) +// C4514/4820: Off by default noise +#endif +#include +#include +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +#ifndef _XM_NO_INTRINSICS_ + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4987) +// C4987: Off by default noise +#endif +#if defined(_MSC_VER) || defined(__MINGW32__) +#include +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +#if (defined(__clang__) || defined(__GNUC__)) && (__x86_64__ || __i386__) && \ + !defined(__MINGW32__) +#include +#endif + +#ifdef _XM_SSE_INTRINSICS_ +#include +#include + +#ifdef _XM_SSE3_INTRINSICS_ +#include +#endif + +#ifdef _XM_SSE4_INTRINSICS_ +#include +#endif + +#ifdef _XM_AVX_INTRINSICS_ +#include +#endif + +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_MSC_VER) && !defined(__clang__) && \ + (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC)) +#include +#else +#include +#endif +#endif +#endif // !_XM_NO_INTRINSICS_ + +#include "sal.h" +#include + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4005 4668) +// C4005/4668: Old header issue +#endif +#include +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +#if (__cplusplus >= 201703L) +#define XM_ALIGNED_DATA(x) alignas(x) +#define XM_ALIGNED_STRUCT(x) struct alignas(x) +#elif defined(__GNUC__) +#define XM_ALIGNED_DATA(x) __attribute__((aligned(x))) +#define XM_ALIGNED_STRUCT(x) struct __attribute__((aligned(x))) +#else +#define XM_ALIGNED_DATA(x) __declspec(align(x)) +#define XM_ALIGNED_STRUCT(x) __declspec(align(x)) struct +#endif + +#if (__cplusplus >= 202002L) +#include +#endif + +/**************************************************************************** + * + * Conditional intrinsics + * + ****************************************************************************/ + +#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + +#if defined(_XM_NO_MOVNT_) +#define XM_STREAM_PS(p, a) _mm_store_ps((p), (a)) +#define XM256_STREAM_PS(p, a) _mm256_store_ps((p), (a)) +#define XM_SFENCE() +#else +#define XM_STREAM_PS(p, a) _mm_stream_ps((p), (a)) +#define XM256_STREAM_PS(p, a) _mm256_stream_ps((p), (a)) +#define XM_SFENCE() _mm_sfence() +#endif + +#if defined(_XM_FMA3_INTRINSICS_) +#define XM_FMADD_PS(a, b, c) _mm_fmadd_ps((a), (b), (c)) +#define XM_FNMADD_PS(a, b, c) _mm_fnmadd_ps((a), (b), (c)) +#else +#define XM_FMADD_PS(a, b, c) _mm_add_ps(_mm_mul_ps((a), (b)), (c)) +#define XM_FNMADD_PS(a, b, c) _mm_sub_ps((c), _mm_mul_ps((a), (b))) +#endif + +#if defined(_XM_AVX_INTRINSICS_) && defined(_XM_FAVOR_INTEL_) +#define XM_PERMUTE_PS(v, c) _mm_permute_ps((v), c) +#else +#define XM_PERMUTE_PS(v, c) _mm_shuffle_ps((v), (v), c) +#endif + +#if defined(__GNUC__) && !defined(__clang__) && (__GNUC__ < 11) +#define XM_LOADU_SI16(p) \ + _mm_cvtsi32_si128(*reinterpret_cast(p)) +#else +#define XM_LOADU_SI16(p) _mm_loadu_si16(p) +#endif + +#endif // _XM_SSE_INTRINSICS_ && !_XM_NO_INTRINSICS_ + +#if defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + +#if defined(__clang__) || defined(__GNUC__) +#define XM_PREFETCH(a) __builtin_prefetch(a) +#elif defined(_MSC_VER) +#define XM_PREFETCH(a) __prefetch(a) +#else +#define XM_PREFETCH(a) +#endif + +#endif // _XM_ARM_NEON_INTRINSICS_ && !_XM_NO_INTRINSICS_ + +namespace DirectX { + +/**************************************************************************** + * + * Constant definitions + * + ****************************************************************************/ + +#if defined(__XNAMATH_H__) && defined(XM_PI) +#undef XM_PI +#undef XM_2PI +#undef XM_1DIVPI +#undef XM_1DIV2PI +#undef XM_PIDIV2 +#undef XM_PIDIV4 +#undef XM_SELECT_0 +#undef XM_SELECT_1 +#undef XM_PERMUTE_0X +#undef XM_PERMUTE_0Y +#undef XM_PERMUTE_0Z +#undef XM_PERMUTE_0W +#undef XM_PERMUTE_1X +#undef XM_PERMUTE_1Y +#undef XM_PERMUTE_1Z +#undef XM_PERMUTE_1W +#undef XM_CRMASK_CR6 +#undef XM_CRMASK_CR6TRUE +#undef XM_CRMASK_CR6FALSE +#undef XM_CRMASK_CR6BOUNDS +#undef XM_CACHE_LINE_SIZE +#endif + +constexpr float XM_PI = 3.141592654f; +constexpr float XM_2PI = 6.283185307f; +constexpr float XM_1DIVPI = 0.318309886f; +constexpr float XM_1DIV2PI = 0.159154943f; +constexpr float XM_PIDIV2 = 1.570796327f; +constexpr float XM_PIDIV4 = 0.785398163f; + +constexpr uint32_t XM_SELECT_0 = 0x00000000; +constexpr uint32_t XM_SELECT_1 = 0xFFFFFFFF; + +constexpr uint32_t XM_PERMUTE_0X = 0; +constexpr uint32_t XM_PERMUTE_0Y = 1; +constexpr uint32_t XM_PERMUTE_0Z = 2; +constexpr uint32_t XM_PERMUTE_0W = 3; +constexpr uint32_t XM_PERMUTE_1X = 4; +constexpr uint32_t XM_PERMUTE_1Y = 5; +constexpr uint32_t XM_PERMUTE_1Z = 6; +constexpr uint32_t XM_PERMUTE_1W = 7; + +constexpr uint32_t XM_SWIZZLE_X = 0; +constexpr uint32_t XM_SWIZZLE_Y = 1; +constexpr uint32_t XM_SWIZZLE_Z = 2; +constexpr uint32_t XM_SWIZZLE_W = 3; + +constexpr uint32_t XM_CRMASK_CR6 = 0x000000F0; +constexpr uint32_t XM_CRMASK_CR6TRUE = 0x00000080; +constexpr uint32_t XM_CRMASK_CR6FALSE = 0x00000020; +constexpr uint32_t XM_CRMASK_CR6BOUNDS = XM_CRMASK_CR6FALSE; + +#if defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || \ + defined(_M_ARM64EC) || __arm__ || __aarch64__ +constexpr size_t XM_CACHE_LINE_SIZE = 128; +#else +constexpr size_t XM_CACHE_LINE_SIZE = 64; +#endif + +/**************************************************************************** + * + * Macros + * + ****************************************************************************/ + +#if defined(__XNAMATH_H__) && defined(XMComparisonAllTrue) +#undef XMComparisonAllTrue +#undef XMComparisonAnyTrue +#undef XMComparisonAllFalse +#undef XMComparisonAnyFalse +#undef XMComparisonMixed +#undef XMComparisonAllInBounds +#undef XMComparisonAnyOutOfBounds +#endif + +// Unit conversion + +constexpr float XMConvertToRadians(float fDegrees) noexcept { + return fDegrees * (XM_PI / 180.0f); +} +constexpr float XMConvertToDegrees(float fRadians) noexcept { + return fRadians * (180.0f / XM_PI); +} + +// Condition register evaluation proceeding a recording (R) comparison + +constexpr bool XMComparisonAllTrue(uint32_t CR) noexcept { + return (CR & XM_CRMASK_CR6TRUE) == XM_CRMASK_CR6TRUE; +} +constexpr bool XMComparisonAnyTrue(uint32_t CR) noexcept { + return (CR & XM_CRMASK_CR6FALSE) != XM_CRMASK_CR6FALSE; +} +constexpr bool XMComparisonAllFalse(uint32_t CR) noexcept { + return (CR & XM_CRMASK_CR6FALSE) == XM_CRMASK_CR6FALSE; +} +constexpr bool XMComparisonAnyFalse(uint32_t CR) noexcept { + return (CR & XM_CRMASK_CR6TRUE) != XM_CRMASK_CR6TRUE; +} +constexpr bool XMComparisonMixed(uint32_t CR) noexcept { + return (CR & XM_CRMASK_CR6) == 0; +} +constexpr bool XMComparisonAllInBounds(uint32_t CR) noexcept { + return (CR & XM_CRMASK_CR6BOUNDS) == XM_CRMASK_CR6BOUNDS; +} +constexpr bool XMComparisonAnyOutOfBounds(uint32_t CR) noexcept { + return (CR & XM_CRMASK_CR6BOUNDS) != XM_CRMASK_CR6BOUNDS; +} + +/**************************************************************************** + * + * Data types + * + ****************************************************************************/ + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4068 4201 4365 4324 4820) +// C4068: ignore unknown pragmas +// C4201: nonstandard extension used : nameless struct/union +// C4365: Off by default noise +// C4324/4820: padding warnings +#endif + +#ifdef _PREFAST_ +#pragma prefast(push) +#pragma prefast(disable : 25000, "FXMVECTOR is 16 bytes") +#endif + +//------------------------------------------------------------------------------ +#if defined(_XM_NO_INTRINSICS_) +struct __vector4 { + union { + float vector4_f32[4]; + uint32_t vector4_u32[4]; + }; +}; +#endif // _XM_NO_INTRINSICS_ + +//------------------------------------------------------------------------------ +// Vector intrinsic: Four 32 bit floating point components aligned on a 16 byte +// boundary and mapped to hardware vector registers +#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) +using XMVECTOR = __m128; +#elif defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) +using XMVECTOR = float32x4_t; +#else +using XMVECTOR = __vector4; +#endif + +// Fix-up for (1st-3rd) XMVECTOR parameters that are pass-in-register for x86, +// ARM, ARM64, and vector call; by reference otherwise +#if (defined(_M_IX86) || defined(_M_ARM) || defined(_M_ARM64) || \ + _XM_VECTORCALL_ || __i386__ || __arm__ || __aarch64__) && \ + !defined(_XM_NO_INTRINSICS_) +typedef const XMVECTOR FXMVECTOR; +#else +typedef const XMVECTOR& FXMVECTOR; +#endif + +// Fix-up for (4th) XMVECTOR parameter to pass in-register for ARM, ARM64, and +// vector call; by reference otherwise +#if (defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || \ + defined(_M_ARM64EC) || _XM_VECTORCALL_ || __arm__ || __aarch64__) && \ + !defined(_XM_NO_INTRINSICS_) +typedef const XMVECTOR GXMVECTOR; +#else +typedef const XMVECTOR& GXMVECTOR; +#endif + +// Fix-up for (5th & 6th) XMVECTOR parameter to pass in-register for ARM64 and +// vector call; by reference otherwise +#if (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || \ + defined(_M_ARM64EC) || _XM_VECTORCALL_ || __aarch64__) && \ + !defined(_XM_NO_INTRINSICS_) +typedef const XMVECTOR HXMVECTOR; +#else +typedef const XMVECTOR& HXMVECTOR; +#endif + +// Fix-up for (7th+) XMVECTOR parameters to pass by reference +typedef const XMVECTOR& CXMVECTOR; + +//------------------------------------------------------------------------------ +// Conversion types for constants +XM_ALIGNED_STRUCT(16) XMVECTORF32 { + union { + float f[4]; + XMVECTOR v; + }; + + inline operator XMVECTOR() const noexcept { return v; } + inline operator const float*() const noexcept { return f; } +#ifdef _XM_NO_INTRINSICS_ +#elif defined(_XM_SSE_INTRINSICS_) + inline operator __m128i() const noexcept { return _mm_castps_si128(v); } + inline operator __m128d() const noexcept { return _mm_castps_pd(v); } +#elif defined(_XM_ARM_NEON_INTRINSICS_) && \ + (defined(__GNUC__) || defined(_ARM64_DISTINCT_NEON_TYPES)) + inline operator int32x4_t() const noexcept { + return vreinterpretq_s32_f32(v); + } + inline operator uint32x4_t() const noexcept { + return vreinterpretq_u32_f32(v); + } +#endif +}; + +XM_ALIGNED_STRUCT(16) XMVECTORI32 { + union { + int32_t i[4]; + XMVECTOR v; + }; + + inline operator XMVECTOR() const noexcept { return v; } +#ifdef _XM_NO_INTRINSICS_ +#elif defined(_XM_SSE_INTRINSICS_) + inline operator __m128i() const noexcept { return _mm_castps_si128(v); } + inline operator __m128d() const noexcept { return _mm_castps_pd(v); } +#elif defined(_XM_ARM_NEON_INTRINSICS_) && \ + (defined(__GNUC__) || defined(_ARM64_DISTINCT_NEON_TYPES)) + inline operator int32x4_t() const noexcept { + return vreinterpretq_s32_f32(v); + } + inline operator uint32x4_t() const noexcept { + return vreinterpretq_u32_f32(v); + } +#endif +}; + +XM_ALIGNED_STRUCT(16) XMVECTORU8 { + union { + uint8_t u[16]; + XMVECTOR v; + }; + + inline operator XMVECTOR() const noexcept { return v; } +#ifdef _XM_NO_INTRINSICS_ +#elif defined(_XM_SSE_INTRINSICS_) + inline operator __m128i() const noexcept { return _mm_castps_si128(v); } + inline operator __m128d() const noexcept { return _mm_castps_pd(v); } +#elif defined(_XM_ARM_NEON_INTRINSICS_) && \ + (defined(__GNUC__) || defined(_ARM64_DISTINCT_NEON_TYPES)) + inline operator int32x4_t() const noexcept { + return vreinterpretq_s32_f32(v); + } + inline operator uint32x4_t() const noexcept { + return vreinterpretq_u32_f32(v); + } +#endif +}; + +XM_ALIGNED_STRUCT(16) XMVECTORU32 { + union { + uint32_t u[4]; + XMVECTOR v; + }; + + inline operator XMVECTOR() const noexcept { return v; } +#ifdef _XM_NO_INTRINSICS_ +#elif defined(_XM_SSE_INTRINSICS_) + inline operator __m128i() const noexcept { return _mm_castps_si128(v); } + inline operator __m128d() const noexcept { return _mm_castps_pd(v); } +#elif defined(_XM_ARM_NEON_INTRINSICS_) && \ + (defined(__GNUC__) || defined(_ARM64_DISTINCT_NEON_TYPES)) + inline operator int32x4_t() const noexcept { + return vreinterpretq_s32_f32(v); + } + inline operator uint32x4_t() const noexcept { + return vreinterpretq_u32_f32(v); + } +#endif +}; + +//------------------------------------------------------------------------------ +// Vector operators + +#ifndef _XM_NO_XMVECTOR_OVERLOADS_ +XMVECTOR XM_CALLCONV operator+(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV operator-(FXMVECTOR V) noexcept; + +XMVECTOR& XM_CALLCONV operator+=(XMVECTOR& V1, FXMVECTOR V2) noexcept; +XMVECTOR& XM_CALLCONV operator-=(XMVECTOR& V1, FXMVECTOR V2) noexcept; +XMVECTOR& XM_CALLCONV operator*=(XMVECTOR& V1, FXMVECTOR V2) noexcept; +XMVECTOR& XM_CALLCONV operator/=(XMVECTOR& V1, FXMVECTOR V2) noexcept; + +XMVECTOR& operator*=(XMVECTOR& V, float S) noexcept; +XMVECTOR& operator/=(XMVECTOR& V, float S) noexcept; + +XMVECTOR XM_CALLCONV operator+(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV operator-(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV operator*(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV operator/(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV operator*(FXMVECTOR V, float S) noexcept; +XMVECTOR XM_CALLCONV operator*(float S, FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV operator/(FXMVECTOR V, float S) noexcept; +#endif /* !_XM_NO_XMVECTOR_OVERLOADS_ */ + +//------------------------------------------------------------------------------ +// Matrix type: Sixteen 32 bit floating point components aligned on a +// 16 byte boundary and mapped to four hardware vector registers + +struct XMMATRIX; + +// Fix-up for (1st) XMMATRIX parameter to pass in-register for ARM64 and vector +// call; by reference otherwise +#if (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || \ + defined(_M_ARM64EC) || _XM_VECTORCALL_ || __aarch64__) && \ + !defined(_XM_NO_INTRINSICS_) +typedef const XMMATRIX FXMMATRIX; +#else +typedef const XMMATRIX& FXMMATRIX; +#endif + +// Fix-up for (2nd+) XMMATRIX parameters to pass by reference +typedef const XMMATRIX& CXMMATRIX; + +#ifdef _XM_NO_INTRINSICS_ +struct XMMATRIX +#else +XM_ALIGNED_STRUCT(16) +XMMATRIX +#endif +{ +#ifdef _XM_NO_INTRINSICS_ + union { + XMVECTOR r[4]; + struct { + float _11, _12, _13, _14; + float _21, _22, _23, _24; + float _31, _32, _33, _34; + float _41, _42, _43, _44; + }; + float m[4][4]; + }; +#else + XMVECTOR r[4]; +#endif + + XMMATRIX() = default; + + XMMATRIX(const XMMATRIX&) = default; + +#if defined(_MSC_VER) && (_MSC_FULL_VER < 191426431) + XMMATRIX& operator=(const XMMATRIX& M) noexcept { + r[0] = M.r[0]; + r[1] = M.r[1]; + r[2] = M.r[2]; + r[3] = M.r[3]; + return *this; + } +#else + XMMATRIX& operator=(const XMMATRIX&) = default; + + XMMATRIX(XMMATRIX&&) = default; + XMMATRIX& operator=(XMMATRIX&&) = default; +#endif + + constexpr XMMATRIX(FXMVECTOR R0, FXMVECTOR R1, FXMVECTOR R2, + CXMVECTOR R3) noexcept + : r{R0, R1, R2, R3} {} + XMMATRIX(float m00, float m01, float m02, float m03, float m10, float m11, + float m12, float m13, float m20, float m21, float m22, float m23, + float m30, float m31, float m32, float m33) noexcept; + explicit XMMATRIX(_In_reads_(16) const float* pArray) noexcept; + +#ifdef _XM_NO_INTRINSICS_ + float operator()(size_t Row, size_t Column) const noexcept { + return m[Row][Column]; + } + float& operator()(size_t Row, size_t Column) noexcept { + return m[Row][Column]; + } +#endif + + XMMATRIX operator+() const noexcept { return *this; } + XMMATRIX operator-() const noexcept; + + XMMATRIX& XM_CALLCONV operator+=(FXMMATRIX M) noexcept; + XMMATRIX& XM_CALLCONV operator-=(FXMMATRIX M) noexcept; + XMMATRIX& XM_CALLCONV operator*=(FXMMATRIX M) noexcept; + XMMATRIX& operator*=(float S) noexcept; + XMMATRIX& operator/=(float S) noexcept; + + XMMATRIX XM_CALLCONV operator+(FXMMATRIX M) const noexcept; + XMMATRIX XM_CALLCONV operator-(FXMMATRIX M) const noexcept; + XMMATRIX XM_CALLCONV operator*(FXMMATRIX M) const noexcept; + XMMATRIX operator*(float S) const noexcept; + XMMATRIX operator/(float S) const noexcept; + + friend XMMATRIX XM_CALLCONV operator*(float S, FXMMATRIX M) noexcept; +}; + +//------------------------------------------------------------------------------ +// 2D Vector; 32 bit floating point components +struct XMFLOAT2 { + float x; + float y; + + XMFLOAT2() = default; + + XMFLOAT2(const XMFLOAT2&) = default; + XMFLOAT2& operator=(const XMFLOAT2&) = default; + + XMFLOAT2(XMFLOAT2&&) = default; + XMFLOAT2& operator=(XMFLOAT2&&) = default; + + constexpr XMFLOAT2(float _x, float _y) noexcept : x(_x), y(_y) {} + explicit XMFLOAT2(_In_reads_(2) const float* pArray) noexcept + : x(pArray[0]), y(pArray[1]) {} + +#if (__cplusplus >= 202002L) + bool operator==(const XMFLOAT2&) const = default; + auto operator<=>(const XMFLOAT2&) const = default; +#endif +}; + +// 2D Vector; 32 bit floating point components aligned on a 16 byte boundary +XM_ALIGNED_STRUCT(16) XMFLOAT2A : public XMFLOAT2 { using XMFLOAT2::XMFLOAT2; }; + +//------------------------------------------------------------------------------ +// 2D Vector; 32 bit signed integer components +struct XMINT2 { + int32_t x; + int32_t y; + + XMINT2() = default; + + XMINT2(const XMINT2&) = default; + XMINT2& operator=(const XMINT2&) = default; + + XMINT2(XMINT2&&) = default; + XMINT2& operator=(XMINT2&&) = default; + + constexpr XMINT2(int32_t _x, int32_t _y) noexcept : x(_x), y(_y) {} + explicit XMINT2(_In_reads_(2) const int32_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]) {} + +#if (__cplusplus >= 202002L) + bool operator==(const XMINT2&) const = default; + auto operator<=>(const XMINT2&) const = default; +#endif +}; + +// 2D Vector; 32 bit unsigned integer components +struct XMUINT2 { + uint32_t x; + uint32_t y; + + XMUINT2() = default; + + XMUINT2(const XMUINT2&) = default; + XMUINT2& operator=(const XMUINT2&) = default; + + XMUINT2(XMUINT2&&) = default; + XMUINT2& operator=(XMUINT2&&) = default; + + constexpr XMUINT2(uint32_t _x, uint32_t _y) noexcept : x(_x), y(_y) {} + explicit XMUINT2(_In_reads_(2) const uint32_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]) {} + +#if (__cplusplus >= 202002L) + bool operator==(const XMUINT2&) const = default; + auto operator<=>(const XMUINT2&) const = default; +#endif +}; + +//------------------------------------------------------------------------------ +// 3D Vector; 32 bit floating point components +struct XMFLOAT3 { + float x; + float y; + float z; + + XMFLOAT3() = default; + + XMFLOAT3(const XMFLOAT3&) = default; + XMFLOAT3& operator=(const XMFLOAT3&) = default; + + XMFLOAT3(XMFLOAT3&&) = default; + XMFLOAT3& operator=(XMFLOAT3&&) = default; + + constexpr XMFLOAT3(float _x, float _y, float _z) noexcept + : x(_x), y(_y), z(_z) {} + explicit XMFLOAT3(_In_reads_(3) const float* pArray) noexcept + : x(pArray[0]), y(pArray[1]), z(pArray[2]) {} +}; + +// 3D Vector; 32 bit floating point components aligned on a 16 byte boundary +XM_ALIGNED_STRUCT(16) XMFLOAT3A : public XMFLOAT3 { using XMFLOAT3::XMFLOAT3; }; + +//------------------------------------------------------------------------------ +// 3D Vector; 32 bit signed integer components +struct XMINT3 { + int32_t x; + int32_t y; + int32_t z; + + XMINT3() = default; + + XMINT3(const XMINT3&) = default; + XMINT3& operator=(const XMINT3&) = default; + + XMINT3(XMINT3&&) = default; + XMINT3& operator=(XMINT3&&) = default; + + constexpr XMINT3(int32_t _x, int32_t _y, int32_t _z) noexcept + : x(_x), y(_y), z(_z) {} + explicit XMINT3(_In_reads_(3) const int32_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]), z(pArray[2]) {} + +#if (__cplusplus >= 202002L) + bool operator==(const XMINT3&) const = default; + auto operator<=>(const XMINT3&) const = default; +#endif +}; + +// 3D Vector; 32 bit unsigned integer components +struct XMUINT3 { + uint32_t x; + uint32_t y; + uint32_t z; + + XMUINT3() = default; + + XMUINT3(const XMUINT3&) = default; + XMUINT3& operator=(const XMUINT3&) = default; + + XMUINT3(XMUINT3&&) = default; + XMUINT3& operator=(XMUINT3&&) = default; + + constexpr XMUINT3(uint32_t _x, uint32_t _y, uint32_t _z) noexcept + : x(_x), y(_y), z(_z) {} + explicit XMUINT3(_In_reads_(3) const uint32_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]), z(pArray[2]) {} + +#if (__cplusplus >= 202002L) + bool operator==(const XMUINT3&) const = default; + auto operator<=>(const XMUINT3&) const = default; +#endif +}; + +//------------------------------------------------------------------------------ +// 4D Vector; 32 bit floating point components +struct XMFLOAT4 { + float x; + float y; + float z; + float w; + + XMFLOAT4() = default; + + XMFLOAT4(const XMFLOAT4&) = default; + XMFLOAT4& operator=(const XMFLOAT4&) = default; + + XMFLOAT4(XMFLOAT4&&) = default; + XMFLOAT4& operator=(XMFLOAT4&&) = default; + + constexpr XMFLOAT4(float _x, float _y, float _z, float _w) noexcept + : x(_x), y(_y), z(_z), w(_w) {} + explicit XMFLOAT4(_In_reads_(4) const float* pArray) noexcept + : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + +#if (__cplusplus >= 202002L) + bool operator==(const XMFLOAT4&) const = default; + auto operator<=>(const XMFLOAT4&) const = default; +#endif +}; + +// 4D Vector; 32 bit floating point components aligned on a 16 byte boundary +XM_ALIGNED_STRUCT(16) XMFLOAT4A : public XMFLOAT4 { using XMFLOAT4::XMFLOAT4; }; + +//------------------------------------------------------------------------------ +// 4D Vector; 32 bit signed integer components +struct XMINT4 { + int32_t x; + int32_t y; + int32_t z; + int32_t w; + + XMINT4() = default; + + XMINT4(const XMINT4&) = default; + XMINT4& operator=(const XMINT4&) = default; + + XMINT4(XMINT4&&) = default; + XMINT4& operator=(XMINT4&&) = default; + + constexpr XMINT4(int32_t _x, int32_t _y, int32_t _z, int32_t _w) noexcept + : x(_x), y(_y), z(_z), w(_w) {} + explicit XMINT4(_In_reads_(4) const int32_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + +#if (__cplusplus >= 202002L) + bool operator==(const XMINT4&) const = default; + auto operator<=>(const XMINT4&) const = default; +#endif +}; + +// 4D Vector; 32 bit unsigned integer components +struct XMUINT4 { + uint32_t x; + uint32_t y; + uint32_t z; + uint32_t w; + + XMUINT4() = default; + + XMUINT4(const XMUINT4&) = default; + XMUINT4& operator=(const XMUINT4&) = default; + + XMUINT4(XMUINT4&&) = default; + XMUINT4& operator=(XMUINT4&&) = default; + + constexpr XMUINT4(uint32_t _x, uint32_t _y, uint32_t _z, + uint32_t _w) noexcept + : x(_x), y(_y), z(_z), w(_w) {} + explicit XMUINT4(_In_reads_(4) const uint32_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + +#if (__cplusplus >= 202002L) + bool operator==(const XMUINT4&) const = default; + auto operator<=>(const XMUINT4&) const = default; +#endif +}; + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu-anonymous-struct" +#pragma clang diagnostic ignored "-Wnested-anon-types" +#pragma clang diagnostic ignored "-Wunknown-warning-option" +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" +#endif + +//------------------------------------------------------------------------------ +// 3x3 Matrix: 32 bit floating point components +struct XMFLOAT3X3 { + union { + struct { + float _11, _12, _13; + float _21, _22, _23; + float _31, _32, _33; + }; + float m[3][3]; + }; + + XMFLOAT3X3() = default; + + XMFLOAT3X3(const XMFLOAT3X3&) = default; + XMFLOAT3X3& operator=(const XMFLOAT3X3&) = default; + + XMFLOAT3X3(XMFLOAT3X3&&) = default; + XMFLOAT3X3& operator=(XMFLOAT3X3&&) = default; + + constexpr XMFLOAT3X3(float m00, float m01, float m02, float m10, float m11, + float m12, float m20, float m21, float m22) noexcept + : _11(m00), + _12(m01), + _13(m02), + _21(m10), + _22(m11), + _23(m12), + _31(m20), + _32(m21), + _33(m22) {} + explicit XMFLOAT3X3(_In_reads_(9) const float* pArray) noexcept; + + float operator()(size_t Row, size_t Column) const noexcept { + return m[Row][Column]; + } + float& operator()(size_t Row, size_t Column) noexcept { + return m[Row][Column]; + } + +#if (__cplusplus >= 202002L) + bool operator==(const XMFLOAT3X3&) const = delete; + auto operator<=>(const XMFLOAT3X3&) const = delete; +#endif +}; + +//------------------------------------------------------------------------------ +// 4x3 Row-major Matrix: 32 bit floating point components +struct XMFLOAT4X3 { + union { + struct { + float _11, _12, _13; + float _21, _22, _23; + float _31, _32, _33; + float _41, _42, _43; + }; + float m[4][3]; + float f[12]; + }; + + XMFLOAT4X3() = default; + + XMFLOAT4X3(const XMFLOAT4X3&) = default; + XMFLOAT4X3& operator=(const XMFLOAT4X3&) = default; + + XMFLOAT4X3(XMFLOAT4X3&&) = default; + XMFLOAT4X3& operator=(XMFLOAT4X3&&) = default; + + constexpr XMFLOAT4X3(float m00, float m01, float m02, float m10, float m11, + float m12, float m20, float m21, float m22, float m30, + float m31, float m32) noexcept + : _11(m00), + _12(m01), + _13(m02), + _21(m10), + _22(m11), + _23(m12), + _31(m20), + _32(m21), + _33(m22), + _41(m30), + _42(m31), + _43(m32) {} + explicit XMFLOAT4X3(_In_reads_(12) const float* pArray) noexcept; + + float operator()(size_t Row, size_t Column) const noexcept { + return m[Row][Column]; + } + float& operator()(size_t Row, size_t Column) noexcept { + return m[Row][Column]; + } + +#if (__cplusplus >= 202002L) + bool operator==(const XMFLOAT4X3&) const = delete; + auto operator<=>(const XMFLOAT4X3&) const = delete; +#endif +}; + +// 4x3 Row-major Matrix: 32 bit floating point components aligned on a 16 byte +// boundary +XM_ALIGNED_STRUCT(16) XMFLOAT4X3A : public XMFLOAT4X3 { + using XMFLOAT4X3::XMFLOAT4X3; +}; + +//------------------------------------------------------------------------------ +// 3x4 Column-major Matrix: 32 bit floating point components +struct XMFLOAT3X4 { + union { + struct { + float _11, _12, _13, _14; + float _21, _22, _23, _24; + float _31, _32, _33, _34; + }; + float m[3][4]; + float f[12]; + }; + + XMFLOAT3X4() = default; + + XMFLOAT3X4(const XMFLOAT3X4&) = default; + XMFLOAT3X4& operator=(const XMFLOAT3X4&) = default; + + XMFLOAT3X4(XMFLOAT3X4&&) = default; + XMFLOAT3X4& operator=(XMFLOAT3X4&&) = default; + + constexpr XMFLOAT3X4(float m00, float m01, float m02, float m03, float m10, + float m11, float m12, float m13, float m20, float m21, + float m22, float m23) noexcept + : _11(m00), + _12(m01), + _13(m02), + _14(m03), + _21(m10), + _22(m11), + _23(m12), + _24(m13), + _31(m20), + _32(m21), + _33(m22), + _34(m23) {} + explicit XMFLOAT3X4(_In_reads_(12) const float* pArray) noexcept; + + float operator()(size_t Row, size_t Column) const noexcept { + return m[Row][Column]; + } + float& operator()(size_t Row, size_t Column) noexcept { + return m[Row][Column]; + } + +#if (__cplusplus >= 202002L) + bool operator==(const XMFLOAT3X4&) const = delete; + auto operator<=>(const XMFLOAT3X4&) const = delete; +#endif +}; + +// 3x4 Column-major Matrix: 32 bit floating point components aligned on a 16 +// byte boundary +XM_ALIGNED_STRUCT(16) XMFLOAT3X4A : public XMFLOAT3X4 { + using XMFLOAT3X4::XMFLOAT3X4; +}; + +//------------------------------------------------------------------------------ +// 4x4 Matrix: 32 bit floating point components +struct XMFLOAT4X4 { + union { + struct { + float _11, _12, _13, _14; + float _21, _22, _23, _24; + float _31, _32, _33, _34; + float _41, _42, _43, _44; + }; + float m[4][4]; + }; + + XMFLOAT4X4() = default; + + XMFLOAT4X4(const XMFLOAT4X4&) = default; + XMFLOAT4X4& operator=(const XMFLOAT4X4&) = default; + + XMFLOAT4X4(XMFLOAT4X4&&) = default; + XMFLOAT4X4& operator=(XMFLOAT4X4&&) = default; + + constexpr XMFLOAT4X4(float m00, float m01, float m02, float m03, float m10, + float m11, float m12, float m13, float m20, float m21, + float m22, float m23, float m30, float m31, float m32, + float m33) noexcept + : _11(m00), + _12(m01), + _13(m02), + _14(m03), + _21(m10), + _22(m11), + _23(m12), + _24(m13), + _31(m20), + _32(m21), + _33(m22), + _34(m23), + _41(m30), + _42(m31), + _43(m32), + _44(m33) {} + explicit XMFLOAT4X4(_In_reads_(16) const float* pArray) noexcept; + + float operator()(size_t Row, size_t Column) const noexcept { + return m[Row][Column]; + } + float& operator()(size_t Row, size_t Column) noexcept { + return m[Row][Column]; + } + +#if (__cplusplus >= 202002L) + bool operator==(const XMFLOAT4X4&) const = delete; + auto operator<=>(const XMFLOAT4X4&) const = delete; +#endif +}; + +// 4x4 Matrix: 32 bit floating point components aligned on a 16 byte boundary +XM_ALIGNED_STRUCT(16) XMFLOAT4X4A : public XMFLOAT4X4 { + using XMFLOAT4X4::XMFLOAT4X4; +}; + +//////////////////////////////////////////////////////////////////////////////// + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +#ifdef _PREFAST_ +#pragma prefast(pop) +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +/**************************************************************************** + * + * Data conversion operations + * + ****************************************************************************/ + +XMVECTOR XM_CALLCONV XMConvertVectorIntToFloat(FXMVECTOR VInt, + uint32_t DivExponent) noexcept; +XMVECTOR XM_CALLCONV XMConvertVectorFloatToInt(FXMVECTOR VFloat, + uint32_t MulExponent) noexcept; +XMVECTOR XM_CALLCONV XMConvertVectorUIntToFloat(FXMVECTOR VUInt, + uint32_t DivExponent) noexcept; +XMVECTOR XM_CALLCONV XMConvertVectorFloatToUInt(FXMVECTOR VFloat, + uint32_t MulExponent) noexcept; + +#if defined(__XNAMATH_H__) && defined(XMVectorSetBinaryConstant) +#undef XMVectorSetBinaryConstant +#undef XMVectorSplatConstant +#undef XMVectorSplatConstantInt +#endif + +XMVECTOR XM_CALLCONV XMVectorSetBinaryConstant(uint32_t C0, uint32_t C1, + uint32_t C2, + uint32_t C3) noexcept; +XMVECTOR XM_CALLCONV XMVectorSplatConstant(int32_t IntConstant, + uint32_t DivExponent) noexcept; +XMVECTOR XM_CALLCONV XMVectorSplatConstantInt(int32_t IntConstant) noexcept; + +/**************************************************************************** + * + * Load operations + * + ****************************************************************************/ + +XMVECTOR XM_CALLCONV XMLoadInt(_In_ const uint32_t* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadFloat(_In_ const float* pSource) noexcept; + +XMVECTOR XM_CALLCONV XMLoadInt2(_In_reads_(2) const uint32_t* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadInt2A(_In_reads_(2) + const uint32_t* PSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadFloat2(_In_ const XMFLOAT2* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadFloat2A(_In_ const XMFLOAT2A* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadSInt2(_In_ const XMINT2* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadUInt2(_In_ const XMUINT2* pSource) noexcept; + +XMVECTOR XM_CALLCONV XMLoadInt3(_In_reads_(3) const uint32_t* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadInt3A(_In_reads_(3) + const uint32_t* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadFloat3(_In_ const XMFLOAT3* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadFloat3A(_In_ const XMFLOAT3A* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadSInt3(_In_ const XMINT3* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadUInt3(_In_ const XMUINT3* pSource) noexcept; + +XMVECTOR XM_CALLCONV XMLoadInt4(_In_reads_(4) const uint32_t* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadInt4A(_In_reads_(4) + const uint32_t* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadFloat4(_In_ const XMFLOAT4* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadFloat4A(_In_ const XMFLOAT4A* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadSInt4(_In_ const XMINT4* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadUInt4(_In_ const XMUINT4* pSource) noexcept; + +XMMATRIX XM_CALLCONV XMLoadFloat3x3(_In_ const XMFLOAT3X3* pSource) noexcept; +XMMATRIX XM_CALLCONV XMLoadFloat4x3(_In_ const XMFLOAT4X3* pSource) noexcept; +XMMATRIX XM_CALLCONV XMLoadFloat4x3A(_In_ const XMFLOAT4X3A* pSource) noexcept; +XMMATRIX XM_CALLCONV XMLoadFloat3x4(_In_ const XMFLOAT3X4* pSource) noexcept; +XMMATRIX XM_CALLCONV XMLoadFloat3x4A(_In_ const XMFLOAT3X4A* pSource) noexcept; +XMMATRIX XM_CALLCONV XMLoadFloat4x4(_In_ const XMFLOAT4X4* pSource) noexcept; +XMMATRIX XM_CALLCONV XMLoadFloat4x4A(_In_ const XMFLOAT4X4A* pSource) noexcept; + +/**************************************************************************** + * + * Store operations + * + ****************************************************************************/ + +void XM_CALLCONV XMStoreInt(_Out_ uint32_t* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreFloat(_Out_ float* pDestination, + _In_ FXMVECTOR V) noexcept; + +void XM_CALLCONV XMStoreInt2(_Out_writes_(2) uint32_t* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreInt2A(_Out_writes_(2) uint32_t* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreFloat2(_Out_ XMFLOAT2* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreFloat2A(_Out_ XMFLOAT2A* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreSInt2(_Out_ XMINT2* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreUInt2(_Out_ XMUINT2* pDestination, + _In_ FXMVECTOR V) noexcept; + +void XM_CALLCONV XMStoreInt3(_Out_writes_(3) uint32_t* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreInt3A(_Out_writes_(3) uint32_t* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreFloat3(_Out_ XMFLOAT3* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreFloat3A(_Out_ XMFLOAT3A* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreSInt3(_Out_ XMINT3* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreUInt3(_Out_ XMUINT3* pDestination, + _In_ FXMVECTOR V) noexcept; + +void XM_CALLCONV XMStoreInt4(_Out_writes_(4) uint32_t* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreInt4A(_Out_writes_(4) uint32_t* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreFloat4(_Out_ XMFLOAT4* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreFloat4A(_Out_ XMFLOAT4A* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreSInt4(_Out_ XMINT4* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreUInt4(_Out_ XMUINT4* pDestination, + _In_ FXMVECTOR V) noexcept; + +void XM_CALLCONV XMStoreFloat3x3(_Out_ XMFLOAT3X3* pDestination, + _In_ FXMMATRIX M) noexcept; +void XM_CALLCONV XMStoreFloat4x3(_Out_ XMFLOAT4X3* pDestination, + _In_ FXMMATRIX M) noexcept; +void XM_CALLCONV XMStoreFloat4x3A(_Out_ XMFLOAT4X3A* pDestination, + _In_ FXMMATRIX M) noexcept; +void XM_CALLCONV XMStoreFloat3x4(_Out_ XMFLOAT3X4* pDestination, + _In_ FXMMATRIX M) noexcept; +void XM_CALLCONV XMStoreFloat3x4A(_Out_ XMFLOAT3X4A* pDestination, + _In_ FXMMATRIX M) noexcept; +void XM_CALLCONV XMStoreFloat4x4(_Out_ XMFLOAT4X4* pDestination, + _In_ FXMMATRIX M) noexcept; +void XM_CALLCONV XMStoreFloat4x4A(_Out_ XMFLOAT4X4A* pDestination, + _In_ FXMMATRIX M) noexcept; + +/**************************************************************************** + * + * General vector operations + * + ****************************************************************************/ + +XMVECTOR XM_CALLCONV XMVectorZero() noexcept; +XMVECTOR XM_CALLCONV XMVectorSet(float x, float y, float z, float w) noexcept; +XMVECTOR XM_CALLCONV XMVectorSetInt(uint32_t x, uint32_t y, uint32_t z, + uint32_t w) noexcept; +XMVECTOR XM_CALLCONV XMVectorReplicate(float Value) noexcept; +XMVECTOR XM_CALLCONV XMVectorReplicatePtr(_In_ const float* pValue) noexcept; +XMVECTOR XM_CALLCONV XMVectorReplicateInt(uint32_t Value) noexcept; +XMVECTOR XM_CALLCONV +XMVectorReplicateIntPtr(_In_ const uint32_t* pValue) noexcept; +XMVECTOR XM_CALLCONV XMVectorTrueInt() noexcept; +XMVECTOR XM_CALLCONV XMVectorFalseInt() noexcept; +XMVECTOR XM_CALLCONV XMVectorSplatX(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorSplatY(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorSplatZ(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorSplatW(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorSplatOne() noexcept; +XMVECTOR XM_CALLCONV XMVectorSplatInfinity() noexcept; +XMVECTOR XM_CALLCONV XMVectorSplatQNaN() noexcept; +XMVECTOR XM_CALLCONV XMVectorSplatEpsilon() noexcept; +XMVECTOR XM_CALLCONV XMVectorSplatSignMask() noexcept; + +float XM_CALLCONV XMVectorGetByIndex(FXMVECTOR V, size_t i) noexcept; +float XM_CALLCONV XMVectorGetX(FXMVECTOR V) noexcept; +float XM_CALLCONV XMVectorGetY(FXMVECTOR V) noexcept; +float XM_CALLCONV XMVectorGetZ(FXMVECTOR V) noexcept; +float XM_CALLCONV XMVectorGetW(FXMVECTOR V) noexcept; + +void XM_CALLCONV XMVectorGetByIndexPtr(_Out_ float* f, _In_ FXMVECTOR V, + _In_ size_t i) noexcept; +void XM_CALLCONV XMVectorGetXPtr(_Out_ float* x, _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMVectorGetYPtr(_Out_ float* y, _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMVectorGetZPtr(_Out_ float* z, _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMVectorGetWPtr(_Out_ float* w, _In_ FXMVECTOR V) noexcept; + +uint32_t XM_CALLCONV XMVectorGetIntByIndex(FXMVECTOR V, size_t i) noexcept; +uint32_t XM_CALLCONV XMVectorGetIntX(FXMVECTOR V) noexcept; +uint32_t XM_CALLCONV XMVectorGetIntY(FXMVECTOR V) noexcept; +uint32_t XM_CALLCONV XMVectorGetIntZ(FXMVECTOR V) noexcept; +uint32_t XM_CALLCONV XMVectorGetIntW(FXMVECTOR V) noexcept; + +void XM_CALLCONV XMVectorGetIntByIndexPtr(_Out_ uint32_t* x, _In_ FXMVECTOR V, + _In_ size_t i) noexcept; +void XM_CALLCONV XMVectorGetIntXPtr(_Out_ uint32_t* x, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMVectorGetIntYPtr(_Out_ uint32_t* y, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMVectorGetIntZPtr(_Out_ uint32_t* z, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMVectorGetIntWPtr(_Out_ uint32_t* w, + _In_ FXMVECTOR V) noexcept; + +XMVECTOR XM_CALLCONV XMVectorSetByIndex(FXMVECTOR V, float f, + size_t i) noexcept; +XMVECTOR XM_CALLCONV XMVectorSetX(FXMVECTOR V, float x) noexcept; +XMVECTOR XM_CALLCONV XMVectorSetY(FXMVECTOR V, float y) noexcept; +XMVECTOR XM_CALLCONV XMVectorSetZ(FXMVECTOR V, float z) noexcept; +XMVECTOR XM_CALLCONV XMVectorSetW(FXMVECTOR V, float w) noexcept; + +XMVECTOR XM_CALLCONV XMVectorSetByIndexPtr(_In_ FXMVECTOR V, + _In_ const float* f, + _In_ size_t i) noexcept; +XMVECTOR XM_CALLCONV XMVectorSetXPtr(_In_ FXMVECTOR V, + _In_ const float* x) noexcept; +XMVECTOR XM_CALLCONV XMVectorSetYPtr(_In_ FXMVECTOR V, + _In_ const float* y) noexcept; +XMVECTOR XM_CALLCONV XMVectorSetZPtr(_In_ FXMVECTOR V, + _In_ const float* z) noexcept; +XMVECTOR XM_CALLCONV XMVectorSetWPtr(_In_ FXMVECTOR V, + _In_ const float* w) noexcept; + +XMVECTOR XM_CALLCONV XMVectorSetIntByIndex(FXMVECTOR V, uint32_t x, + size_t i) noexcept; +XMVECTOR XM_CALLCONV XMVectorSetIntX(FXMVECTOR V, uint32_t x) noexcept; +XMVECTOR XM_CALLCONV XMVectorSetIntY(FXMVECTOR V, uint32_t y) noexcept; +XMVECTOR XM_CALLCONV XMVectorSetIntZ(FXMVECTOR V, uint32_t z) noexcept; +XMVECTOR XM_CALLCONV XMVectorSetIntW(FXMVECTOR V, uint32_t w) noexcept; + +XMVECTOR XM_CALLCONV XMVectorSetIntByIndexPtr(_In_ FXMVECTOR V, + _In_ const uint32_t* x, + _In_ size_t i) noexcept; +XMVECTOR XM_CALLCONV XMVectorSetIntXPtr(_In_ FXMVECTOR V, + _In_ const uint32_t* x) noexcept; +XMVECTOR XM_CALLCONV XMVectorSetIntYPtr(_In_ FXMVECTOR V, + _In_ const uint32_t* y) noexcept; +XMVECTOR XM_CALLCONV XMVectorSetIntZPtr(_In_ FXMVECTOR V, + _In_ const uint32_t* z) noexcept; +XMVECTOR XM_CALLCONV XMVectorSetIntWPtr(_In_ FXMVECTOR V, + _In_ const uint32_t* w) noexcept; + +#if defined(__XNAMATH_H__) && defined(XMVectorSwizzle) +#undef XMVectorSwizzle +#endif + +XMVECTOR XM_CALLCONV XMVectorSwizzle(FXMVECTOR V, uint32_t E0, uint32_t E1, + uint32_t E2, uint32_t E3) noexcept; +XMVECTOR XM_CALLCONV XMVectorPermute(FXMVECTOR V1, FXMVECTOR V2, + uint32_t PermuteX, uint32_t PermuteY, + uint32_t PermuteZ, + uint32_t PermuteW) noexcept; +XMVECTOR XM_CALLCONV XMVectorSelectControl(uint32_t VectorIndex0, + uint32_t VectorIndex1, + uint32_t VectorIndex2, + uint32_t VectorIndex3) noexcept; +XMVECTOR XM_CALLCONV XMVectorSelect(FXMVECTOR V1, FXMVECTOR V2, + FXMVECTOR Control) noexcept; +XMVECTOR XM_CALLCONV XMVectorMergeXY(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorMergeZW(FXMVECTOR V1, FXMVECTOR V2) noexcept; + +#if defined(__XNAMATH_H__) && defined(XMVectorShiftLeft) +#undef XMVectorShiftLeft +#undef XMVectorRotateLeft +#undef XMVectorRotateRight +#undef XMVectorInsert +#endif + +XMVECTOR XM_CALLCONV XMVectorShiftLeft(FXMVECTOR V1, FXMVECTOR V2, + uint32_t Elements) noexcept; +XMVECTOR XM_CALLCONV XMVectorRotateLeft(FXMVECTOR V, + uint32_t Elements) noexcept; +XMVECTOR XM_CALLCONV XMVectorRotateRight(FXMVECTOR V, + uint32_t Elements) noexcept; +XMVECTOR XM_CALLCONV XMVectorInsert(FXMVECTOR VD, FXMVECTOR VS, + uint32_t VSLeftRotateElements, + uint32_t Select0, uint32_t Select1, + uint32_t Select2, + uint32_t Select3) noexcept; + +XMVECTOR XM_CALLCONV XMVectorEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorEqualR(_Out_ uint32_t* pCR, _In_ FXMVECTOR V1, + _In_ FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorEqualIntR(_Out_ uint32_t* pCR, _In_ FXMVECTOR V, + _In_ FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorNearEqual(FXMVECTOR V1, FXMVECTOR V2, + FXMVECTOR Epsilon) noexcept; +XMVECTOR XM_CALLCONV XMVectorNotEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorNotEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorGreater(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorGreaterR(_Out_ uint32_t* pCR, _In_ FXMVECTOR V1, + _In_ FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorGreaterOrEqual(FXMVECTOR V1, + FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorGreaterOrEqualR(_Out_ uint32_t* pCR, + _In_ FXMVECTOR V1, + _In_ FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorLess(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorLessOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorInBounds(FXMVECTOR V, FXMVECTOR Bounds) noexcept; +XMVECTOR XM_CALLCONV XMVectorInBoundsR(_Out_ uint32_t* pCR, _In_ FXMVECTOR V, + _In_ FXMVECTOR Bounds) noexcept; + +XMVECTOR XM_CALLCONV XMVectorIsNaN(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorIsInfinite(FXMVECTOR V) noexcept; + +XMVECTOR XM_CALLCONV XMVectorMin(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorMax(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorRound(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorTruncate(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorFloor(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorCeiling(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorClamp(FXMVECTOR V, FXMVECTOR Min, + FXMVECTOR Max) noexcept; +XMVECTOR XM_CALLCONV XMVectorSaturate(FXMVECTOR V) noexcept; + +XMVECTOR XM_CALLCONV XMVectorAndInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorAndCInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorOrInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorNorInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorXorInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; + +XMVECTOR XM_CALLCONV XMVectorNegate(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorAdd(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorSum(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorAddAngles(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorSubtract(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorSubtractAngles(FXMVECTOR V1, + FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorMultiply(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorMultiplyAdd(FXMVECTOR V1, FXMVECTOR V2, + FXMVECTOR V3) noexcept; +XMVECTOR XM_CALLCONV XMVectorDivide(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorNegativeMultiplySubtract(FXMVECTOR V1, + FXMVECTOR V2, + FXMVECTOR V3) noexcept; +XMVECTOR XM_CALLCONV XMVectorScale(FXMVECTOR V, float ScaleFactor) noexcept; +XMVECTOR XM_CALLCONV XMVectorReciprocalEst(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorReciprocal(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorSqrtEst(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorSqrt(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorReciprocalSqrtEst(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorReciprocalSqrt(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorExp2(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorExp10(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorExpE(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorExp(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorLog2(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorLog10(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorLogE(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorLog(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorPow(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorAbs(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorMod(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVectorModAngles(FXMVECTOR Angles) noexcept; +XMVECTOR XM_CALLCONV XMVectorSin(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorSinEst(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorCos(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorCosEst(FXMVECTOR V) noexcept; +void XM_CALLCONV XMVectorSinCos(_Out_ XMVECTOR* pSin, _Out_ XMVECTOR* pCos, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMVectorSinCosEst(_Out_ XMVECTOR* pSin, _Out_ XMVECTOR* pCos, + _In_ FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorTan(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorTanEst(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorSinH(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorCosH(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorTanH(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorASin(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorASinEst(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorACos(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorACosEst(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorATan(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorATanEst(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVectorATan2(FXMVECTOR Y, FXMVECTOR X) noexcept; +XMVECTOR XM_CALLCONV XMVectorATan2Est(FXMVECTOR Y, FXMVECTOR X) noexcept; +XMVECTOR XM_CALLCONV XMVectorLerp(FXMVECTOR V0, FXMVECTOR V1, float t) noexcept; +XMVECTOR XM_CALLCONV XMVectorLerpV(FXMVECTOR V0, FXMVECTOR V1, + FXMVECTOR T) noexcept; +XMVECTOR XM_CALLCONV XMVectorHermite(FXMVECTOR Position0, FXMVECTOR Tangent0, + FXMVECTOR Position1, GXMVECTOR Tangent1, + float t) noexcept; +XMVECTOR XM_CALLCONV XMVectorHermiteV(FXMVECTOR Position0, FXMVECTOR Tangent0, + FXMVECTOR Position1, GXMVECTOR Tangent1, + HXMVECTOR T) noexcept; +XMVECTOR XM_CALLCONV XMVectorCatmullRom(FXMVECTOR Position0, + FXMVECTOR Position1, + FXMVECTOR Position2, + GXMVECTOR Position3, float t) noexcept; +XMVECTOR XM_CALLCONV XMVectorCatmullRomV(FXMVECTOR Position0, + FXMVECTOR Position1, + FXMVECTOR Position2, + GXMVECTOR Position3, + HXMVECTOR T) noexcept; +XMVECTOR XM_CALLCONV XMVectorBaryCentric(FXMVECTOR Position0, + FXMVECTOR Position1, + FXMVECTOR Position2, float f, + float g) noexcept; +XMVECTOR XM_CALLCONV XMVectorBaryCentricV(FXMVECTOR Position0, + FXMVECTOR Position1, + FXMVECTOR Position2, GXMVECTOR F, + HXMVECTOR G) noexcept; + +/**************************************************************************** + * + * 2D vector operations + * + ****************************************************************************/ + +bool XM_CALLCONV XMVector2Equal(FXMVECTOR V1, FXMVECTOR V2) noexcept; +uint32_t XM_CALLCONV XMVector2EqualR(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector2EqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; +uint32_t XM_CALLCONV XMVector2EqualIntR(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector2NearEqual(FXMVECTOR V1, FXMVECTOR V2, + FXMVECTOR Epsilon) noexcept; +bool XM_CALLCONV XMVector2NotEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector2NotEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector2Greater(FXMVECTOR V1, FXMVECTOR V2) noexcept; +uint32_t XM_CALLCONV XMVector2GreaterR(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector2GreaterOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; +uint32_t XM_CALLCONV XMVector2GreaterOrEqualR(FXMVECTOR V1, + FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector2Less(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector2LessOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector2InBounds(FXMVECTOR V, FXMVECTOR Bounds) noexcept; + +bool XM_CALLCONV XMVector2IsNaN(FXMVECTOR V) noexcept; +bool XM_CALLCONV XMVector2IsInfinite(FXMVECTOR V) noexcept; + +XMVECTOR XM_CALLCONV XMVector2Dot(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVector2Cross(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVector2LengthSq(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector2ReciprocalLengthEst(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector2ReciprocalLength(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector2LengthEst(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector2Length(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector2NormalizeEst(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector2Normalize(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector2ClampLength(FXMVECTOR V, float LengthMin, + float LengthMax) noexcept; +XMVECTOR XM_CALLCONV XMVector2ClampLengthV(FXMVECTOR V, FXMVECTOR LengthMin, + FXMVECTOR LengthMax) noexcept; +XMVECTOR XM_CALLCONV XMVector2Reflect(FXMVECTOR Incident, + FXMVECTOR Normal) noexcept; +XMVECTOR XM_CALLCONV XMVector2Refract(FXMVECTOR Incident, FXMVECTOR Normal, + float RefractionIndex) noexcept; +XMVECTOR XM_CALLCONV XMVector2RefractV(FXMVECTOR Incident, FXMVECTOR Normal, + FXMVECTOR RefractionIndex) noexcept; +XMVECTOR XM_CALLCONV XMVector2Orthogonal(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector2AngleBetweenNormalsEst(FXMVECTOR N1, + FXMVECTOR N2) noexcept; +XMVECTOR XM_CALLCONV XMVector2AngleBetweenNormals(FXMVECTOR N1, + FXMVECTOR N2) noexcept; +XMVECTOR XM_CALLCONV XMVector2AngleBetweenVectors(FXMVECTOR V1, + FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVector2LinePointDistance(FXMVECTOR LinePoint1, + FXMVECTOR LinePoint2, + FXMVECTOR Point) noexcept; +XMVECTOR XM_CALLCONV XMVector2IntersectLine(FXMVECTOR Line1Point1, + FXMVECTOR Line1Point2, + FXMVECTOR Line2Point1, + GXMVECTOR Line2Point2) noexcept; +XMVECTOR XM_CALLCONV XMVector2Transform(FXMVECTOR V, FXMMATRIX M) noexcept; +XMFLOAT4* XM_CALLCONV XMVector2TransformStream( + _Out_writes_bytes_(sizeof(XMFLOAT4) + OutputStride * (VectorCount - 1)) + XMFLOAT4* pOutputStream, + _In_ size_t OutputStride, + _In_reads_bytes_(sizeof(XMFLOAT2) + InputStride * (VectorCount - 1)) + const XMFLOAT2* pInputStream, + _In_ size_t InputStride, _In_ size_t VectorCount, + _In_ FXMMATRIX M) noexcept; +XMVECTOR XM_CALLCONV XMVector2TransformCoord(FXMVECTOR V, FXMMATRIX M) noexcept; +XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream( + _Out_writes_bytes_(sizeof(XMFLOAT2) + OutputStride * (VectorCount - 1)) + XMFLOAT2* pOutputStream, + _In_ size_t OutputStride, + _In_reads_bytes_(sizeof(XMFLOAT2) + InputStride * (VectorCount - 1)) + const XMFLOAT2* pInputStream, + _In_ size_t InputStride, _In_ size_t VectorCount, + _In_ FXMMATRIX M) noexcept; +XMVECTOR XM_CALLCONV XMVector2TransformNormal(FXMVECTOR V, + FXMMATRIX M) noexcept; +XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream( + _Out_writes_bytes_(sizeof(XMFLOAT2) + OutputStride * (VectorCount - 1)) + XMFLOAT2* pOutputStream, + _In_ size_t OutputStride, + _In_reads_bytes_(sizeof(XMFLOAT2) + InputStride * (VectorCount - 1)) + const XMFLOAT2* pInputStream, + _In_ size_t InputStride, _In_ size_t VectorCount, + _In_ FXMMATRIX M) noexcept; + +/**************************************************************************** + * + * 3D vector operations + * + ****************************************************************************/ + +bool XM_CALLCONV XMVector3Equal(FXMVECTOR V1, FXMVECTOR V2) noexcept; +uint32_t XM_CALLCONV XMVector3EqualR(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector3EqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; +uint32_t XM_CALLCONV XMVector3EqualIntR(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector3NearEqual(FXMVECTOR V1, FXMVECTOR V2, + FXMVECTOR Epsilon) noexcept; +bool XM_CALLCONV XMVector3NotEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector3NotEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector3Greater(FXMVECTOR V1, FXMVECTOR V2) noexcept; +uint32_t XM_CALLCONV XMVector3GreaterR(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector3GreaterOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; +uint32_t XM_CALLCONV XMVector3GreaterOrEqualR(FXMVECTOR V1, + FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector3Less(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector3LessOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector3InBounds(FXMVECTOR V, FXMVECTOR Bounds) noexcept; + +bool XM_CALLCONV XMVector3IsNaN(FXMVECTOR V) noexcept; +bool XM_CALLCONV XMVector3IsInfinite(FXMVECTOR V) noexcept; + +XMVECTOR XM_CALLCONV XMVector3Dot(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVector3Cross(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVector3LengthSq(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector3ReciprocalLengthEst(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector3ReciprocalLength(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector3LengthEst(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector3Length(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector3NormalizeEst(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector3Normalize(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector3ClampLength(FXMVECTOR V, float LengthMin, + float LengthMax) noexcept; +XMVECTOR XM_CALLCONV XMVector3ClampLengthV(FXMVECTOR V, FXMVECTOR LengthMin, + FXMVECTOR LengthMax) noexcept; +XMVECTOR XM_CALLCONV XMVector3Reflect(FXMVECTOR Incident, + FXMVECTOR Normal) noexcept; +XMVECTOR XM_CALLCONV XMVector3Refract(FXMVECTOR Incident, FXMVECTOR Normal, + float RefractionIndex) noexcept; +XMVECTOR XM_CALLCONV XMVector3RefractV(FXMVECTOR Incident, FXMVECTOR Normal, + FXMVECTOR RefractionIndex) noexcept; +XMVECTOR XM_CALLCONV XMVector3Orthogonal(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector3AngleBetweenNormalsEst(FXMVECTOR N1, + FXMVECTOR N2) noexcept; +XMVECTOR XM_CALLCONV XMVector3AngleBetweenNormals(FXMVECTOR N1, + FXMVECTOR N2) noexcept; +XMVECTOR XM_CALLCONV XMVector3AngleBetweenVectors(FXMVECTOR V1, + FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVector3LinePointDistance(FXMVECTOR LinePoint1, + FXMVECTOR LinePoint2, + FXMVECTOR Point) noexcept; +void XM_CALLCONV XMVector3ComponentsFromNormal(_Out_ XMVECTOR* pParallel, + _Out_ XMVECTOR* pPerpendicular, + _In_ FXMVECTOR V, + _In_ FXMVECTOR Normal) noexcept; +XMVECTOR XM_CALLCONV XMVector3Rotate(FXMVECTOR V, + FXMVECTOR RotationQuaternion) noexcept; +XMVECTOR XM_CALLCONV +XMVector3InverseRotate(FXMVECTOR V, FXMVECTOR RotationQuaternion) noexcept; +XMVECTOR XM_CALLCONV XMVector3Transform(FXMVECTOR V, FXMMATRIX M) noexcept; +XMFLOAT4* XM_CALLCONV XMVector3TransformStream( + _Out_writes_bytes_(sizeof(XMFLOAT4) + OutputStride * (VectorCount - 1)) + XMFLOAT4* pOutputStream, + _In_ size_t OutputStride, + _In_reads_bytes_(sizeof(XMFLOAT3) + InputStride * (VectorCount - 1)) + const XMFLOAT3* pInputStream, + _In_ size_t InputStride, _In_ size_t VectorCount, + _In_ FXMMATRIX M) noexcept; +XMVECTOR XM_CALLCONV XMVector3TransformCoord(FXMVECTOR V, FXMMATRIX M) noexcept; +XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream( + _Out_writes_bytes_(sizeof(XMFLOAT3) + OutputStride * (VectorCount - 1)) + XMFLOAT3* pOutputStream, + _In_ size_t OutputStride, + _In_reads_bytes_(sizeof(XMFLOAT3) + InputStride * (VectorCount - 1)) + const XMFLOAT3* pInputStream, + _In_ size_t InputStride, _In_ size_t VectorCount, + _In_ FXMMATRIX M) noexcept; +XMVECTOR XM_CALLCONV XMVector3TransformNormal(FXMVECTOR V, + FXMMATRIX M) noexcept; +XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream( + _Out_writes_bytes_(sizeof(XMFLOAT3) + OutputStride * (VectorCount - 1)) + XMFLOAT3* pOutputStream, + _In_ size_t OutputStride, + _In_reads_bytes_(sizeof(XMFLOAT3) + InputStride * (VectorCount - 1)) + const XMFLOAT3* pInputStream, + _In_ size_t InputStride, _In_ size_t VectorCount, + _In_ FXMMATRIX M) noexcept; +XMVECTOR XM_CALLCONV XMVector3Project(FXMVECTOR V, float ViewportX, + float ViewportY, float ViewportWidth, + float ViewportHeight, float ViewportMinZ, + float ViewportMaxZ, FXMMATRIX Projection, + CXMMATRIX View, CXMMATRIX World) noexcept; +XMFLOAT3* XM_CALLCONV XMVector3ProjectStream( + _Out_writes_bytes_(sizeof(XMFLOAT3) + OutputStride * (VectorCount - 1)) + XMFLOAT3* pOutputStream, + _In_ size_t OutputStride, + _In_reads_bytes_(sizeof(XMFLOAT3) + InputStride * (VectorCount - 1)) + const XMFLOAT3* pInputStream, + _In_ size_t InputStride, _In_ size_t VectorCount, _In_ float ViewportX, + _In_ float ViewportY, _In_ float ViewportWidth, _In_ float ViewportHeight, + _In_ float ViewportMinZ, _In_ float ViewportMaxZ, _In_ FXMMATRIX Projection, + _In_ CXMMATRIX View, _In_ CXMMATRIX World) noexcept; +XMVECTOR XM_CALLCONV XMVector3Unproject(FXMVECTOR V, float ViewportX, + float ViewportY, float ViewportWidth, + float ViewportHeight, + float ViewportMinZ, float ViewportMaxZ, + FXMMATRIX Projection, CXMMATRIX View, + CXMMATRIX World) noexcept; +XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream( + _Out_writes_bytes_(sizeof(XMFLOAT3) + OutputStride * (VectorCount - 1)) + XMFLOAT3* pOutputStream, + _In_ size_t OutputStride, + _In_reads_bytes_(sizeof(XMFLOAT3) + InputStride * (VectorCount - 1)) + const XMFLOAT3* pInputStream, + _In_ size_t InputStride, _In_ size_t VectorCount, _In_ float ViewportX, + _In_ float ViewportY, _In_ float ViewportWidth, _In_ float ViewportHeight, + _In_ float ViewportMinZ, _In_ float ViewportMaxZ, _In_ FXMMATRIX Projection, + _In_ CXMMATRIX View, _In_ CXMMATRIX World) noexcept; + +/**************************************************************************** + * + * 4D vector operations + * + ****************************************************************************/ + +bool XM_CALLCONV XMVector4Equal(FXMVECTOR V1, FXMVECTOR V2) noexcept; +uint32_t XM_CALLCONV XMVector4EqualR(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector4EqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; +uint32_t XM_CALLCONV XMVector4EqualIntR(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector4NearEqual(FXMVECTOR V1, FXMVECTOR V2, + FXMVECTOR Epsilon) noexcept; +bool XM_CALLCONV XMVector4NotEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector4NotEqualInt(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector4Greater(FXMVECTOR V1, FXMVECTOR V2) noexcept; +uint32_t XM_CALLCONV XMVector4GreaterR(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector4GreaterOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; +uint32_t XM_CALLCONV XMVector4GreaterOrEqualR(FXMVECTOR V1, + FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector4Less(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector4LessOrEqual(FXMVECTOR V1, FXMVECTOR V2) noexcept; +bool XM_CALLCONV XMVector4InBounds(FXMVECTOR V, FXMVECTOR Bounds) noexcept; + +bool XM_CALLCONV XMVector4IsNaN(FXMVECTOR V) noexcept; +bool XM_CALLCONV XMVector4IsInfinite(FXMVECTOR V) noexcept; + +XMVECTOR XM_CALLCONV XMVector4Dot(FXMVECTOR V1, FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVector4Cross(FXMVECTOR V1, FXMVECTOR V2, + FXMVECTOR V3) noexcept; +XMVECTOR XM_CALLCONV XMVector4LengthSq(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector4ReciprocalLengthEst(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector4ReciprocalLength(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector4LengthEst(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector4Length(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector4NormalizeEst(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector4Normalize(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector4ClampLength(FXMVECTOR V, float LengthMin, + float LengthMax) noexcept; +XMVECTOR XM_CALLCONV XMVector4ClampLengthV(FXMVECTOR V, FXMVECTOR LengthMin, + FXMVECTOR LengthMax) noexcept; +XMVECTOR XM_CALLCONV XMVector4Reflect(FXMVECTOR Incident, + FXMVECTOR Normal) noexcept; +XMVECTOR XM_CALLCONV XMVector4Refract(FXMVECTOR Incident, FXMVECTOR Normal, + float RefractionIndex) noexcept; +XMVECTOR XM_CALLCONV XMVector4RefractV(FXMVECTOR Incident, FXMVECTOR Normal, + FXMVECTOR RefractionIndex) noexcept; +XMVECTOR XM_CALLCONV XMVector4Orthogonal(FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMVector4AngleBetweenNormalsEst(FXMVECTOR N1, + FXMVECTOR N2) noexcept; +XMVECTOR XM_CALLCONV XMVector4AngleBetweenNormals(FXMVECTOR N1, + FXMVECTOR N2) noexcept; +XMVECTOR XM_CALLCONV XMVector4AngleBetweenVectors(FXMVECTOR V1, + FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMVector4Transform(FXMVECTOR V, FXMMATRIX M) noexcept; +XMFLOAT4* XM_CALLCONV XMVector4TransformStream( + _Out_writes_bytes_(sizeof(XMFLOAT4) + OutputStride * (VectorCount - 1)) + XMFLOAT4* pOutputStream, + _In_ size_t OutputStride, + _In_reads_bytes_(sizeof(XMFLOAT4) + InputStride * (VectorCount - 1)) + const XMFLOAT4* pInputStream, + _In_ size_t InputStride, _In_ size_t VectorCount, + _In_ FXMMATRIX M) noexcept; + +/**************************************************************************** + * + * Matrix operations + * + ****************************************************************************/ + +bool XM_CALLCONV XMMatrixIsNaN(FXMMATRIX M) noexcept; +bool XM_CALLCONV XMMatrixIsInfinite(FXMMATRIX M) noexcept; +bool XM_CALLCONV XMMatrixIsIdentity(FXMMATRIX M) noexcept; + +XMMATRIX XM_CALLCONV XMMatrixMultiply(FXMMATRIX M1, CXMMATRIX M2) noexcept; +XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose(FXMMATRIX M1, + CXMMATRIX M2) noexcept; +XMMATRIX XM_CALLCONV XMMatrixTranspose(FXMMATRIX M) noexcept; +XMMATRIX XM_CALLCONV XMMatrixInverse(_Out_opt_ XMVECTOR* pDeterminant, + _In_ FXMMATRIX M) noexcept; +XMMATRIX XM_CALLCONV XMMatrixVectorTensorProduct(FXMVECTOR V1, + FXMVECTOR V2) noexcept; +XMVECTOR XM_CALLCONV XMMatrixDeterminant(FXMMATRIX M) noexcept; + +_Success_(return) bool XM_CALLCONV + XMMatrixDecompose(_Out_ XMVECTOR* outScale, _Out_ XMVECTOR* outRotQuat, + _Out_ XMVECTOR* outTrans, _In_ FXMMATRIX M) noexcept; + +XMMATRIX XM_CALLCONV XMMatrixIdentity() noexcept; +XMMATRIX XM_CALLCONV XMMatrixSet(float m00, float m01, float m02, float m03, + float m10, float m11, float m12, float m13, + float m20, float m21, float m22, float m23, + float m30, float m31, float m32, + float m33) noexcept; +XMMATRIX XM_CALLCONV XMMatrixTranslation(float OffsetX, float OffsetY, + float OffsetZ) noexcept; +XMMATRIX XM_CALLCONV XMMatrixTranslationFromVector(FXMVECTOR Offset) noexcept; +XMMATRIX XM_CALLCONV XMMatrixScaling(float ScaleX, float ScaleY, + float ScaleZ) noexcept; +XMMATRIX XM_CALLCONV XMMatrixScalingFromVector(FXMVECTOR Scale) noexcept; +XMMATRIX XM_CALLCONV XMMatrixRotationX(float Angle) noexcept; +XMMATRIX XM_CALLCONV XMMatrixRotationY(float Angle) noexcept; +XMMATRIX XM_CALLCONV XMMatrixRotationZ(float Angle) noexcept; + +// Rotates about y-axis (Yaw), then x-axis (Pitch), then z-axis (Roll) +XMMATRIX XM_CALLCONV XMMatrixRotationRollPitchYaw(float Pitch, float Yaw, + float Roll) noexcept; + +// Rotates about y-axis (Angles.y), then x-axis (Angles.x), then z-axis +// (Angles.z) +XMMATRIX XM_CALLCONV +XMMatrixRotationRollPitchYawFromVector(FXMVECTOR Angles) noexcept; + +XMMATRIX XM_CALLCONV XMMatrixRotationNormal(FXMVECTOR NormalAxis, + float Angle) noexcept; +XMMATRIX XM_CALLCONV XMMatrixRotationAxis(FXMVECTOR Axis, float Angle) noexcept; +XMMATRIX XM_CALLCONV XMMatrixRotationQuaternion(FXMVECTOR Quaternion) noexcept; +XMMATRIX XM_CALLCONV XMMatrixTransformation2D( + FXMVECTOR ScalingOrigin, float ScalingOrientation, FXMVECTOR Scaling, + FXMVECTOR RotationOrigin, float Rotation, GXMVECTOR Translation) noexcept; +XMMATRIX XM_CALLCONV XMMatrixTransformation( + FXMVECTOR ScalingOrigin, FXMVECTOR ScalingOrientationQuaternion, + FXMVECTOR Scaling, GXMVECTOR RotationOrigin, HXMVECTOR RotationQuaternion, + HXMVECTOR Translation) noexcept; +XMMATRIX XM_CALLCONV +XMMatrixAffineTransformation2D(FXMVECTOR Scaling, FXMVECTOR RotationOrigin, + float Rotation, FXMVECTOR Translation) noexcept; +XMMATRIX XM_CALLCONV XMMatrixAffineTransformation( + FXMVECTOR Scaling, FXMVECTOR RotationOrigin, FXMVECTOR RotationQuaternion, + GXMVECTOR Translation) noexcept; +XMMATRIX XM_CALLCONV XMMatrixReflect(FXMVECTOR ReflectionPlane) noexcept; +XMMATRIX XM_CALLCONV XMMatrixShadow(FXMVECTOR ShadowPlane, + FXMVECTOR LightPosition) noexcept; + +XMMATRIX XM_CALLCONV XMMatrixLookAtLH(FXMVECTOR EyePosition, + FXMVECTOR FocusPosition, + FXMVECTOR UpDirection) noexcept; +XMMATRIX XM_CALLCONV XMMatrixLookAtRH(FXMVECTOR EyePosition, + FXMVECTOR FocusPosition, + FXMVECTOR UpDirection) noexcept; +XMMATRIX XM_CALLCONV XMMatrixLookToLH(FXMVECTOR EyePosition, + FXMVECTOR EyeDirection, + FXMVECTOR UpDirection) noexcept; +XMMATRIX XM_CALLCONV XMMatrixLookToRH(FXMVECTOR EyePosition, + FXMVECTOR EyeDirection, + FXMVECTOR UpDirection) noexcept; +XMMATRIX XM_CALLCONV XMMatrixPerspectiveLH(float ViewWidth, float ViewHeight, + float NearZ, float FarZ) noexcept; +XMMATRIX XM_CALLCONV XMMatrixPerspectiveRH(float ViewWidth, float ViewHeight, + float NearZ, float FarZ) noexcept; +XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovLH(float FovAngleY, + float AspectRatio, float NearZ, + float FarZ) noexcept; +XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovRH(float FovAngleY, + float AspectRatio, float NearZ, + float FarZ) noexcept; +XMMATRIX XM_CALLCONV XMMatrixPerspectiveOffCenterLH(float ViewLeft, + float ViewRight, + float ViewBottom, + float ViewTop, float NearZ, + float FarZ) noexcept; +XMMATRIX XM_CALLCONV XMMatrixPerspectiveOffCenterRH(float ViewLeft, + float ViewRight, + float ViewBottom, + float ViewTop, float NearZ, + float FarZ) noexcept; +XMMATRIX XM_CALLCONV XMMatrixOrthographicLH(float ViewWidth, float ViewHeight, + float NearZ, float FarZ) noexcept; +XMMATRIX XM_CALLCONV XMMatrixOrthographicRH(float ViewWidth, float ViewHeight, + float NearZ, float FarZ) noexcept; +XMMATRIX XM_CALLCONV XMMatrixOrthographicOffCenterLH(float ViewLeft, + float ViewRight, + float ViewBottom, + float ViewTop, float NearZ, + float FarZ) noexcept; +XMMATRIX XM_CALLCONV XMMatrixOrthographicOffCenterRH(float ViewLeft, + float ViewRight, + float ViewBottom, + float ViewTop, float NearZ, + float FarZ) noexcept; + +/**************************************************************************** + * + * Quaternion operations + * + ****************************************************************************/ + +bool XM_CALLCONV XMQuaternionEqual(FXMVECTOR Q1, FXMVECTOR Q2) noexcept; +bool XM_CALLCONV XMQuaternionNotEqual(FXMVECTOR Q1, FXMVECTOR Q2) noexcept; + +bool XM_CALLCONV XMQuaternionIsNaN(FXMVECTOR Q) noexcept; +bool XM_CALLCONV XMQuaternionIsInfinite(FXMVECTOR Q) noexcept; +bool XM_CALLCONV XMQuaternionIsIdentity(FXMVECTOR Q) noexcept; + +XMVECTOR XM_CALLCONV XMQuaternionDot(FXMVECTOR Q1, FXMVECTOR Q2) noexcept; +XMVECTOR XM_CALLCONV XMQuaternionMultiply(FXMVECTOR Q1, FXMVECTOR Q2) noexcept; +XMVECTOR XM_CALLCONV XMQuaternionLengthSq(FXMVECTOR Q) noexcept; +XMVECTOR XM_CALLCONV XMQuaternionReciprocalLength(FXMVECTOR Q) noexcept; +XMVECTOR XM_CALLCONV XMQuaternionLength(FXMVECTOR Q) noexcept; +XMVECTOR XM_CALLCONV XMQuaternionNormalizeEst(FXMVECTOR Q) noexcept; +XMVECTOR XM_CALLCONV XMQuaternionNormalize(FXMVECTOR Q) noexcept; +XMVECTOR XM_CALLCONV XMQuaternionConjugate(FXMVECTOR Q) noexcept; +XMVECTOR XM_CALLCONV XMQuaternionInverse(FXMVECTOR Q) noexcept; +XMVECTOR XM_CALLCONV XMQuaternionLn(FXMVECTOR Q) noexcept; +XMVECTOR XM_CALLCONV XMQuaternionExp(FXMVECTOR Q) noexcept; +XMVECTOR XM_CALLCONV XMQuaternionSlerp(FXMVECTOR Q0, FXMVECTOR Q1, + float t) noexcept; +XMVECTOR XM_CALLCONV XMQuaternionSlerpV(FXMVECTOR Q0, FXMVECTOR Q1, + FXMVECTOR T) noexcept; +XMVECTOR XM_CALLCONV XMQuaternionSquad(FXMVECTOR Q0, FXMVECTOR Q1, FXMVECTOR Q2, + GXMVECTOR Q3, float t) noexcept; +XMVECTOR XM_CALLCONV XMQuaternionSquadV(FXMVECTOR Q0, FXMVECTOR Q1, + FXMVECTOR Q2, GXMVECTOR Q3, + HXMVECTOR T) noexcept; +void XM_CALLCONV XMQuaternionSquadSetup(_Out_ XMVECTOR* pA, _Out_ XMVECTOR* pB, + _Out_ XMVECTOR* pC, _In_ FXMVECTOR Q0, + _In_ FXMVECTOR Q1, _In_ FXMVECTOR Q2, + _In_ GXMVECTOR Q3) noexcept; +XMVECTOR XM_CALLCONV XMQuaternionBaryCentric(FXMVECTOR Q0, FXMVECTOR Q1, + FXMVECTOR Q2, float f, + float g) noexcept; +XMVECTOR XM_CALLCONV XMQuaternionBaryCentricV(FXMVECTOR Q0, FXMVECTOR Q1, + FXMVECTOR Q2, GXMVECTOR F, + HXMVECTOR G) noexcept; + +XMVECTOR XM_CALLCONV XMQuaternionIdentity() noexcept; + +// Rotates about y-axis (Yaw), then x-axis (Pitch), then z-axis (Roll) +XMVECTOR XM_CALLCONV XMQuaternionRotationRollPitchYaw(float Pitch, float Yaw, + float Roll) noexcept; + +// Rotates about y-axis (Angles.y), then x-axis (Angles.x), then z-axis +// (Angles.z) +XMVECTOR XM_CALLCONV +XMQuaternionRotationRollPitchYawFromVector(FXMVECTOR Angles) noexcept; + +XMVECTOR XM_CALLCONV XMQuaternionRotationNormal(FXMVECTOR NormalAxis, + float Angle) noexcept; +XMVECTOR XM_CALLCONV XMQuaternionRotationAxis(FXMVECTOR Axis, + float Angle) noexcept; +XMVECTOR XM_CALLCONV XMQuaternionRotationMatrix(FXMMATRIX M) noexcept; + +void XM_CALLCONV XMQuaternionToAxisAngle(_Out_ XMVECTOR* pAxis, + _Out_ float* pAngle, + _In_ FXMVECTOR Q) noexcept; + +/**************************************************************************** + * + * Plane operations + * + ****************************************************************************/ + +bool XM_CALLCONV XMPlaneEqual(FXMVECTOR P1, FXMVECTOR P2) noexcept; +bool XM_CALLCONV XMPlaneNearEqual(FXMVECTOR P1, FXMVECTOR P2, + FXMVECTOR Epsilon) noexcept; +bool XM_CALLCONV XMPlaneNotEqual(FXMVECTOR P1, FXMVECTOR P2) noexcept; + +bool XM_CALLCONV XMPlaneIsNaN(FXMVECTOR P) noexcept; +bool XM_CALLCONV XMPlaneIsInfinite(FXMVECTOR P) noexcept; + +XMVECTOR XM_CALLCONV XMPlaneDot(FXMVECTOR P, FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMPlaneDotCoord(FXMVECTOR P, FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMPlaneDotNormal(FXMVECTOR P, FXMVECTOR V) noexcept; +XMVECTOR XM_CALLCONV XMPlaneNormalizeEst(FXMVECTOR P) noexcept; +XMVECTOR XM_CALLCONV XMPlaneNormalize(FXMVECTOR P) noexcept; +XMVECTOR XM_CALLCONV XMPlaneIntersectLine(FXMVECTOR P, FXMVECTOR LinePoint1, + FXMVECTOR LinePoint2) noexcept; +void XM_CALLCONV XMPlaneIntersectPlane(_Out_ XMVECTOR* pLinePoint1, + _Out_ XMVECTOR* pLinePoint2, + _In_ FXMVECTOR P1, + _In_ FXMVECTOR P2) noexcept; + +// Transforms a plane given an inverse transpose matrix +XMVECTOR XM_CALLCONV XMPlaneTransform(FXMVECTOR P, FXMMATRIX ITM) noexcept; + +// Transforms an array of planes given an inverse transpose matrix +XMFLOAT4* XM_CALLCONV XMPlaneTransformStream( + _Out_writes_bytes_(sizeof(XMFLOAT4) + OutputStride * (PlaneCount - 1)) + XMFLOAT4* pOutputStream, + _In_ size_t OutputStride, + _In_reads_bytes_(sizeof(XMFLOAT4) + InputStride * (PlaneCount - 1)) + const XMFLOAT4* pInputStream, + _In_ size_t InputStride, _In_ size_t PlaneCount, + _In_ FXMMATRIX ITM) noexcept; + +XMVECTOR XM_CALLCONV XMPlaneFromPointNormal(FXMVECTOR Point, + FXMVECTOR Normal) noexcept; +XMVECTOR XM_CALLCONV XMPlaneFromPoints(FXMVECTOR Point1, FXMVECTOR Point2, + FXMVECTOR Point3) noexcept; + +/**************************************************************************** + * + * Color operations + * + ****************************************************************************/ + +bool XM_CALLCONV XMColorEqual(FXMVECTOR C1, FXMVECTOR C2) noexcept; +bool XM_CALLCONV XMColorNotEqual(FXMVECTOR C1, FXMVECTOR C2) noexcept; +bool XM_CALLCONV XMColorGreater(FXMVECTOR C1, FXMVECTOR C2) noexcept; +bool XM_CALLCONV XMColorGreaterOrEqual(FXMVECTOR C1, FXMVECTOR C2) noexcept; +bool XM_CALLCONV XMColorLess(FXMVECTOR C1, FXMVECTOR C2) noexcept; +bool XM_CALLCONV XMColorLessOrEqual(FXMVECTOR C1, FXMVECTOR C2) noexcept; + +bool XM_CALLCONV XMColorIsNaN(FXMVECTOR C) noexcept; +bool XM_CALLCONV XMColorIsInfinite(FXMVECTOR C) noexcept; + +XMVECTOR XM_CALLCONV XMColorNegative(FXMVECTOR C) noexcept; +XMVECTOR XM_CALLCONV XMColorModulate(FXMVECTOR C1, FXMVECTOR C2) noexcept; +XMVECTOR XM_CALLCONV XMColorAdjustSaturation(FXMVECTOR C, + float Saturation) noexcept; +XMVECTOR XM_CALLCONV XMColorAdjustContrast(FXMVECTOR C, + float Contrast) noexcept; + +XMVECTOR XM_CALLCONV XMColorRGBToHSL(FXMVECTOR rgb) noexcept; +XMVECTOR XM_CALLCONV XMColorHSLToRGB(FXMVECTOR hsl) noexcept; + +XMVECTOR XM_CALLCONV XMColorRGBToHSV(FXMVECTOR rgb) noexcept; +XMVECTOR XM_CALLCONV XMColorHSVToRGB(FXMVECTOR hsv) noexcept; + +XMVECTOR XM_CALLCONV XMColorRGBToYUV(FXMVECTOR rgb) noexcept; +XMVECTOR XM_CALLCONV XMColorYUVToRGB(FXMVECTOR yuv) noexcept; + +XMVECTOR XM_CALLCONV XMColorRGBToYUV_HD(FXMVECTOR rgb) noexcept; +XMVECTOR XM_CALLCONV XMColorYUVToRGB_HD(FXMVECTOR yuv) noexcept; + +XMVECTOR XM_CALLCONV XMColorRGBToYUV_UHD(FXMVECTOR rgb) noexcept; +XMVECTOR XM_CALLCONV XMColorYUVToRGB_UHD(FXMVECTOR yuv) noexcept; + +XMVECTOR XM_CALLCONV XMColorRGBToXYZ(FXMVECTOR rgb) noexcept; +XMVECTOR XM_CALLCONV XMColorXYZToRGB(FXMVECTOR xyz) noexcept; + +XMVECTOR XM_CALLCONV XMColorXYZToSRGB(FXMVECTOR xyz) noexcept; +XMVECTOR XM_CALLCONV XMColorSRGBToXYZ(FXMVECTOR srgb) noexcept; + +XMVECTOR XM_CALLCONV XMColorRGBToSRGB(FXMVECTOR rgb) noexcept; +XMVECTOR XM_CALLCONV XMColorSRGBToRGB(FXMVECTOR srgb) noexcept; + +/**************************************************************************** + * + * Miscellaneous operations + * + ****************************************************************************/ + +bool XMVerifyCPUSupport() noexcept; + +XMVECTOR XM_CALLCONV XMFresnelTerm(FXMVECTOR CosIncidentAngle, + FXMVECTOR RefractionIndex) noexcept; + +bool XMScalarNearEqual(float S1, float S2, float Epsilon) noexcept; +float XMScalarModAngle(float Value) noexcept; + +float XMScalarSin(float Value) noexcept; +float XMScalarSinEst(float Value) noexcept; + +float XMScalarCos(float Value) noexcept; +float XMScalarCosEst(float Value) noexcept; + +void XMScalarSinCos(_Out_ float* pSin, _Out_ float* pCos, float Value) noexcept; +void XMScalarSinCosEst(_Out_ float* pSin, _Out_ float* pCos, + float Value) noexcept; + +float XMScalarASin(float Value) noexcept; +float XMScalarASinEst(float Value) noexcept; + +float XMScalarACos(float Value) noexcept; +float XMScalarACosEst(float Value) noexcept; + +/**************************************************************************** + * + * Templates + * + ****************************************************************************/ + +#if defined(__XNAMATH_H__) && defined(XMMin) +#undef XMMin +#undef XMMax +#endif + +template +inline T XMMin(T a, T b) noexcept { + return (a < b) ? a : b; +} +template +inline T XMMax(T a, T b) noexcept { + return (a > b) ? a : b; +} + +//------------------------------------------------------------------------------ + +#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + +// PermuteHelper internal template (SSE only) +namespace MathInternal { +// Slow path fallback for permutes that do not map to a single SSE shuffle +// opcode. +template +struct PermuteHelper { + static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) noexcept { + static const XMVECTORU32 selectMask = {{{ + WhichX ? 0xFFFFFFFF : 0, + WhichY ? 0xFFFFFFFF : 0, + WhichZ ? 0xFFFFFFFF : 0, + WhichW ? 0xFFFFFFFF : 0, + }}}; + + XMVECTOR shuffled1 = XM_PERMUTE_PS(v1, Shuffle); + XMVECTOR shuffled2 = XM_PERMUTE_PS(v2, Shuffle); + + XMVECTOR masked1 = _mm_andnot_ps(selectMask, shuffled1); + XMVECTOR masked2 = _mm_and_ps(selectMask, shuffled2); + + return _mm_or_ps(masked1, masked2); + } +}; + +// Fast path for permutes that only read from the first vector. +template +struct PermuteHelper { + static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR) noexcept { + return XM_PERMUTE_PS(v1, Shuffle); + } +}; + +// Fast path for permutes that only read from the second vector. +template +struct PermuteHelper { + static XMVECTOR XM_CALLCONV Permute(FXMVECTOR, FXMVECTOR v2) noexcept { + return XM_PERMUTE_PS(v2, Shuffle); + } +}; + +// Fast path for permutes that read XY from the first vector, ZW from the +// second. +template +struct PermuteHelper { + static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) noexcept { + return _mm_shuffle_ps(v1, v2, Shuffle); + } +}; + +// Fast path for permutes that read XY from the second vector, ZW from the +// first. +template +struct PermuteHelper { + static XMVECTOR XM_CALLCONV Permute(FXMVECTOR v1, FXMVECTOR v2) noexcept { + return _mm_shuffle_ps(v2, v1, Shuffle); + } +}; +} // namespace MathInternal + +#endif // _XM_SSE_INTRINSICS_ && !_XM_NO_INTRINSICS_ + +// General permute template +template +inline XMVECTOR XM_CALLCONV XMVectorPermute(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + static_assert(PermuteX <= 7, "PermuteX template parameter out of range"); + static_assert(PermuteY <= 7, "PermuteY template parameter out of range"); + static_assert(PermuteZ <= 7, "PermuteZ template parameter out of range"); + static_assert(PermuteW <= 7, "PermuteW template parameter out of range"); + +#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + constexpr uint32_t Shuffle = + _MM_SHUFFLE(PermuteW & 3, PermuteZ & 3, PermuteY & 3, PermuteX & 3); + + constexpr bool WhichX = PermuteX > 3; + constexpr bool WhichY = PermuteY > 3; + constexpr bool WhichZ = PermuteZ > 3; + constexpr bool WhichW = PermuteW > 3; + + return MathInternal::PermuteHelper::Permute(V1, V2); +#else + + return XMVectorPermute(V1, V2, PermuteX, PermuteY, PermuteZ, PermuteW); + +#endif +} + +// Special-case permute templates +template <> +constexpr XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 2, 3>(FXMVECTOR V1, + FXMVECTOR) noexcept { + return V1; +} +template <> +constexpr XMVECTOR XM_CALLCONV +XMVectorPermute<4, 5, 6, 7>(FXMVECTOR, FXMVECTOR V2) noexcept { + return V2; +} + +#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 4, 5>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return _mm_movelh_ps(V1, V2); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<6, 7, 2, 3>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return _mm_movehl_ps(V1, V2); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 4, 1, 5>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return _mm_unpacklo_ps(V1, V2); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 6, 3, 7>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return _mm_unpackhi_ps(V1, V2); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 3, 6, 7>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return _mm_castpd_ps(_mm_unpackhi_pd(_mm_castps_pd(V1), _mm_castps_pd(V2))); +} +#endif + +#if defined(_XM_SSE4_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 2, 3>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return _mm_blend_ps(V1, V2, 0x1); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 2, 3>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return _mm_blend_ps(V1, V2, 0x2); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 2, 3>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return _mm_blend_ps(V1, V2, 0x3); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 6, 3>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return _mm_blend_ps(V1, V2, 0x4); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 6, 3>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return _mm_blend_ps(V1, V2, 0x5); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 6, 3>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return _mm_blend_ps(V1, V2, 0x6); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 6, 3>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return _mm_blend_ps(V1, V2, 0x7); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 2, 7>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return _mm_blend_ps(V1, V2, 0x8); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 2, 7>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return _mm_blend_ps(V1, V2, 0x9); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 2, 7>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return _mm_blend_ps(V1, V2, 0xA); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 5, 2, 7>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return _mm_blend_ps(V1, V2, 0xB); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 6, 7>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return _mm_blend_ps(V1, V2, 0xC); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<4, 1, 6, 7>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return _mm_blend_ps(V1, V2, 0xD); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 5, 6, 7>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return _mm_blend_ps(V1, V2, 0xE); +} +#endif + +#if defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + +// If the indices are all in the range 0-3 or 4-7, then use XMVectorSwizzle +// instead The mirror cases are not spelled out here as the programmer can +// always swap the arguments (i.e. prefer permutes where the X element comes +// from the V1 vector instead of the V2 vector) + +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 4, 5>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vcombine_f32(vget_low_f32(V1), vget_low_f32(V2)); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 0, 4, 5>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vcombine_f32(vrev64_f32(vget_low_f32(V1)), vget_low_f32(V2)); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 5, 4>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vcombine_f32(vget_low_f32(V1), vrev64_f32(vget_low_f32(V2))); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 0, 5, 4>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vcombine_f32(vrev64_f32(vget_low_f32(V1)), + vrev64_f32(vget_low_f32(V2))); +} + +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 3, 6, 7>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vcombine_f32(vget_high_f32(V1), vget_high_f32(V2)); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<3, 2, 6, 7>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vcombine_f32(vrev64_f32(vget_high_f32(V1)), vget_high_f32(V2)); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 3, 7, 6>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vcombine_f32(vget_high_f32(V1), vrev64_f32(vget_high_f32(V2))); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<3, 2, 7, 6>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vcombine_f32(vrev64_f32(vget_high_f32(V1)), + vrev64_f32(vget_high_f32(V2))); +} + +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 6, 7>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vcombine_f32(vget_low_f32(V1), vget_high_f32(V2)); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 0, 6, 7>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vcombine_f32(vrev64_f32(vget_low_f32(V1)), vget_high_f32(V2)); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 1, 7, 6>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vcombine_f32(vget_low_f32(V1), vrev64_f32(vget_high_f32(V2))); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 0, 7, 6>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vcombine_f32(vrev64_f32(vget_low_f32(V1)), + vrev64_f32(vget_high_f32(V2))); +} + +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<3, 2, 4, 5>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vcombine_f32(vrev64_f32(vget_high_f32(V1)), vget_low_f32(V2)); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 3, 5, 4>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vcombine_f32(vget_high_f32(V1), vrev64_f32(vget_low_f32(V2))); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<3, 2, 5, 4>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vcombine_f32(vrev64_f32(vget_high_f32(V1)), + vrev64_f32(vget_low_f32(V2))); +} + +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 4, 2, 6>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vtrnq_f32(V1, V2).val[0]; +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 5, 3, 7>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vtrnq_f32(V1, V2).val[1]; +} + +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 4, 1, 5>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vzipq_f32(V1, V2).val[0]; +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 6, 3, 7>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vzipq_f32(V1, V2).val[1]; +} + +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<0, 2, 4, 6>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vuzpq_f32(V1, V2).val[0]; +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 3, 5, 7>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vuzpq_f32(V1, V2).val[1]; +} + +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<1, 2, 3, 4>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vextq_f32(V1, V2, 1); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<2, 3, 4, 5>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vextq_f32(V1, V2, 2); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorPermute<3, 4, 5, 6>(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + return vextq_f32(V1, V2, 3); +} + +#endif // _XM_ARM_NEON_INTRINSICS_ && !_XM_NO_INTRINSICS_ + +//------------------------------------------------------------------------------ + +// General swizzle template +template +inline XMVECTOR XM_CALLCONV XMVectorSwizzle(FXMVECTOR V) noexcept { + static_assert(SwizzleX <= 3, "SwizzleX template parameter out of range"); + static_assert(SwizzleY <= 3, "SwizzleY template parameter out of range"); + static_assert(SwizzleZ <= 3, "SwizzleZ template parameter out of range"); + static_assert(SwizzleW <= 3, "SwizzleW template parameter out of range"); + +#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + return XM_PERMUTE_PS(V, + _MM_SHUFFLE(SwizzleW, SwizzleZ, SwizzleY, SwizzleX)); +#else + + return XMVectorSwizzle(V, SwizzleX, SwizzleY, SwizzleZ, SwizzleW); + +#endif +} + +// Specialized swizzles +template <> +constexpr XMVECTOR XM_CALLCONV +XMVectorSwizzle<0, 1, 2, 3>(FXMVECTOR V) noexcept { + return V; +} + +#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 1, 0, 1>(FXMVECTOR V) noexcept { + return _mm_movelh_ps(V, V); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 3, 2, 3>(FXMVECTOR V) noexcept { + return _mm_movehl_ps(V, V); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 1, 1>(FXMVECTOR V) noexcept { + return _mm_unpacklo_ps(V, V); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 2, 3, 3>(FXMVECTOR V) noexcept { + return _mm_unpackhi_ps(V, V); +} +#endif + +#if defined(_XM_SSE3_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 2, 2>(FXMVECTOR V) noexcept { + return _mm_moveldup_ps(V); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 1, 3, 3>(FXMVECTOR V) noexcept { + return _mm_movehdup_ps(V); +} +#endif + +#if defined(_XM_AVX2_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) && \ + defined(_XM_FAVOR_INTEL_) +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 0, 0>(FXMVECTOR V) noexcept { + return _mm_broadcastss_ps(V); +} +#endif + +#if defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 0, 0>(FXMVECTOR V) noexcept { + return vdupq_lane_f32(vget_low_f32(V), 0); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 1, 1, 1>(FXMVECTOR V) noexcept { + return vdupq_lane_f32(vget_low_f32(V), 1); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 2, 2, 2>(FXMVECTOR V) noexcept { + return vdupq_lane_f32(vget_high_f32(V), 0); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<3, 3, 3, 3>(FXMVECTOR V) noexcept { + return vdupq_lane_f32(vget_high_f32(V), 1); +} + +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 0, 3, 2>(FXMVECTOR V) noexcept { + return vrev64q_f32(V); +} + +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 1, 0, 1>(FXMVECTOR V) noexcept { + float32x2_t vt = vget_low_f32(V); + return vcombine_f32(vt, vt); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 3, 2, 3>(FXMVECTOR V) noexcept { + float32x2_t vt = vget_high_f32(V); + return vcombine_f32(vt, vt); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 0, 1, 0>(FXMVECTOR V) noexcept { + float32x2_t vt = vrev64_f32(vget_low_f32(V)); + return vcombine_f32(vt, vt); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<3, 2, 3, 2>(FXMVECTOR V) noexcept { + float32x2_t vt = vrev64_f32(vget_high_f32(V)); + return vcombine_f32(vt, vt); +} + +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 1, 3, 2>(FXMVECTOR V) noexcept { + return vcombine_f32(vget_low_f32(V), vrev64_f32(vget_high_f32(V))); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 0, 2, 3>(FXMVECTOR V) noexcept { + return vcombine_f32(vrev64_f32(vget_low_f32(V)), vget_high_f32(V)); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 3, 1, 0>(FXMVECTOR V) noexcept { + return vcombine_f32(vget_high_f32(V), vrev64_f32(vget_low_f32(V))); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<3, 2, 0, 1>(FXMVECTOR V) noexcept { + return vcombine_f32(vrev64_f32(vget_high_f32(V)), vget_low_f32(V)); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<3, 2, 1, 0>(FXMVECTOR V) noexcept { + return vcombine_f32(vrev64_f32(vget_high_f32(V)), + vrev64_f32(vget_low_f32(V))); +} + +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 2, 2>(FXMVECTOR V) noexcept { + return vtrnq_f32(V, V).val[0]; +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 1, 3, 3>(FXMVECTOR V) noexcept { + return vtrnq_f32(V, V).val[1]; +} + +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 0, 1, 1>(FXMVECTOR V) noexcept { + return vzipq_f32(V, V).val[0]; +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 2, 3, 3>(FXMVECTOR V) noexcept { + return vzipq_f32(V, V).val[1]; +} + +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<0, 2, 0, 2>(FXMVECTOR V) noexcept { + return vuzpq_f32(V, V).val[0]; +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 3, 1, 3>(FXMVECTOR V) noexcept { + return vuzpq_f32(V, V).val[1]; +} + +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<1, 2, 3, 0>(FXMVECTOR V) noexcept { + return vextq_f32(V, V, 1); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<2, 3, 0, 1>(FXMVECTOR V) noexcept { + return vextq_f32(V, V, 2); +} +template <> +inline XMVECTOR XM_CALLCONV XMVectorSwizzle<3, 0, 1, 2>(FXMVECTOR V) noexcept { + return vextq_f32(V, V, 3); +} + +#endif // _XM_ARM_NEON_INTRINSICS_ && !_XM_NO_INTRINSICS_ + +//------------------------------------------------------------------------------ + +template +inline XMVECTOR XM_CALLCONV XMVectorShiftLeft(FXMVECTOR V1, + FXMVECTOR V2) noexcept { + static_assert(Elements < 4, "Elements template parameter out of range"); + return XMVectorPermute(V1, V2); +} + +template +inline XMVECTOR XM_CALLCONV XMVectorRotateLeft(FXMVECTOR V) noexcept { + static_assert(Elements < 4, "Elements template parameter out of range"); + return XMVectorSwizzle(V); +} + +template +inline XMVECTOR XM_CALLCONV XMVectorRotateRight(FXMVECTOR V) noexcept { + static_assert(Elements < 4, "Elements template parameter out of range"); + return XMVectorSwizzle<(4 - Elements) & 3, (5 - Elements) & 3, + (6 - Elements) & 3, (7 - Elements) & 3>(V); +} + +template +inline XMVECTOR XM_CALLCONV XMVectorInsert(FXMVECTOR VD, + FXMVECTOR VS) noexcept { + XMVECTOR Control = XMVectorSelectControl(Select0 & 1, Select1 & 1, + Select2 & 1, Select3 & 1); + return XMVectorSelect(VD, XMVectorRotateLeft(VS), + Control); +} + +/**************************************************************************** + * + * Globals + * + ****************************************************************************/ + +// The purpose of the following global constants is to prevent redundant +// reloading of the constants when they are referenced by more than one +// separate inline math routine called within the same function. Declaring +// a constant locally within a routine is sufficient to prevent redundant +// reloads of that constant when that single routine is called multiple +// times in a function, but if the constant is used (and declared) in a +// separate math routine it would be reloaded. + +#ifndef XMGLOBALCONST +#if defined(__GNUC__) && !defined(__MINGW32__) +#define XMGLOBALCONST extern const __attribute__((weak)) +#else +#define XMGLOBALCONST extern const __declspec(selectany) +#endif +#endif + +XMGLOBALCONST XMVECTORF32 g_XMSinCoefficients0 = { + {{-0.16666667f, +0.0083333310f, -0.00019840874f, +2.7525562e-06f}}}; +XMGLOBALCONST XMVECTORF32 g_XMSinCoefficients1 = { + {{-2.3889859e-08f, -0.16665852f /*Est1*/, +0.0083139502f /*Est2*/, + -0.00018524670f /*Est3*/}}}; +XMGLOBALCONST XMVECTORF32 g_XMCosCoefficients0 = { + {{-0.5f, +0.041666638f, -0.0013888378f, +2.4760495e-05f}}}; +XMGLOBALCONST XMVECTORF32 g_XMCosCoefficients1 = { + {{-2.6051615e-07f, -0.49992746f /*Est1*/, +0.041493919f /*Est2*/, + -0.0012712436f /*Est3*/}}}; +XMGLOBALCONST XMVECTORF32 g_XMTanCoefficients0 = { + {{1.0f, 0.333333333f, 0.133333333f, 5.396825397e-2f}}}; +XMGLOBALCONST XMVECTORF32 g_XMTanCoefficients1 = { + {{2.186948854e-2f, 8.863235530e-3f, 3.592128167e-3f, 1.455834485e-3f}}}; +XMGLOBALCONST XMVECTORF32 g_XMTanCoefficients2 = { + {{5.900274264e-4f, 2.391290764e-4f, 9.691537707e-5f, 3.927832950e-5f}}}; +XMGLOBALCONST XMVECTORF32 g_XMArcCoefficients0 = { + {{+1.5707963050f, -0.2145988016f, +0.0889789874f, -0.0501743046f}}}; +XMGLOBALCONST XMVECTORF32 g_XMArcCoefficients1 = { + {{+0.0308918810f, -0.0170881256f, +0.0066700901f, -0.0012624911f}}}; +XMGLOBALCONST XMVECTORF32 g_XMATanCoefficients0 = { + {{-0.3333314528f, +0.1999355085f, -0.1420889944f, +0.1065626393f}}}; +XMGLOBALCONST XMVECTORF32 g_XMATanCoefficients1 = { + {{-0.0752896400f, +0.0429096138f, -0.0161657367f, +0.0028662257f}}}; +XMGLOBALCONST XMVECTORF32 g_XMATanEstCoefficients0 = { + {{+0.999866f, +0.999866f, +0.999866f, +0.999866f}}}; +XMGLOBALCONST XMVECTORF32 g_XMATanEstCoefficients1 = { + {{-0.3302995f, +0.180141f, -0.085133f, +0.0208351f}}}; +XMGLOBALCONST XMVECTORF32 g_XMTanEstCoefficients = { + {{2.484f, -1.954923183e-1f, 2.467401101f, XM_1DIVPI}}}; +XMGLOBALCONST XMVECTORF32 g_XMArcEstCoefficients = { + {{+1.5707288f, -0.2121144f, +0.0742610f, -0.0187293f}}}; +XMGLOBALCONST XMVECTORF32 g_XMPiConstants0 = { + {{XM_PI, XM_2PI, XM_1DIVPI, XM_1DIV2PI}}}; +XMGLOBALCONST XMVECTORF32 g_XMIdentityR0 = {{{1.0f, 0.0f, 0.0f, 0.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMIdentityR1 = {{{0.0f, 1.0f, 0.0f, 0.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMIdentityR2 = {{{0.0f, 0.0f, 1.0f, 0.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMIdentityR3 = {{{0.0f, 0.0f, 0.0f, 1.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMNegIdentityR0 = {{{-1.0f, 0.0f, 0.0f, 0.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMNegIdentityR1 = {{{0.0f, -1.0f, 0.0f, 0.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMNegIdentityR2 = {{{0.0f, 0.0f, -1.0f, 0.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMNegIdentityR3 = {{{0.0f, 0.0f, 0.0f, -1.0f}}}; +XMGLOBALCONST XMVECTORU32 g_XMNegativeZero = { + {{0x80000000, 0x80000000, 0x80000000, 0x80000000}}}; +XMGLOBALCONST XMVECTORU32 g_XMNegate3 = { + {{0x80000000, 0x80000000, 0x80000000, 0x00000000}}}; +XMGLOBALCONST XMVECTORU32 g_XMMaskXY = { + {{0xFFFFFFFF, 0xFFFFFFFF, 0x00000000, 0x00000000}}}; +XMGLOBALCONST XMVECTORU32 g_XMMask3 = { + {{0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000}}}; +XMGLOBALCONST XMVECTORU32 g_XMMaskX = { + {{0xFFFFFFFF, 0x00000000, 0x00000000, 0x00000000}}}; +XMGLOBALCONST XMVECTORU32 g_XMMaskY = { + {{0x00000000, 0xFFFFFFFF, 0x00000000, 0x00000000}}}; +XMGLOBALCONST XMVECTORU32 g_XMMaskZ = { + {{0x00000000, 0x00000000, 0xFFFFFFFF, 0x00000000}}}; +XMGLOBALCONST XMVECTORU32 g_XMMaskW = { + {{0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF}}}; +XMGLOBALCONST XMVECTORF32 g_XMOne = {{{1.0f, 1.0f, 1.0f, 1.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMOne3 = {{{1.0f, 1.0f, 1.0f, 0.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMZero = {{{0.0f, 0.0f, 0.0f, 0.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMTwo = {{{2.f, 2.f, 2.f, 2.f}}}; +XMGLOBALCONST XMVECTORF32 g_XMFour = {{{4.f, 4.f, 4.f, 4.f}}}; +XMGLOBALCONST XMVECTORF32 g_XMSix = {{{6.f, 6.f, 6.f, 6.f}}}; +XMGLOBALCONST XMVECTORF32 g_XMNegativeOne = {{{-1.0f, -1.0f, -1.0f, -1.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMOneHalf = {{{0.5f, 0.5f, 0.5f, 0.5f}}}; +XMGLOBALCONST XMVECTORF32 g_XMNegativeOneHalf = { + {{-0.5f, -0.5f, -0.5f, -0.5f}}}; +XMGLOBALCONST XMVECTORF32 g_XMNegativeTwoPi = { + {{-XM_2PI, -XM_2PI, -XM_2PI, -XM_2PI}}}; +XMGLOBALCONST XMVECTORF32 g_XMNegativePi = {{{-XM_PI, -XM_PI, -XM_PI, -XM_PI}}}; +XMGLOBALCONST XMVECTORF32 g_XMHalfPi = { + {{XM_PIDIV2, XM_PIDIV2, XM_PIDIV2, XM_PIDIV2}}}; +XMGLOBALCONST XMVECTORF32 g_XMPi = {{{XM_PI, XM_PI, XM_PI, XM_PI}}}; +XMGLOBALCONST XMVECTORF32 g_XMReciprocalPi = { + {{XM_1DIVPI, XM_1DIVPI, XM_1DIVPI, XM_1DIVPI}}}; +XMGLOBALCONST XMVECTORF32 g_XMTwoPi = {{{XM_2PI, XM_2PI, XM_2PI, XM_2PI}}}; +XMGLOBALCONST XMVECTORF32 g_XMReciprocalTwoPi = { + {{XM_1DIV2PI, XM_1DIV2PI, XM_1DIV2PI, XM_1DIV2PI}}}; +XMGLOBALCONST XMVECTORF32 g_XMEpsilon = { + {{1.192092896e-7f, 1.192092896e-7f, 1.192092896e-7f, 1.192092896e-7f}}}; +XMGLOBALCONST XMVECTORI32 g_XMInfinity = { + {{0x7F800000, 0x7F800000, 0x7F800000, 0x7F800000}}}; +XMGLOBALCONST XMVECTORI32 g_XMQNaN = { + {{0x7FC00000, 0x7FC00000, 0x7FC00000, 0x7FC00000}}}; +XMGLOBALCONST XMVECTORI32 g_XMQNaNTest = { + {{0x007FFFFF, 0x007FFFFF, 0x007FFFFF, 0x007FFFFF}}}; +XMGLOBALCONST XMVECTORI32 g_XMAbsMask = { + {{0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF}}}; +XMGLOBALCONST XMVECTORI32 g_XMFltMin = { + {{0x00800000, 0x00800000, 0x00800000, 0x00800000}}}; +XMGLOBALCONST XMVECTORI32 g_XMFltMax = { + {{0x7F7FFFFF, 0x7F7FFFFF, 0x7F7FFFFF, 0x7F7FFFFF}}}; +XMGLOBALCONST XMVECTORU32 g_XMNegOneMask = { + {{0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF}}}; +XMGLOBALCONST XMVECTORU32 g_XMMaskA8R8G8B8 = { + {{0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000}}}; +XMGLOBALCONST XMVECTORU32 g_XMFlipA8R8G8B8 = { + {{0x00000000, 0x00000000, 0x00000000, 0x80000000}}}; +XMGLOBALCONST XMVECTORF32 g_XMFixAA8R8G8B8 = { + {{0.0f, 0.0f, 0.0f, float(0x80000000U)}}}; +XMGLOBALCONST XMVECTORF32 g_XMNormalizeA8R8G8B8 = { + {{1.0f / (255.0f * float(0x10000)), 1.0f / (255.0f * float(0x100)), + 1.0f / 255.0f, 1.0f / (255.0f * float(0x1000000))}}}; +XMGLOBALCONST XMVECTORU32 g_XMMaskA2B10G10R10 = { + {{0x000003FF, 0x000FFC00, 0x3FF00000, 0xC0000000}}}; +XMGLOBALCONST XMVECTORU32 g_XMFlipA2B10G10R10 = { + {{0x00000200, 0x00080000, 0x20000000, 0x80000000}}}; +XMGLOBALCONST XMVECTORF32 g_XMFixAA2B10G10R10 = { + {{-512.0f, -512.0f * float(0x400), -512.0f * float(0x100000), + float(0x80000000U)}}}; +XMGLOBALCONST XMVECTORF32 g_XMNormalizeA2B10G10R10 = { + {{1.0f / 511.0f, 1.0f / (511.0f * float(0x400)), + 1.0f / (511.0f * float(0x100000)), 1.0f / (3.0f * float(0x40000000))}}}; +XMGLOBALCONST XMVECTORU32 g_XMMaskX16Y16 = { + {{0x0000FFFF, 0xFFFF0000, 0x00000000, 0x00000000}}}; +XMGLOBALCONST XMVECTORI32 g_XMFlipX16Y16 = { + {{0x00008000, 0x00000000, 0x00000000, 0x00000000}}}; +XMGLOBALCONST XMVECTORF32 g_XMFixX16Y16 = {{{-32768.0f, 0.0f, 0.0f, 0.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMNormalizeX16Y16 = { + {{1.0f / 32767.0f, 1.0f / (32767.0f * 65536.0f), 0.0f, 0.0f}}}; +XMGLOBALCONST XMVECTORU32 g_XMMaskX16Y16Z16W16 = { + {{0x0000FFFF, 0x0000FFFF, 0xFFFF0000, 0xFFFF0000}}}; +XMGLOBALCONST XMVECTORI32 g_XMFlipX16Y16Z16W16 = { + {{0x00008000, 0x00008000, 0x00000000, 0x00000000}}}; +XMGLOBALCONST XMVECTORF32 g_XMFixX16Y16Z16W16 = { + {{-32768.0f, -32768.0f, 0.0f, 0.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMNormalizeX16Y16Z16W16 = { + {{1.0f / 32767.0f, 1.0f / 32767.0f, 1.0f / (32767.0f * 65536.0f), + 1.0f / (32767.0f * 65536.0f)}}}; +XMGLOBALCONST XMVECTORF32 g_XMNoFraction = { + {{8388608.0f, 8388608.0f, 8388608.0f, 8388608.0f}}}; +XMGLOBALCONST XMVECTORI32 g_XMMaskByte = { + {{0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF}}}; +XMGLOBALCONST XMVECTORF32 g_XMNegateX = {{{-1.0f, 1.0f, 1.0f, 1.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMNegateY = {{{1.0f, -1.0f, 1.0f, 1.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMNegateZ = {{{1.0f, 1.0f, -1.0f, 1.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMNegateW = {{{1.0f, 1.0f, 1.0f, -1.0f}}}; +XMGLOBALCONST XMVECTORU32 g_XMSelect0101 = { + {{XM_SELECT_0, XM_SELECT_1, XM_SELECT_0, XM_SELECT_1}}}; +XMGLOBALCONST XMVECTORU32 g_XMSelect1010 = { + {{XM_SELECT_1, XM_SELECT_0, XM_SELECT_1, XM_SELECT_0}}}; +XMGLOBALCONST XMVECTORI32 g_XMOneHalfMinusEpsilon = { + {{0x3EFFFFFD, 0x3EFFFFFD, 0x3EFFFFFD, 0x3EFFFFFD}}}; +XMGLOBALCONST XMVECTORU32 g_XMSelect1000 = { + {{XM_SELECT_1, XM_SELECT_0, XM_SELECT_0, XM_SELECT_0}}}; +XMGLOBALCONST XMVECTORU32 g_XMSelect1100 = { + {{XM_SELECT_1, XM_SELECT_1, XM_SELECT_0, XM_SELECT_0}}}; +XMGLOBALCONST XMVECTORU32 g_XMSelect1110 = { + {{XM_SELECT_1, XM_SELECT_1, XM_SELECT_1, XM_SELECT_0}}}; +XMGLOBALCONST XMVECTORU32 g_XMSelect1011 = { + {{XM_SELECT_1, XM_SELECT_0, XM_SELECT_1, XM_SELECT_1}}}; +XMGLOBALCONST XMVECTORF32 g_XMFixupY16 = { + {{1.0f, 1.0f / 65536.0f, 0.0f, 0.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMFixupY16W16 = { + {{1.0f, 1.0f, 1.0f / 65536.0f, 1.0f / 65536.0f}}}; +XMGLOBALCONST XMVECTORU32 g_XMFlipY = {{{0, 0x80000000, 0, 0}}}; +XMGLOBALCONST XMVECTORU32 g_XMFlipZ = {{{0, 0, 0x80000000, 0}}}; +XMGLOBALCONST XMVECTORU32 g_XMFlipW = {{{0, 0, 0, 0x80000000}}}; +XMGLOBALCONST XMVECTORU32 g_XMFlipYZ = {{{0, 0x80000000, 0x80000000, 0}}}; +XMGLOBALCONST XMVECTORU32 g_XMFlipZW = {{{0, 0, 0x80000000, 0x80000000}}}; +XMGLOBALCONST XMVECTORU32 g_XMFlipYW = {{{0, 0x80000000, 0, 0x80000000}}}; +XMGLOBALCONST XMVECTORI32 g_XMMaskDec4 = { + {{0x3FF, 0x3FF << 10, 0x3FF << 20, static_cast(0xC0000000)}}}; +XMGLOBALCONST XMVECTORI32 g_XMXorDec4 = { + {{0x200, 0x200 << 10, 0x200 << 20, 0}}}; +XMGLOBALCONST XMVECTORF32 g_XMAddUDec4 = {{{0, 0, 0, 32768.0f * 65536.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMAddDec4 = { + {{-512.0f, -512.0f * 1024.0f, -512.0f * 1024.0f * 1024.0f, 0}}}; +XMGLOBALCONST XMVECTORF32 g_XMMulDec4 = { + {{1.0f, 1.0f / 1024.0f, 1.0f / (1024.0f * 1024.0f), + 1.0f / (1024.0f * 1024.0f * 1024.0f)}}}; +XMGLOBALCONST XMVECTORU32 g_XMMaskByte4 = { + {{0xFF, 0xFF00, 0xFF0000, 0xFF000000}}}; +XMGLOBALCONST XMVECTORI32 g_XMXorByte4 = { + {{0x80, 0x8000, 0x800000, 0x00000000}}}; +XMGLOBALCONST XMVECTORF32 g_XMAddByte4 = { + {{-128.0f, -128.0f * 256.0f, -128.0f * 65536.0f, 0}}}; +XMGLOBALCONST XMVECTORF32 g_XMFixUnsigned = { + {{32768.0f * 65536.0f, 32768.0f * 65536.0f, 32768.0f * 65536.0f, + 32768.0f * 65536.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMMaxInt = { + {{65536.0f * 32768.0f - 128.0f, 65536.0f * 32768.0f - 128.0f, + 65536.0f * 32768.0f - 128.0f, 65536.0f * 32768.0f - 128.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMMaxUInt = { + {{65536.0f * 65536.0f - 256.0f, 65536.0f * 65536.0f - 256.0f, + 65536.0f * 65536.0f - 256.0f, 65536.0f * 65536.0f - 256.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMUnsignedFix = { + {{32768.0f * 65536.0f, 32768.0f * 65536.0f, 32768.0f * 65536.0f, + 32768.0f * 65536.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMsrgbScale = {{{12.92f, 12.92f, 12.92f, 1.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMsrgbA = {{{0.055f, 0.055f, 0.055f, 0.0f}}}; +XMGLOBALCONST XMVECTORF32 g_XMsrgbA1 = {{{1.055f, 1.055f, 1.055f, 1.0f}}}; +XMGLOBALCONST XMVECTORI32 g_XMExponentBias = {{{127, 127, 127, 127}}}; +XMGLOBALCONST XMVECTORI32 g_XMSubnormalExponent = {{{-126, -126, -126, -126}}}; +XMGLOBALCONST XMVECTORI32 g_XMNumTrailing = {{{23, 23, 23, 23}}}; +XMGLOBALCONST XMVECTORI32 g_XMMinNormal = { + {{0x00800000, 0x00800000, 0x00800000, 0x00800000}}}; +XMGLOBALCONST XMVECTORU32 g_XMNegInfinity = { + {{0xFF800000, 0xFF800000, 0xFF800000, 0xFF800000}}}; +XMGLOBALCONST XMVECTORU32 g_XMNegQNaN = { + {{0xFFC00000, 0xFFC00000, 0xFFC00000, 0xFFC00000}}}; +XMGLOBALCONST XMVECTORI32 g_XMBin128 = { + {{0x43000000, 0x43000000, 0x43000000, 0x43000000}}}; +XMGLOBALCONST XMVECTORU32 g_XMBinNeg150 = { + {{0xC3160000, 0xC3160000, 0xC3160000, 0xC3160000}}}; +XMGLOBALCONST XMVECTORI32 g_XM253 = {{{253, 253, 253, 253}}}; +XMGLOBALCONST XMVECTORF32 g_XMExpEst1 = { + {{-6.93147182e-1f, -6.93147182e-1f, -6.93147182e-1f, -6.93147182e-1f}}}; +XMGLOBALCONST XMVECTORF32 g_XMExpEst2 = { + {{+2.40226462e-1f, +2.40226462e-1f, +2.40226462e-1f, +2.40226462e-1f}}}; +XMGLOBALCONST XMVECTORF32 g_XMExpEst3 = { + {{-5.55036440e-2f, -5.55036440e-2f, -5.55036440e-2f, -5.55036440e-2f}}}; +XMGLOBALCONST XMVECTORF32 g_XMExpEst4 = { + {{+9.61597636e-3f, +9.61597636e-3f, +9.61597636e-3f, +9.61597636e-3f}}}; +XMGLOBALCONST XMVECTORF32 g_XMExpEst5 = { + {{-1.32823968e-3f, -1.32823968e-3f, -1.32823968e-3f, -1.32823968e-3f}}}; +XMGLOBALCONST XMVECTORF32 g_XMExpEst6 = { + {{+1.47491097e-4f, +1.47491097e-4f, +1.47491097e-4f, +1.47491097e-4f}}}; +XMGLOBALCONST XMVECTORF32 g_XMExpEst7 = { + {{-1.08635004e-5f, -1.08635004e-5f, -1.08635004e-5f, -1.08635004e-5f}}}; +XMGLOBALCONST XMVECTORF32 g_XMLogEst0 = { + {{+1.442693f, +1.442693f, +1.442693f, +1.442693f}}}; +XMGLOBALCONST XMVECTORF32 g_XMLogEst1 = { + {{-0.721242f, -0.721242f, -0.721242f, -0.721242f}}}; +XMGLOBALCONST XMVECTORF32 g_XMLogEst2 = { + {{+0.479384f, +0.479384f, +0.479384f, +0.479384f}}}; +XMGLOBALCONST XMVECTORF32 g_XMLogEst3 = { + {{-0.350295f, -0.350295f, -0.350295f, -0.350295f}}}; +XMGLOBALCONST XMVECTORF32 g_XMLogEst4 = { + {{+0.248590f, +0.248590f, +0.248590f, +0.248590f}}}; +XMGLOBALCONST XMVECTORF32 g_XMLogEst5 = { + {{-0.145700f, -0.145700f, -0.145700f, -0.145700f}}}; +XMGLOBALCONST XMVECTORF32 g_XMLogEst6 = { + {{+0.057148f, +0.057148f, +0.057148f, +0.057148f}}}; +XMGLOBALCONST XMVECTORF32 g_XMLogEst7 = { + {{-0.010578f, -0.010578f, -0.010578f, -0.010578f}}}; +XMGLOBALCONST XMVECTORF32 g_XMLgE = { + {{+1.442695f, +1.442695f, +1.442695f, +1.442695f}}}; +XMGLOBALCONST XMVECTORF32 g_XMInvLgE = { + {{+6.93147182e-1f, +6.93147182e-1f, +6.93147182e-1f, +6.93147182e-1f}}}; +XMGLOBALCONST XMVECTORF32 g_XMLg10 = { + {{+3.321928f, +3.321928f, +3.321928f, +3.321928f}}}; +XMGLOBALCONST XMVECTORF32 g_XMInvLg10 = { + {{+3.010299956e-1f, +3.010299956e-1f, +3.010299956e-1f, +3.010299956e-1f}}}; +XMGLOBALCONST XMVECTORF32 g_UByteMax = {{{255.0f, 255.0f, 255.0f, 255.0f}}}; +XMGLOBALCONST XMVECTORF32 g_ByteMin = {{{-127.0f, -127.0f, -127.0f, -127.0f}}}; +XMGLOBALCONST XMVECTORF32 g_ByteMax = {{{127.0f, 127.0f, 127.0f, 127.0f}}}; +XMGLOBALCONST XMVECTORF32 g_ShortMin = { + {{-32767.0f, -32767.0f, -32767.0f, -32767.0f}}}; +XMGLOBALCONST XMVECTORF32 g_ShortMax = { + {{32767.0f, 32767.0f, 32767.0f, 32767.0f}}}; +XMGLOBALCONST XMVECTORF32 g_UShortMax = { + {{65535.0f, 65535.0f, 65535.0f, 65535.0f}}}; + +/**************************************************************************** + * + * Implementation + * + ****************************************************************************/ + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4068 4214 4204 4365 4616 4640 6001 6101) +// C4068/4616: ignore unknown pragmas +// C4214/4204: nonstandard extension used +// C4365/4640: Off by default noise +// C6001/6101: False positives +#endif + +#ifdef _PREFAST_ +#pragma prefast(push) +#pragma prefast(disable : 25000, "FXMVECTOR is 16 bytes") +#pragma prefast(disable : 26495, "Union initialization confuses /analyze") +#endif + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wfloat-equal" +#pragma clang diagnostic ignored "-Wundefined-reinterpret-cast" +#pragma clang diagnostic ignored "-Wunknown-warning-option" +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" +#endif + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorSetBinaryConstant(uint32_t C0, uint32_t C1, + uint32_t C2, + uint32_t C3) noexcept { +#if defined(_XM_NO_INTRINSICS_) + XMVECTORU32 vResult; + vResult.u[0] = (0 - (C0 & 1)) & 0x3F800000; + vResult.u[1] = (0 - (C1 & 1)) & 0x3F800000; + vResult.u[2] = (0 - (C2 & 1)) & 0x3F800000; + vResult.u[3] = (0 - (C3 & 1)) & 0x3F800000; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + XMVECTORU32 vResult; + vResult.u[0] = (0 - (C0 & 1)) & 0x3F800000; + vResult.u[1] = (0 - (C1 & 1)) & 0x3F800000; + vResult.u[2] = (0 - (C2 & 1)) & 0x3F800000; + vResult.u[3] = (0 - (C3 & 1)) & 0x3F800000; + return vResult.v; +#else // XM_SSE_INTRINSICS_ + static const XMVECTORU32 g_vMask1 = {{{1, 1, 1, 1}}}; + // Move the parms to a vector + __m128i vTemp = _mm_set_epi32(static_cast(C3), static_cast(C2), + static_cast(C1), static_cast(C0)); + // Mask off the low bits + vTemp = _mm_and_si128(vTemp, g_vMask1); + // 0xFFFFFFFF on true bits + vTemp = _mm_cmpeq_epi32(vTemp, g_vMask1); + // 0xFFFFFFFF -> 1.0f, 0x00000000 -> 0.0f + vTemp = _mm_and_si128(vTemp, g_XMOne); + return _mm_castsi128_ps(vTemp); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV +XMVectorSplatConstant(int32_t IntConstant, uint32_t DivExponent) noexcept { + assert(IntConstant >= -16 && IntConstant <= 15); + assert(DivExponent < 32); +#if defined(_XM_NO_INTRINSICS_) + + using DirectX::XMConvertVectorIntToFloat; + + XMVECTORI32 V = {{{IntConstant, IntConstant, IntConstant, IntConstant}}}; + return XMConvertVectorIntToFloat(V.v, DivExponent); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Splat the int + int32x4_t vScale = vdupq_n_s32(IntConstant); + // Convert to a float + XMVECTOR vResult = vcvtq_f32_s32(vScale); + // Convert DivExponent into 1.0f/(1<(&vScale)[0]); + return vResult; +#else // XM_SSE_INTRINSICS_ + // Splat the int + __m128i vScale = _mm_set1_epi32(IntConstant); + // Convert to a float + XMVECTOR vResult = _mm_cvtepi32_ps(vScale); + // Convert DivExponent into 1.0f/(1<(uScale)); + // Multiply by the reciprocal (Perform a right shift by DivExponent) + vResult = _mm_mul_ps(vResult, _mm_castsi128_ps(vScale)); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV +XMVectorSplatConstantInt(int32_t IntConstant) noexcept { + assert(IntConstant >= -16 && IntConstant <= 15); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORI32 V = {{{IntConstant, IntConstant, IntConstant, IntConstant}}}; + return V.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + int32x4_t V = vdupq_n_s32(IntConstant); + return reinterpret_cast(&V)[0]; +#else // XM_SSE_INTRINSICS_ + __m128i V = _mm_set1_epi32(IntConstant); + return _mm_castsi128_ps(V); +#endif +} + +#include "DirectXMathConvert.inl" +#include "DirectXMathVector.inl" +#include "DirectXMathMatrix.inl" +#include "DirectXMathMisc.inl" + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +#ifdef _PREFAST_ +#pragma prefast(pop) +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +} // namespace DirectX diff --git a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXMathConvert.inl b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXMathConvert.inl similarity index 97% rename from Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXMathConvert.inl rename to Minecraft.Client/Linux/Stubs/DirectXMath/DirectXMathConvert.inl index 782d29595..aaf9ef119 100644 --- a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXMathConvert.inl +++ b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXMathConvert.inl @@ -1,2201 +1,2201 @@ -//------------------------------------------------------------------------------------- -// DirectXMathConvert.inl -- SIMD C++ Math library -// -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. -// -// http://go.microsoft.com/fwlink/?LinkID=615560 -//------------------------------------------------------------------------------------- - -#pragma once - -/**************************************************************************** - * - * Data conversion - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable:4701) -// C4701: false positives -#endif - -inline XMVECTOR XM_CALLCONV XMConvertVectorIntToFloat -( - FXMVECTOR VInt, - uint32_t DivExponent -) noexcept -{ - assert(DivExponent < 32); -#if defined(_XM_NO_INTRINSICS_) - float fScale = 1.0f / static_cast(1U << DivExponent); - uint32_t ElementIndex = 0; - XMVECTOR Result; - do - { - auto iTemp = static_cast(VInt.vector4_u32[ElementIndex]); - Result.vector4_f32[ElementIndex] = static_cast(iTemp)* fScale; - } - while (++ElementIndex < 4); - return Result; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float fScale = 1.0f / static_cast(1U << DivExponent); - float32x4_t vResult = vcvtq_f32_s32(vreinterpretq_s32_f32(VInt)); - return vmulq_n_f32(vResult, fScale); -#else // _XM_SSE_INTRINSICS_ - // Convert to floats - XMVECTOR vResult = _mm_cvtepi32_ps(_mm_castps_si128(VInt)); - // Convert DivExponent into 1.0f/(1<(uScale)); - vResult = _mm_mul_ps(vResult, _mm_castsi128_ps(vScale)); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMConvertVectorFloatToInt -( - FXMVECTOR VFloat, - uint32_t MulExponent -) noexcept -{ - assert(MulExponent < 32); -#if defined(_XM_NO_INTRINSICS_) - // Get the scalar factor. - auto fScale = static_cast(1U << MulExponent); - uint32_t ElementIndex = 0; - XMVECTOR Result; - do - { - int32_t iResult; - float fTemp = VFloat.vector4_f32[ElementIndex] * fScale; - if (fTemp <= -(65536.0f * 32768.0f)) - { - iResult = (-0x7FFFFFFF) - 1; - } - else if (fTemp > (65536.0f * 32768.0f) - 128.0f) - { - iResult = 0x7FFFFFFF; - } - else - { - iResult = static_cast(fTemp); - } - Result.vector4_u32[ElementIndex] = static_cast(iResult); - } - while (++ElementIndex < 4); - return Result; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t vResult = vmulq_n_f32(VFloat, static_cast(1U << MulExponent)); - // In case of positive overflow, detect it - uint32x4_t vOverflow = vcgtq_f32(vResult, g_XMMaxInt); - // Float to int conversion - int32x4_t vResulti = vcvtq_s32_f32(vResult); - // If there was positive overflow, set to 0x7FFFFFFF - vResult = vreinterpretq_f32_u32(vandq_u32(vOverflow, g_XMAbsMask)); - vOverflow = vbicq_u32(vreinterpretq_u32_s32(vResulti), vOverflow); - vOverflow = vorrq_u32(vOverflow, vreinterpretq_u32_f32(vResult)); - return vreinterpretq_f32_u32(vOverflow); -#else // _XM_SSE_INTRINSICS_ - XMVECTOR vResult = _mm_set_ps1(static_cast(1U << MulExponent)); - vResult = _mm_mul_ps(vResult, VFloat); - // In case of positive overflow, detect it - XMVECTOR vOverflow = _mm_cmpgt_ps(vResult, g_XMMaxInt); - // Float to int conversion - __m128i vResulti = _mm_cvttps_epi32(vResult); - // If there was positive overflow, set to 0x7FFFFFFF - vResult = _mm_and_ps(vOverflow, g_XMAbsMask); - vOverflow = _mm_andnot_ps(vOverflow, _mm_castsi128_ps(vResulti)); - vOverflow = _mm_or_ps(vOverflow, vResult); - return vOverflow; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMConvertVectorUIntToFloat -( - FXMVECTOR VUInt, - uint32_t DivExponent -) noexcept -{ - assert(DivExponent < 32); -#if defined(_XM_NO_INTRINSICS_) - float fScale = 1.0f / static_cast(1U << DivExponent); - uint32_t ElementIndex = 0; - XMVECTOR Result; - do - { - Result.vector4_f32[ElementIndex] = static_cast(VUInt.vector4_u32[ElementIndex])* fScale; - } - while (++ElementIndex < 4); - return Result; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float fScale = 1.0f / static_cast(1U << DivExponent); - float32x4_t vResult = vcvtq_f32_u32(vreinterpretq_u32_f32(VUInt)); - return vmulq_n_f32(vResult, fScale); -#else // _XM_SSE_INTRINSICS_ - // For the values that are higher than 0x7FFFFFFF, a fixup is needed - // Determine which ones need the fix. - XMVECTOR vMask = _mm_and_ps(VUInt, g_XMNegativeZero); - // Force all values positive - XMVECTOR vResult = _mm_xor_ps(VUInt, vMask); - // Convert to floats - vResult = _mm_cvtepi32_ps(_mm_castps_si128(vResult)); - // Convert 0x80000000 -> 0xFFFFFFFF - __m128i iMask = _mm_srai_epi32(_mm_castps_si128(vMask), 31); - // For only the ones that are too big, add the fixup - vMask = _mm_and_ps(_mm_castsi128_ps(iMask), g_XMFixUnsigned); - vResult = _mm_add_ps(vResult, vMask); - // Convert DivExponent into 1.0f/(1<(uScale)); - vResult = _mm_mul_ps(vResult, _mm_castsi128_ps(iMask)); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMConvertVectorFloatToUInt -( - FXMVECTOR VFloat, - uint32_t MulExponent -) noexcept -{ - assert(MulExponent < 32); -#if defined(_XM_NO_INTRINSICS_) - // Get the scalar factor. - auto fScale = static_cast(1U << MulExponent); - uint32_t ElementIndex = 0; - XMVECTOR Result; - do - { - uint32_t uResult; - float fTemp = VFloat.vector4_f32[ElementIndex] * fScale; - if (fTemp <= 0.0f) - { - uResult = 0; - } - else if (fTemp >= (65536.0f * 65536.0f)) - { - uResult = 0xFFFFFFFFU; - } - else - { - uResult = static_cast(fTemp); - } - Result.vector4_u32[ElementIndex] = uResult; - } - while (++ElementIndex < 4); - return Result; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t vResult = vmulq_n_f32(VFloat, static_cast(1U << MulExponent)); - // In case of overflow, detect it - uint32x4_t vOverflow = vcgtq_f32(vResult, g_XMMaxUInt); - // Float to int conversion - uint32x4_t vResulti = vcvtq_u32_f32(vResult); - // If there was overflow, set to 0xFFFFFFFFU - vResult = vreinterpretq_f32_u32(vbicq_u32(vResulti, vOverflow)); - vOverflow = vorrq_u32(vOverflow, vreinterpretq_u32_f32(vResult)); - return vreinterpretq_f32_u32(vOverflow); -#else // _XM_SSE_INTRINSICS_ - XMVECTOR vResult = _mm_set_ps1(static_cast(1U << MulExponent)); - vResult = _mm_mul_ps(vResult, VFloat); - // Clamp to >=0 - vResult = _mm_max_ps(vResult, g_XMZero); - // Any numbers that are too big, set to 0xFFFFFFFFU - XMVECTOR vOverflow = _mm_cmpgt_ps(vResult, g_XMMaxUInt); - XMVECTOR vValue = g_XMUnsignedFix; - // Too large for a signed integer? - XMVECTOR vMask = _mm_cmpge_ps(vResult, vValue); - // Zero for number's lower than 0x80000000, 32768.0f*65536.0f otherwise - vValue = _mm_and_ps(vValue, vMask); - // Perform fixup only on numbers too large (Keeps low bit precision) - vResult = _mm_sub_ps(vResult, vValue); - __m128i vResulti = _mm_cvttps_epi32(vResult); - // Convert from signed to unsigned pnly if greater than 0x80000000 - vMask = _mm_and_ps(vMask, g_XMNegativeZero); - vResult = _mm_xor_ps(_mm_castsi128_ps(vResulti), vMask); - // On those that are too large, set to 0xFFFFFFFF - vResult = _mm_or_ps(vResult, vOverflow); - return vResult; -#endif -} - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -/**************************************************************************** - * - * Vector and matrix load operations - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadInt(const uint32_t* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR V; - V.vector4_u32[0] = *pSource; - V.vector4_u32[1] = 0; - V.vector4_u32[2] = 0; - V.vector4_u32[3] = 0; - return V; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t zero = vdupq_n_u32(0); - return vreinterpretq_f32_u32(vld1q_lane_u32(pSource, zero, 0)); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_load_ss(reinterpret_cast(pSource)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadFloat(const float* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR V; - V.vector4_f32[0] = *pSource; - V.vector4_f32[1] = 0.f; - V.vector4_f32[2] = 0.f; - V.vector4_f32[3] = 0.f; - return V; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t zero = vdupq_n_f32(0); - return vld1q_lane_f32(pSource, zero, 0); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_load_ss(pSource); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadInt2(const uint32_t* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR V; - V.vector4_u32[0] = pSource[0]; - V.vector4_u32[1] = pSource[1]; - V.vector4_u32[2] = 0; - V.vector4_u32[3] = 0; - return V; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t x = vld1_u32(pSource); - uint32x2_t zero = vdup_n_u32(0); - return vreinterpretq_f32_u32(vcombine_u32(x, zero)); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadInt2A(const uint32_t* pSource) noexcept -{ - assert(pSource); - assert((reinterpret_cast(pSource) & 0xF) == 0); -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR V; - V.vector4_u32[0] = pSource[0]; - V.vector4_u32[1] = pSource[1]; - V.vector4_u32[2] = 0; - V.vector4_u32[3] = 0; - return V; -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - uint32x2_t x = vld1_u32_ex(pSource, 64); -#else - uint32x2_t x = vld1_u32(pSource); -#endif - uint32x2_t zero = vdup_n_u32(0); - return vreinterpretq_f32_u32(vcombine_u32(x, zero)); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadFloat2(const XMFLOAT2* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR V; - V.vector4_f32[0] = pSource->x; - V.vector4_f32[1] = pSource->y; - V.vector4_f32[2] = 0.f; - V.vector4_f32[3] = 0.f; - return V; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t x = vld1_f32(reinterpret_cast(pSource)); - float32x2_t zero = vdup_n_f32(0); - return vcombine_f32(x, zero); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadFloat2A(const XMFLOAT2A* pSource) noexcept -{ - assert(pSource); - assert((reinterpret_cast(pSource) & 0xF) == 0); -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR V; - V.vector4_f32[0] = pSource->x; - V.vector4_f32[1] = pSource->y; - V.vector4_f32[2] = 0.f; - V.vector4_f32[3] = 0.f; - return V; -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - float32x2_t x = vld1_f32_ex(reinterpret_cast(pSource), 64); -#else - float32x2_t x = vld1_f32(reinterpret_cast(pSource)); -#endif - float32x2_t zero = vdup_n_f32(0); - return vcombine_f32(x, zero); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadSInt2(const XMINT2* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR V; - V.vector4_f32[0] = static_cast(pSource->x); - V.vector4_f32[1] = static_cast(pSource->y); - V.vector4_f32[2] = 0.f; - V.vector4_f32[3] = 0.f; - return V; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - int32x2_t x = vld1_s32(reinterpret_cast(pSource)); - float32x2_t v = vcvt_f32_s32(x); - float32x2_t zero = vdup_n_f32(0); - return vcombine_f32(v, zero); -#elif defined(_XM_SSE_INTRINSICS_) - __m128 V = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); - return _mm_cvtepi32_ps(_mm_castps_si128(V)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUInt2(const XMUINT2* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR V; - V.vector4_f32[0] = static_cast(pSource->x); - V.vector4_f32[1] = static_cast(pSource->y); - V.vector4_f32[2] = 0.f; - V.vector4_f32[3] = 0.f; - return V; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t x = vld1_u32(reinterpret_cast(pSource)); - float32x2_t v = vcvt_f32_u32(x); - float32x2_t zero = vdup_n_f32(0); - return vcombine_f32(v, zero); -#elif defined(_XM_SSE_INTRINSICS_) - __m128 V = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); - // For the values that are higher than 0x7FFFFFFF, a fixup is needed - // Determine which ones need the fix. - XMVECTOR vMask = _mm_and_ps(V, g_XMNegativeZero); - // Force all values positive - XMVECTOR vResult = _mm_xor_ps(V, vMask); - // Convert to floats - vResult = _mm_cvtepi32_ps(_mm_castps_si128(vResult)); - // Convert 0x80000000 -> 0xFFFFFFFF - __m128i iMask = _mm_srai_epi32(_mm_castps_si128(vMask), 31); - // For only the ones that are too big, add the fixup - vMask = _mm_and_ps(_mm_castsi128_ps(iMask), g_XMFixUnsigned); - vResult = _mm_add_ps(vResult, vMask); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadInt3(const uint32_t* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR V; - V.vector4_u32[0] = pSource[0]; - V.vector4_u32[1] = pSource[1]; - V.vector4_u32[2] = pSource[2]; - V.vector4_u32[3] = 0; - return V; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t x = vld1_u32(pSource); - uint32x2_t zero = vdup_n_u32(0); - uint32x2_t y = vld1_lane_u32(pSource + 2, zero, 0); - return vreinterpretq_f32_u32(vcombine_u32(x, y)); -#elif defined(_XM_SSE4_INTRINSICS_) - __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); - __m128 z = _mm_load_ss(reinterpret_cast(pSource + 2)); - return _mm_insert_ps(xy, z, 0x20); -#elif defined(_XM_SSE_INTRINSICS_) - __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); - __m128 z = _mm_load_ss(reinterpret_cast(pSource + 2)); - return _mm_movelh_ps(xy, z); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadInt3A(const uint32_t* pSource) noexcept -{ - assert(pSource); - assert((reinterpret_cast(pSource) & 0xF) == 0); -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR V; - V.vector4_u32[0] = pSource[0]; - V.vector4_u32[1] = pSource[1]; - V.vector4_u32[2] = pSource[2]; - V.vector4_u32[3] = 0; - return V; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Reads an extra integer which is zero'd -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - uint32x4_t V = vld1q_u32_ex(pSource, 128); -#else - uint32x4_t V = vld1q_u32(pSource); -#endif - return vreinterpretq_f32_u32(vsetq_lane_u32(0, V, 3)); -#elif defined(_XM_SSE4_INTRINSICS_) - __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); - __m128 z = _mm_load_ss(reinterpret_cast(pSource + 2)); - return _mm_insert_ps(xy, z, 0x20); -#elif defined(_XM_SSE_INTRINSICS_) - __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); - __m128 z = _mm_load_ss(reinterpret_cast(pSource + 2)); - return _mm_movelh_ps(xy, z); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadFloat3(const XMFLOAT3* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR V; - V.vector4_f32[0] = pSource->x; - V.vector4_f32[1] = pSource->y; - V.vector4_f32[2] = pSource->z; - V.vector4_f32[3] = 0.f; - return V; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t x = vld1_f32(reinterpret_cast(pSource)); - float32x2_t zero = vdup_n_f32(0); - float32x2_t y = vld1_lane_f32(reinterpret_cast(pSource) + 2, zero, 0); - return vcombine_f32(x, y); -#elif defined(_XM_SSE4_INTRINSICS_) - __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); - __m128 z = _mm_load_ss(&pSource->z); - return _mm_insert_ps(xy, z, 0x20); -#elif defined(_XM_SSE_INTRINSICS_) - __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); - __m128 z = _mm_load_ss(&pSource->z); - return _mm_movelh_ps(xy, z); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadFloat3A(const XMFLOAT3A* pSource) noexcept -{ - assert(pSource); - assert((reinterpret_cast(pSource) & 0xF) == 0); -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR V; - V.vector4_f32[0] = pSource->x; - V.vector4_f32[1] = pSource->y; - V.vector4_f32[2] = pSource->z; - V.vector4_f32[3] = 0.f; - return V; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Reads an extra float which is zero'd -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - float32x4_t V = vld1q_f32_ex(reinterpret_cast(pSource), 128); -#else - float32x4_t V = vld1q_f32(reinterpret_cast(pSource)); -#endif - return vsetq_lane_f32(0, V, 3); -#elif defined(_XM_SSE_INTRINSICS_) - // Reads an extra float which is zero'd - __m128 V = _mm_load_ps(&pSource->x); - return _mm_and_ps(V, g_XMMask3); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadSInt3(const XMINT3* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR V; - V.vector4_f32[0] = static_cast(pSource->x); - V.vector4_f32[1] = static_cast(pSource->y); - V.vector4_f32[2] = static_cast(pSource->z); - V.vector4_f32[3] = 0.f; - return V; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - int32x2_t x = vld1_s32(reinterpret_cast(pSource)); - int32x2_t zero = vdup_n_s32(0); - int32x2_t y = vld1_lane_s32(reinterpret_cast(pSource) + 2, zero, 0); - int32x4_t v = vcombine_s32(x, y); - return vcvtq_f32_s32(v); -#elif defined(_XM_SSE_INTRINSICS_) - __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); - __m128 z = _mm_load_ss(reinterpret_cast(&pSource->z)); - __m128 V = _mm_movelh_ps(xy, z); - return _mm_cvtepi32_ps(_mm_castps_si128(V)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUInt3(const XMUINT3* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR V; - V.vector4_f32[0] = static_cast(pSource->x); - V.vector4_f32[1] = static_cast(pSource->y); - V.vector4_f32[2] = static_cast(pSource->z); - V.vector4_f32[3] = 0.f; - return V; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t x = vld1_u32(reinterpret_cast(pSource)); - uint32x2_t zero = vdup_n_u32(0); - uint32x2_t y = vld1_lane_u32(reinterpret_cast(pSource) + 2, zero, 0); - uint32x4_t v = vcombine_u32(x, y); - return vcvtq_f32_u32(v); -#elif defined(_XM_SSE_INTRINSICS_) - __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); - __m128 z = _mm_load_ss(reinterpret_cast(&pSource->z)); - __m128 V = _mm_movelh_ps(xy, z); - // For the values that are higher than 0x7FFFFFFF, a fixup is needed - // Determine which ones need the fix. - XMVECTOR vMask = _mm_and_ps(V, g_XMNegativeZero); - // Force all values positive - XMVECTOR vResult = _mm_xor_ps(V, vMask); - // Convert to floats - vResult = _mm_cvtepi32_ps(_mm_castps_si128(vResult)); - // Convert 0x80000000 -> 0xFFFFFFFF - __m128i iMask = _mm_srai_epi32(_mm_castps_si128(vMask), 31); - // For only the ones that are too big, add the fixup - vMask = _mm_and_ps(_mm_castsi128_ps(iMask), g_XMFixUnsigned); - vResult = _mm_add_ps(vResult, vMask); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadInt4(const uint32_t* pSource) noexcept -{ - assert(pSource); - -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR V; - V.vector4_u32[0] = pSource[0]; - V.vector4_u32[1] = pSource[1]; - V.vector4_u32[2] = pSource[2]; - V.vector4_u32[3] = pSource[3]; - return V; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vld1q_u32(pSource)); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i V = _mm_loadu_si128(reinterpret_cast(pSource)); - return _mm_castsi128_ps(V); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadInt4A(const uint32_t* pSource) noexcept -{ - assert(pSource); - assert((reinterpret_cast(pSource) & 0xF) == 0); -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR V; - V.vector4_u32[0] = pSource[0]; - V.vector4_u32[1] = pSource[1]; - V.vector4_u32[2] = pSource[2]; - V.vector4_u32[3] = pSource[3]; - return V; -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - return vld1q_u32_ex(pSource, 128); -#else - return vreinterpretq_f32_u32(vld1q_u32(pSource)); -#endif -#elif defined(_XM_SSE_INTRINSICS_) - __m128i V = _mm_load_si128(reinterpret_cast(pSource)); - return _mm_castsi128_ps(V); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadFloat4(const XMFLOAT4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR V; - V.vector4_f32[0] = pSource->x; - V.vector4_f32[1] = pSource->y; - V.vector4_f32[2] = pSource->z; - V.vector4_f32[3] = pSource->w; - return V; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vld1q_f32(reinterpret_cast(pSource)); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_loadu_ps(&pSource->x); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadFloat4A(const XMFLOAT4A* pSource) noexcept -{ - assert(pSource); - assert((reinterpret_cast(pSource) & 0xF) == 0); -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR V; - V.vector4_f32[0] = pSource->x; - V.vector4_f32[1] = pSource->y; - V.vector4_f32[2] = pSource->z; - V.vector4_f32[3] = pSource->w; - return V; -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - return vld1q_f32_ex(reinterpret_cast(pSource), 128); -#else - return vld1q_f32(reinterpret_cast(pSource)); -#endif -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_load_ps(&pSource->x); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadSInt4(const XMINT4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR V; - V.vector4_f32[0] = static_cast(pSource->x); - V.vector4_f32[1] = static_cast(pSource->y); - V.vector4_f32[2] = static_cast(pSource->z); - V.vector4_f32[3] = static_cast(pSource->w); - return V; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - int32x4_t v = vld1q_s32(reinterpret_cast(pSource)); - return vcvtq_f32_s32(v); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i V = _mm_loadu_si128(reinterpret_cast(pSource)); - return _mm_cvtepi32_ps(V); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUInt4(const XMUINT4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR V; - V.vector4_f32[0] = static_cast(pSource->x); - V.vector4_f32[1] = static_cast(pSource->y); - V.vector4_f32[2] = static_cast(pSource->z); - V.vector4_f32[3] = static_cast(pSource->w); - return V; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t v = vld1q_u32(reinterpret_cast(pSource)); - return vcvtq_f32_u32(v); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i V = _mm_loadu_si128(reinterpret_cast(pSource)); - // For the values that are higher than 0x7FFFFFFF, a fixup is needed - // Determine which ones need the fix. - XMVECTOR vMask = _mm_and_ps(_mm_castsi128_ps(V), g_XMNegativeZero); - // Force all values positive - XMVECTOR vResult = _mm_xor_ps(_mm_castsi128_ps(V), vMask); - // Convert to floats - vResult = _mm_cvtepi32_ps(_mm_castps_si128(vResult)); - // Convert 0x80000000 -> 0xFFFFFFFF - __m128i iMask = _mm_srai_epi32(_mm_castps_si128(vMask), 31); - // For only the ones that are too big, add the fixup - vMask = _mm_and_ps(_mm_castsi128_ps(iMask), g_XMFixUnsigned); - vResult = _mm_add_ps(vResult, vMask); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMMATRIX XM_CALLCONV XMLoadFloat3x3(const XMFLOAT3X3* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - - XMMATRIX M; - M.r[0].vector4_f32[0] = pSource->m[0][0]; - M.r[0].vector4_f32[1] = pSource->m[0][1]; - M.r[0].vector4_f32[2] = pSource->m[0][2]; - M.r[0].vector4_f32[3] = 0.0f; - - M.r[1].vector4_f32[0] = pSource->m[1][0]; - M.r[1].vector4_f32[1] = pSource->m[1][1]; - M.r[1].vector4_f32[2] = pSource->m[1][2]; - M.r[1].vector4_f32[3] = 0.0f; - - M.r[2].vector4_f32[0] = pSource->m[2][0]; - M.r[2].vector4_f32[1] = pSource->m[2][1]; - M.r[2].vector4_f32[2] = pSource->m[2][2]; - M.r[2].vector4_f32[3] = 0.0f; - M.r[3].vector4_f32[0] = 0.0f; - M.r[3].vector4_f32[1] = 0.0f; - M.r[3].vector4_f32[2] = 0.0f; - M.r[3].vector4_f32[3] = 1.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t v0 = vld1q_f32(&pSource->m[0][0]); - float32x4_t v1 = vld1q_f32(&pSource->m[1][1]); - float32x2_t v2 = vcreate_f32(static_cast(*reinterpret_cast(&pSource->m[2][2]))); - float32x4_t T = vextq_f32(v0, v1, 3); - - XMMATRIX M; - M.r[0] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(v0), g_XMMask3)); - M.r[1] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T), g_XMMask3)); - M.r[2] = vcombine_f32(vget_high_f32(v1), v2); - M.r[3] = g_XMIdentityR3; - return M; -#elif defined(_XM_SSE_INTRINSICS_) - __m128 Z = _mm_setzero_ps(); - - __m128 V1 = _mm_loadu_ps(&pSource->m[0][0]); - __m128 V2 = _mm_loadu_ps(&pSource->m[1][1]); - __m128 V3 = _mm_load_ss(&pSource->m[2][2]); - - __m128 T1 = _mm_unpackhi_ps(V1, Z); - __m128 T2 = _mm_unpacklo_ps(V2, Z); - __m128 T3 = _mm_shuffle_ps(V3, T2, _MM_SHUFFLE(0, 1, 0, 0)); - __m128 T4 = _mm_movehl_ps(T2, T3); - __m128 T5 = _mm_movehl_ps(Z, T1); - - XMMATRIX M; - M.r[0] = _mm_movelh_ps(V1, T1); - M.r[1] = _mm_add_ps(T4, T5); - M.r[2] = _mm_shuffle_ps(V2, V3, _MM_SHUFFLE(1, 0, 3, 2)); - M.r[3] = g_XMIdentityR3; - return M; -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMMATRIX XM_CALLCONV XMLoadFloat4x3(const XMFLOAT4X3* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - - XMMATRIX M; - M.r[0].vector4_f32[0] = pSource->m[0][0]; - M.r[0].vector4_f32[1] = pSource->m[0][1]; - M.r[0].vector4_f32[2] = pSource->m[0][2]; - M.r[0].vector4_f32[3] = 0.0f; - - M.r[1].vector4_f32[0] = pSource->m[1][0]; - M.r[1].vector4_f32[1] = pSource->m[1][1]; - M.r[1].vector4_f32[2] = pSource->m[1][2]; - M.r[1].vector4_f32[3] = 0.0f; - - M.r[2].vector4_f32[0] = pSource->m[2][0]; - M.r[2].vector4_f32[1] = pSource->m[2][1]; - M.r[2].vector4_f32[2] = pSource->m[2][2]; - M.r[2].vector4_f32[3] = 0.0f; - - M.r[3].vector4_f32[0] = pSource->m[3][0]; - M.r[3].vector4_f32[1] = pSource->m[3][1]; - M.r[3].vector4_f32[2] = pSource->m[3][2]; - M.r[3].vector4_f32[3] = 1.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t v0 = vld1q_f32(&pSource->m[0][0]); - float32x4_t v1 = vld1q_f32(&pSource->m[1][1]); - float32x4_t v2 = vld1q_f32(&pSource->m[2][2]); - - float32x4_t T1 = vextq_f32(v0, v1, 3); - float32x4_t T2 = vcombine_f32(vget_high_f32(v1), vget_low_f32(v2)); - float32x4_t T3 = vextq_f32(v2, v2, 1); - - XMMATRIX M; - M.r[0] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(v0), g_XMMask3)); - M.r[1] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T1), g_XMMask3)); - M.r[2] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T2), g_XMMask3)); - M.r[3] = vsetq_lane_f32(1.f, T3, 3); - return M; -#elif defined(_XM_SSE_INTRINSICS_) - // Use unaligned load instructions to - // load the 12 floats - // vTemp1 = x1,y1,z1,x2 - XMVECTOR vTemp1 = _mm_loadu_ps(&pSource->m[0][0]); - // vTemp2 = y2,z2,x3,y3 - XMVECTOR vTemp2 = _mm_loadu_ps(&pSource->m[1][1]); - // vTemp4 = z3,x4,y4,z4 - XMVECTOR vTemp4 = _mm_loadu_ps(&pSource->m[2][2]); - // vTemp3 = x3,y3,z3,z3 - XMVECTOR vTemp3 = _mm_shuffle_ps(vTemp2, vTemp4, _MM_SHUFFLE(0, 0, 3, 2)); - // vTemp2 = y2,z2,x2,x2 - vTemp2 = _mm_shuffle_ps(vTemp2, vTemp1, _MM_SHUFFLE(3, 3, 1, 0)); - // vTemp2 = x2,y2,z2,z2 - vTemp2 = XM_PERMUTE_PS(vTemp2, _MM_SHUFFLE(1, 1, 0, 2)); - // vTemp1 = x1,y1,z1,0 - vTemp1 = _mm_and_ps(vTemp1, g_XMMask3); - // vTemp2 = x2,y2,z2,0 - vTemp2 = _mm_and_ps(vTemp2, g_XMMask3); - // vTemp3 = x3,y3,z3,0 - vTemp3 = _mm_and_ps(vTemp3, g_XMMask3); - // vTemp4i = x4,y4,z4,0 - __m128i vTemp4i = _mm_srli_si128(_mm_castps_si128(vTemp4), 32 / 8); - // vTemp4i = x4,y4,z4,1.0f - vTemp4i = _mm_or_si128(vTemp4i, g_XMIdentityR3); - XMMATRIX M(vTemp1, - vTemp2, - vTemp3, - _mm_castsi128_ps(vTemp4i)); - return M; -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMMATRIX XM_CALLCONV XMLoadFloat4x3A(const XMFLOAT4X3A* pSource) noexcept -{ - assert(pSource); - assert((reinterpret_cast(pSource) & 0xF) == 0); -#if defined(_XM_NO_INTRINSICS_) - - XMMATRIX M; - M.r[0].vector4_f32[0] = pSource->m[0][0]; - M.r[0].vector4_f32[1] = pSource->m[0][1]; - M.r[0].vector4_f32[2] = pSource->m[0][2]; - M.r[0].vector4_f32[3] = 0.0f; - - M.r[1].vector4_f32[0] = pSource->m[1][0]; - M.r[1].vector4_f32[1] = pSource->m[1][1]; - M.r[1].vector4_f32[2] = pSource->m[1][2]; - M.r[1].vector4_f32[3] = 0.0f; - - M.r[2].vector4_f32[0] = pSource->m[2][0]; - M.r[2].vector4_f32[1] = pSource->m[2][1]; - M.r[2].vector4_f32[2] = pSource->m[2][2]; - M.r[2].vector4_f32[3] = 0.0f; - - M.r[3].vector4_f32[0] = pSource->m[3][0]; - M.r[3].vector4_f32[1] = pSource->m[3][1]; - M.r[3].vector4_f32[2] = pSource->m[3][2]; - M.r[3].vector4_f32[3] = 1.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - float32x4_t v0 = vld1q_f32_ex(&pSource->m[0][0], 128); - float32x4_t v1 = vld1q_f32_ex(&pSource->m[1][1], 128); - float32x4_t v2 = vld1q_f32_ex(&pSource->m[2][2], 128); -#else - float32x4_t v0 = vld1q_f32(&pSource->m[0][0]); - float32x4_t v1 = vld1q_f32(&pSource->m[1][1]); - float32x4_t v2 = vld1q_f32(&pSource->m[2][2]); -#endif - - float32x4_t T1 = vextq_f32(v0, v1, 3); - float32x4_t T2 = vcombine_f32(vget_high_f32(v1), vget_low_f32(v2)); - float32x4_t T3 = vextq_f32(v2, v2, 1); - - XMMATRIX M; - M.r[0] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(v0), g_XMMask3)); - M.r[1] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T1), g_XMMask3)); - M.r[2] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T2), g_XMMask3)); - M.r[3] = vsetq_lane_f32(1.f, T3, 3); - return M; -#elif defined(_XM_SSE_INTRINSICS_) - // Use aligned load instructions to - // load the 12 floats - // vTemp1 = x1,y1,z1,x2 - XMVECTOR vTemp1 = _mm_load_ps(&pSource->m[0][0]); - // vTemp2 = y2,z2,x3,y3 - XMVECTOR vTemp2 = _mm_load_ps(&pSource->m[1][1]); - // vTemp4 = z3,x4,y4,z4 - XMVECTOR vTemp4 = _mm_load_ps(&pSource->m[2][2]); - // vTemp3 = x3,y3,z3,z3 - XMVECTOR vTemp3 = _mm_shuffle_ps(vTemp2, vTemp4, _MM_SHUFFLE(0, 0, 3, 2)); - // vTemp2 = y2,z2,x2,x2 - vTemp2 = _mm_shuffle_ps(vTemp2, vTemp1, _MM_SHUFFLE(3, 3, 1, 0)); - // vTemp2 = x2,y2,z2,z2 - vTemp2 = XM_PERMUTE_PS(vTemp2, _MM_SHUFFLE(1, 1, 0, 2)); - // vTemp1 = x1,y1,z1,0 - vTemp1 = _mm_and_ps(vTemp1, g_XMMask3); - // vTemp2 = x2,y2,z2,0 - vTemp2 = _mm_and_ps(vTemp2, g_XMMask3); - // vTemp3 = x3,y3,z3,0 - vTemp3 = _mm_and_ps(vTemp3, g_XMMask3); - // vTemp4i = x4,y4,z4,0 - __m128i vTemp4i = _mm_srli_si128(_mm_castps_si128(vTemp4), 32 / 8); - // vTemp4i = x4,y4,z4,1.0f - vTemp4i = _mm_or_si128(vTemp4i, g_XMIdentityR3); - XMMATRIX M(vTemp1, - vTemp2, - vTemp3, - _mm_castsi128_ps(vTemp4i)); - return M; -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMMATRIX XM_CALLCONV XMLoadFloat3x4(const XMFLOAT3X4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - - XMMATRIX M; - M.r[0].vector4_f32[0] = pSource->m[0][0]; - M.r[0].vector4_f32[1] = pSource->m[1][0]; - M.r[0].vector4_f32[2] = pSource->m[2][0]; - M.r[0].vector4_f32[3] = 0.0f; - - M.r[1].vector4_f32[0] = pSource->m[0][1]; - M.r[1].vector4_f32[1] = pSource->m[1][1]; - M.r[1].vector4_f32[2] = pSource->m[2][1]; - M.r[1].vector4_f32[3] = 0.0f; - - M.r[2].vector4_f32[0] = pSource->m[0][2]; - M.r[2].vector4_f32[1] = pSource->m[1][2]; - M.r[2].vector4_f32[2] = pSource->m[2][2]; - M.r[2].vector4_f32[3] = 0.0f; - - M.r[3].vector4_f32[0] = pSource->m[0][3]; - M.r[3].vector4_f32[1] = pSource->m[1][3]; - M.r[3].vector4_f32[2] = pSource->m[2][3]; - M.r[3].vector4_f32[3] = 1.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2x4_t vTemp0 = vld4_f32(&pSource->_11); - float32x4_t vTemp1 = vld1q_f32(&pSource->_31); - - float32x2_t l = vget_low_f32(vTemp1); - float32x4_t T0 = vcombine_f32(vTemp0.val[0], l); - float32x2_t rl = vrev64_f32(l); - float32x4_t T1 = vcombine_f32(vTemp0.val[1], rl); - - float32x2_t h = vget_high_f32(vTemp1); - float32x4_t T2 = vcombine_f32(vTemp0.val[2], h); - float32x2_t rh = vrev64_f32(h); - float32x4_t T3 = vcombine_f32(vTemp0.val[3], rh); - - XMMATRIX M = {}; - M.r[0] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T0), g_XMMask3)); - M.r[1] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T1), g_XMMask3)); - M.r[2] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T2), g_XMMask3)); - M.r[3] = vsetq_lane_f32(1.f, T3, 3); - return M; -#elif defined(_XM_SSE_INTRINSICS_) - XMMATRIX M; - M.r[0] = _mm_loadu_ps(&pSource->_11); - M.r[1] = _mm_loadu_ps(&pSource->_21); - M.r[2] = _mm_loadu_ps(&pSource->_31); - M.r[3] = g_XMIdentityR3; - - // x.x,x.y,y.x,y.y - XMVECTOR vTemp1 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(1, 0, 1, 0)); - // x.z,x.w,y.z,y.w - XMVECTOR vTemp3 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(3, 2, 3, 2)); - // z.x,z.y,w.x,w.y - XMVECTOR vTemp2 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(1, 0, 1, 0)); - // z.z,z.w,w.z,w.w - XMVECTOR vTemp4 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(3, 2, 3, 2)); - XMMATRIX mResult; - - // x.x,y.x,z.x,w.x - mResult.r[0] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(2, 0, 2, 0)); - // x.y,y.y,z.y,w.y - mResult.r[1] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(3, 1, 3, 1)); - // x.z,y.z,z.z,w.z - mResult.r[2] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 0, 2, 0)); - // x.w,y.w,z.w,w.w - mResult.r[3] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(3, 1, 3, 1)); - return mResult; -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMMATRIX XM_CALLCONV XMLoadFloat3x4A(const XMFLOAT3X4A* pSource) noexcept -{ - assert(pSource); - assert((reinterpret_cast(pSource) & 0xF) == 0); -#if defined(_XM_NO_INTRINSICS_) - - XMMATRIX M; - M.r[0].vector4_f32[0] = pSource->m[0][0]; - M.r[0].vector4_f32[1] = pSource->m[1][0]; - M.r[0].vector4_f32[2] = pSource->m[2][0]; - M.r[0].vector4_f32[3] = 0.0f; - - M.r[1].vector4_f32[0] = pSource->m[0][1]; - M.r[1].vector4_f32[1] = pSource->m[1][1]; - M.r[1].vector4_f32[2] = pSource->m[2][1]; - M.r[1].vector4_f32[3] = 0.0f; - - M.r[2].vector4_f32[0] = pSource->m[0][2]; - M.r[2].vector4_f32[1] = pSource->m[1][2]; - M.r[2].vector4_f32[2] = pSource->m[2][2]; - M.r[2].vector4_f32[3] = 0.0f; - - M.r[3].vector4_f32[0] = pSource->m[0][3]; - M.r[3].vector4_f32[1] = pSource->m[1][3]; - M.r[3].vector4_f32[2] = pSource->m[2][3]; - M.r[3].vector4_f32[3] = 1.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - float32x2x4_t vTemp0 = vld4_f32_ex(&pSource->_11, 128); - float32x4_t vTemp1 = vld1q_f32_ex(&pSource->_31, 128); -#else - float32x2x4_t vTemp0 = vld4_f32(&pSource->_11); - float32x4_t vTemp1 = vld1q_f32(&pSource->_31); -#endif - - float32x2_t l = vget_low_f32(vTemp1); - float32x4_t T0 = vcombine_f32(vTemp0.val[0], l); - float32x2_t rl = vrev64_f32(l); - float32x4_t T1 = vcombine_f32(vTemp0.val[1], rl); - - float32x2_t h = vget_high_f32(vTemp1); - float32x4_t T2 = vcombine_f32(vTemp0.val[2], h); - float32x2_t rh = vrev64_f32(h); - float32x4_t T3 = vcombine_f32(vTemp0.val[3], rh); - - XMMATRIX M = {}; - M.r[0] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T0), g_XMMask3)); - M.r[1] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T1), g_XMMask3)); - M.r[2] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T2), g_XMMask3)); - M.r[3] = vsetq_lane_f32(1.f, T3, 3); - return M; -#elif defined(_XM_SSE_INTRINSICS_) - XMMATRIX M; - M.r[0] = _mm_load_ps(&pSource->_11); - M.r[1] = _mm_load_ps(&pSource->_21); - M.r[2] = _mm_load_ps(&pSource->_31); - M.r[3] = g_XMIdentityR3; - - // x.x,x.y,y.x,y.y - XMVECTOR vTemp1 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(1, 0, 1, 0)); - // x.z,x.w,y.z,y.w - XMVECTOR vTemp3 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(3, 2, 3, 2)); - // z.x,z.y,w.x,w.y - XMVECTOR vTemp2 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(1, 0, 1, 0)); - // z.z,z.w,w.z,w.w - XMVECTOR vTemp4 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(3, 2, 3, 2)); - XMMATRIX mResult; - - // x.x,y.x,z.x,w.x - mResult.r[0] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(2, 0, 2, 0)); - // x.y,y.y,z.y,w.y - mResult.r[1] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(3, 1, 3, 1)); - // x.z,y.z,z.z,w.z - mResult.r[2] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 0, 2, 0)); - // x.w,y.w,z.w,w.w - mResult.r[3] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(3, 1, 3, 1)); - return mResult; -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMMATRIX XM_CALLCONV XMLoadFloat4x4(const XMFLOAT4X4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - - XMMATRIX M; - M.r[0].vector4_f32[0] = pSource->m[0][0]; - M.r[0].vector4_f32[1] = pSource->m[0][1]; - M.r[0].vector4_f32[2] = pSource->m[0][2]; - M.r[0].vector4_f32[3] = pSource->m[0][3]; - - M.r[1].vector4_f32[0] = pSource->m[1][0]; - M.r[1].vector4_f32[1] = pSource->m[1][1]; - M.r[1].vector4_f32[2] = pSource->m[1][2]; - M.r[1].vector4_f32[3] = pSource->m[1][3]; - - M.r[2].vector4_f32[0] = pSource->m[2][0]; - M.r[2].vector4_f32[1] = pSource->m[2][1]; - M.r[2].vector4_f32[2] = pSource->m[2][2]; - M.r[2].vector4_f32[3] = pSource->m[2][3]; - - M.r[3].vector4_f32[0] = pSource->m[3][0]; - M.r[3].vector4_f32[1] = pSource->m[3][1]; - M.r[3].vector4_f32[2] = pSource->m[3][2]; - M.r[3].vector4_f32[3] = pSource->m[3][3]; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - XMMATRIX M; - M.r[0] = vld1q_f32(reinterpret_cast(&pSource->_11)); - M.r[1] = vld1q_f32(reinterpret_cast(&pSource->_21)); - M.r[2] = vld1q_f32(reinterpret_cast(&pSource->_31)); - M.r[3] = vld1q_f32(reinterpret_cast(&pSource->_41)); - return M; -#elif defined(_XM_SSE_INTRINSICS_) - XMMATRIX M; - M.r[0] = _mm_loadu_ps(&pSource->_11); - M.r[1] = _mm_loadu_ps(&pSource->_21); - M.r[2] = _mm_loadu_ps(&pSource->_31); - M.r[3] = _mm_loadu_ps(&pSource->_41); - return M; -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMMATRIX XM_CALLCONV XMLoadFloat4x4A(const XMFLOAT4X4A* pSource) noexcept -{ - assert(pSource); - assert((reinterpret_cast(pSource) & 0xF) == 0); -#if defined(_XM_NO_INTRINSICS_) - - XMMATRIX M; - M.r[0].vector4_f32[0] = pSource->m[0][0]; - M.r[0].vector4_f32[1] = pSource->m[0][1]; - M.r[0].vector4_f32[2] = pSource->m[0][2]; - M.r[0].vector4_f32[3] = pSource->m[0][3]; - - M.r[1].vector4_f32[0] = pSource->m[1][0]; - M.r[1].vector4_f32[1] = pSource->m[1][1]; - M.r[1].vector4_f32[2] = pSource->m[1][2]; - M.r[1].vector4_f32[3] = pSource->m[1][3]; - - M.r[2].vector4_f32[0] = pSource->m[2][0]; - M.r[2].vector4_f32[1] = pSource->m[2][1]; - M.r[2].vector4_f32[2] = pSource->m[2][2]; - M.r[2].vector4_f32[3] = pSource->m[2][3]; - - M.r[3].vector4_f32[0] = pSource->m[3][0]; - M.r[3].vector4_f32[1] = pSource->m[3][1]; - M.r[3].vector4_f32[2] = pSource->m[3][2]; - M.r[3].vector4_f32[3] = pSource->m[3][3]; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - XMMATRIX M; -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - M.r[0] = vld1q_f32_ex(reinterpret_cast(&pSource->_11), 128); - M.r[1] = vld1q_f32_ex(reinterpret_cast(&pSource->_21), 128); - M.r[2] = vld1q_f32_ex(reinterpret_cast(&pSource->_31), 128); - M.r[3] = vld1q_f32_ex(reinterpret_cast(&pSource->_41), 128); -#else - M.r[0] = vld1q_f32(reinterpret_cast(&pSource->_11)); - M.r[1] = vld1q_f32(reinterpret_cast(&pSource->_21)); - M.r[2] = vld1q_f32(reinterpret_cast(&pSource->_31)); - M.r[3] = vld1q_f32(reinterpret_cast(&pSource->_41)); -#endif - return M; -#elif defined(_XM_SSE_INTRINSICS_) - XMMATRIX M; - M.r[0] = _mm_load_ps(&pSource->_11); - M.r[1] = _mm_load_ps(&pSource->_21); - M.r[2] = _mm_load_ps(&pSource->_31); - M.r[3] = _mm_load_ps(&pSource->_41); - return M; -#endif -} - -/**************************************************************************** - * - * Vector and matrix store operations - * - ****************************************************************************/ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreInt -( - uint32_t* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - *pDestination = XMVectorGetIntX(V); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - vst1q_lane_u32(pDestination, *reinterpret_cast(&V), 0); -#elif defined(_XM_SSE_INTRINSICS_) - _mm_store_ss(reinterpret_cast(pDestination), V); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat -( - float* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - *pDestination = XMVectorGetX(V); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - vst1q_lane_f32(pDestination, V, 0); -#elif defined(_XM_SSE_INTRINSICS_) - _mm_store_ss(pDestination, V); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreInt2 -( - uint32_t* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - pDestination[0] = V.vector4_u32[0]; - pDestination[1] = V.vector4_u32[1]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t VL = vget_low_u32(vreinterpretq_u32_f32(V)); - vst1_u32(pDestination, VL); -#elif defined(_XM_SSE_INTRINSICS_) - _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreInt2A -( - uint32_t* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); - assert((reinterpret_cast(pDestination) & 0xF) == 0); -#if defined(_XM_NO_INTRINSICS_) - pDestination[0] = V.vector4_u32[0]; - pDestination[1] = V.vector4_u32[1]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t VL = vget_low_u32(vreinterpretq_u32_f32(V)); -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - vst1_u32_ex(pDestination, VL, 64); -#else - vst1_u32(pDestination, VL); -#endif -#elif defined(_XM_SSE_INTRINSICS_) - _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat2 -( - XMFLOAT2* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - pDestination->x = V.vector4_f32[0]; - pDestination->y = V.vector4_f32[1]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); - vst1_f32(reinterpret_cast(pDestination), VL); -#elif defined(_XM_SSE_INTRINSICS_) - _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat2A -( - XMFLOAT2A* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); - assert((reinterpret_cast(pDestination) & 0xF) == 0); -#if defined(_XM_NO_INTRINSICS_) - pDestination->x = V.vector4_f32[0]; - pDestination->y = V.vector4_f32[1]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - vst1_f32_ex(reinterpret_cast(pDestination), VL, 64); -#else - vst1_f32(reinterpret_cast(pDestination), VL); -#endif -#elif defined(_XM_SSE_INTRINSICS_) - _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreSInt2 -( - XMINT2* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - pDestination->x = static_cast(V.vector4_f32[0]); - pDestination->y = static_cast(V.vector4_f32[1]); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t v = vget_low_f32(V); - int32x2_t iv = vcvt_s32_f32(v); - vst1_s32(reinterpret_cast(pDestination), iv); -#elif defined(_XM_SSE_INTRINSICS_) - // In case of positive overflow, detect it - XMVECTOR vOverflow = _mm_cmpgt_ps(V, g_XMMaxInt); - // Float to int conversion - __m128i vResulti = _mm_cvttps_epi32(V); - // If there was positive overflow, set to 0x7FFFFFFF - XMVECTOR vResult = _mm_and_ps(vOverflow, g_XMAbsMask); - vOverflow = _mm_andnot_ps(vOverflow, _mm_castsi128_ps(vResulti)); - vOverflow = _mm_or_ps(vOverflow, vResult); - // Write two ints - _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(vOverflow)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUInt2 -( - XMUINT2* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - pDestination->x = static_cast(V.vector4_f32[0]); - pDestination->y = static_cast(V.vector4_f32[1]); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t v = vget_low_f32(V); - uint32x2_t iv = vcvt_u32_f32(v); - vst1_u32(reinterpret_cast(pDestination), iv); -#elif defined(_XM_SSE_INTRINSICS_) - // Clamp to >=0 - XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - // Any numbers that are too big, set to 0xFFFFFFFFU - XMVECTOR vOverflow = _mm_cmpgt_ps(vResult, g_XMMaxUInt); - XMVECTOR vValue = g_XMUnsignedFix; - // Too large for a signed integer? - XMVECTOR vMask = _mm_cmpge_ps(vResult, vValue); - // Zero for number's lower than 0x80000000, 32768.0f*65536.0f otherwise - vValue = _mm_and_ps(vValue, vMask); - // Perform fixup only on numbers too large (Keeps low bit precision) - vResult = _mm_sub_ps(vResult, vValue); - __m128i vResulti = _mm_cvttps_epi32(vResult); - // Convert from signed to unsigned pnly if greater than 0x80000000 - vMask = _mm_and_ps(vMask, g_XMNegativeZero); - vResult = _mm_xor_ps(_mm_castsi128_ps(vResulti), vMask); - // On those that are too large, set to 0xFFFFFFFF - vResult = _mm_or_ps(vResult, vOverflow); - // Write two uints - _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(vResult)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreInt3 -( - uint32_t* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - pDestination[0] = V.vector4_u32[0]; - pDestination[1] = V.vector4_u32[1]; - pDestination[2] = V.vector4_u32[2]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t VL = vget_low_u32(vreinterpretq_u32_f32(V)); - vst1_u32(pDestination, VL); - vst1q_lane_u32(pDestination + 2, *reinterpret_cast(&V), 2); -#elif defined(_XM_SSE_INTRINSICS_) - _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V)); - __m128 z = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - _mm_store_ss(reinterpret_cast(&pDestination[2]), z); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreInt3A -( - uint32_t* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); - assert((reinterpret_cast(pDestination) & 0xF) == 0); -#if defined(_XM_NO_INTRINSICS_) - pDestination[0] = V.vector4_u32[0]; - pDestination[1] = V.vector4_u32[1]; - pDestination[2] = V.vector4_u32[2]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t VL = vget_low_u32(vreinterpretq_u32_f32(V)); -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - vst1_u32_ex(pDestination, VL, 64); -#else - vst1_u32(pDestination, VL); -#endif - vst1q_lane_u32(pDestination + 2, *reinterpret_cast(&V), 2); -#elif defined(_XM_SSE_INTRINSICS_) - _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V)); - __m128 z = _mm_movehl_ps(V, V); - _mm_store_ss(reinterpret_cast(&pDestination[2]), z); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat3 -( - XMFLOAT3* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - pDestination->x = V.vector4_f32[0]; - pDestination->y = V.vector4_f32[1]; - pDestination->z = V.vector4_f32[2]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); - vst1_f32(reinterpret_cast(pDestination), VL); - vst1q_lane_f32(reinterpret_cast(pDestination) + 2, V, 2); -#elif defined(_XM_SSE4_INTRINSICS_) - * reinterpret_cast(&pDestination->x) = _mm_extract_ps(V, 0); - *reinterpret_cast(&pDestination->y) = _mm_extract_ps(V, 1); - *reinterpret_cast(&pDestination->z) = _mm_extract_ps(V, 2); -#elif defined(_XM_SSE_INTRINSICS_) - _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V)); - __m128 z = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - _mm_store_ss(&pDestination->z, z); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat3A -( - XMFLOAT3A* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); - assert((reinterpret_cast(pDestination) & 0xF) == 0); -#if defined(_XM_NO_INTRINSICS_) - pDestination->x = V.vector4_f32[0]; - pDestination->y = V.vector4_f32[1]; - pDestination->z = V.vector4_f32[2]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - vst1_f32_ex(reinterpret_cast(pDestination), VL, 64); -#else - vst1_f32(reinterpret_cast(pDestination), VL); -#endif - vst1q_lane_f32(reinterpret_cast(pDestination) + 2, V, 2); -#elif defined(_XM_SSE4_INTRINSICS_) - _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V)); - *reinterpret_cast(&pDestination->z) = _mm_extract_ps(V, 2); -#elif defined(_XM_SSE_INTRINSICS_) - _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V)); - __m128 z = _mm_movehl_ps(V, V); - _mm_store_ss(&pDestination->z, z); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreSInt3 -( - XMINT3* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - pDestination->x = static_cast(V.vector4_f32[0]); - pDestination->y = static_cast(V.vector4_f32[1]); - pDestination->z = static_cast(V.vector4_f32[2]); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - int32x4_t v = vcvtq_s32_f32(V); - int32x2_t vL = vget_low_s32(v); - vst1_s32(reinterpret_cast(pDestination), vL); - vst1q_lane_s32(reinterpret_cast(pDestination) + 2, v, 2); -#elif defined(_XM_SSE_INTRINSICS_) - // In case of positive overflow, detect it - XMVECTOR vOverflow = _mm_cmpgt_ps(V, g_XMMaxInt); - // Float to int conversion - __m128i vResulti = _mm_cvttps_epi32(V); - // If there was positive overflow, set to 0x7FFFFFFF - XMVECTOR vResult = _mm_and_ps(vOverflow, g_XMAbsMask); - vOverflow = _mm_andnot_ps(vOverflow, _mm_castsi128_ps(vResulti)); - vOverflow = _mm_or_ps(vOverflow, vResult); - // Write 3 uints - _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(vOverflow)); - __m128 z = XM_PERMUTE_PS(vOverflow, _MM_SHUFFLE(2, 2, 2, 2)); - _mm_store_ss(reinterpret_cast(&pDestination->z), z); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUInt3 -( - XMUINT3* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - pDestination->x = static_cast(V.vector4_f32[0]); - pDestination->y = static_cast(V.vector4_f32[1]); - pDestination->z = static_cast(V.vector4_f32[2]); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t v = vcvtq_u32_f32(V); - uint32x2_t vL = vget_low_u32(v); - vst1_u32(reinterpret_cast(pDestination), vL); - vst1q_lane_u32(reinterpret_cast(pDestination) + 2, v, 2); -#elif defined(_XM_SSE_INTRINSICS_) - // Clamp to >=0 - XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - // Any numbers that are too big, set to 0xFFFFFFFFU - XMVECTOR vOverflow = _mm_cmpgt_ps(vResult, g_XMMaxUInt); - XMVECTOR vValue = g_XMUnsignedFix; - // Too large for a signed integer? - XMVECTOR vMask = _mm_cmpge_ps(vResult, vValue); - // Zero for number's lower than 0x80000000, 32768.0f*65536.0f otherwise - vValue = _mm_and_ps(vValue, vMask); - // Perform fixup only on numbers too large (Keeps low bit precision) - vResult = _mm_sub_ps(vResult, vValue); - __m128i vResulti = _mm_cvttps_epi32(vResult); - // Convert from signed to unsigned pnly if greater than 0x80000000 - vMask = _mm_and_ps(vMask, g_XMNegativeZero); - vResult = _mm_xor_ps(_mm_castsi128_ps(vResulti), vMask); - // On those that are too large, set to 0xFFFFFFFF - vResult = _mm_or_ps(vResult, vOverflow); - // Write 3 uints - _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(vResult)); - __m128 z = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(2, 2, 2, 2)); - _mm_store_ss(reinterpret_cast(&pDestination->z), z); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreInt4 -( - uint32_t* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - pDestination[0] = V.vector4_u32[0]; - pDestination[1] = V.vector4_u32[1]; - pDestination[2] = V.vector4_u32[2]; - pDestination[3] = V.vector4_u32[3]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - vst1q_u32(pDestination, vreinterpretq_u32_f32(V)); -#elif defined(_XM_SSE_INTRINSICS_) - _mm_storeu_si128(reinterpret_cast<__m128i*>(pDestination), _mm_castps_si128(V)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreInt4A -( - uint32_t* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); - assert((reinterpret_cast(pDestination) & 0xF) == 0); -#if defined(_XM_NO_INTRINSICS_) - pDestination[0] = V.vector4_u32[0]; - pDestination[1] = V.vector4_u32[1]; - pDestination[2] = V.vector4_u32[2]; - pDestination[3] = V.vector4_u32[3]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - vst1q_u32_ex(pDestination, V, 128); -#else - vst1q_u32(pDestination, vreinterpretq_u32_f32(V)); -#endif -#elif defined(_XM_SSE_INTRINSICS_) - _mm_store_si128(reinterpret_cast<__m128i*>(pDestination), _mm_castps_si128(V)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat4 -( - XMFLOAT4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - pDestination->x = V.vector4_f32[0]; - pDestination->y = V.vector4_f32[1]; - pDestination->z = V.vector4_f32[2]; - pDestination->w = V.vector4_f32[3]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - vst1q_f32(reinterpret_cast(pDestination), V); -#elif defined(_XM_SSE_INTRINSICS_) - _mm_storeu_ps(&pDestination->x, V); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat4A -( - XMFLOAT4A* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); - assert((reinterpret_cast(pDestination) & 0xF) == 0); -#if defined(_XM_NO_INTRINSICS_) - pDestination->x = V.vector4_f32[0]; - pDestination->y = V.vector4_f32[1]; - pDestination->z = V.vector4_f32[2]; - pDestination->w = V.vector4_f32[3]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - vst1q_f32_ex(reinterpret_cast(pDestination), V, 128); -#else - vst1q_f32(reinterpret_cast(pDestination), V); -#endif -#elif defined(_XM_SSE_INTRINSICS_) - _mm_store_ps(&pDestination->x, V); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreSInt4 -( - XMINT4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - pDestination->x = static_cast(V.vector4_f32[0]); - pDestination->y = static_cast(V.vector4_f32[1]); - pDestination->z = static_cast(V.vector4_f32[2]); - pDestination->w = static_cast(V.vector4_f32[3]); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - int32x4_t v = vcvtq_s32_f32(V); - vst1q_s32(reinterpret_cast(pDestination), v); -#elif defined(_XM_SSE_INTRINSICS_) - // In case of positive overflow, detect it - XMVECTOR vOverflow = _mm_cmpgt_ps(V, g_XMMaxInt); - // Float to int conversion - __m128i vResulti = _mm_cvttps_epi32(V); - // If there was positive overflow, set to 0x7FFFFFFF - XMVECTOR vResult = _mm_and_ps(vOverflow, g_XMAbsMask); - vOverflow = _mm_andnot_ps(vOverflow, _mm_castsi128_ps(vResulti)); - vOverflow = _mm_or_ps(vOverflow, vResult); - _mm_storeu_si128(reinterpret_cast<__m128i*>(pDestination), _mm_castps_si128(vOverflow)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUInt4 -( - XMUINT4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - pDestination->x = static_cast(V.vector4_f32[0]); - pDestination->y = static_cast(V.vector4_f32[1]); - pDestination->z = static_cast(V.vector4_f32[2]); - pDestination->w = static_cast(V.vector4_f32[3]); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t v = vcvtq_u32_f32(V); - vst1q_u32(reinterpret_cast(pDestination), v); -#elif defined(_XM_SSE_INTRINSICS_) - // Clamp to >=0 - XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - // Any numbers that are too big, set to 0xFFFFFFFFU - XMVECTOR vOverflow = _mm_cmpgt_ps(vResult, g_XMMaxUInt); - XMVECTOR vValue = g_XMUnsignedFix; - // Too large for a signed integer? - XMVECTOR vMask = _mm_cmpge_ps(vResult, vValue); - // Zero for number's lower than 0x80000000, 32768.0f*65536.0f otherwise - vValue = _mm_and_ps(vValue, vMask); - // Perform fixup only on numbers too large (Keeps low bit precision) - vResult = _mm_sub_ps(vResult, vValue); - __m128i vResulti = _mm_cvttps_epi32(vResult); - // Convert from signed to unsigned pnly if greater than 0x80000000 - vMask = _mm_and_ps(vMask, g_XMNegativeZero); - vResult = _mm_xor_ps(_mm_castsi128_ps(vResulti), vMask); - // On those that are too large, set to 0xFFFFFFFF - vResult = _mm_or_ps(vResult, vOverflow); - _mm_storeu_si128(reinterpret_cast<__m128i*>(pDestination), _mm_castps_si128(vResult)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat3x3 -( - XMFLOAT3X3* pDestination, - FXMMATRIX M -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - pDestination->m[0][0] = M.r[0].vector4_f32[0]; - pDestination->m[0][1] = M.r[0].vector4_f32[1]; - pDestination->m[0][2] = M.r[0].vector4_f32[2]; - - pDestination->m[1][0] = M.r[1].vector4_f32[0]; - pDestination->m[1][1] = M.r[1].vector4_f32[1]; - pDestination->m[1][2] = M.r[1].vector4_f32[2]; - - pDestination->m[2][0] = M.r[2].vector4_f32[0]; - pDestination->m[2][1] = M.r[2].vector4_f32[1]; - pDestination->m[2][2] = M.r[2].vector4_f32[2]; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t T1 = vextq_f32(M.r[0], M.r[1], 1); - float32x4_t T2 = vbslq_f32(g_XMMask3, M.r[0], T1); - vst1q_f32(&pDestination->m[0][0], T2); - - T1 = vextq_f32(M.r[1], M.r[1], 1); - T2 = vcombine_f32(vget_low_f32(T1), vget_low_f32(M.r[2])); - vst1q_f32(&pDestination->m[1][1], T2); - - vst1q_lane_f32(&pDestination->m[2][2], M.r[2], 2); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp1 = M.r[0]; - XMVECTOR vTemp2 = M.r[1]; - XMVECTOR vTemp3 = M.r[2]; - XMVECTOR vWork = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(0, 0, 2, 2)); - vTemp1 = _mm_shuffle_ps(vTemp1, vWork, _MM_SHUFFLE(2, 0, 1, 0)); - _mm_storeu_ps(&pDestination->m[0][0], vTemp1); - vTemp2 = _mm_shuffle_ps(vTemp2, vTemp3, _MM_SHUFFLE(1, 0, 2, 1)); - _mm_storeu_ps(&pDestination->m[1][1], vTemp2); - vTemp3 = XM_PERMUTE_PS(vTemp3, _MM_SHUFFLE(2, 2, 2, 2)); - _mm_store_ss(&pDestination->m[2][2], vTemp3); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat4x3 -( - XMFLOAT4X3* pDestination, - FXMMATRIX M -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - pDestination->m[0][0] = M.r[0].vector4_f32[0]; - pDestination->m[0][1] = M.r[0].vector4_f32[1]; - pDestination->m[0][2] = M.r[0].vector4_f32[2]; - - pDestination->m[1][0] = M.r[1].vector4_f32[0]; - pDestination->m[1][1] = M.r[1].vector4_f32[1]; - pDestination->m[1][2] = M.r[1].vector4_f32[2]; - - pDestination->m[2][0] = M.r[2].vector4_f32[0]; - pDestination->m[2][1] = M.r[2].vector4_f32[1]; - pDestination->m[2][2] = M.r[2].vector4_f32[2]; - - pDestination->m[3][0] = M.r[3].vector4_f32[0]; - pDestination->m[3][1] = M.r[3].vector4_f32[1]; - pDestination->m[3][2] = M.r[3].vector4_f32[2]; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t T1 = vextq_f32(M.r[0], M.r[1], 1); - float32x4_t T2 = vbslq_f32(g_XMMask3, M.r[0], T1); - vst1q_f32(&pDestination->m[0][0], T2); - - T1 = vextq_f32(M.r[1], M.r[1], 1); - T2 = vcombine_f32(vget_low_f32(T1), vget_low_f32(M.r[2])); - vst1q_f32(&pDestination->m[1][1], T2); - - T1 = vdupq_lane_f32(vget_high_f32(M.r[2]), 0); - T2 = vextq_f32(T1, M.r[3], 3); - vst1q_f32(&pDestination->m[2][2], T2); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp1 = M.r[0]; - XMVECTOR vTemp2 = M.r[1]; - XMVECTOR vTemp3 = M.r[2]; - XMVECTOR vTemp4 = M.r[3]; - XMVECTOR vTemp2x = _mm_shuffle_ps(vTemp2, vTemp3, _MM_SHUFFLE(1, 0, 2, 1)); - vTemp2 = _mm_shuffle_ps(vTemp2, vTemp1, _MM_SHUFFLE(2, 2, 0, 0)); - vTemp1 = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(0, 2, 1, 0)); - vTemp3 = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(0, 0, 2, 2)); - vTemp3 = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 1, 2, 0)); - _mm_storeu_ps(&pDestination->m[0][0], vTemp1); - _mm_storeu_ps(&pDestination->m[1][1], vTemp2x); - _mm_storeu_ps(&pDestination->m[2][2], vTemp3); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat4x3A -( - XMFLOAT4X3A* pDestination, - FXMMATRIX M -) noexcept -{ - assert(pDestination); - assert((reinterpret_cast(pDestination) & 0xF) == 0); -#if defined(_XM_NO_INTRINSICS_) - - pDestination->m[0][0] = M.r[0].vector4_f32[0]; - pDestination->m[0][1] = M.r[0].vector4_f32[1]; - pDestination->m[0][2] = M.r[0].vector4_f32[2]; - - pDestination->m[1][0] = M.r[1].vector4_f32[0]; - pDestination->m[1][1] = M.r[1].vector4_f32[1]; - pDestination->m[1][2] = M.r[1].vector4_f32[2]; - - pDestination->m[2][0] = M.r[2].vector4_f32[0]; - pDestination->m[2][1] = M.r[2].vector4_f32[1]; - pDestination->m[2][2] = M.r[2].vector4_f32[2]; - - pDestination->m[3][0] = M.r[3].vector4_f32[0]; - pDestination->m[3][1] = M.r[3].vector4_f32[1]; - pDestination->m[3][2] = M.r[3].vector4_f32[2]; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - float32x4_t T1 = vextq_f32(M.r[0], M.r[1], 1); - float32x4_t T2 = vbslq_f32(g_XMMask3, M.r[0], T1); - vst1q_f32_ex(&pDestination->m[0][0], T2, 128); - - T1 = vextq_f32(M.r[1], M.r[1], 1); - T2 = vcombine_f32(vget_low_f32(T1), vget_low_f32(M.r[2])); - vst1q_f32_ex(&pDestination->m[1][1], T2, 128); - - T1 = vdupq_lane_f32(vget_high_f32(M.r[2]), 0); - T2 = vextq_f32(T1, M.r[3], 3); - vst1q_f32_ex(&pDestination->m[2][2], T2, 128); -#else - float32x4_t T1 = vextq_f32(M.r[0], M.r[1], 1); - float32x4_t T2 = vbslq_f32(g_XMMask3, M.r[0], T1); - vst1q_f32(&pDestination->m[0][0], T2); - - T1 = vextq_f32(M.r[1], M.r[1], 1); - T2 = vcombine_f32(vget_low_f32(T1), vget_low_f32(M.r[2])); - vst1q_f32(&pDestination->m[1][1], T2); - - T1 = vdupq_lane_f32(vget_high_f32(M.r[2]), 0); - T2 = vextq_f32(T1, M.r[3], 3); - vst1q_f32(&pDestination->m[2][2], T2); -#endif -#elif defined(_XM_SSE_INTRINSICS_) - // x1,y1,z1,w1 - XMVECTOR vTemp1 = M.r[0]; - // x2,y2,z2,w2 - XMVECTOR vTemp2 = M.r[1]; - // x3,y3,z3,w3 - XMVECTOR vTemp3 = M.r[2]; - // x4,y4,z4,w4 - XMVECTOR vTemp4 = M.r[3]; - // z1,z1,x2,y2 - XMVECTOR vTemp = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(1, 0, 2, 2)); - // y2,z2,x3,y3 (Final) - vTemp2 = _mm_shuffle_ps(vTemp2, vTemp3, _MM_SHUFFLE(1, 0, 2, 1)); - // x1,y1,z1,x2 (Final) - vTemp1 = _mm_shuffle_ps(vTemp1, vTemp, _MM_SHUFFLE(2, 0, 1, 0)); - // z3,z3,x4,x4 - vTemp3 = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(0, 0, 2, 2)); - // z3,x4,y4,z4 (Final) - vTemp3 = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 1, 2, 0)); - // Store in 3 operations - _mm_store_ps(&pDestination->m[0][0], vTemp1); - _mm_store_ps(&pDestination->m[1][1], vTemp2); - _mm_store_ps(&pDestination->m[2][2], vTemp3); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat3x4 -( - XMFLOAT3X4* pDestination, - FXMMATRIX M -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - pDestination->m[0][0] = M.r[0].vector4_f32[0]; - pDestination->m[0][1] = M.r[1].vector4_f32[0]; - pDestination->m[0][2] = M.r[2].vector4_f32[0]; - pDestination->m[0][3] = M.r[3].vector4_f32[0]; - - pDestination->m[1][0] = M.r[0].vector4_f32[1]; - pDestination->m[1][1] = M.r[1].vector4_f32[1]; - pDestination->m[1][2] = M.r[2].vector4_f32[1]; - pDestination->m[1][3] = M.r[3].vector4_f32[1]; - - pDestination->m[2][0] = M.r[0].vector4_f32[2]; - pDestination->m[2][1] = M.r[1].vector4_f32[2]; - pDestination->m[2][2] = M.r[2].vector4_f32[2]; - pDestination->m[2][3] = M.r[3].vector4_f32[2]; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4x2_t P0 = vzipq_f32(M.r[0], M.r[2]); - float32x4x2_t P1 = vzipq_f32(M.r[1], M.r[3]); - - float32x4x2_t T0 = vzipq_f32(P0.val[0], P1.val[0]); - float32x4x2_t T1 = vzipq_f32(P0.val[1], P1.val[1]); - - vst1q_f32(&pDestination->m[0][0], T0.val[0]); - vst1q_f32(&pDestination->m[1][0], T0.val[1]); - vst1q_f32(&pDestination->m[2][0], T1.val[0]); -#elif defined(_XM_SSE_INTRINSICS_) - // x.x,x.y,y.x,y.y - XMVECTOR vTemp1 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(1, 0, 1, 0)); - // x.z,x.w,y.z,y.w - XMVECTOR vTemp3 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(3, 2, 3, 2)); - // z.x,z.y,w.x,w.y - XMVECTOR vTemp2 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(1, 0, 1, 0)); - // z.z,z.w,w.z,w.w - XMVECTOR vTemp4 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(3, 2, 3, 2)); - - // x.x,y.x,z.x,w.x - XMVECTOR r0 = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(2, 0, 2, 0)); - // x.y,y.y,z.y,w.y - XMVECTOR r1 = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(3, 1, 3, 1)); - // x.z,y.z,z.z,w.z - XMVECTOR r2 = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 0, 2, 0)); - - _mm_storeu_ps(&pDestination->m[0][0], r0); - _mm_storeu_ps(&pDestination->m[1][0], r1); - _mm_storeu_ps(&pDestination->m[2][0], r2); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat3x4A -( - XMFLOAT3X4A* pDestination, - FXMMATRIX M -) noexcept -{ - assert(pDestination); - assert((reinterpret_cast(pDestination) & 0xF) == 0); -#if defined(_XM_NO_INTRINSICS_) - - pDestination->m[0][0] = M.r[0].vector4_f32[0]; - pDestination->m[0][1] = M.r[1].vector4_f32[0]; - pDestination->m[0][2] = M.r[2].vector4_f32[0]; - pDestination->m[0][3] = M.r[3].vector4_f32[0]; - - pDestination->m[1][0] = M.r[0].vector4_f32[1]; - pDestination->m[1][1] = M.r[1].vector4_f32[1]; - pDestination->m[1][2] = M.r[2].vector4_f32[1]; - pDestination->m[1][3] = M.r[3].vector4_f32[1]; - - pDestination->m[2][0] = M.r[0].vector4_f32[2]; - pDestination->m[2][1] = M.r[1].vector4_f32[2]; - pDestination->m[2][2] = M.r[2].vector4_f32[2]; - pDestination->m[2][3] = M.r[3].vector4_f32[2]; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4x2_t P0 = vzipq_f32(M.r[0], M.r[2]); - float32x4x2_t P1 = vzipq_f32(M.r[1], M.r[3]); - - float32x4x2_t T0 = vzipq_f32(P0.val[0], P1.val[0]); - float32x4x2_t T1 = vzipq_f32(P0.val[1], P1.val[1]); - -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - vst1q_f32_ex(&pDestination->m[0][0], T0.val[0], 128); - vst1q_f32_ex(&pDestination->m[1][0], T0.val[1], 128); - vst1q_f32_ex(&pDestination->m[2][0], T1.val[0], 128); -#else - vst1q_f32(&pDestination->m[0][0], T0.val[0]); - vst1q_f32(&pDestination->m[1][0], T0.val[1]); - vst1q_f32(&pDestination->m[2][0], T1.val[0]); -#endif -#elif defined(_XM_SSE_INTRINSICS_) - // x.x,x.y,y.x,y.y - XMVECTOR vTemp1 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(1, 0, 1, 0)); - // x.z,x.w,y.z,y.w - XMVECTOR vTemp3 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(3, 2, 3, 2)); - // z.x,z.y,w.x,w.y - XMVECTOR vTemp2 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(1, 0, 1, 0)); - // z.z,z.w,w.z,w.w - XMVECTOR vTemp4 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(3, 2, 3, 2)); - - // x.x,y.x,z.x,w.x - XMVECTOR r0 = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(2, 0, 2, 0)); - // x.y,y.y,z.y,w.y - XMVECTOR r1 = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(3, 1, 3, 1)); - // x.z,y.z,z.z,w.z - XMVECTOR r2 = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 0, 2, 0)); - - _mm_store_ps(&pDestination->m[0][0], r0); - _mm_store_ps(&pDestination->m[1][0], r1); - _mm_store_ps(&pDestination->m[2][0], r2); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat4x4 -( - XMFLOAT4X4* pDestination, - FXMMATRIX M -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - pDestination->m[0][0] = M.r[0].vector4_f32[0]; - pDestination->m[0][1] = M.r[0].vector4_f32[1]; - pDestination->m[0][2] = M.r[0].vector4_f32[2]; - pDestination->m[0][3] = M.r[0].vector4_f32[3]; - - pDestination->m[1][0] = M.r[1].vector4_f32[0]; - pDestination->m[1][1] = M.r[1].vector4_f32[1]; - pDestination->m[1][2] = M.r[1].vector4_f32[2]; - pDestination->m[1][3] = M.r[1].vector4_f32[3]; - - pDestination->m[2][0] = M.r[2].vector4_f32[0]; - pDestination->m[2][1] = M.r[2].vector4_f32[1]; - pDestination->m[2][2] = M.r[2].vector4_f32[2]; - pDestination->m[2][3] = M.r[2].vector4_f32[3]; - - pDestination->m[3][0] = M.r[3].vector4_f32[0]; - pDestination->m[3][1] = M.r[3].vector4_f32[1]; - pDestination->m[3][2] = M.r[3].vector4_f32[2]; - pDestination->m[3][3] = M.r[3].vector4_f32[3]; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - vst1q_f32(reinterpret_cast(&pDestination->_11), M.r[0]); - vst1q_f32(reinterpret_cast(&pDestination->_21), M.r[1]); - vst1q_f32(reinterpret_cast(&pDestination->_31), M.r[2]); - vst1q_f32(reinterpret_cast(&pDestination->_41), M.r[3]); -#elif defined(_XM_SSE_INTRINSICS_) - _mm_storeu_ps(&pDestination->_11, M.r[0]); - _mm_storeu_ps(&pDestination->_21, M.r[1]); - _mm_storeu_ps(&pDestination->_31, M.r[2]); - _mm_storeu_ps(&pDestination->_41, M.r[3]); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat4x4A -( - XMFLOAT4X4A* pDestination, - FXMMATRIX M -) noexcept -{ - assert(pDestination); - assert((reinterpret_cast(pDestination) & 0xF) == 0); -#if defined(_XM_NO_INTRINSICS_) - - pDestination->m[0][0] = M.r[0].vector4_f32[0]; - pDestination->m[0][1] = M.r[0].vector4_f32[1]; - pDestination->m[0][2] = M.r[0].vector4_f32[2]; - pDestination->m[0][3] = M.r[0].vector4_f32[3]; - - pDestination->m[1][0] = M.r[1].vector4_f32[0]; - pDestination->m[1][1] = M.r[1].vector4_f32[1]; - pDestination->m[1][2] = M.r[1].vector4_f32[2]; - pDestination->m[1][3] = M.r[1].vector4_f32[3]; - - pDestination->m[2][0] = M.r[2].vector4_f32[0]; - pDestination->m[2][1] = M.r[2].vector4_f32[1]; - pDestination->m[2][2] = M.r[2].vector4_f32[2]; - pDestination->m[2][3] = M.r[2].vector4_f32[3]; - - pDestination->m[3][0] = M.r[3].vector4_f32[0]; - pDestination->m[3][1] = M.r[3].vector4_f32[1]; - pDestination->m[3][2] = M.r[3].vector4_f32[2]; - pDestination->m[3][3] = M.r[3].vector4_f32[3]; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - vst1q_f32_ex(reinterpret_cast(&pDestination->_11), M.r[0], 128); - vst1q_f32_ex(reinterpret_cast(&pDestination->_21), M.r[1], 128); - vst1q_f32_ex(reinterpret_cast(&pDestination->_31), M.r[2], 128); - vst1q_f32_ex(reinterpret_cast(&pDestination->_41), M.r[3], 128); -#else - vst1q_f32(reinterpret_cast(&pDestination->_11), M.r[0]); - vst1q_f32(reinterpret_cast(&pDestination->_21), M.r[1]); - vst1q_f32(reinterpret_cast(&pDestination->_31), M.r[2]); - vst1q_f32(reinterpret_cast(&pDestination->_41), M.r[3]); -#endif -#elif defined(_XM_SSE_INTRINSICS_) - _mm_store_ps(&pDestination->_11, M.r[0]); - _mm_store_ps(&pDestination->_21, M.r[1]); - _mm_store_ps(&pDestination->_31, M.r[2]); - _mm_store_ps(&pDestination->_41, M.r[3]); -#endif -} - +//------------------------------------------------------------------------------------- +// DirectXMathConvert.inl -- SIMD C++ Math library +// +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +// +// http://go.microsoft.com/fwlink/?LinkID=615560 +//------------------------------------------------------------------------------------- + +#pragma once + +/**************************************************************************** + * + * Data conversion + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable:4701) +// C4701: false positives +#endif + +inline XMVECTOR XM_CALLCONV XMConvertVectorIntToFloat +( + FXMVECTOR VInt, + uint32_t DivExponent +) noexcept +{ + assert(DivExponent < 32); +#if defined(_XM_NO_INTRINSICS_) + float fScale = 1.0f / static_cast(1U << DivExponent); + uint32_t ElementIndex = 0; + XMVECTOR Result; + do + { + auto iTemp = static_cast(VInt.vector4_u32[ElementIndex]); + Result.vector4_f32[ElementIndex] = static_cast(iTemp)* fScale; + } + while (++ElementIndex < 4); + return Result; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float fScale = 1.0f / static_cast(1U << DivExponent); + float32x4_t vResult = vcvtq_f32_s32(vreinterpretq_s32_f32(VInt)); + return vmulq_n_f32(vResult, fScale); +#else // _XM_SSE_INTRINSICS_ + // Convert to floats + XMVECTOR vResult = _mm_cvtepi32_ps(_mm_castps_si128(VInt)); + // Convert DivExponent into 1.0f/(1<(uScale)); + vResult = _mm_mul_ps(vResult, _mm_castsi128_ps(vScale)); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMConvertVectorFloatToInt +( + FXMVECTOR VFloat, + uint32_t MulExponent +) noexcept +{ + assert(MulExponent < 32); +#if defined(_XM_NO_INTRINSICS_) + // Get the scalar factor. + auto fScale = static_cast(1U << MulExponent); + uint32_t ElementIndex = 0; + XMVECTOR Result; + do + { + int32_t iResult; + float fTemp = VFloat.vector4_f32[ElementIndex] * fScale; + if (fTemp <= -(65536.0f * 32768.0f)) + { + iResult = (-0x7FFFFFFF) - 1; + } + else if (fTemp > (65536.0f * 32768.0f) - 128.0f) + { + iResult = 0x7FFFFFFF; + } + else + { + iResult = static_cast(fTemp); + } + Result.vector4_u32[ElementIndex] = static_cast(iResult); + } + while (++ElementIndex < 4); + return Result; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t vResult = vmulq_n_f32(VFloat, static_cast(1U << MulExponent)); + // In case of positive overflow, detect it + uint32x4_t vOverflow = vcgtq_f32(vResult, g_XMMaxInt); + // Float to int conversion + int32x4_t vResulti = vcvtq_s32_f32(vResult); + // If there was positive overflow, set to 0x7FFFFFFF + vResult = vreinterpretq_f32_u32(vandq_u32(vOverflow, g_XMAbsMask)); + vOverflow = vbicq_u32(vreinterpretq_u32_s32(vResulti), vOverflow); + vOverflow = vorrq_u32(vOverflow, vreinterpretq_u32_f32(vResult)); + return vreinterpretq_f32_u32(vOverflow); +#else // _XM_SSE_INTRINSICS_ + XMVECTOR vResult = _mm_set_ps1(static_cast(1U << MulExponent)); + vResult = _mm_mul_ps(vResult, VFloat); + // In case of positive overflow, detect it + XMVECTOR vOverflow = _mm_cmpgt_ps(vResult, g_XMMaxInt); + // Float to int conversion + __m128i vResulti = _mm_cvttps_epi32(vResult); + // If there was positive overflow, set to 0x7FFFFFFF + vResult = _mm_and_ps(vOverflow, g_XMAbsMask); + vOverflow = _mm_andnot_ps(vOverflow, _mm_castsi128_ps(vResulti)); + vOverflow = _mm_or_ps(vOverflow, vResult); + return vOverflow; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMConvertVectorUIntToFloat +( + FXMVECTOR VUInt, + uint32_t DivExponent +) noexcept +{ + assert(DivExponent < 32); +#if defined(_XM_NO_INTRINSICS_) + float fScale = 1.0f / static_cast(1U << DivExponent); + uint32_t ElementIndex = 0; + XMVECTOR Result; + do + { + Result.vector4_f32[ElementIndex] = static_cast(VUInt.vector4_u32[ElementIndex])* fScale; + } + while (++ElementIndex < 4); + return Result; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float fScale = 1.0f / static_cast(1U << DivExponent); + float32x4_t vResult = vcvtq_f32_u32(vreinterpretq_u32_f32(VUInt)); + return vmulq_n_f32(vResult, fScale); +#else // _XM_SSE_INTRINSICS_ + // For the values that are higher than 0x7FFFFFFF, a fixup is needed + // Determine which ones need the fix. + XMVECTOR vMask = _mm_and_ps(VUInt, g_XMNegativeZero); + // Force all values positive + XMVECTOR vResult = _mm_xor_ps(VUInt, vMask); + // Convert to floats + vResult = _mm_cvtepi32_ps(_mm_castps_si128(vResult)); + // Convert 0x80000000 -> 0xFFFFFFFF + __m128i iMask = _mm_srai_epi32(_mm_castps_si128(vMask), 31); + // For only the ones that are too big, add the fixup + vMask = _mm_and_ps(_mm_castsi128_ps(iMask), g_XMFixUnsigned); + vResult = _mm_add_ps(vResult, vMask); + // Convert DivExponent into 1.0f/(1<(uScale)); + vResult = _mm_mul_ps(vResult, _mm_castsi128_ps(iMask)); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMConvertVectorFloatToUInt +( + FXMVECTOR VFloat, + uint32_t MulExponent +) noexcept +{ + assert(MulExponent < 32); +#if defined(_XM_NO_INTRINSICS_) + // Get the scalar factor. + auto fScale = static_cast(1U << MulExponent); + uint32_t ElementIndex = 0; + XMVECTOR Result; + do + { + uint32_t uResult; + float fTemp = VFloat.vector4_f32[ElementIndex] * fScale; + if (fTemp <= 0.0f) + { + uResult = 0; + } + else if (fTemp >= (65536.0f * 65536.0f)) + { + uResult = 0xFFFFFFFFU; + } + else + { + uResult = static_cast(fTemp); + } + Result.vector4_u32[ElementIndex] = uResult; + } + while (++ElementIndex < 4); + return Result; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t vResult = vmulq_n_f32(VFloat, static_cast(1U << MulExponent)); + // In case of overflow, detect it + uint32x4_t vOverflow = vcgtq_f32(vResult, g_XMMaxUInt); + // Float to int conversion + uint32x4_t vResulti = vcvtq_u32_f32(vResult); + // If there was overflow, set to 0xFFFFFFFFU + vResult = vreinterpretq_f32_u32(vbicq_u32(vResulti, vOverflow)); + vOverflow = vorrq_u32(vOverflow, vreinterpretq_u32_f32(vResult)); + return vreinterpretq_f32_u32(vOverflow); +#else // _XM_SSE_INTRINSICS_ + XMVECTOR vResult = _mm_set_ps1(static_cast(1U << MulExponent)); + vResult = _mm_mul_ps(vResult, VFloat); + // Clamp to >=0 + vResult = _mm_max_ps(vResult, g_XMZero); + // Any numbers that are too big, set to 0xFFFFFFFFU + XMVECTOR vOverflow = _mm_cmpgt_ps(vResult, g_XMMaxUInt); + XMVECTOR vValue = g_XMUnsignedFix; + // Too large for a signed integer? + XMVECTOR vMask = _mm_cmpge_ps(vResult, vValue); + // Zero for number's lower than 0x80000000, 32768.0f*65536.0f otherwise + vValue = _mm_and_ps(vValue, vMask); + // Perform fixup only on numbers too large (Keeps low bit precision) + vResult = _mm_sub_ps(vResult, vValue); + __m128i vResulti = _mm_cvttps_epi32(vResult); + // Convert from signed to unsigned pnly if greater than 0x80000000 + vMask = _mm_and_ps(vMask, g_XMNegativeZero); + vResult = _mm_xor_ps(_mm_castsi128_ps(vResulti), vMask); + // On those that are too large, set to 0xFFFFFFFF + vResult = _mm_or_ps(vResult, vOverflow); + return vResult; +#endif +} + +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +/**************************************************************************** + * + * Vector and matrix load operations + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadInt(const uint32_t* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR V; + V.vector4_u32[0] = *pSource; + V.vector4_u32[1] = 0; + V.vector4_u32[2] = 0; + V.vector4_u32[3] = 0; + return V; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t zero = vdupq_n_u32(0); + return vreinterpretq_f32_u32(vld1q_lane_u32(pSource, zero, 0)); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_load_ss(reinterpret_cast(pSource)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadFloat(const float* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR V; + V.vector4_f32[0] = *pSource; + V.vector4_f32[1] = 0.f; + V.vector4_f32[2] = 0.f; + V.vector4_f32[3] = 0.f; + return V; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t zero = vdupq_n_f32(0); + return vld1q_lane_f32(pSource, zero, 0); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_load_ss(pSource); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadInt2(const uint32_t* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR V; + V.vector4_u32[0] = pSource[0]; + V.vector4_u32[1] = pSource[1]; + V.vector4_u32[2] = 0; + V.vector4_u32[3] = 0; + return V; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t x = vld1_u32(pSource); + uint32x2_t zero = vdup_n_u32(0); + return vreinterpretq_f32_u32(vcombine_u32(x, zero)); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadInt2A(const uint32_t* pSource) noexcept +{ + assert(pSource); + assert((reinterpret_cast(pSource) & 0xF) == 0); +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR V; + V.vector4_u32[0] = pSource[0]; + V.vector4_u32[1] = pSource[1]; + V.vector4_u32[2] = 0; + V.vector4_u32[3] = 0; + return V; +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + uint32x2_t x = vld1_u32_ex(pSource, 64); +#else + uint32x2_t x = vld1_u32(pSource); +#endif + uint32x2_t zero = vdup_n_u32(0); + return vreinterpretq_f32_u32(vcombine_u32(x, zero)); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadFloat2(const XMFLOAT2* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR V; + V.vector4_f32[0] = pSource->x; + V.vector4_f32[1] = pSource->y; + V.vector4_f32[2] = 0.f; + V.vector4_f32[3] = 0.f; + return V; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t x = vld1_f32(reinterpret_cast(pSource)); + float32x2_t zero = vdup_n_f32(0); + return vcombine_f32(x, zero); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadFloat2A(const XMFLOAT2A* pSource) noexcept +{ + assert(pSource); + assert((reinterpret_cast(pSource) & 0xF) == 0); +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR V; + V.vector4_f32[0] = pSource->x; + V.vector4_f32[1] = pSource->y; + V.vector4_f32[2] = 0.f; + V.vector4_f32[3] = 0.f; + return V; +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + float32x2_t x = vld1_f32_ex(reinterpret_cast(pSource), 64); +#else + float32x2_t x = vld1_f32(reinterpret_cast(pSource)); +#endif + float32x2_t zero = vdup_n_f32(0); + return vcombine_f32(x, zero); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadSInt2(const XMINT2* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR V; + V.vector4_f32[0] = static_cast(pSource->x); + V.vector4_f32[1] = static_cast(pSource->y); + V.vector4_f32[2] = 0.f; + V.vector4_f32[3] = 0.f; + return V; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + int32x2_t x = vld1_s32(reinterpret_cast(pSource)); + float32x2_t v = vcvt_f32_s32(x); + float32x2_t zero = vdup_n_f32(0); + return vcombine_f32(v, zero); +#elif defined(_XM_SSE_INTRINSICS_) + __m128 V = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); + return _mm_cvtepi32_ps(_mm_castps_si128(V)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadUInt2(const XMUINT2* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR V; + V.vector4_f32[0] = static_cast(pSource->x); + V.vector4_f32[1] = static_cast(pSource->y); + V.vector4_f32[2] = 0.f; + V.vector4_f32[3] = 0.f; + return V; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t x = vld1_u32(reinterpret_cast(pSource)); + float32x2_t v = vcvt_f32_u32(x); + float32x2_t zero = vdup_n_f32(0); + return vcombine_f32(v, zero); +#elif defined(_XM_SSE_INTRINSICS_) + __m128 V = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); + // For the values that are higher than 0x7FFFFFFF, a fixup is needed + // Determine which ones need the fix. + XMVECTOR vMask = _mm_and_ps(V, g_XMNegativeZero); + // Force all values positive + XMVECTOR vResult = _mm_xor_ps(V, vMask); + // Convert to floats + vResult = _mm_cvtepi32_ps(_mm_castps_si128(vResult)); + // Convert 0x80000000 -> 0xFFFFFFFF + __m128i iMask = _mm_srai_epi32(_mm_castps_si128(vMask), 31); + // For only the ones that are too big, add the fixup + vMask = _mm_and_ps(_mm_castsi128_ps(iMask), g_XMFixUnsigned); + vResult = _mm_add_ps(vResult, vMask); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadInt3(const uint32_t* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR V; + V.vector4_u32[0] = pSource[0]; + V.vector4_u32[1] = pSource[1]; + V.vector4_u32[2] = pSource[2]; + V.vector4_u32[3] = 0; + return V; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t x = vld1_u32(pSource); + uint32x2_t zero = vdup_n_u32(0); + uint32x2_t y = vld1_lane_u32(pSource + 2, zero, 0); + return vreinterpretq_f32_u32(vcombine_u32(x, y)); +#elif defined(_XM_SSE4_INTRINSICS_) + __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); + __m128 z = _mm_load_ss(reinterpret_cast(pSource + 2)); + return _mm_insert_ps(xy, z, 0x20); +#elif defined(_XM_SSE_INTRINSICS_) + __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); + __m128 z = _mm_load_ss(reinterpret_cast(pSource + 2)); + return _mm_movelh_ps(xy, z); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadInt3A(const uint32_t* pSource) noexcept +{ + assert(pSource); + assert((reinterpret_cast(pSource) & 0xF) == 0); +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR V; + V.vector4_u32[0] = pSource[0]; + V.vector4_u32[1] = pSource[1]; + V.vector4_u32[2] = pSource[2]; + V.vector4_u32[3] = 0; + return V; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Reads an extra integer which is zero'd +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + uint32x4_t V = vld1q_u32_ex(pSource, 128); +#else + uint32x4_t V = vld1q_u32(pSource); +#endif + return vreinterpretq_f32_u32(vsetq_lane_u32(0, V, 3)); +#elif defined(_XM_SSE4_INTRINSICS_) + __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); + __m128 z = _mm_load_ss(reinterpret_cast(pSource + 2)); + return _mm_insert_ps(xy, z, 0x20); +#elif defined(_XM_SSE_INTRINSICS_) + __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); + __m128 z = _mm_load_ss(reinterpret_cast(pSource + 2)); + return _mm_movelh_ps(xy, z); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadFloat3(const XMFLOAT3* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR V; + V.vector4_f32[0] = pSource->x; + V.vector4_f32[1] = pSource->y; + V.vector4_f32[2] = pSource->z; + V.vector4_f32[3] = 0.f; + return V; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t x = vld1_f32(reinterpret_cast(pSource)); + float32x2_t zero = vdup_n_f32(0); + float32x2_t y = vld1_lane_f32(reinterpret_cast(pSource) + 2, zero, 0); + return vcombine_f32(x, y); +#elif defined(_XM_SSE4_INTRINSICS_) + __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); + __m128 z = _mm_load_ss(&pSource->z); + return _mm_insert_ps(xy, z, 0x20); +#elif defined(_XM_SSE_INTRINSICS_) + __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); + __m128 z = _mm_load_ss(&pSource->z); + return _mm_movelh_ps(xy, z); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadFloat3A(const XMFLOAT3A* pSource) noexcept +{ + assert(pSource); + assert((reinterpret_cast(pSource) & 0xF) == 0); +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR V; + V.vector4_f32[0] = pSource->x; + V.vector4_f32[1] = pSource->y; + V.vector4_f32[2] = pSource->z; + V.vector4_f32[3] = 0.f; + return V; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Reads an extra float which is zero'd +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + float32x4_t V = vld1q_f32_ex(reinterpret_cast(pSource), 128); +#else + float32x4_t V = vld1q_f32(reinterpret_cast(pSource)); +#endif + return vsetq_lane_f32(0, V, 3); +#elif defined(_XM_SSE_INTRINSICS_) + // Reads an extra float which is zero'd + __m128 V = _mm_load_ps(&pSource->x); + return _mm_and_ps(V, g_XMMask3); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadSInt3(const XMINT3* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR V; + V.vector4_f32[0] = static_cast(pSource->x); + V.vector4_f32[1] = static_cast(pSource->y); + V.vector4_f32[2] = static_cast(pSource->z); + V.vector4_f32[3] = 0.f; + return V; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + int32x2_t x = vld1_s32(reinterpret_cast(pSource)); + int32x2_t zero = vdup_n_s32(0); + int32x2_t y = vld1_lane_s32(reinterpret_cast(pSource) + 2, zero, 0); + int32x4_t v = vcombine_s32(x, y); + return vcvtq_f32_s32(v); +#elif defined(_XM_SSE_INTRINSICS_) + __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); + __m128 z = _mm_load_ss(reinterpret_cast(&pSource->z)); + __m128 V = _mm_movelh_ps(xy, z); + return _mm_cvtepi32_ps(_mm_castps_si128(V)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadUInt3(const XMUINT3* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR V; + V.vector4_f32[0] = static_cast(pSource->x); + V.vector4_f32[1] = static_cast(pSource->y); + V.vector4_f32[2] = static_cast(pSource->z); + V.vector4_f32[3] = 0.f; + return V; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t x = vld1_u32(reinterpret_cast(pSource)); + uint32x2_t zero = vdup_n_u32(0); + uint32x2_t y = vld1_lane_u32(reinterpret_cast(pSource) + 2, zero, 0); + uint32x4_t v = vcombine_u32(x, y); + return vcvtq_f32_u32(v); +#elif defined(_XM_SSE_INTRINSICS_) + __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pSource))); + __m128 z = _mm_load_ss(reinterpret_cast(&pSource->z)); + __m128 V = _mm_movelh_ps(xy, z); + // For the values that are higher than 0x7FFFFFFF, a fixup is needed + // Determine which ones need the fix. + XMVECTOR vMask = _mm_and_ps(V, g_XMNegativeZero); + // Force all values positive + XMVECTOR vResult = _mm_xor_ps(V, vMask); + // Convert to floats + vResult = _mm_cvtepi32_ps(_mm_castps_si128(vResult)); + // Convert 0x80000000 -> 0xFFFFFFFF + __m128i iMask = _mm_srai_epi32(_mm_castps_si128(vMask), 31); + // For only the ones that are too big, add the fixup + vMask = _mm_and_ps(_mm_castsi128_ps(iMask), g_XMFixUnsigned); + vResult = _mm_add_ps(vResult, vMask); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadInt4(const uint32_t* pSource) noexcept +{ + assert(pSource); + +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR V; + V.vector4_u32[0] = pSource[0]; + V.vector4_u32[1] = pSource[1]; + V.vector4_u32[2] = pSource[2]; + V.vector4_u32[3] = pSource[3]; + return V; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vld1q_u32(pSource)); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i V = _mm_loadu_si128(reinterpret_cast(pSource)); + return _mm_castsi128_ps(V); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadInt4A(const uint32_t* pSource) noexcept +{ + assert(pSource); + assert((reinterpret_cast(pSource) & 0xF) == 0); +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR V; + V.vector4_u32[0] = pSource[0]; + V.vector4_u32[1] = pSource[1]; + V.vector4_u32[2] = pSource[2]; + V.vector4_u32[3] = pSource[3]; + return V; +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + return vld1q_u32_ex(pSource, 128); +#else + return vreinterpretq_f32_u32(vld1q_u32(pSource)); +#endif +#elif defined(_XM_SSE_INTRINSICS_) + __m128i V = _mm_load_si128(reinterpret_cast(pSource)); + return _mm_castsi128_ps(V); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadFloat4(const XMFLOAT4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR V; + V.vector4_f32[0] = pSource->x; + V.vector4_f32[1] = pSource->y; + V.vector4_f32[2] = pSource->z; + V.vector4_f32[3] = pSource->w; + return V; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vld1q_f32(reinterpret_cast(pSource)); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_loadu_ps(&pSource->x); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadFloat4A(const XMFLOAT4A* pSource) noexcept +{ + assert(pSource); + assert((reinterpret_cast(pSource) & 0xF) == 0); +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR V; + V.vector4_f32[0] = pSource->x; + V.vector4_f32[1] = pSource->y; + V.vector4_f32[2] = pSource->z; + V.vector4_f32[3] = pSource->w; + return V; +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + return vld1q_f32_ex(reinterpret_cast(pSource), 128); +#else + return vld1q_f32(reinterpret_cast(pSource)); +#endif +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_load_ps(&pSource->x); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadSInt4(const XMINT4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR V; + V.vector4_f32[0] = static_cast(pSource->x); + V.vector4_f32[1] = static_cast(pSource->y); + V.vector4_f32[2] = static_cast(pSource->z); + V.vector4_f32[3] = static_cast(pSource->w); + return V; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + int32x4_t v = vld1q_s32(reinterpret_cast(pSource)); + return vcvtq_f32_s32(v); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i V = _mm_loadu_si128(reinterpret_cast(pSource)); + return _mm_cvtepi32_ps(V); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadUInt4(const XMUINT4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR V; + V.vector4_f32[0] = static_cast(pSource->x); + V.vector4_f32[1] = static_cast(pSource->y); + V.vector4_f32[2] = static_cast(pSource->z); + V.vector4_f32[3] = static_cast(pSource->w); + return V; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t v = vld1q_u32(reinterpret_cast(pSource)); + return vcvtq_f32_u32(v); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i V = _mm_loadu_si128(reinterpret_cast(pSource)); + // For the values that are higher than 0x7FFFFFFF, a fixup is needed + // Determine which ones need the fix. + XMVECTOR vMask = _mm_and_ps(_mm_castsi128_ps(V), g_XMNegativeZero); + // Force all values positive + XMVECTOR vResult = _mm_xor_ps(_mm_castsi128_ps(V), vMask); + // Convert to floats + vResult = _mm_cvtepi32_ps(_mm_castps_si128(vResult)); + // Convert 0x80000000 -> 0xFFFFFFFF + __m128i iMask = _mm_srai_epi32(_mm_castps_si128(vMask), 31); + // For only the ones that are too big, add the fixup + vMask = _mm_and_ps(_mm_castsi128_ps(iMask), g_XMFixUnsigned); + vResult = _mm_add_ps(vResult, vMask); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMMATRIX XM_CALLCONV XMLoadFloat3x3(const XMFLOAT3X3* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + + XMMATRIX M; + M.r[0].vector4_f32[0] = pSource->m[0][0]; + M.r[0].vector4_f32[1] = pSource->m[0][1]; + M.r[0].vector4_f32[2] = pSource->m[0][2]; + M.r[0].vector4_f32[3] = 0.0f; + + M.r[1].vector4_f32[0] = pSource->m[1][0]; + M.r[1].vector4_f32[1] = pSource->m[1][1]; + M.r[1].vector4_f32[2] = pSource->m[1][2]; + M.r[1].vector4_f32[3] = 0.0f; + + M.r[2].vector4_f32[0] = pSource->m[2][0]; + M.r[2].vector4_f32[1] = pSource->m[2][1]; + M.r[2].vector4_f32[2] = pSource->m[2][2]; + M.r[2].vector4_f32[3] = 0.0f; + M.r[3].vector4_f32[0] = 0.0f; + M.r[3].vector4_f32[1] = 0.0f; + M.r[3].vector4_f32[2] = 0.0f; + M.r[3].vector4_f32[3] = 1.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t v0 = vld1q_f32(&pSource->m[0][0]); + float32x4_t v1 = vld1q_f32(&pSource->m[1][1]); + float32x2_t v2 = vcreate_f32(static_cast(*reinterpret_cast(&pSource->m[2][2]))); + float32x4_t T = vextq_f32(v0, v1, 3); + + XMMATRIX M; + M.r[0] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(v0), g_XMMask3)); + M.r[1] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T), g_XMMask3)); + M.r[2] = vcombine_f32(vget_high_f32(v1), v2); + M.r[3] = g_XMIdentityR3; + return M; +#elif defined(_XM_SSE_INTRINSICS_) + __m128 Z = _mm_setzero_ps(); + + __m128 V1 = _mm_loadu_ps(&pSource->m[0][0]); + __m128 V2 = _mm_loadu_ps(&pSource->m[1][1]); + __m128 V3 = _mm_load_ss(&pSource->m[2][2]); + + __m128 T1 = _mm_unpackhi_ps(V1, Z); + __m128 T2 = _mm_unpacklo_ps(V2, Z); + __m128 T3 = _mm_shuffle_ps(V3, T2, _MM_SHUFFLE(0, 1, 0, 0)); + __m128 T4 = _mm_movehl_ps(T2, T3); + __m128 T5 = _mm_movehl_ps(Z, T1); + + XMMATRIX M; + M.r[0] = _mm_movelh_ps(V1, T1); + M.r[1] = _mm_add_ps(T4, T5); + M.r[2] = _mm_shuffle_ps(V2, V3, _MM_SHUFFLE(1, 0, 3, 2)); + M.r[3] = g_XMIdentityR3; + return M; +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMMATRIX XM_CALLCONV XMLoadFloat4x3(const XMFLOAT4X3* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + + XMMATRIX M; + M.r[0].vector4_f32[0] = pSource->m[0][0]; + M.r[0].vector4_f32[1] = pSource->m[0][1]; + M.r[0].vector4_f32[2] = pSource->m[0][2]; + M.r[0].vector4_f32[3] = 0.0f; + + M.r[1].vector4_f32[0] = pSource->m[1][0]; + M.r[1].vector4_f32[1] = pSource->m[1][1]; + M.r[1].vector4_f32[2] = pSource->m[1][2]; + M.r[1].vector4_f32[3] = 0.0f; + + M.r[2].vector4_f32[0] = pSource->m[2][0]; + M.r[2].vector4_f32[1] = pSource->m[2][1]; + M.r[2].vector4_f32[2] = pSource->m[2][2]; + M.r[2].vector4_f32[3] = 0.0f; + + M.r[3].vector4_f32[0] = pSource->m[3][0]; + M.r[3].vector4_f32[1] = pSource->m[3][1]; + M.r[3].vector4_f32[2] = pSource->m[3][2]; + M.r[3].vector4_f32[3] = 1.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t v0 = vld1q_f32(&pSource->m[0][0]); + float32x4_t v1 = vld1q_f32(&pSource->m[1][1]); + float32x4_t v2 = vld1q_f32(&pSource->m[2][2]); + + float32x4_t T1 = vextq_f32(v0, v1, 3); + float32x4_t T2 = vcombine_f32(vget_high_f32(v1), vget_low_f32(v2)); + float32x4_t T3 = vextq_f32(v2, v2, 1); + + XMMATRIX M; + M.r[0] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(v0), g_XMMask3)); + M.r[1] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T1), g_XMMask3)); + M.r[2] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T2), g_XMMask3)); + M.r[3] = vsetq_lane_f32(1.f, T3, 3); + return M; +#elif defined(_XM_SSE_INTRINSICS_) + // Use unaligned load instructions to + // load the 12 floats + // vTemp1 = x1,y1,z1,x2 + XMVECTOR vTemp1 = _mm_loadu_ps(&pSource->m[0][0]); + // vTemp2 = y2,z2,x3,y3 + XMVECTOR vTemp2 = _mm_loadu_ps(&pSource->m[1][1]); + // vTemp4 = z3,x4,y4,z4 + XMVECTOR vTemp4 = _mm_loadu_ps(&pSource->m[2][2]); + // vTemp3 = x3,y3,z3,z3 + XMVECTOR vTemp3 = _mm_shuffle_ps(vTemp2, vTemp4, _MM_SHUFFLE(0, 0, 3, 2)); + // vTemp2 = y2,z2,x2,x2 + vTemp2 = _mm_shuffle_ps(vTemp2, vTemp1, _MM_SHUFFLE(3, 3, 1, 0)); + // vTemp2 = x2,y2,z2,z2 + vTemp2 = XM_PERMUTE_PS(vTemp2, _MM_SHUFFLE(1, 1, 0, 2)); + // vTemp1 = x1,y1,z1,0 + vTemp1 = _mm_and_ps(vTemp1, g_XMMask3); + // vTemp2 = x2,y2,z2,0 + vTemp2 = _mm_and_ps(vTemp2, g_XMMask3); + // vTemp3 = x3,y3,z3,0 + vTemp3 = _mm_and_ps(vTemp3, g_XMMask3); + // vTemp4i = x4,y4,z4,0 + __m128i vTemp4i = _mm_srli_si128(_mm_castps_si128(vTemp4), 32 / 8); + // vTemp4i = x4,y4,z4,1.0f + vTemp4i = _mm_or_si128(vTemp4i, g_XMIdentityR3); + XMMATRIX M(vTemp1, + vTemp2, + vTemp3, + _mm_castsi128_ps(vTemp4i)); + return M; +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMMATRIX XM_CALLCONV XMLoadFloat4x3A(const XMFLOAT4X3A* pSource) noexcept +{ + assert(pSource); + assert((reinterpret_cast(pSource) & 0xF) == 0); +#if defined(_XM_NO_INTRINSICS_) + + XMMATRIX M; + M.r[0].vector4_f32[0] = pSource->m[0][0]; + M.r[0].vector4_f32[1] = pSource->m[0][1]; + M.r[0].vector4_f32[2] = pSource->m[0][2]; + M.r[0].vector4_f32[3] = 0.0f; + + M.r[1].vector4_f32[0] = pSource->m[1][0]; + M.r[1].vector4_f32[1] = pSource->m[1][1]; + M.r[1].vector4_f32[2] = pSource->m[1][2]; + M.r[1].vector4_f32[3] = 0.0f; + + M.r[2].vector4_f32[0] = pSource->m[2][0]; + M.r[2].vector4_f32[1] = pSource->m[2][1]; + M.r[2].vector4_f32[2] = pSource->m[2][2]; + M.r[2].vector4_f32[3] = 0.0f; + + M.r[3].vector4_f32[0] = pSource->m[3][0]; + M.r[3].vector4_f32[1] = pSource->m[3][1]; + M.r[3].vector4_f32[2] = pSource->m[3][2]; + M.r[3].vector4_f32[3] = 1.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + float32x4_t v0 = vld1q_f32_ex(&pSource->m[0][0], 128); + float32x4_t v1 = vld1q_f32_ex(&pSource->m[1][1], 128); + float32x4_t v2 = vld1q_f32_ex(&pSource->m[2][2], 128); +#else + float32x4_t v0 = vld1q_f32(&pSource->m[0][0]); + float32x4_t v1 = vld1q_f32(&pSource->m[1][1]); + float32x4_t v2 = vld1q_f32(&pSource->m[2][2]); +#endif + + float32x4_t T1 = vextq_f32(v0, v1, 3); + float32x4_t T2 = vcombine_f32(vget_high_f32(v1), vget_low_f32(v2)); + float32x4_t T3 = vextq_f32(v2, v2, 1); + + XMMATRIX M; + M.r[0] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(v0), g_XMMask3)); + M.r[1] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T1), g_XMMask3)); + M.r[2] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T2), g_XMMask3)); + M.r[3] = vsetq_lane_f32(1.f, T3, 3); + return M; +#elif defined(_XM_SSE_INTRINSICS_) + // Use aligned load instructions to + // load the 12 floats + // vTemp1 = x1,y1,z1,x2 + XMVECTOR vTemp1 = _mm_load_ps(&pSource->m[0][0]); + // vTemp2 = y2,z2,x3,y3 + XMVECTOR vTemp2 = _mm_load_ps(&pSource->m[1][1]); + // vTemp4 = z3,x4,y4,z4 + XMVECTOR vTemp4 = _mm_load_ps(&pSource->m[2][2]); + // vTemp3 = x3,y3,z3,z3 + XMVECTOR vTemp3 = _mm_shuffle_ps(vTemp2, vTemp4, _MM_SHUFFLE(0, 0, 3, 2)); + // vTemp2 = y2,z2,x2,x2 + vTemp2 = _mm_shuffle_ps(vTemp2, vTemp1, _MM_SHUFFLE(3, 3, 1, 0)); + // vTemp2 = x2,y2,z2,z2 + vTemp2 = XM_PERMUTE_PS(vTemp2, _MM_SHUFFLE(1, 1, 0, 2)); + // vTemp1 = x1,y1,z1,0 + vTemp1 = _mm_and_ps(vTemp1, g_XMMask3); + // vTemp2 = x2,y2,z2,0 + vTemp2 = _mm_and_ps(vTemp2, g_XMMask3); + // vTemp3 = x3,y3,z3,0 + vTemp3 = _mm_and_ps(vTemp3, g_XMMask3); + // vTemp4i = x4,y4,z4,0 + __m128i vTemp4i = _mm_srli_si128(_mm_castps_si128(vTemp4), 32 / 8); + // vTemp4i = x4,y4,z4,1.0f + vTemp4i = _mm_or_si128(vTemp4i, g_XMIdentityR3); + XMMATRIX M(vTemp1, + vTemp2, + vTemp3, + _mm_castsi128_ps(vTemp4i)); + return M; +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMMATRIX XM_CALLCONV XMLoadFloat3x4(const XMFLOAT3X4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + + XMMATRIX M; + M.r[0].vector4_f32[0] = pSource->m[0][0]; + M.r[0].vector4_f32[1] = pSource->m[1][0]; + M.r[0].vector4_f32[2] = pSource->m[2][0]; + M.r[0].vector4_f32[3] = 0.0f; + + M.r[1].vector4_f32[0] = pSource->m[0][1]; + M.r[1].vector4_f32[1] = pSource->m[1][1]; + M.r[1].vector4_f32[2] = pSource->m[2][1]; + M.r[1].vector4_f32[3] = 0.0f; + + M.r[2].vector4_f32[0] = pSource->m[0][2]; + M.r[2].vector4_f32[1] = pSource->m[1][2]; + M.r[2].vector4_f32[2] = pSource->m[2][2]; + M.r[2].vector4_f32[3] = 0.0f; + + M.r[3].vector4_f32[0] = pSource->m[0][3]; + M.r[3].vector4_f32[1] = pSource->m[1][3]; + M.r[3].vector4_f32[2] = pSource->m[2][3]; + M.r[3].vector4_f32[3] = 1.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2x4_t vTemp0 = vld4_f32(&pSource->_11); + float32x4_t vTemp1 = vld1q_f32(&pSource->_31); + + float32x2_t l = vget_low_f32(vTemp1); + float32x4_t T0 = vcombine_f32(vTemp0.val[0], l); + float32x2_t rl = vrev64_f32(l); + float32x4_t T1 = vcombine_f32(vTemp0.val[1], rl); + + float32x2_t h = vget_high_f32(vTemp1); + float32x4_t T2 = vcombine_f32(vTemp0.val[2], h); + float32x2_t rh = vrev64_f32(h); + float32x4_t T3 = vcombine_f32(vTemp0.val[3], rh); + + XMMATRIX M = {}; + M.r[0] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T0), g_XMMask3)); + M.r[1] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T1), g_XMMask3)); + M.r[2] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T2), g_XMMask3)); + M.r[3] = vsetq_lane_f32(1.f, T3, 3); + return M; +#elif defined(_XM_SSE_INTRINSICS_) + XMMATRIX M; + M.r[0] = _mm_loadu_ps(&pSource->_11); + M.r[1] = _mm_loadu_ps(&pSource->_21); + M.r[2] = _mm_loadu_ps(&pSource->_31); + M.r[3] = g_XMIdentityR3; + + // x.x,x.y,y.x,y.y + XMVECTOR vTemp1 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(1, 0, 1, 0)); + // x.z,x.w,y.z,y.w + XMVECTOR vTemp3 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(3, 2, 3, 2)); + // z.x,z.y,w.x,w.y + XMVECTOR vTemp2 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(1, 0, 1, 0)); + // z.z,z.w,w.z,w.w + XMVECTOR vTemp4 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(3, 2, 3, 2)); + XMMATRIX mResult; + + // x.x,y.x,z.x,w.x + mResult.r[0] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(2, 0, 2, 0)); + // x.y,y.y,z.y,w.y + mResult.r[1] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(3, 1, 3, 1)); + // x.z,y.z,z.z,w.z + mResult.r[2] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 0, 2, 0)); + // x.w,y.w,z.w,w.w + mResult.r[3] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(3, 1, 3, 1)); + return mResult; +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMMATRIX XM_CALLCONV XMLoadFloat3x4A(const XMFLOAT3X4A* pSource) noexcept +{ + assert(pSource); + assert((reinterpret_cast(pSource) & 0xF) == 0); +#if defined(_XM_NO_INTRINSICS_) + + XMMATRIX M; + M.r[0].vector4_f32[0] = pSource->m[0][0]; + M.r[0].vector4_f32[1] = pSource->m[1][0]; + M.r[0].vector4_f32[2] = pSource->m[2][0]; + M.r[0].vector4_f32[3] = 0.0f; + + M.r[1].vector4_f32[0] = pSource->m[0][1]; + M.r[1].vector4_f32[1] = pSource->m[1][1]; + M.r[1].vector4_f32[2] = pSource->m[2][1]; + M.r[1].vector4_f32[3] = 0.0f; + + M.r[2].vector4_f32[0] = pSource->m[0][2]; + M.r[2].vector4_f32[1] = pSource->m[1][2]; + M.r[2].vector4_f32[2] = pSource->m[2][2]; + M.r[2].vector4_f32[3] = 0.0f; + + M.r[3].vector4_f32[0] = pSource->m[0][3]; + M.r[3].vector4_f32[1] = pSource->m[1][3]; + M.r[3].vector4_f32[2] = pSource->m[2][3]; + M.r[3].vector4_f32[3] = 1.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + float32x2x4_t vTemp0 = vld4_f32_ex(&pSource->_11, 128); + float32x4_t vTemp1 = vld1q_f32_ex(&pSource->_31, 128); +#else + float32x2x4_t vTemp0 = vld4_f32(&pSource->_11); + float32x4_t vTemp1 = vld1q_f32(&pSource->_31); +#endif + + float32x2_t l = vget_low_f32(vTemp1); + float32x4_t T0 = vcombine_f32(vTemp0.val[0], l); + float32x2_t rl = vrev64_f32(l); + float32x4_t T1 = vcombine_f32(vTemp0.val[1], rl); + + float32x2_t h = vget_high_f32(vTemp1); + float32x4_t T2 = vcombine_f32(vTemp0.val[2], h); + float32x2_t rh = vrev64_f32(h); + float32x4_t T3 = vcombine_f32(vTemp0.val[3], rh); + + XMMATRIX M = {}; + M.r[0] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T0), g_XMMask3)); + M.r[1] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T1), g_XMMask3)); + M.r[2] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T2), g_XMMask3)); + M.r[3] = vsetq_lane_f32(1.f, T3, 3); + return M; +#elif defined(_XM_SSE_INTRINSICS_) + XMMATRIX M; + M.r[0] = _mm_load_ps(&pSource->_11); + M.r[1] = _mm_load_ps(&pSource->_21); + M.r[2] = _mm_load_ps(&pSource->_31); + M.r[3] = g_XMIdentityR3; + + // x.x,x.y,y.x,y.y + XMVECTOR vTemp1 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(1, 0, 1, 0)); + // x.z,x.w,y.z,y.w + XMVECTOR vTemp3 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(3, 2, 3, 2)); + // z.x,z.y,w.x,w.y + XMVECTOR vTemp2 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(1, 0, 1, 0)); + // z.z,z.w,w.z,w.w + XMVECTOR vTemp4 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(3, 2, 3, 2)); + XMMATRIX mResult; + + // x.x,y.x,z.x,w.x + mResult.r[0] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(2, 0, 2, 0)); + // x.y,y.y,z.y,w.y + mResult.r[1] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(3, 1, 3, 1)); + // x.z,y.z,z.z,w.z + mResult.r[2] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 0, 2, 0)); + // x.w,y.w,z.w,w.w + mResult.r[3] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(3, 1, 3, 1)); + return mResult; +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMMATRIX XM_CALLCONV XMLoadFloat4x4(const XMFLOAT4X4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + + XMMATRIX M; + M.r[0].vector4_f32[0] = pSource->m[0][0]; + M.r[0].vector4_f32[1] = pSource->m[0][1]; + M.r[0].vector4_f32[2] = pSource->m[0][2]; + M.r[0].vector4_f32[3] = pSource->m[0][3]; + + M.r[1].vector4_f32[0] = pSource->m[1][0]; + M.r[1].vector4_f32[1] = pSource->m[1][1]; + M.r[1].vector4_f32[2] = pSource->m[1][2]; + M.r[1].vector4_f32[3] = pSource->m[1][3]; + + M.r[2].vector4_f32[0] = pSource->m[2][0]; + M.r[2].vector4_f32[1] = pSource->m[2][1]; + M.r[2].vector4_f32[2] = pSource->m[2][2]; + M.r[2].vector4_f32[3] = pSource->m[2][3]; + + M.r[3].vector4_f32[0] = pSource->m[3][0]; + M.r[3].vector4_f32[1] = pSource->m[3][1]; + M.r[3].vector4_f32[2] = pSource->m[3][2]; + M.r[3].vector4_f32[3] = pSource->m[3][3]; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + XMMATRIX M; + M.r[0] = vld1q_f32(reinterpret_cast(&pSource->_11)); + M.r[1] = vld1q_f32(reinterpret_cast(&pSource->_21)); + M.r[2] = vld1q_f32(reinterpret_cast(&pSource->_31)); + M.r[3] = vld1q_f32(reinterpret_cast(&pSource->_41)); + return M; +#elif defined(_XM_SSE_INTRINSICS_) + XMMATRIX M; + M.r[0] = _mm_loadu_ps(&pSource->_11); + M.r[1] = _mm_loadu_ps(&pSource->_21); + M.r[2] = _mm_loadu_ps(&pSource->_31); + M.r[3] = _mm_loadu_ps(&pSource->_41); + return M; +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMMATRIX XM_CALLCONV XMLoadFloat4x4A(const XMFLOAT4X4A* pSource) noexcept +{ + assert(pSource); + assert((reinterpret_cast(pSource) & 0xF) == 0); +#if defined(_XM_NO_INTRINSICS_) + + XMMATRIX M; + M.r[0].vector4_f32[0] = pSource->m[0][0]; + M.r[0].vector4_f32[1] = pSource->m[0][1]; + M.r[0].vector4_f32[2] = pSource->m[0][2]; + M.r[0].vector4_f32[3] = pSource->m[0][3]; + + M.r[1].vector4_f32[0] = pSource->m[1][0]; + M.r[1].vector4_f32[1] = pSource->m[1][1]; + M.r[1].vector4_f32[2] = pSource->m[1][2]; + M.r[1].vector4_f32[3] = pSource->m[1][3]; + + M.r[2].vector4_f32[0] = pSource->m[2][0]; + M.r[2].vector4_f32[1] = pSource->m[2][1]; + M.r[2].vector4_f32[2] = pSource->m[2][2]; + M.r[2].vector4_f32[3] = pSource->m[2][3]; + + M.r[3].vector4_f32[0] = pSource->m[3][0]; + M.r[3].vector4_f32[1] = pSource->m[3][1]; + M.r[3].vector4_f32[2] = pSource->m[3][2]; + M.r[3].vector4_f32[3] = pSource->m[3][3]; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + XMMATRIX M; +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + M.r[0] = vld1q_f32_ex(reinterpret_cast(&pSource->_11), 128); + M.r[1] = vld1q_f32_ex(reinterpret_cast(&pSource->_21), 128); + M.r[2] = vld1q_f32_ex(reinterpret_cast(&pSource->_31), 128); + M.r[3] = vld1q_f32_ex(reinterpret_cast(&pSource->_41), 128); +#else + M.r[0] = vld1q_f32(reinterpret_cast(&pSource->_11)); + M.r[1] = vld1q_f32(reinterpret_cast(&pSource->_21)); + M.r[2] = vld1q_f32(reinterpret_cast(&pSource->_31)); + M.r[3] = vld1q_f32(reinterpret_cast(&pSource->_41)); +#endif + return M; +#elif defined(_XM_SSE_INTRINSICS_) + XMMATRIX M; + M.r[0] = _mm_load_ps(&pSource->_11); + M.r[1] = _mm_load_ps(&pSource->_21); + M.r[2] = _mm_load_ps(&pSource->_31); + M.r[3] = _mm_load_ps(&pSource->_41); + return M; +#endif +} + +/**************************************************************************** + * + * Vector and matrix store operations + * + ****************************************************************************/ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreInt +( + uint32_t* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + *pDestination = XMVectorGetIntX(V); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + vst1q_lane_u32(pDestination, *reinterpret_cast(&V), 0); +#elif defined(_XM_SSE_INTRINSICS_) + _mm_store_ss(reinterpret_cast(pDestination), V); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreFloat +( + float* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + *pDestination = XMVectorGetX(V); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + vst1q_lane_f32(pDestination, V, 0); +#elif defined(_XM_SSE_INTRINSICS_) + _mm_store_ss(pDestination, V); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreInt2 +( + uint32_t* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + pDestination[0] = V.vector4_u32[0]; + pDestination[1] = V.vector4_u32[1]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t VL = vget_low_u32(vreinterpretq_u32_f32(V)); + vst1_u32(pDestination, VL); +#elif defined(_XM_SSE_INTRINSICS_) + _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreInt2A +( + uint32_t* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); + assert((reinterpret_cast(pDestination) & 0xF) == 0); +#if defined(_XM_NO_INTRINSICS_) + pDestination[0] = V.vector4_u32[0]; + pDestination[1] = V.vector4_u32[1]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t VL = vget_low_u32(vreinterpretq_u32_f32(V)); +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + vst1_u32_ex(pDestination, VL, 64); +#else + vst1_u32(pDestination, VL); +#endif +#elif defined(_XM_SSE_INTRINSICS_) + _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreFloat2 +( + XMFLOAT2* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + pDestination->x = V.vector4_f32[0]; + pDestination->y = V.vector4_f32[1]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t VL = vget_low_f32(V); + vst1_f32(reinterpret_cast(pDestination), VL); +#elif defined(_XM_SSE_INTRINSICS_) + _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreFloat2A +( + XMFLOAT2A* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); + assert((reinterpret_cast(pDestination) & 0xF) == 0); +#if defined(_XM_NO_INTRINSICS_) + pDestination->x = V.vector4_f32[0]; + pDestination->y = V.vector4_f32[1]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t VL = vget_low_f32(V); +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + vst1_f32_ex(reinterpret_cast(pDestination), VL, 64); +#else + vst1_f32(reinterpret_cast(pDestination), VL); +#endif +#elif defined(_XM_SSE_INTRINSICS_) + _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreSInt2 +( + XMINT2* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + pDestination->x = static_cast(V.vector4_f32[0]); + pDestination->y = static_cast(V.vector4_f32[1]); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t v = vget_low_f32(V); + int32x2_t iv = vcvt_s32_f32(v); + vst1_s32(reinterpret_cast(pDestination), iv); +#elif defined(_XM_SSE_INTRINSICS_) + // In case of positive overflow, detect it + XMVECTOR vOverflow = _mm_cmpgt_ps(V, g_XMMaxInt); + // Float to int conversion + __m128i vResulti = _mm_cvttps_epi32(V); + // If there was positive overflow, set to 0x7FFFFFFF + XMVECTOR vResult = _mm_and_ps(vOverflow, g_XMAbsMask); + vOverflow = _mm_andnot_ps(vOverflow, _mm_castsi128_ps(vResulti)); + vOverflow = _mm_or_ps(vOverflow, vResult); + // Write two ints + _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(vOverflow)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreUInt2 +( + XMUINT2* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + pDestination->x = static_cast(V.vector4_f32[0]); + pDestination->y = static_cast(V.vector4_f32[1]); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t v = vget_low_f32(V); + uint32x2_t iv = vcvt_u32_f32(v); + vst1_u32(reinterpret_cast(pDestination), iv); +#elif defined(_XM_SSE_INTRINSICS_) + // Clamp to >=0 + XMVECTOR vResult = _mm_max_ps(V, g_XMZero); + // Any numbers that are too big, set to 0xFFFFFFFFU + XMVECTOR vOverflow = _mm_cmpgt_ps(vResult, g_XMMaxUInt); + XMVECTOR vValue = g_XMUnsignedFix; + // Too large for a signed integer? + XMVECTOR vMask = _mm_cmpge_ps(vResult, vValue); + // Zero for number's lower than 0x80000000, 32768.0f*65536.0f otherwise + vValue = _mm_and_ps(vValue, vMask); + // Perform fixup only on numbers too large (Keeps low bit precision) + vResult = _mm_sub_ps(vResult, vValue); + __m128i vResulti = _mm_cvttps_epi32(vResult); + // Convert from signed to unsigned pnly if greater than 0x80000000 + vMask = _mm_and_ps(vMask, g_XMNegativeZero); + vResult = _mm_xor_ps(_mm_castsi128_ps(vResulti), vMask); + // On those that are too large, set to 0xFFFFFFFF + vResult = _mm_or_ps(vResult, vOverflow); + // Write two uints + _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(vResult)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreInt3 +( + uint32_t* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + pDestination[0] = V.vector4_u32[0]; + pDestination[1] = V.vector4_u32[1]; + pDestination[2] = V.vector4_u32[2]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t VL = vget_low_u32(vreinterpretq_u32_f32(V)); + vst1_u32(pDestination, VL); + vst1q_lane_u32(pDestination + 2, *reinterpret_cast(&V), 2); +#elif defined(_XM_SSE_INTRINSICS_) + _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V)); + __m128 z = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + _mm_store_ss(reinterpret_cast(&pDestination[2]), z); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreInt3A +( + uint32_t* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); + assert((reinterpret_cast(pDestination) & 0xF) == 0); +#if defined(_XM_NO_INTRINSICS_) + pDestination[0] = V.vector4_u32[0]; + pDestination[1] = V.vector4_u32[1]; + pDestination[2] = V.vector4_u32[2]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t VL = vget_low_u32(vreinterpretq_u32_f32(V)); +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + vst1_u32_ex(pDestination, VL, 64); +#else + vst1_u32(pDestination, VL); +#endif + vst1q_lane_u32(pDestination + 2, *reinterpret_cast(&V), 2); +#elif defined(_XM_SSE_INTRINSICS_) + _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V)); + __m128 z = _mm_movehl_ps(V, V); + _mm_store_ss(reinterpret_cast(&pDestination[2]), z); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreFloat3 +( + XMFLOAT3* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + pDestination->x = V.vector4_f32[0]; + pDestination->y = V.vector4_f32[1]; + pDestination->z = V.vector4_f32[2]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t VL = vget_low_f32(V); + vst1_f32(reinterpret_cast(pDestination), VL); + vst1q_lane_f32(reinterpret_cast(pDestination) + 2, V, 2); +#elif defined(_XM_SSE4_INTRINSICS_) + * reinterpret_cast(&pDestination->x) = _mm_extract_ps(V, 0); + *reinterpret_cast(&pDestination->y) = _mm_extract_ps(V, 1); + *reinterpret_cast(&pDestination->z) = _mm_extract_ps(V, 2); +#elif defined(_XM_SSE_INTRINSICS_) + _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V)); + __m128 z = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + _mm_store_ss(&pDestination->z, z); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreFloat3A +( + XMFLOAT3A* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); + assert((reinterpret_cast(pDestination) & 0xF) == 0); +#if defined(_XM_NO_INTRINSICS_) + pDestination->x = V.vector4_f32[0]; + pDestination->y = V.vector4_f32[1]; + pDestination->z = V.vector4_f32[2]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t VL = vget_low_f32(V); +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + vst1_f32_ex(reinterpret_cast(pDestination), VL, 64); +#else + vst1_f32(reinterpret_cast(pDestination), VL); +#endif + vst1q_lane_f32(reinterpret_cast(pDestination) + 2, V, 2); +#elif defined(_XM_SSE4_INTRINSICS_) + _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V)); + *reinterpret_cast(&pDestination->z) = _mm_extract_ps(V, 2); +#elif defined(_XM_SSE_INTRINSICS_) + _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(V)); + __m128 z = _mm_movehl_ps(V, V); + _mm_store_ss(&pDestination->z, z); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreSInt3 +( + XMINT3* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + pDestination->x = static_cast(V.vector4_f32[0]); + pDestination->y = static_cast(V.vector4_f32[1]); + pDestination->z = static_cast(V.vector4_f32[2]); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + int32x4_t v = vcvtq_s32_f32(V); + int32x2_t vL = vget_low_s32(v); + vst1_s32(reinterpret_cast(pDestination), vL); + vst1q_lane_s32(reinterpret_cast(pDestination) + 2, v, 2); +#elif defined(_XM_SSE_INTRINSICS_) + // In case of positive overflow, detect it + XMVECTOR vOverflow = _mm_cmpgt_ps(V, g_XMMaxInt); + // Float to int conversion + __m128i vResulti = _mm_cvttps_epi32(V); + // If there was positive overflow, set to 0x7FFFFFFF + XMVECTOR vResult = _mm_and_ps(vOverflow, g_XMAbsMask); + vOverflow = _mm_andnot_ps(vOverflow, _mm_castsi128_ps(vResulti)); + vOverflow = _mm_or_ps(vOverflow, vResult); + // Write 3 uints + _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(vOverflow)); + __m128 z = XM_PERMUTE_PS(vOverflow, _MM_SHUFFLE(2, 2, 2, 2)); + _mm_store_ss(reinterpret_cast(&pDestination->z), z); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreUInt3 +( + XMUINT3* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + pDestination->x = static_cast(V.vector4_f32[0]); + pDestination->y = static_cast(V.vector4_f32[1]); + pDestination->z = static_cast(V.vector4_f32[2]); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t v = vcvtq_u32_f32(V); + uint32x2_t vL = vget_low_u32(v); + vst1_u32(reinterpret_cast(pDestination), vL); + vst1q_lane_u32(reinterpret_cast(pDestination) + 2, v, 2); +#elif defined(_XM_SSE_INTRINSICS_) + // Clamp to >=0 + XMVECTOR vResult = _mm_max_ps(V, g_XMZero); + // Any numbers that are too big, set to 0xFFFFFFFFU + XMVECTOR vOverflow = _mm_cmpgt_ps(vResult, g_XMMaxUInt); + XMVECTOR vValue = g_XMUnsignedFix; + // Too large for a signed integer? + XMVECTOR vMask = _mm_cmpge_ps(vResult, vValue); + // Zero for number's lower than 0x80000000, 32768.0f*65536.0f otherwise + vValue = _mm_and_ps(vValue, vMask); + // Perform fixup only on numbers too large (Keeps low bit precision) + vResult = _mm_sub_ps(vResult, vValue); + __m128i vResulti = _mm_cvttps_epi32(vResult); + // Convert from signed to unsigned pnly if greater than 0x80000000 + vMask = _mm_and_ps(vMask, g_XMNegativeZero); + vResult = _mm_xor_ps(_mm_castsi128_ps(vResulti), vMask); + // On those that are too large, set to 0xFFFFFFFF + vResult = _mm_or_ps(vResult, vOverflow); + // Write 3 uints + _mm_store_sd(reinterpret_cast(pDestination), _mm_castps_pd(vResult)); + __m128 z = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(2, 2, 2, 2)); + _mm_store_ss(reinterpret_cast(&pDestination->z), z); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreInt4 +( + uint32_t* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + pDestination[0] = V.vector4_u32[0]; + pDestination[1] = V.vector4_u32[1]; + pDestination[2] = V.vector4_u32[2]; + pDestination[3] = V.vector4_u32[3]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + vst1q_u32(pDestination, vreinterpretq_u32_f32(V)); +#elif defined(_XM_SSE_INTRINSICS_) + _mm_storeu_si128(reinterpret_cast<__m128i*>(pDestination), _mm_castps_si128(V)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreInt4A +( + uint32_t* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); + assert((reinterpret_cast(pDestination) & 0xF) == 0); +#if defined(_XM_NO_INTRINSICS_) + pDestination[0] = V.vector4_u32[0]; + pDestination[1] = V.vector4_u32[1]; + pDestination[2] = V.vector4_u32[2]; + pDestination[3] = V.vector4_u32[3]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + vst1q_u32_ex(pDestination, V, 128); +#else + vst1q_u32(pDestination, vreinterpretq_u32_f32(V)); +#endif +#elif defined(_XM_SSE_INTRINSICS_) + _mm_store_si128(reinterpret_cast<__m128i*>(pDestination), _mm_castps_si128(V)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreFloat4 +( + XMFLOAT4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + pDestination->x = V.vector4_f32[0]; + pDestination->y = V.vector4_f32[1]; + pDestination->z = V.vector4_f32[2]; + pDestination->w = V.vector4_f32[3]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + vst1q_f32(reinterpret_cast(pDestination), V); +#elif defined(_XM_SSE_INTRINSICS_) + _mm_storeu_ps(&pDestination->x, V); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreFloat4A +( + XMFLOAT4A* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); + assert((reinterpret_cast(pDestination) & 0xF) == 0); +#if defined(_XM_NO_INTRINSICS_) + pDestination->x = V.vector4_f32[0]; + pDestination->y = V.vector4_f32[1]; + pDestination->z = V.vector4_f32[2]; + pDestination->w = V.vector4_f32[3]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + vst1q_f32_ex(reinterpret_cast(pDestination), V, 128); +#else + vst1q_f32(reinterpret_cast(pDestination), V); +#endif +#elif defined(_XM_SSE_INTRINSICS_) + _mm_store_ps(&pDestination->x, V); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreSInt4 +( + XMINT4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + pDestination->x = static_cast(V.vector4_f32[0]); + pDestination->y = static_cast(V.vector4_f32[1]); + pDestination->z = static_cast(V.vector4_f32[2]); + pDestination->w = static_cast(V.vector4_f32[3]); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + int32x4_t v = vcvtq_s32_f32(V); + vst1q_s32(reinterpret_cast(pDestination), v); +#elif defined(_XM_SSE_INTRINSICS_) + // In case of positive overflow, detect it + XMVECTOR vOverflow = _mm_cmpgt_ps(V, g_XMMaxInt); + // Float to int conversion + __m128i vResulti = _mm_cvttps_epi32(V); + // If there was positive overflow, set to 0x7FFFFFFF + XMVECTOR vResult = _mm_and_ps(vOverflow, g_XMAbsMask); + vOverflow = _mm_andnot_ps(vOverflow, _mm_castsi128_ps(vResulti)); + vOverflow = _mm_or_ps(vOverflow, vResult); + _mm_storeu_si128(reinterpret_cast<__m128i*>(pDestination), _mm_castps_si128(vOverflow)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreUInt4 +( + XMUINT4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + pDestination->x = static_cast(V.vector4_f32[0]); + pDestination->y = static_cast(V.vector4_f32[1]); + pDestination->z = static_cast(V.vector4_f32[2]); + pDestination->w = static_cast(V.vector4_f32[3]); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t v = vcvtq_u32_f32(V); + vst1q_u32(reinterpret_cast(pDestination), v); +#elif defined(_XM_SSE_INTRINSICS_) + // Clamp to >=0 + XMVECTOR vResult = _mm_max_ps(V, g_XMZero); + // Any numbers that are too big, set to 0xFFFFFFFFU + XMVECTOR vOverflow = _mm_cmpgt_ps(vResult, g_XMMaxUInt); + XMVECTOR vValue = g_XMUnsignedFix; + // Too large for a signed integer? + XMVECTOR vMask = _mm_cmpge_ps(vResult, vValue); + // Zero for number's lower than 0x80000000, 32768.0f*65536.0f otherwise + vValue = _mm_and_ps(vValue, vMask); + // Perform fixup only on numbers too large (Keeps low bit precision) + vResult = _mm_sub_ps(vResult, vValue); + __m128i vResulti = _mm_cvttps_epi32(vResult); + // Convert from signed to unsigned pnly if greater than 0x80000000 + vMask = _mm_and_ps(vMask, g_XMNegativeZero); + vResult = _mm_xor_ps(_mm_castsi128_ps(vResulti), vMask); + // On those that are too large, set to 0xFFFFFFFF + vResult = _mm_or_ps(vResult, vOverflow); + _mm_storeu_si128(reinterpret_cast<__m128i*>(pDestination), _mm_castps_si128(vResult)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreFloat3x3 +( + XMFLOAT3X3* pDestination, + FXMMATRIX M +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + pDestination->m[0][0] = M.r[0].vector4_f32[0]; + pDestination->m[0][1] = M.r[0].vector4_f32[1]; + pDestination->m[0][2] = M.r[0].vector4_f32[2]; + + pDestination->m[1][0] = M.r[1].vector4_f32[0]; + pDestination->m[1][1] = M.r[1].vector4_f32[1]; + pDestination->m[1][2] = M.r[1].vector4_f32[2]; + + pDestination->m[2][0] = M.r[2].vector4_f32[0]; + pDestination->m[2][1] = M.r[2].vector4_f32[1]; + pDestination->m[2][2] = M.r[2].vector4_f32[2]; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t T1 = vextq_f32(M.r[0], M.r[1], 1); + float32x4_t T2 = vbslq_f32(g_XMMask3, M.r[0], T1); + vst1q_f32(&pDestination->m[0][0], T2); + + T1 = vextq_f32(M.r[1], M.r[1], 1); + T2 = vcombine_f32(vget_low_f32(T1), vget_low_f32(M.r[2])); + vst1q_f32(&pDestination->m[1][1], T2); + + vst1q_lane_f32(&pDestination->m[2][2], M.r[2], 2); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp1 = M.r[0]; + XMVECTOR vTemp2 = M.r[1]; + XMVECTOR vTemp3 = M.r[2]; + XMVECTOR vWork = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(0, 0, 2, 2)); + vTemp1 = _mm_shuffle_ps(vTemp1, vWork, _MM_SHUFFLE(2, 0, 1, 0)); + _mm_storeu_ps(&pDestination->m[0][0], vTemp1); + vTemp2 = _mm_shuffle_ps(vTemp2, vTemp3, _MM_SHUFFLE(1, 0, 2, 1)); + _mm_storeu_ps(&pDestination->m[1][1], vTemp2); + vTemp3 = XM_PERMUTE_PS(vTemp3, _MM_SHUFFLE(2, 2, 2, 2)); + _mm_store_ss(&pDestination->m[2][2], vTemp3); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreFloat4x3 +( + XMFLOAT4X3* pDestination, + FXMMATRIX M +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + pDestination->m[0][0] = M.r[0].vector4_f32[0]; + pDestination->m[0][1] = M.r[0].vector4_f32[1]; + pDestination->m[0][2] = M.r[0].vector4_f32[2]; + + pDestination->m[1][0] = M.r[1].vector4_f32[0]; + pDestination->m[1][1] = M.r[1].vector4_f32[1]; + pDestination->m[1][2] = M.r[1].vector4_f32[2]; + + pDestination->m[2][0] = M.r[2].vector4_f32[0]; + pDestination->m[2][1] = M.r[2].vector4_f32[1]; + pDestination->m[2][2] = M.r[2].vector4_f32[2]; + + pDestination->m[3][0] = M.r[3].vector4_f32[0]; + pDestination->m[3][1] = M.r[3].vector4_f32[1]; + pDestination->m[3][2] = M.r[3].vector4_f32[2]; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t T1 = vextq_f32(M.r[0], M.r[1], 1); + float32x4_t T2 = vbslq_f32(g_XMMask3, M.r[0], T1); + vst1q_f32(&pDestination->m[0][0], T2); + + T1 = vextq_f32(M.r[1], M.r[1], 1); + T2 = vcombine_f32(vget_low_f32(T1), vget_low_f32(M.r[2])); + vst1q_f32(&pDestination->m[1][1], T2); + + T1 = vdupq_lane_f32(vget_high_f32(M.r[2]), 0); + T2 = vextq_f32(T1, M.r[3], 3); + vst1q_f32(&pDestination->m[2][2], T2); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp1 = M.r[0]; + XMVECTOR vTemp2 = M.r[1]; + XMVECTOR vTemp3 = M.r[2]; + XMVECTOR vTemp4 = M.r[3]; + XMVECTOR vTemp2x = _mm_shuffle_ps(vTemp2, vTemp3, _MM_SHUFFLE(1, 0, 2, 1)); + vTemp2 = _mm_shuffle_ps(vTemp2, vTemp1, _MM_SHUFFLE(2, 2, 0, 0)); + vTemp1 = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(0, 2, 1, 0)); + vTemp3 = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(0, 0, 2, 2)); + vTemp3 = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 1, 2, 0)); + _mm_storeu_ps(&pDestination->m[0][0], vTemp1); + _mm_storeu_ps(&pDestination->m[1][1], vTemp2x); + _mm_storeu_ps(&pDestination->m[2][2], vTemp3); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreFloat4x3A +( + XMFLOAT4X3A* pDestination, + FXMMATRIX M +) noexcept +{ + assert(pDestination); + assert((reinterpret_cast(pDestination) & 0xF) == 0); +#if defined(_XM_NO_INTRINSICS_) + + pDestination->m[0][0] = M.r[0].vector4_f32[0]; + pDestination->m[0][1] = M.r[0].vector4_f32[1]; + pDestination->m[0][2] = M.r[0].vector4_f32[2]; + + pDestination->m[1][0] = M.r[1].vector4_f32[0]; + pDestination->m[1][1] = M.r[1].vector4_f32[1]; + pDestination->m[1][2] = M.r[1].vector4_f32[2]; + + pDestination->m[2][0] = M.r[2].vector4_f32[0]; + pDestination->m[2][1] = M.r[2].vector4_f32[1]; + pDestination->m[2][2] = M.r[2].vector4_f32[2]; + + pDestination->m[3][0] = M.r[3].vector4_f32[0]; + pDestination->m[3][1] = M.r[3].vector4_f32[1]; + pDestination->m[3][2] = M.r[3].vector4_f32[2]; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + float32x4_t T1 = vextq_f32(M.r[0], M.r[1], 1); + float32x4_t T2 = vbslq_f32(g_XMMask3, M.r[0], T1); + vst1q_f32_ex(&pDestination->m[0][0], T2, 128); + + T1 = vextq_f32(M.r[1], M.r[1], 1); + T2 = vcombine_f32(vget_low_f32(T1), vget_low_f32(M.r[2])); + vst1q_f32_ex(&pDestination->m[1][1], T2, 128); + + T1 = vdupq_lane_f32(vget_high_f32(M.r[2]), 0); + T2 = vextq_f32(T1, M.r[3], 3); + vst1q_f32_ex(&pDestination->m[2][2], T2, 128); +#else + float32x4_t T1 = vextq_f32(M.r[0], M.r[1], 1); + float32x4_t T2 = vbslq_f32(g_XMMask3, M.r[0], T1); + vst1q_f32(&pDestination->m[0][0], T2); + + T1 = vextq_f32(M.r[1], M.r[1], 1); + T2 = vcombine_f32(vget_low_f32(T1), vget_low_f32(M.r[2])); + vst1q_f32(&pDestination->m[1][1], T2); + + T1 = vdupq_lane_f32(vget_high_f32(M.r[2]), 0); + T2 = vextq_f32(T1, M.r[3], 3); + vst1q_f32(&pDestination->m[2][2], T2); +#endif +#elif defined(_XM_SSE_INTRINSICS_) + // x1,y1,z1,w1 + XMVECTOR vTemp1 = M.r[0]; + // x2,y2,z2,w2 + XMVECTOR vTemp2 = M.r[1]; + // x3,y3,z3,w3 + XMVECTOR vTemp3 = M.r[2]; + // x4,y4,z4,w4 + XMVECTOR vTemp4 = M.r[3]; + // z1,z1,x2,y2 + XMVECTOR vTemp = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(1, 0, 2, 2)); + // y2,z2,x3,y3 (Final) + vTemp2 = _mm_shuffle_ps(vTemp2, vTemp3, _MM_SHUFFLE(1, 0, 2, 1)); + // x1,y1,z1,x2 (Final) + vTemp1 = _mm_shuffle_ps(vTemp1, vTemp, _MM_SHUFFLE(2, 0, 1, 0)); + // z3,z3,x4,x4 + vTemp3 = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(0, 0, 2, 2)); + // z3,x4,y4,z4 (Final) + vTemp3 = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 1, 2, 0)); + // Store in 3 operations + _mm_store_ps(&pDestination->m[0][0], vTemp1); + _mm_store_ps(&pDestination->m[1][1], vTemp2); + _mm_store_ps(&pDestination->m[2][2], vTemp3); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreFloat3x4 +( + XMFLOAT3X4* pDestination, + FXMMATRIX M +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + pDestination->m[0][0] = M.r[0].vector4_f32[0]; + pDestination->m[0][1] = M.r[1].vector4_f32[0]; + pDestination->m[0][2] = M.r[2].vector4_f32[0]; + pDestination->m[0][3] = M.r[3].vector4_f32[0]; + + pDestination->m[1][0] = M.r[0].vector4_f32[1]; + pDestination->m[1][1] = M.r[1].vector4_f32[1]; + pDestination->m[1][2] = M.r[2].vector4_f32[1]; + pDestination->m[1][3] = M.r[3].vector4_f32[1]; + + pDestination->m[2][0] = M.r[0].vector4_f32[2]; + pDestination->m[2][1] = M.r[1].vector4_f32[2]; + pDestination->m[2][2] = M.r[2].vector4_f32[2]; + pDestination->m[2][3] = M.r[3].vector4_f32[2]; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4x2_t P0 = vzipq_f32(M.r[0], M.r[2]); + float32x4x2_t P1 = vzipq_f32(M.r[1], M.r[3]); + + float32x4x2_t T0 = vzipq_f32(P0.val[0], P1.val[0]); + float32x4x2_t T1 = vzipq_f32(P0.val[1], P1.val[1]); + + vst1q_f32(&pDestination->m[0][0], T0.val[0]); + vst1q_f32(&pDestination->m[1][0], T0.val[1]); + vst1q_f32(&pDestination->m[2][0], T1.val[0]); +#elif defined(_XM_SSE_INTRINSICS_) + // x.x,x.y,y.x,y.y + XMVECTOR vTemp1 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(1, 0, 1, 0)); + // x.z,x.w,y.z,y.w + XMVECTOR vTemp3 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(3, 2, 3, 2)); + // z.x,z.y,w.x,w.y + XMVECTOR vTemp2 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(1, 0, 1, 0)); + // z.z,z.w,w.z,w.w + XMVECTOR vTemp4 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(3, 2, 3, 2)); + + // x.x,y.x,z.x,w.x + XMVECTOR r0 = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(2, 0, 2, 0)); + // x.y,y.y,z.y,w.y + XMVECTOR r1 = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(3, 1, 3, 1)); + // x.z,y.z,z.z,w.z + XMVECTOR r2 = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 0, 2, 0)); + + _mm_storeu_ps(&pDestination->m[0][0], r0); + _mm_storeu_ps(&pDestination->m[1][0], r1); + _mm_storeu_ps(&pDestination->m[2][0], r2); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreFloat3x4A +( + XMFLOAT3X4A* pDestination, + FXMMATRIX M +) noexcept +{ + assert(pDestination); + assert((reinterpret_cast(pDestination) & 0xF) == 0); +#if defined(_XM_NO_INTRINSICS_) + + pDestination->m[0][0] = M.r[0].vector4_f32[0]; + pDestination->m[0][1] = M.r[1].vector4_f32[0]; + pDestination->m[0][2] = M.r[2].vector4_f32[0]; + pDestination->m[0][3] = M.r[3].vector4_f32[0]; + + pDestination->m[1][0] = M.r[0].vector4_f32[1]; + pDestination->m[1][1] = M.r[1].vector4_f32[1]; + pDestination->m[1][2] = M.r[2].vector4_f32[1]; + pDestination->m[1][3] = M.r[3].vector4_f32[1]; + + pDestination->m[2][0] = M.r[0].vector4_f32[2]; + pDestination->m[2][1] = M.r[1].vector4_f32[2]; + pDestination->m[2][2] = M.r[2].vector4_f32[2]; + pDestination->m[2][3] = M.r[3].vector4_f32[2]; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4x2_t P0 = vzipq_f32(M.r[0], M.r[2]); + float32x4x2_t P1 = vzipq_f32(M.r[1], M.r[3]); + + float32x4x2_t T0 = vzipq_f32(P0.val[0], P1.val[0]); + float32x4x2_t T1 = vzipq_f32(P0.val[1], P1.val[1]); + +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + vst1q_f32_ex(&pDestination->m[0][0], T0.val[0], 128); + vst1q_f32_ex(&pDestination->m[1][0], T0.val[1], 128); + vst1q_f32_ex(&pDestination->m[2][0], T1.val[0], 128); +#else + vst1q_f32(&pDestination->m[0][0], T0.val[0]); + vst1q_f32(&pDestination->m[1][0], T0.val[1]); + vst1q_f32(&pDestination->m[2][0], T1.val[0]); +#endif +#elif defined(_XM_SSE_INTRINSICS_) + // x.x,x.y,y.x,y.y + XMVECTOR vTemp1 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(1, 0, 1, 0)); + // x.z,x.w,y.z,y.w + XMVECTOR vTemp3 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(3, 2, 3, 2)); + // z.x,z.y,w.x,w.y + XMVECTOR vTemp2 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(1, 0, 1, 0)); + // z.z,z.w,w.z,w.w + XMVECTOR vTemp4 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(3, 2, 3, 2)); + + // x.x,y.x,z.x,w.x + XMVECTOR r0 = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(2, 0, 2, 0)); + // x.y,y.y,z.y,w.y + XMVECTOR r1 = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(3, 1, 3, 1)); + // x.z,y.z,z.z,w.z + XMVECTOR r2 = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 0, 2, 0)); + + _mm_store_ps(&pDestination->m[0][0], r0); + _mm_store_ps(&pDestination->m[1][0], r1); + _mm_store_ps(&pDestination->m[2][0], r2); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreFloat4x4 +( + XMFLOAT4X4* pDestination, + FXMMATRIX M +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + pDestination->m[0][0] = M.r[0].vector4_f32[0]; + pDestination->m[0][1] = M.r[0].vector4_f32[1]; + pDestination->m[0][2] = M.r[0].vector4_f32[2]; + pDestination->m[0][3] = M.r[0].vector4_f32[3]; + + pDestination->m[1][0] = M.r[1].vector4_f32[0]; + pDestination->m[1][1] = M.r[1].vector4_f32[1]; + pDestination->m[1][2] = M.r[1].vector4_f32[2]; + pDestination->m[1][3] = M.r[1].vector4_f32[3]; + + pDestination->m[2][0] = M.r[2].vector4_f32[0]; + pDestination->m[2][1] = M.r[2].vector4_f32[1]; + pDestination->m[2][2] = M.r[2].vector4_f32[2]; + pDestination->m[2][3] = M.r[2].vector4_f32[3]; + + pDestination->m[3][0] = M.r[3].vector4_f32[0]; + pDestination->m[3][1] = M.r[3].vector4_f32[1]; + pDestination->m[3][2] = M.r[3].vector4_f32[2]; + pDestination->m[3][3] = M.r[3].vector4_f32[3]; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + vst1q_f32(reinterpret_cast(&pDestination->_11), M.r[0]); + vst1q_f32(reinterpret_cast(&pDestination->_21), M.r[1]); + vst1q_f32(reinterpret_cast(&pDestination->_31), M.r[2]); + vst1q_f32(reinterpret_cast(&pDestination->_41), M.r[3]); +#elif defined(_XM_SSE_INTRINSICS_) + _mm_storeu_ps(&pDestination->_11, M.r[0]); + _mm_storeu_ps(&pDestination->_21, M.r[1]); + _mm_storeu_ps(&pDestination->_31, M.r[2]); + _mm_storeu_ps(&pDestination->_41, M.r[3]); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreFloat4x4A +( + XMFLOAT4X4A* pDestination, + FXMMATRIX M +) noexcept +{ + assert(pDestination); + assert((reinterpret_cast(pDestination) & 0xF) == 0); +#if defined(_XM_NO_INTRINSICS_) + + pDestination->m[0][0] = M.r[0].vector4_f32[0]; + pDestination->m[0][1] = M.r[0].vector4_f32[1]; + pDestination->m[0][2] = M.r[0].vector4_f32[2]; + pDestination->m[0][3] = M.r[0].vector4_f32[3]; + + pDestination->m[1][0] = M.r[1].vector4_f32[0]; + pDestination->m[1][1] = M.r[1].vector4_f32[1]; + pDestination->m[1][2] = M.r[1].vector4_f32[2]; + pDestination->m[1][3] = M.r[1].vector4_f32[3]; + + pDestination->m[2][0] = M.r[2].vector4_f32[0]; + pDestination->m[2][1] = M.r[2].vector4_f32[1]; + pDestination->m[2][2] = M.r[2].vector4_f32[2]; + pDestination->m[2][3] = M.r[2].vector4_f32[3]; + + pDestination->m[3][0] = M.r[3].vector4_f32[0]; + pDestination->m[3][1] = M.r[3].vector4_f32[1]; + pDestination->m[3][2] = M.r[3].vector4_f32[2]; + pDestination->m[3][3] = M.r[3].vector4_f32[3]; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + vst1q_f32_ex(reinterpret_cast(&pDestination->_11), M.r[0], 128); + vst1q_f32_ex(reinterpret_cast(&pDestination->_21), M.r[1], 128); + vst1q_f32_ex(reinterpret_cast(&pDestination->_31), M.r[2], 128); + vst1q_f32_ex(reinterpret_cast(&pDestination->_41), M.r[3], 128); +#else + vst1q_f32(reinterpret_cast(&pDestination->_11), M.r[0]); + vst1q_f32(reinterpret_cast(&pDestination->_21), M.r[1]); + vst1q_f32(reinterpret_cast(&pDestination->_31), M.r[2]); + vst1q_f32(reinterpret_cast(&pDestination->_41), M.r[3]); +#endif +#elif defined(_XM_SSE_INTRINSICS_) + _mm_store_ps(&pDestination->_11, M.r[0]); + _mm_store_ps(&pDestination->_21, M.r[1]); + _mm_store_ps(&pDestination->_31, M.r[2]); + _mm_store_ps(&pDestination->_41, M.r[3]); +#endif +} + diff --git a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXMathMatrix.inl b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXMathMatrix.inl similarity index 97% rename from Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXMathMatrix.inl rename to Minecraft.Client/Linux/Stubs/DirectXMath/DirectXMathMatrix.inl index cce238c5b..36f4f9a74 100644 --- a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXMathMatrix.inl +++ b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXMathMatrix.inl @@ -1,3554 +1,3554 @@ -//------------------------------------------------------------------------------------- -// DirectXMathMatrix.inl -- SIMD C++ Math library -// -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. -// -// http://go.microsoft.com/fwlink/?LinkID=615560 -//------------------------------------------------------------------------------------- - -#pragma once - -/**************************************************************************** - * - * Matrix - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ -// Comparison operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) -#pragma float_control(push) -#pragma float_control(precise, on) -#endif - -// Return true if any entry in the matrix is NaN -inline bool XM_CALLCONV XMMatrixIsNaN(FXMMATRIX M) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - size_t i = 16; - auto pWork = reinterpret_cast(&M.m[0][0]); - do - { - // Fetch value into integer unit - uint32_t uTest = pWork[0]; - // Remove sign - uTest &= 0x7FFFFFFFU; - // NaN is 0x7F800001 through 0x7FFFFFFF inclusive - uTest -= 0x7F800001U; - if (uTest < 0x007FFFFFU) - { - break; // NaN found - } - ++pWork; // Next entry - } - while (--i); - return (i != 0); // i == 0 if nothing matched -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Load in registers - float32x4_t vX = M.r[0]; - float32x4_t vY = M.r[1]; - float32x4_t vZ = M.r[2]; - float32x4_t vW = M.r[3]; - // Test themselves to check for NaN - uint32x4_t xmask = vmvnq_u32(vceqq_f32(vX, vX)); - uint32x4_t ymask = vmvnq_u32(vceqq_f32(vY, vY)); - uint32x4_t zmask = vmvnq_u32(vceqq_f32(vZ, vZ)); - uint32x4_t wmask = vmvnq_u32(vceqq_f32(vW, vW)); - // Or all the results - xmask = vorrq_u32(xmask, zmask); - ymask = vorrq_u32(ymask, wmask); - xmask = vorrq_u32(xmask, ymask); - // If any tested true, return true - uint8x8x2_t vTemp = vzip_u8( - vget_low_u8(vreinterpretq_u8_u32(xmask)), - vget_high_u8(vreinterpretq_u8_u32(xmask))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); - return (r != 0); -#elif defined(_XM_SSE_INTRINSICS_) - // Load in registers - XMVECTOR vX = M.r[0]; - XMVECTOR vY = M.r[1]; - XMVECTOR vZ = M.r[2]; - XMVECTOR vW = M.r[3]; - // Test themselves to check for NaN - vX = _mm_cmpneq_ps(vX, vX); - vY = _mm_cmpneq_ps(vY, vY); - vZ = _mm_cmpneq_ps(vZ, vZ); - vW = _mm_cmpneq_ps(vW, vW); - // Or all the results - vX = _mm_or_ps(vX, vZ); - vY = _mm_or_ps(vY, vW); - vX = _mm_or_ps(vX, vY); - // If any tested true, return true - return (_mm_movemask_ps(vX) != 0); -#else -#endif -} - -#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) -#pragma float_control(pop) -#endif - -//------------------------------------------------------------------------------ - -// Return true if any entry in the matrix is +/-INF -inline bool XM_CALLCONV XMMatrixIsInfinite(FXMMATRIX M) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - size_t i = 16; - auto pWork = reinterpret_cast(&M.m[0][0]); - do - { - // Fetch value into integer unit - uint32_t uTest = pWork[0]; - // Remove sign - uTest &= 0x7FFFFFFFU; - // INF is 0x7F800000 - if (uTest == 0x7F800000U) - { - break; // INF found - } - ++pWork; // Next entry - } - while (--i); - return (i != 0); // i == 0 if nothing matched -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Load in registers - float32x4_t vX = M.r[0]; - float32x4_t vY = M.r[1]; - float32x4_t vZ = M.r[2]; - float32x4_t vW = M.r[3]; - // Mask off the sign bits - vX = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(vX), g_XMAbsMask)); - vY = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(vY), g_XMAbsMask)); - vZ = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(vZ), g_XMAbsMask)); - vW = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(vW), g_XMAbsMask)); - // Compare to infinity - uint32x4_t xmask = vceqq_f32(vX, g_XMInfinity); - uint32x4_t ymask = vceqq_f32(vY, g_XMInfinity); - uint32x4_t zmask = vceqq_f32(vZ, g_XMInfinity); - uint32x4_t wmask = vceqq_f32(vW, g_XMInfinity); - // Or the answers together - xmask = vorrq_u32(xmask, zmask); - ymask = vorrq_u32(ymask, wmask); - xmask = vorrq_u32(xmask, ymask); - // If any tested true, return true - uint8x8x2_t vTemp = vzip_u8( - vget_low_u8(vreinterpretq_u8_u32(xmask)), - vget_high_u8(vreinterpretq_u8_u32(xmask))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); - return (r != 0); -#elif defined(_XM_SSE_INTRINSICS_) - // Mask off the sign bits - XMVECTOR vTemp1 = _mm_and_ps(M.r[0], g_XMAbsMask); - XMVECTOR vTemp2 = _mm_and_ps(M.r[1], g_XMAbsMask); - XMVECTOR vTemp3 = _mm_and_ps(M.r[2], g_XMAbsMask); - XMVECTOR vTemp4 = _mm_and_ps(M.r[3], g_XMAbsMask); - // Compare to infinity - vTemp1 = _mm_cmpeq_ps(vTemp1, g_XMInfinity); - vTemp2 = _mm_cmpeq_ps(vTemp2, g_XMInfinity); - vTemp3 = _mm_cmpeq_ps(vTemp3, g_XMInfinity); - vTemp4 = _mm_cmpeq_ps(vTemp4, g_XMInfinity); - // Or the answers together - vTemp1 = _mm_or_ps(vTemp1, vTemp2); - vTemp3 = _mm_or_ps(vTemp3, vTemp4); - vTemp1 = _mm_or_ps(vTemp1, vTemp3); - // If any are infinity, the signs are true. - return (_mm_movemask_ps(vTemp1) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -// Return true if the XMMatrix is equal to identity -inline bool XM_CALLCONV XMMatrixIsIdentity(FXMMATRIX M) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - // Use the integer pipeline to reduce branching to a minimum - auto pWork = reinterpret_cast(&M.m[0][0]); - // Convert 1.0f to zero and or them together - uint32_t uOne = pWork[0] ^ 0x3F800000U; - // Or all the 0.0f entries together - uint32_t uZero = pWork[1]; - uZero |= pWork[2]; - uZero |= pWork[3]; - // 2nd row - uZero |= pWork[4]; - uOne |= pWork[5] ^ 0x3F800000U; - uZero |= pWork[6]; - uZero |= pWork[7]; - // 3rd row - uZero |= pWork[8]; - uZero |= pWork[9]; - uOne |= pWork[10] ^ 0x3F800000U; - uZero |= pWork[11]; - // 4th row - uZero |= pWork[12]; - uZero |= pWork[13]; - uZero |= pWork[14]; - uOne |= pWork[15] ^ 0x3F800000U; - // If all zero entries are zero, the uZero==0 - uZero &= 0x7FFFFFFF; // Allow -0.0f - // If all 1.0f entries are 1.0f, then uOne==0 - uOne |= uZero; - return (uOne == 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t xmask = vceqq_f32(M.r[0], g_XMIdentityR0); - uint32x4_t ymask = vceqq_f32(M.r[1], g_XMIdentityR1); - uint32x4_t zmask = vceqq_f32(M.r[2], g_XMIdentityR2); - uint32x4_t wmask = vceqq_f32(M.r[3], g_XMIdentityR3); - xmask = vandq_u32(xmask, zmask); - ymask = vandq_u32(ymask, wmask); - xmask = vandq_u32(xmask, ymask); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(xmask)), vget_high_u8(vreinterpretq_u8_u32(xmask))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); - return (r == 0xFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp1 = _mm_cmpeq_ps(M.r[0], g_XMIdentityR0); - XMVECTOR vTemp2 = _mm_cmpeq_ps(M.r[1], g_XMIdentityR1); - XMVECTOR vTemp3 = _mm_cmpeq_ps(M.r[2], g_XMIdentityR2); - XMVECTOR vTemp4 = _mm_cmpeq_ps(M.r[3], g_XMIdentityR3); - vTemp1 = _mm_and_ps(vTemp1, vTemp2); - vTemp3 = _mm_and_ps(vTemp3, vTemp4); - vTemp1 = _mm_and_ps(vTemp1, vTemp3); - return (_mm_movemask_ps(vTemp1) == 0x0f); -#endif -} - -//------------------------------------------------------------------------------ -// Computation operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -// Perform a 4x4 matrix multiply by a 4x4 matrix -inline XMMATRIX XM_CALLCONV XMMatrixMultiply -( - FXMMATRIX M1, - CXMMATRIX M2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMMATRIX mResult; - // Cache the invariants in registers - float x = M1.m[0][0]; - float y = M1.m[0][1]; - float z = M1.m[0][2]; - float w = M1.m[0][3]; - // Perform the operation on the first row - mResult.m[0][0] = (M2.m[0][0] * x) + (M2.m[1][0] * y) + (M2.m[2][0] * z) + (M2.m[3][0] * w); - mResult.m[0][1] = (M2.m[0][1] * x) + (M2.m[1][1] * y) + (M2.m[2][1] * z) + (M2.m[3][1] * w); - mResult.m[0][2] = (M2.m[0][2] * x) + (M2.m[1][2] * y) + (M2.m[2][2] * z) + (M2.m[3][2] * w); - mResult.m[0][3] = (M2.m[0][3] * x) + (M2.m[1][3] * y) + (M2.m[2][3] * z) + (M2.m[3][3] * w); - // Repeat for all the other rows - x = M1.m[1][0]; - y = M1.m[1][1]; - z = M1.m[1][2]; - w = M1.m[1][3]; - mResult.m[1][0] = (M2.m[0][0] * x) + (M2.m[1][0] * y) + (M2.m[2][0] * z) + (M2.m[3][0] * w); - mResult.m[1][1] = (M2.m[0][1] * x) + (M2.m[1][1] * y) + (M2.m[2][1] * z) + (M2.m[3][1] * w); - mResult.m[1][2] = (M2.m[0][2] * x) + (M2.m[1][2] * y) + (M2.m[2][2] * z) + (M2.m[3][2] * w); - mResult.m[1][3] = (M2.m[0][3] * x) + (M2.m[1][3] * y) + (M2.m[2][3] * z) + (M2.m[3][3] * w); - x = M1.m[2][0]; - y = M1.m[2][1]; - z = M1.m[2][2]; - w = M1.m[2][3]; - mResult.m[2][0] = (M2.m[0][0] * x) + (M2.m[1][0] * y) + (M2.m[2][0] * z) + (M2.m[3][0] * w); - mResult.m[2][1] = (M2.m[0][1] * x) + (M2.m[1][1] * y) + (M2.m[2][1] * z) + (M2.m[3][1] * w); - mResult.m[2][2] = (M2.m[0][2] * x) + (M2.m[1][2] * y) + (M2.m[2][2] * z) + (M2.m[3][2] * w); - mResult.m[2][3] = (M2.m[0][3] * x) + (M2.m[1][3] * y) + (M2.m[2][3] * z) + (M2.m[3][3] * w); - x = M1.m[3][0]; - y = M1.m[3][1]; - z = M1.m[3][2]; - w = M1.m[3][3]; - mResult.m[3][0] = (M2.m[0][0] * x) + (M2.m[1][0] * y) + (M2.m[2][0] * z) + (M2.m[3][0] * w); - mResult.m[3][1] = (M2.m[0][1] * x) + (M2.m[1][1] * y) + (M2.m[2][1] * z) + (M2.m[3][1] * w); - mResult.m[3][2] = (M2.m[0][2] * x) + (M2.m[1][2] * y) + (M2.m[2][2] * z) + (M2.m[3][2] * w); - mResult.m[3][3] = (M2.m[0][3] * x) + (M2.m[1][3] * y) + (M2.m[2][3] * z) + (M2.m[3][3] * w); - return mResult; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - XMMATRIX mResult; - float32x2_t VL = vget_low_f32(M1.r[0]); - float32x2_t VH = vget_high_f32(M1.r[0]); - // Perform the operation on the first row - float32x4_t vX = vmulq_lane_f32(M2.r[0], VL, 0); - float32x4_t vY = vmulq_lane_f32(M2.r[1], VL, 1); - float32x4_t vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); - float32x4_t vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); - mResult.r[0] = vaddq_f32(vZ, vW); - // Repeat for the other 3 rows - VL = vget_low_f32(M1.r[1]); - VH = vget_high_f32(M1.r[1]); - vX = vmulq_lane_f32(M2.r[0], VL, 0); - vY = vmulq_lane_f32(M2.r[1], VL, 1); - vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); - vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); - mResult.r[1] = vaddq_f32(vZ, vW); - VL = vget_low_f32(M1.r[2]); - VH = vget_high_f32(M1.r[2]); - vX = vmulq_lane_f32(M2.r[0], VL, 0); - vY = vmulq_lane_f32(M2.r[1], VL, 1); - vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); - vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); - mResult.r[2] = vaddq_f32(vZ, vW); - VL = vget_low_f32(M1.r[3]); - VH = vget_high_f32(M1.r[3]); - vX = vmulq_lane_f32(M2.r[0], VL, 0); - vY = vmulq_lane_f32(M2.r[1], VL, 1); - vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); - vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); - mResult.r[3] = vaddq_f32(vZ, vW); - return mResult; -#elif defined(_XM_AVX2_INTRINSICS_) - __m256 t0 = _mm256_castps128_ps256(M1.r[0]); - t0 = _mm256_insertf128_ps(t0, M1.r[1], 1); - __m256 t1 = _mm256_castps128_ps256(M1.r[2]); - t1 = _mm256_insertf128_ps(t1, M1.r[3], 1); - - __m256 u0 = _mm256_castps128_ps256(M2.r[0]); - u0 = _mm256_insertf128_ps(u0, M2.r[1], 1); - __m256 u1 = _mm256_castps128_ps256(M2.r[2]); - u1 = _mm256_insertf128_ps(u1, M2.r[3], 1); - - __m256 a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(0, 0, 0, 0)); - __m256 a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(0, 0, 0, 0)); - __m256 b0 = _mm256_permute2f128_ps(u0, u0, 0x00); - __m256 c0 = _mm256_mul_ps(a0, b0); - __m256 c1 = _mm256_mul_ps(a1, b0); - - a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(1, 1, 1, 1)); - a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(1, 1, 1, 1)); - b0 = _mm256_permute2f128_ps(u0, u0, 0x11); - __m256 c2 = _mm256_fmadd_ps(a0, b0, c0); - __m256 c3 = _mm256_fmadd_ps(a1, b0, c1); - - a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(2, 2, 2, 2)); - a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(2, 2, 2, 2)); - __m256 b1 = _mm256_permute2f128_ps(u1, u1, 0x00); - __m256 c4 = _mm256_mul_ps(a0, b1); - __m256 c5 = _mm256_mul_ps(a1, b1); - - a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(3, 3, 3, 3)); - a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(3, 3, 3, 3)); - b1 = _mm256_permute2f128_ps(u1, u1, 0x11); - __m256 c6 = _mm256_fmadd_ps(a0, b1, c4); - __m256 c7 = _mm256_fmadd_ps(a1, b1, c5); - - t0 = _mm256_add_ps(c2, c6); - t1 = _mm256_add_ps(c3, c7); - - XMMATRIX mResult; - mResult.r[0] = _mm256_castps256_ps128(t0); - mResult.r[1] = _mm256_extractf128_ps(t0, 1); - mResult.r[2] = _mm256_castps256_ps128(t1); - mResult.r[3] = _mm256_extractf128_ps(t1, 1); - return mResult; -#elif defined(_XM_SSE_INTRINSICS_) - XMMATRIX mResult; - // Splat the component X,Y,Z then W -#if defined(_XM_AVX_INTRINSICS_) - XMVECTOR vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[0]) + 0); - XMVECTOR vY = _mm_broadcast_ss(reinterpret_cast(&M1.r[0]) + 1); - XMVECTOR vZ = _mm_broadcast_ss(reinterpret_cast(&M1.r[0]) + 2); - XMVECTOR vW = _mm_broadcast_ss(reinterpret_cast(&M1.r[0]) + 3); -#else - // Use vW to hold the original row - XMVECTOR vW = M1.r[0]; - XMVECTOR vX = XM_PERMUTE_PS(vW, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vY = XM_PERMUTE_PS(vW, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); -#endif - // Perform the operation on the first row - vX = _mm_mul_ps(vX, M2.r[0]); - vY = _mm_mul_ps(vY, M2.r[1]); - vZ = _mm_mul_ps(vZ, M2.r[2]); - vW = _mm_mul_ps(vW, M2.r[3]); - // Perform a binary add to reduce cumulative errors - vX = _mm_add_ps(vX, vZ); - vY = _mm_add_ps(vY, vW); - vX = _mm_add_ps(vX, vY); - mResult.r[0] = vX; - // Repeat for the other 3 rows -#if defined(_XM_AVX_INTRINSICS_) - vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[1]) + 0); - vY = _mm_broadcast_ss(reinterpret_cast(&M1.r[1]) + 1); - vZ = _mm_broadcast_ss(reinterpret_cast(&M1.r[1]) + 2); - vW = _mm_broadcast_ss(reinterpret_cast(&M1.r[1]) + 3); -#else - vW = M1.r[1]; - vX = XM_PERMUTE_PS(vW, _MM_SHUFFLE(0, 0, 0, 0)); - vY = XM_PERMUTE_PS(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); -#endif - vX = _mm_mul_ps(vX, M2.r[0]); - vY = _mm_mul_ps(vY, M2.r[1]); - vZ = _mm_mul_ps(vZ, M2.r[2]); - vW = _mm_mul_ps(vW, M2.r[3]); - vX = _mm_add_ps(vX, vZ); - vY = _mm_add_ps(vY, vW); - vX = _mm_add_ps(vX, vY); - mResult.r[1] = vX; -#if defined(_XM_AVX_INTRINSICS_) - vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[2]) + 0); - vY = _mm_broadcast_ss(reinterpret_cast(&M1.r[2]) + 1); - vZ = _mm_broadcast_ss(reinterpret_cast(&M1.r[2]) + 2); - vW = _mm_broadcast_ss(reinterpret_cast(&M1.r[2]) + 3); -#else - vW = M1.r[2]; - vX = XM_PERMUTE_PS(vW, _MM_SHUFFLE(0, 0, 0, 0)); - vY = XM_PERMUTE_PS(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); -#endif - vX = _mm_mul_ps(vX, M2.r[0]); - vY = _mm_mul_ps(vY, M2.r[1]); - vZ = _mm_mul_ps(vZ, M2.r[2]); - vW = _mm_mul_ps(vW, M2.r[3]); - vX = _mm_add_ps(vX, vZ); - vY = _mm_add_ps(vY, vW); - vX = _mm_add_ps(vX, vY); - mResult.r[2] = vX; -#if defined(_XM_AVX_INTRINSICS_) - vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[3]) + 0); - vY = _mm_broadcast_ss(reinterpret_cast(&M1.r[3]) + 1); - vZ = _mm_broadcast_ss(reinterpret_cast(&M1.r[3]) + 2); - vW = _mm_broadcast_ss(reinterpret_cast(&M1.r[3]) + 3); -#else - vW = M1.r[3]; - vX = XM_PERMUTE_PS(vW, _MM_SHUFFLE(0, 0, 0, 0)); - vY = XM_PERMUTE_PS(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); -#endif - vX = _mm_mul_ps(vX, M2.r[0]); - vY = _mm_mul_ps(vY, M2.r[1]); - vZ = _mm_mul_ps(vZ, M2.r[2]); - vW = _mm_mul_ps(vW, M2.r[3]); - vX = _mm_add_ps(vX, vZ); - vY = _mm_add_ps(vY, vW); - vX = _mm_add_ps(vX, vY); - mResult.r[3] = vX; - return mResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose -( - FXMMATRIX M1, - CXMMATRIX M2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMMATRIX mResult; - // Cache the invariants in registers - float x = M2.m[0][0]; - float y = M2.m[1][0]; - float z = M2.m[2][0]; - float w = M2.m[3][0]; - // Perform the operation on the first row - mResult.m[0][0] = (M1.m[0][0] * x) + (M1.m[0][1] * y) + (M1.m[0][2] * z) + (M1.m[0][3] * w); - mResult.m[0][1] = (M1.m[1][0] * x) + (M1.m[1][1] * y) + (M1.m[1][2] * z) + (M1.m[1][3] * w); - mResult.m[0][2] = (M1.m[2][0] * x) + (M1.m[2][1] * y) + (M1.m[2][2] * z) + (M1.m[2][3] * w); - mResult.m[0][3] = (M1.m[3][0] * x) + (M1.m[3][1] * y) + (M1.m[3][2] * z) + (M1.m[3][3] * w); - // Repeat for all the other rows - x = M2.m[0][1]; - y = M2.m[1][1]; - z = M2.m[2][1]; - w = M2.m[3][1]; - mResult.m[1][0] = (M1.m[0][0] * x) + (M1.m[0][1] * y) + (M1.m[0][2] * z) + (M1.m[0][3] * w); - mResult.m[1][1] = (M1.m[1][0] * x) + (M1.m[1][1] * y) + (M1.m[1][2] * z) + (M1.m[1][3] * w); - mResult.m[1][2] = (M1.m[2][0] * x) + (M1.m[2][1] * y) + (M1.m[2][2] * z) + (M1.m[2][3] * w); - mResult.m[1][3] = (M1.m[3][0] * x) + (M1.m[3][1] * y) + (M1.m[3][2] * z) + (M1.m[3][3] * w); - x = M2.m[0][2]; - y = M2.m[1][2]; - z = M2.m[2][2]; - w = M2.m[3][2]; - mResult.m[2][0] = (M1.m[0][0] * x) + (M1.m[0][1] * y) + (M1.m[0][2] * z) + (M1.m[0][3] * w); - mResult.m[2][1] = (M1.m[1][0] * x) + (M1.m[1][1] * y) + (M1.m[1][2] * z) + (M1.m[1][3] * w); - mResult.m[2][2] = (M1.m[2][0] * x) + (M1.m[2][1] * y) + (M1.m[2][2] * z) + (M1.m[2][3] * w); - mResult.m[2][3] = (M1.m[3][0] * x) + (M1.m[3][1] * y) + (M1.m[3][2] * z) + (M1.m[3][3] * w); - x = M2.m[0][3]; - y = M2.m[1][3]; - z = M2.m[2][3]; - w = M2.m[3][3]; - mResult.m[3][0] = (M1.m[0][0] * x) + (M1.m[0][1] * y) + (M1.m[0][2] * z) + (M1.m[0][3] * w); - mResult.m[3][1] = (M1.m[1][0] * x) + (M1.m[1][1] * y) + (M1.m[1][2] * z) + (M1.m[1][3] * w); - mResult.m[3][2] = (M1.m[2][0] * x) + (M1.m[2][1] * y) + (M1.m[2][2] * z) + (M1.m[2][3] * w); - mResult.m[3][3] = (M1.m[3][0] * x) + (M1.m[3][1] * y) + (M1.m[3][2] * z) + (M1.m[3][3] * w); - return mResult; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(M1.r[0]); - float32x2_t VH = vget_high_f32(M1.r[0]); - // Perform the operation on the first row - float32x4_t vX = vmulq_lane_f32(M2.r[0], VL, 0); - float32x4_t vY = vmulq_lane_f32(M2.r[1], VL, 1); - float32x4_t vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); - float32x4_t vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); - float32x4_t r0 = vaddq_f32(vZ, vW); - // Repeat for the other 3 rows - VL = vget_low_f32(M1.r[1]); - VH = vget_high_f32(M1.r[1]); - vX = vmulq_lane_f32(M2.r[0], VL, 0); - vY = vmulq_lane_f32(M2.r[1], VL, 1); - vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); - vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); - float32x4_t r1 = vaddq_f32(vZ, vW); - VL = vget_low_f32(M1.r[2]); - VH = vget_high_f32(M1.r[2]); - vX = vmulq_lane_f32(M2.r[0], VL, 0); - vY = vmulq_lane_f32(M2.r[1], VL, 1); - vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); - vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); - float32x4_t r2 = vaddq_f32(vZ, vW); - VL = vget_low_f32(M1.r[3]); - VH = vget_high_f32(M1.r[3]); - vX = vmulq_lane_f32(M2.r[0], VL, 0); - vY = vmulq_lane_f32(M2.r[1], VL, 1); - vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); - vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); - float32x4_t r3 = vaddq_f32(vZ, vW); - - // Transpose result - float32x4x2_t P0 = vzipq_f32(r0, r2); - float32x4x2_t P1 = vzipq_f32(r1, r3); - - float32x4x2_t T0 = vzipq_f32(P0.val[0], P1.val[0]); - float32x4x2_t T1 = vzipq_f32(P0.val[1], P1.val[1]); - - XMMATRIX mResult; - mResult.r[0] = T0.val[0]; - mResult.r[1] = T0.val[1]; - mResult.r[2] = T1.val[0]; - mResult.r[3] = T1.val[1]; - return mResult; -#elif defined(_XM_AVX2_INTRINSICS_) - __m256 t0 = _mm256_castps128_ps256(M1.r[0]); - t0 = _mm256_insertf128_ps(t0, M1.r[1], 1); - __m256 t1 = _mm256_castps128_ps256(M1.r[2]); - t1 = _mm256_insertf128_ps(t1, M1.r[3], 1); - - __m256 u0 = _mm256_castps128_ps256(M2.r[0]); - u0 = _mm256_insertf128_ps(u0, M2.r[1], 1); - __m256 u1 = _mm256_castps128_ps256(M2.r[2]); - u1 = _mm256_insertf128_ps(u1, M2.r[3], 1); - - __m256 a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(0, 0, 0, 0)); - __m256 a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(0, 0, 0, 0)); - __m256 b0 = _mm256_permute2f128_ps(u0, u0, 0x00); - __m256 c0 = _mm256_mul_ps(a0, b0); - __m256 c1 = _mm256_mul_ps(a1, b0); - - a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(1, 1, 1, 1)); - a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(1, 1, 1, 1)); - b0 = _mm256_permute2f128_ps(u0, u0, 0x11); - __m256 c2 = _mm256_fmadd_ps(a0, b0, c0); - __m256 c3 = _mm256_fmadd_ps(a1, b0, c1); - - a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(2, 2, 2, 2)); - a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(2, 2, 2, 2)); - __m256 b1 = _mm256_permute2f128_ps(u1, u1, 0x00); - __m256 c4 = _mm256_mul_ps(a0, b1); - __m256 c5 = _mm256_mul_ps(a1, b1); - - a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(3, 3, 3, 3)); - a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(3, 3, 3, 3)); - b1 = _mm256_permute2f128_ps(u1, u1, 0x11); - __m256 c6 = _mm256_fmadd_ps(a0, b1, c4); - __m256 c7 = _mm256_fmadd_ps(a1, b1, c5); - - t0 = _mm256_add_ps(c2, c6); - t1 = _mm256_add_ps(c3, c7); - - // Transpose result - __m256 vTemp = _mm256_unpacklo_ps(t0, t1); - __m256 vTemp2 = _mm256_unpackhi_ps(t0, t1); - __m256 vTemp3 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x20); - __m256 vTemp4 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x31); - vTemp = _mm256_unpacklo_ps(vTemp3, vTemp4); - vTemp2 = _mm256_unpackhi_ps(vTemp3, vTemp4); - t0 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x20); - t1 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x31); - - XMMATRIX mResult; - mResult.r[0] = _mm256_castps256_ps128(t0); - mResult.r[1] = _mm256_extractf128_ps(t0, 1); - mResult.r[2] = _mm256_castps256_ps128(t1); - mResult.r[3] = _mm256_extractf128_ps(t1, 1); - return mResult; -#elif defined(_XM_SSE_INTRINSICS_) - // Splat the component X,Y,Z then W -#if defined(_XM_AVX_INTRINSICS_) - XMVECTOR vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[0]) + 0); - XMVECTOR vY = _mm_broadcast_ss(reinterpret_cast(&M1.r[0]) + 1); - XMVECTOR vZ = _mm_broadcast_ss(reinterpret_cast(&M1.r[0]) + 2); - XMVECTOR vW = _mm_broadcast_ss(reinterpret_cast(&M1.r[0]) + 3); -#else - // Use vW to hold the original row - XMVECTOR vW = M1.r[0]; - XMVECTOR vX = XM_PERMUTE_PS(vW, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vY = XM_PERMUTE_PS(vW, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); -#endif - // Perform the operation on the first row - vX = _mm_mul_ps(vX, M2.r[0]); - vY = _mm_mul_ps(vY, M2.r[1]); - vZ = _mm_mul_ps(vZ, M2.r[2]); - vW = _mm_mul_ps(vW, M2.r[3]); - // Perform a binary add to reduce cumulative errors - vX = _mm_add_ps(vX, vZ); - vY = _mm_add_ps(vY, vW); - vX = _mm_add_ps(vX, vY); - XMVECTOR r0 = vX; - // Repeat for the other 3 rows -#if defined(_XM_AVX_INTRINSICS_) - vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[1]) + 0); - vY = _mm_broadcast_ss(reinterpret_cast(&M1.r[1]) + 1); - vZ = _mm_broadcast_ss(reinterpret_cast(&M1.r[1]) + 2); - vW = _mm_broadcast_ss(reinterpret_cast(&M1.r[1]) + 3); -#else - vW = M1.r[1]; - vX = XM_PERMUTE_PS(vW, _MM_SHUFFLE(0, 0, 0, 0)); - vY = XM_PERMUTE_PS(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); -#endif - vX = _mm_mul_ps(vX, M2.r[0]); - vY = _mm_mul_ps(vY, M2.r[1]); - vZ = _mm_mul_ps(vZ, M2.r[2]); - vW = _mm_mul_ps(vW, M2.r[3]); - vX = _mm_add_ps(vX, vZ); - vY = _mm_add_ps(vY, vW); - vX = _mm_add_ps(vX, vY); - XMVECTOR r1 = vX; -#if defined(_XM_AVX_INTRINSICS_) - vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[2]) + 0); - vY = _mm_broadcast_ss(reinterpret_cast(&M1.r[2]) + 1); - vZ = _mm_broadcast_ss(reinterpret_cast(&M1.r[2]) + 2); - vW = _mm_broadcast_ss(reinterpret_cast(&M1.r[2]) + 3); -#else - vW = M1.r[2]; - vX = XM_PERMUTE_PS(vW, _MM_SHUFFLE(0, 0, 0, 0)); - vY = XM_PERMUTE_PS(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); -#endif - vX = _mm_mul_ps(vX, M2.r[0]); - vY = _mm_mul_ps(vY, M2.r[1]); - vZ = _mm_mul_ps(vZ, M2.r[2]); - vW = _mm_mul_ps(vW, M2.r[3]); - vX = _mm_add_ps(vX, vZ); - vY = _mm_add_ps(vY, vW); - vX = _mm_add_ps(vX, vY); - XMVECTOR r2 = vX; -#if defined(_XM_AVX_INTRINSICS_) - vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[3]) + 0); - vY = _mm_broadcast_ss(reinterpret_cast(&M1.r[3]) + 1); - vZ = _mm_broadcast_ss(reinterpret_cast(&M1.r[3]) + 2); - vW = _mm_broadcast_ss(reinterpret_cast(&M1.r[3]) + 3); -#else - vW = M1.r[3]; - vX = XM_PERMUTE_PS(vW, _MM_SHUFFLE(0, 0, 0, 0)); - vY = XM_PERMUTE_PS(vW, _MM_SHUFFLE(1, 1, 1, 1)); - vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); - vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); -#endif - vX = _mm_mul_ps(vX, M2.r[0]); - vY = _mm_mul_ps(vY, M2.r[1]); - vZ = _mm_mul_ps(vZ, M2.r[2]); - vW = _mm_mul_ps(vW, M2.r[3]); - vX = _mm_add_ps(vX, vZ); - vY = _mm_add_ps(vY, vW); - vX = _mm_add_ps(vX, vY); - XMVECTOR r3 = vX; - - // Transpose result - // x.x,x.y,y.x,y.y - XMVECTOR vTemp1 = _mm_shuffle_ps(r0, r1, _MM_SHUFFLE(1, 0, 1, 0)); - // x.z,x.w,y.z,y.w - XMVECTOR vTemp3 = _mm_shuffle_ps(r0, r1, _MM_SHUFFLE(3, 2, 3, 2)); - // z.x,z.y,w.x,w.y - XMVECTOR vTemp2 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(1, 0, 1, 0)); - // z.z,z.w,w.z,w.w - XMVECTOR vTemp4 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(3, 2, 3, 2)); - - XMMATRIX mResult; - // x.x,y.x,z.x,w.x - mResult.r[0] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(2, 0, 2, 0)); - // x.y,y.y,z.y,w.y - mResult.r[1] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(3, 1, 3, 1)); - // x.z,y.z,z.z,w.z - mResult.r[2] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 0, 2, 0)); - // x.w,y.w,z.w,w.w - mResult.r[3] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(3, 1, 3, 1)); - return mResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixTranspose(FXMMATRIX M) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - // Original matrix: - // - // m00m01m02m03 - // m10m11m12m13 - // m20m21m22m23 - // m30m31m32m33 - - XMMATRIX P; - P.r[0] = XMVectorMergeXY(M.r[0], M.r[2]); // m00m20m01m21 - P.r[1] = XMVectorMergeXY(M.r[1], M.r[3]); // m10m30m11m31 - P.r[2] = XMVectorMergeZW(M.r[0], M.r[2]); // m02m22m03m23 - P.r[3] = XMVectorMergeZW(M.r[1], M.r[3]); // m12m32m13m33 - - XMMATRIX MT; - MT.r[0] = XMVectorMergeXY(P.r[0], P.r[1]); // m00m10m20m30 - MT.r[1] = XMVectorMergeZW(P.r[0], P.r[1]); // m01m11m21m31 - MT.r[2] = XMVectorMergeXY(P.r[2], P.r[3]); // m02m12m22m32 - MT.r[3] = XMVectorMergeZW(P.r[2], P.r[3]); // m03m13m23m33 - return MT; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4x2_t P0 = vzipq_f32(M.r[0], M.r[2]); - float32x4x2_t P1 = vzipq_f32(M.r[1], M.r[3]); - - float32x4x2_t T0 = vzipq_f32(P0.val[0], P1.val[0]); - float32x4x2_t T1 = vzipq_f32(P0.val[1], P1.val[1]); - - XMMATRIX mResult; - mResult.r[0] = T0.val[0]; - mResult.r[1] = T0.val[1]; - mResult.r[2] = T1.val[0]; - mResult.r[3] = T1.val[1]; - return mResult; -#elif defined(_XM_AVX2_INTRINSICS_) - __m256 t0 = _mm256_castps128_ps256(M.r[0]); - t0 = _mm256_insertf128_ps(t0, M.r[1], 1); - __m256 t1 = _mm256_castps128_ps256(M.r[2]); - t1 = _mm256_insertf128_ps(t1, M.r[3], 1); - - __m256 vTemp = _mm256_unpacklo_ps(t0, t1); - __m256 vTemp2 = _mm256_unpackhi_ps(t0, t1); - __m256 vTemp3 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x20); - __m256 vTemp4 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x31); - vTemp = _mm256_unpacklo_ps(vTemp3, vTemp4); - vTemp2 = _mm256_unpackhi_ps(vTemp3, vTemp4); - t0 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x20); - t1 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x31); - - XMMATRIX mResult; - mResult.r[0] = _mm256_castps256_ps128(t0); - mResult.r[1] = _mm256_extractf128_ps(t0, 1); - mResult.r[2] = _mm256_castps256_ps128(t1); - mResult.r[3] = _mm256_extractf128_ps(t1, 1); - return mResult; -#elif defined(_XM_SSE_INTRINSICS_) - // x.x,x.y,y.x,y.y - XMVECTOR vTemp1 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(1, 0, 1, 0)); - // x.z,x.w,y.z,y.w - XMVECTOR vTemp3 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(3, 2, 3, 2)); - // z.x,z.y,w.x,w.y - XMVECTOR vTemp2 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(1, 0, 1, 0)); - // z.z,z.w,w.z,w.w - XMVECTOR vTemp4 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(3, 2, 3, 2)); - - XMMATRIX mResult; - // x.x,y.x,z.x,w.x - mResult.r[0] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(2, 0, 2, 0)); - // x.y,y.y,z.y,w.y - mResult.r[1] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(3, 1, 3, 1)); - // x.z,y.z,z.z,w.z - mResult.r[2] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 0, 2, 0)); - // x.w,y.w,z.w,w.w - mResult.r[3] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(3, 1, 3, 1)); - return mResult; -#endif -} - -//------------------------------------------------------------------------------ -// Return the inverse and the determinant of a 4x4 matrix -_Use_decl_annotations_ -inline XMMATRIX XM_CALLCONV XMMatrixInverse -( - XMVECTOR* pDeterminant, - FXMMATRIX M -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) - - XMMATRIX MT = XMMatrixTranspose(M); - - XMVECTOR V0[4], V1[4]; - V0[0] = XMVectorSwizzle(MT.r[2]); - V1[0] = XMVectorSwizzle(MT.r[3]); - V0[1] = XMVectorSwizzle(MT.r[0]); - V1[1] = XMVectorSwizzle(MT.r[1]); - V0[2] = XMVectorPermute(MT.r[2], MT.r[0]); - V1[2] = XMVectorPermute(MT.r[3], MT.r[1]); - - XMVECTOR D0 = XMVectorMultiply(V0[0], V1[0]); - XMVECTOR D1 = XMVectorMultiply(V0[1], V1[1]); - XMVECTOR D2 = XMVectorMultiply(V0[2], V1[2]); - - V0[0] = XMVectorSwizzle(MT.r[2]); - V1[0] = XMVectorSwizzle(MT.r[3]); - V0[1] = XMVectorSwizzle(MT.r[0]); - V1[1] = XMVectorSwizzle(MT.r[1]); - V0[2] = XMVectorPermute(MT.r[2], MT.r[0]); - V1[2] = XMVectorPermute(MT.r[3], MT.r[1]); - - D0 = XMVectorNegativeMultiplySubtract(V0[0], V1[0], D0); - D1 = XMVectorNegativeMultiplySubtract(V0[1], V1[1], D1); - D2 = XMVectorNegativeMultiplySubtract(V0[2], V1[2], D2); - - V0[0] = XMVectorSwizzle(MT.r[1]); - V1[0] = XMVectorPermute(D0, D2); - V0[1] = XMVectorSwizzle(MT.r[0]); - V1[1] = XMVectorPermute(D0, D2); - V0[2] = XMVectorSwizzle(MT.r[3]); - V1[2] = XMVectorPermute(D1, D2); - V0[3] = XMVectorSwizzle(MT.r[2]); - V1[3] = XMVectorPermute(D1, D2); - - XMVECTOR C0 = XMVectorMultiply(V0[0], V1[0]); - XMVECTOR C2 = XMVectorMultiply(V0[1], V1[1]); - XMVECTOR C4 = XMVectorMultiply(V0[2], V1[2]); - XMVECTOR C6 = XMVectorMultiply(V0[3], V1[3]); - - V0[0] = XMVectorSwizzle(MT.r[1]); - V1[0] = XMVectorPermute(D0, D2); - V0[1] = XMVectorSwizzle(MT.r[0]); - V1[1] = XMVectorPermute(D0, D2); - V0[2] = XMVectorSwizzle(MT.r[3]); - V1[2] = XMVectorPermute(D1, D2); - V0[3] = XMVectorSwizzle(MT.r[2]); - V1[3] = XMVectorPermute(D1, D2); - - C0 = XMVectorNegativeMultiplySubtract(V0[0], V1[0], C0); - C2 = XMVectorNegativeMultiplySubtract(V0[1], V1[1], C2); - C4 = XMVectorNegativeMultiplySubtract(V0[2], V1[2], C4); - C6 = XMVectorNegativeMultiplySubtract(V0[3], V1[3], C6); - - V0[0] = XMVectorSwizzle(MT.r[1]); - V1[0] = XMVectorPermute(D0, D2); - V0[1] = XMVectorSwizzle(MT.r[0]); - V1[1] = XMVectorPermute(D0, D2); - V0[2] = XMVectorSwizzle(MT.r[3]); - V1[2] = XMVectorPermute(D1, D2); - V0[3] = XMVectorSwizzle(MT.r[2]); - V1[3] = XMVectorPermute(D1, D2); - - XMVECTOR C1 = XMVectorNegativeMultiplySubtract(V0[0], V1[0], C0); - C0 = XMVectorMultiplyAdd(V0[0], V1[0], C0); - XMVECTOR C3 = XMVectorMultiplyAdd(V0[1], V1[1], C2); - C2 = XMVectorNegativeMultiplySubtract(V0[1], V1[1], C2); - XMVECTOR C5 = XMVectorNegativeMultiplySubtract(V0[2], V1[2], C4); - C4 = XMVectorMultiplyAdd(V0[2], V1[2], C4); - XMVECTOR C7 = XMVectorMultiplyAdd(V0[3], V1[3], C6); - C6 = XMVectorNegativeMultiplySubtract(V0[3], V1[3], C6); - - XMMATRIX R; - R.r[0] = XMVectorSelect(C0, C1, g_XMSelect0101.v); - R.r[1] = XMVectorSelect(C2, C3, g_XMSelect0101.v); - R.r[2] = XMVectorSelect(C4, C5, g_XMSelect0101.v); - R.r[3] = XMVectorSelect(C6, C7, g_XMSelect0101.v); - - XMVECTOR Determinant = XMVector4Dot(R.r[0], MT.r[0]); - - if (pDeterminant != nullptr) - *pDeterminant = Determinant; - - XMVECTOR Reciprocal = XMVectorReciprocal(Determinant); - - XMMATRIX Result; - Result.r[0] = XMVectorMultiply(R.r[0], Reciprocal); - Result.r[1] = XMVectorMultiply(R.r[1], Reciprocal); - Result.r[2] = XMVectorMultiply(R.r[2], Reciprocal); - Result.r[3] = XMVectorMultiply(R.r[3], Reciprocal); - return Result; - -#elif defined(_XM_SSE_INTRINSICS_) - // Transpose matrix - XMVECTOR vTemp1 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(1, 0, 1, 0)); - XMVECTOR vTemp3 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(3, 2, 3, 2)); - XMVECTOR vTemp2 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(1, 0, 1, 0)); - XMVECTOR vTemp4 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(3, 2, 3, 2)); - - XMMATRIX MT; - MT.r[0] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(2, 0, 2, 0)); - MT.r[1] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(3, 1, 3, 1)); - MT.r[2] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 0, 2, 0)); - MT.r[3] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(3, 1, 3, 1)); - - XMVECTOR V00 = XM_PERMUTE_PS(MT.r[2], _MM_SHUFFLE(1, 1, 0, 0)); - XMVECTOR V10 = XM_PERMUTE_PS(MT.r[3], _MM_SHUFFLE(3, 2, 3, 2)); - XMVECTOR V01 = XM_PERMUTE_PS(MT.r[0], _MM_SHUFFLE(1, 1, 0, 0)); - XMVECTOR V11 = XM_PERMUTE_PS(MT.r[1], _MM_SHUFFLE(3, 2, 3, 2)); - XMVECTOR V02 = _mm_shuffle_ps(MT.r[2], MT.r[0], _MM_SHUFFLE(2, 0, 2, 0)); - XMVECTOR V12 = _mm_shuffle_ps(MT.r[3], MT.r[1], _MM_SHUFFLE(3, 1, 3, 1)); - - XMVECTOR D0 = _mm_mul_ps(V00, V10); - XMVECTOR D1 = _mm_mul_ps(V01, V11); - XMVECTOR D2 = _mm_mul_ps(V02, V12); - - V00 = XM_PERMUTE_PS(MT.r[2], _MM_SHUFFLE(3, 2, 3, 2)); - V10 = XM_PERMUTE_PS(MT.r[3], _MM_SHUFFLE(1, 1, 0, 0)); - V01 = XM_PERMUTE_PS(MT.r[0], _MM_SHUFFLE(3, 2, 3, 2)); - V11 = XM_PERMUTE_PS(MT.r[1], _MM_SHUFFLE(1, 1, 0, 0)); - V02 = _mm_shuffle_ps(MT.r[2], MT.r[0], _MM_SHUFFLE(3, 1, 3, 1)); - V12 = _mm_shuffle_ps(MT.r[3], MT.r[1], _MM_SHUFFLE(2, 0, 2, 0)); - - D0 = XM_FNMADD_PS(V00, V10, D0); - D1 = XM_FNMADD_PS(V01, V11, D1); - D2 = XM_FNMADD_PS(V02, V12, D2); - // V11 = D0Y,D0W,D2Y,D2Y - V11 = _mm_shuffle_ps(D0, D2, _MM_SHUFFLE(1, 1, 3, 1)); - V00 = XM_PERMUTE_PS(MT.r[1], _MM_SHUFFLE(1, 0, 2, 1)); - V10 = _mm_shuffle_ps(V11, D0, _MM_SHUFFLE(0, 3, 0, 2)); - V01 = XM_PERMUTE_PS(MT.r[0], _MM_SHUFFLE(0, 1, 0, 2)); - V11 = _mm_shuffle_ps(V11, D0, _MM_SHUFFLE(2, 1, 2, 1)); - // V13 = D1Y,D1W,D2W,D2W - XMVECTOR V13 = _mm_shuffle_ps(D1, D2, _MM_SHUFFLE(3, 3, 3, 1)); - V02 = XM_PERMUTE_PS(MT.r[3], _MM_SHUFFLE(1, 0, 2, 1)); - V12 = _mm_shuffle_ps(V13, D1, _MM_SHUFFLE(0, 3, 0, 2)); - XMVECTOR V03 = XM_PERMUTE_PS(MT.r[2], _MM_SHUFFLE(0, 1, 0, 2)); - V13 = _mm_shuffle_ps(V13, D1, _MM_SHUFFLE(2, 1, 2, 1)); - - XMVECTOR C0 = _mm_mul_ps(V00, V10); - XMVECTOR C2 = _mm_mul_ps(V01, V11); - XMVECTOR C4 = _mm_mul_ps(V02, V12); - XMVECTOR C6 = _mm_mul_ps(V03, V13); - - // V11 = D0X,D0Y,D2X,D2X - V11 = _mm_shuffle_ps(D0, D2, _MM_SHUFFLE(0, 0, 1, 0)); - V00 = XM_PERMUTE_PS(MT.r[1], _MM_SHUFFLE(2, 1, 3, 2)); - V10 = _mm_shuffle_ps(D0, V11, _MM_SHUFFLE(2, 1, 0, 3)); - V01 = XM_PERMUTE_PS(MT.r[0], _MM_SHUFFLE(1, 3, 2, 3)); - V11 = _mm_shuffle_ps(D0, V11, _MM_SHUFFLE(0, 2, 1, 2)); - // V13 = D1X,D1Y,D2Z,D2Z - V13 = _mm_shuffle_ps(D1, D2, _MM_SHUFFLE(2, 2, 1, 0)); - V02 = XM_PERMUTE_PS(MT.r[3], _MM_SHUFFLE(2, 1, 3, 2)); - V12 = _mm_shuffle_ps(D1, V13, _MM_SHUFFLE(2, 1, 0, 3)); - V03 = XM_PERMUTE_PS(MT.r[2], _MM_SHUFFLE(1, 3, 2, 3)); - V13 = _mm_shuffle_ps(D1, V13, _MM_SHUFFLE(0, 2, 1, 2)); - - C0 = XM_FNMADD_PS(V00, V10, C0); - C2 = XM_FNMADD_PS(V01, V11, C2); - C4 = XM_FNMADD_PS(V02, V12, C4); - C6 = XM_FNMADD_PS(V03, V13, C6); - - V00 = XM_PERMUTE_PS(MT.r[1], _MM_SHUFFLE(0, 3, 0, 3)); - // V10 = D0Z,D0Z,D2X,D2Y - V10 = _mm_shuffle_ps(D0, D2, _MM_SHUFFLE(1, 0, 2, 2)); - V10 = XM_PERMUTE_PS(V10, _MM_SHUFFLE(0, 2, 3, 0)); - V01 = XM_PERMUTE_PS(MT.r[0], _MM_SHUFFLE(2, 0, 3, 1)); - // V11 = D0X,D0W,D2X,D2Y - V11 = _mm_shuffle_ps(D0, D2, _MM_SHUFFLE(1, 0, 3, 0)); - V11 = XM_PERMUTE_PS(V11, _MM_SHUFFLE(2, 1, 0, 3)); - V02 = XM_PERMUTE_PS(MT.r[3], _MM_SHUFFLE(0, 3, 0, 3)); - // V12 = D1Z,D1Z,D2Z,D2W - V12 = _mm_shuffle_ps(D1, D2, _MM_SHUFFLE(3, 2, 2, 2)); - V12 = XM_PERMUTE_PS(V12, _MM_SHUFFLE(0, 2, 3, 0)); - V03 = XM_PERMUTE_PS(MT.r[2], _MM_SHUFFLE(2, 0, 3, 1)); - // V13 = D1X,D1W,D2Z,D2W - V13 = _mm_shuffle_ps(D1, D2, _MM_SHUFFLE(3, 2, 3, 0)); - V13 = XM_PERMUTE_PS(V13, _MM_SHUFFLE(2, 1, 0, 3)); - - V00 = _mm_mul_ps(V00, V10); - V01 = _mm_mul_ps(V01, V11); - V02 = _mm_mul_ps(V02, V12); - V03 = _mm_mul_ps(V03, V13); - XMVECTOR C1 = _mm_sub_ps(C0, V00); - C0 = _mm_add_ps(C0, V00); - XMVECTOR C3 = _mm_add_ps(C2, V01); - C2 = _mm_sub_ps(C2, V01); - XMVECTOR C5 = _mm_sub_ps(C4, V02); - C4 = _mm_add_ps(C4, V02); - XMVECTOR C7 = _mm_add_ps(C6, V03); - C6 = _mm_sub_ps(C6, V03); - - C0 = _mm_shuffle_ps(C0, C1, _MM_SHUFFLE(3, 1, 2, 0)); - C2 = _mm_shuffle_ps(C2, C3, _MM_SHUFFLE(3, 1, 2, 0)); - C4 = _mm_shuffle_ps(C4, C5, _MM_SHUFFLE(3, 1, 2, 0)); - C6 = _mm_shuffle_ps(C6, C7, _MM_SHUFFLE(3, 1, 2, 0)); - C0 = XM_PERMUTE_PS(C0, _MM_SHUFFLE(3, 1, 2, 0)); - C2 = XM_PERMUTE_PS(C2, _MM_SHUFFLE(3, 1, 2, 0)); - C4 = XM_PERMUTE_PS(C4, _MM_SHUFFLE(3, 1, 2, 0)); - C6 = XM_PERMUTE_PS(C6, _MM_SHUFFLE(3, 1, 2, 0)); - // Get the determinant - XMVECTOR vTemp = XMVector4Dot(C0, MT.r[0]); - if (pDeterminant != nullptr) - *pDeterminant = vTemp; - vTemp = _mm_div_ps(g_XMOne, vTemp); - XMMATRIX mResult; - mResult.r[0] = _mm_mul_ps(C0, vTemp); - mResult.r[1] = _mm_mul_ps(C2, vTemp); - mResult.r[2] = _mm_mul_ps(C4, vTemp); - mResult.r[3] = _mm_mul_ps(C6, vTemp); - return mResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixVectorTensorProduct -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ - XMMATRIX mResult; - mResult.r[0] = XMVectorMultiply(XMVectorSwizzle<0, 0, 0, 0>(V1), V2); - mResult.r[1] = XMVectorMultiply(XMVectorSwizzle<1, 1, 1, 1>(V1), V2); - mResult.r[2] = XMVectorMultiply(XMVectorSwizzle<2, 2, 2, 2>(V1), V2); - mResult.r[3] = XMVectorMultiply(XMVectorSwizzle<3, 3, 3, 3>(V1), V2); - return mResult; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMMatrixDeterminant(FXMMATRIX M) noexcept -{ - static const XMVECTORF32 Sign = { { { 1.0f, -1.0f, 1.0f, -1.0f } } }; - - XMVECTOR V0 = XMVectorSwizzle(M.r[2]); - XMVECTOR V1 = XMVectorSwizzle(M.r[3]); - XMVECTOR V2 = XMVectorSwizzle(M.r[2]); - XMVECTOR V3 = XMVectorSwizzle(M.r[3]); - XMVECTOR V4 = XMVectorSwizzle(M.r[2]); - XMVECTOR V5 = XMVectorSwizzle(M.r[3]); - - XMVECTOR P0 = XMVectorMultiply(V0, V1); - XMVECTOR P1 = XMVectorMultiply(V2, V3); - XMVECTOR P2 = XMVectorMultiply(V4, V5); - - V0 = XMVectorSwizzle(M.r[2]); - V1 = XMVectorSwizzle(M.r[3]); - V2 = XMVectorSwizzle(M.r[2]); - V3 = XMVectorSwizzle(M.r[3]); - V4 = XMVectorSwizzle(M.r[2]); - V5 = XMVectorSwizzle(M.r[3]); - - P0 = XMVectorNegativeMultiplySubtract(V0, V1, P0); - P1 = XMVectorNegativeMultiplySubtract(V2, V3, P1); - P2 = XMVectorNegativeMultiplySubtract(V4, V5, P2); - - V0 = XMVectorSwizzle(M.r[1]); - V1 = XMVectorSwizzle(M.r[1]); - V2 = XMVectorSwizzle(M.r[1]); - - XMVECTOR S = XMVectorMultiply(M.r[0], Sign.v); - XMVECTOR R = XMVectorMultiply(V0, P0); - R = XMVectorNegativeMultiplySubtract(V1, P1, R); - R = XMVectorMultiplyAdd(V2, P2, R); - - return XMVector4Dot(S, R); -} - -#define XM3RANKDECOMPOSE(a, b, c, x, y, z) \ - if((x) < (y)) \ - { \ - if((y) < (z)) \ - { \ - (a) = 2; \ - (b) = 1; \ - (c) = 0; \ - } \ - else \ - { \ - (a) = 1; \ - \ - if((x) < (z)) \ - { \ - (b) = 2; \ - (c) = 0; \ - } \ - else \ - { \ - (b) = 0; \ - (c) = 2; \ - } \ - } \ - } \ - else \ - { \ - if((x) < (z)) \ - { \ - (a) = 2; \ - (b) = 0; \ - (c) = 1; \ - } \ - else \ - { \ - (a) = 0; \ - \ - if((y) < (z)) \ - { \ - (b) = 2; \ - (c) = 1; \ - } \ - else \ - { \ - (b) = 1; \ - (c) = 2; \ - } \ - } \ - } - -#define XM3_DECOMP_EPSILON 0.0001f - -_Use_decl_annotations_ -inline bool XM_CALLCONV XMMatrixDecompose -( - XMVECTOR* outScale, - XMVECTOR* outRotQuat, - XMVECTOR* outTrans, - FXMMATRIX M -) noexcept -{ - static const XMVECTOR* pvCanonicalBasis[3] = { - &g_XMIdentityR0.v, - &g_XMIdentityR1.v, - &g_XMIdentityR2.v - }; - - assert(outScale != nullptr); - assert(outRotQuat != nullptr); - assert(outTrans != nullptr); - - // Get the translation - outTrans[0] = M.r[3]; - - XMVECTOR* ppvBasis[3]; - XMMATRIX matTemp; - ppvBasis[0] = &matTemp.r[0]; - ppvBasis[1] = &matTemp.r[1]; - ppvBasis[2] = &matTemp.r[2]; - - matTemp.r[0] = M.r[0]; - matTemp.r[1] = M.r[1]; - matTemp.r[2] = M.r[2]; - matTemp.r[3] = g_XMIdentityR3.v; - - auto pfScales = reinterpret_cast(outScale); - - size_t a, b, c; - XMVectorGetXPtr(&pfScales[0], XMVector3Length(ppvBasis[0][0])); - XMVectorGetXPtr(&pfScales[1], XMVector3Length(ppvBasis[1][0])); - XMVectorGetXPtr(&pfScales[2], XMVector3Length(ppvBasis[2][0])); - pfScales[3] = 0.f; - - XM3RANKDECOMPOSE(a, b, c, pfScales[0], pfScales[1], pfScales[2]) - - if (pfScales[a] < XM3_DECOMP_EPSILON) - { - ppvBasis[a][0] = pvCanonicalBasis[a][0]; - } - ppvBasis[a][0] = XMVector3Normalize(ppvBasis[a][0]); - - if (pfScales[b] < XM3_DECOMP_EPSILON) - { - size_t aa, bb, cc; - float fAbsX, fAbsY, fAbsZ; - - fAbsX = fabsf(XMVectorGetX(ppvBasis[a][0])); - fAbsY = fabsf(XMVectorGetY(ppvBasis[a][0])); - fAbsZ = fabsf(XMVectorGetZ(ppvBasis[a][0])); - - XM3RANKDECOMPOSE(aa, bb, cc, fAbsX, fAbsY, fAbsZ) - - ppvBasis[b][0] = XMVector3Cross(ppvBasis[a][0], pvCanonicalBasis[cc][0]); - } - - ppvBasis[b][0] = XMVector3Normalize(ppvBasis[b][0]); - - if (pfScales[c] < XM3_DECOMP_EPSILON) - { - ppvBasis[c][0] = XMVector3Cross(ppvBasis[a][0], ppvBasis[b][0]); - } - - ppvBasis[c][0] = XMVector3Normalize(ppvBasis[c][0]); - - float fDet = XMVectorGetX(XMMatrixDeterminant(matTemp)); - - // use Kramer's rule to check for handedness of coordinate system - if (fDet < 0.0f) - { - // switch coordinate system by negating the scale and inverting the basis vector on the x-axis - pfScales[a] = -pfScales[a]; - ppvBasis[a][0] = XMVectorNegate(ppvBasis[a][0]); - - fDet = -fDet; - } - - fDet -= 1.0f; - fDet *= fDet; - - if (XM3_DECOMP_EPSILON < fDet) - { - // Non-SRT matrix encountered - return false; - } - - // generate the quaternion from the matrix - outRotQuat[0] = XMQuaternionRotationMatrix(matTemp); - return true; -} - -#undef XM3_DECOMP_EPSILON -#undef XM3RANKDECOMPOSE - -//------------------------------------------------------------------------------ -// Transformation operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixIdentity() noexcept -{ - XMMATRIX M; - M.r[0] = g_XMIdentityR0.v; - M.r[1] = g_XMIdentityR1.v; - M.r[2] = g_XMIdentityR2.v; - M.r[3] = g_XMIdentityR3.v; - return M; -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixSet -( - float m00, float m01, float m02, float m03, - float m10, float m11, float m12, float m13, - float m20, float m21, float m22, float m23, - float m30, float m31, float m32, float m33 -) noexcept -{ - XMMATRIX M; -#if defined(_XM_NO_INTRINSICS_) - M.m[0][0] = m00; M.m[0][1] = m01; M.m[0][2] = m02; M.m[0][3] = m03; - M.m[1][0] = m10; M.m[1][1] = m11; M.m[1][2] = m12; M.m[1][3] = m13; - M.m[2][0] = m20; M.m[2][1] = m21; M.m[2][2] = m22; M.m[2][3] = m23; - M.m[3][0] = m30; M.m[3][1] = m31; M.m[3][2] = m32; M.m[3][3] = m33; -#else - M.r[0] = XMVectorSet(m00, m01, m02, m03); - M.r[1] = XMVectorSet(m10, m11, m12, m13); - M.r[2] = XMVectorSet(m20, m21, m22, m23); - M.r[3] = XMVectorSet(m30, m31, m32, m33); -#endif - return M; -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixTranslation -( - float OffsetX, - float OffsetY, - float OffsetZ -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMMATRIX M; - M.m[0][0] = 1.0f; - M.m[0][1] = 0.0f; - M.m[0][2] = 0.0f; - M.m[0][3] = 0.0f; - - M.m[1][0] = 0.0f; - M.m[1][1] = 1.0f; - M.m[1][2] = 0.0f; - M.m[1][3] = 0.0f; - - M.m[2][0] = 0.0f; - M.m[2][1] = 0.0f; - M.m[2][2] = 1.0f; - M.m[2][3] = 0.0f; - - M.m[3][0] = OffsetX; - M.m[3][1] = OffsetY; - M.m[3][2] = OffsetZ; - M.m[3][3] = 1.0f; - return M; - -#elif defined(_XM_SSE_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) - XMMATRIX M; - M.r[0] = g_XMIdentityR0.v; - M.r[1] = g_XMIdentityR1.v; - M.r[2] = g_XMIdentityR2.v; - M.r[3] = XMVectorSet(OffsetX, OffsetY, OffsetZ, 1.f); - return M; -#endif -} - - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixTranslationFromVector(FXMVECTOR Offset) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMMATRIX M; - M.m[0][0] = 1.0f; - M.m[0][1] = 0.0f; - M.m[0][2] = 0.0f; - M.m[0][3] = 0.0f; - - M.m[1][0] = 0.0f; - M.m[1][1] = 1.0f; - M.m[1][2] = 0.0f; - M.m[1][3] = 0.0f; - - M.m[2][0] = 0.0f; - M.m[2][1] = 0.0f; - M.m[2][2] = 1.0f; - M.m[2][3] = 0.0f; - - M.m[3][0] = Offset.vector4_f32[0]; - M.m[3][1] = Offset.vector4_f32[1]; - M.m[3][2] = Offset.vector4_f32[2]; - M.m[3][3] = 1.0f; - return M; - -#elif defined(_XM_SSE_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) - XMMATRIX M; - M.r[0] = g_XMIdentityR0.v; - M.r[1] = g_XMIdentityR1.v; - M.r[2] = g_XMIdentityR2.v; - M.r[3] = XMVectorSelect(g_XMIdentityR3.v, Offset, g_XMSelect1110.v); - return M; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixScaling -( - float ScaleX, - float ScaleY, - float ScaleZ -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMMATRIX M; - M.m[0][0] = ScaleX; - M.m[0][1] = 0.0f; - M.m[0][2] = 0.0f; - M.m[0][3] = 0.0f; - - M.m[1][0] = 0.0f; - M.m[1][1] = ScaleY; - M.m[1][2] = 0.0f; - M.m[1][3] = 0.0f; - - M.m[2][0] = 0.0f; - M.m[2][1] = 0.0f; - M.m[2][2] = ScaleZ; - M.m[2][3] = 0.0f; - - M.m[3][0] = 0.0f; - M.m[3][1] = 0.0f; - M.m[3][2] = 0.0f; - M.m[3][3] = 1.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - const XMVECTOR Zero = vdupq_n_f32(0); - XMMATRIX M; - M.r[0] = vsetq_lane_f32(ScaleX, Zero, 0); - M.r[1] = vsetq_lane_f32(ScaleY, Zero, 1); - M.r[2] = vsetq_lane_f32(ScaleZ, Zero, 2); - M.r[3] = g_XMIdentityR3.v; - return M; -#elif defined(_XM_SSE_INTRINSICS_) - XMMATRIX M; - M.r[0] = _mm_set_ps(0, 0, 0, ScaleX); - M.r[1] = _mm_set_ps(0, 0, ScaleY, 0); - M.r[2] = _mm_set_ps(0, ScaleZ, 0, 0); - M.r[3] = g_XMIdentityR3.v; - return M; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixScalingFromVector(FXMVECTOR Scale) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMMATRIX M; - M.m[0][0] = Scale.vector4_f32[0]; - M.m[0][1] = 0.0f; - M.m[0][2] = 0.0f; - M.m[0][3] = 0.0f; - - M.m[1][0] = 0.0f; - M.m[1][1] = Scale.vector4_f32[1]; - M.m[1][2] = 0.0f; - M.m[1][3] = 0.0f; - - M.m[2][0] = 0.0f; - M.m[2][1] = 0.0f; - M.m[2][2] = Scale.vector4_f32[2]; - M.m[2][3] = 0.0f; - - M.m[3][0] = 0.0f; - M.m[3][1] = 0.0f; - M.m[3][2] = 0.0f; - M.m[3][3] = 1.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - XMMATRIX M; - M.r[0] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(Scale), g_XMMaskX)); - M.r[1] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(Scale), g_XMMaskY)); - M.r[2] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(Scale), g_XMMaskZ)); - M.r[3] = g_XMIdentityR3.v; - return M; -#elif defined(_XM_SSE_INTRINSICS_) - XMMATRIX M; - M.r[0] = _mm_and_ps(Scale, g_XMMaskX); - M.r[1] = _mm_and_ps(Scale, g_XMMaskY); - M.r[2] = _mm_and_ps(Scale, g_XMMaskZ); - M.r[3] = g_XMIdentityR3.v; - return M; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixRotationX(float Angle) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - float fSinAngle; - float fCosAngle; - XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); - - XMMATRIX M; - M.m[0][0] = 1.0f; - M.m[0][1] = 0.0f; - M.m[0][2] = 0.0f; - M.m[0][3] = 0.0f; - - M.m[1][0] = 0.0f; - M.m[1][1] = fCosAngle; - M.m[1][2] = fSinAngle; - M.m[1][3] = 0.0f; - - M.m[2][0] = 0.0f; - M.m[2][1] = -fSinAngle; - M.m[2][2] = fCosAngle; - M.m[2][3] = 0.0f; - - M.m[3][0] = 0.0f; - M.m[3][1] = 0.0f; - M.m[3][2] = 0.0f; - M.m[3][3] = 1.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float fSinAngle; - float fCosAngle; - XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); - - const float32x4_t Zero = vdupq_n_f32(0); - - float32x4_t T1 = vsetq_lane_f32(fCosAngle, Zero, 1); - T1 = vsetq_lane_f32(fSinAngle, T1, 2); - - float32x4_t T2 = vsetq_lane_f32(-fSinAngle, Zero, 1); - T2 = vsetq_lane_f32(fCosAngle, T2, 2); - - XMMATRIX M; - M.r[0] = g_XMIdentityR0.v; - M.r[1] = T1; - M.r[2] = T2; - M.r[3] = g_XMIdentityR3.v; - return M; -#elif defined(_XM_SSE_INTRINSICS_) - float SinAngle; - float CosAngle; - XMScalarSinCos(&SinAngle, &CosAngle, Angle); - - XMVECTOR vSin = _mm_set_ss(SinAngle); - XMVECTOR vCos = _mm_set_ss(CosAngle); - // x = 0,y = cos,z = sin, w = 0 - vCos = _mm_shuffle_ps(vCos, vSin, _MM_SHUFFLE(3, 0, 0, 3)); - XMMATRIX M; - M.r[0] = g_XMIdentityR0; - M.r[1] = vCos; - // x = 0,y = sin,z = cos, w = 0 - vCos = XM_PERMUTE_PS(vCos, _MM_SHUFFLE(3, 1, 2, 0)); - // x = 0,y = -sin,z = cos, w = 0 - vCos = _mm_mul_ps(vCos, g_XMNegateY); - M.r[2] = vCos; - M.r[3] = g_XMIdentityR3; - return M; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixRotationY(float Angle) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - float fSinAngle; - float fCosAngle; - XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); - - XMMATRIX M; - M.m[0][0] = fCosAngle; - M.m[0][1] = 0.0f; - M.m[0][2] = -fSinAngle; - M.m[0][3] = 0.0f; - - M.m[1][0] = 0.0f; - M.m[1][1] = 1.0f; - M.m[1][2] = 0.0f; - M.m[1][3] = 0.0f; - - M.m[2][0] = fSinAngle; - M.m[2][1] = 0.0f; - M.m[2][2] = fCosAngle; - M.m[2][3] = 0.0f; - - M.m[3][0] = 0.0f; - M.m[3][1] = 0.0f; - M.m[3][2] = 0.0f; - M.m[3][3] = 1.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float fSinAngle; - float fCosAngle; - XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); - - const float32x4_t Zero = vdupq_n_f32(0); - - float32x4_t T0 = vsetq_lane_f32(fCosAngle, Zero, 0); - T0 = vsetq_lane_f32(-fSinAngle, T0, 2); - - float32x4_t T2 = vsetq_lane_f32(fSinAngle, Zero, 0); - T2 = vsetq_lane_f32(fCosAngle, T2, 2); - - XMMATRIX M; - M.r[0] = T0; - M.r[1] = g_XMIdentityR1.v; - M.r[2] = T2; - M.r[3] = g_XMIdentityR3.v; - return M; -#elif defined(_XM_SSE_INTRINSICS_) - float SinAngle; - float CosAngle; - XMScalarSinCos(&SinAngle, &CosAngle, Angle); - - XMVECTOR vSin = _mm_set_ss(SinAngle); - XMVECTOR vCos = _mm_set_ss(CosAngle); - // x = sin,y = 0,z = cos, w = 0 - vSin = _mm_shuffle_ps(vSin, vCos, _MM_SHUFFLE(3, 0, 3, 0)); - XMMATRIX M; - M.r[2] = vSin; - M.r[1] = g_XMIdentityR1; - // x = cos,y = 0,z = sin, w = 0 - vSin = XM_PERMUTE_PS(vSin, _MM_SHUFFLE(3, 0, 1, 2)); - // x = cos,y = 0,z = -sin, w = 0 - vSin = _mm_mul_ps(vSin, g_XMNegateZ); - M.r[0] = vSin; - M.r[3] = g_XMIdentityR3; - return M; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixRotationZ(float Angle) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - float fSinAngle; - float fCosAngle; - XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); - - XMMATRIX M; - M.m[0][0] = fCosAngle; - M.m[0][1] = fSinAngle; - M.m[0][2] = 0.0f; - M.m[0][3] = 0.0f; - - M.m[1][0] = -fSinAngle; - M.m[1][1] = fCosAngle; - M.m[1][2] = 0.0f; - M.m[1][3] = 0.0f; - - M.m[2][0] = 0.0f; - M.m[2][1] = 0.0f; - M.m[2][2] = 1.0f; - M.m[2][3] = 0.0f; - - M.m[3][0] = 0.0f; - M.m[3][1] = 0.0f; - M.m[3][2] = 0.0f; - M.m[3][3] = 1.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float fSinAngle; - float fCosAngle; - XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); - - const float32x4_t Zero = vdupq_n_f32(0); - - float32x4_t T0 = vsetq_lane_f32(fCosAngle, Zero, 0); - T0 = vsetq_lane_f32(fSinAngle, T0, 1); - - float32x4_t T1 = vsetq_lane_f32(-fSinAngle, Zero, 0); - T1 = vsetq_lane_f32(fCosAngle, T1, 1); - - XMMATRIX M; - M.r[0] = T0; - M.r[1] = T1; - M.r[2] = g_XMIdentityR2.v; - M.r[3] = g_XMIdentityR3.v; - return M; -#elif defined(_XM_SSE_INTRINSICS_) - float SinAngle; - float CosAngle; - XMScalarSinCos(&SinAngle, &CosAngle, Angle); - - XMVECTOR vSin = _mm_set_ss(SinAngle); - XMVECTOR vCos = _mm_set_ss(CosAngle); - // x = cos,y = sin,z = 0, w = 0 - vCos = _mm_unpacklo_ps(vCos, vSin); - XMMATRIX M; - M.r[0] = vCos; - // x = sin,y = cos,z = 0, w = 0 - vCos = XM_PERMUTE_PS(vCos, _MM_SHUFFLE(3, 2, 0, 1)); - // x = cos,y = -sin,z = 0, w = 0 - vCos = _mm_mul_ps(vCos, g_XMNegateX); - M.r[1] = vCos; - M.r[2] = g_XMIdentityR2; - M.r[3] = g_XMIdentityR3; - return M; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixRotationRollPitchYaw -( - float Pitch, - float Yaw, - float Roll -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - float cp = cosf(Pitch); - float sp = sinf(Pitch); - - float cy = cosf(Yaw); - float sy = sinf(Yaw); - - float cr = cosf(Roll); - float sr = sinf(Roll); - - XMMATRIX M; - M.m[0][0] = cr * cy + sr * sp * sy; - M.m[0][1] = sr * cp; - M.m[0][2] = sr * sp * cy - cr * sy; - M.m[0][3] = 0.0f; - - M.m[1][0] = cr * sp * sy - sr * cy; - M.m[1][1] = cr * cp; - M.m[1][2] = sr * sy + cr * sp * cy; - M.m[1][3] = 0.0f; - - M.m[2][0] = cp * sy; - M.m[2][1] = -sp; - M.m[2][2] = cp * cy; - M.m[2][3] = 0.0f; - - M.m[3][0] = 0.0f; - M.m[3][1] = 0.0f; - M.m[3][2] = 0.0f; - M.m[3][3] = 1.0f; - return M; -#else - XMVECTOR Angles = XMVectorSet(Pitch, Yaw, Roll, 0.0f); - return XMMatrixRotationRollPitchYawFromVector(Angles); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixRotationRollPitchYawFromVector -( - FXMVECTOR Angles // -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - float cp = cosf(Angles.vector4_f32[0]); - float sp = sinf(Angles.vector4_f32[0]); - - float cy = cosf(Angles.vector4_f32[1]); - float sy = sinf(Angles.vector4_f32[1]); - - float cr = cosf(Angles.vector4_f32[2]); - float sr = sinf(Angles.vector4_f32[2]); - - XMMATRIX M; - M.m[0][0] = cr * cy + sr * sp * sy; - M.m[0][1] = sr * cp; - M.m[0][2] = sr * sp * cy - cr * sy; - M.m[0][3] = 0.0f; - - M.m[1][0] = cr * sp * sy - sr * cy; - M.m[1][1] = cr * cp; - M.m[1][2] = sr * sy + cr * sp * cy; - M.m[1][3] = 0.0f; - - M.m[2][0] = cp * sy; - M.m[2][1] = -sp; - M.m[2][2] = cp * cy; - M.m[2][3] = 0.0f; - - M.m[3][0] = 0.0f; - M.m[3][1] = 0.0f; - M.m[3][2] = 0.0f; - M.m[3][3] = 1.0f; - return M; -#else - static const XMVECTORF32 Sign = { { { 1.0f, -1.0f, -1.0f, 1.0f } } }; - - XMVECTOR SinAngles, CosAngles; - XMVectorSinCos(&SinAngles, &CosAngles, Angles); - - XMVECTOR P0 = XMVectorPermute(SinAngles, CosAngles); - XMVECTOR Y0 = XMVectorPermute(SinAngles, CosAngles); - XMVECTOR P1 = XMVectorPermute(SinAngles, CosAngles); - XMVECTOR Y1 = XMVectorPermute(SinAngles, CosAngles); - XMVECTOR P2 = XMVectorPermute(SinAngles, CosAngles); - XMVECTOR P3 = XMVectorPermute(SinAngles, CosAngles); - XMVECTOR Y2 = XMVectorSplatX(SinAngles); - XMVECTOR NS = XMVectorNegate(SinAngles); - - XMVECTOR Q0 = XMVectorMultiply(P0, Y0); - XMVECTOR Q1 = XMVectorMultiply(P1, Sign.v); - Q1 = XMVectorMultiply(Q1, Y1); - XMVECTOR Q2 = XMVectorMultiply(P2, Y2); - Q2 = XMVectorMultiplyAdd(Q2, P3, Q1); - - XMVECTOR V0 = XMVectorPermute(Q0, Q2); - XMVECTOR V1 = XMVectorPermute(Q0, Q2); - XMVECTOR V2 = XMVectorPermute(Q0, NS); - - XMMATRIX M; - M.r[0] = XMVectorSelect(g_XMZero, V0, g_XMSelect1110.v); - M.r[1] = XMVectorSelect(g_XMZero, V1, g_XMSelect1110.v); - M.r[2] = XMVectorSelect(g_XMZero, V2, g_XMSelect1110.v); - M.r[3] = g_XMIdentityR3; - return M; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixRotationNormal -( - FXMVECTOR NormalAxis, - float Angle -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) - - float fSinAngle; - float fCosAngle; - XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); - - XMVECTOR A = XMVectorSet(fSinAngle, fCosAngle, 1.0f - fCosAngle, 0.0f); - - XMVECTOR C2 = XMVectorSplatZ(A); - XMVECTOR C1 = XMVectorSplatY(A); - XMVECTOR C0 = XMVectorSplatX(A); - - XMVECTOR N0 = XMVectorSwizzle(NormalAxis); - XMVECTOR N1 = XMVectorSwizzle(NormalAxis); - - XMVECTOR V0 = XMVectorMultiply(C2, N0); - V0 = XMVectorMultiply(V0, N1); - - XMVECTOR R0 = XMVectorMultiply(C2, NormalAxis); - R0 = XMVectorMultiplyAdd(R0, NormalAxis, C1); - - XMVECTOR R1 = XMVectorMultiplyAdd(C0, NormalAxis, V0); - XMVECTOR R2 = XMVectorNegativeMultiplySubtract(C0, NormalAxis, V0); - - V0 = XMVectorSelect(A, R0, g_XMSelect1110.v); - XMVECTOR V1 = XMVectorPermute(R1, R2); - XMVECTOR V2 = XMVectorPermute(R1, R2); - - XMMATRIX M; - M.r[0] = XMVectorPermute(V0, V1); - M.r[1] = XMVectorPermute(V0, V1); - M.r[2] = XMVectorPermute(V0, V2); - M.r[3] = g_XMIdentityR3.v; - return M; - -#elif defined(_XM_SSE_INTRINSICS_) - float fSinAngle; - float fCosAngle; - XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); - - XMVECTOR C2 = _mm_set_ps1(1.0f - fCosAngle); - XMVECTOR C1 = _mm_set_ps1(fCosAngle); - XMVECTOR C0 = _mm_set_ps1(fSinAngle); - - XMVECTOR N0 = XM_PERMUTE_PS(NormalAxis, _MM_SHUFFLE(3, 0, 2, 1)); - XMVECTOR N1 = XM_PERMUTE_PS(NormalAxis, _MM_SHUFFLE(3, 1, 0, 2)); - - XMVECTOR V0 = _mm_mul_ps(C2, N0); - V0 = _mm_mul_ps(V0, N1); - - XMVECTOR R0 = _mm_mul_ps(C2, NormalAxis); - R0 = _mm_mul_ps(R0, NormalAxis); - R0 = _mm_add_ps(R0, C1); - - XMVECTOR R1 = _mm_mul_ps(C0, NormalAxis); - R1 = _mm_add_ps(R1, V0); - XMVECTOR R2 = _mm_mul_ps(C0, NormalAxis); - R2 = _mm_sub_ps(V0, R2); - - V0 = _mm_and_ps(R0, g_XMMask3); - XMVECTOR V1 = _mm_shuffle_ps(R1, R2, _MM_SHUFFLE(2, 1, 2, 0)); - V1 = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 3, 2, 1)); - XMVECTOR V2 = _mm_shuffle_ps(R1, R2, _MM_SHUFFLE(0, 0, 1, 1)); - V2 = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 0, 2, 0)); - - R2 = _mm_shuffle_ps(V0, V1, _MM_SHUFFLE(1, 0, 3, 0)); - R2 = XM_PERMUTE_PS(R2, _MM_SHUFFLE(1, 3, 2, 0)); - - XMMATRIX M; - M.r[0] = R2; - - R2 = _mm_shuffle_ps(V0, V1, _MM_SHUFFLE(3, 2, 3, 1)); - R2 = XM_PERMUTE_PS(R2, _MM_SHUFFLE(1, 3, 0, 2)); - M.r[1] = R2; - - V2 = _mm_shuffle_ps(V2, V0, _MM_SHUFFLE(3, 2, 1, 0)); - M.r[2] = V2; - M.r[3] = g_XMIdentityR3.v; - return M; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixRotationAxis -( - FXMVECTOR Axis, - float Angle -) noexcept -{ - assert(!XMVector3Equal(Axis, XMVectorZero())); - assert(!XMVector3IsInfinite(Axis)); - - XMVECTOR Normal = XMVector3Normalize(Axis); - return XMMatrixRotationNormal(Normal, Angle); -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixRotationQuaternion(FXMVECTOR Quaternion) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - float qx = Quaternion.vector4_f32[0]; - float qxx = qx * qx; - - float qy = Quaternion.vector4_f32[1]; - float qyy = qy * qy; - - float qz = Quaternion.vector4_f32[2]; - float qzz = qz * qz; - - float qw = Quaternion.vector4_f32[3]; - - XMMATRIX M; - M.m[0][0] = 1.f - 2.f * qyy - 2.f * qzz; - M.m[0][1] = 2.f * qx * qy + 2.f * qz * qw; - M.m[0][2] = 2.f * qx * qz - 2.f * qy * qw; - M.m[0][3] = 0.f; - - M.m[1][0] = 2.f * qx * qy - 2.f * qz * qw; - M.m[1][1] = 1.f - 2.f * qxx - 2.f * qzz; - M.m[1][2] = 2.f * qy * qz + 2.f * qx * qw; - M.m[1][3] = 0.f; - - M.m[2][0] = 2.f * qx * qz + 2.f * qy * qw; - M.m[2][1] = 2.f * qy * qz - 2.f * qx * qw; - M.m[2][2] = 1.f - 2.f * qxx - 2.f * qyy; - M.m[2][3] = 0.f; - - M.m[3][0] = 0.f; - M.m[3][1] = 0.f; - M.m[3][2] = 0.f; - M.m[3][3] = 1.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Constant1110 = { { { 1.0f, 1.0f, 1.0f, 0.0f } } }; - - XMVECTOR Q0 = XMVectorAdd(Quaternion, Quaternion); - XMVECTOR Q1 = XMVectorMultiply(Quaternion, Q0); - - XMVECTOR V0 = XMVectorPermute(Q1, Constant1110.v); - XMVECTOR V1 = XMVectorPermute(Q1, Constant1110.v); - XMVECTOR R0 = XMVectorSubtract(Constant1110, V0); - R0 = XMVectorSubtract(R0, V1); - - V0 = XMVectorSwizzle(Quaternion); - V1 = XMVectorSwizzle(Q0); - V0 = XMVectorMultiply(V0, V1); - - V1 = XMVectorSplatW(Quaternion); - XMVECTOR V2 = XMVectorSwizzle(Q0); - V1 = XMVectorMultiply(V1, V2); - - XMVECTOR R1 = XMVectorAdd(V0, V1); - XMVECTOR R2 = XMVectorSubtract(V0, V1); - - V0 = XMVectorPermute(R1, R2); - V1 = XMVectorPermute(R1, R2); - - XMMATRIX M; - M.r[0] = XMVectorPermute(R0, V0); - M.r[1] = XMVectorPermute(R0, V0); - M.r[2] = XMVectorPermute(R0, V1); - M.r[3] = g_XMIdentityR3.v; - return M; - -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 Constant1110 = { { { 1.0f, 1.0f, 1.0f, 0.0f } } }; - - XMVECTOR Q0 = _mm_add_ps(Quaternion, Quaternion); - XMVECTOR Q1 = _mm_mul_ps(Quaternion, Q0); - - XMVECTOR V0 = XM_PERMUTE_PS(Q1, _MM_SHUFFLE(3, 0, 0, 1)); - V0 = _mm_and_ps(V0, g_XMMask3); - XMVECTOR V1 = XM_PERMUTE_PS(Q1, _MM_SHUFFLE(3, 1, 2, 2)); - V1 = _mm_and_ps(V1, g_XMMask3); - XMVECTOR R0 = _mm_sub_ps(Constant1110, V0); - R0 = _mm_sub_ps(R0, V1); - - V0 = XM_PERMUTE_PS(Quaternion, _MM_SHUFFLE(3, 1, 0, 0)); - V1 = XM_PERMUTE_PS(Q0, _MM_SHUFFLE(3, 2, 1, 2)); - V0 = _mm_mul_ps(V0, V1); - - V1 = XM_PERMUTE_PS(Quaternion, _MM_SHUFFLE(3, 3, 3, 3)); - XMVECTOR V2 = XM_PERMUTE_PS(Q0, _MM_SHUFFLE(3, 0, 2, 1)); - V1 = _mm_mul_ps(V1, V2); - - XMVECTOR R1 = _mm_add_ps(V0, V1); - XMVECTOR R2 = _mm_sub_ps(V0, V1); - - V0 = _mm_shuffle_ps(R1, R2, _MM_SHUFFLE(1, 0, 2, 1)); - V0 = XM_PERMUTE_PS(V0, _MM_SHUFFLE(1, 3, 2, 0)); - V1 = _mm_shuffle_ps(R1, R2, _MM_SHUFFLE(2, 2, 0, 0)); - V1 = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 0, 2, 0)); - - Q1 = _mm_shuffle_ps(R0, V0, _MM_SHUFFLE(1, 0, 3, 0)); - Q1 = XM_PERMUTE_PS(Q1, _MM_SHUFFLE(1, 3, 2, 0)); - - XMMATRIX M; - M.r[0] = Q1; - - Q1 = _mm_shuffle_ps(R0, V0, _MM_SHUFFLE(3, 2, 3, 1)); - Q1 = XM_PERMUTE_PS(Q1, _MM_SHUFFLE(1, 3, 0, 2)); - M.r[1] = Q1; - - Q1 = _mm_shuffle_ps(V1, R0, _MM_SHUFFLE(3, 2, 1, 0)); - M.r[2] = Q1; - M.r[3] = g_XMIdentityR3; - return M; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixTransformation2D -( - FXMVECTOR ScalingOrigin, - float ScalingOrientation, - FXMVECTOR Scaling, - FXMVECTOR RotationOrigin, - float Rotation, - GXMVECTOR Translation -) noexcept -{ - // M = Inverse(MScalingOrigin) * Transpose(MScalingOrientation) * MScaling * MScalingOrientation * - // MScalingOrigin * Inverse(MRotationOrigin) * MRotation * MRotationOrigin * MTranslation; - - XMVECTOR VScalingOrigin = XMVectorSelect(g_XMSelect1100.v, ScalingOrigin, g_XMSelect1100.v); - XMVECTOR NegScalingOrigin = XMVectorNegate(VScalingOrigin); - - XMMATRIX MScalingOriginI = XMMatrixTranslationFromVector(NegScalingOrigin); - XMMATRIX MScalingOrientation = XMMatrixRotationZ(ScalingOrientation); - XMMATRIX MScalingOrientationT = XMMatrixTranspose(MScalingOrientation); - XMVECTOR VScaling = XMVectorSelect(g_XMOne.v, Scaling, g_XMSelect1100.v); - XMMATRIX MScaling = XMMatrixScalingFromVector(VScaling); - XMVECTOR VRotationOrigin = XMVectorSelect(g_XMSelect1100.v, RotationOrigin, g_XMSelect1100.v); - XMMATRIX MRotation = XMMatrixRotationZ(Rotation); - XMVECTOR VTranslation = XMVectorSelect(g_XMSelect1100.v, Translation, g_XMSelect1100.v); - - XMMATRIX M = XMMatrixMultiply(MScalingOriginI, MScalingOrientationT); - M = XMMatrixMultiply(M, MScaling); - M = XMMatrixMultiply(M, MScalingOrientation); - M.r[3] = XMVectorAdd(M.r[3], VScalingOrigin); - M.r[3] = XMVectorSubtract(M.r[3], VRotationOrigin); - M = XMMatrixMultiply(M, MRotation); - M.r[3] = XMVectorAdd(M.r[3], VRotationOrigin); - M.r[3] = XMVectorAdd(M.r[3], VTranslation); - - return M; -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixTransformation -( - FXMVECTOR ScalingOrigin, - FXMVECTOR ScalingOrientationQuaternion, - FXMVECTOR Scaling, - GXMVECTOR RotationOrigin, - HXMVECTOR RotationQuaternion, - HXMVECTOR Translation -) noexcept -{ - // M = Inverse(MScalingOrigin) * Transpose(MScalingOrientation) * MScaling * MScalingOrientation * - // MScalingOrigin * Inverse(MRotationOrigin) * MRotation * MRotationOrigin * MTranslation; - - XMVECTOR VScalingOrigin = XMVectorSelect(g_XMSelect1110.v, ScalingOrigin, g_XMSelect1110.v); - XMVECTOR NegScalingOrigin = XMVectorNegate(ScalingOrigin); - - XMMATRIX MScalingOriginI = XMMatrixTranslationFromVector(NegScalingOrigin); - XMMATRIX MScalingOrientation = XMMatrixRotationQuaternion(ScalingOrientationQuaternion); - XMMATRIX MScalingOrientationT = XMMatrixTranspose(MScalingOrientation); - XMMATRIX MScaling = XMMatrixScalingFromVector(Scaling); - XMVECTOR VRotationOrigin = XMVectorSelect(g_XMSelect1110.v, RotationOrigin, g_XMSelect1110.v); - XMMATRIX MRotation = XMMatrixRotationQuaternion(RotationQuaternion); - XMVECTOR VTranslation = XMVectorSelect(g_XMSelect1110.v, Translation, g_XMSelect1110.v); - - XMMATRIX M; - M = XMMatrixMultiply(MScalingOriginI, MScalingOrientationT); - M = XMMatrixMultiply(M, MScaling); - M = XMMatrixMultiply(M, MScalingOrientation); - M.r[3] = XMVectorAdd(M.r[3], VScalingOrigin); - M.r[3] = XMVectorSubtract(M.r[3], VRotationOrigin); - M = XMMatrixMultiply(M, MRotation); - M.r[3] = XMVectorAdd(M.r[3], VRotationOrigin); - M.r[3] = XMVectorAdd(M.r[3], VTranslation); - return M; -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixAffineTransformation2D -( - FXMVECTOR Scaling, - FXMVECTOR RotationOrigin, - float Rotation, - FXMVECTOR Translation -) noexcept -{ - // M = MScaling * Inverse(MRotationOrigin) * MRotation * MRotationOrigin * MTranslation; - - XMVECTOR VScaling = XMVectorSelect(g_XMOne.v, Scaling, g_XMSelect1100.v); - XMMATRIX MScaling = XMMatrixScalingFromVector(VScaling); - XMVECTOR VRotationOrigin = XMVectorSelect(g_XMSelect1100.v, RotationOrigin, g_XMSelect1100.v); - XMMATRIX MRotation = XMMatrixRotationZ(Rotation); - XMVECTOR VTranslation = XMVectorSelect(g_XMSelect1100.v, Translation, g_XMSelect1100.v); - - XMMATRIX M; - M = MScaling; - M.r[3] = XMVectorSubtract(M.r[3], VRotationOrigin); - M = XMMatrixMultiply(M, MRotation); - M.r[3] = XMVectorAdd(M.r[3], VRotationOrigin); - M.r[3] = XMVectorAdd(M.r[3], VTranslation); - return M; -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixAffineTransformation -( - FXMVECTOR Scaling, - FXMVECTOR RotationOrigin, - FXMVECTOR RotationQuaternion, - GXMVECTOR Translation -) noexcept -{ - // M = MScaling * Inverse(MRotationOrigin) * MRotation * MRotationOrigin * MTranslation; - - XMMATRIX MScaling = XMMatrixScalingFromVector(Scaling); - XMVECTOR VRotationOrigin = XMVectorSelect(g_XMSelect1110.v, RotationOrigin, g_XMSelect1110.v); - XMMATRIX MRotation = XMMatrixRotationQuaternion(RotationQuaternion); - XMVECTOR VTranslation = XMVectorSelect(g_XMSelect1110.v, Translation, g_XMSelect1110.v); - - XMMATRIX M; - M = MScaling; - M.r[3] = XMVectorSubtract(M.r[3], VRotationOrigin); - M = XMMatrixMultiply(M, MRotation); - M.r[3] = XMVectorAdd(M.r[3], VRotationOrigin); - M.r[3] = XMVectorAdd(M.r[3], VTranslation); - return M; -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixReflect(FXMVECTOR ReflectionPlane) noexcept -{ - assert(!XMVector3Equal(ReflectionPlane, XMVectorZero())); - assert(!XMPlaneIsInfinite(ReflectionPlane)); - - static const XMVECTORF32 NegativeTwo = { { { -2.0f, -2.0f, -2.0f, 0.0f } } }; - - XMVECTOR P = XMPlaneNormalize(ReflectionPlane); - XMVECTOR S = XMVectorMultiply(P, NegativeTwo); - - XMVECTOR A = XMVectorSplatX(P); - XMVECTOR B = XMVectorSplatY(P); - XMVECTOR C = XMVectorSplatZ(P); - XMVECTOR D = XMVectorSplatW(P); - - XMMATRIX M; - M.r[0] = XMVectorMultiplyAdd(A, S, g_XMIdentityR0.v); - M.r[1] = XMVectorMultiplyAdd(B, S, g_XMIdentityR1.v); - M.r[2] = XMVectorMultiplyAdd(C, S, g_XMIdentityR2.v); - M.r[3] = XMVectorMultiplyAdd(D, S, g_XMIdentityR3.v); - return M; -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixShadow -( - FXMVECTOR ShadowPlane, - FXMVECTOR LightPosition -) noexcept -{ - static const XMVECTORU32 Select0001 = { { { XM_SELECT_0, XM_SELECT_0, XM_SELECT_0, XM_SELECT_1 } } }; - - assert(!XMVector3Equal(ShadowPlane, XMVectorZero())); - assert(!XMPlaneIsInfinite(ShadowPlane)); - - XMVECTOR P = XMPlaneNormalize(ShadowPlane); - XMVECTOR Dot = XMPlaneDot(P, LightPosition); - P = XMVectorNegate(P); - XMVECTOR D = XMVectorSplatW(P); - XMVECTOR C = XMVectorSplatZ(P); - XMVECTOR B = XMVectorSplatY(P); - XMVECTOR A = XMVectorSplatX(P); - Dot = XMVectorSelect(Select0001.v, Dot, Select0001.v); - - XMMATRIX M; - M.r[3] = XMVectorMultiplyAdd(D, LightPosition, Dot); - Dot = XMVectorRotateLeft(Dot, 1); - M.r[2] = XMVectorMultiplyAdd(C, LightPosition, Dot); - Dot = XMVectorRotateLeft(Dot, 1); - M.r[1] = XMVectorMultiplyAdd(B, LightPosition, Dot); - Dot = XMVectorRotateLeft(Dot, 1); - M.r[0] = XMVectorMultiplyAdd(A, LightPosition, Dot); - return M; -} - -//------------------------------------------------------------------------------ -// View and projection initialization operations -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixLookAtLH -( - FXMVECTOR EyePosition, - FXMVECTOR FocusPosition, - FXMVECTOR UpDirection -) noexcept -{ - XMVECTOR EyeDirection = XMVectorSubtract(FocusPosition, EyePosition); - return XMMatrixLookToLH(EyePosition, EyeDirection, UpDirection); -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixLookAtRH -( - FXMVECTOR EyePosition, - FXMVECTOR FocusPosition, - FXMVECTOR UpDirection -) noexcept -{ - XMVECTOR NegEyeDirection = XMVectorSubtract(EyePosition, FocusPosition); - return XMMatrixLookToLH(EyePosition, NegEyeDirection, UpDirection); -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixLookToLH -( - FXMVECTOR EyePosition, - FXMVECTOR EyeDirection, - FXMVECTOR UpDirection -) noexcept -{ - assert(!XMVector3Equal(EyeDirection, XMVectorZero())); - assert(!XMVector3IsInfinite(EyeDirection)); - assert(!XMVector3Equal(UpDirection, XMVectorZero())); - assert(!XMVector3IsInfinite(UpDirection)); - - XMVECTOR R2 = XMVector3Normalize(EyeDirection); - - XMVECTOR R0 = XMVector3Cross(UpDirection, R2); - R0 = XMVector3Normalize(R0); - - XMVECTOR R1 = XMVector3Cross(R2, R0); - - XMVECTOR NegEyePosition = XMVectorNegate(EyePosition); - - XMVECTOR D0 = XMVector3Dot(R0, NegEyePosition); - XMVECTOR D1 = XMVector3Dot(R1, NegEyePosition); - XMVECTOR D2 = XMVector3Dot(R2, NegEyePosition); - - XMMATRIX M; - M.r[0] = XMVectorSelect(D0, R0, g_XMSelect1110.v); - M.r[1] = XMVectorSelect(D1, R1, g_XMSelect1110.v); - M.r[2] = XMVectorSelect(D2, R2, g_XMSelect1110.v); - M.r[3] = g_XMIdentityR3.v; - - M = XMMatrixTranspose(M); - - return M; -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixLookToRH -( - FXMVECTOR EyePosition, - FXMVECTOR EyeDirection, - FXMVECTOR UpDirection -) noexcept -{ - XMVECTOR NegEyeDirection = XMVectorNegate(EyeDirection); - return XMMatrixLookToLH(EyePosition, NegEyeDirection, UpDirection); -} - -//------------------------------------------------------------------------------ - -#ifdef _PREFAST_ -#pragma prefast(push) -#pragma prefast(disable:28931, "PREfast noise: Esp:1266") -#endif - -inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveLH -( - float ViewWidth, - float ViewHeight, - float NearZ, - float FarZ -) noexcept -{ - assert(NearZ > 0.f && FarZ > 0.f); - assert(!XMScalarNearEqual(ViewWidth, 0.0f, 0.00001f)); - assert(!XMScalarNearEqual(ViewHeight, 0.0f, 0.00001f)); - assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); - -#if defined(_XM_NO_INTRINSICS_) - - float TwoNearZ = NearZ + NearZ; - float fRange = FarZ / (FarZ - NearZ); - - XMMATRIX M; - M.m[0][0] = TwoNearZ / ViewWidth; - M.m[0][1] = 0.0f; - M.m[0][2] = 0.0f; - M.m[0][3] = 0.0f; - - M.m[1][0] = 0.0f; - M.m[1][1] = TwoNearZ / ViewHeight; - M.m[1][2] = 0.0f; - M.m[1][3] = 0.0f; - - M.m[2][0] = 0.0f; - M.m[2][1] = 0.0f; - M.m[2][2] = fRange; - M.m[2][3] = 1.0f; - - M.m[3][0] = 0.0f; - M.m[3][1] = 0.0f; - M.m[3][2] = -fRange * NearZ; - M.m[3][3] = 0.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float TwoNearZ = NearZ + NearZ; - float fRange = FarZ / (FarZ - NearZ); - const float32x4_t Zero = vdupq_n_f32(0); - XMMATRIX M; - M.r[0] = vsetq_lane_f32(TwoNearZ / ViewWidth, Zero, 0); - M.r[1] = vsetq_lane_f32(TwoNearZ / ViewHeight, Zero, 1); - M.r[2] = vsetq_lane_f32(fRange, g_XMIdentityR3.v, 2); - M.r[3] = vsetq_lane_f32(-fRange * NearZ, Zero, 2); - return M; -#elif defined(_XM_SSE_INTRINSICS_) - XMMATRIX M; - float TwoNearZ = NearZ + NearZ; - float fRange = FarZ / (FarZ - NearZ); - // Note: This is recorded on the stack - XMVECTOR rMem = { - TwoNearZ / ViewWidth, - TwoNearZ / ViewHeight, - fRange, - -fRange * NearZ - }; - // Copy from memory to SSE register - XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); - // Copy x only - vTemp = _mm_move_ss(vTemp, vValues); - // TwoNearZ / ViewWidth,0,0,0 - M.r[0] = vTemp; - // 0,TwoNearZ / ViewHeight,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); - M.r[1] = vTemp; - // x=fRange,y=-fRange * NearZ,0,1.0f - vValues = _mm_shuffle_ps(vValues, g_XMIdentityR3, _MM_SHUFFLE(3, 2, 3, 2)); - // 0,0,fRange,1.0f - vTemp = _mm_setzero_ps(); - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 0, 0, 0)); - M.r[2] = vTemp; - // 0,0,-fRange * NearZ,0 - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 1, 0, 0)); - M.r[3] = vTemp; - return M; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveRH -( - float ViewWidth, - float ViewHeight, - float NearZ, - float FarZ -) noexcept -{ - assert(NearZ > 0.f && FarZ > 0.f); - assert(!XMScalarNearEqual(ViewWidth, 0.0f, 0.00001f)); - assert(!XMScalarNearEqual(ViewHeight, 0.0f, 0.00001f)); - assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); - -#if defined(_XM_NO_INTRINSICS_) - - float TwoNearZ = NearZ + NearZ; - float fRange = FarZ / (NearZ - FarZ); - - XMMATRIX M; - M.m[0][0] = TwoNearZ / ViewWidth; - M.m[0][1] = 0.0f; - M.m[0][2] = 0.0f; - M.m[0][3] = 0.0f; - - M.m[1][0] = 0.0f; - M.m[1][1] = TwoNearZ / ViewHeight; - M.m[1][2] = 0.0f; - M.m[1][3] = 0.0f; - - M.m[2][0] = 0.0f; - M.m[2][1] = 0.0f; - M.m[2][2] = fRange; - M.m[2][3] = -1.0f; - - M.m[3][0] = 0.0f; - M.m[3][1] = 0.0f; - M.m[3][2] = fRange * NearZ; - M.m[3][3] = 0.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float TwoNearZ = NearZ + NearZ; - float fRange = FarZ / (NearZ - FarZ); - const float32x4_t Zero = vdupq_n_f32(0); - - XMMATRIX M; - M.r[0] = vsetq_lane_f32(TwoNearZ / ViewWidth, Zero, 0); - M.r[1] = vsetq_lane_f32(TwoNearZ / ViewHeight, Zero, 1); - M.r[2] = vsetq_lane_f32(fRange, g_XMNegIdentityR3.v, 2); - M.r[3] = vsetq_lane_f32(fRange * NearZ, Zero, 2); - return M; -#elif defined(_XM_SSE_INTRINSICS_) - XMMATRIX M; - float TwoNearZ = NearZ + NearZ; - float fRange = FarZ / (NearZ - FarZ); - // Note: This is recorded on the stack - XMVECTOR rMem = { - TwoNearZ / ViewWidth, - TwoNearZ / ViewHeight, - fRange, - fRange * NearZ - }; - // Copy from memory to SSE register - XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); - // Copy x only - vTemp = _mm_move_ss(vTemp, vValues); - // TwoNearZ / ViewWidth,0,0,0 - M.r[0] = vTemp; - // 0,TwoNearZ / ViewHeight,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); - M.r[1] = vTemp; - // x=fRange,y=-fRange * NearZ,0,-1.0f - vValues = _mm_shuffle_ps(vValues, g_XMNegIdentityR3, _MM_SHUFFLE(3, 2, 3, 2)); - // 0,0,fRange,-1.0f - vTemp = _mm_setzero_ps(); - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 0, 0, 0)); - M.r[2] = vTemp; - // 0,0,-fRange * NearZ,0 - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 1, 0, 0)); - M.r[3] = vTemp; - return M; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovLH -( - float FovAngleY, - float AspectRatio, - float NearZ, - float FarZ -) noexcept -{ - assert(NearZ > 0.f && FarZ > 0.f); - assert(!XMScalarNearEqual(FovAngleY, 0.0f, 0.00001f * 2.0f)); - assert(!XMScalarNearEqual(AspectRatio, 0.0f, 0.00001f)); - assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); - -#if defined(_XM_NO_INTRINSICS_) - - float SinFov; - float CosFov; - XMScalarSinCos(&SinFov, &CosFov, 0.5f * FovAngleY); - - float Height = CosFov / SinFov; - float Width = Height / AspectRatio; - float fRange = FarZ / (FarZ - NearZ); - - XMMATRIX M; - M.m[0][0] = Width; - M.m[0][1] = 0.0f; - M.m[0][2] = 0.0f; - M.m[0][3] = 0.0f; - - M.m[1][0] = 0.0f; - M.m[1][1] = Height; - M.m[1][2] = 0.0f; - M.m[1][3] = 0.0f; - - M.m[2][0] = 0.0f; - M.m[2][1] = 0.0f; - M.m[2][2] = fRange; - M.m[2][3] = 1.0f; - - M.m[3][0] = 0.0f; - M.m[3][1] = 0.0f; - M.m[3][2] = -fRange * NearZ; - M.m[3][3] = 0.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float SinFov; - float CosFov; - XMScalarSinCos(&SinFov, &CosFov, 0.5f * FovAngleY); - - float fRange = FarZ / (FarZ - NearZ); - float Height = CosFov / SinFov; - float Width = Height / AspectRatio; - const float32x4_t Zero = vdupq_n_f32(0); - - XMMATRIX M; - M.r[0] = vsetq_lane_f32(Width, Zero, 0); - M.r[1] = vsetq_lane_f32(Height, Zero, 1); - M.r[2] = vsetq_lane_f32(fRange, g_XMIdentityR3.v, 2); - M.r[3] = vsetq_lane_f32(-fRange * NearZ, Zero, 2); - return M; -#elif defined(_XM_SSE_INTRINSICS_) - float SinFov; - float CosFov; - XMScalarSinCos(&SinFov, &CosFov, 0.5f * FovAngleY); - - float fRange = FarZ / (FarZ - NearZ); - // Note: This is recorded on the stack - float Height = CosFov / SinFov; - XMVECTOR rMem = { - Height / AspectRatio, - Height, - fRange, - -fRange * NearZ - }; - // Copy from memory to SSE register - XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); - // Copy x only - vTemp = _mm_move_ss(vTemp, vValues); - // Height / AspectRatio,0,0,0 - XMMATRIX M; - M.r[0] = vTemp; - // 0,Height,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); - M.r[1] = vTemp; - // x=fRange,y=-fRange * NearZ,0,1.0f - vTemp = _mm_setzero_ps(); - vValues = _mm_shuffle_ps(vValues, g_XMIdentityR3, _MM_SHUFFLE(3, 2, 3, 2)); - // 0,0,fRange,1.0f - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 0, 0, 0)); - M.r[2] = vTemp; - // 0,0,-fRange * NearZ,0.0f - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 1, 0, 0)); - M.r[3] = vTemp; - return M; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovRH -( - float FovAngleY, - float AspectRatio, - float NearZ, - float FarZ -) noexcept -{ - assert(NearZ > 0.f && FarZ > 0.f); - assert(!XMScalarNearEqual(FovAngleY, 0.0f, 0.00001f * 2.0f)); - assert(!XMScalarNearEqual(AspectRatio, 0.0f, 0.00001f)); - assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); - -#if defined(_XM_NO_INTRINSICS_) - - float SinFov; - float CosFov; - XMScalarSinCos(&SinFov, &CosFov, 0.5f * FovAngleY); - - float Height = CosFov / SinFov; - float Width = Height / AspectRatio; - float fRange = FarZ / (NearZ - FarZ); - - XMMATRIX M; - M.m[0][0] = Width; - M.m[0][1] = 0.0f; - M.m[0][2] = 0.0f; - M.m[0][3] = 0.0f; - - M.m[1][0] = 0.0f; - M.m[1][1] = Height; - M.m[1][2] = 0.0f; - M.m[1][3] = 0.0f; - - M.m[2][0] = 0.0f; - M.m[2][1] = 0.0f; - M.m[2][2] = fRange; - M.m[2][3] = -1.0f; - - M.m[3][0] = 0.0f; - M.m[3][1] = 0.0f; - M.m[3][2] = fRange * NearZ; - M.m[3][3] = 0.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float SinFov; - float CosFov; - XMScalarSinCos(&SinFov, &CosFov, 0.5f * FovAngleY); - float fRange = FarZ / (NearZ - FarZ); - float Height = CosFov / SinFov; - float Width = Height / AspectRatio; - const float32x4_t Zero = vdupq_n_f32(0); - - XMMATRIX M; - M.r[0] = vsetq_lane_f32(Width, Zero, 0); - M.r[1] = vsetq_lane_f32(Height, Zero, 1); - M.r[2] = vsetq_lane_f32(fRange, g_XMNegIdentityR3.v, 2); - M.r[3] = vsetq_lane_f32(fRange * NearZ, Zero, 2); - return M; -#elif defined(_XM_SSE_INTRINSICS_) - float SinFov; - float CosFov; - XMScalarSinCos(&SinFov, &CosFov, 0.5f * FovAngleY); - float fRange = FarZ / (NearZ - FarZ); - // Note: This is recorded on the stack - float Height = CosFov / SinFov; - XMVECTOR rMem = { - Height / AspectRatio, - Height, - fRange, - fRange * NearZ - }; - // Copy from memory to SSE register - XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); - // Copy x only - vTemp = _mm_move_ss(vTemp, vValues); - // Height / AspectRatio,0,0,0 - XMMATRIX M; - M.r[0] = vTemp; - // 0,Height,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); - M.r[1] = vTemp; - // x=fRange,y=-fRange * NearZ,0,-1.0f - vTemp = _mm_setzero_ps(); - vValues = _mm_shuffle_ps(vValues, g_XMNegIdentityR3, _MM_SHUFFLE(3, 2, 3, 2)); - // 0,0,fRange,-1.0f - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 0, 0, 0)); - M.r[2] = vTemp; - // 0,0,fRange * NearZ,0.0f - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 1, 0, 0)); - M.r[3] = vTemp; - return M; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveOffCenterLH -( - float ViewLeft, - float ViewRight, - float ViewBottom, - float ViewTop, - float NearZ, - float FarZ -) noexcept -{ - assert(NearZ > 0.f && FarZ > 0.f); - assert(!XMScalarNearEqual(ViewRight, ViewLeft, 0.00001f)); - assert(!XMScalarNearEqual(ViewTop, ViewBottom, 0.00001f)); - assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); - -#if defined(_XM_NO_INTRINSICS_) - - float TwoNearZ = NearZ + NearZ; - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = FarZ / (FarZ - NearZ); - - XMMATRIX M; - M.m[0][0] = TwoNearZ * ReciprocalWidth; - M.m[0][1] = 0.0f; - M.m[0][2] = 0.0f; - M.m[0][3] = 0.0f; - - M.m[1][0] = 0.0f; - M.m[1][1] = TwoNearZ * ReciprocalHeight; - M.m[1][2] = 0.0f; - M.m[1][3] = 0.0f; - - M.m[2][0] = -(ViewLeft + ViewRight) * ReciprocalWidth; - M.m[2][1] = -(ViewTop + ViewBottom) * ReciprocalHeight; - M.m[2][2] = fRange; - M.m[2][3] = 1.0f; - - M.m[3][0] = 0.0f; - M.m[3][1] = 0.0f; - M.m[3][2] = -fRange * NearZ; - M.m[3][3] = 0.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float TwoNearZ = NearZ + NearZ; - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = FarZ / (FarZ - NearZ); - const float32x4_t Zero = vdupq_n_f32(0); - - XMMATRIX M; - M.r[0] = vsetq_lane_f32(TwoNearZ * ReciprocalWidth, Zero, 0); - M.r[1] = vsetq_lane_f32(TwoNearZ * ReciprocalHeight, Zero, 1); - M.r[2] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, - -(ViewTop + ViewBottom) * ReciprocalHeight, - fRange, - 1.0f); - M.r[3] = vsetq_lane_f32(-fRange * NearZ, Zero, 2); - return M; -#elif defined(_XM_SSE_INTRINSICS_) - XMMATRIX M; - float TwoNearZ = NearZ + NearZ; - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = FarZ / (FarZ - NearZ); - // Note: This is recorded on the stack - XMVECTOR rMem = { - TwoNearZ * ReciprocalWidth, - TwoNearZ * ReciprocalHeight, - -fRange * NearZ, - 0 - }; - // Copy from memory to SSE register - XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); - // Copy x only - vTemp = _mm_move_ss(vTemp, vValues); - // TwoNearZ*ReciprocalWidth,0,0,0 - M.r[0] = vTemp; - // 0,TwoNearZ*ReciprocalHeight,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); - M.r[1] = vTemp; - // 0,0,fRange,1.0f - M.r[2] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, - -(ViewTop + ViewBottom) * ReciprocalHeight, - fRange, - 1.0f); - // 0,0,-fRange * NearZ,0.0f - vValues = _mm_and_ps(vValues, g_XMMaskZ); - M.r[3] = vValues; - return M; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveOffCenterRH -( - float ViewLeft, - float ViewRight, - float ViewBottom, - float ViewTop, - float NearZ, - float FarZ -) noexcept -{ - assert(NearZ > 0.f && FarZ > 0.f); - assert(!XMScalarNearEqual(ViewRight, ViewLeft, 0.00001f)); - assert(!XMScalarNearEqual(ViewTop, ViewBottom, 0.00001f)); - assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); - -#if defined(_XM_NO_INTRINSICS_) - - float TwoNearZ = NearZ + NearZ; - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = FarZ / (NearZ - FarZ); - - XMMATRIX M; - M.m[0][0] = TwoNearZ * ReciprocalWidth; - M.m[0][1] = 0.0f; - M.m[0][2] = 0.0f; - M.m[0][3] = 0.0f; - - M.m[1][0] = 0.0f; - M.m[1][1] = TwoNearZ * ReciprocalHeight; - M.m[1][2] = 0.0f; - M.m[1][3] = 0.0f; - - M.m[2][0] = (ViewLeft + ViewRight) * ReciprocalWidth; - M.m[2][1] = (ViewTop + ViewBottom) * ReciprocalHeight; - M.m[2][2] = fRange; - M.m[2][3] = -1.0f; - - M.m[3][0] = 0.0f; - M.m[3][1] = 0.0f; - M.m[3][2] = fRange * NearZ; - M.m[3][3] = 0.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float TwoNearZ = NearZ + NearZ; - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = FarZ / (NearZ - FarZ); - const float32x4_t Zero = vdupq_n_f32(0); - - XMMATRIX M; - M.r[0] = vsetq_lane_f32(TwoNearZ * ReciprocalWidth, Zero, 0); - M.r[1] = vsetq_lane_f32(TwoNearZ * ReciprocalHeight, Zero, 1); - M.r[2] = XMVectorSet((ViewLeft + ViewRight) * ReciprocalWidth, - (ViewTop + ViewBottom) * ReciprocalHeight, - fRange, - -1.0f); - M.r[3] = vsetq_lane_f32(fRange * NearZ, Zero, 2); - return M; -#elif defined(_XM_SSE_INTRINSICS_) - XMMATRIX M; - float TwoNearZ = NearZ + NearZ; - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = FarZ / (NearZ - FarZ); - // Note: This is recorded on the stack - XMVECTOR rMem = { - TwoNearZ * ReciprocalWidth, - TwoNearZ * ReciprocalHeight, - fRange * NearZ, - 0 - }; - // Copy from memory to SSE register - XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); - // Copy x only - vTemp = _mm_move_ss(vTemp, vValues); - // TwoNearZ*ReciprocalWidth,0,0,0 - M.r[0] = vTemp; - // 0,TwoNearZ*ReciprocalHeight,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); - M.r[1] = vTemp; - // 0,0,fRange,1.0f - M.r[2] = XMVectorSet((ViewLeft + ViewRight) * ReciprocalWidth, - (ViewTop + ViewBottom) * ReciprocalHeight, - fRange, - -1.0f); - // 0,0,-fRange * NearZ,0.0f - vValues = _mm_and_ps(vValues, g_XMMaskZ); - M.r[3] = vValues; - return M; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixOrthographicLH -( - float ViewWidth, - float ViewHeight, - float NearZ, - float FarZ -) noexcept -{ - assert(!XMScalarNearEqual(ViewWidth, 0.0f, 0.00001f)); - assert(!XMScalarNearEqual(ViewHeight, 0.0f, 0.00001f)); - assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); - -#if defined(_XM_NO_INTRINSICS_) - - float fRange = 1.0f / (FarZ - NearZ); - - XMMATRIX M; - M.m[0][0] = 2.0f / ViewWidth; - M.m[0][1] = 0.0f; - M.m[0][2] = 0.0f; - M.m[0][3] = 0.0f; - - M.m[1][0] = 0.0f; - M.m[1][1] = 2.0f / ViewHeight; - M.m[1][2] = 0.0f; - M.m[1][3] = 0.0f; - - M.m[2][0] = 0.0f; - M.m[2][1] = 0.0f; - M.m[2][2] = fRange; - M.m[2][3] = 0.0f; - - M.m[3][0] = 0.0f; - M.m[3][1] = 0.0f; - M.m[3][2] = -fRange * NearZ; - M.m[3][3] = 1.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float fRange = 1.0f / (FarZ - NearZ); - - const float32x4_t Zero = vdupq_n_f32(0); - XMMATRIX M; - M.r[0] = vsetq_lane_f32(2.0f / ViewWidth, Zero, 0); - M.r[1] = vsetq_lane_f32(2.0f / ViewHeight, Zero, 1); - M.r[2] = vsetq_lane_f32(fRange, Zero, 2); - M.r[3] = vsetq_lane_f32(-fRange * NearZ, g_XMIdentityR3.v, 2); - return M; -#elif defined(_XM_SSE_INTRINSICS_) - XMMATRIX M; - float fRange = 1.0f / (FarZ - NearZ); - // Note: This is recorded on the stack - XMVECTOR rMem = { - 2.0f / ViewWidth, - 2.0f / ViewHeight, - fRange, - -fRange * NearZ - }; - // Copy from memory to SSE register - XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); - // Copy x only - vTemp = _mm_move_ss(vTemp, vValues); - // 2.0f / ViewWidth,0,0,0 - M.r[0] = vTemp; - // 0,2.0f / ViewHeight,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); - M.r[1] = vTemp; - // x=fRange,y=-fRange * NearZ,0,1.0f - vTemp = _mm_setzero_ps(); - vValues = _mm_shuffle_ps(vValues, g_XMIdentityR3, _MM_SHUFFLE(3, 2, 3, 2)); - // 0,0,fRange,0.0f - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 0, 0, 0)); - M.r[2] = vTemp; - // 0,0,-fRange * NearZ,1.0f - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 1, 0, 0)); - M.r[3] = vTemp; - return M; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixOrthographicRH -( - float ViewWidth, - float ViewHeight, - float NearZ, - float FarZ -) noexcept -{ - assert(!XMScalarNearEqual(ViewWidth, 0.0f, 0.00001f)); - assert(!XMScalarNearEqual(ViewHeight, 0.0f, 0.00001f)); - assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); - -#if defined(_XM_NO_INTRINSICS_) - - float fRange = 1.0f / (NearZ - FarZ); - - XMMATRIX M; - M.m[0][0] = 2.0f / ViewWidth; - M.m[0][1] = 0.0f; - M.m[0][2] = 0.0f; - M.m[0][3] = 0.0f; - - M.m[1][0] = 0.0f; - M.m[1][1] = 2.0f / ViewHeight; - M.m[1][2] = 0.0f; - M.m[1][3] = 0.0f; - - M.m[2][0] = 0.0f; - M.m[2][1] = 0.0f; - M.m[2][2] = fRange; - M.m[2][3] = 0.0f; - - M.m[3][0] = 0.0f; - M.m[3][1] = 0.0f; - M.m[3][2] = fRange * NearZ; - M.m[3][3] = 1.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float fRange = 1.0f / (NearZ - FarZ); - - const float32x4_t Zero = vdupq_n_f32(0); - XMMATRIX M; - M.r[0] = vsetq_lane_f32(2.0f / ViewWidth, Zero, 0); - M.r[1] = vsetq_lane_f32(2.0f / ViewHeight, Zero, 1); - M.r[2] = vsetq_lane_f32(fRange, Zero, 2); - M.r[3] = vsetq_lane_f32(fRange * NearZ, g_XMIdentityR3.v, 2); - return M; -#elif defined(_XM_SSE_INTRINSICS_) - XMMATRIX M; - float fRange = 1.0f / (NearZ - FarZ); - // Note: This is recorded on the stack - XMVECTOR rMem = { - 2.0f / ViewWidth, - 2.0f / ViewHeight, - fRange, - fRange * NearZ - }; - // Copy from memory to SSE register - XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); - // Copy x only - vTemp = _mm_move_ss(vTemp, vValues); - // 2.0f / ViewWidth,0,0,0 - M.r[0] = vTemp; - // 0,2.0f / ViewHeight,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); - M.r[1] = vTemp; - // x=fRange,y=fRange * NearZ,0,1.0f - vTemp = _mm_setzero_ps(); - vValues = _mm_shuffle_ps(vValues, g_XMIdentityR3, _MM_SHUFFLE(3, 2, 3, 2)); - // 0,0,fRange,0.0f - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 0, 0, 0)); - M.r[2] = vTemp; - // 0,0,fRange * NearZ,1.0f - vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 1, 0, 0)); - M.r[3] = vTemp; - return M; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixOrthographicOffCenterLH -( - float ViewLeft, - float ViewRight, - float ViewBottom, - float ViewTop, - float NearZ, - float FarZ -) noexcept -{ - assert(!XMScalarNearEqual(ViewRight, ViewLeft, 0.00001f)); - assert(!XMScalarNearEqual(ViewTop, ViewBottom, 0.00001f)); - assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); - -#if defined(_XM_NO_INTRINSICS_) - - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = 1.0f / (FarZ - NearZ); - - XMMATRIX M; - M.m[0][0] = ReciprocalWidth + ReciprocalWidth; - M.m[0][1] = 0.0f; - M.m[0][2] = 0.0f; - M.m[0][3] = 0.0f; - - M.m[1][0] = 0.0f; - M.m[1][1] = ReciprocalHeight + ReciprocalHeight; - M.m[1][2] = 0.0f; - M.m[1][3] = 0.0f; - - M.m[2][0] = 0.0f; - M.m[2][1] = 0.0f; - M.m[2][2] = fRange; - M.m[2][3] = 0.0f; - - M.m[3][0] = -(ViewLeft + ViewRight) * ReciprocalWidth; - M.m[3][1] = -(ViewTop + ViewBottom) * ReciprocalHeight; - M.m[3][2] = -fRange * NearZ; - M.m[3][3] = 1.0f; - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = 1.0f / (FarZ - NearZ); - const float32x4_t Zero = vdupq_n_f32(0); - XMMATRIX M; - M.r[0] = vsetq_lane_f32(ReciprocalWidth + ReciprocalWidth, Zero, 0); - M.r[1] = vsetq_lane_f32(ReciprocalHeight + ReciprocalHeight, Zero, 1); - M.r[2] = vsetq_lane_f32(fRange, Zero, 2); - M.r[3] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, - -(ViewTop + ViewBottom) * ReciprocalHeight, - -fRange * NearZ, - 1.0f); - return M; -#elif defined(_XM_SSE_INTRINSICS_) - XMMATRIX M; - float fReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float fReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = 1.0f / (FarZ - NearZ); - // Note: This is recorded on the stack - XMVECTOR rMem = { - fReciprocalWidth, - fReciprocalHeight, - fRange, - 1.0f - }; - XMVECTOR rMem2 = { - -(ViewLeft + ViewRight), - -(ViewTop + ViewBottom), - -NearZ, - 1.0f - }; - // Copy from memory to SSE register - XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); - // Copy x only - vTemp = _mm_move_ss(vTemp, vValues); - // fReciprocalWidth*2,0,0,0 - vTemp = _mm_add_ss(vTemp, vTemp); - M.r[0] = vTemp; - // 0,fReciprocalHeight*2,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); - vTemp = _mm_add_ps(vTemp, vTemp); - M.r[1] = vTemp; - // 0,0,fRange,0.0f - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskZ); - M.r[2] = vTemp; - // -(ViewLeft + ViewRight)*fReciprocalWidth,-(ViewTop + ViewBottom)*fReciprocalHeight,fRange*-NearZ,1.0f - vValues = _mm_mul_ps(vValues, rMem2); - M.r[3] = vValues; - return M; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMatrixOrthographicOffCenterRH -( - float ViewLeft, - float ViewRight, - float ViewBottom, - float ViewTop, - float NearZ, - float FarZ -) noexcept -{ - assert(!XMScalarNearEqual(ViewRight, ViewLeft, 0.00001f)); - assert(!XMScalarNearEqual(ViewTop, ViewBottom, 0.00001f)); - assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); - -#if defined(_XM_NO_INTRINSICS_) - - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = 1.0f / (NearZ - FarZ); - - XMMATRIX M; - M.m[0][0] = ReciprocalWidth + ReciprocalWidth; - M.m[0][1] = 0.0f; - M.m[0][2] = 0.0f; - M.m[0][3] = 0.0f; - - M.m[1][0] = 0.0f; - M.m[1][1] = ReciprocalHeight + ReciprocalHeight; - M.m[1][2] = 0.0f; - M.m[1][3] = 0.0f; - - M.m[2][0] = 0.0f; - M.m[2][1] = 0.0f; - M.m[2][2] = fRange; - M.m[2][3] = 0.0f; - - M.r[3] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, - -(ViewTop + ViewBottom) * ReciprocalHeight, - fRange * NearZ, - 1.0f); - return M; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = 1.0f / (NearZ - FarZ); - const float32x4_t Zero = vdupq_n_f32(0); - XMMATRIX M; - M.r[0] = vsetq_lane_f32(ReciprocalWidth + ReciprocalWidth, Zero, 0); - M.r[1] = vsetq_lane_f32(ReciprocalHeight + ReciprocalHeight, Zero, 1); - M.r[2] = vsetq_lane_f32(fRange, Zero, 2); - M.r[3] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, - -(ViewTop + ViewBottom) * ReciprocalHeight, - fRange * NearZ, - 1.0f); - return M; -#elif defined(_XM_SSE_INTRINSICS_) - XMMATRIX M; - float fReciprocalWidth = 1.0f / (ViewRight - ViewLeft); - float fReciprocalHeight = 1.0f / (ViewTop - ViewBottom); - float fRange = 1.0f / (NearZ - FarZ); - // Note: This is recorded on the stack - XMVECTOR rMem = { - fReciprocalWidth, - fReciprocalHeight, - fRange, - 1.0f - }; - XMVECTOR rMem2 = { - -(ViewLeft + ViewRight), - -(ViewTop + ViewBottom), - NearZ, - 1.0f - }; - // Copy from memory to SSE register - XMVECTOR vValues = rMem; - XMVECTOR vTemp = _mm_setzero_ps(); - // Copy x only - vTemp = _mm_move_ss(vTemp, vValues); - // fReciprocalWidth*2,0,0,0 - vTemp = _mm_add_ss(vTemp, vTemp); - M.r[0] = vTemp; - // 0,fReciprocalHeight*2,0,0 - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskY); - vTemp = _mm_add_ps(vTemp, vTemp); - M.r[1] = vTemp; - // 0,0,fRange,0.0f - vTemp = vValues; - vTemp = _mm_and_ps(vTemp, g_XMMaskZ); - M.r[2] = vTemp; - // -(ViewLeft + ViewRight)*fReciprocalWidth,-(ViewTop + ViewBottom)*fReciprocalHeight,fRange*-NearZ,1.0f - vValues = _mm_mul_ps(vValues, rMem2); - M.r[3] = vValues; - return M; -#endif -} - -#ifdef _PREFAST_ -#pragma prefast(pop) -#endif - -/**************************************************************************** - * - * XMMATRIX operators and methods - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMMATRIX::XMMATRIX -( - float m00, float m01, float m02, float m03, - float m10, float m11, float m12, float m13, - float m20, float m21, float m22, float m23, - float m30, float m31, float m32, float m33 -) noexcept -{ - r[0] = XMVectorSet(m00, m01, m02, m03); - r[1] = XMVectorSet(m10, m11, m12, m13); - r[2] = XMVectorSet(m20, m21, m22, m23); - r[3] = XMVectorSet(m30, m31, m32, m33); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMMATRIX::XMMATRIX(const float* pArray) noexcept -{ - assert(pArray != nullptr); - r[0] = XMLoadFloat4(reinterpret_cast(pArray)); - r[1] = XMLoadFloat4(reinterpret_cast(pArray + 4)); - r[2] = XMLoadFloat4(reinterpret_cast(pArray + 8)); - r[3] = XMLoadFloat4(reinterpret_cast(pArray + 12)); -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XMMATRIX::operator- () const noexcept -{ - XMMATRIX R; - R.r[0] = XMVectorNegate(r[0]); - R.r[1] = XMVectorNegate(r[1]); - R.r[2] = XMVectorNegate(r[2]); - R.r[3] = XMVectorNegate(r[3]); - return R; -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX& XM_CALLCONV XMMATRIX::operator+= (FXMMATRIX M) noexcept -{ - r[0] = XMVectorAdd(r[0], M.r[0]); - r[1] = XMVectorAdd(r[1], M.r[1]); - r[2] = XMVectorAdd(r[2], M.r[2]); - r[3] = XMVectorAdd(r[3], M.r[3]); - return *this; -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX& XM_CALLCONV XMMATRIX::operator-= (FXMMATRIX M) noexcept -{ - r[0] = XMVectorSubtract(r[0], M.r[0]); - r[1] = XMVectorSubtract(r[1], M.r[1]); - r[2] = XMVectorSubtract(r[2], M.r[2]); - r[3] = XMVectorSubtract(r[3], M.r[3]); - return *this; -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX& XM_CALLCONV XMMATRIX::operator*=(FXMMATRIX M) noexcept -{ - *this = XMMatrixMultiply(*this, M); - return *this; -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX& XMMATRIX::operator*= (float S) noexcept -{ - r[0] = XMVectorScale(r[0], S); - r[1] = XMVectorScale(r[1], S); - r[2] = XMVectorScale(r[2], S); - r[3] = XMVectorScale(r[3], S); - return *this; -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX& XMMATRIX::operator/= (float S) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR vS = XMVectorReplicate(S); - r[0] = XMVectorDivide(r[0], vS); - r[1] = XMVectorDivide(r[1], vS); - r[2] = XMVectorDivide(r[2], vS); - r[3] = XMVectorDivide(r[3], vS); - return *this; -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ - float32x4_t vS = vdupq_n_f32(S); - r[0] = vdivq_f32(r[0], vS); - r[1] = vdivq_f32(r[1], vS); - r[2] = vdivq_f32(r[2], vS); - r[3] = vdivq_f32(r[3], vS); -#else - // 2 iterations of Newton-Raphson refinement of reciprocal - float32x2_t vS = vdup_n_f32(S); - float32x2_t R0 = vrecpe_f32(vS); - float32x2_t S0 = vrecps_f32(R0, vS); - R0 = vmul_f32(S0, R0); - S0 = vrecps_f32(R0, vS); - R0 = vmul_f32(S0, R0); - float32x4_t Reciprocal = vcombine_f32(R0, R0); - r[0] = vmulq_f32(r[0], Reciprocal); - r[1] = vmulq_f32(r[1], Reciprocal); - r[2] = vmulq_f32(r[2], Reciprocal); - r[3] = vmulq_f32(r[3], Reciprocal); -#endif - return *this; -#elif defined(_XM_SSE_INTRINSICS_) - __m128 vS = _mm_set_ps1(S); - r[0] = _mm_div_ps(r[0], vS); - r[1] = _mm_div_ps(r[1], vS); - r[2] = _mm_div_ps(r[2], vS); - r[3] = _mm_div_ps(r[3], vS); - return *this; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMATRIX::operator+ (FXMMATRIX M) const noexcept -{ - XMMATRIX R; - R.r[0] = XMVectorAdd(r[0], M.r[0]); - R.r[1] = XMVectorAdd(r[1], M.r[1]); - R.r[2] = XMVectorAdd(r[2], M.r[2]); - R.r[3] = XMVectorAdd(r[3], M.r[3]); - return R; -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMATRIX::operator- (FXMMATRIX M) const noexcept -{ - XMMATRIX R; - R.r[0] = XMVectorSubtract(r[0], M.r[0]); - R.r[1] = XMVectorSubtract(r[1], M.r[1]); - R.r[2] = XMVectorSubtract(r[2], M.r[2]); - R.r[3] = XMVectorSubtract(r[3], M.r[3]); - return R; -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV XMMATRIX::operator*(FXMMATRIX M) const noexcept -{ - return XMMatrixMultiply(*this, M); -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XMMATRIX::operator* (float S) const noexcept -{ - XMMATRIX R; - R.r[0] = XMVectorScale(r[0], S); - R.r[1] = XMVectorScale(r[1], S); - R.r[2] = XMVectorScale(r[2], S); - R.r[3] = XMVectorScale(r[3], S); - return R; -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XMMATRIX::operator/ (float S) const noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR vS = XMVectorReplicate(S); - XMMATRIX R; - R.r[0] = XMVectorDivide(r[0], vS); - R.r[1] = XMVectorDivide(r[1], vS); - R.r[2] = XMVectorDivide(r[2], vS); - R.r[3] = XMVectorDivide(r[3], vS); - return R; -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ - float32x4_t vS = vdupq_n_f32(S); - XMMATRIX R; - R.r[0] = vdivq_f32(r[0], vS); - R.r[1] = vdivq_f32(r[1], vS); - R.r[2] = vdivq_f32(r[2], vS); - R.r[3] = vdivq_f32(r[3], vS); -#else - // 2 iterations of Newton-Raphson refinement of reciprocal - float32x2_t vS = vdup_n_f32(S); - float32x2_t R0 = vrecpe_f32(vS); - float32x2_t S0 = vrecps_f32(R0, vS); - R0 = vmul_f32(S0, R0); - S0 = vrecps_f32(R0, vS); - R0 = vmul_f32(S0, R0); - float32x4_t Reciprocal = vcombine_f32(R0, R0); - XMMATRIX R; - R.r[0] = vmulq_f32(r[0], Reciprocal); - R.r[1] = vmulq_f32(r[1], Reciprocal); - R.r[2] = vmulq_f32(r[2], Reciprocal); - R.r[3] = vmulq_f32(r[3], Reciprocal); -#endif - return R; -#elif defined(_XM_SSE_INTRINSICS_) - __m128 vS = _mm_set_ps1(S); - XMMATRIX R; - R.r[0] = _mm_div_ps(r[0], vS); - R.r[1] = _mm_div_ps(r[1], vS); - R.r[2] = _mm_div_ps(r[2], vS); - R.r[3] = _mm_div_ps(r[3], vS); - return R; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMMATRIX XM_CALLCONV operator* -( - float S, - FXMMATRIX M - ) noexcept -{ - XMMATRIX R; - R.r[0] = XMVectorScale(M.r[0], S); - R.r[1] = XMVectorScale(M.r[1], S); - R.r[2] = XMVectorScale(M.r[2], S); - R.r[3] = XMVectorScale(M.r[3], S); - return R; -} - -/**************************************************************************** - * - * XMFLOAT3X3 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMFLOAT3X3::XMFLOAT3X3(const float* pArray) noexcept -{ - assert(pArray != nullptr); - for (size_t Row = 0; Row < 3; Row++) - { - for (size_t Column = 0; Column < 3; Column++) - { - m[Row][Column] = pArray[Row * 3 + Column]; - } - } -} - -/**************************************************************************** - * - * XMFLOAT4X3 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMFLOAT4X3::XMFLOAT4X3(const float* pArray) noexcept -{ - assert(pArray != nullptr); - - m[0][0] = pArray[0]; - m[0][1] = pArray[1]; - m[0][2] = pArray[2]; - - m[1][0] = pArray[3]; - m[1][1] = pArray[4]; - m[1][2] = pArray[5]; - - m[2][0] = pArray[6]; - m[2][1] = pArray[7]; - m[2][2] = pArray[8]; - - m[3][0] = pArray[9]; - m[3][1] = pArray[10]; - m[3][2] = pArray[11]; -} - -/**************************************************************************** -* -* XMFLOAT3X4 operators -* -****************************************************************************/ - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMFLOAT3X4::XMFLOAT3X4(const float* pArray) noexcept -{ - assert(pArray != nullptr); - - m[0][0] = pArray[0]; - m[0][1] = pArray[1]; - m[0][2] = pArray[2]; - m[0][3] = pArray[3]; - - m[1][0] = pArray[4]; - m[1][1] = pArray[5]; - m[1][2] = pArray[6]; - m[1][3] = pArray[7]; - - m[2][0] = pArray[8]; - m[2][1] = pArray[9]; - m[2][2] = pArray[10]; - m[2][3] = pArray[11]; -} - -/**************************************************************************** - * - * XMFLOAT4X4 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMFLOAT4X4::XMFLOAT4X4(const float* pArray) noexcept -{ - assert(pArray != nullptr); - - m[0][0] = pArray[0]; - m[0][1] = pArray[1]; - m[0][2] = pArray[2]; - m[0][3] = pArray[3]; - - m[1][0] = pArray[4]; - m[1][1] = pArray[5]; - m[1][2] = pArray[6]; - m[1][3] = pArray[7]; - - m[2][0] = pArray[8]; - m[2][1] = pArray[9]; - m[2][2] = pArray[10]; - m[2][3] = pArray[11]; - - m[3][0] = pArray[12]; - m[3][1] = pArray[13]; - m[3][2] = pArray[14]; - m[3][3] = pArray[15]; -} - +//------------------------------------------------------------------------------------- +// DirectXMathMatrix.inl -- SIMD C++ Math library +// +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +// +// http://go.microsoft.com/fwlink/?LinkID=615560 +//------------------------------------------------------------------------------------- + +#pragma once + +/**************************************************************************** + * + * Matrix + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ +// Comparison operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) +#pragma float_control(push) +#pragma float_control(precise, on) +#endif + +// Return true if any entry in the matrix is NaN +inline bool XM_CALLCONV XMMatrixIsNaN(FXMMATRIX M) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + size_t i = 16; + auto pWork = reinterpret_cast(&M.m[0][0]); + do + { + // Fetch value into integer unit + uint32_t uTest = pWork[0]; + // Remove sign + uTest &= 0x7FFFFFFFU; + // NaN is 0x7F800001 through 0x7FFFFFFF inclusive + uTest -= 0x7F800001U; + if (uTest < 0x007FFFFFU) + { + break; // NaN found + } + ++pWork; // Next entry + } + while (--i); + return (i != 0); // i == 0 if nothing matched +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Load in registers + float32x4_t vX = M.r[0]; + float32x4_t vY = M.r[1]; + float32x4_t vZ = M.r[2]; + float32x4_t vW = M.r[3]; + // Test themselves to check for NaN + uint32x4_t xmask = vmvnq_u32(vceqq_f32(vX, vX)); + uint32x4_t ymask = vmvnq_u32(vceqq_f32(vY, vY)); + uint32x4_t zmask = vmvnq_u32(vceqq_f32(vZ, vZ)); + uint32x4_t wmask = vmvnq_u32(vceqq_f32(vW, vW)); + // Or all the results + xmask = vorrq_u32(xmask, zmask); + ymask = vorrq_u32(ymask, wmask); + xmask = vorrq_u32(xmask, ymask); + // If any tested true, return true + uint8x8x2_t vTemp = vzip_u8( + vget_low_u8(vreinterpretq_u8_u32(xmask)), + vget_high_u8(vreinterpretq_u8_u32(xmask))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + return (r != 0); +#elif defined(_XM_SSE_INTRINSICS_) + // Load in registers + XMVECTOR vX = M.r[0]; + XMVECTOR vY = M.r[1]; + XMVECTOR vZ = M.r[2]; + XMVECTOR vW = M.r[3]; + // Test themselves to check for NaN + vX = _mm_cmpneq_ps(vX, vX); + vY = _mm_cmpneq_ps(vY, vY); + vZ = _mm_cmpneq_ps(vZ, vZ); + vW = _mm_cmpneq_ps(vW, vW); + // Or all the results + vX = _mm_or_ps(vX, vZ); + vY = _mm_or_ps(vY, vW); + vX = _mm_or_ps(vX, vY); + // If any tested true, return true + return (_mm_movemask_ps(vX) != 0); +#else +#endif +} + +#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) +#pragma float_control(pop) +#endif + +//------------------------------------------------------------------------------ + +// Return true if any entry in the matrix is +/-INF +inline bool XM_CALLCONV XMMatrixIsInfinite(FXMMATRIX M) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + size_t i = 16; + auto pWork = reinterpret_cast(&M.m[0][0]); + do + { + // Fetch value into integer unit + uint32_t uTest = pWork[0]; + // Remove sign + uTest &= 0x7FFFFFFFU; + // INF is 0x7F800000 + if (uTest == 0x7F800000U) + { + break; // INF found + } + ++pWork; // Next entry + } + while (--i); + return (i != 0); // i == 0 if nothing matched +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Load in registers + float32x4_t vX = M.r[0]; + float32x4_t vY = M.r[1]; + float32x4_t vZ = M.r[2]; + float32x4_t vW = M.r[3]; + // Mask off the sign bits + vX = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(vX), g_XMAbsMask)); + vY = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(vY), g_XMAbsMask)); + vZ = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(vZ), g_XMAbsMask)); + vW = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(vW), g_XMAbsMask)); + // Compare to infinity + uint32x4_t xmask = vceqq_f32(vX, g_XMInfinity); + uint32x4_t ymask = vceqq_f32(vY, g_XMInfinity); + uint32x4_t zmask = vceqq_f32(vZ, g_XMInfinity); + uint32x4_t wmask = vceqq_f32(vW, g_XMInfinity); + // Or the answers together + xmask = vorrq_u32(xmask, zmask); + ymask = vorrq_u32(ymask, wmask); + xmask = vorrq_u32(xmask, ymask); + // If any tested true, return true + uint8x8x2_t vTemp = vzip_u8( + vget_low_u8(vreinterpretq_u8_u32(xmask)), + vget_high_u8(vreinterpretq_u8_u32(xmask))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + return (r != 0); +#elif defined(_XM_SSE_INTRINSICS_) + // Mask off the sign bits + XMVECTOR vTemp1 = _mm_and_ps(M.r[0], g_XMAbsMask); + XMVECTOR vTemp2 = _mm_and_ps(M.r[1], g_XMAbsMask); + XMVECTOR vTemp3 = _mm_and_ps(M.r[2], g_XMAbsMask); + XMVECTOR vTemp4 = _mm_and_ps(M.r[3], g_XMAbsMask); + // Compare to infinity + vTemp1 = _mm_cmpeq_ps(vTemp1, g_XMInfinity); + vTemp2 = _mm_cmpeq_ps(vTemp2, g_XMInfinity); + vTemp3 = _mm_cmpeq_ps(vTemp3, g_XMInfinity); + vTemp4 = _mm_cmpeq_ps(vTemp4, g_XMInfinity); + // Or the answers together + vTemp1 = _mm_or_ps(vTemp1, vTemp2); + vTemp3 = _mm_or_ps(vTemp3, vTemp4); + vTemp1 = _mm_or_ps(vTemp1, vTemp3); + // If any are infinity, the signs are true. + return (_mm_movemask_ps(vTemp1) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +// Return true if the XMMatrix is equal to identity +inline bool XM_CALLCONV XMMatrixIsIdentity(FXMMATRIX M) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + // Use the integer pipeline to reduce branching to a minimum + auto pWork = reinterpret_cast(&M.m[0][0]); + // Convert 1.0f to zero and or them together + uint32_t uOne = pWork[0] ^ 0x3F800000U; + // Or all the 0.0f entries together + uint32_t uZero = pWork[1]; + uZero |= pWork[2]; + uZero |= pWork[3]; + // 2nd row + uZero |= pWork[4]; + uOne |= pWork[5] ^ 0x3F800000U; + uZero |= pWork[6]; + uZero |= pWork[7]; + // 3rd row + uZero |= pWork[8]; + uZero |= pWork[9]; + uOne |= pWork[10] ^ 0x3F800000U; + uZero |= pWork[11]; + // 4th row + uZero |= pWork[12]; + uZero |= pWork[13]; + uZero |= pWork[14]; + uOne |= pWork[15] ^ 0x3F800000U; + // If all zero entries are zero, the uZero==0 + uZero &= 0x7FFFFFFF; // Allow -0.0f + // If all 1.0f entries are 1.0f, then uOne==0 + uOne |= uZero; + return (uOne == 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t xmask = vceqq_f32(M.r[0], g_XMIdentityR0); + uint32x4_t ymask = vceqq_f32(M.r[1], g_XMIdentityR1); + uint32x4_t zmask = vceqq_f32(M.r[2], g_XMIdentityR2); + uint32x4_t wmask = vceqq_f32(M.r[3], g_XMIdentityR3); + xmask = vandq_u32(xmask, zmask); + ymask = vandq_u32(ymask, wmask); + xmask = vandq_u32(xmask, ymask); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(xmask)), vget_high_u8(vreinterpretq_u8_u32(xmask))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + return (r == 0xFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp1 = _mm_cmpeq_ps(M.r[0], g_XMIdentityR0); + XMVECTOR vTemp2 = _mm_cmpeq_ps(M.r[1], g_XMIdentityR1); + XMVECTOR vTemp3 = _mm_cmpeq_ps(M.r[2], g_XMIdentityR2); + XMVECTOR vTemp4 = _mm_cmpeq_ps(M.r[3], g_XMIdentityR3); + vTemp1 = _mm_and_ps(vTemp1, vTemp2); + vTemp3 = _mm_and_ps(vTemp3, vTemp4); + vTemp1 = _mm_and_ps(vTemp1, vTemp3); + return (_mm_movemask_ps(vTemp1) == 0x0f); +#endif +} + +//------------------------------------------------------------------------------ +// Computation operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ +// Perform a 4x4 matrix multiply by a 4x4 matrix +inline XMMATRIX XM_CALLCONV XMMatrixMultiply +( + FXMMATRIX M1, + CXMMATRIX M2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMMATRIX mResult; + // Cache the invariants in registers + float x = M1.m[0][0]; + float y = M1.m[0][1]; + float z = M1.m[0][2]; + float w = M1.m[0][3]; + // Perform the operation on the first row + mResult.m[0][0] = (M2.m[0][0] * x) + (M2.m[1][0] * y) + (M2.m[2][0] * z) + (M2.m[3][0] * w); + mResult.m[0][1] = (M2.m[0][1] * x) + (M2.m[1][1] * y) + (M2.m[2][1] * z) + (M2.m[3][1] * w); + mResult.m[0][2] = (M2.m[0][2] * x) + (M2.m[1][2] * y) + (M2.m[2][2] * z) + (M2.m[3][2] * w); + mResult.m[0][3] = (M2.m[0][3] * x) + (M2.m[1][3] * y) + (M2.m[2][3] * z) + (M2.m[3][3] * w); + // Repeat for all the other rows + x = M1.m[1][0]; + y = M1.m[1][1]; + z = M1.m[1][2]; + w = M1.m[1][3]; + mResult.m[1][0] = (M2.m[0][0] * x) + (M2.m[1][0] * y) + (M2.m[2][0] * z) + (M2.m[3][0] * w); + mResult.m[1][1] = (M2.m[0][1] * x) + (M2.m[1][1] * y) + (M2.m[2][1] * z) + (M2.m[3][1] * w); + mResult.m[1][2] = (M2.m[0][2] * x) + (M2.m[1][2] * y) + (M2.m[2][2] * z) + (M2.m[3][2] * w); + mResult.m[1][3] = (M2.m[0][3] * x) + (M2.m[1][3] * y) + (M2.m[2][3] * z) + (M2.m[3][3] * w); + x = M1.m[2][0]; + y = M1.m[2][1]; + z = M1.m[2][2]; + w = M1.m[2][3]; + mResult.m[2][0] = (M2.m[0][0] * x) + (M2.m[1][0] * y) + (M2.m[2][0] * z) + (M2.m[3][0] * w); + mResult.m[2][1] = (M2.m[0][1] * x) + (M2.m[1][1] * y) + (M2.m[2][1] * z) + (M2.m[3][1] * w); + mResult.m[2][2] = (M2.m[0][2] * x) + (M2.m[1][2] * y) + (M2.m[2][2] * z) + (M2.m[3][2] * w); + mResult.m[2][3] = (M2.m[0][3] * x) + (M2.m[1][3] * y) + (M2.m[2][3] * z) + (M2.m[3][3] * w); + x = M1.m[3][0]; + y = M1.m[3][1]; + z = M1.m[3][2]; + w = M1.m[3][3]; + mResult.m[3][0] = (M2.m[0][0] * x) + (M2.m[1][0] * y) + (M2.m[2][0] * z) + (M2.m[3][0] * w); + mResult.m[3][1] = (M2.m[0][1] * x) + (M2.m[1][1] * y) + (M2.m[2][1] * z) + (M2.m[3][1] * w); + mResult.m[3][2] = (M2.m[0][2] * x) + (M2.m[1][2] * y) + (M2.m[2][2] * z) + (M2.m[3][2] * w); + mResult.m[3][3] = (M2.m[0][3] * x) + (M2.m[1][3] * y) + (M2.m[2][3] * z) + (M2.m[3][3] * w); + return mResult; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + XMMATRIX mResult; + float32x2_t VL = vget_low_f32(M1.r[0]); + float32x2_t VH = vget_high_f32(M1.r[0]); + // Perform the operation on the first row + float32x4_t vX = vmulq_lane_f32(M2.r[0], VL, 0); + float32x4_t vY = vmulq_lane_f32(M2.r[1], VL, 1); + float32x4_t vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); + float32x4_t vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); + mResult.r[0] = vaddq_f32(vZ, vW); + // Repeat for the other 3 rows + VL = vget_low_f32(M1.r[1]); + VH = vget_high_f32(M1.r[1]); + vX = vmulq_lane_f32(M2.r[0], VL, 0); + vY = vmulq_lane_f32(M2.r[1], VL, 1); + vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); + vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); + mResult.r[1] = vaddq_f32(vZ, vW); + VL = vget_low_f32(M1.r[2]); + VH = vget_high_f32(M1.r[2]); + vX = vmulq_lane_f32(M2.r[0], VL, 0); + vY = vmulq_lane_f32(M2.r[1], VL, 1); + vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); + vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); + mResult.r[2] = vaddq_f32(vZ, vW); + VL = vget_low_f32(M1.r[3]); + VH = vget_high_f32(M1.r[3]); + vX = vmulq_lane_f32(M2.r[0], VL, 0); + vY = vmulq_lane_f32(M2.r[1], VL, 1); + vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); + vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); + mResult.r[3] = vaddq_f32(vZ, vW); + return mResult; +#elif defined(_XM_AVX2_INTRINSICS_) + __m256 t0 = _mm256_castps128_ps256(M1.r[0]); + t0 = _mm256_insertf128_ps(t0, M1.r[1], 1); + __m256 t1 = _mm256_castps128_ps256(M1.r[2]); + t1 = _mm256_insertf128_ps(t1, M1.r[3], 1); + + __m256 u0 = _mm256_castps128_ps256(M2.r[0]); + u0 = _mm256_insertf128_ps(u0, M2.r[1], 1); + __m256 u1 = _mm256_castps128_ps256(M2.r[2]); + u1 = _mm256_insertf128_ps(u1, M2.r[3], 1); + + __m256 a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(0, 0, 0, 0)); + __m256 a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(0, 0, 0, 0)); + __m256 b0 = _mm256_permute2f128_ps(u0, u0, 0x00); + __m256 c0 = _mm256_mul_ps(a0, b0); + __m256 c1 = _mm256_mul_ps(a1, b0); + + a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(1, 1, 1, 1)); + a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(1, 1, 1, 1)); + b0 = _mm256_permute2f128_ps(u0, u0, 0x11); + __m256 c2 = _mm256_fmadd_ps(a0, b0, c0); + __m256 c3 = _mm256_fmadd_ps(a1, b0, c1); + + a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(2, 2, 2, 2)); + a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(2, 2, 2, 2)); + __m256 b1 = _mm256_permute2f128_ps(u1, u1, 0x00); + __m256 c4 = _mm256_mul_ps(a0, b1); + __m256 c5 = _mm256_mul_ps(a1, b1); + + a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(3, 3, 3, 3)); + a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(3, 3, 3, 3)); + b1 = _mm256_permute2f128_ps(u1, u1, 0x11); + __m256 c6 = _mm256_fmadd_ps(a0, b1, c4); + __m256 c7 = _mm256_fmadd_ps(a1, b1, c5); + + t0 = _mm256_add_ps(c2, c6); + t1 = _mm256_add_ps(c3, c7); + + XMMATRIX mResult; + mResult.r[0] = _mm256_castps256_ps128(t0); + mResult.r[1] = _mm256_extractf128_ps(t0, 1); + mResult.r[2] = _mm256_castps256_ps128(t1); + mResult.r[3] = _mm256_extractf128_ps(t1, 1); + return mResult; +#elif defined(_XM_SSE_INTRINSICS_) + XMMATRIX mResult; + // Splat the component X,Y,Z then W +#if defined(_XM_AVX_INTRINSICS_) + XMVECTOR vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[0]) + 0); + XMVECTOR vY = _mm_broadcast_ss(reinterpret_cast(&M1.r[0]) + 1); + XMVECTOR vZ = _mm_broadcast_ss(reinterpret_cast(&M1.r[0]) + 2); + XMVECTOR vW = _mm_broadcast_ss(reinterpret_cast(&M1.r[0]) + 3); +#else + // Use vW to hold the original row + XMVECTOR vW = M1.r[0]; + XMVECTOR vX = XM_PERMUTE_PS(vW, _MM_SHUFFLE(0, 0, 0, 0)); + XMVECTOR vY = XM_PERMUTE_PS(vW, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); +#endif + // Perform the operation on the first row + vX = _mm_mul_ps(vX, M2.r[0]); + vY = _mm_mul_ps(vY, M2.r[1]); + vZ = _mm_mul_ps(vZ, M2.r[2]); + vW = _mm_mul_ps(vW, M2.r[3]); + // Perform a binary add to reduce cumulative errors + vX = _mm_add_ps(vX, vZ); + vY = _mm_add_ps(vY, vW); + vX = _mm_add_ps(vX, vY); + mResult.r[0] = vX; + // Repeat for the other 3 rows +#if defined(_XM_AVX_INTRINSICS_) + vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[1]) + 0); + vY = _mm_broadcast_ss(reinterpret_cast(&M1.r[1]) + 1); + vZ = _mm_broadcast_ss(reinterpret_cast(&M1.r[1]) + 2); + vW = _mm_broadcast_ss(reinterpret_cast(&M1.r[1]) + 3); +#else + vW = M1.r[1]; + vX = XM_PERMUTE_PS(vW, _MM_SHUFFLE(0, 0, 0, 0)); + vY = XM_PERMUTE_PS(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); +#endif + vX = _mm_mul_ps(vX, M2.r[0]); + vY = _mm_mul_ps(vY, M2.r[1]); + vZ = _mm_mul_ps(vZ, M2.r[2]); + vW = _mm_mul_ps(vW, M2.r[3]); + vX = _mm_add_ps(vX, vZ); + vY = _mm_add_ps(vY, vW); + vX = _mm_add_ps(vX, vY); + mResult.r[1] = vX; +#if defined(_XM_AVX_INTRINSICS_) + vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[2]) + 0); + vY = _mm_broadcast_ss(reinterpret_cast(&M1.r[2]) + 1); + vZ = _mm_broadcast_ss(reinterpret_cast(&M1.r[2]) + 2); + vW = _mm_broadcast_ss(reinterpret_cast(&M1.r[2]) + 3); +#else + vW = M1.r[2]; + vX = XM_PERMUTE_PS(vW, _MM_SHUFFLE(0, 0, 0, 0)); + vY = XM_PERMUTE_PS(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); +#endif + vX = _mm_mul_ps(vX, M2.r[0]); + vY = _mm_mul_ps(vY, M2.r[1]); + vZ = _mm_mul_ps(vZ, M2.r[2]); + vW = _mm_mul_ps(vW, M2.r[3]); + vX = _mm_add_ps(vX, vZ); + vY = _mm_add_ps(vY, vW); + vX = _mm_add_ps(vX, vY); + mResult.r[2] = vX; +#if defined(_XM_AVX_INTRINSICS_) + vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[3]) + 0); + vY = _mm_broadcast_ss(reinterpret_cast(&M1.r[3]) + 1); + vZ = _mm_broadcast_ss(reinterpret_cast(&M1.r[3]) + 2); + vW = _mm_broadcast_ss(reinterpret_cast(&M1.r[3]) + 3); +#else + vW = M1.r[3]; + vX = XM_PERMUTE_PS(vW, _MM_SHUFFLE(0, 0, 0, 0)); + vY = XM_PERMUTE_PS(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); +#endif + vX = _mm_mul_ps(vX, M2.r[0]); + vY = _mm_mul_ps(vY, M2.r[1]); + vZ = _mm_mul_ps(vZ, M2.r[2]); + vW = _mm_mul_ps(vW, M2.r[3]); + vX = _mm_add_ps(vX, vZ); + vY = _mm_add_ps(vY, vW); + vX = _mm_add_ps(vX, vY); + mResult.r[3] = vX; + return mResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixMultiplyTranspose +( + FXMMATRIX M1, + CXMMATRIX M2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMMATRIX mResult; + // Cache the invariants in registers + float x = M2.m[0][0]; + float y = M2.m[1][0]; + float z = M2.m[2][0]; + float w = M2.m[3][0]; + // Perform the operation on the first row + mResult.m[0][0] = (M1.m[0][0] * x) + (M1.m[0][1] * y) + (M1.m[0][2] * z) + (M1.m[0][3] * w); + mResult.m[0][1] = (M1.m[1][0] * x) + (M1.m[1][1] * y) + (M1.m[1][2] * z) + (M1.m[1][3] * w); + mResult.m[0][2] = (M1.m[2][0] * x) + (M1.m[2][1] * y) + (M1.m[2][2] * z) + (M1.m[2][3] * w); + mResult.m[0][3] = (M1.m[3][0] * x) + (M1.m[3][1] * y) + (M1.m[3][2] * z) + (M1.m[3][3] * w); + // Repeat for all the other rows + x = M2.m[0][1]; + y = M2.m[1][1]; + z = M2.m[2][1]; + w = M2.m[3][1]; + mResult.m[1][0] = (M1.m[0][0] * x) + (M1.m[0][1] * y) + (M1.m[0][2] * z) + (M1.m[0][3] * w); + mResult.m[1][1] = (M1.m[1][0] * x) + (M1.m[1][1] * y) + (M1.m[1][2] * z) + (M1.m[1][3] * w); + mResult.m[1][2] = (M1.m[2][0] * x) + (M1.m[2][1] * y) + (M1.m[2][2] * z) + (M1.m[2][3] * w); + mResult.m[1][3] = (M1.m[3][0] * x) + (M1.m[3][1] * y) + (M1.m[3][2] * z) + (M1.m[3][3] * w); + x = M2.m[0][2]; + y = M2.m[1][2]; + z = M2.m[2][2]; + w = M2.m[3][2]; + mResult.m[2][0] = (M1.m[0][0] * x) + (M1.m[0][1] * y) + (M1.m[0][2] * z) + (M1.m[0][3] * w); + mResult.m[2][1] = (M1.m[1][0] * x) + (M1.m[1][1] * y) + (M1.m[1][2] * z) + (M1.m[1][3] * w); + mResult.m[2][2] = (M1.m[2][0] * x) + (M1.m[2][1] * y) + (M1.m[2][2] * z) + (M1.m[2][3] * w); + mResult.m[2][3] = (M1.m[3][0] * x) + (M1.m[3][1] * y) + (M1.m[3][2] * z) + (M1.m[3][3] * w); + x = M2.m[0][3]; + y = M2.m[1][3]; + z = M2.m[2][3]; + w = M2.m[3][3]; + mResult.m[3][0] = (M1.m[0][0] * x) + (M1.m[0][1] * y) + (M1.m[0][2] * z) + (M1.m[0][3] * w); + mResult.m[3][1] = (M1.m[1][0] * x) + (M1.m[1][1] * y) + (M1.m[1][2] * z) + (M1.m[1][3] * w); + mResult.m[3][2] = (M1.m[2][0] * x) + (M1.m[2][1] * y) + (M1.m[2][2] * z) + (M1.m[2][3] * w); + mResult.m[3][3] = (M1.m[3][0] * x) + (M1.m[3][1] * y) + (M1.m[3][2] * z) + (M1.m[3][3] * w); + return mResult; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t VL = vget_low_f32(M1.r[0]); + float32x2_t VH = vget_high_f32(M1.r[0]); + // Perform the operation on the first row + float32x4_t vX = vmulq_lane_f32(M2.r[0], VL, 0); + float32x4_t vY = vmulq_lane_f32(M2.r[1], VL, 1); + float32x4_t vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); + float32x4_t vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); + float32x4_t r0 = vaddq_f32(vZ, vW); + // Repeat for the other 3 rows + VL = vget_low_f32(M1.r[1]); + VH = vget_high_f32(M1.r[1]); + vX = vmulq_lane_f32(M2.r[0], VL, 0); + vY = vmulq_lane_f32(M2.r[1], VL, 1); + vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); + vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); + float32x4_t r1 = vaddq_f32(vZ, vW); + VL = vget_low_f32(M1.r[2]); + VH = vget_high_f32(M1.r[2]); + vX = vmulq_lane_f32(M2.r[0], VL, 0); + vY = vmulq_lane_f32(M2.r[1], VL, 1); + vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); + vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); + float32x4_t r2 = vaddq_f32(vZ, vW); + VL = vget_low_f32(M1.r[3]); + VH = vget_high_f32(M1.r[3]); + vX = vmulq_lane_f32(M2.r[0], VL, 0); + vY = vmulq_lane_f32(M2.r[1], VL, 1); + vZ = vmlaq_lane_f32(vX, M2.r[2], VH, 0); + vW = vmlaq_lane_f32(vY, M2.r[3], VH, 1); + float32x4_t r3 = vaddq_f32(vZ, vW); + + // Transpose result + float32x4x2_t P0 = vzipq_f32(r0, r2); + float32x4x2_t P1 = vzipq_f32(r1, r3); + + float32x4x2_t T0 = vzipq_f32(P0.val[0], P1.val[0]); + float32x4x2_t T1 = vzipq_f32(P0.val[1], P1.val[1]); + + XMMATRIX mResult; + mResult.r[0] = T0.val[0]; + mResult.r[1] = T0.val[1]; + mResult.r[2] = T1.val[0]; + mResult.r[3] = T1.val[1]; + return mResult; +#elif defined(_XM_AVX2_INTRINSICS_) + __m256 t0 = _mm256_castps128_ps256(M1.r[0]); + t0 = _mm256_insertf128_ps(t0, M1.r[1], 1); + __m256 t1 = _mm256_castps128_ps256(M1.r[2]); + t1 = _mm256_insertf128_ps(t1, M1.r[3], 1); + + __m256 u0 = _mm256_castps128_ps256(M2.r[0]); + u0 = _mm256_insertf128_ps(u0, M2.r[1], 1); + __m256 u1 = _mm256_castps128_ps256(M2.r[2]); + u1 = _mm256_insertf128_ps(u1, M2.r[3], 1); + + __m256 a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(0, 0, 0, 0)); + __m256 a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(0, 0, 0, 0)); + __m256 b0 = _mm256_permute2f128_ps(u0, u0, 0x00); + __m256 c0 = _mm256_mul_ps(a0, b0); + __m256 c1 = _mm256_mul_ps(a1, b0); + + a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(1, 1, 1, 1)); + a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(1, 1, 1, 1)); + b0 = _mm256_permute2f128_ps(u0, u0, 0x11); + __m256 c2 = _mm256_fmadd_ps(a0, b0, c0); + __m256 c3 = _mm256_fmadd_ps(a1, b0, c1); + + a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(2, 2, 2, 2)); + a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(2, 2, 2, 2)); + __m256 b1 = _mm256_permute2f128_ps(u1, u1, 0x00); + __m256 c4 = _mm256_mul_ps(a0, b1); + __m256 c5 = _mm256_mul_ps(a1, b1); + + a0 = _mm256_shuffle_ps(t0, t0, _MM_SHUFFLE(3, 3, 3, 3)); + a1 = _mm256_shuffle_ps(t1, t1, _MM_SHUFFLE(3, 3, 3, 3)); + b1 = _mm256_permute2f128_ps(u1, u1, 0x11); + __m256 c6 = _mm256_fmadd_ps(a0, b1, c4); + __m256 c7 = _mm256_fmadd_ps(a1, b1, c5); + + t0 = _mm256_add_ps(c2, c6); + t1 = _mm256_add_ps(c3, c7); + + // Transpose result + __m256 vTemp = _mm256_unpacklo_ps(t0, t1); + __m256 vTemp2 = _mm256_unpackhi_ps(t0, t1); + __m256 vTemp3 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x20); + __m256 vTemp4 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x31); + vTemp = _mm256_unpacklo_ps(vTemp3, vTemp4); + vTemp2 = _mm256_unpackhi_ps(vTemp3, vTemp4); + t0 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x20); + t1 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x31); + + XMMATRIX mResult; + mResult.r[0] = _mm256_castps256_ps128(t0); + mResult.r[1] = _mm256_extractf128_ps(t0, 1); + mResult.r[2] = _mm256_castps256_ps128(t1); + mResult.r[3] = _mm256_extractf128_ps(t1, 1); + return mResult; +#elif defined(_XM_SSE_INTRINSICS_) + // Splat the component X,Y,Z then W +#if defined(_XM_AVX_INTRINSICS_) + XMVECTOR vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[0]) + 0); + XMVECTOR vY = _mm_broadcast_ss(reinterpret_cast(&M1.r[0]) + 1); + XMVECTOR vZ = _mm_broadcast_ss(reinterpret_cast(&M1.r[0]) + 2); + XMVECTOR vW = _mm_broadcast_ss(reinterpret_cast(&M1.r[0]) + 3); +#else + // Use vW to hold the original row + XMVECTOR vW = M1.r[0]; + XMVECTOR vX = XM_PERMUTE_PS(vW, _MM_SHUFFLE(0, 0, 0, 0)); + XMVECTOR vY = XM_PERMUTE_PS(vW, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); +#endif + // Perform the operation on the first row + vX = _mm_mul_ps(vX, M2.r[0]); + vY = _mm_mul_ps(vY, M2.r[1]); + vZ = _mm_mul_ps(vZ, M2.r[2]); + vW = _mm_mul_ps(vW, M2.r[3]); + // Perform a binary add to reduce cumulative errors + vX = _mm_add_ps(vX, vZ); + vY = _mm_add_ps(vY, vW); + vX = _mm_add_ps(vX, vY); + XMVECTOR r0 = vX; + // Repeat for the other 3 rows +#if defined(_XM_AVX_INTRINSICS_) + vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[1]) + 0); + vY = _mm_broadcast_ss(reinterpret_cast(&M1.r[1]) + 1); + vZ = _mm_broadcast_ss(reinterpret_cast(&M1.r[1]) + 2); + vW = _mm_broadcast_ss(reinterpret_cast(&M1.r[1]) + 3); +#else + vW = M1.r[1]; + vX = XM_PERMUTE_PS(vW, _MM_SHUFFLE(0, 0, 0, 0)); + vY = XM_PERMUTE_PS(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); +#endif + vX = _mm_mul_ps(vX, M2.r[0]); + vY = _mm_mul_ps(vY, M2.r[1]); + vZ = _mm_mul_ps(vZ, M2.r[2]); + vW = _mm_mul_ps(vW, M2.r[3]); + vX = _mm_add_ps(vX, vZ); + vY = _mm_add_ps(vY, vW); + vX = _mm_add_ps(vX, vY); + XMVECTOR r1 = vX; +#if defined(_XM_AVX_INTRINSICS_) + vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[2]) + 0); + vY = _mm_broadcast_ss(reinterpret_cast(&M1.r[2]) + 1); + vZ = _mm_broadcast_ss(reinterpret_cast(&M1.r[2]) + 2); + vW = _mm_broadcast_ss(reinterpret_cast(&M1.r[2]) + 3); +#else + vW = M1.r[2]; + vX = XM_PERMUTE_PS(vW, _MM_SHUFFLE(0, 0, 0, 0)); + vY = XM_PERMUTE_PS(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); +#endif + vX = _mm_mul_ps(vX, M2.r[0]); + vY = _mm_mul_ps(vY, M2.r[1]); + vZ = _mm_mul_ps(vZ, M2.r[2]); + vW = _mm_mul_ps(vW, M2.r[3]); + vX = _mm_add_ps(vX, vZ); + vY = _mm_add_ps(vY, vW); + vX = _mm_add_ps(vX, vY); + XMVECTOR r2 = vX; +#if defined(_XM_AVX_INTRINSICS_) + vX = _mm_broadcast_ss(reinterpret_cast(&M1.r[3]) + 0); + vY = _mm_broadcast_ss(reinterpret_cast(&M1.r[3]) + 1); + vZ = _mm_broadcast_ss(reinterpret_cast(&M1.r[3]) + 2); + vW = _mm_broadcast_ss(reinterpret_cast(&M1.r[3]) + 3); +#else + vW = M1.r[3]; + vX = XM_PERMUTE_PS(vW, _MM_SHUFFLE(0, 0, 0, 0)); + vY = XM_PERMUTE_PS(vW, _MM_SHUFFLE(1, 1, 1, 1)); + vZ = XM_PERMUTE_PS(vW, _MM_SHUFFLE(2, 2, 2, 2)); + vW = XM_PERMUTE_PS(vW, _MM_SHUFFLE(3, 3, 3, 3)); +#endif + vX = _mm_mul_ps(vX, M2.r[0]); + vY = _mm_mul_ps(vY, M2.r[1]); + vZ = _mm_mul_ps(vZ, M2.r[2]); + vW = _mm_mul_ps(vW, M2.r[3]); + vX = _mm_add_ps(vX, vZ); + vY = _mm_add_ps(vY, vW); + vX = _mm_add_ps(vX, vY); + XMVECTOR r3 = vX; + + // Transpose result + // x.x,x.y,y.x,y.y + XMVECTOR vTemp1 = _mm_shuffle_ps(r0, r1, _MM_SHUFFLE(1, 0, 1, 0)); + // x.z,x.w,y.z,y.w + XMVECTOR vTemp3 = _mm_shuffle_ps(r0, r1, _MM_SHUFFLE(3, 2, 3, 2)); + // z.x,z.y,w.x,w.y + XMVECTOR vTemp2 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(1, 0, 1, 0)); + // z.z,z.w,w.z,w.w + XMVECTOR vTemp4 = _mm_shuffle_ps(r2, r3, _MM_SHUFFLE(3, 2, 3, 2)); + + XMMATRIX mResult; + // x.x,y.x,z.x,w.x + mResult.r[0] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(2, 0, 2, 0)); + // x.y,y.y,z.y,w.y + mResult.r[1] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(3, 1, 3, 1)); + // x.z,y.z,z.z,w.z + mResult.r[2] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 0, 2, 0)); + // x.w,y.w,z.w,w.w + mResult.r[3] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(3, 1, 3, 1)); + return mResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixTranspose(FXMMATRIX M) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + // Original matrix: + // + // m00m01m02m03 + // m10m11m12m13 + // m20m21m22m23 + // m30m31m32m33 + + XMMATRIX P; + P.r[0] = XMVectorMergeXY(M.r[0], M.r[2]); // m00m20m01m21 + P.r[1] = XMVectorMergeXY(M.r[1], M.r[3]); // m10m30m11m31 + P.r[2] = XMVectorMergeZW(M.r[0], M.r[2]); // m02m22m03m23 + P.r[3] = XMVectorMergeZW(M.r[1], M.r[3]); // m12m32m13m33 + + XMMATRIX MT; + MT.r[0] = XMVectorMergeXY(P.r[0], P.r[1]); // m00m10m20m30 + MT.r[1] = XMVectorMergeZW(P.r[0], P.r[1]); // m01m11m21m31 + MT.r[2] = XMVectorMergeXY(P.r[2], P.r[3]); // m02m12m22m32 + MT.r[3] = XMVectorMergeZW(P.r[2], P.r[3]); // m03m13m23m33 + return MT; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4x2_t P0 = vzipq_f32(M.r[0], M.r[2]); + float32x4x2_t P1 = vzipq_f32(M.r[1], M.r[3]); + + float32x4x2_t T0 = vzipq_f32(P0.val[0], P1.val[0]); + float32x4x2_t T1 = vzipq_f32(P0.val[1], P1.val[1]); + + XMMATRIX mResult; + mResult.r[0] = T0.val[0]; + mResult.r[1] = T0.val[1]; + mResult.r[2] = T1.val[0]; + mResult.r[3] = T1.val[1]; + return mResult; +#elif defined(_XM_AVX2_INTRINSICS_) + __m256 t0 = _mm256_castps128_ps256(M.r[0]); + t0 = _mm256_insertf128_ps(t0, M.r[1], 1); + __m256 t1 = _mm256_castps128_ps256(M.r[2]); + t1 = _mm256_insertf128_ps(t1, M.r[3], 1); + + __m256 vTemp = _mm256_unpacklo_ps(t0, t1); + __m256 vTemp2 = _mm256_unpackhi_ps(t0, t1); + __m256 vTemp3 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x20); + __m256 vTemp4 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x31); + vTemp = _mm256_unpacklo_ps(vTemp3, vTemp4); + vTemp2 = _mm256_unpackhi_ps(vTemp3, vTemp4); + t0 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x20); + t1 = _mm256_permute2f128_ps(vTemp, vTemp2, 0x31); + + XMMATRIX mResult; + mResult.r[0] = _mm256_castps256_ps128(t0); + mResult.r[1] = _mm256_extractf128_ps(t0, 1); + mResult.r[2] = _mm256_castps256_ps128(t1); + mResult.r[3] = _mm256_extractf128_ps(t1, 1); + return mResult; +#elif defined(_XM_SSE_INTRINSICS_) + // x.x,x.y,y.x,y.y + XMVECTOR vTemp1 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(1, 0, 1, 0)); + // x.z,x.w,y.z,y.w + XMVECTOR vTemp3 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(3, 2, 3, 2)); + // z.x,z.y,w.x,w.y + XMVECTOR vTemp2 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(1, 0, 1, 0)); + // z.z,z.w,w.z,w.w + XMVECTOR vTemp4 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(3, 2, 3, 2)); + + XMMATRIX mResult; + // x.x,y.x,z.x,w.x + mResult.r[0] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(2, 0, 2, 0)); + // x.y,y.y,z.y,w.y + mResult.r[1] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(3, 1, 3, 1)); + // x.z,y.z,z.z,w.z + mResult.r[2] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 0, 2, 0)); + // x.w,y.w,z.w,w.w + mResult.r[3] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(3, 1, 3, 1)); + return mResult; +#endif +} + +//------------------------------------------------------------------------------ +// Return the inverse and the determinant of a 4x4 matrix +_Use_decl_annotations_ +inline XMMATRIX XM_CALLCONV XMMatrixInverse +( + XMVECTOR* pDeterminant, + FXMMATRIX M +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) + + XMMATRIX MT = XMMatrixTranspose(M); + + XMVECTOR V0[4], V1[4]; + V0[0] = XMVectorSwizzle(MT.r[2]); + V1[0] = XMVectorSwizzle(MT.r[3]); + V0[1] = XMVectorSwizzle(MT.r[0]); + V1[1] = XMVectorSwizzle(MT.r[1]); + V0[2] = XMVectorPermute(MT.r[2], MT.r[0]); + V1[2] = XMVectorPermute(MT.r[3], MT.r[1]); + + XMVECTOR D0 = XMVectorMultiply(V0[0], V1[0]); + XMVECTOR D1 = XMVectorMultiply(V0[1], V1[1]); + XMVECTOR D2 = XMVectorMultiply(V0[2], V1[2]); + + V0[0] = XMVectorSwizzle(MT.r[2]); + V1[0] = XMVectorSwizzle(MT.r[3]); + V0[1] = XMVectorSwizzle(MT.r[0]); + V1[1] = XMVectorSwizzle(MT.r[1]); + V0[2] = XMVectorPermute(MT.r[2], MT.r[0]); + V1[2] = XMVectorPermute(MT.r[3], MT.r[1]); + + D0 = XMVectorNegativeMultiplySubtract(V0[0], V1[0], D0); + D1 = XMVectorNegativeMultiplySubtract(V0[1], V1[1], D1); + D2 = XMVectorNegativeMultiplySubtract(V0[2], V1[2], D2); + + V0[0] = XMVectorSwizzle(MT.r[1]); + V1[0] = XMVectorPermute(D0, D2); + V0[1] = XMVectorSwizzle(MT.r[0]); + V1[1] = XMVectorPermute(D0, D2); + V0[2] = XMVectorSwizzle(MT.r[3]); + V1[2] = XMVectorPermute(D1, D2); + V0[3] = XMVectorSwizzle(MT.r[2]); + V1[3] = XMVectorPermute(D1, D2); + + XMVECTOR C0 = XMVectorMultiply(V0[0], V1[0]); + XMVECTOR C2 = XMVectorMultiply(V0[1], V1[1]); + XMVECTOR C4 = XMVectorMultiply(V0[2], V1[2]); + XMVECTOR C6 = XMVectorMultiply(V0[3], V1[3]); + + V0[0] = XMVectorSwizzle(MT.r[1]); + V1[0] = XMVectorPermute(D0, D2); + V0[1] = XMVectorSwizzle(MT.r[0]); + V1[1] = XMVectorPermute(D0, D2); + V0[2] = XMVectorSwizzle(MT.r[3]); + V1[2] = XMVectorPermute(D1, D2); + V0[3] = XMVectorSwizzle(MT.r[2]); + V1[3] = XMVectorPermute(D1, D2); + + C0 = XMVectorNegativeMultiplySubtract(V0[0], V1[0], C0); + C2 = XMVectorNegativeMultiplySubtract(V0[1], V1[1], C2); + C4 = XMVectorNegativeMultiplySubtract(V0[2], V1[2], C4); + C6 = XMVectorNegativeMultiplySubtract(V0[3], V1[3], C6); + + V0[0] = XMVectorSwizzle(MT.r[1]); + V1[0] = XMVectorPermute(D0, D2); + V0[1] = XMVectorSwizzle(MT.r[0]); + V1[1] = XMVectorPermute(D0, D2); + V0[2] = XMVectorSwizzle(MT.r[3]); + V1[2] = XMVectorPermute(D1, D2); + V0[3] = XMVectorSwizzle(MT.r[2]); + V1[3] = XMVectorPermute(D1, D2); + + XMVECTOR C1 = XMVectorNegativeMultiplySubtract(V0[0], V1[0], C0); + C0 = XMVectorMultiplyAdd(V0[0], V1[0], C0); + XMVECTOR C3 = XMVectorMultiplyAdd(V0[1], V1[1], C2); + C2 = XMVectorNegativeMultiplySubtract(V0[1], V1[1], C2); + XMVECTOR C5 = XMVectorNegativeMultiplySubtract(V0[2], V1[2], C4); + C4 = XMVectorMultiplyAdd(V0[2], V1[2], C4); + XMVECTOR C7 = XMVectorMultiplyAdd(V0[3], V1[3], C6); + C6 = XMVectorNegativeMultiplySubtract(V0[3], V1[3], C6); + + XMMATRIX R; + R.r[0] = XMVectorSelect(C0, C1, g_XMSelect0101.v); + R.r[1] = XMVectorSelect(C2, C3, g_XMSelect0101.v); + R.r[2] = XMVectorSelect(C4, C5, g_XMSelect0101.v); + R.r[3] = XMVectorSelect(C6, C7, g_XMSelect0101.v); + + XMVECTOR Determinant = XMVector4Dot(R.r[0], MT.r[0]); + + if (pDeterminant != nullptr) + *pDeterminant = Determinant; + + XMVECTOR Reciprocal = XMVectorReciprocal(Determinant); + + XMMATRIX Result; + Result.r[0] = XMVectorMultiply(R.r[0], Reciprocal); + Result.r[1] = XMVectorMultiply(R.r[1], Reciprocal); + Result.r[2] = XMVectorMultiply(R.r[2], Reciprocal); + Result.r[3] = XMVectorMultiply(R.r[3], Reciprocal); + return Result; + +#elif defined(_XM_SSE_INTRINSICS_) + // Transpose matrix + XMVECTOR vTemp1 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(1, 0, 1, 0)); + XMVECTOR vTemp3 = _mm_shuffle_ps(M.r[0], M.r[1], _MM_SHUFFLE(3, 2, 3, 2)); + XMVECTOR vTemp2 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(1, 0, 1, 0)); + XMVECTOR vTemp4 = _mm_shuffle_ps(M.r[2], M.r[3], _MM_SHUFFLE(3, 2, 3, 2)); + + XMMATRIX MT; + MT.r[0] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(2, 0, 2, 0)); + MT.r[1] = _mm_shuffle_ps(vTemp1, vTemp2, _MM_SHUFFLE(3, 1, 3, 1)); + MT.r[2] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(2, 0, 2, 0)); + MT.r[3] = _mm_shuffle_ps(vTemp3, vTemp4, _MM_SHUFFLE(3, 1, 3, 1)); + + XMVECTOR V00 = XM_PERMUTE_PS(MT.r[2], _MM_SHUFFLE(1, 1, 0, 0)); + XMVECTOR V10 = XM_PERMUTE_PS(MT.r[3], _MM_SHUFFLE(3, 2, 3, 2)); + XMVECTOR V01 = XM_PERMUTE_PS(MT.r[0], _MM_SHUFFLE(1, 1, 0, 0)); + XMVECTOR V11 = XM_PERMUTE_PS(MT.r[1], _MM_SHUFFLE(3, 2, 3, 2)); + XMVECTOR V02 = _mm_shuffle_ps(MT.r[2], MT.r[0], _MM_SHUFFLE(2, 0, 2, 0)); + XMVECTOR V12 = _mm_shuffle_ps(MT.r[3], MT.r[1], _MM_SHUFFLE(3, 1, 3, 1)); + + XMVECTOR D0 = _mm_mul_ps(V00, V10); + XMVECTOR D1 = _mm_mul_ps(V01, V11); + XMVECTOR D2 = _mm_mul_ps(V02, V12); + + V00 = XM_PERMUTE_PS(MT.r[2], _MM_SHUFFLE(3, 2, 3, 2)); + V10 = XM_PERMUTE_PS(MT.r[3], _MM_SHUFFLE(1, 1, 0, 0)); + V01 = XM_PERMUTE_PS(MT.r[0], _MM_SHUFFLE(3, 2, 3, 2)); + V11 = XM_PERMUTE_PS(MT.r[1], _MM_SHUFFLE(1, 1, 0, 0)); + V02 = _mm_shuffle_ps(MT.r[2], MT.r[0], _MM_SHUFFLE(3, 1, 3, 1)); + V12 = _mm_shuffle_ps(MT.r[3], MT.r[1], _MM_SHUFFLE(2, 0, 2, 0)); + + D0 = XM_FNMADD_PS(V00, V10, D0); + D1 = XM_FNMADD_PS(V01, V11, D1); + D2 = XM_FNMADD_PS(V02, V12, D2); + // V11 = D0Y,D0W,D2Y,D2Y + V11 = _mm_shuffle_ps(D0, D2, _MM_SHUFFLE(1, 1, 3, 1)); + V00 = XM_PERMUTE_PS(MT.r[1], _MM_SHUFFLE(1, 0, 2, 1)); + V10 = _mm_shuffle_ps(V11, D0, _MM_SHUFFLE(0, 3, 0, 2)); + V01 = XM_PERMUTE_PS(MT.r[0], _MM_SHUFFLE(0, 1, 0, 2)); + V11 = _mm_shuffle_ps(V11, D0, _MM_SHUFFLE(2, 1, 2, 1)); + // V13 = D1Y,D1W,D2W,D2W + XMVECTOR V13 = _mm_shuffle_ps(D1, D2, _MM_SHUFFLE(3, 3, 3, 1)); + V02 = XM_PERMUTE_PS(MT.r[3], _MM_SHUFFLE(1, 0, 2, 1)); + V12 = _mm_shuffle_ps(V13, D1, _MM_SHUFFLE(0, 3, 0, 2)); + XMVECTOR V03 = XM_PERMUTE_PS(MT.r[2], _MM_SHUFFLE(0, 1, 0, 2)); + V13 = _mm_shuffle_ps(V13, D1, _MM_SHUFFLE(2, 1, 2, 1)); + + XMVECTOR C0 = _mm_mul_ps(V00, V10); + XMVECTOR C2 = _mm_mul_ps(V01, V11); + XMVECTOR C4 = _mm_mul_ps(V02, V12); + XMVECTOR C6 = _mm_mul_ps(V03, V13); + + // V11 = D0X,D0Y,D2X,D2X + V11 = _mm_shuffle_ps(D0, D2, _MM_SHUFFLE(0, 0, 1, 0)); + V00 = XM_PERMUTE_PS(MT.r[1], _MM_SHUFFLE(2, 1, 3, 2)); + V10 = _mm_shuffle_ps(D0, V11, _MM_SHUFFLE(2, 1, 0, 3)); + V01 = XM_PERMUTE_PS(MT.r[0], _MM_SHUFFLE(1, 3, 2, 3)); + V11 = _mm_shuffle_ps(D0, V11, _MM_SHUFFLE(0, 2, 1, 2)); + // V13 = D1X,D1Y,D2Z,D2Z + V13 = _mm_shuffle_ps(D1, D2, _MM_SHUFFLE(2, 2, 1, 0)); + V02 = XM_PERMUTE_PS(MT.r[3], _MM_SHUFFLE(2, 1, 3, 2)); + V12 = _mm_shuffle_ps(D1, V13, _MM_SHUFFLE(2, 1, 0, 3)); + V03 = XM_PERMUTE_PS(MT.r[2], _MM_SHUFFLE(1, 3, 2, 3)); + V13 = _mm_shuffle_ps(D1, V13, _MM_SHUFFLE(0, 2, 1, 2)); + + C0 = XM_FNMADD_PS(V00, V10, C0); + C2 = XM_FNMADD_PS(V01, V11, C2); + C4 = XM_FNMADD_PS(V02, V12, C4); + C6 = XM_FNMADD_PS(V03, V13, C6); + + V00 = XM_PERMUTE_PS(MT.r[1], _MM_SHUFFLE(0, 3, 0, 3)); + // V10 = D0Z,D0Z,D2X,D2Y + V10 = _mm_shuffle_ps(D0, D2, _MM_SHUFFLE(1, 0, 2, 2)); + V10 = XM_PERMUTE_PS(V10, _MM_SHUFFLE(0, 2, 3, 0)); + V01 = XM_PERMUTE_PS(MT.r[0], _MM_SHUFFLE(2, 0, 3, 1)); + // V11 = D0X,D0W,D2X,D2Y + V11 = _mm_shuffle_ps(D0, D2, _MM_SHUFFLE(1, 0, 3, 0)); + V11 = XM_PERMUTE_PS(V11, _MM_SHUFFLE(2, 1, 0, 3)); + V02 = XM_PERMUTE_PS(MT.r[3], _MM_SHUFFLE(0, 3, 0, 3)); + // V12 = D1Z,D1Z,D2Z,D2W + V12 = _mm_shuffle_ps(D1, D2, _MM_SHUFFLE(3, 2, 2, 2)); + V12 = XM_PERMUTE_PS(V12, _MM_SHUFFLE(0, 2, 3, 0)); + V03 = XM_PERMUTE_PS(MT.r[2], _MM_SHUFFLE(2, 0, 3, 1)); + // V13 = D1X,D1W,D2Z,D2W + V13 = _mm_shuffle_ps(D1, D2, _MM_SHUFFLE(3, 2, 3, 0)); + V13 = XM_PERMUTE_PS(V13, _MM_SHUFFLE(2, 1, 0, 3)); + + V00 = _mm_mul_ps(V00, V10); + V01 = _mm_mul_ps(V01, V11); + V02 = _mm_mul_ps(V02, V12); + V03 = _mm_mul_ps(V03, V13); + XMVECTOR C1 = _mm_sub_ps(C0, V00); + C0 = _mm_add_ps(C0, V00); + XMVECTOR C3 = _mm_add_ps(C2, V01); + C2 = _mm_sub_ps(C2, V01); + XMVECTOR C5 = _mm_sub_ps(C4, V02); + C4 = _mm_add_ps(C4, V02); + XMVECTOR C7 = _mm_add_ps(C6, V03); + C6 = _mm_sub_ps(C6, V03); + + C0 = _mm_shuffle_ps(C0, C1, _MM_SHUFFLE(3, 1, 2, 0)); + C2 = _mm_shuffle_ps(C2, C3, _MM_SHUFFLE(3, 1, 2, 0)); + C4 = _mm_shuffle_ps(C4, C5, _MM_SHUFFLE(3, 1, 2, 0)); + C6 = _mm_shuffle_ps(C6, C7, _MM_SHUFFLE(3, 1, 2, 0)); + C0 = XM_PERMUTE_PS(C0, _MM_SHUFFLE(3, 1, 2, 0)); + C2 = XM_PERMUTE_PS(C2, _MM_SHUFFLE(3, 1, 2, 0)); + C4 = XM_PERMUTE_PS(C4, _MM_SHUFFLE(3, 1, 2, 0)); + C6 = XM_PERMUTE_PS(C6, _MM_SHUFFLE(3, 1, 2, 0)); + // Get the determinant + XMVECTOR vTemp = XMVector4Dot(C0, MT.r[0]); + if (pDeterminant != nullptr) + *pDeterminant = vTemp; + vTemp = _mm_div_ps(g_XMOne, vTemp); + XMMATRIX mResult; + mResult.r[0] = _mm_mul_ps(C0, vTemp); + mResult.r[1] = _mm_mul_ps(C2, vTemp); + mResult.r[2] = _mm_mul_ps(C4, vTemp); + mResult.r[3] = _mm_mul_ps(C6, vTemp); + return mResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixVectorTensorProduct +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ + XMMATRIX mResult; + mResult.r[0] = XMVectorMultiply(XMVectorSwizzle<0, 0, 0, 0>(V1), V2); + mResult.r[1] = XMVectorMultiply(XMVectorSwizzle<1, 1, 1, 1>(V1), V2); + mResult.r[2] = XMVectorMultiply(XMVectorSwizzle<2, 2, 2, 2>(V1), V2); + mResult.r[3] = XMVectorMultiply(XMVectorSwizzle<3, 3, 3, 3>(V1), V2); + return mResult; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMMatrixDeterminant(FXMMATRIX M) noexcept +{ + static const XMVECTORF32 Sign = { { { 1.0f, -1.0f, 1.0f, -1.0f } } }; + + XMVECTOR V0 = XMVectorSwizzle(M.r[2]); + XMVECTOR V1 = XMVectorSwizzle(M.r[3]); + XMVECTOR V2 = XMVectorSwizzle(M.r[2]); + XMVECTOR V3 = XMVectorSwizzle(M.r[3]); + XMVECTOR V4 = XMVectorSwizzle(M.r[2]); + XMVECTOR V5 = XMVectorSwizzle(M.r[3]); + + XMVECTOR P0 = XMVectorMultiply(V0, V1); + XMVECTOR P1 = XMVectorMultiply(V2, V3); + XMVECTOR P2 = XMVectorMultiply(V4, V5); + + V0 = XMVectorSwizzle(M.r[2]); + V1 = XMVectorSwizzle(M.r[3]); + V2 = XMVectorSwizzle(M.r[2]); + V3 = XMVectorSwizzle(M.r[3]); + V4 = XMVectorSwizzle(M.r[2]); + V5 = XMVectorSwizzle(M.r[3]); + + P0 = XMVectorNegativeMultiplySubtract(V0, V1, P0); + P1 = XMVectorNegativeMultiplySubtract(V2, V3, P1); + P2 = XMVectorNegativeMultiplySubtract(V4, V5, P2); + + V0 = XMVectorSwizzle(M.r[1]); + V1 = XMVectorSwizzle(M.r[1]); + V2 = XMVectorSwizzle(M.r[1]); + + XMVECTOR S = XMVectorMultiply(M.r[0], Sign.v); + XMVECTOR R = XMVectorMultiply(V0, P0); + R = XMVectorNegativeMultiplySubtract(V1, P1, R); + R = XMVectorMultiplyAdd(V2, P2, R); + + return XMVector4Dot(S, R); +} + +#define XM3RANKDECOMPOSE(a, b, c, x, y, z) \ + if((x) < (y)) \ + { \ + if((y) < (z)) \ + { \ + (a) = 2; \ + (b) = 1; \ + (c) = 0; \ + } \ + else \ + { \ + (a) = 1; \ + \ + if((x) < (z)) \ + { \ + (b) = 2; \ + (c) = 0; \ + } \ + else \ + { \ + (b) = 0; \ + (c) = 2; \ + } \ + } \ + } \ + else \ + { \ + if((x) < (z)) \ + { \ + (a) = 2; \ + (b) = 0; \ + (c) = 1; \ + } \ + else \ + { \ + (a) = 0; \ + \ + if((y) < (z)) \ + { \ + (b) = 2; \ + (c) = 1; \ + } \ + else \ + { \ + (b) = 1; \ + (c) = 2; \ + } \ + } \ + } + +#define XM3_DECOMP_EPSILON 0.0001f + +_Use_decl_annotations_ +inline bool XM_CALLCONV XMMatrixDecompose +( + XMVECTOR* outScale, + XMVECTOR* outRotQuat, + XMVECTOR* outTrans, + FXMMATRIX M +) noexcept +{ + static const XMVECTOR* pvCanonicalBasis[3] = { + &g_XMIdentityR0.v, + &g_XMIdentityR1.v, + &g_XMIdentityR2.v + }; + + assert(outScale != nullptr); + assert(outRotQuat != nullptr); + assert(outTrans != nullptr); + + // Get the translation + outTrans[0] = M.r[3]; + + XMVECTOR* ppvBasis[3]; + XMMATRIX matTemp; + ppvBasis[0] = &matTemp.r[0]; + ppvBasis[1] = &matTemp.r[1]; + ppvBasis[2] = &matTemp.r[2]; + + matTemp.r[0] = M.r[0]; + matTemp.r[1] = M.r[1]; + matTemp.r[2] = M.r[2]; + matTemp.r[3] = g_XMIdentityR3.v; + + auto pfScales = reinterpret_cast(outScale); + + size_t a, b, c; + XMVectorGetXPtr(&pfScales[0], XMVector3Length(ppvBasis[0][0])); + XMVectorGetXPtr(&pfScales[1], XMVector3Length(ppvBasis[1][0])); + XMVectorGetXPtr(&pfScales[2], XMVector3Length(ppvBasis[2][0])); + pfScales[3] = 0.f; + + XM3RANKDECOMPOSE(a, b, c, pfScales[0], pfScales[1], pfScales[2]) + + if (pfScales[a] < XM3_DECOMP_EPSILON) + { + ppvBasis[a][0] = pvCanonicalBasis[a][0]; + } + ppvBasis[a][0] = XMVector3Normalize(ppvBasis[a][0]); + + if (pfScales[b] < XM3_DECOMP_EPSILON) + { + size_t aa, bb, cc; + float fAbsX, fAbsY, fAbsZ; + + fAbsX = fabsf(XMVectorGetX(ppvBasis[a][0])); + fAbsY = fabsf(XMVectorGetY(ppvBasis[a][0])); + fAbsZ = fabsf(XMVectorGetZ(ppvBasis[a][0])); + + XM3RANKDECOMPOSE(aa, bb, cc, fAbsX, fAbsY, fAbsZ) + + ppvBasis[b][0] = XMVector3Cross(ppvBasis[a][0], pvCanonicalBasis[cc][0]); + } + + ppvBasis[b][0] = XMVector3Normalize(ppvBasis[b][0]); + + if (pfScales[c] < XM3_DECOMP_EPSILON) + { + ppvBasis[c][0] = XMVector3Cross(ppvBasis[a][0], ppvBasis[b][0]); + } + + ppvBasis[c][0] = XMVector3Normalize(ppvBasis[c][0]); + + float fDet = XMVectorGetX(XMMatrixDeterminant(matTemp)); + + // use Kramer's rule to check for handedness of coordinate system + if (fDet < 0.0f) + { + // switch coordinate system by negating the scale and inverting the basis vector on the x-axis + pfScales[a] = -pfScales[a]; + ppvBasis[a][0] = XMVectorNegate(ppvBasis[a][0]); + + fDet = -fDet; + } + + fDet -= 1.0f; + fDet *= fDet; + + if (XM3_DECOMP_EPSILON < fDet) + { + // Non-SRT matrix encountered + return false; + } + + // generate the quaternion from the matrix + outRotQuat[0] = XMQuaternionRotationMatrix(matTemp); + return true; +} + +#undef XM3_DECOMP_EPSILON +#undef XM3RANKDECOMPOSE + +//------------------------------------------------------------------------------ +// Transformation operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixIdentity() noexcept +{ + XMMATRIX M; + M.r[0] = g_XMIdentityR0.v; + M.r[1] = g_XMIdentityR1.v; + M.r[2] = g_XMIdentityR2.v; + M.r[3] = g_XMIdentityR3.v; + return M; +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixSet +( + float m00, float m01, float m02, float m03, + float m10, float m11, float m12, float m13, + float m20, float m21, float m22, float m23, + float m30, float m31, float m32, float m33 +) noexcept +{ + XMMATRIX M; +#if defined(_XM_NO_INTRINSICS_) + M.m[0][0] = m00; M.m[0][1] = m01; M.m[0][2] = m02; M.m[0][3] = m03; + M.m[1][0] = m10; M.m[1][1] = m11; M.m[1][2] = m12; M.m[1][3] = m13; + M.m[2][0] = m20; M.m[2][1] = m21; M.m[2][2] = m22; M.m[2][3] = m23; + M.m[3][0] = m30; M.m[3][1] = m31; M.m[3][2] = m32; M.m[3][3] = m33; +#else + M.r[0] = XMVectorSet(m00, m01, m02, m03); + M.r[1] = XMVectorSet(m10, m11, m12, m13); + M.r[2] = XMVectorSet(m20, m21, m22, m23); + M.r[3] = XMVectorSet(m30, m31, m32, m33); +#endif + return M; +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixTranslation +( + float OffsetX, + float OffsetY, + float OffsetZ +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMMATRIX M; + M.m[0][0] = 1.0f; + M.m[0][1] = 0.0f; + M.m[0][2] = 0.0f; + M.m[0][3] = 0.0f; + + M.m[1][0] = 0.0f; + M.m[1][1] = 1.0f; + M.m[1][2] = 0.0f; + M.m[1][3] = 0.0f; + + M.m[2][0] = 0.0f; + M.m[2][1] = 0.0f; + M.m[2][2] = 1.0f; + M.m[2][3] = 0.0f; + + M.m[3][0] = OffsetX; + M.m[3][1] = OffsetY; + M.m[3][2] = OffsetZ; + M.m[3][3] = 1.0f; + return M; + +#elif defined(_XM_SSE_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) + XMMATRIX M; + M.r[0] = g_XMIdentityR0.v; + M.r[1] = g_XMIdentityR1.v; + M.r[2] = g_XMIdentityR2.v; + M.r[3] = XMVectorSet(OffsetX, OffsetY, OffsetZ, 1.f); + return M; +#endif +} + + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixTranslationFromVector(FXMVECTOR Offset) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMMATRIX M; + M.m[0][0] = 1.0f; + M.m[0][1] = 0.0f; + M.m[0][2] = 0.0f; + M.m[0][3] = 0.0f; + + M.m[1][0] = 0.0f; + M.m[1][1] = 1.0f; + M.m[1][2] = 0.0f; + M.m[1][3] = 0.0f; + + M.m[2][0] = 0.0f; + M.m[2][1] = 0.0f; + M.m[2][2] = 1.0f; + M.m[2][3] = 0.0f; + + M.m[3][0] = Offset.vector4_f32[0]; + M.m[3][1] = Offset.vector4_f32[1]; + M.m[3][2] = Offset.vector4_f32[2]; + M.m[3][3] = 1.0f; + return M; + +#elif defined(_XM_SSE_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) + XMMATRIX M; + M.r[0] = g_XMIdentityR0.v; + M.r[1] = g_XMIdentityR1.v; + M.r[2] = g_XMIdentityR2.v; + M.r[3] = XMVectorSelect(g_XMIdentityR3.v, Offset, g_XMSelect1110.v); + return M; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixScaling +( + float ScaleX, + float ScaleY, + float ScaleZ +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMMATRIX M; + M.m[0][0] = ScaleX; + M.m[0][1] = 0.0f; + M.m[0][2] = 0.0f; + M.m[0][3] = 0.0f; + + M.m[1][0] = 0.0f; + M.m[1][1] = ScaleY; + M.m[1][2] = 0.0f; + M.m[1][3] = 0.0f; + + M.m[2][0] = 0.0f; + M.m[2][1] = 0.0f; + M.m[2][2] = ScaleZ; + M.m[2][3] = 0.0f; + + M.m[3][0] = 0.0f; + M.m[3][1] = 0.0f; + M.m[3][2] = 0.0f; + M.m[3][3] = 1.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + const XMVECTOR Zero = vdupq_n_f32(0); + XMMATRIX M; + M.r[0] = vsetq_lane_f32(ScaleX, Zero, 0); + M.r[1] = vsetq_lane_f32(ScaleY, Zero, 1); + M.r[2] = vsetq_lane_f32(ScaleZ, Zero, 2); + M.r[3] = g_XMIdentityR3.v; + return M; +#elif defined(_XM_SSE_INTRINSICS_) + XMMATRIX M; + M.r[0] = _mm_set_ps(0, 0, 0, ScaleX); + M.r[1] = _mm_set_ps(0, 0, ScaleY, 0); + M.r[2] = _mm_set_ps(0, ScaleZ, 0, 0); + M.r[3] = g_XMIdentityR3.v; + return M; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixScalingFromVector(FXMVECTOR Scale) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMMATRIX M; + M.m[0][0] = Scale.vector4_f32[0]; + M.m[0][1] = 0.0f; + M.m[0][2] = 0.0f; + M.m[0][3] = 0.0f; + + M.m[1][0] = 0.0f; + M.m[1][1] = Scale.vector4_f32[1]; + M.m[1][2] = 0.0f; + M.m[1][3] = 0.0f; + + M.m[2][0] = 0.0f; + M.m[2][1] = 0.0f; + M.m[2][2] = Scale.vector4_f32[2]; + M.m[2][3] = 0.0f; + + M.m[3][0] = 0.0f; + M.m[3][1] = 0.0f; + M.m[3][2] = 0.0f; + M.m[3][3] = 1.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + XMMATRIX M; + M.r[0] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(Scale), g_XMMaskX)); + M.r[1] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(Scale), g_XMMaskY)); + M.r[2] = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(Scale), g_XMMaskZ)); + M.r[3] = g_XMIdentityR3.v; + return M; +#elif defined(_XM_SSE_INTRINSICS_) + XMMATRIX M; + M.r[0] = _mm_and_ps(Scale, g_XMMaskX); + M.r[1] = _mm_and_ps(Scale, g_XMMaskY); + M.r[2] = _mm_and_ps(Scale, g_XMMaskZ); + M.r[3] = g_XMIdentityR3.v; + return M; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixRotationX(float Angle) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + float fSinAngle; + float fCosAngle; + XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); + + XMMATRIX M; + M.m[0][0] = 1.0f; + M.m[0][1] = 0.0f; + M.m[0][2] = 0.0f; + M.m[0][3] = 0.0f; + + M.m[1][0] = 0.0f; + M.m[1][1] = fCosAngle; + M.m[1][2] = fSinAngle; + M.m[1][3] = 0.0f; + + M.m[2][0] = 0.0f; + M.m[2][1] = -fSinAngle; + M.m[2][2] = fCosAngle; + M.m[2][3] = 0.0f; + + M.m[3][0] = 0.0f; + M.m[3][1] = 0.0f; + M.m[3][2] = 0.0f; + M.m[3][3] = 1.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float fSinAngle; + float fCosAngle; + XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); + + const float32x4_t Zero = vdupq_n_f32(0); + + float32x4_t T1 = vsetq_lane_f32(fCosAngle, Zero, 1); + T1 = vsetq_lane_f32(fSinAngle, T1, 2); + + float32x4_t T2 = vsetq_lane_f32(-fSinAngle, Zero, 1); + T2 = vsetq_lane_f32(fCosAngle, T2, 2); + + XMMATRIX M; + M.r[0] = g_XMIdentityR0.v; + M.r[1] = T1; + M.r[2] = T2; + M.r[3] = g_XMIdentityR3.v; + return M; +#elif defined(_XM_SSE_INTRINSICS_) + float SinAngle; + float CosAngle; + XMScalarSinCos(&SinAngle, &CosAngle, Angle); + + XMVECTOR vSin = _mm_set_ss(SinAngle); + XMVECTOR vCos = _mm_set_ss(CosAngle); + // x = 0,y = cos,z = sin, w = 0 + vCos = _mm_shuffle_ps(vCos, vSin, _MM_SHUFFLE(3, 0, 0, 3)); + XMMATRIX M; + M.r[0] = g_XMIdentityR0; + M.r[1] = vCos; + // x = 0,y = sin,z = cos, w = 0 + vCos = XM_PERMUTE_PS(vCos, _MM_SHUFFLE(3, 1, 2, 0)); + // x = 0,y = -sin,z = cos, w = 0 + vCos = _mm_mul_ps(vCos, g_XMNegateY); + M.r[2] = vCos; + M.r[3] = g_XMIdentityR3; + return M; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixRotationY(float Angle) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + float fSinAngle; + float fCosAngle; + XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); + + XMMATRIX M; + M.m[0][0] = fCosAngle; + M.m[0][1] = 0.0f; + M.m[0][2] = -fSinAngle; + M.m[0][3] = 0.0f; + + M.m[1][0] = 0.0f; + M.m[1][1] = 1.0f; + M.m[1][2] = 0.0f; + M.m[1][3] = 0.0f; + + M.m[2][0] = fSinAngle; + M.m[2][1] = 0.0f; + M.m[2][2] = fCosAngle; + M.m[2][3] = 0.0f; + + M.m[3][0] = 0.0f; + M.m[3][1] = 0.0f; + M.m[3][2] = 0.0f; + M.m[3][3] = 1.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float fSinAngle; + float fCosAngle; + XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); + + const float32x4_t Zero = vdupq_n_f32(0); + + float32x4_t T0 = vsetq_lane_f32(fCosAngle, Zero, 0); + T0 = vsetq_lane_f32(-fSinAngle, T0, 2); + + float32x4_t T2 = vsetq_lane_f32(fSinAngle, Zero, 0); + T2 = vsetq_lane_f32(fCosAngle, T2, 2); + + XMMATRIX M; + M.r[0] = T0; + M.r[1] = g_XMIdentityR1.v; + M.r[2] = T2; + M.r[3] = g_XMIdentityR3.v; + return M; +#elif defined(_XM_SSE_INTRINSICS_) + float SinAngle; + float CosAngle; + XMScalarSinCos(&SinAngle, &CosAngle, Angle); + + XMVECTOR vSin = _mm_set_ss(SinAngle); + XMVECTOR vCos = _mm_set_ss(CosAngle); + // x = sin,y = 0,z = cos, w = 0 + vSin = _mm_shuffle_ps(vSin, vCos, _MM_SHUFFLE(3, 0, 3, 0)); + XMMATRIX M; + M.r[2] = vSin; + M.r[1] = g_XMIdentityR1; + // x = cos,y = 0,z = sin, w = 0 + vSin = XM_PERMUTE_PS(vSin, _MM_SHUFFLE(3, 0, 1, 2)); + // x = cos,y = 0,z = -sin, w = 0 + vSin = _mm_mul_ps(vSin, g_XMNegateZ); + M.r[0] = vSin; + M.r[3] = g_XMIdentityR3; + return M; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixRotationZ(float Angle) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + float fSinAngle; + float fCosAngle; + XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); + + XMMATRIX M; + M.m[0][0] = fCosAngle; + M.m[0][1] = fSinAngle; + M.m[0][2] = 0.0f; + M.m[0][3] = 0.0f; + + M.m[1][0] = -fSinAngle; + M.m[1][1] = fCosAngle; + M.m[1][2] = 0.0f; + M.m[1][3] = 0.0f; + + M.m[2][0] = 0.0f; + M.m[2][1] = 0.0f; + M.m[2][2] = 1.0f; + M.m[2][3] = 0.0f; + + M.m[3][0] = 0.0f; + M.m[3][1] = 0.0f; + M.m[3][2] = 0.0f; + M.m[3][3] = 1.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float fSinAngle; + float fCosAngle; + XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); + + const float32x4_t Zero = vdupq_n_f32(0); + + float32x4_t T0 = vsetq_lane_f32(fCosAngle, Zero, 0); + T0 = vsetq_lane_f32(fSinAngle, T0, 1); + + float32x4_t T1 = vsetq_lane_f32(-fSinAngle, Zero, 0); + T1 = vsetq_lane_f32(fCosAngle, T1, 1); + + XMMATRIX M; + M.r[0] = T0; + M.r[1] = T1; + M.r[2] = g_XMIdentityR2.v; + M.r[3] = g_XMIdentityR3.v; + return M; +#elif defined(_XM_SSE_INTRINSICS_) + float SinAngle; + float CosAngle; + XMScalarSinCos(&SinAngle, &CosAngle, Angle); + + XMVECTOR vSin = _mm_set_ss(SinAngle); + XMVECTOR vCos = _mm_set_ss(CosAngle); + // x = cos,y = sin,z = 0, w = 0 + vCos = _mm_unpacklo_ps(vCos, vSin); + XMMATRIX M; + M.r[0] = vCos; + // x = sin,y = cos,z = 0, w = 0 + vCos = XM_PERMUTE_PS(vCos, _MM_SHUFFLE(3, 2, 0, 1)); + // x = cos,y = -sin,z = 0, w = 0 + vCos = _mm_mul_ps(vCos, g_XMNegateX); + M.r[1] = vCos; + M.r[2] = g_XMIdentityR2; + M.r[3] = g_XMIdentityR3; + return M; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixRotationRollPitchYaw +( + float Pitch, + float Yaw, + float Roll +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + float cp = cosf(Pitch); + float sp = sinf(Pitch); + + float cy = cosf(Yaw); + float sy = sinf(Yaw); + + float cr = cosf(Roll); + float sr = sinf(Roll); + + XMMATRIX M; + M.m[0][0] = cr * cy + sr * sp * sy; + M.m[0][1] = sr * cp; + M.m[0][2] = sr * sp * cy - cr * sy; + M.m[0][3] = 0.0f; + + M.m[1][0] = cr * sp * sy - sr * cy; + M.m[1][1] = cr * cp; + M.m[1][2] = sr * sy + cr * sp * cy; + M.m[1][3] = 0.0f; + + M.m[2][0] = cp * sy; + M.m[2][1] = -sp; + M.m[2][2] = cp * cy; + M.m[2][3] = 0.0f; + + M.m[3][0] = 0.0f; + M.m[3][1] = 0.0f; + M.m[3][2] = 0.0f; + M.m[3][3] = 1.0f; + return M; +#else + XMVECTOR Angles = XMVectorSet(Pitch, Yaw, Roll, 0.0f); + return XMMatrixRotationRollPitchYawFromVector(Angles); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixRotationRollPitchYawFromVector +( + FXMVECTOR Angles // +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + float cp = cosf(Angles.vector4_f32[0]); + float sp = sinf(Angles.vector4_f32[0]); + + float cy = cosf(Angles.vector4_f32[1]); + float sy = sinf(Angles.vector4_f32[1]); + + float cr = cosf(Angles.vector4_f32[2]); + float sr = sinf(Angles.vector4_f32[2]); + + XMMATRIX M; + M.m[0][0] = cr * cy + sr * sp * sy; + M.m[0][1] = sr * cp; + M.m[0][2] = sr * sp * cy - cr * sy; + M.m[0][3] = 0.0f; + + M.m[1][0] = cr * sp * sy - sr * cy; + M.m[1][1] = cr * cp; + M.m[1][2] = sr * sy + cr * sp * cy; + M.m[1][3] = 0.0f; + + M.m[2][0] = cp * sy; + M.m[2][1] = -sp; + M.m[2][2] = cp * cy; + M.m[2][3] = 0.0f; + + M.m[3][0] = 0.0f; + M.m[3][1] = 0.0f; + M.m[3][2] = 0.0f; + M.m[3][3] = 1.0f; + return M; +#else + static const XMVECTORF32 Sign = { { { 1.0f, -1.0f, -1.0f, 1.0f } } }; + + XMVECTOR SinAngles, CosAngles; + XMVectorSinCos(&SinAngles, &CosAngles, Angles); + + XMVECTOR P0 = XMVectorPermute(SinAngles, CosAngles); + XMVECTOR Y0 = XMVectorPermute(SinAngles, CosAngles); + XMVECTOR P1 = XMVectorPermute(SinAngles, CosAngles); + XMVECTOR Y1 = XMVectorPermute(SinAngles, CosAngles); + XMVECTOR P2 = XMVectorPermute(SinAngles, CosAngles); + XMVECTOR P3 = XMVectorPermute(SinAngles, CosAngles); + XMVECTOR Y2 = XMVectorSplatX(SinAngles); + XMVECTOR NS = XMVectorNegate(SinAngles); + + XMVECTOR Q0 = XMVectorMultiply(P0, Y0); + XMVECTOR Q1 = XMVectorMultiply(P1, Sign.v); + Q1 = XMVectorMultiply(Q1, Y1); + XMVECTOR Q2 = XMVectorMultiply(P2, Y2); + Q2 = XMVectorMultiplyAdd(Q2, P3, Q1); + + XMVECTOR V0 = XMVectorPermute(Q0, Q2); + XMVECTOR V1 = XMVectorPermute(Q0, Q2); + XMVECTOR V2 = XMVectorPermute(Q0, NS); + + XMMATRIX M; + M.r[0] = XMVectorSelect(g_XMZero, V0, g_XMSelect1110.v); + M.r[1] = XMVectorSelect(g_XMZero, V1, g_XMSelect1110.v); + M.r[2] = XMVectorSelect(g_XMZero, V2, g_XMSelect1110.v); + M.r[3] = g_XMIdentityR3; + return M; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixRotationNormal +( + FXMVECTOR NormalAxis, + float Angle +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) + + float fSinAngle; + float fCosAngle; + XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); + + XMVECTOR A = XMVectorSet(fSinAngle, fCosAngle, 1.0f - fCosAngle, 0.0f); + + XMVECTOR C2 = XMVectorSplatZ(A); + XMVECTOR C1 = XMVectorSplatY(A); + XMVECTOR C0 = XMVectorSplatX(A); + + XMVECTOR N0 = XMVectorSwizzle(NormalAxis); + XMVECTOR N1 = XMVectorSwizzle(NormalAxis); + + XMVECTOR V0 = XMVectorMultiply(C2, N0); + V0 = XMVectorMultiply(V0, N1); + + XMVECTOR R0 = XMVectorMultiply(C2, NormalAxis); + R0 = XMVectorMultiplyAdd(R0, NormalAxis, C1); + + XMVECTOR R1 = XMVectorMultiplyAdd(C0, NormalAxis, V0); + XMVECTOR R2 = XMVectorNegativeMultiplySubtract(C0, NormalAxis, V0); + + V0 = XMVectorSelect(A, R0, g_XMSelect1110.v); + XMVECTOR V1 = XMVectorPermute(R1, R2); + XMVECTOR V2 = XMVectorPermute(R1, R2); + + XMMATRIX M; + M.r[0] = XMVectorPermute(V0, V1); + M.r[1] = XMVectorPermute(V0, V1); + M.r[2] = XMVectorPermute(V0, V2); + M.r[3] = g_XMIdentityR3.v; + return M; + +#elif defined(_XM_SSE_INTRINSICS_) + float fSinAngle; + float fCosAngle; + XMScalarSinCos(&fSinAngle, &fCosAngle, Angle); + + XMVECTOR C2 = _mm_set_ps1(1.0f - fCosAngle); + XMVECTOR C1 = _mm_set_ps1(fCosAngle); + XMVECTOR C0 = _mm_set_ps1(fSinAngle); + + XMVECTOR N0 = XM_PERMUTE_PS(NormalAxis, _MM_SHUFFLE(3, 0, 2, 1)); + XMVECTOR N1 = XM_PERMUTE_PS(NormalAxis, _MM_SHUFFLE(3, 1, 0, 2)); + + XMVECTOR V0 = _mm_mul_ps(C2, N0); + V0 = _mm_mul_ps(V0, N1); + + XMVECTOR R0 = _mm_mul_ps(C2, NormalAxis); + R0 = _mm_mul_ps(R0, NormalAxis); + R0 = _mm_add_ps(R0, C1); + + XMVECTOR R1 = _mm_mul_ps(C0, NormalAxis); + R1 = _mm_add_ps(R1, V0); + XMVECTOR R2 = _mm_mul_ps(C0, NormalAxis); + R2 = _mm_sub_ps(V0, R2); + + V0 = _mm_and_ps(R0, g_XMMask3); + XMVECTOR V1 = _mm_shuffle_ps(R1, R2, _MM_SHUFFLE(2, 1, 2, 0)); + V1 = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 3, 2, 1)); + XMVECTOR V2 = _mm_shuffle_ps(R1, R2, _MM_SHUFFLE(0, 0, 1, 1)); + V2 = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 0, 2, 0)); + + R2 = _mm_shuffle_ps(V0, V1, _MM_SHUFFLE(1, 0, 3, 0)); + R2 = XM_PERMUTE_PS(R2, _MM_SHUFFLE(1, 3, 2, 0)); + + XMMATRIX M; + M.r[0] = R2; + + R2 = _mm_shuffle_ps(V0, V1, _MM_SHUFFLE(3, 2, 3, 1)); + R2 = XM_PERMUTE_PS(R2, _MM_SHUFFLE(1, 3, 0, 2)); + M.r[1] = R2; + + V2 = _mm_shuffle_ps(V2, V0, _MM_SHUFFLE(3, 2, 1, 0)); + M.r[2] = V2; + M.r[3] = g_XMIdentityR3.v; + return M; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixRotationAxis +( + FXMVECTOR Axis, + float Angle +) noexcept +{ + assert(!XMVector3Equal(Axis, XMVectorZero())); + assert(!XMVector3IsInfinite(Axis)); + + XMVECTOR Normal = XMVector3Normalize(Axis); + return XMMatrixRotationNormal(Normal, Angle); +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixRotationQuaternion(FXMVECTOR Quaternion) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + float qx = Quaternion.vector4_f32[0]; + float qxx = qx * qx; + + float qy = Quaternion.vector4_f32[1]; + float qyy = qy * qy; + + float qz = Quaternion.vector4_f32[2]; + float qzz = qz * qz; + + float qw = Quaternion.vector4_f32[3]; + + XMMATRIX M; + M.m[0][0] = 1.f - 2.f * qyy - 2.f * qzz; + M.m[0][1] = 2.f * qx * qy + 2.f * qz * qw; + M.m[0][2] = 2.f * qx * qz - 2.f * qy * qw; + M.m[0][3] = 0.f; + + M.m[1][0] = 2.f * qx * qy - 2.f * qz * qw; + M.m[1][1] = 1.f - 2.f * qxx - 2.f * qzz; + M.m[1][2] = 2.f * qy * qz + 2.f * qx * qw; + M.m[1][3] = 0.f; + + M.m[2][0] = 2.f * qx * qz + 2.f * qy * qw; + M.m[2][1] = 2.f * qy * qz - 2.f * qx * qw; + M.m[2][2] = 1.f - 2.f * qxx - 2.f * qyy; + M.m[2][3] = 0.f; + + M.m[3][0] = 0.f; + M.m[3][1] = 0.f; + M.m[3][2] = 0.f; + M.m[3][3] = 1.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 Constant1110 = { { { 1.0f, 1.0f, 1.0f, 0.0f } } }; + + XMVECTOR Q0 = XMVectorAdd(Quaternion, Quaternion); + XMVECTOR Q1 = XMVectorMultiply(Quaternion, Q0); + + XMVECTOR V0 = XMVectorPermute(Q1, Constant1110.v); + XMVECTOR V1 = XMVectorPermute(Q1, Constant1110.v); + XMVECTOR R0 = XMVectorSubtract(Constant1110, V0); + R0 = XMVectorSubtract(R0, V1); + + V0 = XMVectorSwizzle(Quaternion); + V1 = XMVectorSwizzle(Q0); + V0 = XMVectorMultiply(V0, V1); + + V1 = XMVectorSplatW(Quaternion); + XMVECTOR V2 = XMVectorSwizzle(Q0); + V1 = XMVectorMultiply(V1, V2); + + XMVECTOR R1 = XMVectorAdd(V0, V1); + XMVECTOR R2 = XMVectorSubtract(V0, V1); + + V0 = XMVectorPermute(R1, R2); + V1 = XMVectorPermute(R1, R2); + + XMMATRIX M; + M.r[0] = XMVectorPermute(R0, V0); + M.r[1] = XMVectorPermute(R0, V0); + M.r[2] = XMVectorPermute(R0, V1); + M.r[3] = g_XMIdentityR3.v; + return M; + +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 Constant1110 = { { { 1.0f, 1.0f, 1.0f, 0.0f } } }; + + XMVECTOR Q0 = _mm_add_ps(Quaternion, Quaternion); + XMVECTOR Q1 = _mm_mul_ps(Quaternion, Q0); + + XMVECTOR V0 = XM_PERMUTE_PS(Q1, _MM_SHUFFLE(3, 0, 0, 1)); + V0 = _mm_and_ps(V0, g_XMMask3); + XMVECTOR V1 = XM_PERMUTE_PS(Q1, _MM_SHUFFLE(3, 1, 2, 2)); + V1 = _mm_and_ps(V1, g_XMMask3); + XMVECTOR R0 = _mm_sub_ps(Constant1110, V0); + R0 = _mm_sub_ps(R0, V1); + + V0 = XM_PERMUTE_PS(Quaternion, _MM_SHUFFLE(3, 1, 0, 0)); + V1 = XM_PERMUTE_PS(Q0, _MM_SHUFFLE(3, 2, 1, 2)); + V0 = _mm_mul_ps(V0, V1); + + V1 = XM_PERMUTE_PS(Quaternion, _MM_SHUFFLE(3, 3, 3, 3)); + XMVECTOR V2 = XM_PERMUTE_PS(Q0, _MM_SHUFFLE(3, 0, 2, 1)); + V1 = _mm_mul_ps(V1, V2); + + XMVECTOR R1 = _mm_add_ps(V0, V1); + XMVECTOR R2 = _mm_sub_ps(V0, V1); + + V0 = _mm_shuffle_ps(R1, R2, _MM_SHUFFLE(1, 0, 2, 1)); + V0 = XM_PERMUTE_PS(V0, _MM_SHUFFLE(1, 3, 2, 0)); + V1 = _mm_shuffle_ps(R1, R2, _MM_SHUFFLE(2, 2, 0, 0)); + V1 = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 0, 2, 0)); + + Q1 = _mm_shuffle_ps(R0, V0, _MM_SHUFFLE(1, 0, 3, 0)); + Q1 = XM_PERMUTE_PS(Q1, _MM_SHUFFLE(1, 3, 2, 0)); + + XMMATRIX M; + M.r[0] = Q1; + + Q1 = _mm_shuffle_ps(R0, V0, _MM_SHUFFLE(3, 2, 3, 1)); + Q1 = XM_PERMUTE_PS(Q1, _MM_SHUFFLE(1, 3, 0, 2)); + M.r[1] = Q1; + + Q1 = _mm_shuffle_ps(V1, R0, _MM_SHUFFLE(3, 2, 1, 0)); + M.r[2] = Q1; + M.r[3] = g_XMIdentityR3; + return M; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixTransformation2D +( + FXMVECTOR ScalingOrigin, + float ScalingOrientation, + FXMVECTOR Scaling, + FXMVECTOR RotationOrigin, + float Rotation, + GXMVECTOR Translation +) noexcept +{ + // M = Inverse(MScalingOrigin) * Transpose(MScalingOrientation) * MScaling * MScalingOrientation * + // MScalingOrigin * Inverse(MRotationOrigin) * MRotation * MRotationOrigin * MTranslation; + + XMVECTOR VScalingOrigin = XMVectorSelect(g_XMSelect1100.v, ScalingOrigin, g_XMSelect1100.v); + XMVECTOR NegScalingOrigin = XMVectorNegate(VScalingOrigin); + + XMMATRIX MScalingOriginI = XMMatrixTranslationFromVector(NegScalingOrigin); + XMMATRIX MScalingOrientation = XMMatrixRotationZ(ScalingOrientation); + XMMATRIX MScalingOrientationT = XMMatrixTranspose(MScalingOrientation); + XMVECTOR VScaling = XMVectorSelect(g_XMOne.v, Scaling, g_XMSelect1100.v); + XMMATRIX MScaling = XMMatrixScalingFromVector(VScaling); + XMVECTOR VRotationOrigin = XMVectorSelect(g_XMSelect1100.v, RotationOrigin, g_XMSelect1100.v); + XMMATRIX MRotation = XMMatrixRotationZ(Rotation); + XMVECTOR VTranslation = XMVectorSelect(g_XMSelect1100.v, Translation, g_XMSelect1100.v); + + XMMATRIX M = XMMatrixMultiply(MScalingOriginI, MScalingOrientationT); + M = XMMatrixMultiply(M, MScaling); + M = XMMatrixMultiply(M, MScalingOrientation); + M.r[3] = XMVectorAdd(M.r[3], VScalingOrigin); + M.r[3] = XMVectorSubtract(M.r[3], VRotationOrigin); + M = XMMatrixMultiply(M, MRotation); + M.r[3] = XMVectorAdd(M.r[3], VRotationOrigin); + M.r[3] = XMVectorAdd(M.r[3], VTranslation); + + return M; +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixTransformation +( + FXMVECTOR ScalingOrigin, + FXMVECTOR ScalingOrientationQuaternion, + FXMVECTOR Scaling, + GXMVECTOR RotationOrigin, + HXMVECTOR RotationQuaternion, + HXMVECTOR Translation +) noexcept +{ + // M = Inverse(MScalingOrigin) * Transpose(MScalingOrientation) * MScaling * MScalingOrientation * + // MScalingOrigin * Inverse(MRotationOrigin) * MRotation * MRotationOrigin * MTranslation; + + XMVECTOR VScalingOrigin = XMVectorSelect(g_XMSelect1110.v, ScalingOrigin, g_XMSelect1110.v); + XMVECTOR NegScalingOrigin = XMVectorNegate(ScalingOrigin); + + XMMATRIX MScalingOriginI = XMMatrixTranslationFromVector(NegScalingOrigin); + XMMATRIX MScalingOrientation = XMMatrixRotationQuaternion(ScalingOrientationQuaternion); + XMMATRIX MScalingOrientationT = XMMatrixTranspose(MScalingOrientation); + XMMATRIX MScaling = XMMatrixScalingFromVector(Scaling); + XMVECTOR VRotationOrigin = XMVectorSelect(g_XMSelect1110.v, RotationOrigin, g_XMSelect1110.v); + XMMATRIX MRotation = XMMatrixRotationQuaternion(RotationQuaternion); + XMVECTOR VTranslation = XMVectorSelect(g_XMSelect1110.v, Translation, g_XMSelect1110.v); + + XMMATRIX M; + M = XMMatrixMultiply(MScalingOriginI, MScalingOrientationT); + M = XMMatrixMultiply(M, MScaling); + M = XMMatrixMultiply(M, MScalingOrientation); + M.r[3] = XMVectorAdd(M.r[3], VScalingOrigin); + M.r[3] = XMVectorSubtract(M.r[3], VRotationOrigin); + M = XMMatrixMultiply(M, MRotation); + M.r[3] = XMVectorAdd(M.r[3], VRotationOrigin); + M.r[3] = XMVectorAdd(M.r[3], VTranslation); + return M; +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixAffineTransformation2D +( + FXMVECTOR Scaling, + FXMVECTOR RotationOrigin, + float Rotation, + FXMVECTOR Translation +) noexcept +{ + // M = MScaling * Inverse(MRotationOrigin) * MRotation * MRotationOrigin * MTranslation; + + XMVECTOR VScaling = XMVectorSelect(g_XMOne.v, Scaling, g_XMSelect1100.v); + XMMATRIX MScaling = XMMatrixScalingFromVector(VScaling); + XMVECTOR VRotationOrigin = XMVectorSelect(g_XMSelect1100.v, RotationOrigin, g_XMSelect1100.v); + XMMATRIX MRotation = XMMatrixRotationZ(Rotation); + XMVECTOR VTranslation = XMVectorSelect(g_XMSelect1100.v, Translation, g_XMSelect1100.v); + + XMMATRIX M; + M = MScaling; + M.r[3] = XMVectorSubtract(M.r[3], VRotationOrigin); + M = XMMatrixMultiply(M, MRotation); + M.r[3] = XMVectorAdd(M.r[3], VRotationOrigin); + M.r[3] = XMVectorAdd(M.r[3], VTranslation); + return M; +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixAffineTransformation +( + FXMVECTOR Scaling, + FXMVECTOR RotationOrigin, + FXMVECTOR RotationQuaternion, + GXMVECTOR Translation +) noexcept +{ + // M = MScaling * Inverse(MRotationOrigin) * MRotation * MRotationOrigin * MTranslation; + + XMMATRIX MScaling = XMMatrixScalingFromVector(Scaling); + XMVECTOR VRotationOrigin = XMVectorSelect(g_XMSelect1110.v, RotationOrigin, g_XMSelect1110.v); + XMMATRIX MRotation = XMMatrixRotationQuaternion(RotationQuaternion); + XMVECTOR VTranslation = XMVectorSelect(g_XMSelect1110.v, Translation, g_XMSelect1110.v); + + XMMATRIX M; + M = MScaling; + M.r[3] = XMVectorSubtract(M.r[3], VRotationOrigin); + M = XMMatrixMultiply(M, MRotation); + M.r[3] = XMVectorAdd(M.r[3], VRotationOrigin); + M.r[3] = XMVectorAdd(M.r[3], VTranslation); + return M; +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixReflect(FXMVECTOR ReflectionPlane) noexcept +{ + assert(!XMVector3Equal(ReflectionPlane, XMVectorZero())); + assert(!XMPlaneIsInfinite(ReflectionPlane)); + + static const XMVECTORF32 NegativeTwo = { { { -2.0f, -2.0f, -2.0f, 0.0f } } }; + + XMVECTOR P = XMPlaneNormalize(ReflectionPlane); + XMVECTOR S = XMVectorMultiply(P, NegativeTwo); + + XMVECTOR A = XMVectorSplatX(P); + XMVECTOR B = XMVectorSplatY(P); + XMVECTOR C = XMVectorSplatZ(P); + XMVECTOR D = XMVectorSplatW(P); + + XMMATRIX M; + M.r[0] = XMVectorMultiplyAdd(A, S, g_XMIdentityR0.v); + M.r[1] = XMVectorMultiplyAdd(B, S, g_XMIdentityR1.v); + M.r[2] = XMVectorMultiplyAdd(C, S, g_XMIdentityR2.v); + M.r[3] = XMVectorMultiplyAdd(D, S, g_XMIdentityR3.v); + return M; +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixShadow +( + FXMVECTOR ShadowPlane, + FXMVECTOR LightPosition +) noexcept +{ + static const XMVECTORU32 Select0001 = { { { XM_SELECT_0, XM_SELECT_0, XM_SELECT_0, XM_SELECT_1 } } }; + + assert(!XMVector3Equal(ShadowPlane, XMVectorZero())); + assert(!XMPlaneIsInfinite(ShadowPlane)); + + XMVECTOR P = XMPlaneNormalize(ShadowPlane); + XMVECTOR Dot = XMPlaneDot(P, LightPosition); + P = XMVectorNegate(P); + XMVECTOR D = XMVectorSplatW(P); + XMVECTOR C = XMVectorSplatZ(P); + XMVECTOR B = XMVectorSplatY(P); + XMVECTOR A = XMVectorSplatX(P); + Dot = XMVectorSelect(Select0001.v, Dot, Select0001.v); + + XMMATRIX M; + M.r[3] = XMVectorMultiplyAdd(D, LightPosition, Dot); + Dot = XMVectorRotateLeft(Dot, 1); + M.r[2] = XMVectorMultiplyAdd(C, LightPosition, Dot); + Dot = XMVectorRotateLeft(Dot, 1); + M.r[1] = XMVectorMultiplyAdd(B, LightPosition, Dot); + Dot = XMVectorRotateLeft(Dot, 1); + M.r[0] = XMVectorMultiplyAdd(A, LightPosition, Dot); + return M; +} + +//------------------------------------------------------------------------------ +// View and projection initialization operations +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixLookAtLH +( + FXMVECTOR EyePosition, + FXMVECTOR FocusPosition, + FXMVECTOR UpDirection +) noexcept +{ + XMVECTOR EyeDirection = XMVectorSubtract(FocusPosition, EyePosition); + return XMMatrixLookToLH(EyePosition, EyeDirection, UpDirection); +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixLookAtRH +( + FXMVECTOR EyePosition, + FXMVECTOR FocusPosition, + FXMVECTOR UpDirection +) noexcept +{ + XMVECTOR NegEyeDirection = XMVectorSubtract(EyePosition, FocusPosition); + return XMMatrixLookToLH(EyePosition, NegEyeDirection, UpDirection); +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixLookToLH +( + FXMVECTOR EyePosition, + FXMVECTOR EyeDirection, + FXMVECTOR UpDirection +) noexcept +{ + assert(!XMVector3Equal(EyeDirection, XMVectorZero())); + assert(!XMVector3IsInfinite(EyeDirection)); + assert(!XMVector3Equal(UpDirection, XMVectorZero())); + assert(!XMVector3IsInfinite(UpDirection)); + + XMVECTOR R2 = XMVector3Normalize(EyeDirection); + + XMVECTOR R0 = XMVector3Cross(UpDirection, R2); + R0 = XMVector3Normalize(R0); + + XMVECTOR R1 = XMVector3Cross(R2, R0); + + XMVECTOR NegEyePosition = XMVectorNegate(EyePosition); + + XMVECTOR D0 = XMVector3Dot(R0, NegEyePosition); + XMVECTOR D1 = XMVector3Dot(R1, NegEyePosition); + XMVECTOR D2 = XMVector3Dot(R2, NegEyePosition); + + XMMATRIX M; + M.r[0] = XMVectorSelect(D0, R0, g_XMSelect1110.v); + M.r[1] = XMVectorSelect(D1, R1, g_XMSelect1110.v); + M.r[2] = XMVectorSelect(D2, R2, g_XMSelect1110.v); + M.r[3] = g_XMIdentityR3.v; + + M = XMMatrixTranspose(M); + + return M; +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixLookToRH +( + FXMVECTOR EyePosition, + FXMVECTOR EyeDirection, + FXMVECTOR UpDirection +) noexcept +{ + XMVECTOR NegEyeDirection = XMVectorNegate(EyeDirection); + return XMMatrixLookToLH(EyePosition, NegEyeDirection, UpDirection); +} + +//------------------------------------------------------------------------------ + +#ifdef _PREFAST_ +#pragma prefast(push) +#pragma prefast(disable:28931, "PREfast noise: Esp:1266") +#endif + +inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveLH +( + float ViewWidth, + float ViewHeight, + float NearZ, + float FarZ +) noexcept +{ + assert(NearZ > 0.f && FarZ > 0.f); + assert(!XMScalarNearEqual(ViewWidth, 0.0f, 0.00001f)); + assert(!XMScalarNearEqual(ViewHeight, 0.0f, 0.00001f)); + assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); + +#if defined(_XM_NO_INTRINSICS_) + + float TwoNearZ = NearZ + NearZ; + float fRange = FarZ / (FarZ - NearZ); + + XMMATRIX M; + M.m[0][0] = TwoNearZ / ViewWidth; + M.m[0][1] = 0.0f; + M.m[0][2] = 0.0f; + M.m[0][3] = 0.0f; + + M.m[1][0] = 0.0f; + M.m[1][1] = TwoNearZ / ViewHeight; + M.m[1][2] = 0.0f; + M.m[1][3] = 0.0f; + + M.m[2][0] = 0.0f; + M.m[2][1] = 0.0f; + M.m[2][2] = fRange; + M.m[2][3] = 1.0f; + + M.m[3][0] = 0.0f; + M.m[3][1] = 0.0f; + M.m[3][2] = -fRange * NearZ; + M.m[3][3] = 0.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float TwoNearZ = NearZ + NearZ; + float fRange = FarZ / (FarZ - NearZ); + const float32x4_t Zero = vdupq_n_f32(0); + XMMATRIX M; + M.r[0] = vsetq_lane_f32(TwoNearZ / ViewWidth, Zero, 0); + M.r[1] = vsetq_lane_f32(TwoNearZ / ViewHeight, Zero, 1); + M.r[2] = vsetq_lane_f32(fRange, g_XMIdentityR3.v, 2); + M.r[3] = vsetq_lane_f32(-fRange * NearZ, Zero, 2); + return M; +#elif defined(_XM_SSE_INTRINSICS_) + XMMATRIX M; + float TwoNearZ = NearZ + NearZ; + float fRange = FarZ / (FarZ - NearZ); + // Note: This is recorded on the stack + XMVECTOR rMem = { + TwoNearZ / ViewWidth, + TwoNearZ / ViewHeight, + fRange, + -fRange * NearZ + }; + // Copy from memory to SSE register + XMVECTOR vValues = rMem; + XMVECTOR vTemp = _mm_setzero_ps(); + // Copy x only + vTemp = _mm_move_ss(vTemp, vValues); + // TwoNearZ / ViewWidth,0,0,0 + M.r[0] = vTemp; + // 0,TwoNearZ / ViewHeight,0,0 + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); + M.r[1] = vTemp; + // x=fRange,y=-fRange * NearZ,0,1.0f + vValues = _mm_shuffle_ps(vValues, g_XMIdentityR3, _MM_SHUFFLE(3, 2, 3, 2)); + // 0,0,fRange,1.0f + vTemp = _mm_setzero_ps(); + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 0, 0, 0)); + M.r[2] = vTemp; + // 0,0,-fRange * NearZ,0 + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 1, 0, 0)); + M.r[3] = vTemp; + return M; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveRH +( + float ViewWidth, + float ViewHeight, + float NearZ, + float FarZ +) noexcept +{ + assert(NearZ > 0.f && FarZ > 0.f); + assert(!XMScalarNearEqual(ViewWidth, 0.0f, 0.00001f)); + assert(!XMScalarNearEqual(ViewHeight, 0.0f, 0.00001f)); + assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); + +#if defined(_XM_NO_INTRINSICS_) + + float TwoNearZ = NearZ + NearZ; + float fRange = FarZ / (NearZ - FarZ); + + XMMATRIX M; + M.m[0][0] = TwoNearZ / ViewWidth; + M.m[0][1] = 0.0f; + M.m[0][2] = 0.0f; + M.m[0][3] = 0.0f; + + M.m[1][0] = 0.0f; + M.m[1][1] = TwoNearZ / ViewHeight; + M.m[1][2] = 0.0f; + M.m[1][3] = 0.0f; + + M.m[2][0] = 0.0f; + M.m[2][1] = 0.0f; + M.m[2][2] = fRange; + M.m[2][3] = -1.0f; + + M.m[3][0] = 0.0f; + M.m[3][1] = 0.0f; + M.m[3][2] = fRange * NearZ; + M.m[3][3] = 0.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float TwoNearZ = NearZ + NearZ; + float fRange = FarZ / (NearZ - FarZ); + const float32x4_t Zero = vdupq_n_f32(0); + + XMMATRIX M; + M.r[0] = vsetq_lane_f32(TwoNearZ / ViewWidth, Zero, 0); + M.r[1] = vsetq_lane_f32(TwoNearZ / ViewHeight, Zero, 1); + M.r[2] = vsetq_lane_f32(fRange, g_XMNegIdentityR3.v, 2); + M.r[3] = vsetq_lane_f32(fRange * NearZ, Zero, 2); + return M; +#elif defined(_XM_SSE_INTRINSICS_) + XMMATRIX M; + float TwoNearZ = NearZ + NearZ; + float fRange = FarZ / (NearZ - FarZ); + // Note: This is recorded on the stack + XMVECTOR rMem = { + TwoNearZ / ViewWidth, + TwoNearZ / ViewHeight, + fRange, + fRange * NearZ + }; + // Copy from memory to SSE register + XMVECTOR vValues = rMem; + XMVECTOR vTemp = _mm_setzero_ps(); + // Copy x only + vTemp = _mm_move_ss(vTemp, vValues); + // TwoNearZ / ViewWidth,0,0,0 + M.r[0] = vTemp; + // 0,TwoNearZ / ViewHeight,0,0 + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); + M.r[1] = vTemp; + // x=fRange,y=-fRange * NearZ,0,-1.0f + vValues = _mm_shuffle_ps(vValues, g_XMNegIdentityR3, _MM_SHUFFLE(3, 2, 3, 2)); + // 0,0,fRange,-1.0f + vTemp = _mm_setzero_ps(); + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 0, 0, 0)); + M.r[2] = vTemp; + // 0,0,-fRange * NearZ,0 + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 1, 0, 0)); + M.r[3] = vTemp; + return M; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovLH +( + float FovAngleY, + float AspectRatio, + float NearZ, + float FarZ +) noexcept +{ + assert(NearZ > 0.f && FarZ > 0.f); + assert(!XMScalarNearEqual(FovAngleY, 0.0f, 0.00001f * 2.0f)); + assert(!XMScalarNearEqual(AspectRatio, 0.0f, 0.00001f)); + assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); + +#if defined(_XM_NO_INTRINSICS_) + + float SinFov; + float CosFov; + XMScalarSinCos(&SinFov, &CosFov, 0.5f * FovAngleY); + + float Height = CosFov / SinFov; + float Width = Height / AspectRatio; + float fRange = FarZ / (FarZ - NearZ); + + XMMATRIX M; + M.m[0][0] = Width; + M.m[0][1] = 0.0f; + M.m[0][2] = 0.0f; + M.m[0][3] = 0.0f; + + M.m[1][0] = 0.0f; + M.m[1][1] = Height; + M.m[1][2] = 0.0f; + M.m[1][3] = 0.0f; + + M.m[2][0] = 0.0f; + M.m[2][1] = 0.0f; + M.m[2][2] = fRange; + M.m[2][3] = 1.0f; + + M.m[3][0] = 0.0f; + M.m[3][1] = 0.0f; + M.m[3][2] = -fRange * NearZ; + M.m[3][3] = 0.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float SinFov; + float CosFov; + XMScalarSinCos(&SinFov, &CosFov, 0.5f * FovAngleY); + + float fRange = FarZ / (FarZ - NearZ); + float Height = CosFov / SinFov; + float Width = Height / AspectRatio; + const float32x4_t Zero = vdupq_n_f32(0); + + XMMATRIX M; + M.r[0] = vsetq_lane_f32(Width, Zero, 0); + M.r[1] = vsetq_lane_f32(Height, Zero, 1); + M.r[2] = vsetq_lane_f32(fRange, g_XMIdentityR3.v, 2); + M.r[3] = vsetq_lane_f32(-fRange * NearZ, Zero, 2); + return M; +#elif defined(_XM_SSE_INTRINSICS_) + float SinFov; + float CosFov; + XMScalarSinCos(&SinFov, &CosFov, 0.5f * FovAngleY); + + float fRange = FarZ / (FarZ - NearZ); + // Note: This is recorded on the stack + float Height = CosFov / SinFov; + XMVECTOR rMem = { + Height / AspectRatio, + Height, + fRange, + -fRange * NearZ + }; + // Copy from memory to SSE register + XMVECTOR vValues = rMem; + XMVECTOR vTemp = _mm_setzero_ps(); + // Copy x only + vTemp = _mm_move_ss(vTemp, vValues); + // Height / AspectRatio,0,0,0 + XMMATRIX M; + M.r[0] = vTemp; + // 0,Height,0,0 + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); + M.r[1] = vTemp; + // x=fRange,y=-fRange * NearZ,0,1.0f + vTemp = _mm_setzero_ps(); + vValues = _mm_shuffle_ps(vValues, g_XMIdentityR3, _MM_SHUFFLE(3, 2, 3, 2)); + // 0,0,fRange,1.0f + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 0, 0, 0)); + M.r[2] = vTemp; + // 0,0,-fRange * NearZ,0.0f + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 1, 0, 0)); + M.r[3] = vTemp; + return M; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveFovRH +( + float FovAngleY, + float AspectRatio, + float NearZ, + float FarZ +) noexcept +{ + assert(NearZ > 0.f && FarZ > 0.f); + assert(!XMScalarNearEqual(FovAngleY, 0.0f, 0.00001f * 2.0f)); + assert(!XMScalarNearEqual(AspectRatio, 0.0f, 0.00001f)); + assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); + +#if defined(_XM_NO_INTRINSICS_) + + float SinFov; + float CosFov; + XMScalarSinCos(&SinFov, &CosFov, 0.5f * FovAngleY); + + float Height = CosFov / SinFov; + float Width = Height / AspectRatio; + float fRange = FarZ / (NearZ - FarZ); + + XMMATRIX M; + M.m[0][0] = Width; + M.m[0][1] = 0.0f; + M.m[0][2] = 0.0f; + M.m[0][3] = 0.0f; + + M.m[1][0] = 0.0f; + M.m[1][1] = Height; + M.m[1][2] = 0.0f; + M.m[1][3] = 0.0f; + + M.m[2][0] = 0.0f; + M.m[2][1] = 0.0f; + M.m[2][2] = fRange; + M.m[2][3] = -1.0f; + + M.m[3][0] = 0.0f; + M.m[3][1] = 0.0f; + M.m[3][2] = fRange * NearZ; + M.m[3][3] = 0.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float SinFov; + float CosFov; + XMScalarSinCos(&SinFov, &CosFov, 0.5f * FovAngleY); + float fRange = FarZ / (NearZ - FarZ); + float Height = CosFov / SinFov; + float Width = Height / AspectRatio; + const float32x4_t Zero = vdupq_n_f32(0); + + XMMATRIX M; + M.r[0] = vsetq_lane_f32(Width, Zero, 0); + M.r[1] = vsetq_lane_f32(Height, Zero, 1); + M.r[2] = vsetq_lane_f32(fRange, g_XMNegIdentityR3.v, 2); + M.r[3] = vsetq_lane_f32(fRange * NearZ, Zero, 2); + return M; +#elif defined(_XM_SSE_INTRINSICS_) + float SinFov; + float CosFov; + XMScalarSinCos(&SinFov, &CosFov, 0.5f * FovAngleY); + float fRange = FarZ / (NearZ - FarZ); + // Note: This is recorded on the stack + float Height = CosFov / SinFov; + XMVECTOR rMem = { + Height / AspectRatio, + Height, + fRange, + fRange * NearZ + }; + // Copy from memory to SSE register + XMVECTOR vValues = rMem; + XMVECTOR vTemp = _mm_setzero_ps(); + // Copy x only + vTemp = _mm_move_ss(vTemp, vValues); + // Height / AspectRatio,0,0,0 + XMMATRIX M; + M.r[0] = vTemp; + // 0,Height,0,0 + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); + M.r[1] = vTemp; + // x=fRange,y=-fRange * NearZ,0,-1.0f + vTemp = _mm_setzero_ps(); + vValues = _mm_shuffle_ps(vValues, g_XMNegIdentityR3, _MM_SHUFFLE(3, 2, 3, 2)); + // 0,0,fRange,-1.0f + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 0, 0, 0)); + M.r[2] = vTemp; + // 0,0,fRange * NearZ,0.0f + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 1, 0, 0)); + M.r[3] = vTemp; + return M; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveOffCenterLH +( + float ViewLeft, + float ViewRight, + float ViewBottom, + float ViewTop, + float NearZ, + float FarZ +) noexcept +{ + assert(NearZ > 0.f && FarZ > 0.f); + assert(!XMScalarNearEqual(ViewRight, ViewLeft, 0.00001f)); + assert(!XMScalarNearEqual(ViewTop, ViewBottom, 0.00001f)); + assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); + +#if defined(_XM_NO_INTRINSICS_) + + float TwoNearZ = NearZ + NearZ; + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = FarZ / (FarZ - NearZ); + + XMMATRIX M; + M.m[0][0] = TwoNearZ * ReciprocalWidth; + M.m[0][1] = 0.0f; + M.m[0][2] = 0.0f; + M.m[0][3] = 0.0f; + + M.m[1][0] = 0.0f; + M.m[1][1] = TwoNearZ * ReciprocalHeight; + M.m[1][2] = 0.0f; + M.m[1][3] = 0.0f; + + M.m[2][0] = -(ViewLeft + ViewRight) * ReciprocalWidth; + M.m[2][1] = -(ViewTop + ViewBottom) * ReciprocalHeight; + M.m[2][2] = fRange; + M.m[2][3] = 1.0f; + + M.m[3][0] = 0.0f; + M.m[3][1] = 0.0f; + M.m[3][2] = -fRange * NearZ; + M.m[3][3] = 0.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float TwoNearZ = NearZ + NearZ; + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = FarZ / (FarZ - NearZ); + const float32x4_t Zero = vdupq_n_f32(0); + + XMMATRIX M; + M.r[0] = vsetq_lane_f32(TwoNearZ * ReciprocalWidth, Zero, 0); + M.r[1] = vsetq_lane_f32(TwoNearZ * ReciprocalHeight, Zero, 1); + M.r[2] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, + -(ViewTop + ViewBottom) * ReciprocalHeight, + fRange, + 1.0f); + M.r[3] = vsetq_lane_f32(-fRange * NearZ, Zero, 2); + return M; +#elif defined(_XM_SSE_INTRINSICS_) + XMMATRIX M; + float TwoNearZ = NearZ + NearZ; + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = FarZ / (FarZ - NearZ); + // Note: This is recorded on the stack + XMVECTOR rMem = { + TwoNearZ * ReciprocalWidth, + TwoNearZ * ReciprocalHeight, + -fRange * NearZ, + 0 + }; + // Copy from memory to SSE register + XMVECTOR vValues = rMem; + XMVECTOR vTemp = _mm_setzero_ps(); + // Copy x only + vTemp = _mm_move_ss(vTemp, vValues); + // TwoNearZ*ReciprocalWidth,0,0,0 + M.r[0] = vTemp; + // 0,TwoNearZ*ReciprocalHeight,0,0 + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); + M.r[1] = vTemp; + // 0,0,fRange,1.0f + M.r[2] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, + -(ViewTop + ViewBottom) * ReciprocalHeight, + fRange, + 1.0f); + // 0,0,-fRange * NearZ,0.0f + vValues = _mm_and_ps(vValues, g_XMMaskZ); + M.r[3] = vValues; + return M; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixPerspectiveOffCenterRH +( + float ViewLeft, + float ViewRight, + float ViewBottom, + float ViewTop, + float NearZ, + float FarZ +) noexcept +{ + assert(NearZ > 0.f && FarZ > 0.f); + assert(!XMScalarNearEqual(ViewRight, ViewLeft, 0.00001f)); + assert(!XMScalarNearEqual(ViewTop, ViewBottom, 0.00001f)); + assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); + +#if defined(_XM_NO_INTRINSICS_) + + float TwoNearZ = NearZ + NearZ; + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = FarZ / (NearZ - FarZ); + + XMMATRIX M; + M.m[0][0] = TwoNearZ * ReciprocalWidth; + M.m[0][1] = 0.0f; + M.m[0][2] = 0.0f; + M.m[0][3] = 0.0f; + + M.m[1][0] = 0.0f; + M.m[1][1] = TwoNearZ * ReciprocalHeight; + M.m[1][2] = 0.0f; + M.m[1][3] = 0.0f; + + M.m[2][0] = (ViewLeft + ViewRight) * ReciprocalWidth; + M.m[2][1] = (ViewTop + ViewBottom) * ReciprocalHeight; + M.m[2][2] = fRange; + M.m[2][3] = -1.0f; + + M.m[3][0] = 0.0f; + M.m[3][1] = 0.0f; + M.m[3][2] = fRange * NearZ; + M.m[3][3] = 0.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float TwoNearZ = NearZ + NearZ; + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = FarZ / (NearZ - FarZ); + const float32x4_t Zero = vdupq_n_f32(0); + + XMMATRIX M; + M.r[0] = vsetq_lane_f32(TwoNearZ * ReciprocalWidth, Zero, 0); + M.r[1] = vsetq_lane_f32(TwoNearZ * ReciprocalHeight, Zero, 1); + M.r[2] = XMVectorSet((ViewLeft + ViewRight) * ReciprocalWidth, + (ViewTop + ViewBottom) * ReciprocalHeight, + fRange, + -1.0f); + M.r[3] = vsetq_lane_f32(fRange * NearZ, Zero, 2); + return M; +#elif defined(_XM_SSE_INTRINSICS_) + XMMATRIX M; + float TwoNearZ = NearZ + NearZ; + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = FarZ / (NearZ - FarZ); + // Note: This is recorded on the stack + XMVECTOR rMem = { + TwoNearZ * ReciprocalWidth, + TwoNearZ * ReciprocalHeight, + fRange * NearZ, + 0 + }; + // Copy from memory to SSE register + XMVECTOR vValues = rMem; + XMVECTOR vTemp = _mm_setzero_ps(); + // Copy x only + vTemp = _mm_move_ss(vTemp, vValues); + // TwoNearZ*ReciprocalWidth,0,0,0 + M.r[0] = vTemp; + // 0,TwoNearZ*ReciprocalHeight,0,0 + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); + M.r[1] = vTemp; + // 0,0,fRange,1.0f + M.r[2] = XMVectorSet((ViewLeft + ViewRight) * ReciprocalWidth, + (ViewTop + ViewBottom) * ReciprocalHeight, + fRange, + -1.0f); + // 0,0,-fRange * NearZ,0.0f + vValues = _mm_and_ps(vValues, g_XMMaskZ); + M.r[3] = vValues; + return M; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixOrthographicLH +( + float ViewWidth, + float ViewHeight, + float NearZ, + float FarZ +) noexcept +{ + assert(!XMScalarNearEqual(ViewWidth, 0.0f, 0.00001f)); + assert(!XMScalarNearEqual(ViewHeight, 0.0f, 0.00001f)); + assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); + +#if defined(_XM_NO_INTRINSICS_) + + float fRange = 1.0f / (FarZ - NearZ); + + XMMATRIX M; + M.m[0][0] = 2.0f / ViewWidth; + M.m[0][1] = 0.0f; + M.m[0][2] = 0.0f; + M.m[0][3] = 0.0f; + + M.m[1][0] = 0.0f; + M.m[1][1] = 2.0f / ViewHeight; + M.m[1][2] = 0.0f; + M.m[1][3] = 0.0f; + + M.m[2][0] = 0.0f; + M.m[2][1] = 0.0f; + M.m[2][2] = fRange; + M.m[2][3] = 0.0f; + + M.m[3][0] = 0.0f; + M.m[3][1] = 0.0f; + M.m[3][2] = -fRange * NearZ; + M.m[3][3] = 1.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float fRange = 1.0f / (FarZ - NearZ); + + const float32x4_t Zero = vdupq_n_f32(0); + XMMATRIX M; + M.r[0] = vsetq_lane_f32(2.0f / ViewWidth, Zero, 0); + M.r[1] = vsetq_lane_f32(2.0f / ViewHeight, Zero, 1); + M.r[2] = vsetq_lane_f32(fRange, Zero, 2); + M.r[3] = vsetq_lane_f32(-fRange * NearZ, g_XMIdentityR3.v, 2); + return M; +#elif defined(_XM_SSE_INTRINSICS_) + XMMATRIX M; + float fRange = 1.0f / (FarZ - NearZ); + // Note: This is recorded on the stack + XMVECTOR rMem = { + 2.0f / ViewWidth, + 2.0f / ViewHeight, + fRange, + -fRange * NearZ + }; + // Copy from memory to SSE register + XMVECTOR vValues = rMem; + XMVECTOR vTemp = _mm_setzero_ps(); + // Copy x only + vTemp = _mm_move_ss(vTemp, vValues); + // 2.0f / ViewWidth,0,0,0 + M.r[0] = vTemp; + // 0,2.0f / ViewHeight,0,0 + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); + M.r[1] = vTemp; + // x=fRange,y=-fRange * NearZ,0,1.0f + vTemp = _mm_setzero_ps(); + vValues = _mm_shuffle_ps(vValues, g_XMIdentityR3, _MM_SHUFFLE(3, 2, 3, 2)); + // 0,0,fRange,0.0f + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 0, 0, 0)); + M.r[2] = vTemp; + // 0,0,-fRange * NearZ,1.0f + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 1, 0, 0)); + M.r[3] = vTemp; + return M; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixOrthographicRH +( + float ViewWidth, + float ViewHeight, + float NearZ, + float FarZ +) noexcept +{ + assert(!XMScalarNearEqual(ViewWidth, 0.0f, 0.00001f)); + assert(!XMScalarNearEqual(ViewHeight, 0.0f, 0.00001f)); + assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); + +#if defined(_XM_NO_INTRINSICS_) + + float fRange = 1.0f / (NearZ - FarZ); + + XMMATRIX M; + M.m[0][0] = 2.0f / ViewWidth; + M.m[0][1] = 0.0f; + M.m[0][2] = 0.0f; + M.m[0][3] = 0.0f; + + M.m[1][0] = 0.0f; + M.m[1][1] = 2.0f / ViewHeight; + M.m[1][2] = 0.0f; + M.m[1][3] = 0.0f; + + M.m[2][0] = 0.0f; + M.m[2][1] = 0.0f; + M.m[2][2] = fRange; + M.m[2][3] = 0.0f; + + M.m[3][0] = 0.0f; + M.m[3][1] = 0.0f; + M.m[3][2] = fRange * NearZ; + M.m[3][3] = 1.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float fRange = 1.0f / (NearZ - FarZ); + + const float32x4_t Zero = vdupq_n_f32(0); + XMMATRIX M; + M.r[0] = vsetq_lane_f32(2.0f / ViewWidth, Zero, 0); + M.r[1] = vsetq_lane_f32(2.0f / ViewHeight, Zero, 1); + M.r[2] = vsetq_lane_f32(fRange, Zero, 2); + M.r[3] = vsetq_lane_f32(fRange * NearZ, g_XMIdentityR3.v, 2); + return M; +#elif defined(_XM_SSE_INTRINSICS_) + XMMATRIX M; + float fRange = 1.0f / (NearZ - FarZ); + // Note: This is recorded on the stack + XMVECTOR rMem = { + 2.0f / ViewWidth, + 2.0f / ViewHeight, + fRange, + fRange * NearZ + }; + // Copy from memory to SSE register + XMVECTOR vValues = rMem; + XMVECTOR vTemp = _mm_setzero_ps(); + // Copy x only + vTemp = _mm_move_ss(vTemp, vValues); + // 2.0f / ViewWidth,0,0,0 + M.r[0] = vTemp; + // 0,2.0f / ViewHeight,0,0 + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); + M.r[1] = vTemp; + // x=fRange,y=fRange * NearZ,0,1.0f + vTemp = _mm_setzero_ps(); + vValues = _mm_shuffle_ps(vValues, g_XMIdentityR3, _MM_SHUFFLE(3, 2, 3, 2)); + // 0,0,fRange,0.0f + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 0, 0, 0)); + M.r[2] = vTemp; + // 0,0,fRange * NearZ,1.0f + vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 1, 0, 0)); + M.r[3] = vTemp; + return M; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixOrthographicOffCenterLH +( + float ViewLeft, + float ViewRight, + float ViewBottom, + float ViewTop, + float NearZ, + float FarZ +) noexcept +{ + assert(!XMScalarNearEqual(ViewRight, ViewLeft, 0.00001f)); + assert(!XMScalarNearEqual(ViewTop, ViewBottom, 0.00001f)); + assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); + +#if defined(_XM_NO_INTRINSICS_) + + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = 1.0f / (FarZ - NearZ); + + XMMATRIX M; + M.m[0][0] = ReciprocalWidth + ReciprocalWidth; + M.m[0][1] = 0.0f; + M.m[0][2] = 0.0f; + M.m[0][3] = 0.0f; + + M.m[1][0] = 0.0f; + M.m[1][1] = ReciprocalHeight + ReciprocalHeight; + M.m[1][2] = 0.0f; + M.m[1][3] = 0.0f; + + M.m[2][0] = 0.0f; + M.m[2][1] = 0.0f; + M.m[2][2] = fRange; + M.m[2][3] = 0.0f; + + M.m[3][0] = -(ViewLeft + ViewRight) * ReciprocalWidth; + M.m[3][1] = -(ViewTop + ViewBottom) * ReciprocalHeight; + M.m[3][2] = -fRange * NearZ; + M.m[3][3] = 1.0f; + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = 1.0f / (FarZ - NearZ); + const float32x4_t Zero = vdupq_n_f32(0); + XMMATRIX M; + M.r[0] = vsetq_lane_f32(ReciprocalWidth + ReciprocalWidth, Zero, 0); + M.r[1] = vsetq_lane_f32(ReciprocalHeight + ReciprocalHeight, Zero, 1); + M.r[2] = vsetq_lane_f32(fRange, Zero, 2); + M.r[3] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, + -(ViewTop + ViewBottom) * ReciprocalHeight, + -fRange * NearZ, + 1.0f); + return M; +#elif defined(_XM_SSE_INTRINSICS_) + XMMATRIX M; + float fReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float fReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = 1.0f / (FarZ - NearZ); + // Note: This is recorded on the stack + XMVECTOR rMem = { + fReciprocalWidth, + fReciprocalHeight, + fRange, + 1.0f + }; + XMVECTOR rMem2 = { + -(ViewLeft + ViewRight), + -(ViewTop + ViewBottom), + -NearZ, + 1.0f + }; + // Copy from memory to SSE register + XMVECTOR vValues = rMem; + XMVECTOR vTemp = _mm_setzero_ps(); + // Copy x only + vTemp = _mm_move_ss(vTemp, vValues); + // fReciprocalWidth*2,0,0,0 + vTemp = _mm_add_ss(vTemp, vTemp); + M.r[0] = vTemp; + // 0,fReciprocalHeight*2,0,0 + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); + vTemp = _mm_add_ps(vTemp, vTemp); + M.r[1] = vTemp; + // 0,0,fRange,0.0f + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskZ); + M.r[2] = vTemp; + // -(ViewLeft + ViewRight)*fReciprocalWidth,-(ViewTop + ViewBottom)*fReciprocalHeight,fRange*-NearZ,1.0f + vValues = _mm_mul_ps(vValues, rMem2); + M.r[3] = vValues; + return M; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMatrixOrthographicOffCenterRH +( + float ViewLeft, + float ViewRight, + float ViewBottom, + float ViewTop, + float NearZ, + float FarZ +) noexcept +{ + assert(!XMScalarNearEqual(ViewRight, ViewLeft, 0.00001f)); + assert(!XMScalarNearEqual(ViewTop, ViewBottom, 0.00001f)); + assert(!XMScalarNearEqual(FarZ, NearZ, 0.00001f)); + +#if defined(_XM_NO_INTRINSICS_) + + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = 1.0f / (NearZ - FarZ); + + XMMATRIX M; + M.m[0][0] = ReciprocalWidth + ReciprocalWidth; + M.m[0][1] = 0.0f; + M.m[0][2] = 0.0f; + M.m[0][3] = 0.0f; + + M.m[1][0] = 0.0f; + M.m[1][1] = ReciprocalHeight + ReciprocalHeight; + M.m[1][2] = 0.0f; + M.m[1][3] = 0.0f; + + M.m[2][0] = 0.0f; + M.m[2][1] = 0.0f; + M.m[2][2] = fRange; + M.m[2][3] = 0.0f; + + M.r[3] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, + -(ViewTop + ViewBottom) * ReciprocalHeight, + fRange * NearZ, + 1.0f); + return M; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float ReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float ReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = 1.0f / (NearZ - FarZ); + const float32x4_t Zero = vdupq_n_f32(0); + XMMATRIX M; + M.r[0] = vsetq_lane_f32(ReciprocalWidth + ReciprocalWidth, Zero, 0); + M.r[1] = vsetq_lane_f32(ReciprocalHeight + ReciprocalHeight, Zero, 1); + M.r[2] = vsetq_lane_f32(fRange, Zero, 2); + M.r[3] = XMVectorSet(-(ViewLeft + ViewRight) * ReciprocalWidth, + -(ViewTop + ViewBottom) * ReciprocalHeight, + fRange * NearZ, + 1.0f); + return M; +#elif defined(_XM_SSE_INTRINSICS_) + XMMATRIX M; + float fReciprocalWidth = 1.0f / (ViewRight - ViewLeft); + float fReciprocalHeight = 1.0f / (ViewTop - ViewBottom); + float fRange = 1.0f / (NearZ - FarZ); + // Note: This is recorded on the stack + XMVECTOR rMem = { + fReciprocalWidth, + fReciprocalHeight, + fRange, + 1.0f + }; + XMVECTOR rMem2 = { + -(ViewLeft + ViewRight), + -(ViewTop + ViewBottom), + NearZ, + 1.0f + }; + // Copy from memory to SSE register + XMVECTOR vValues = rMem; + XMVECTOR vTemp = _mm_setzero_ps(); + // Copy x only + vTemp = _mm_move_ss(vTemp, vValues); + // fReciprocalWidth*2,0,0,0 + vTemp = _mm_add_ss(vTemp, vTemp); + M.r[0] = vTemp; + // 0,fReciprocalHeight*2,0,0 + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskY); + vTemp = _mm_add_ps(vTemp, vTemp); + M.r[1] = vTemp; + // 0,0,fRange,0.0f + vTemp = vValues; + vTemp = _mm_and_ps(vTemp, g_XMMaskZ); + M.r[2] = vTemp; + // -(ViewLeft + ViewRight)*fReciprocalWidth,-(ViewTop + ViewBottom)*fReciprocalHeight,fRange*-NearZ,1.0f + vValues = _mm_mul_ps(vValues, rMem2); + M.r[3] = vValues; + return M; +#endif +} + +#ifdef _PREFAST_ +#pragma prefast(pop) +#endif + +/**************************************************************************** + * + * XMMATRIX operators and methods + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMMATRIX::XMMATRIX +( + float m00, float m01, float m02, float m03, + float m10, float m11, float m12, float m13, + float m20, float m21, float m22, float m23, + float m30, float m31, float m32, float m33 +) noexcept +{ + r[0] = XMVectorSet(m00, m01, m02, m03); + r[1] = XMVectorSet(m10, m11, m12, m13); + r[2] = XMVectorSet(m20, m21, m22, m23); + r[3] = XMVectorSet(m30, m31, m32, m33); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMMATRIX::XMMATRIX(const float* pArray) noexcept +{ + assert(pArray != nullptr); + r[0] = XMLoadFloat4(reinterpret_cast(pArray)); + r[1] = XMLoadFloat4(reinterpret_cast(pArray + 4)); + r[2] = XMLoadFloat4(reinterpret_cast(pArray + 8)); + r[3] = XMLoadFloat4(reinterpret_cast(pArray + 12)); +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XMMATRIX::operator- () const noexcept +{ + XMMATRIX R; + R.r[0] = XMVectorNegate(r[0]); + R.r[1] = XMVectorNegate(r[1]); + R.r[2] = XMVectorNegate(r[2]); + R.r[3] = XMVectorNegate(r[3]); + return R; +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX& XM_CALLCONV XMMATRIX::operator+= (FXMMATRIX M) noexcept +{ + r[0] = XMVectorAdd(r[0], M.r[0]); + r[1] = XMVectorAdd(r[1], M.r[1]); + r[2] = XMVectorAdd(r[2], M.r[2]); + r[3] = XMVectorAdd(r[3], M.r[3]); + return *this; +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX& XM_CALLCONV XMMATRIX::operator-= (FXMMATRIX M) noexcept +{ + r[0] = XMVectorSubtract(r[0], M.r[0]); + r[1] = XMVectorSubtract(r[1], M.r[1]); + r[2] = XMVectorSubtract(r[2], M.r[2]); + r[3] = XMVectorSubtract(r[3], M.r[3]); + return *this; +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX& XM_CALLCONV XMMATRIX::operator*=(FXMMATRIX M) noexcept +{ + *this = XMMatrixMultiply(*this, M); + return *this; +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX& XMMATRIX::operator*= (float S) noexcept +{ + r[0] = XMVectorScale(r[0], S); + r[1] = XMVectorScale(r[1], S); + r[2] = XMVectorScale(r[2], S); + r[3] = XMVectorScale(r[3], S); + return *this; +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX& XMMATRIX::operator/= (float S) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR vS = XMVectorReplicate(S); + r[0] = XMVectorDivide(r[0], vS); + r[1] = XMVectorDivide(r[1], vS); + r[2] = XMVectorDivide(r[2], vS); + r[3] = XMVectorDivide(r[3], vS); + return *this; +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ + float32x4_t vS = vdupq_n_f32(S); + r[0] = vdivq_f32(r[0], vS); + r[1] = vdivq_f32(r[1], vS); + r[2] = vdivq_f32(r[2], vS); + r[3] = vdivq_f32(r[3], vS); +#else + // 2 iterations of Newton-Raphson refinement of reciprocal + float32x2_t vS = vdup_n_f32(S); + float32x2_t R0 = vrecpe_f32(vS); + float32x2_t S0 = vrecps_f32(R0, vS); + R0 = vmul_f32(S0, R0); + S0 = vrecps_f32(R0, vS); + R0 = vmul_f32(S0, R0); + float32x4_t Reciprocal = vcombine_f32(R0, R0); + r[0] = vmulq_f32(r[0], Reciprocal); + r[1] = vmulq_f32(r[1], Reciprocal); + r[2] = vmulq_f32(r[2], Reciprocal); + r[3] = vmulq_f32(r[3], Reciprocal); +#endif + return *this; +#elif defined(_XM_SSE_INTRINSICS_) + __m128 vS = _mm_set_ps1(S); + r[0] = _mm_div_ps(r[0], vS); + r[1] = _mm_div_ps(r[1], vS); + r[2] = _mm_div_ps(r[2], vS); + r[3] = _mm_div_ps(r[3], vS); + return *this; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMATRIX::operator+ (FXMMATRIX M) const noexcept +{ + XMMATRIX R; + R.r[0] = XMVectorAdd(r[0], M.r[0]); + R.r[1] = XMVectorAdd(r[1], M.r[1]); + R.r[2] = XMVectorAdd(r[2], M.r[2]); + R.r[3] = XMVectorAdd(r[3], M.r[3]); + return R; +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMATRIX::operator- (FXMMATRIX M) const noexcept +{ + XMMATRIX R; + R.r[0] = XMVectorSubtract(r[0], M.r[0]); + R.r[1] = XMVectorSubtract(r[1], M.r[1]); + R.r[2] = XMVectorSubtract(r[2], M.r[2]); + R.r[3] = XMVectorSubtract(r[3], M.r[3]); + return R; +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV XMMATRIX::operator*(FXMMATRIX M) const noexcept +{ + return XMMatrixMultiply(*this, M); +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XMMATRIX::operator* (float S) const noexcept +{ + XMMATRIX R; + R.r[0] = XMVectorScale(r[0], S); + R.r[1] = XMVectorScale(r[1], S); + R.r[2] = XMVectorScale(r[2], S); + R.r[3] = XMVectorScale(r[3], S); + return R; +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XMMATRIX::operator/ (float S) const noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR vS = XMVectorReplicate(S); + XMMATRIX R; + R.r[0] = XMVectorDivide(r[0], vS); + R.r[1] = XMVectorDivide(r[1], vS); + R.r[2] = XMVectorDivide(r[2], vS); + R.r[3] = XMVectorDivide(r[3], vS); + return R; +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ + float32x4_t vS = vdupq_n_f32(S); + XMMATRIX R; + R.r[0] = vdivq_f32(r[0], vS); + R.r[1] = vdivq_f32(r[1], vS); + R.r[2] = vdivq_f32(r[2], vS); + R.r[3] = vdivq_f32(r[3], vS); +#else + // 2 iterations of Newton-Raphson refinement of reciprocal + float32x2_t vS = vdup_n_f32(S); + float32x2_t R0 = vrecpe_f32(vS); + float32x2_t S0 = vrecps_f32(R0, vS); + R0 = vmul_f32(S0, R0); + S0 = vrecps_f32(R0, vS); + R0 = vmul_f32(S0, R0); + float32x4_t Reciprocal = vcombine_f32(R0, R0); + XMMATRIX R; + R.r[0] = vmulq_f32(r[0], Reciprocal); + R.r[1] = vmulq_f32(r[1], Reciprocal); + R.r[2] = vmulq_f32(r[2], Reciprocal); + R.r[3] = vmulq_f32(r[3], Reciprocal); +#endif + return R; +#elif defined(_XM_SSE_INTRINSICS_) + __m128 vS = _mm_set_ps1(S); + XMMATRIX R; + R.r[0] = _mm_div_ps(r[0], vS); + R.r[1] = _mm_div_ps(r[1], vS); + R.r[2] = _mm_div_ps(r[2], vS); + R.r[3] = _mm_div_ps(r[3], vS); + return R; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMMATRIX XM_CALLCONV operator* +( + float S, + FXMMATRIX M + ) noexcept +{ + XMMATRIX R; + R.r[0] = XMVectorScale(M.r[0], S); + R.r[1] = XMVectorScale(M.r[1], S); + R.r[2] = XMVectorScale(M.r[2], S); + R.r[3] = XMVectorScale(M.r[3], S); + return R; +} + +/**************************************************************************** + * + * XMFLOAT3X3 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMFLOAT3X3::XMFLOAT3X3(const float* pArray) noexcept +{ + assert(pArray != nullptr); + for (size_t Row = 0; Row < 3; Row++) + { + for (size_t Column = 0; Column < 3; Column++) + { + m[Row][Column] = pArray[Row * 3 + Column]; + } + } +} + +/**************************************************************************** + * + * XMFLOAT4X3 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMFLOAT4X3::XMFLOAT4X3(const float* pArray) noexcept +{ + assert(pArray != nullptr); + + m[0][0] = pArray[0]; + m[0][1] = pArray[1]; + m[0][2] = pArray[2]; + + m[1][0] = pArray[3]; + m[1][1] = pArray[4]; + m[1][2] = pArray[5]; + + m[2][0] = pArray[6]; + m[2][1] = pArray[7]; + m[2][2] = pArray[8]; + + m[3][0] = pArray[9]; + m[3][1] = pArray[10]; + m[3][2] = pArray[11]; +} + +/**************************************************************************** +* +* XMFLOAT3X4 operators +* +****************************************************************************/ + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMFLOAT3X4::XMFLOAT3X4(const float* pArray) noexcept +{ + assert(pArray != nullptr); + + m[0][0] = pArray[0]; + m[0][1] = pArray[1]; + m[0][2] = pArray[2]; + m[0][3] = pArray[3]; + + m[1][0] = pArray[4]; + m[1][1] = pArray[5]; + m[1][2] = pArray[6]; + m[1][3] = pArray[7]; + + m[2][0] = pArray[8]; + m[2][1] = pArray[9]; + m[2][2] = pArray[10]; + m[2][3] = pArray[11]; +} + +/**************************************************************************** + * + * XMFLOAT4X4 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMFLOAT4X4::XMFLOAT4X4(const float* pArray) noexcept +{ + assert(pArray != nullptr); + + m[0][0] = pArray[0]; + m[0][1] = pArray[1]; + m[0][2] = pArray[2]; + m[0][3] = pArray[3]; + + m[1][0] = pArray[4]; + m[1][1] = pArray[5]; + m[1][2] = pArray[6]; + m[1][3] = pArray[7]; + + m[2][0] = pArray[8]; + m[2][1] = pArray[9]; + m[2][2] = pArray[10]; + m[2][3] = pArray[11]; + + m[3][0] = pArray[12]; + m[3][1] = pArray[13]; + m[3][2] = pArray[14]; + m[3][3] = pArray[15]; +} + diff --git a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXMathMisc.inl b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXMathMisc.inl similarity index 96% rename from Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXMathMisc.inl rename to Minecraft.Client/Linux/Stubs/DirectXMath/DirectXMathMisc.inl index c019b3d14..7a21dc8b8 100644 --- a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXMathMisc.inl +++ b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXMathMisc.inl @@ -1,2493 +1,2493 @@ -//------------------------------------------------------------------------------------- -// DirectXMathMisc.inl -- SIMD C++ Math library -// -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. -// -// http://go.microsoft.com/fwlink/?LinkID=615560 -//------------------------------------------------------------------------------------- - -#pragma once - -/**************************************************************************** - * - * Quaternion - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ -// Comparison operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMQuaternionEqual -( - FXMVECTOR Q1, - FXMVECTOR Q2 -) noexcept -{ - return XMVector4Equal(Q1, Q2); -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMQuaternionNotEqual -( - FXMVECTOR Q1, - FXMVECTOR Q2 -) noexcept -{ - return XMVector4NotEqual(Q1, Q2); -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMQuaternionIsNaN(FXMVECTOR Q) noexcept -{ - return XMVector4IsNaN(Q); -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMQuaternionIsInfinite(FXMVECTOR Q) noexcept -{ - return XMVector4IsInfinite(Q); -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMQuaternionIsIdentity(FXMVECTOR Q) noexcept -{ - return XMVector4Equal(Q, g_XMIdentityR3.v); -} - -//------------------------------------------------------------------------------ -// Computation operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionDot -( - FXMVECTOR Q1, - FXMVECTOR Q2 -) noexcept -{ - return XMVector4Dot(Q1, Q2); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionMultiply -( - FXMVECTOR Q1, - FXMVECTOR Q2 -) noexcept -{ - // Returns the product Q2*Q1 (which is the concatenation of a rotation Q1 followed by the rotation Q2) - - // [ (Q2.w * Q1.x) + (Q2.x * Q1.w) + (Q2.y * Q1.z) - (Q2.z * Q1.y), - // (Q2.w * Q1.y) - (Q2.x * Q1.z) + (Q2.y * Q1.w) + (Q2.z * Q1.x), - // (Q2.w * Q1.z) + (Q2.x * Q1.y) - (Q2.y * Q1.x) + (Q2.z * Q1.w), - // (Q2.w * Q1.w) - (Q2.x * Q1.x) - (Q2.y * Q1.y) - (Q2.z * Q1.z) ] - -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - (Q2.vector4_f32[3] * Q1.vector4_f32[0]) + (Q2.vector4_f32[0] * Q1.vector4_f32[3]) + (Q2.vector4_f32[1] * Q1.vector4_f32[2]) - (Q2.vector4_f32[2] * Q1.vector4_f32[1]), - (Q2.vector4_f32[3] * Q1.vector4_f32[1]) - (Q2.vector4_f32[0] * Q1.vector4_f32[2]) + (Q2.vector4_f32[1] * Q1.vector4_f32[3]) + (Q2.vector4_f32[2] * Q1.vector4_f32[0]), - (Q2.vector4_f32[3] * Q1.vector4_f32[2]) + (Q2.vector4_f32[0] * Q1.vector4_f32[1]) - (Q2.vector4_f32[1] * Q1.vector4_f32[0]) + (Q2.vector4_f32[2] * Q1.vector4_f32[3]), - (Q2.vector4_f32[3] * Q1.vector4_f32[3]) - (Q2.vector4_f32[0] * Q1.vector4_f32[0]) - (Q2.vector4_f32[1] * Q1.vector4_f32[1]) - (Q2.vector4_f32[2] * Q1.vector4_f32[2]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 ControlWZYX = { { { 1.0f, -1.0f, 1.0f, -1.0f } } }; - static const XMVECTORF32 ControlZWXY = { { { 1.0f, 1.0f, -1.0f, -1.0f } } }; - static const XMVECTORF32 ControlYXWZ = { { { -1.0f, 1.0f, 1.0f, -1.0f } } }; - - float32x2_t Q2L = vget_low_f32(Q2); - float32x2_t Q2H = vget_high_f32(Q2); - - float32x4_t Q2X = vdupq_lane_f32(Q2L, 0); - float32x4_t Q2Y = vdupq_lane_f32(Q2L, 1); - float32x4_t Q2Z = vdupq_lane_f32(Q2H, 0); - XMVECTOR vResult = vmulq_lane_f32(Q1, Q2H, 1); - - // Mul by Q1WZYX - float32x4_t vTemp = vrev64q_f32(Q1); - vTemp = vcombine_f32(vget_high_f32(vTemp), vget_low_f32(vTemp)); - Q2X = vmulq_f32(Q2X, vTemp); - vResult = vmlaq_f32(vResult, Q2X, ControlWZYX); - - // Mul by Q1ZWXY - vTemp = vreinterpretq_f32_u32(vrev64q_u32(vreinterpretq_u32_f32(vTemp))); - Q2Y = vmulq_f32(Q2Y, vTemp); - vResult = vmlaq_f32(vResult, Q2Y, ControlZWXY); - - // Mul by Q1YXWZ - vTemp = vreinterpretq_f32_u32(vrev64q_u32(vreinterpretq_u32_f32(vTemp))); - vTemp = vcombine_f32(vget_high_f32(vTemp), vget_low_f32(vTemp)); - Q2Z = vmulq_f32(Q2Z, vTemp); - vResult = vmlaq_f32(vResult, Q2Z, ControlYXWZ); - return vResult; -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 ControlWZYX = { { { 1.0f, -1.0f, 1.0f, -1.0f } } }; - static const XMVECTORF32 ControlZWXY = { { { 1.0f, 1.0f, -1.0f, -1.0f } } }; - static const XMVECTORF32 ControlYXWZ = { { { -1.0f, 1.0f, 1.0f, -1.0f } } }; - // Copy to SSE registers and use as few as possible for x86 - XMVECTOR Q2X = Q2; - XMVECTOR Q2Y = Q2; - XMVECTOR Q2Z = Q2; - XMVECTOR vResult = Q2; - // Splat with one instruction - vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 3, 3, 3)); - Q2X = XM_PERMUTE_PS(Q2X, _MM_SHUFFLE(0, 0, 0, 0)); - Q2Y = XM_PERMUTE_PS(Q2Y, _MM_SHUFFLE(1, 1, 1, 1)); - Q2Z = XM_PERMUTE_PS(Q2Z, _MM_SHUFFLE(2, 2, 2, 2)); - // Retire Q1 and perform Q1*Q2W - vResult = _mm_mul_ps(vResult, Q1); - XMVECTOR Q1Shuffle = Q1; - // Shuffle the copies of Q1 - Q1Shuffle = XM_PERMUTE_PS(Q1Shuffle, _MM_SHUFFLE(0, 1, 2, 3)); - // Mul by Q1WZYX - Q2X = _mm_mul_ps(Q2X, Q1Shuffle); - Q1Shuffle = XM_PERMUTE_PS(Q1Shuffle, _MM_SHUFFLE(2, 3, 0, 1)); - // Flip the signs on y and z - vResult = XM_FMADD_PS(Q2X, ControlWZYX, vResult); - // Mul by Q1ZWXY - Q2Y = _mm_mul_ps(Q2Y, Q1Shuffle); - Q1Shuffle = XM_PERMUTE_PS(Q1Shuffle, _MM_SHUFFLE(0, 1, 2, 3)); - // Flip the signs on z and w - Q2Y = _mm_mul_ps(Q2Y, ControlZWXY); - // Mul by Q1YXWZ - Q2Z = _mm_mul_ps(Q2Z, Q1Shuffle); - // Flip the signs on x and w - Q2Y = XM_FMADD_PS(Q2Z, ControlYXWZ, Q2Y); - vResult = _mm_add_ps(vResult, Q2Y); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionLengthSq(FXMVECTOR Q) noexcept -{ - return XMVector4LengthSq(Q); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionReciprocalLength(FXMVECTOR Q) noexcept -{ - return XMVector4ReciprocalLength(Q); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionLength(FXMVECTOR Q) noexcept -{ - return XMVector4Length(Q); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionNormalizeEst(FXMVECTOR Q) noexcept -{ - return XMVector4NormalizeEst(Q); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionNormalize(FXMVECTOR Q) noexcept -{ - return XMVector4Normalize(Q); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionConjugate(FXMVECTOR Q) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - -Q.vector4_f32[0], - -Q.vector4_f32[1], - -Q.vector4_f32[2], - Q.vector4_f32[3] - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 NegativeOne3 = { { { -1.0f, -1.0f, -1.0f, 1.0f } } }; - return vmulq_f32(Q, NegativeOne3.v); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 NegativeOne3 = { { { -1.0f, -1.0f, -1.0f, 1.0f } } }; - return _mm_mul_ps(Q, NegativeOne3); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionInverse(FXMVECTOR Q) noexcept -{ - XMVECTOR L = XMVector4LengthSq(Q); - XMVECTOR Conjugate = XMQuaternionConjugate(Q); - - XMVECTOR Control = XMVectorLessOrEqual(L, g_XMEpsilon.v); - - XMVECTOR Result = XMVectorDivide(Conjugate, L); - - Result = XMVectorSelect(Result, g_XMZero, Control); - - return Result; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionLn(FXMVECTOR Q) noexcept -{ - static const XMVECTORF32 OneMinusEpsilon = { { { 1.0f - 0.00001f, 1.0f - 0.00001f, 1.0f - 0.00001f, 1.0f - 0.00001f } } }; - - XMVECTOR QW = XMVectorSplatW(Q); - XMVECTOR Q0 = XMVectorSelect(g_XMSelect1110.v, Q, g_XMSelect1110.v); - - XMVECTOR ControlW = XMVectorInBounds(QW, OneMinusEpsilon.v); - - XMVECTOR Theta = XMVectorACos(QW); - XMVECTOR SinTheta = XMVectorSin(Theta); - - XMVECTOR S = XMVectorDivide(Theta, SinTheta); - - XMVECTOR Result = XMVectorMultiply(Q0, S); - Result = XMVectorSelect(Q0, Result, ControlW); - - return Result; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionExp(FXMVECTOR Q) noexcept -{ - XMVECTOR Theta = XMVector3Length(Q); - - XMVECTOR SinTheta, CosTheta; - XMVectorSinCos(&SinTheta, &CosTheta, Theta); - - XMVECTOR S = XMVectorDivide(SinTheta, Theta); - - XMVECTOR Result = XMVectorMultiply(Q, S); - - const XMVECTOR Zero = XMVectorZero(); - XMVECTOR Control = XMVectorNearEqual(Theta, Zero, g_XMEpsilon.v); - Result = XMVectorSelect(Result, Q, Control); - - Result = XMVectorSelect(CosTheta, Result, g_XMSelect1110.v); - - return Result; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionSlerp -( - FXMVECTOR Q0, - FXMVECTOR Q1, - float t -) noexcept -{ - XMVECTOR T = XMVectorReplicate(t); - return XMQuaternionSlerpV(Q0, Q1, T); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionSlerpV -( - FXMVECTOR Q0, - FXMVECTOR Q1, - FXMVECTOR T -) noexcept -{ - assert((XMVectorGetY(T) == XMVectorGetX(T)) && (XMVectorGetZ(T) == XMVectorGetX(T)) && (XMVectorGetW(T) == XMVectorGetX(T))); - - // Result = Q0 * sin((1.0 - t) * Omega) / sin(Omega) + Q1 * sin(t * Omega) / sin(Omega) - -#if defined(_XM_NO_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) - - const XMVECTORF32 OneMinusEpsilon = { { { 1.0f - 0.00001f, 1.0f - 0.00001f, 1.0f - 0.00001f, 1.0f - 0.00001f } } }; - - XMVECTOR CosOmega = XMQuaternionDot(Q0, Q1); - - const XMVECTOR Zero = XMVectorZero(); - XMVECTOR Control = XMVectorLess(CosOmega, Zero); - XMVECTOR Sign = XMVectorSelect(g_XMOne.v, g_XMNegativeOne.v, Control); - - CosOmega = XMVectorMultiply(CosOmega, Sign); - - Control = XMVectorLess(CosOmega, OneMinusEpsilon); - - XMVECTOR SinOmega = XMVectorNegativeMultiplySubtract(CosOmega, CosOmega, g_XMOne.v); - SinOmega = XMVectorSqrt(SinOmega); - - XMVECTOR Omega = XMVectorATan2(SinOmega, CosOmega); - - XMVECTOR SignMask = XMVectorSplatSignMask(); - XMVECTOR V01 = XMVectorShiftLeft(T, Zero, 2); - SignMask = XMVectorShiftLeft(SignMask, Zero, 3); - V01 = XMVectorXorInt(V01, SignMask); - V01 = XMVectorAdd(g_XMIdentityR0.v, V01); - - XMVECTOR InvSinOmega = XMVectorReciprocal(SinOmega); - - XMVECTOR S0 = XMVectorMultiply(V01, Omega); - S0 = XMVectorSin(S0); - S0 = XMVectorMultiply(S0, InvSinOmega); - - S0 = XMVectorSelect(V01, S0, Control); - - XMVECTOR S1 = XMVectorSplatY(S0); - S0 = XMVectorSplatX(S0); - - S1 = XMVectorMultiply(S1, Sign); - - XMVECTOR Result = XMVectorMultiply(Q0, S0); - Result = XMVectorMultiplyAdd(Q1, S1, Result); - - return Result; - -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 OneMinusEpsilon = { { { 1.0f - 0.00001f, 1.0f - 0.00001f, 1.0f - 0.00001f, 1.0f - 0.00001f } } }; - static const XMVECTORU32 SignMask2 = { { { 0x80000000, 0x00000000, 0x00000000, 0x00000000 } } }; - - XMVECTOR CosOmega = XMQuaternionDot(Q0, Q1); - - const XMVECTOR Zero = XMVectorZero(); - XMVECTOR Control = XMVectorLess(CosOmega, Zero); - XMVECTOR Sign = XMVectorSelect(g_XMOne, g_XMNegativeOne, Control); - - CosOmega = _mm_mul_ps(CosOmega, Sign); - - Control = XMVectorLess(CosOmega, OneMinusEpsilon); - - XMVECTOR SinOmega = _mm_mul_ps(CosOmega, CosOmega); - SinOmega = _mm_sub_ps(g_XMOne, SinOmega); - SinOmega = _mm_sqrt_ps(SinOmega); - - XMVECTOR Omega = XMVectorATan2(SinOmega, CosOmega); - - XMVECTOR V01 = XM_PERMUTE_PS(T, _MM_SHUFFLE(2, 3, 0, 1)); - V01 = _mm_and_ps(V01, g_XMMaskXY); - V01 = _mm_xor_ps(V01, SignMask2); - V01 = _mm_add_ps(g_XMIdentityR0, V01); - - XMVECTOR S0 = _mm_mul_ps(V01, Omega); - S0 = XMVectorSin(S0); - S0 = _mm_div_ps(S0, SinOmega); - - S0 = XMVectorSelect(V01, S0, Control); - - XMVECTOR S1 = XMVectorSplatY(S0); - S0 = XMVectorSplatX(S0); - - S1 = _mm_mul_ps(S1, Sign); - XMVECTOR Result = _mm_mul_ps(Q0, S0); - S1 = _mm_mul_ps(S1, Q1); - Result = _mm_add_ps(Result, S1); - return Result; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionSquad -( - FXMVECTOR Q0, - FXMVECTOR Q1, - FXMVECTOR Q2, - GXMVECTOR Q3, - float t -) noexcept -{ - XMVECTOR T = XMVectorReplicate(t); - return XMQuaternionSquadV(Q0, Q1, Q2, Q3, T); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionSquadV -( - FXMVECTOR Q0, - FXMVECTOR Q1, - FXMVECTOR Q2, - GXMVECTOR Q3, - HXMVECTOR T -) noexcept -{ - assert((XMVectorGetY(T) == XMVectorGetX(T)) && (XMVectorGetZ(T) == XMVectorGetX(T)) && (XMVectorGetW(T) == XMVectorGetX(T))); - - XMVECTOR TP = T; - const XMVECTOR Two = XMVectorSplatConstant(2, 0); - - XMVECTOR Q03 = XMQuaternionSlerpV(Q0, Q3, T); - XMVECTOR Q12 = XMQuaternionSlerpV(Q1, Q2, T); - - TP = XMVectorNegativeMultiplySubtract(TP, TP, TP); - TP = XMVectorMultiply(TP, Two); - - XMVECTOR Result = XMQuaternionSlerpV(Q03, Q12, TP); - - return Result; -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMQuaternionSquadSetup -( - XMVECTOR* pA, - XMVECTOR* pB, - XMVECTOR* pC, - FXMVECTOR Q0, - FXMVECTOR Q1, - FXMVECTOR Q2, - GXMVECTOR Q3 -) noexcept -{ - assert(pA); - assert(pB); - assert(pC); - - XMVECTOR LS12 = XMQuaternionLengthSq(XMVectorAdd(Q1, Q2)); - XMVECTOR LD12 = XMQuaternionLengthSq(XMVectorSubtract(Q1, Q2)); - XMVECTOR SQ2 = XMVectorNegate(Q2); - - XMVECTOR Control1 = XMVectorLess(LS12, LD12); - SQ2 = XMVectorSelect(Q2, SQ2, Control1); - - XMVECTOR LS01 = XMQuaternionLengthSq(XMVectorAdd(Q0, Q1)); - XMVECTOR LD01 = XMQuaternionLengthSq(XMVectorSubtract(Q0, Q1)); - XMVECTOR SQ0 = XMVectorNegate(Q0); - - XMVECTOR LS23 = XMQuaternionLengthSq(XMVectorAdd(SQ2, Q3)); - XMVECTOR LD23 = XMQuaternionLengthSq(XMVectorSubtract(SQ2, Q3)); - XMVECTOR SQ3 = XMVectorNegate(Q3); - - XMVECTOR Control0 = XMVectorLess(LS01, LD01); - XMVECTOR Control2 = XMVectorLess(LS23, LD23); - - SQ0 = XMVectorSelect(Q0, SQ0, Control0); - SQ3 = XMVectorSelect(Q3, SQ3, Control2); - - XMVECTOR InvQ1 = XMQuaternionInverse(Q1); - XMVECTOR InvQ2 = XMQuaternionInverse(SQ2); - - XMVECTOR LnQ0 = XMQuaternionLn(XMQuaternionMultiply(InvQ1, SQ0)); - XMVECTOR LnQ2 = XMQuaternionLn(XMQuaternionMultiply(InvQ1, SQ2)); - XMVECTOR LnQ1 = XMQuaternionLn(XMQuaternionMultiply(InvQ2, Q1)); - XMVECTOR LnQ3 = XMQuaternionLn(XMQuaternionMultiply(InvQ2, SQ3)); - - const XMVECTOR NegativeOneQuarter = XMVectorSplatConstant(-1, 2); - - XMVECTOR ExpQ02 = XMVectorMultiply(XMVectorAdd(LnQ0, LnQ2), NegativeOneQuarter); - XMVECTOR ExpQ13 = XMVectorMultiply(XMVectorAdd(LnQ1, LnQ3), NegativeOneQuarter); - ExpQ02 = XMQuaternionExp(ExpQ02); - ExpQ13 = XMQuaternionExp(ExpQ13); - - *pA = XMQuaternionMultiply(Q1, ExpQ02); - *pB = XMQuaternionMultiply(SQ2, ExpQ13); - *pC = SQ2; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionBaryCentric -( - FXMVECTOR Q0, - FXMVECTOR Q1, - FXMVECTOR Q2, - float f, - float g -) noexcept -{ - float s = f + g; - - XMVECTOR Result; - if ((s < 0.00001f) && (s > -0.00001f)) - { - Result = Q0; - } - else - { - XMVECTOR Q01 = XMQuaternionSlerp(Q0, Q1, s); - XMVECTOR Q02 = XMQuaternionSlerp(Q0, Q2, s); - - Result = XMQuaternionSlerp(Q01, Q02, g / s); - } - - return Result; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionBaryCentricV -( - FXMVECTOR Q0, - FXMVECTOR Q1, - FXMVECTOR Q2, - GXMVECTOR F, - HXMVECTOR G -) noexcept -{ - assert((XMVectorGetY(F) == XMVectorGetX(F)) && (XMVectorGetZ(F) == XMVectorGetX(F)) && (XMVectorGetW(F) == XMVectorGetX(F))); - assert((XMVectorGetY(G) == XMVectorGetX(G)) && (XMVectorGetZ(G) == XMVectorGetX(G)) && (XMVectorGetW(G) == XMVectorGetX(G))); - - const XMVECTOR Epsilon = XMVectorSplatConstant(1, 16); - - XMVECTOR S = XMVectorAdd(F, G); - - XMVECTOR Result; - if (XMVector4InBounds(S, Epsilon)) - { - Result = Q0; - } - else - { - XMVECTOR Q01 = XMQuaternionSlerpV(Q0, Q1, S); - XMVECTOR Q02 = XMQuaternionSlerpV(Q0, Q2, S); - XMVECTOR GS = XMVectorReciprocal(S); - GS = XMVectorMultiply(G, GS); - - Result = XMQuaternionSlerpV(Q01, Q02, GS); - } - - return Result; -} - -//------------------------------------------------------------------------------ -// Transformation operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionIdentity() noexcept -{ - return g_XMIdentityR3.v; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionRotationRollPitchYaw -( - float Pitch, - float Yaw, - float Roll -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - const float halfpitch = Pitch * 0.5f; - float cp = cosf(halfpitch); - float sp = sinf(halfpitch); - - const float halfyaw = Yaw * 0.5f; - float cy = cosf(halfyaw); - float sy = sinf(halfyaw); - - const float halfroll = Roll * 0.5f; - float cr = cosf(halfroll); - float sr = sinf(halfroll); - - XMVECTORF32 vResult = { { { - cr * sp * cy + sr * cp * sy, - cr * cp * sy - sr * sp * cy, - sr * cp * cy - cr * sp * sy, - cr * cp * cy + sr * sp * sy - } } }; - return vResult; -#else - XMVECTOR Angles = XMVectorSet(Pitch, Yaw, Roll, 0.0f); - return XMQuaternionRotationRollPitchYawFromVector(Angles); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionRotationRollPitchYawFromVector -( - FXMVECTOR Angles // -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - const float halfpitch = Angles.vector4_f32[0] * 0.5f; - float cp = cosf(halfpitch); - float sp = sinf(halfpitch); - - const float halfyaw = Angles.vector4_f32[1] * 0.5f; - float cy = cosf(halfyaw); - float sy = sinf(halfyaw); - - const float halfroll = Angles.vector4_f32[2] * 0.5f; - float cr = cosf(halfroll); - float sr = sinf(halfroll); - - XMVECTORF32 vResult = { { { - cr * sp * cy + sr * cp * sy, - cr * cp * sy - sr * sp * cy, - sr * cp * cy - cr * sp * sy, - cr * cp * cy + sr * sp * sy - } } }; - return vResult; -#else - static const XMVECTORF32 Sign = { { { 1.0f, -1.0f, -1.0f, 1.0f } } }; - - XMVECTOR HalfAngles = XMVectorMultiply(Angles, g_XMOneHalf.v); - - XMVECTOR SinAngles, CosAngles; - XMVectorSinCos(&SinAngles, &CosAngles, HalfAngles); - - XMVECTOR P0 = XMVectorPermute(SinAngles, CosAngles); - XMVECTOR Y0 = XMVectorPermute(SinAngles, CosAngles); - XMVECTOR R0 = XMVectorPermute(SinAngles, CosAngles); - XMVECTOR P1 = XMVectorPermute(CosAngles, SinAngles); - XMVECTOR Y1 = XMVectorPermute(CosAngles, SinAngles); - XMVECTOR R1 = XMVectorPermute(CosAngles, SinAngles); - - XMVECTOR Q1 = XMVectorMultiply(P1, Sign.v); - XMVECTOR Q0 = XMVectorMultiply(P0, Y0); - Q1 = XMVectorMultiply(Q1, Y1); - Q0 = XMVectorMultiply(Q0, R0); - XMVECTOR Q = XMVectorMultiplyAdd(Q1, R1, Q0); - - return Q; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionRotationNormal -( - FXMVECTOR NormalAxis, - float Angle -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) - - XMVECTOR N = XMVectorSelect(g_XMOne.v, NormalAxis, g_XMSelect1110.v); - - float SinV, CosV; - XMScalarSinCos(&SinV, &CosV, 0.5f * Angle); - - XMVECTOR Scale = XMVectorSet(SinV, SinV, SinV, CosV); - return XMVectorMultiply(N, Scale); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR N = _mm_and_ps(NormalAxis, g_XMMask3); - N = _mm_or_ps(N, g_XMIdentityR3); - XMVECTOR Scale = _mm_set_ps1(0.5f * Angle); - XMVECTOR vSine; - XMVECTOR vCosine; - XMVectorSinCos(&vSine, &vCosine, Scale); - Scale = _mm_and_ps(vSine, g_XMMask3); - vCosine = _mm_and_ps(vCosine, g_XMMaskW); - Scale = _mm_or_ps(Scale, vCosine); - N = _mm_mul_ps(N, Scale); - return N; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionRotationAxis -( - FXMVECTOR Axis, - float Angle -) noexcept -{ - assert(!XMVector3Equal(Axis, XMVectorZero())); - assert(!XMVector3IsInfinite(Axis)); - - XMVECTOR Normal = XMVector3Normalize(Axis); - XMVECTOR Q = XMQuaternionRotationNormal(Normal, Angle); - return Q; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMQuaternionRotationMatrix(FXMMATRIX M) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORF32 q; - float r22 = M.m[2][2]; - if (r22 <= 0.f) // x^2 + y^2 >= z^2 + w^2 - { - float dif10 = M.m[1][1] - M.m[0][0]; - float omr22 = 1.f - r22; - if (dif10 <= 0.f) // x^2 >= y^2 - { - float fourXSqr = omr22 - dif10; - float inv4x = 0.5f / sqrtf(fourXSqr); - q.f[0] = fourXSqr * inv4x; - q.f[1] = (M.m[0][1] + M.m[1][0]) * inv4x; - q.f[2] = (M.m[0][2] + M.m[2][0]) * inv4x; - q.f[3] = (M.m[1][2] - M.m[2][1]) * inv4x; - } - else // y^2 >= x^2 - { - float fourYSqr = omr22 + dif10; - float inv4y = 0.5f / sqrtf(fourYSqr); - q.f[0] = (M.m[0][1] + M.m[1][0]) * inv4y; - q.f[1] = fourYSqr * inv4y; - q.f[2] = (M.m[1][2] + M.m[2][1]) * inv4y; - q.f[3] = (M.m[2][0] - M.m[0][2]) * inv4y; - } - } - else // z^2 + w^2 >= x^2 + y^2 - { - float sum10 = M.m[1][1] + M.m[0][0]; - float opr22 = 1.f + r22; - if (sum10 <= 0.f) // z^2 >= w^2 - { - float fourZSqr = opr22 - sum10; - float inv4z = 0.5f / sqrtf(fourZSqr); - q.f[0] = (M.m[0][2] + M.m[2][0]) * inv4z; - q.f[1] = (M.m[1][2] + M.m[2][1]) * inv4z; - q.f[2] = fourZSqr * inv4z; - q.f[3] = (M.m[0][1] - M.m[1][0]) * inv4z; - } - else // w^2 >= z^2 - { - float fourWSqr = opr22 + sum10; - float inv4w = 0.5f / sqrtf(fourWSqr); - q.f[0] = (M.m[1][2] - M.m[2][1]) * inv4w; - q.f[1] = (M.m[2][0] - M.m[0][2]) * inv4w; - q.f[2] = (M.m[0][1] - M.m[1][0]) * inv4w; - q.f[3] = fourWSqr * inv4w; - } - } - return q.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 XMPMMP = { { { +1.0f, -1.0f, -1.0f, +1.0f } } }; - static const XMVECTORF32 XMMPMP = { { { -1.0f, +1.0f, -1.0f, +1.0f } } }; - static const XMVECTORF32 XMMMPP = { { { -1.0f, -1.0f, +1.0f, +1.0f } } }; - static const XMVECTORU32 Select0110 = { { { XM_SELECT_0, XM_SELECT_1, XM_SELECT_1, XM_SELECT_0 } } }; - static const XMVECTORU32 Select0010 = { { { XM_SELECT_0, XM_SELECT_0, XM_SELECT_1, XM_SELECT_0 } } }; - - float32x4_t r0 = M.r[0]; - float32x4_t r1 = M.r[1]; - float32x4_t r2 = M.r[2]; - - float32x4_t r00 = vdupq_lane_f32(vget_low_f32(r0), 0); - float32x4_t r11 = vdupq_lane_f32(vget_low_f32(r1), 1); - float32x4_t r22 = vdupq_lane_f32(vget_high_f32(r2), 0); - - // x^2 >= y^2 equivalent to r11 - r00 <= 0 - float32x4_t r11mr00 = vsubq_f32(r11, r00); - uint32x4_t x2gey2 = vcleq_f32(r11mr00, g_XMZero); - - // z^2 >= w^2 equivalent to r11 + r00 <= 0 - float32x4_t r11pr00 = vaddq_f32(r11, r00); - uint32x4_t z2gew2 = vcleq_f32(r11pr00, g_XMZero); - - // x^2 + y^2 >= z^2 + w^2 equivalent to r22 <= 0 - uint32x4_t x2py2gez2pw2 = vcleq_f32(r22, g_XMZero); - - // (4*x^2, 4*y^2, 4*z^2, 4*w^2) - float32x4_t t0 = vmulq_f32(XMPMMP, r00); - float32x4_t x2y2z2w2 = vmlaq_f32(t0, XMMPMP, r11); - x2y2z2w2 = vmlaq_f32(x2y2z2w2, XMMMPP, r22); - x2y2z2w2 = vaddq_f32(x2y2z2w2, g_XMOne); - - // (r01, r02, r12, r11) - t0 = vextq_f32(r0, r0, 1); - float32x4_t t1 = vextq_f32(r1, r1, 1); - t0 = vcombine_f32(vget_low_f32(t0), vrev64_f32(vget_low_f32(t1))); - - // (r10, r20, r21, r10) - t1 = vextq_f32(r2, r2, 3); - float32x4_t r10 = vdupq_lane_f32(vget_low_f32(r1), 0); - t1 = vbslq_f32(Select0110, t1, r10); - - // (4*x*y, 4*x*z, 4*y*z, unused) - float32x4_t xyxzyz = vaddq_f32(t0, t1); - - // (r21, r20, r10, r10) - t0 = vcombine_f32(vrev64_f32(vget_low_f32(r2)), vget_low_f32(r10)); - - // (r12, r02, r01, r12) - float32x4_t t2 = vcombine_f32(vrev64_f32(vget_high_f32(r0)), vrev64_f32(vget_low_f32(r0))); - float32x4_t t3 = vdupq_lane_f32(vget_high_f32(r1), 0); - t1 = vbslq_f32(Select0110, t2, t3); - - // (4*x*w, 4*y*w, 4*z*w, unused) - float32x4_t xwywzw = vsubq_f32(t0, t1); - xwywzw = vmulq_f32(XMMPMP, xwywzw); - - // (4*x*x, 4*x*y, 4*x*z, 4*x*w) - t0 = vextq_f32(xyxzyz, xyxzyz, 3); - t1 = vbslq_f32(Select0110, t0, x2y2z2w2); - t2 = vdupq_lane_f32(vget_low_f32(xwywzw), 0); - float32x4_t tensor0 = vbslq_f32(g_XMSelect1110, t1, t2); - - // (4*y*x, 4*y*y, 4*y*z, 4*y*w) - t0 = vbslq_f32(g_XMSelect1011, xyxzyz, x2y2z2w2); - t1 = vdupq_lane_f32(vget_low_f32(xwywzw), 1); - float32x4_t tensor1 = vbslq_f32(g_XMSelect1110, t0, t1); - - // (4*z*x, 4*z*y, 4*z*z, 4*z*w) - t0 = vextq_f32(xyxzyz, xyxzyz, 1); - t1 = vcombine_f32(vget_low_f32(t0), vrev64_f32(vget_high_f32(xwywzw))); - float32x4_t tensor2 = vbslq_f32(Select0010, x2y2z2w2, t1); - - // (4*w*x, 4*w*y, 4*w*z, 4*w*w) - float32x4_t tensor3 = vbslq_f32(g_XMSelect1110, xwywzw, x2y2z2w2); - - // Select the row of the tensor-product matrix that has the largest - // magnitude. - t0 = vbslq_f32(x2gey2, tensor0, tensor1); - t1 = vbslq_f32(z2gew2, tensor2, tensor3); - t2 = vbslq_f32(x2py2gez2pw2, t0, t1); - - // Normalize the row. No division by zero is possible because the - // quaternion is unit-length (and the row is a nonzero multiple of - // the quaternion). - t0 = XMVector4Length(t2); - return XMVectorDivide(t2, t0); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 XMPMMP = { { { +1.0f, -1.0f, -1.0f, +1.0f } } }; - static const XMVECTORF32 XMMPMP = { { { -1.0f, +1.0f, -1.0f, +1.0f } } }; - static const XMVECTORF32 XMMMPP = { { { -1.0f, -1.0f, +1.0f, +1.0f } } }; - - XMVECTOR r0 = M.r[0]; // (r00, r01, r02, 0) - XMVECTOR r1 = M.r[1]; // (r10, r11, r12, 0) - XMVECTOR r2 = M.r[2]; // (r20, r21, r22, 0) - - // (r00, r00, r00, r00) - XMVECTOR r00 = XM_PERMUTE_PS(r0, _MM_SHUFFLE(0, 0, 0, 0)); - // (r11, r11, r11, r11) - XMVECTOR r11 = XM_PERMUTE_PS(r1, _MM_SHUFFLE(1, 1, 1, 1)); - // (r22, r22, r22, r22) - XMVECTOR r22 = XM_PERMUTE_PS(r2, _MM_SHUFFLE(2, 2, 2, 2)); - - // x^2 >= y^2 equivalent to r11 - r00 <= 0 - // (r11 - r00, r11 - r00, r11 - r00, r11 - r00) - XMVECTOR r11mr00 = _mm_sub_ps(r11, r00); - XMVECTOR x2gey2 = _mm_cmple_ps(r11mr00, g_XMZero); - - // z^2 >= w^2 equivalent to r11 + r00 <= 0 - // (r11 + r00, r11 + r00, r11 + r00, r11 + r00) - XMVECTOR r11pr00 = _mm_add_ps(r11, r00); - XMVECTOR z2gew2 = _mm_cmple_ps(r11pr00, g_XMZero); - - // x^2 + y^2 >= z^2 + w^2 equivalent to r22 <= 0 - XMVECTOR x2py2gez2pw2 = _mm_cmple_ps(r22, g_XMZero); - - // (4*x^2, 4*y^2, 4*z^2, 4*w^2) - XMVECTOR t0 = XM_FMADD_PS(XMPMMP, r00, g_XMOne); - XMVECTOR t1 = _mm_mul_ps(XMMPMP, r11); - XMVECTOR t2 = XM_FMADD_PS(XMMMPP, r22, t0); - XMVECTOR x2y2z2w2 = _mm_add_ps(t1, t2); - - // (r01, r02, r12, r11) - t0 = _mm_shuffle_ps(r0, r1, _MM_SHUFFLE(1, 2, 2, 1)); - // (r10, r10, r20, r21) - t1 = _mm_shuffle_ps(r1, r2, _MM_SHUFFLE(1, 0, 0, 0)); - // (r10, r20, r21, r10) - t1 = XM_PERMUTE_PS(t1, _MM_SHUFFLE(1, 3, 2, 0)); - // (4*x*y, 4*x*z, 4*y*z, unused) - XMVECTOR xyxzyz = _mm_add_ps(t0, t1); - - // (r21, r20, r10, r10) - t0 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 1)); - // (r12, r12, r02, r01) - t1 = _mm_shuffle_ps(r1, r0, _MM_SHUFFLE(1, 2, 2, 2)); - // (r12, r02, r01, r12) - t1 = XM_PERMUTE_PS(t1, _MM_SHUFFLE(1, 3, 2, 0)); - // (4*x*w, 4*y*w, 4*z*w, unused) - XMVECTOR xwywzw = _mm_sub_ps(t0, t1); - xwywzw = _mm_mul_ps(XMMPMP, xwywzw); - - // (4*x^2, 4*y^2, 4*x*y, unused) - t0 = _mm_shuffle_ps(x2y2z2w2, xyxzyz, _MM_SHUFFLE(0, 0, 1, 0)); - // (4*z^2, 4*w^2, 4*z*w, unused) - t1 = _mm_shuffle_ps(x2y2z2w2, xwywzw, _MM_SHUFFLE(0, 2, 3, 2)); - // (4*x*z, 4*y*z, 4*x*w, 4*y*w) - t2 = _mm_shuffle_ps(xyxzyz, xwywzw, _MM_SHUFFLE(1, 0, 2, 1)); - - // (4*x*x, 4*x*y, 4*x*z, 4*x*w) - XMVECTOR tensor0 = _mm_shuffle_ps(t0, t2, _MM_SHUFFLE(2, 0, 2, 0)); - // (4*y*x, 4*y*y, 4*y*z, 4*y*w) - XMVECTOR tensor1 = _mm_shuffle_ps(t0, t2, _MM_SHUFFLE(3, 1, 1, 2)); - // (4*z*x, 4*z*y, 4*z*z, 4*z*w) - XMVECTOR tensor2 = _mm_shuffle_ps(t2, t1, _MM_SHUFFLE(2, 0, 1, 0)); - // (4*w*x, 4*w*y, 4*w*z, 4*w*w) - XMVECTOR tensor3 = _mm_shuffle_ps(t2, t1, _MM_SHUFFLE(1, 2, 3, 2)); - - // Select the row of the tensor-product matrix that has the largest - // magnitude. - t0 = _mm_and_ps(x2gey2, tensor0); - t1 = _mm_andnot_ps(x2gey2, tensor1); - t0 = _mm_or_ps(t0, t1); - t1 = _mm_and_ps(z2gew2, tensor2); - t2 = _mm_andnot_ps(z2gew2, tensor3); - t1 = _mm_or_ps(t1, t2); - t0 = _mm_and_ps(x2py2gez2pw2, t0); - t1 = _mm_andnot_ps(x2py2gez2pw2, t1); - t2 = _mm_or_ps(t0, t1); - - // Normalize the row. No division by zero is possible because the - // quaternion is unit-length (and the row is a nonzero multiple of - // the quaternion). - t0 = XMVector4Length(t2); - return _mm_div_ps(t2, t0); -#endif -} - -//------------------------------------------------------------------------------ -// Conversion operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMQuaternionToAxisAngle -( - XMVECTOR* pAxis, - float* pAngle, - FXMVECTOR Q -) noexcept -{ - assert(pAxis); - assert(pAngle); - - *pAxis = Q; - - *pAngle = 2.0f * XMScalarACos(XMVectorGetW(Q)); -} - -/**************************************************************************** - * - * Plane - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ -// Comparison operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMPlaneEqual -( - FXMVECTOR P1, - FXMVECTOR P2 -) noexcept -{ - return XMVector4Equal(P1, P2); -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMPlaneNearEqual -( - FXMVECTOR P1, - FXMVECTOR P2, - FXMVECTOR Epsilon -) noexcept -{ - XMVECTOR NP1 = XMPlaneNormalize(P1); - XMVECTOR NP2 = XMPlaneNormalize(P2); - return XMVector4NearEqual(NP1, NP2, Epsilon); -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMPlaneNotEqual -( - FXMVECTOR P1, - FXMVECTOR P2 -) noexcept -{ - return XMVector4NotEqual(P1, P2); -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMPlaneIsNaN(FXMVECTOR P) noexcept -{ - return XMVector4IsNaN(P); -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMPlaneIsInfinite(FXMVECTOR P) noexcept -{ - return XMVector4IsInfinite(P); -} - -//------------------------------------------------------------------------------ -// Computation operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMPlaneDot -( - FXMVECTOR P, - FXMVECTOR V -) noexcept -{ - return XMVector4Dot(P, V); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMPlaneDotCoord -( - FXMVECTOR P, - FXMVECTOR V -) noexcept -{ - // Result = P[0] * V[0] + P[1] * V[1] + P[2] * V[2] + P[3] - - XMVECTOR V3 = XMVectorSelect(g_XMOne.v, V, g_XMSelect1110.v); - XMVECTOR Result = XMVector4Dot(P, V3); - return Result; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMPlaneDotNormal -( - FXMVECTOR P, - FXMVECTOR V -) noexcept -{ - return XMVector3Dot(P, V); -} - -//------------------------------------------------------------------------------ -// XMPlaneNormalizeEst uses a reciprocal estimate and -// returns QNaN on zero and infinite vectors. - -inline XMVECTOR XM_CALLCONV XMPlaneNormalizeEst(FXMVECTOR P) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) - - XMVECTOR Result = XMVector3ReciprocalLengthEst(P); - return XMVectorMultiply(P, Result); - -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(P, P, 0x7f); - XMVECTOR vResult = _mm_rsqrt_ps(vTemp); - return _mm_mul_ps(vResult, P); -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product - XMVECTOR vDot = _mm_mul_ps(P, P); - // x=Dot.y, y=Dot.z - XMVECTOR vTemp = XM_PERMUTE_PS(vDot, _MM_SHUFFLE(2, 1, 2, 1)); - // Result.x = x+y - vDot = _mm_add_ss(vDot, vTemp); - // x=Dot.z - vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); - // Result.x = (x+y)+z - vDot = _mm_add_ss(vDot, vTemp); - // Splat x - vDot = XM_PERMUTE_PS(vDot, _MM_SHUFFLE(0, 0, 0, 0)); - // Get the reciprocal - vDot = _mm_rsqrt_ps(vDot); - // Get the reciprocal - vDot = _mm_mul_ps(vDot, P); - return vDot; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMPlaneNormalize(FXMVECTOR P) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - float fLengthSq = sqrtf((P.vector4_f32[0] * P.vector4_f32[0]) + (P.vector4_f32[1] * P.vector4_f32[1]) + (P.vector4_f32[2] * P.vector4_f32[2])); - // Prevent divide by zero - if (fLengthSq > 0) - { - fLengthSq = 1.0f / fLengthSq; - } - XMVECTORF32 vResult = { { { - P.vector4_f32[0] * fLengthSq, - P.vector4_f32[1] * fLengthSq, - P.vector4_f32[2] * fLengthSq, - P.vector4_f32[3] * fLengthSq - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - XMVECTOR vLength = XMVector3ReciprocalLength(P); - return XMVectorMultiply(P, vLength); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vLengthSq = _mm_dp_ps(P, P, 0x7f); - // Prepare for the division - XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); - // Failsafe on zero (Or epsilon) length planes - // If the length is infinity, set the elements to zero - vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); - // Reciprocal mul to perform the normalization - vResult = _mm_div_ps(P, vResult); - // Any that are infinity, set to zero - vResult = _mm_and_ps(vResult, vLengthSq); - return vResult; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product on x,y and z only - XMVECTOR vLengthSq = _mm_mul_ps(P, P); - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 1, 2, 1)); - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); - // Prepare for the division - XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); - // Failsafe on zero (Or epsilon) length planes - // If the length is infinity, set the elements to zero - vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); - // Reciprocal mul to perform the normalization - vResult = _mm_div_ps(P, vResult); - // Any that are infinity, set to zero - vResult = _mm_and_ps(vResult, vLengthSq); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMPlaneIntersectLine -( - FXMVECTOR P, - FXMVECTOR LinePoint1, - FXMVECTOR LinePoint2 -) noexcept -{ - XMVECTOR V1 = XMVector3Dot(P, LinePoint1); - XMVECTOR V2 = XMVector3Dot(P, LinePoint2); - XMVECTOR D = XMVectorSubtract(V1, V2); - - XMVECTOR VT = XMPlaneDotCoord(P, LinePoint1); - VT = XMVectorDivide(VT, D); - - XMVECTOR Point = XMVectorSubtract(LinePoint2, LinePoint1); - Point = XMVectorMultiplyAdd(Point, VT, LinePoint1); - - const XMVECTOR Zero = XMVectorZero(); - XMVECTOR Control = XMVectorNearEqual(D, Zero, g_XMEpsilon.v); - - return XMVectorSelect(Point, g_XMQNaN.v, Control); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMPlaneIntersectPlane -( - XMVECTOR* pLinePoint1, - XMVECTOR* pLinePoint2, - FXMVECTOR P1, - FXMVECTOR P2 -) noexcept -{ - assert(pLinePoint1); - assert(pLinePoint2); - - XMVECTOR V1 = XMVector3Cross(P2, P1); - - XMVECTOR LengthSq = XMVector3LengthSq(V1); - - XMVECTOR V2 = XMVector3Cross(P2, V1); - - XMVECTOR P1W = XMVectorSplatW(P1); - XMVECTOR Point = XMVectorMultiply(V2, P1W); - - XMVECTOR V3 = XMVector3Cross(V1, P1); - - XMVECTOR P2W = XMVectorSplatW(P2); - Point = XMVectorMultiplyAdd(V3, P2W, Point); - - XMVECTOR LinePoint1 = XMVectorDivide(Point, LengthSq); - - XMVECTOR LinePoint2 = XMVectorAdd(LinePoint1, V1); - - XMVECTOR Control = XMVectorLessOrEqual(LengthSq, g_XMEpsilon.v); - *pLinePoint1 = XMVectorSelect(LinePoint1, g_XMQNaN.v, Control); - *pLinePoint2 = XMVectorSelect(LinePoint2, g_XMQNaN.v, Control); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMPlaneTransform -( - FXMVECTOR P, - FXMMATRIX ITM -) noexcept -{ - XMVECTOR W = XMVectorSplatW(P); - XMVECTOR Z = XMVectorSplatZ(P); - XMVECTOR Y = XMVectorSplatY(P); - XMVECTOR X = XMVectorSplatX(P); - - XMVECTOR Result = XMVectorMultiply(W, ITM.r[3]); - Result = XMVectorMultiplyAdd(Z, ITM.r[2], Result); - Result = XMVectorMultiplyAdd(Y, ITM.r[1], Result); - Result = XMVectorMultiplyAdd(X, ITM.r[0], Result); - return Result; -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMFLOAT4* XM_CALLCONV XMPlaneTransformStream -( - XMFLOAT4* pOutputStream, - size_t OutputStride, - const XMFLOAT4* pInputStream, - size_t InputStride, - size_t PlaneCount, - FXMMATRIX ITM -) noexcept -{ - return XMVector4TransformStream(pOutputStream, - OutputStride, - pInputStream, - InputStride, - PlaneCount, - ITM); -} - -//------------------------------------------------------------------------------ -// Conversion operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMPlaneFromPointNormal -( - FXMVECTOR Point, - FXMVECTOR Normal -) noexcept -{ - XMVECTOR W = XMVector3Dot(Point, Normal); - W = XMVectorNegate(W); - return XMVectorSelect(W, Normal, g_XMSelect1110.v); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMPlaneFromPoints -( - FXMVECTOR Point1, - FXMVECTOR Point2, - FXMVECTOR Point3 -) noexcept -{ - XMVECTOR V21 = XMVectorSubtract(Point1, Point2); - XMVECTOR V31 = XMVectorSubtract(Point1, Point3); - - XMVECTOR N = XMVector3Cross(V21, V31); - N = XMVector3Normalize(N); - - XMVECTOR D = XMPlaneDotNormal(N, Point1); - D = XMVectorNegate(D); - - XMVECTOR Result = XMVectorSelect(D, N, g_XMSelect1110.v); - - return Result; -} - -/**************************************************************************** - * - * Color - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ -// Comparison operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMColorEqual -( - FXMVECTOR C1, - FXMVECTOR C2 -) noexcept -{ - return XMVector4Equal(C1, C2); -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMColorNotEqual -( - FXMVECTOR C1, - FXMVECTOR C2 -) noexcept -{ - return XMVector4NotEqual(C1, C2); -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMColorGreater -( - FXMVECTOR C1, - FXMVECTOR C2 -) noexcept -{ - return XMVector4Greater(C1, C2); -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMColorGreaterOrEqual -( - FXMVECTOR C1, - FXMVECTOR C2 -) noexcept -{ - return XMVector4GreaterOrEqual(C1, C2); -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMColorLess -( - FXMVECTOR C1, - FXMVECTOR C2 -) noexcept -{ - return XMVector4Less(C1, C2); -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMColorLessOrEqual -( - FXMVECTOR C1, - FXMVECTOR C2 -) noexcept -{ - return XMVector4LessOrEqual(C1, C2); -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMColorIsNaN(FXMVECTOR C) noexcept -{ - return XMVector4IsNaN(C); -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMColorIsInfinite(FXMVECTOR C) noexcept -{ - return XMVector4IsInfinite(C); -} - -//------------------------------------------------------------------------------ -// Computation operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMColorNegative(FXMVECTOR vColor) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - 1.0f - vColor.vector4_f32[0], - 1.0f - vColor.vector4_f32[1], - 1.0f - vColor.vector4_f32[2], - vColor.vector4_f32[3] - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vTemp = veorq_u32(vreinterpretq_u32_f32(vColor), g_XMNegate3); - return vaddq_f32(vreinterpretq_f32_u32(vTemp), g_XMOne3); -#elif defined(_XM_SSE_INTRINSICS_) - // Negate only x,y and z. - XMVECTOR vTemp = _mm_xor_ps(vColor, g_XMNegate3); - // Add 1,1,1,0 to -x,-y,-z,w - return _mm_add_ps(vTemp, g_XMOne3); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMColorModulate -( - FXMVECTOR C1, - FXMVECTOR C2 -) noexcept -{ - return XMVectorMultiply(C1, C2); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMColorAdjustSaturation -( - FXMVECTOR vColor, - float fSaturation -) noexcept -{ - // Luminance = 0.2125f * C[0] + 0.7154f * C[1] + 0.0721f * C[2]; - // Result = (C - Luminance) * Saturation + Luminance; - - const XMVECTORF32 gvLuminance = { { { 0.2125f, 0.7154f, 0.0721f, 0.0f } } }; -#if defined(_XM_NO_INTRINSICS_) - float fLuminance = (vColor.vector4_f32[0] * gvLuminance.f[0]) + (vColor.vector4_f32[1] * gvLuminance.f[1]) + (vColor.vector4_f32[2] * gvLuminance.f[2]); - XMVECTOR vResult; - vResult.vector4_f32[0] = ((vColor.vector4_f32[0] - fLuminance) * fSaturation) + fLuminance; - vResult.vector4_f32[1] = ((vColor.vector4_f32[1] - fLuminance) * fSaturation) + fLuminance; - vResult.vector4_f32[2] = ((vColor.vector4_f32[2] - fLuminance) * fSaturation) + fLuminance; - vResult.vector4_f32[3] = vColor.vector4_f32[3]; - return vResult; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - XMVECTOR vLuminance = XMVector3Dot(vColor, gvLuminance); - XMVECTOR vResult = vsubq_f32(vColor, vLuminance); - vResult = vmlaq_n_f32(vLuminance, vResult, fSaturation); - return vbslq_f32(g_XMSelect1110, vResult, vColor); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vLuminance = XMVector3Dot(vColor, gvLuminance); - // Splat fSaturation - XMVECTOR vSaturation = _mm_set_ps1(fSaturation); - // vResult = ((vColor-vLuminance)*vSaturation)+vLuminance; - XMVECTOR vResult = _mm_sub_ps(vColor, vLuminance); - vResult = XM_FMADD_PS(vResult, vSaturation, vLuminance); - // Retain w from the source color - vLuminance = _mm_shuffle_ps(vResult, vColor, _MM_SHUFFLE(3, 2, 2, 2)); // x = vResult.z,y = vResult.z,z = vColor.z,w=vColor.w - vResult = _mm_shuffle_ps(vResult, vLuminance, _MM_SHUFFLE(3, 0, 1, 0)); // x = vResult.x,y = vResult.y,z = vResult.z,w=vColor.w - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMColorAdjustContrast -( - FXMVECTOR vColor, - float fContrast -) noexcept -{ - // Result = (vColor - 0.5f) * fContrast + 0.5f; - -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - ((vColor.vector4_f32[0] - 0.5f) * fContrast) + 0.5f, - ((vColor.vector4_f32[1] - 0.5f) * fContrast) + 0.5f, - ((vColor.vector4_f32[2] - 0.5f) * fContrast) + 0.5f, - vColor.vector4_f32[3] // Leave W untouched - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - XMVECTOR vResult = vsubq_f32(vColor, g_XMOneHalf.v); - vResult = vmlaq_n_f32(g_XMOneHalf.v, vResult, fContrast); - return vbslq_f32(g_XMSelect1110, vResult, vColor); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vScale = _mm_set_ps1(fContrast); // Splat the scale - XMVECTOR vResult = _mm_sub_ps(vColor, g_XMOneHalf); // Subtract 0.5f from the source (Saving source) - vResult = XM_FMADD_PS(vResult, vScale, g_XMOneHalf); -// Retain w from the source color - vScale = _mm_shuffle_ps(vResult, vColor, _MM_SHUFFLE(3, 2, 2, 2)); // x = vResult.z,y = vResult.z,z = vColor.z,w=vColor.w - vResult = _mm_shuffle_ps(vResult, vScale, _MM_SHUFFLE(3, 0, 1, 0)); // x = vResult.x,y = vResult.y,z = vResult.z,w=vColor.w - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMColorRGBToHSL(FXMVECTOR rgb) noexcept -{ - XMVECTOR r = XMVectorSplatX(rgb); - XMVECTOR g = XMVectorSplatY(rgb); - XMVECTOR b = XMVectorSplatZ(rgb); - - XMVECTOR min = XMVectorMin(r, XMVectorMin(g, b)); - XMVECTOR max = XMVectorMax(r, XMVectorMax(g, b)); - - XMVECTOR l = XMVectorMultiply(XMVectorAdd(min, max), g_XMOneHalf); - - XMVECTOR d = XMVectorSubtract(max, min); - - XMVECTOR la = XMVectorSelect(rgb, l, g_XMSelect1110); - - if (XMVector3Less(d, g_XMEpsilon)) - { - // Achromatic, assume H and S of 0 - return XMVectorSelect(la, g_XMZero, g_XMSelect1100); - } - else - { - XMVECTOR s, h; - - XMVECTOR d2 = XMVectorAdd(min, max); - - if (XMVector3Greater(l, g_XMOneHalf)) - { - // d / (2-max-min) - s = XMVectorDivide(d, XMVectorSubtract(g_XMTwo, d2)); - } - else - { - // d / (max+min) - s = XMVectorDivide(d, d2); - } - - if (XMVector3Equal(r, max)) - { - // Red is max - h = XMVectorDivide(XMVectorSubtract(g, b), d); - } - else if (XMVector3Equal(g, max)) - { - // Green is max - h = XMVectorDivide(XMVectorSubtract(b, r), d); - h = XMVectorAdd(h, g_XMTwo); - } - else - { - // Blue is max - h = XMVectorDivide(XMVectorSubtract(r, g), d); - h = XMVectorAdd(h, g_XMFour); - } - - h = XMVectorDivide(h, g_XMSix); - - if (XMVector3Less(h, g_XMZero)) - h = XMVectorAdd(h, g_XMOne); - - XMVECTOR lha = XMVectorSelect(la, h, g_XMSelect1100); - return XMVectorSelect(s, lha, g_XMSelect1011); - } -} - -//------------------------------------------------------------------------------ - -namespace MathInternal -{ - - inline XMVECTOR XM_CALLCONV XMColorHue2Clr(FXMVECTOR p, FXMVECTOR q, FXMVECTOR h) noexcept - { - static const XMVECTORF32 oneSixth = { { { 1.0f / 6.0f, 1.0f / 6.0f, 1.0f / 6.0f, 1.0f / 6.0f } } }; - static const XMVECTORF32 twoThirds = { { { 2.0f / 3.0f, 2.0f / 3.0f, 2.0f / 3.0f, 2.0f / 3.0f } } }; - - XMVECTOR t = h; - - if (XMVector3Less(t, g_XMZero)) - t = XMVectorAdd(t, g_XMOne); - - if (XMVector3Greater(t, g_XMOne)) - t = XMVectorSubtract(t, g_XMOne); - - if (XMVector3Less(t, oneSixth)) - { - // p + (q - p) * 6 * t - XMVECTOR t1 = XMVectorSubtract(q, p); - XMVECTOR t2 = XMVectorMultiply(g_XMSix, t); - return XMVectorMultiplyAdd(t1, t2, p); - } - - if (XMVector3Less(t, g_XMOneHalf)) - return q; - - if (XMVector3Less(t, twoThirds)) - { - // p + (q - p) * 6 * (2/3 - t) - XMVECTOR t1 = XMVectorSubtract(q, p); - XMVECTOR t2 = XMVectorMultiply(g_XMSix, XMVectorSubtract(twoThirds, t)); - return XMVectorMultiplyAdd(t1, t2, p); - } - - return p; - } - -} // namespace MathInternal - -inline XMVECTOR XM_CALLCONV XMColorHSLToRGB(FXMVECTOR hsl) noexcept -{ - static const XMVECTORF32 oneThird = { { { 1.0f / 3.0f, 1.0f / 3.0f, 1.0f / 3.0f, 1.0f / 3.0f } } }; - - XMVECTOR s = XMVectorSplatY(hsl); - XMVECTOR l = XMVectorSplatZ(hsl); - - if (XMVector3NearEqual(s, g_XMZero, g_XMEpsilon)) - { - // Achromatic - return XMVectorSelect(hsl, l, g_XMSelect1110); - } - else - { - XMVECTOR h = XMVectorSplatX(hsl); - - XMVECTOR q; - if (XMVector3Less(l, g_XMOneHalf)) - { - q = XMVectorMultiply(l, XMVectorAdd(g_XMOne, s)); - } - else - { - q = XMVectorSubtract(XMVectorAdd(l, s), XMVectorMultiply(l, s)); - } - - XMVECTOR p = XMVectorSubtract(XMVectorMultiply(g_XMTwo, l), q); - - XMVECTOR r = DirectX::MathInternal::XMColorHue2Clr(p, q, XMVectorAdd(h, oneThird)); - XMVECTOR g = DirectX::MathInternal::XMColorHue2Clr(p, q, h); - XMVECTOR b = DirectX::MathInternal::XMColorHue2Clr(p, q, XMVectorSubtract(h, oneThird)); - - XMVECTOR rg = XMVectorSelect(g, r, g_XMSelect1000); - XMVECTOR ba = XMVectorSelect(hsl, b, g_XMSelect1110); - - return XMVectorSelect(ba, rg, g_XMSelect1100); - } -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMColorRGBToHSV(FXMVECTOR rgb) noexcept -{ - XMVECTOR r = XMVectorSplatX(rgb); - XMVECTOR g = XMVectorSplatY(rgb); - XMVECTOR b = XMVectorSplatZ(rgb); - - XMVECTOR min = XMVectorMin(r, XMVectorMin(g, b)); - XMVECTOR v = XMVectorMax(r, XMVectorMax(g, b)); - - XMVECTOR d = XMVectorSubtract(v, min); - - XMVECTOR s = (XMVector3NearEqual(v, g_XMZero, g_XMEpsilon)) ? g_XMZero : XMVectorDivide(d, v); - - if (XMVector3Less(d, g_XMEpsilon)) - { - // Achromatic, assume H of 0 - XMVECTOR hv = XMVectorSelect(v, g_XMZero, g_XMSelect1000); - XMVECTOR hva = XMVectorSelect(rgb, hv, g_XMSelect1110); - return XMVectorSelect(s, hva, g_XMSelect1011); - } - else - { - XMVECTOR h; - - if (XMVector3Equal(r, v)) - { - // Red is max - h = XMVectorDivide(XMVectorSubtract(g, b), d); - - if (XMVector3Less(g, b)) - h = XMVectorAdd(h, g_XMSix); - } - else if (XMVector3Equal(g, v)) - { - // Green is max - h = XMVectorDivide(XMVectorSubtract(b, r), d); - h = XMVectorAdd(h, g_XMTwo); - } - else - { - // Blue is max - h = XMVectorDivide(XMVectorSubtract(r, g), d); - h = XMVectorAdd(h, g_XMFour); - } - - h = XMVectorDivide(h, g_XMSix); - - XMVECTOR hv = XMVectorSelect(v, h, g_XMSelect1000); - XMVECTOR hva = XMVectorSelect(rgb, hv, g_XMSelect1110); - return XMVectorSelect(s, hva, g_XMSelect1011); - } -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMColorHSVToRGB(FXMVECTOR hsv) noexcept -{ - XMVECTOR h = XMVectorSplatX(hsv); - XMVECTOR s = XMVectorSplatY(hsv); - XMVECTOR v = XMVectorSplatZ(hsv); - - XMVECTOR h6 = XMVectorMultiply(h, g_XMSix); - - XMVECTOR i = XMVectorFloor(h6); - XMVECTOR f = XMVectorSubtract(h6, i); - - // p = v* (1-s) - XMVECTOR p = XMVectorMultiply(v, XMVectorSubtract(g_XMOne, s)); - - // q = v*(1-f*s) - XMVECTOR q = XMVectorMultiply(v, XMVectorSubtract(g_XMOne, XMVectorMultiply(f, s))); - - // t = v*(1 - (1-f)*s) - XMVECTOR t = XMVectorMultiply(v, XMVectorSubtract(g_XMOne, XMVectorMultiply(XMVectorSubtract(g_XMOne, f), s))); - - auto ii = static_cast(XMVectorGetX(XMVectorMod(i, g_XMSix))); - - XMVECTOR _rgb; - - switch (ii) - { - case 0: // rgb = vtp - { - XMVECTOR vt = XMVectorSelect(t, v, g_XMSelect1000); - _rgb = XMVectorSelect(p, vt, g_XMSelect1100); - } - break; - case 1: // rgb = qvp - { - XMVECTOR qv = XMVectorSelect(v, q, g_XMSelect1000); - _rgb = XMVectorSelect(p, qv, g_XMSelect1100); - } - break; - case 2: // rgb = pvt - { - XMVECTOR pv = XMVectorSelect(v, p, g_XMSelect1000); - _rgb = XMVectorSelect(t, pv, g_XMSelect1100); - } - break; - case 3: // rgb = pqv - { - XMVECTOR pq = XMVectorSelect(q, p, g_XMSelect1000); - _rgb = XMVectorSelect(v, pq, g_XMSelect1100); - } - break; - case 4: // rgb = tpv - { - XMVECTOR tp = XMVectorSelect(p, t, g_XMSelect1000); - _rgb = XMVectorSelect(v, tp, g_XMSelect1100); - } - break; - default: // rgb = vpq - { - XMVECTOR vp = XMVectorSelect(p, v, g_XMSelect1000); - _rgb = XMVectorSelect(q, vp, g_XMSelect1100); - } - break; - } - - return XMVectorSelect(hsv, _rgb, g_XMSelect1110); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMColorRGBToYUV(FXMVECTOR rgb) noexcept -{ - static const XMVECTORF32 Scale0 = { { { 0.299f, -0.147f, 0.615f, 0.0f } } }; - static const XMVECTORF32 Scale1 = { { { 0.587f, -0.289f, -0.515f, 0.0f } } }; - static const XMVECTORF32 Scale2 = { { { 0.114f, 0.436f, -0.100f, 0.0f } } }; - - XMMATRIX M(Scale0, Scale1, Scale2, g_XMZero); - XMVECTOR clr = XMVector3Transform(rgb, M); - - return XMVectorSelect(rgb, clr, g_XMSelect1110); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMColorYUVToRGB(FXMVECTOR yuv) noexcept -{ - static const XMVECTORF32 Scale1 = { { { 0.0f, -0.395f, 2.032f, 0.0f } } }; - static const XMVECTORF32 Scale2 = { { { 1.140f, -0.581f, 0.0f, 0.0f } } }; - - XMMATRIX M(g_XMOne, Scale1, Scale2, g_XMZero); - XMVECTOR clr = XMVector3Transform(yuv, M); - - return XMVectorSelect(yuv, clr, g_XMSelect1110); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMColorRGBToYUV_HD(FXMVECTOR rgb) noexcept -{ - static const XMVECTORF32 Scale0 = { { { 0.2126f, -0.0997f, 0.6150f, 0.0f } } }; - static const XMVECTORF32 Scale1 = { { { 0.7152f, -0.3354f, -0.5586f, 0.0f } } }; - static const XMVECTORF32 Scale2 = { { { 0.0722f, 0.4351f, -0.0564f, 0.0f } } }; - - XMMATRIX M(Scale0, Scale1, Scale2, g_XMZero); - XMVECTOR clr = XMVector3Transform(rgb, M); - - return XMVectorSelect(rgb, clr, g_XMSelect1110); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMColorYUVToRGB_HD(FXMVECTOR yuv) noexcept -{ - static const XMVECTORF32 Scale1 = { { { 0.0f, -0.2153f, 2.1324f, 0.0f } } }; - static const XMVECTORF32 Scale2 = { { { 1.2803f, -0.3806f, 0.0f, 0.0f } } }; - - XMMATRIX M(g_XMOne, Scale1, Scale2, g_XMZero); - XMVECTOR clr = XMVector3Transform(yuv, M); - - return XMVectorSelect(yuv, clr, g_XMSelect1110); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMColorRGBToYUV_UHD(FXMVECTOR rgb) noexcept -{ - static const XMVECTORF32 Scale0 = { { { 0.2627f, -0.1215f, 0.6150f, 0.0f } } }; - static const XMVECTORF32 Scale1 = { { { 0.6780f, -0.3136f, -0.5655f, 0.0f } } }; - static const XMVECTORF32 Scale2 = { { { 0.0593f, 0.4351f, -0.0495f, 0.0f } } }; - - XMMATRIX M(Scale0, Scale1, Scale2, g_XMZero); - XMVECTOR clr = XMVector3Transform(rgb, M); - - return XMVectorSelect(rgb, clr, g_XMSelect1110); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMColorYUVToRGB_UHD(FXMVECTOR yuv) noexcept -{ - static const XMVECTORF32 Scale1 = { { { 0.0f, -0.1891f, 2.1620f, 0.0f } } }; - static const XMVECTORF32 Scale2 = { { { 1.1989f, -0.4645f, 0.0f, 0.0f } } }; - - XMMATRIX M(g_XMOne, Scale1, Scale2, g_XMZero); - XMVECTOR clr = XMVector3Transform(yuv, M); - - return XMVectorSelect(yuv, clr, g_XMSelect1110); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMColorRGBToXYZ(FXMVECTOR rgb) noexcept -{ - static const XMVECTORF32 Scale0 = { { { 0.4887180f, 0.1762044f, 0.0000000f, 0.0f } } }; - static const XMVECTORF32 Scale1 = { { { 0.3106803f, 0.8129847f, 0.0102048f, 0.0f } } }; - static const XMVECTORF32 Scale2 = { { { 0.2006017f, 0.0108109f, 0.9897952f, 0.0f } } }; - static const XMVECTORF32 Scale = { { { 1.f / 0.17697f, 1.f / 0.17697f, 1.f / 0.17697f, 0.0f } } }; - - XMMATRIX M(Scale0, Scale1, Scale2, g_XMZero); - XMVECTOR clr = XMVectorMultiply(XMVector3Transform(rgb, M), Scale); - - return XMVectorSelect(rgb, clr, g_XMSelect1110); -} - -inline XMVECTOR XM_CALLCONV XMColorXYZToRGB(FXMVECTOR xyz) noexcept -{ - static const XMVECTORF32 Scale0 = { { { 2.3706743f, -0.5138850f, 0.0052982f, 0.0f } } }; - static const XMVECTORF32 Scale1 = { { { -0.9000405f, 1.4253036f, -0.0146949f, 0.0f } } }; - static const XMVECTORF32 Scale2 = { { { -0.4706338f, 0.0885814f, 1.0093968f, 0.0f } } }; - static const XMVECTORF32 Scale = { { { 0.17697f, 0.17697f, 0.17697f, 0.0f } } }; - - XMMATRIX M(Scale0, Scale1, Scale2, g_XMZero); - XMVECTOR clr = XMVector3Transform(XMVectorMultiply(xyz, Scale), M); - - return XMVectorSelect(xyz, clr, g_XMSelect1110); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMColorXYZToSRGB(FXMVECTOR xyz) noexcept -{ - static const XMVECTORF32 Scale0 = { { { 3.2406f, -0.9689f, 0.0557f, 0.0f } } }; - static const XMVECTORF32 Scale1 = { { { -1.5372f, 1.8758f, -0.2040f, 0.0f } } }; - static const XMVECTORF32 Scale2 = { { { -0.4986f, 0.0415f, 1.0570f, 0.0f } } }; - static const XMVECTORF32 Cutoff = { { { 0.0031308f, 0.0031308f, 0.0031308f, 0.0f } } }; - static const XMVECTORF32 Exp = { { { 1.0f / 2.4f, 1.0f / 2.4f, 1.0f / 2.4f, 1.0f } } }; - - XMMATRIX M(Scale0, Scale1, Scale2, g_XMZero); - XMVECTOR lclr = XMVector3Transform(xyz, M); - - XMVECTOR sel = XMVectorGreater(lclr, Cutoff); - - // clr = 12.92 * lclr for lclr <= 0.0031308f - XMVECTOR smallC = XMVectorMultiply(lclr, g_XMsrgbScale); - - // clr = (1+a)*pow(lclr, 1/2.4) - a for lclr > 0.0031308 (where a = 0.055) - XMVECTOR largeC = XMVectorSubtract(XMVectorMultiply(g_XMsrgbA1, XMVectorPow(lclr, Exp)), g_XMsrgbA); - - XMVECTOR clr = XMVectorSelect(smallC, largeC, sel); - - return XMVectorSelect(xyz, clr, g_XMSelect1110); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMColorSRGBToXYZ(FXMVECTOR srgb) noexcept -{ - static const XMVECTORF32 Scale0 = { { { 0.4124f, 0.2126f, 0.0193f, 0.0f } } }; - static const XMVECTORF32 Scale1 = { { { 0.3576f, 0.7152f, 0.1192f, 0.0f } } }; - static const XMVECTORF32 Scale2 = { { { 0.1805f, 0.0722f, 0.9505f, 0.0f } } }; - static const XMVECTORF32 Cutoff = { { { 0.04045f, 0.04045f, 0.04045f, 0.0f } } }; - static const XMVECTORF32 Exp = { { { 2.4f, 2.4f, 2.4f, 1.0f } } }; - - XMVECTOR sel = XMVectorGreater(srgb, Cutoff); - - // lclr = clr / 12.92 - XMVECTOR smallC = XMVectorDivide(srgb, g_XMsrgbScale); - - // lclr = pow( (clr + a) / (1+a), 2.4 ) - XMVECTOR largeC = XMVectorPow(XMVectorDivide(XMVectorAdd(srgb, g_XMsrgbA), g_XMsrgbA1), Exp); - - XMVECTOR lclr = XMVectorSelect(smallC, largeC, sel); - - XMMATRIX M(Scale0, Scale1, Scale2, g_XMZero); - XMVECTOR clr = XMVector3Transform(lclr, M); - - return XMVectorSelect(srgb, clr, g_XMSelect1110); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMColorRGBToSRGB(FXMVECTOR rgb) noexcept -{ - static const XMVECTORF32 Cutoff = { { { 0.0031308f, 0.0031308f, 0.0031308f, 1.f } } }; - static const XMVECTORF32 Linear = { { { 12.92f, 12.92f, 12.92f, 1.f } } }; - static const XMVECTORF32 Scale = { { { 1.055f, 1.055f, 1.055f, 1.f } } }; - static const XMVECTORF32 Bias = { { { 0.055f, 0.055f, 0.055f, 0.f } } }; - static const XMVECTORF32 InvGamma = { { { 1.0f / 2.4f, 1.0f / 2.4f, 1.0f / 2.4f, 1.f } } }; - - XMVECTOR V = XMVectorSaturate(rgb); - XMVECTOR V0 = XMVectorMultiply(V, Linear); - XMVECTOR V1 = XMVectorSubtract(XMVectorMultiply(Scale, XMVectorPow(V, InvGamma)), Bias); - XMVECTOR select = XMVectorLess(V, Cutoff); - V = XMVectorSelect(V1, V0, select); - return XMVectorSelect(rgb, V, g_XMSelect1110); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMColorSRGBToRGB(FXMVECTOR srgb) noexcept -{ - static const XMVECTORF32 Cutoff = { { { 0.04045f, 0.04045f, 0.04045f, 1.f } } }; - static const XMVECTORF32 ILinear = { { { 1.f / 12.92f, 1.f / 12.92f, 1.f / 12.92f, 1.f } } }; - static const XMVECTORF32 Scale = { { { 1.f / 1.055f, 1.f / 1.055f, 1.f / 1.055f, 1.f } } }; - static const XMVECTORF32 Bias = { { { 0.055f, 0.055f, 0.055f, 0.f } } }; - static const XMVECTORF32 Gamma = { { { 2.4f, 2.4f, 2.4f, 1.f } } }; - - XMVECTOR V = XMVectorSaturate(srgb); - XMVECTOR V0 = XMVectorMultiply(V, ILinear); - XMVECTOR V1 = XMVectorPow(XMVectorMultiply(XMVectorAdd(V, Bias), Scale), Gamma); - XMVECTOR select = XMVectorGreater(V, Cutoff); - V = XMVectorSelect(V0, V1, select); - return XMVectorSelect(srgb, V, g_XMSelect1110); -} - -/**************************************************************************** - * - * Miscellaneous - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline bool XMVerifyCPUSupport() noexcept -{ -#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - int CPUInfo[4] = { -1 }; -#if (defined(__clang__) || defined(__GNUC__)) && defined(__cpuid) - __cpuid(0, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); -#else - __cpuid(CPUInfo, 0); -#endif - -#ifdef __AVX2__ - if (CPUInfo[0] < 7) - return false; -#else - if (CPUInfo[0] < 1) - return false; -#endif - -#if (defined(__clang__) || defined(__GNUC__)) && defined(__cpuid) - __cpuid(1, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); -#else - __cpuid(CPUInfo, 1); -#endif - -#if defined(__AVX2__) || defined(_XM_AVX2_INTRINSICS_) - // The compiler can emit FMA3 instructions even without explicit intrinsics use - if ((CPUInfo[2] & 0x38081001) != 0x38081001) - return false; // No F16C/AVX/OSXSAVE/SSE4.1/FMA3/SSE3 support -#elif defined(_XM_FMA3_INTRINSICS_) && defined(_XM_F16C_INTRINSICS_) - if ((CPUInfo[2] & 0x38081001) != 0x38081001) - return false; // No F16C/AVX/OSXSAVE/SSE4.1/FMA3/SSE3 support -#elif defined(_XM_FMA3_INTRINSICS_) - if ((CPUInfo[2] & 0x18081001) != 0x18081001) - return false; // No AVX/OSXSAVE/SSE4.1/FMA3/SSE3 support -#elif defined(_XM_F16C_INTRINSICS_) - if ((CPUInfo[2] & 0x38080001) != 0x38080001) - return false; // No F16C/AVX/OSXSAVE/SSE4.1/SSE3 support -#elif defined(__AVX__) || defined(_XM_AVX_INTRINSICS_) - if ((CPUInfo[2] & 0x18080001) != 0x18080001) - return false; // No AVX/OSXSAVE/SSE4.1/SSE3 support -#elif defined(_XM_SSE4_INTRINSICS_) - if ((CPUInfo[2] & 0x80001) != 0x80001) - return false; // No SSE3/SSE4.1 support -#elif defined(_XM_SSE3_INTRINSICS_) - if (!(CPUInfo[2] & 0x1)) - return false; // No SSE3 support -#endif - - // The x64 processor model requires SSE2 support, but no harm in checking - if ((CPUInfo[3] & 0x6000000) != 0x6000000) - return false; // No SSE2/SSE support - -#if defined(__AVX2__) || defined(_XM_AVX2_INTRINSICS_) -#if defined(__clang__) || defined(__GNUC__) - __cpuid_count(7, 0, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); -#else - __cpuidex(CPUInfo, 7, 0); -#endif - if (!(CPUInfo[1] & 0x20)) - return false; // No AVX2 support -#endif - - return true; -#elif defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - // ARM-NEON support is required for the Windows on ARM platform - return true; -#else - // No intrinsics path always supported - return true; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMFresnelTerm -( - FXMVECTOR CosIncidentAngle, - FXMVECTOR RefractionIndex -) noexcept -{ - assert(!XMVector4IsInfinite(CosIncidentAngle)); - - // Result = 0.5f * (g - c)^2 / (g + c)^2 * ((c * (g + c) - 1)^2 / (c * (g - c) + 1)^2 + 1) where - // c = CosIncidentAngle - // g = sqrt(c^2 + RefractionIndex^2 - 1) - -#if defined(_XM_NO_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) - - XMVECTOR G = XMVectorMultiplyAdd(RefractionIndex, RefractionIndex, g_XMNegativeOne.v); - G = XMVectorMultiplyAdd(CosIncidentAngle, CosIncidentAngle, G); - G = XMVectorAbs(G); - G = XMVectorSqrt(G); - - XMVECTOR S = XMVectorAdd(G, CosIncidentAngle); - XMVECTOR D = XMVectorSubtract(G, CosIncidentAngle); - - XMVECTOR V0 = XMVectorMultiply(D, D); - XMVECTOR V1 = XMVectorMultiply(S, S); - V1 = XMVectorReciprocal(V1); - V0 = XMVectorMultiply(g_XMOneHalf.v, V0); - V0 = XMVectorMultiply(V0, V1); - - XMVECTOR V2 = XMVectorMultiplyAdd(CosIncidentAngle, S, g_XMNegativeOne.v); - XMVECTOR V3 = XMVectorMultiplyAdd(CosIncidentAngle, D, g_XMOne.v); - V2 = XMVectorMultiply(V2, V2); - V3 = XMVectorMultiply(V3, V3); - V3 = XMVectorReciprocal(V3); - V2 = XMVectorMultiplyAdd(V2, V3, g_XMOne.v); - - XMVECTOR Result = XMVectorMultiply(V0, V2); - - Result = XMVectorSaturate(Result); - - return Result; - -#elif defined(_XM_SSE_INTRINSICS_) - // G = sqrt(abs((RefractionIndex^2-1) + CosIncidentAngle^2)) - XMVECTOR G = _mm_mul_ps(RefractionIndex, RefractionIndex); - XMVECTOR vTemp = _mm_mul_ps(CosIncidentAngle, CosIncidentAngle); - G = _mm_sub_ps(G, g_XMOne); - vTemp = _mm_add_ps(vTemp, G); - // max((0-vTemp),vTemp) == abs(vTemp) - // The abs is needed to deal with refraction and cosine being zero - G = _mm_setzero_ps(); - G = _mm_sub_ps(G, vTemp); - G = _mm_max_ps(G, vTemp); - // Last operation, the sqrt() - G = _mm_sqrt_ps(G); - - // Calc G-C and G+C - XMVECTOR GAddC = _mm_add_ps(G, CosIncidentAngle); - XMVECTOR GSubC = _mm_sub_ps(G, CosIncidentAngle); - // Perform the term (0.5f *(g - c)^2) / (g + c)^2 - XMVECTOR vResult = _mm_mul_ps(GSubC, GSubC); - vTemp = _mm_mul_ps(GAddC, GAddC); - vResult = _mm_mul_ps(vResult, g_XMOneHalf); - vResult = _mm_div_ps(vResult, vTemp); - // Perform the term ((c * (g + c) - 1)^2 / (c * (g - c) + 1)^2 + 1) - GAddC = _mm_mul_ps(GAddC, CosIncidentAngle); - GSubC = _mm_mul_ps(GSubC, CosIncidentAngle); - GAddC = _mm_sub_ps(GAddC, g_XMOne); - GSubC = _mm_add_ps(GSubC, g_XMOne); - GAddC = _mm_mul_ps(GAddC, GAddC); - GSubC = _mm_mul_ps(GSubC, GSubC); - GAddC = _mm_div_ps(GAddC, GSubC); - GAddC = _mm_add_ps(GAddC, g_XMOne); - // Multiply the two term parts - vResult = _mm_mul_ps(vResult, GAddC); - // Clamp to 0.0 - 1.0f - vResult = _mm_max_ps(vResult, g_XMZero); - vResult = _mm_min_ps(vResult, g_XMOne); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XMScalarNearEqual -( - float S1, - float S2, - float Epsilon -) noexcept -{ - float Delta = S1 - S2; - return (fabsf(Delta) <= Epsilon); -} - -//------------------------------------------------------------------------------ -// Modulo the range of the given angle such that -XM_PI <= Angle < XM_PI -inline float XMScalarModAngle(float Angle) noexcept -{ - // Note: The modulo is performed with unsigned math only to work - // around a precision error on numbers that are close to PI - - // Normalize the range from 0.0f to XM_2PI - Angle = Angle + XM_PI; - // Perform the modulo, unsigned - float fTemp = fabsf(Angle); - fTemp = fTemp - (XM_2PI * static_cast(static_cast(fTemp / XM_2PI))); - // Restore the number to the range of -XM_PI to XM_PI-epsilon - fTemp = fTemp - XM_PI; - // If the modulo'd value was negative, restore negation - if (Angle < 0.0f) - { - fTemp = -fTemp; - } - return fTemp; -} - -//------------------------------------------------------------------------------ - -inline float XMScalarSin(float Value) noexcept -{ - // Map Value to y in [-pi,pi], x = 2*pi*quotient + remainder. - float quotient = XM_1DIV2PI * Value; - if (Value >= 0.0f) - { - quotient = static_cast(static_cast(quotient + 0.5f)); - } - else - { - quotient = static_cast(static_cast(quotient - 0.5f)); - } - float y = Value - XM_2PI * quotient; - - // Map y to [-pi/2,pi/2] with sin(y) = sin(Value). - if (y > XM_PIDIV2) - { - y = XM_PI - y; - } - else if (y < -XM_PIDIV2) - { - y = -XM_PI - y; - } - - // 11-degree minimax approximation - float y2 = y * y; - return (((((-2.3889859e-08f * y2 + 2.7525562e-06f) * y2 - 0.00019840874f) * y2 + 0.0083333310f) * y2 - 0.16666667f) * y2 + 1.0f) * y; -} - -//------------------------------------------------------------------------------ - -inline float XMScalarSinEst(float Value) noexcept -{ - // Map Value to y in [-pi,pi], x = 2*pi*quotient + remainder. - float quotient = XM_1DIV2PI * Value; - if (Value >= 0.0f) - { - quotient = static_cast(static_cast(quotient + 0.5f)); - } - else - { - quotient = static_cast(static_cast(quotient - 0.5f)); - } - float y = Value - XM_2PI * quotient; - - // Map y to [-pi/2,pi/2] with sin(y) = sin(Value). - if (y > XM_PIDIV2) - { - y = XM_PI - y; - } - else if (y < -XM_PIDIV2) - { - y = -XM_PI - y; - } - - // 7-degree minimax approximation - float y2 = y * y; - return (((-0.00018524670f * y2 + 0.0083139502f) * y2 - 0.16665852f) * y2 + 1.0f) * y; -} - -//------------------------------------------------------------------------------ - -inline float XMScalarCos(float Value) noexcept -{ - // Map Value to y in [-pi,pi], x = 2*pi*quotient + remainder. - float quotient = XM_1DIV2PI * Value; - if (Value >= 0.0f) - { - quotient = static_cast(static_cast(quotient + 0.5f)); - } - else - { - quotient = static_cast(static_cast(quotient - 0.5f)); - } - float y = Value - XM_2PI * quotient; - - // Map y to [-pi/2,pi/2] with cos(y) = sign*cos(x). - float sign; - if (y > XM_PIDIV2) - { - y = XM_PI - y; - sign = -1.0f; - } - else if (y < -XM_PIDIV2) - { - y = -XM_PI - y; - sign = -1.0f; - } - else - { - sign = +1.0f; - } - - // 10-degree minimax approximation - float y2 = y * y; - float p = ((((-2.6051615e-07f * y2 + 2.4760495e-05f) * y2 - 0.0013888378f) * y2 + 0.041666638f) * y2 - 0.5f) * y2 + 1.0f; - return sign * p; -} - -//------------------------------------------------------------------------------ - -inline float XMScalarCosEst(float Value) noexcept -{ - // Map Value to y in [-pi,pi], x = 2*pi*quotient + remainder. - float quotient = XM_1DIV2PI * Value; - if (Value >= 0.0f) - { - quotient = static_cast(static_cast(quotient + 0.5f)); - } - else - { - quotient = static_cast(static_cast(quotient - 0.5f)); - } - float y = Value - XM_2PI * quotient; - - // Map y to [-pi/2,pi/2] with cos(y) = sign*cos(x). - float sign; - if (y > XM_PIDIV2) - { - y = XM_PI - y; - sign = -1.0f; - } - else if (y < -XM_PIDIV2) - { - y = -XM_PI - y; - sign = -1.0f; - } - else - { - sign = +1.0f; - } - - // 6-degree minimax approximation - float y2 = y * y; - float p = ((-0.0012712436f * y2 + 0.041493919f) * y2 - 0.49992746f) * y2 + 1.0f; - return sign * p; -} - -//------------------------------------------------------------------------------ - -_Use_decl_annotations_ -inline void XMScalarSinCos -( - float* pSin, - float* pCos, - float Value -) noexcept -{ - assert(pSin); - assert(pCos); - - // Map Value to y in [-pi,pi], x = 2*pi*quotient + remainder. - float quotient = XM_1DIV2PI * Value; - if (Value >= 0.0f) - { - quotient = static_cast(static_cast(quotient + 0.5f)); - } - else - { - quotient = static_cast(static_cast(quotient - 0.5f)); - } - float y = Value - XM_2PI * quotient; - - // Map y to [-pi/2,pi/2] with sin(y) = sin(Value). - float sign; - if (y > XM_PIDIV2) - { - y = XM_PI - y; - sign = -1.0f; - } - else if (y < -XM_PIDIV2) - { - y = -XM_PI - y; - sign = -1.0f; - } - else - { - sign = +1.0f; - } - - float y2 = y * y; - - // 11-degree minimax approximation - *pSin = (((((-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; - *pCos = sign * p; -} - -//------------------------------------------------------------------------------ - -_Use_decl_annotations_ -inline void XMScalarSinCosEst -( - float* pSin, - float* pCos, - float Value -) noexcept -{ - assert(pSin); - assert(pCos); - - // Map Value to y in [-pi,pi], x = 2*pi*quotient + remainder. - float quotient = XM_1DIV2PI * Value; - if (Value >= 0.0f) - { - quotient = static_cast(static_cast(quotient + 0.5f)); - } - else - { - quotient = static_cast(static_cast(quotient - 0.5f)); - } - float y = Value - XM_2PI * quotient; - - // Map y to [-pi/2,pi/2] with sin(y) = sin(Value). - float sign; - if (y > XM_PIDIV2) - { - y = XM_PI - y; - sign = -1.0f; - } - else if (y < -XM_PIDIV2) - { - y = -XM_PI - y; - sign = -1.0f; - } - else - { - sign = +1.0f; - } - - float y2 = y * y; - - // 7-degree minimax approximation - *pSin = (((-0.00018524670f * y2 + 0.0083139502f) * y2 - 0.16665852f) * y2 + 1.0f) * y; - - // 6-degree minimax approximation - float p = ((-0.0012712436f * y2 + 0.041493919f) * y2 - 0.49992746f) * y2 + 1.0f; - *pCos = sign * p; -} - -//------------------------------------------------------------------------------ - -inline float XMScalarASin(float Value) noexcept -{ - // Clamp input to [-1,1]. - bool nonnegative = (Value >= 0.0f); - float x = fabsf(Value); - float omx = 1.0f - x; - if (omx < 0.0f) - { - omx = 0.0f; - } - float root = sqrtf(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 + 1.5707963050f; - result *= root; // acos(|x|) - - // acos(x) = pi - acos(-x) when x < 0, asin(x) = pi/2 - acos(x) - return (nonnegative ? XM_PIDIV2 - result : result - XM_PIDIV2); -} - -//------------------------------------------------------------------------------ - -inline float XMScalarASinEst(float Value) noexcept -{ - // Clamp input to [-1,1]. - bool nonnegative = (Value >= 0.0f); - float x = fabsf(Value); - float omx = 1.0f - x; - if (omx < 0.0f) - { - omx = 0.0f; - } - float root = sqrtf(omx); - - // 3-degree minimax approximation - float result = ((-0.0187293f * x + 0.0742610f) * x - 0.2121144f) * x + 1.5707288f; - result *= root; // acos(|x|) - - // acos(x) = pi - acos(-x) when x < 0, asin(x) = pi/2 - acos(x) - return (nonnegative ? XM_PIDIV2 - result : result - XM_PIDIV2); -} - -//------------------------------------------------------------------------------ - -inline float XMScalarACos(float Value) noexcept -{ - // Clamp input to [-1,1]. - bool nonnegative = (Value >= 0.0f); - float x = fabsf(Value); - float omx = 1.0f - x; - if (omx < 0.0f) - { - omx = 0.0f; - } - float root = sqrtf(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 + 1.5707963050f; - result *= root; - - // acos(x) = pi - acos(-x) when x < 0 - return (nonnegative ? result : XM_PI - result); -} - -//------------------------------------------------------------------------------ - -inline float XMScalarACosEst(float Value) noexcept -{ - // Clamp input to [-1,1]. - bool nonnegative = (Value >= 0.0f); - float x = fabsf(Value); - float omx = 1.0f - x; - if (omx < 0.0f) - { - omx = 0.0f; - } - float root = sqrtf(omx); - - // 3-degree minimax approximation - float result = ((-0.0187293f * x + 0.0742610f) * x - 0.2121144f) * x + 1.5707288f; - result *= root; - - // acos(x) = pi - acos(-x) when x < 0 - return (nonnegative ? result : XM_PI - result); -} - +//------------------------------------------------------------------------------------- +// DirectXMathMisc.inl -- SIMD C++ Math library +// +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +// +// http://go.microsoft.com/fwlink/?LinkID=615560 +//------------------------------------------------------------------------------------- + +#pragma once + +/**************************************************************************** + * + * Quaternion + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ +// Comparison operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMQuaternionEqual +( + FXMVECTOR Q1, + FXMVECTOR Q2 +) noexcept +{ + return XMVector4Equal(Q1, Q2); +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMQuaternionNotEqual +( + FXMVECTOR Q1, + FXMVECTOR Q2 +) noexcept +{ + return XMVector4NotEqual(Q1, Q2); +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMQuaternionIsNaN(FXMVECTOR Q) noexcept +{ + return XMVector4IsNaN(Q); +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMQuaternionIsInfinite(FXMVECTOR Q) noexcept +{ + return XMVector4IsInfinite(Q); +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMQuaternionIsIdentity(FXMVECTOR Q) noexcept +{ + return XMVector4Equal(Q, g_XMIdentityR3.v); +} + +//------------------------------------------------------------------------------ +// Computation operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionDot +( + FXMVECTOR Q1, + FXMVECTOR Q2 +) noexcept +{ + return XMVector4Dot(Q1, Q2); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionMultiply +( + FXMVECTOR Q1, + FXMVECTOR Q2 +) noexcept +{ + // Returns the product Q2*Q1 (which is the concatenation of a rotation Q1 followed by the rotation Q2) + + // [ (Q2.w * Q1.x) + (Q2.x * Q1.w) + (Q2.y * Q1.z) - (Q2.z * Q1.y), + // (Q2.w * Q1.y) - (Q2.x * Q1.z) + (Q2.y * Q1.w) + (Q2.z * Q1.x), + // (Q2.w * Q1.z) + (Q2.x * Q1.y) - (Q2.y * Q1.x) + (Q2.z * Q1.w), + // (Q2.w * Q1.w) - (Q2.x * Q1.x) - (Q2.y * Q1.y) - (Q2.z * Q1.z) ] + +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + (Q2.vector4_f32[3] * Q1.vector4_f32[0]) + (Q2.vector4_f32[0] * Q1.vector4_f32[3]) + (Q2.vector4_f32[1] * Q1.vector4_f32[2]) - (Q2.vector4_f32[2] * Q1.vector4_f32[1]), + (Q2.vector4_f32[3] * Q1.vector4_f32[1]) - (Q2.vector4_f32[0] * Q1.vector4_f32[2]) + (Q2.vector4_f32[1] * Q1.vector4_f32[3]) + (Q2.vector4_f32[2] * Q1.vector4_f32[0]), + (Q2.vector4_f32[3] * Q1.vector4_f32[2]) + (Q2.vector4_f32[0] * Q1.vector4_f32[1]) - (Q2.vector4_f32[1] * Q1.vector4_f32[0]) + (Q2.vector4_f32[2] * Q1.vector4_f32[3]), + (Q2.vector4_f32[3] * Q1.vector4_f32[3]) - (Q2.vector4_f32[0] * Q1.vector4_f32[0]) - (Q2.vector4_f32[1] * Q1.vector4_f32[1]) - (Q2.vector4_f32[2] * Q1.vector4_f32[2]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 ControlWZYX = { { { 1.0f, -1.0f, 1.0f, -1.0f } } }; + static const XMVECTORF32 ControlZWXY = { { { 1.0f, 1.0f, -1.0f, -1.0f } } }; + static const XMVECTORF32 ControlYXWZ = { { { -1.0f, 1.0f, 1.0f, -1.0f } } }; + + float32x2_t Q2L = vget_low_f32(Q2); + float32x2_t Q2H = vget_high_f32(Q2); + + float32x4_t Q2X = vdupq_lane_f32(Q2L, 0); + float32x4_t Q2Y = vdupq_lane_f32(Q2L, 1); + float32x4_t Q2Z = vdupq_lane_f32(Q2H, 0); + XMVECTOR vResult = vmulq_lane_f32(Q1, Q2H, 1); + + // Mul by Q1WZYX + float32x4_t vTemp = vrev64q_f32(Q1); + vTemp = vcombine_f32(vget_high_f32(vTemp), vget_low_f32(vTemp)); + Q2X = vmulq_f32(Q2X, vTemp); + vResult = vmlaq_f32(vResult, Q2X, ControlWZYX); + + // Mul by Q1ZWXY + vTemp = vreinterpretq_f32_u32(vrev64q_u32(vreinterpretq_u32_f32(vTemp))); + Q2Y = vmulq_f32(Q2Y, vTemp); + vResult = vmlaq_f32(vResult, Q2Y, ControlZWXY); + + // Mul by Q1YXWZ + vTemp = vreinterpretq_f32_u32(vrev64q_u32(vreinterpretq_u32_f32(vTemp))); + vTemp = vcombine_f32(vget_high_f32(vTemp), vget_low_f32(vTemp)); + Q2Z = vmulq_f32(Q2Z, vTemp); + vResult = vmlaq_f32(vResult, Q2Z, ControlYXWZ); + return vResult; +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 ControlWZYX = { { { 1.0f, -1.0f, 1.0f, -1.0f } } }; + static const XMVECTORF32 ControlZWXY = { { { 1.0f, 1.0f, -1.0f, -1.0f } } }; + static const XMVECTORF32 ControlYXWZ = { { { -1.0f, 1.0f, 1.0f, -1.0f } } }; + // Copy to SSE registers and use as few as possible for x86 + XMVECTOR Q2X = Q2; + XMVECTOR Q2Y = Q2; + XMVECTOR Q2Z = Q2; + XMVECTOR vResult = Q2; + // Splat with one instruction + vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 3, 3, 3)); + Q2X = XM_PERMUTE_PS(Q2X, _MM_SHUFFLE(0, 0, 0, 0)); + Q2Y = XM_PERMUTE_PS(Q2Y, _MM_SHUFFLE(1, 1, 1, 1)); + Q2Z = XM_PERMUTE_PS(Q2Z, _MM_SHUFFLE(2, 2, 2, 2)); + // Retire Q1 and perform Q1*Q2W + vResult = _mm_mul_ps(vResult, Q1); + XMVECTOR Q1Shuffle = Q1; + // Shuffle the copies of Q1 + Q1Shuffle = XM_PERMUTE_PS(Q1Shuffle, _MM_SHUFFLE(0, 1, 2, 3)); + // Mul by Q1WZYX + Q2X = _mm_mul_ps(Q2X, Q1Shuffle); + Q1Shuffle = XM_PERMUTE_PS(Q1Shuffle, _MM_SHUFFLE(2, 3, 0, 1)); + // Flip the signs on y and z + vResult = XM_FMADD_PS(Q2X, ControlWZYX, vResult); + // Mul by Q1ZWXY + Q2Y = _mm_mul_ps(Q2Y, Q1Shuffle); + Q1Shuffle = XM_PERMUTE_PS(Q1Shuffle, _MM_SHUFFLE(0, 1, 2, 3)); + // Flip the signs on z and w + Q2Y = _mm_mul_ps(Q2Y, ControlZWXY); + // Mul by Q1YXWZ + Q2Z = _mm_mul_ps(Q2Z, Q1Shuffle); + // Flip the signs on x and w + Q2Y = XM_FMADD_PS(Q2Z, ControlYXWZ, Q2Y); + vResult = _mm_add_ps(vResult, Q2Y); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionLengthSq(FXMVECTOR Q) noexcept +{ + return XMVector4LengthSq(Q); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionReciprocalLength(FXMVECTOR Q) noexcept +{ + return XMVector4ReciprocalLength(Q); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionLength(FXMVECTOR Q) noexcept +{ + return XMVector4Length(Q); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionNormalizeEst(FXMVECTOR Q) noexcept +{ + return XMVector4NormalizeEst(Q); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionNormalize(FXMVECTOR Q) noexcept +{ + return XMVector4Normalize(Q); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionConjugate(FXMVECTOR Q) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + -Q.vector4_f32[0], + -Q.vector4_f32[1], + -Q.vector4_f32[2], + Q.vector4_f32[3] + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 NegativeOne3 = { { { -1.0f, -1.0f, -1.0f, 1.0f } } }; + return vmulq_f32(Q, NegativeOne3.v); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 NegativeOne3 = { { { -1.0f, -1.0f, -1.0f, 1.0f } } }; + return _mm_mul_ps(Q, NegativeOne3); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionInverse(FXMVECTOR Q) noexcept +{ + XMVECTOR L = XMVector4LengthSq(Q); + XMVECTOR Conjugate = XMQuaternionConjugate(Q); + + XMVECTOR Control = XMVectorLessOrEqual(L, g_XMEpsilon.v); + + XMVECTOR Result = XMVectorDivide(Conjugate, L); + + Result = XMVectorSelect(Result, g_XMZero, Control); + + return Result; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionLn(FXMVECTOR Q) noexcept +{ + static const XMVECTORF32 OneMinusEpsilon = { { { 1.0f - 0.00001f, 1.0f - 0.00001f, 1.0f - 0.00001f, 1.0f - 0.00001f } } }; + + XMVECTOR QW = XMVectorSplatW(Q); + XMVECTOR Q0 = XMVectorSelect(g_XMSelect1110.v, Q, g_XMSelect1110.v); + + XMVECTOR ControlW = XMVectorInBounds(QW, OneMinusEpsilon.v); + + XMVECTOR Theta = XMVectorACos(QW); + XMVECTOR SinTheta = XMVectorSin(Theta); + + XMVECTOR S = XMVectorDivide(Theta, SinTheta); + + XMVECTOR Result = XMVectorMultiply(Q0, S); + Result = XMVectorSelect(Q0, Result, ControlW); + + return Result; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionExp(FXMVECTOR Q) noexcept +{ + XMVECTOR Theta = XMVector3Length(Q); + + XMVECTOR SinTheta, CosTheta; + XMVectorSinCos(&SinTheta, &CosTheta, Theta); + + XMVECTOR S = XMVectorDivide(SinTheta, Theta); + + XMVECTOR Result = XMVectorMultiply(Q, S); + + const XMVECTOR Zero = XMVectorZero(); + XMVECTOR Control = XMVectorNearEqual(Theta, Zero, g_XMEpsilon.v); + Result = XMVectorSelect(Result, Q, Control); + + Result = XMVectorSelect(CosTheta, Result, g_XMSelect1110.v); + + return Result; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionSlerp +( + FXMVECTOR Q0, + FXMVECTOR Q1, + float t +) noexcept +{ + XMVECTOR T = XMVectorReplicate(t); + return XMQuaternionSlerpV(Q0, Q1, T); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionSlerpV +( + FXMVECTOR Q0, + FXMVECTOR Q1, + FXMVECTOR T +) noexcept +{ + assert((XMVectorGetY(T) == XMVectorGetX(T)) && (XMVectorGetZ(T) == XMVectorGetX(T)) && (XMVectorGetW(T) == XMVectorGetX(T))); + + // Result = Q0 * sin((1.0 - t) * Omega) / sin(Omega) + Q1 * sin(t * Omega) / sin(Omega) + +#if defined(_XM_NO_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) + + const XMVECTORF32 OneMinusEpsilon = { { { 1.0f - 0.00001f, 1.0f - 0.00001f, 1.0f - 0.00001f, 1.0f - 0.00001f } } }; + + XMVECTOR CosOmega = XMQuaternionDot(Q0, Q1); + + const XMVECTOR Zero = XMVectorZero(); + XMVECTOR Control = XMVectorLess(CosOmega, Zero); + XMVECTOR Sign = XMVectorSelect(g_XMOne.v, g_XMNegativeOne.v, Control); + + CosOmega = XMVectorMultiply(CosOmega, Sign); + + Control = XMVectorLess(CosOmega, OneMinusEpsilon); + + XMVECTOR SinOmega = XMVectorNegativeMultiplySubtract(CosOmega, CosOmega, g_XMOne.v); + SinOmega = XMVectorSqrt(SinOmega); + + XMVECTOR Omega = XMVectorATan2(SinOmega, CosOmega); + + XMVECTOR SignMask = XMVectorSplatSignMask(); + XMVECTOR V01 = XMVectorShiftLeft(T, Zero, 2); + SignMask = XMVectorShiftLeft(SignMask, Zero, 3); + V01 = XMVectorXorInt(V01, SignMask); + V01 = XMVectorAdd(g_XMIdentityR0.v, V01); + + XMVECTOR InvSinOmega = XMVectorReciprocal(SinOmega); + + XMVECTOR S0 = XMVectorMultiply(V01, Omega); + S0 = XMVectorSin(S0); + S0 = XMVectorMultiply(S0, InvSinOmega); + + S0 = XMVectorSelect(V01, S0, Control); + + XMVECTOR S1 = XMVectorSplatY(S0); + S0 = XMVectorSplatX(S0); + + S1 = XMVectorMultiply(S1, Sign); + + XMVECTOR Result = XMVectorMultiply(Q0, S0); + Result = XMVectorMultiplyAdd(Q1, S1, Result); + + return Result; + +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 OneMinusEpsilon = { { { 1.0f - 0.00001f, 1.0f - 0.00001f, 1.0f - 0.00001f, 1.0f - 0.00001f } } }; + static const XMVECTORU32 SignMask2 = { { { 0x80000000, 0x00000000, 0x00000000, 0x00000000 } } }; + + XMVECTOR CosOmega = XMQuaternionDot(Q0, Q1); + + const XMVECTOR Zero = XMVectorZero(); + XMVECTOR Control = XMVectorLess(CosOmega, Zero); + XMVECTOR Sign = XMVectorSelect(g_XMOne, g_XMNegativeOne, Control); + + CosOmega = _mm_mul_ps(CosOmega, Sign); + + Control = XMVectorLess(CosOmega, OneMinusEpsilon); + + XMVECTOR SinOmega = _mm_mul_ps(CosOmega, CosOmega); + SinOmega = _mm_sub_ps(g_XMOne, SinOmega); + SinOmega = _mm_sqrt_ps(SinOmega); + + XMVECTOR Omega = XMVectorATan2(SinOmega, CosOmega); + + XMVECTOR V01 = XM_PERMUTE_PS(T, _MM_SHUFFLE(2, 3, 0, 1)); + V01 = _mm_and_ps(V01, g_XMMaskXY); + V01 = _mm_xor_ps(V01, SignMask2); + V01 = _mm_add_ps(g_XMIdentityR0, V01); + + XMVECTOR S0 = _mm_mul_ps(V01, Omega); + S0 = XMVectorSin(S0); + S0 = _mm_div_ps(S0, SinOmega); + + S0 = XMVectorSelect(V01, S0, Control); + + XMVECTOR S1 = XMVectorSplatY(S0); + S0 = XMVectorSplatX(S0); + + S1 = _mm_mul_ps(S1, Sign); + XMVECTOR Result = _mm_mul_ps(Q0, S0); + S1 = _mm_mul_ps(S1, Q1); + Result = _mm_add_ps(Result, S1); + return Result; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionSquad +( + FXMVECTOR Q0, + FXMVECTOR Q1, + FXMVECTOR Q2, + GXMVECTOR Q3, + float t +) noexcept +{ + XMVECTOR T = XMVectorReplicate(t); + return XMQuaternionSquadV(Q0, Q1, Q2, Q3, T); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionSquadV +( + FXMVECTOR Q0, + FXMVECTOR Q1, + FXMVECTOR Q2, + GXMVECTOR Q3, + HXMVECTOR T +) noexcept +{ + assert((XMVectorGetY(T) == XMVectorGetX(T)) && (XMVectorGetZ(T) == XMVectorGetX(T)) && (XMVectorGetW(T) == XMVectorGetX(T))); + + XMVECTOR TP = T; + const XMVECTOR Two = XMVectorSplatConstant(2, 0); + + XMVECTOR Q03 = XMQuaternionSlerpV(Q0, Q3, T); + XMVECTOR Q12 = XMQuaternionSlerpV(Q1, Q2, T); + + TP = XMVectorNegativeMultiplySubtract(TP, TP, TP); + TP = XMVectorMultiply(TP, Two); + + XMVECTOR Result = XMQuaternionSlerpV(Q03, Q12, TP); + + return Result; +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMQuaternionSquadSetup +( + XMVECTOR* pA, + XMVECTOR* pB, + XMVECTOR* pC, + FXMVECTOR Q0, + FXMVECTOR Q1, + FXMVECTOR Q2, + GXMVECTOR Q3 +) noexcept +{ + assert(pA); + assert(pB); + assert(pC); + + XMVECTOR LS12 = XMQuaternionLengthSq(XMVectorAdd(Q1, Q2)); + XMVECTOR LD12 = XMQuaternionLengthSq(XMVectorSubtract(Q1, Q2)); + XMVECTOR SQ2 = XMVectorNegate(Q2); + + XMVECTOR Control1 = XMVectorLess(LS12, LD12); + SQ2 = XMVectorSelect(Q2, SQ2, Control1); + + XMVECTOR LS01 = XMQuaternionLengthSq(XMVectorAdd(Q0, Q1)); + XMVECTOR LD01 = XMQuaternionLengthSq(XMVectorSubtract(Q0, Q1)); + XMVECTOR SQ0 = XMVectorNegate(Q0); + + XMVECTOR LS23 = XMQuaternionLengthSq(XMVectorAdd(SQ2, Q3)); + XMVECTOR LD23 = XMQuaternionLengthSq(XMVectorSubtract(SQ2, Q3)); + XMVECTOR SQ3 = XMVectorNegate(Q3); + + XMVECTOR Control0 = XMVectorLess(LS01, LD01); + XMVECTOR Control2 = XMVectorLess(LS23, LD23); + + SQ0 = XMVectorSelect(Q0, SQ0, Control0); + SQ3 = XMVectorSelect(Q3, SQ3, Control2); + + XMVECTOR InvQ1 = XMQuaternionInverse(Q1); + XMVECTOR InvQ2 = XMQuaternionInverse(SQ2); + + XMVECTOR LnQ0 = XMQuaternionLn(XMQuaternionMultiply(InvQ1, SQ0)); + XMVECTOR LnQ2 = XMQuaternionLn(XMQuaternionMultiply(InvQ1, SQ2)); + XMVECTOR LnQ1 = XMQuaternionLn(XMQuaternionMultiply(InvQ2, Q1)); + XMVECTOR LnQ3 = XMQuaternionLn(XMQuaternionMultiply(InvQ2, SQ3)); + + const XMVECTOR NegativeOneQuarter = XMVectorSplatConstant(-1, 2); + + XMVECTOR ExpQ02 = XMVectorMultiply(XMVectorAdd(LnQ0, LnQ2), NegativeOneQuarter); + XMVECTOR ExpQ13 = XMVectorMultiply(XMVectorAdd(LnQ1, LnQ3), NegativeOneQuarter); + ExpQ02 = XMQuaternionExp(ExpQ02); + ExpQ13 = XMQuaternionExp(ExpQ13); + + *pA = XMQuaternionMultiply(Q1, ExpQ02); + *pB = XMQuaternionMultiply(SQ2, ExpQ13); + *pC = SQ2; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionBaryCentric +( + FXMVECTOR Q0, + FXMVECTOR Q1, + FXMVECTOR Q2, + float f, + float g +) noexcept +{ + float s = f + g; + + XMVECTOR Result; + if ((s < 0.00001f) && (s > -0.00001f)) + { + Result = Q0; + } + else + { + XMVECTOR Q01 = XMQuaternionSlerp(Q0, Q1, s); + XMVECTOR Q02 = XMQuaternionSlerp(Q0, Q2, s); + + Result = XMQuaternionSlerp(Q01, Q02, g / s); + } + + return Result; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionBaryCentricV +( + FXMVECTOR Q0, + FXMVECTOR Q1, + FXMVECTOR Q2, + GXMVECTOR F, + HXMVECTOR G +) noexcept +{ + assert((XMVectorGetY(F) == XMVectorGetX(F)) && (XMVectorGetZ(F) == XMVectorGetX(F)) && (XMVectorGetW(F) == XMVectorGetX(F))); + assert((XMVectorGetY(G) == XMVectorGetX(G)) && (XMVectorGetZ(G) == XMVectorGetX(G)) && (XMVectorGetW(G) == XMVectorGetX(G))); + + const XMVECTOR Epsilon = XMVectorSplatConstant(1, 16); + + XMVECTOR S = XMVectorAdd(F, G); + + XMVECTOR Result; + if (XMVector4InBounds(S, Epsilon)) + { + Result = Q0; + } + else + { + XMVECTOR Q01 = XMQuaternionSlerpV(Q0, Q1, S); + XMVECTOR Q02 = XMQuaternionSlerpV(Q0, Q2, S); + XMVECTOR GS = XMVectorReciprocal(S); + GS = XMVectorMultiply(G, GS); + + Result = XMQuaternionSlerpV(Q01, Q02, GS); + } + + return Result; +} + +//------------------------------------------------------------------------------ +// Transformation operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionIdentity() noexcept +{ + return g_XMIdentityR3.v; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionRotationRollPitchYaw +( + float Pitch, + float Yaw, + float Roll +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + const float halfpitch = Pitch * 0.5f; + float cp = cosf(halfpitch); + float sp = sinf(halfpitch); + + const float halfyaw = Yaw * 0.5f; + float cy = cosf(halfyaw); + float sy = sinf(halfyaw); + + const float halfroll = Roll * 0.5f; + float cr = cosf(halfroll); + float sr = sinf(halfroll); + + XMVECTORF32 vResult = { { { + cr * sp * cy + sr * cp * sy, + cr * cp * sy - sr * sp * cy, + sr * cp * cy - cr * sp * sy, + cr * cp * cy + sr * sp * sy + } } }; + return vResult; +#else + XMVECTOR Angles = XMVectorSet(Pitch, Yaw, Roll, 0.0f); + return XMQuaternionRotationRollPitchYawFromVector(Angles); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionRotationRollPitchYawFromVector +( + FXMVECTOR Angles // +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + const float halfpitch = Angles.vector4_f32[0] * 0.5f; + float cp = cosf(halfpitch); + float sp = sinf(halfpitch); + + const float halfyaw = Angles.vector4_f32[1] * 0.5f; + float cy = cosf(halfyaw); + float sy = sinf(halfyaw); + + const float halfroll = Angles.vector4_f32[2] * 0.5f; + float cr = cosf(halfroll); + float sr = sinf(halfroll); + + XMVECTORF32 vResult = { { { + cr * sp * cy + sr * cp * sy, + cr * cp * sy - sr * sp * cy, + sr * cp * cy - cr * sp * sy, + cr * cp * cy + sr * sp * sy + } } }; + return vResult; +#else + static const XMVECTORF32 Sign = { { { 1.0f, -1.0f, -1.0f, 1.0f } } }; + + XMVECTOR HalfAngles = XMVectorMultiply(Angles, g_XMOneHalf.v); + + XMVECTOR SinAngles, CosAngles; + XMVectorSinCos(&SinAngles, &CosAngles, HalfAngles); + + XMVECTOR P0 = XMVectorPermute(SinAngles, CosAngles); + XMVECTOR Y0 = XMVectorPermute(SinAngles, CosAngles); + XMVECTOR R0 = XMVectorPermute(SinAngles, CosAngles); + XMVECTOR P1 = XMVectorPermute(CosAngles, SinAngles); + XMVECTOR Y1 = XMVectorPermute(CosAngles, SinAngles); + XMVECTOR R1 = XMVectorPermute(CosAngles, SinAngles); + + XMVECTOR Q1 = XMVectorMultiply(P1, Sign.v); + XMVECTOR Q0 = XMVectorMultiply(P0, Y0); + Q1 = XMVectorMultiply(Q1, Y1); + Q0 = XMVectorMultiply(Q0, R0); + XMVECTOR Q = XMVectorMultiplyAdd(Q1, R1, Q0); + + return Q; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionRotationNormal +( + FXMVECTOR NormalAxis, + float Angle +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) + + XMVECTOR N = XMVectorSelect(g_XMOne.v, NormalAxis, g_XMSelect1110.v); + + float SinV, CosV; + XMScalarSinCos(&SinV, &CosV, 0.5f * Angle); + + XMVECTOR Scale = XMVectorSet(SinV, SinV, SinV, CosV); + return XMVectorMultiply(N, Scale); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR N = _mm_and_ps(NormalAxis, g_XMMask3); + N = _mm_or_ps(N, g_XMIdentityR3); + XMVECTOR Scale = _mm_set_ps1(0.5f * Angle); + XMVECTOR vSine; + XMVECTOR vCosine; + XMVectorSinCos(&vSine, &vCosine, Scale); + Scale = _mm_and_ps(vSine, g_XMMask3); + vCosine = _mm_and_ps(vCosine, g_XMMaskW); + Scale = _mm_or_ps(Scale, vCosine); + N = _mm_mul_ps(N, Scale); + return N; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionRotationAxis +( + FXMVECTOR Axis, + float Angle +) noexcept +{ + assert(!XMVector3Equal(Axis, XMVectorZero())); + assert(!XMVector3IsInfinite(Axis)); + + XMVECTOR Normal = XMVector3Normalize(Axis); + XMVECTOR Q = XMQuaternionRotationNormal(Normal, Angle); + return Q; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMQuaternionRotationMatrix(FXMMATRIX M) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORF32 q; + float r22 = M.m[2][2]; + if (r22 <= 0.f) // x^2 + y^2 >= z^2 + w^2 + { + float dif10 = M.m[1][1] - M.m[0][0]; + float omr22 = 1.f - r22; + if (dif10 <= 0.f) // x^2 >= y^2 + { + float fourXSqr = omr22 - dif10; + float inv4x = 0.5f / sqrtf(fourXSqr); + q.f[0] = fourXSqr * inv4x; + q.f[1] = (M.m[0][1] + M.m[1][0]) * inv4x; + q.f[2] = (M.m[0][2] + M.m[2][0]) * inv4x; + q.f[3] = (M.m[1][2] - M.m[2][1]) * inv4x; + } + else // y^2 >= x^2 + { + float fourYSqr = omr22 + dif10; + float inv4y = 0.5f / sqrtf(fourYSqr); + q.f[0] = (M.m[0][1] + M.m[1][0]) * inv4y; + q.f[1] = fourYSqr * inv4y; + q.f[2] = (M.m[1][2] + M.m[2][1]) * inv4y; + q.f[3] = (M.m[2][0] - M.m[0][2]) * inv4y; + } + } + else // z^2 + w^2 >= x^2 + y^2 + { + float sum10 = M.m[1][1] + M.m[0][0]; + float opr22 = 1.f + r22; + if (sum10 <= 0.f) // z^2 >= w^2 + { + float fourZSqr = opr22 - sum10; + float inv4z = 0.5f / sqrtf(fourZSqr); + q.f[0] = (M.m[0][2] + M.m[2][0]) * inv4z; + q.f[1] = (M.m[1][2] + M.m[2][1]) * inv4z; + q.f[2] = fourZSqr * inv4z; + q.f[3] = (M.m[0][1] - M.m[1][0]) * inv4z; + } + else // w^2 >= z^2 + { + float fourWSqr = opr22 + sum10; + float inv4w = 0.5f / sqrtf(fourWSqr); + q.f[0] = (M.m[1][2] - M.m[2][1]) * inv4w; + q.f[1] = (M.m[2][0] - M.m[0][2]) * inv4w; + q.f[2] = (M.m[0][1] - M.m[1][0]) * inv4w; + q.f[3] = fourWSqr * inv4w; + } + } + return q.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 XMPMMP = { { { +1.0f, -1.0f, -1.0f, +1.0f } } }; + static const XMVECTORF32 XMMPMP = { { { -1.0f, +1.0f, -1.0f, +1.0f } } }; + static const XMVECTORF32 XMMMPP = { { { -1.0f, -1.0f, +1.0f, +1.0f } } }; + static const XMVECTORU32 Select0110 = { { { XM_SELECT_0, XM_SELECT_1, XM_SELECT_1, XM_SELECT_0 } } }; + static const XMVECTORU32 Select0010 = { { { XM_SELECT_0, XM_SELECT_0, XM_SELECT_1, XM_SELECT_0 } } }; + + float32x4_t r0 = M.r[0]; + float32x4_t r1 = M.r[1]; + float32x4_t r2 = M.r[2]; + + float32x4_t r00 = vdupq_lane_f32(vget_low_f32(r0), 0); + float32x4_t r11 = vdupq_lane_f32(vget_low_f32(r1), 1); + float32x4_t r22 = vdupq_lane_f32(vget_high_f32(r2), 0); + + // x^2 >= y^2 equivalent to r11 - r00 <= 0 + float32x4_t r11mr00 = vsubq_f32(r11, r00); + uint32x4_t x2gey2 = vcleq_f32(r11mr00, g_XMZero); + + // z^2 >= w^2 equivalent to r11 + r00 <= 0 + float32x4_t r11pr00 = vaddq_f32(r11, r00); + uint32x4_t z2gew2 = vcleq_f32(r11pr00, g_XMZero); + + // x^2 + y^2 >= z^2 + w^2 equivalent to r22 <= 0 + uint32x4_t x2py2gez2pw2 = vcleq_f32(r22, g_XMZero); + + // (4*x^2, 4*y^2, 4*z^2, 4*w^2) + float32x4_t t0 = vmulq_f32(XMPMMP, r00); + float32x4_t x2y2z2w2 = vmlaq_f32(t0, XMMPMP, r11); + x2y2z2w2 = vmlaq_f32(x2y2z2w2, XMMMPP, r22); + x2y2z2w2 = vaddq_f32(x2y2z2w2, g_XMOne); + + // (r01, r02, r12, r11) + t0 = vextq_f32(r0, r0, 1); + float32x4_t t1 = vextq_f32(r1, r1, 1); + t0 = vcombine_f32(vget_low_f32(t0), vrev64_f32(vget_low_f32(t1))); + + // (r10, r20, r21, r10) + t1 = vextq_f32(r2, r2, 3); + float32x4_t r10 = vdupq_lane_f32(vget_low_f32(r1), 0); + t1 = vbslq_f32(Select0110, t1, r10); + + // (4*x*y, 4*x*z, 4*y*z, unused) + float32x4_t xyxzyz = vaddq_f32(t0, t1); + + // (r21, r20, r10, r10) + t0 = vcombine_f32(vrev64_f32(vget_low_f32(r2)), vget_low_f32(r10)); + + // (r12, r02, r01, r12) + float32x4_t t2 = vcombine_f32(vrev64_f32(vget_high_f32(r0)), vrev64_f32(vget_low_f32(r0))); + float32x4_t t3 = vdupq_lane_f32(vget_high_f32(r1), 0); + t1 = vbslq_f32(Select0110, t2, t3); + + // (4*x*w, 4*y*w, 4*z*w, unused) + float32x4_t xwywzw = vsubq_f32(t0, t1); + xwywzw = vmulq_f32(XMMPMP, xwywzw); + + // (4*x*x, 4*x*y, 4*x*z, 4*x*w) + t0 = vextq_f32(xyxzyz, xyxzyz, 3); + t1 = vbslq_f32(Select0110, t0, x2y2z2w2); + t2 = vdupq_lane_f32(vget_low_f32(xwywzw), 0); + float32x4_t tensor0 = vbslq_f32(g_XMSelect1110, t1, t2); + + // (4*y*x, 4*y*y, 4*y*z, 4*y*w) + t0 = vbslq_f32(g_XMSelect1011, xyxzyz, x2y2z2w2); + t1 = vdupq_lane_f32(vget_low_f32(xwywzw), 1); + float32x4_t tensor1 = vbslq_f32(g_XMSelect1110, t0, t1); + + // (4*z*x, 4*z*y, 4*z*z, 4*z*w) + t0 = vextq_f32(xyxzyz, xyxzyz, 1); + t1 = vcombine_f32(vget_low_f32(t0), vrev64_f32(vget_high_f32(xwywzw))); + float32x4_t tensor2 = vbslq_f32(Select0010, x2y2z2w2, t1); + + // (4*w*x, 4*w*y, 4*w*z, 4*w*w) + float32x4_t tensor3 = vbslq_f32(g_XMSelect1110, xwywzw, x2y2z2w2); + + // Select the row of the tensor-product matrix that has the largest + // magnitude. + t0 = vbslq_f32(x2gey2, tensor0, tensor1); + t1 = vbslq_f32(z2gew2, tensor2, tensor3); + t2 = vbslq_f32(x2py2gez2pw2, t0, t1); + + // Normalize the row. No division by zero is possible because the + // quaternion is unit-length (and the row is a nonzero multiple of + // the quaternion). + t0 = XMVector4Length(t2); + return XMVectorDivide(t2, t0); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 XMPMMP = { { { +1.0f, -1.0f, -1.0f, +1.0f } } }; + static const XMVECTORF32 XMMPMP = { { { -1.0f, +1.0f, -1.0f, +1.0f } } }; + static const XMVECTORF32 XMMMPP = { { { -1.0f, -1.0f, +1.0f, +1.0f } } }; + + XMVECTOR r0 = M.r[0]; // (r00, r01, r02, 0) + XMVECTOR r1 = M.r[1]; // (r10, r11, r12, 0) + XMVECTOR r2 = M.r[2]; // (r20, r21, r22, 0) + + // (r00, r00, r00, r00) + XMVECTOR r00 = XM_PERMUTE_PS(r0, _MM_SHUFFLE(0, 0, 0, 0)); + // (r11, r11, r11, r11) + XMVECTOR r11 = XM_PERMUTE_PS(r1, _MM_SHUFFLE(1, 1, 1, 1)); + // (r22, r22, r22, r22) + XMVECTOR r22 = XM_PERMUTE_PS(r2, _MM_SHUFFLE(2, 2, 2, 2)); + + // x^2 >= y^2 equivalent to r11 - r00 <= 0 + // (r11 - r00, r11 - r00, r11 - r00, r11 - r00) + XMVECTOR r11mr00 = _mm_sub_ps(r11, r00); + XMVECTOR x2gey2 = _mm_cmple_ps(r11mr00, g_XMZero); + + // z^2 >= w^2 equivalent to r11 + r00 <= 0 + // (r11 + r00, r11 + r00, r11 + r00, r11 + r00) + XMVECTOR r11pr00 = _mm_add_ps(r11, r00); + XMVECTOR z2gew2 = _mm_cmple_ps(r11pr00, g_XMZero); + + // x^2 + y^2 >= z^2 + w^2 equivalent to r22 <= 0 + XMVECTOR x2py2gez2pw2 = _mm_cmple_ps(r22, g_XMZero); + + // (4*x^2, 4*y^2, 4*z^2, 4*w^2) + XMVECTOR t0 = XM_FMADD_PS(XMPMMP, r00, g_XMOne); + XMVECTOR t1 = _mm_mul_ps(XMMPMP, r11); + XMVECTOR t2 = XM_FMADD_PS(XMMMPP, r22, t0); + XMVECTOR x2y2z2w2 = _mm_add_ps(t1, t2); + + // (r01, r02, r12, r11) + t0 = _mm_shuffle_ps(r0, r1, _MM_SHUFFLE(1, 2, 2, 1)); + // (r10, r10, r20, r21) + t1 = _mm_shuffle_ps(r1, r2, _MM_SHUFFLE(1, 0, 0, 0)); + // (r10, r20, r21, r10) + t1 = XM_PERMUTE_PS(t1, _MM_SHUFFLE(1, 3, 2, 0)); + // (4*x*y, 4*x*z, 4*y*z, unused) + XMVECTOR xyxzyz = _mm_add_ps(t0, t1); + + // (r21, r20, r10, r10) + t0 = _mm_shuffle_ps(r2, r1, _MM_SHUFFLE(0, 0, 0, 1)); + // (r12, r12, r02, r01) + t1 = _mm_shuffle_ps(r1, r0, _MM_SHUFFLE(1, 2, 2, 2)); + // (r12, r02, r01, r12) + t1 = XM_PERMUTE_PS(t1, _MM_SHUFFLE(1, 3, 2, 0)); + // (4*x*w, 4*y*w, 4*z*w, unused) + XMVECTOR xwywzw = _mm_sub_ps(t0, t1); + xwywzw = _mm_mul_ps(XMMPMP, xwywzw); + + // (4*x^2, 4*y^2, 4*x*y, unused) + t0 = _mm_shuffle_ps(x2y2z2w2, xyxzyz, _MM_SHUFFLE(0, 0, 1, 0)); + // (4*z^2, 4*w^2, 4*z*w, unused) + t1 = _mm_shuffle_ps(x2y2z2w2, xwywzw, _MM_SHUFFLE(0, 2, 3, 2)); + // (4*x*z, 4*y*z, 4*x*w, 4*y*w) + t2 = _mm_shuffle_ps(xyxzyz, xwywzw, _MM_SHUFFLE(1, 0, 2, 1)); + + // (4*x*x, 4*x*y, 4*x*z, 4*x*w) + XMVECTOR tensor0 = _mm_shuffle_ps(t0, t2, _MM_SHUFFLE(2, 0, 2, 0)); + // (4*y*x, 4*y*y, 4*y*z, 4*y*w) + XMVECTOR tensor1 = _mm_shuffle_ps(t0, t2, _MM_SHUFFLE(3, 1, 1, 2)); + // (4*z*x, 4*z*y, 4*z*z, 4*z*w) + XMVECTOR tensor2 = _mm_shuffle_ps(t2, t1, _MM_SHUFFLE(2, 0, 1, 0)); + // (4*w*x, 4*w*y, 4*w*z, 4*w*w) + XMVECTOR tensor3 = _mm_shuffle_ps(t2, t1, _MM_SHUFFLE(1, 2, 3, 2)); + + // Select the row of the tensor-product matrix that has the largest + // magnitude. + t0 = _mm_and_ps(x2gey2, tensor0); + t1 = _mm_andnot_ps(x2gey2, tensor1); + t0 = _mm_or_ps(t0, t1); + t1 = _mm_and_ps(z2gew2, tensor2); + t2 = _mm_andnot_ps(z2gew2, tensor3); + t1 = _mm_or_ps(t1, t2); + t0 = _mm_and_ps(x2py2gez2pw2, t0); + t1 = _mm_andnot_ps(x2py2gez2pw2, t1); + t2 = _mm_or_ps(t0, t1); + + // Normalize the row. No division by zero is possible because the + // quaternion is unit-length (and the row is a nonzero multiple of + // the quaternion). + t0 = XMVector4Length(t2); + return _mm_div_ps(t2, t0); +#endif +} + +//------------------------------------------------------------------------------ +// Conversion operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMQuaternionToAxisAngle +( + XMVECTOR* pAxis, + float* pAngle, + FXMVECTOR Q +) noexcept +{ + assert(pAxis); + assert(pAngle); + + *pAxis = Q; + + *pAngle = 2.0f * XMScalarACos(XMVectorGetW(Q)); +} + +/**************************************************************************** + * + * Plane + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ +// Comparison operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMPlaneEqual +( + FXMVECTOR P1, + FXMVECTOR P2 +) noexcept +{ + return XMVector4Equal(P1, P2); +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMPlaneNearEqual +( + FXMVECTOR P1, + FXMVECTOR P2, + FXMVECTOR Epsilon +) noexcept +{ + XMVECTOR NP1 = XMPlaneNormalize(P1); + XMVECTOR NP2 = XMPlaneNormalize(P2); + return XMVector4NearEqual(NP1, NP2, Epsilon); +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMPlaneNotEqual +( + FXMVECTOR P1, + FXMVECTOR P2 +) noexcept +{ + return XMVector4NotEqual(P1, P2); +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMPlaneIsNaN(FXMVECTOR P) noexcept +{ + return XMVector4IsNaN(P); +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMPlaneIsInfinite(FXMVECTOR P) noexcept +{ + return XMVector4IsInfinite(P); +} + +//------------------------------------------------------------------------------ +// Computation operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMPlaneDot +( + FXMVECTOR P, + FXMVECTOR V +) noexcept +{ + return XMVector4Dot(P, V); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMPlaneDotCoord +( + FXMVECTOR P, + FXMVECTOR V +) noexcept +{ + // Result = P[0] * V[0] + P[1] * V[1] + P[2] * V[2] + P[3] + + XMVECTOR V3 = XMVectorSelect(g_XMOne.v, V, g_XMSelect1110.v); + XMVECTOR Result = XMVector4Dot(P, V3); + return Result; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMPlaneDotNormal +( + FXMVECTOR P, + FXMVECTOR V +) noexcept +{ + return XMVector3Dot(P, V); +} + +//------------------------------------------------------------------------------ +// XMPlaneNormalizeEst uses a reciprocal estimate and +// returns QNaN on zero and infinite vectors. + +inline XMVECTOR XM_CALLCONV XMPlaneNormalizeEst(FXMVECTOR P) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) + + XMVECTOR Result = XMVector3ReciprocalLengthEst(P); + return XMVectorMultiply(P, Result); + +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vTemp = _mm_dp_ps(P, P, 0x7f); + XMVECTOR vResult = _mm_rsqrt_ps(vTemp); + return _mm_mul_ps(vResult, P); +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product + XMVECTOR vDot = _mm_mul_ps(P, P); + // x=Dot.y, y=Dot.z + XMVECTOR vTemp = XM_PERMUTE_PS(vDot, _MM_SHUFFLE(2, 1, 2, 1)); + // Result.x = x+y + vDot = _mm_add_ss(vDot, vTemp); + // x=Dot.z + vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); + // Result.x = (x+y)+z + vDot = _mm_add_ss(vDot, vTemp); + // Splat x + vDot = XM_PERMUTE_PS(vDot, _MM_SHUFFLE(0, 0, 0, 0)); + // Get the reciprocal + vDot = _mm_rsqrt_ps(vDot); + // Get the reciprocal + vDot = _mm_mul_ps(vDot, P); + return vDot; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMPlaneNormalize(FXMVECTOR P) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + float fLengthSq = sqrtf((P.vector4_f32[0] * P.vector4_f32[0]) + (P.vector4_f32[1] * P.vector4_f32[1]) + (P.vector4_f32[2] * P.vector4_f32[2])); + // Prevent divide by zero + if (fLengthSq > 0) + { + fLengthSq = 1.0f / fLengthSq; + } + XMVECTORF32 vResult = { { { + P.vector4_f32[0] * fLengthSq, + P.vector4_f32[1] * fLengthSq, + P.vector4_f32[2] * fLengthSq, + P.vector4_f32[3] * fLengthSq + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + XMVECTOR vLength = XMVector3ReciprocalLength(P); + return XMVectorMultiply(P, vLength); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vLengthSq = _mm_dp_ps(P, P, 0x7f); + // Prepare for the division + XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); + // Failsafe on zero (Or epsilon) length planes + // If the length is infinity, set the elements to zero + vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); + // Reciprocal mul to perform the normalization + vResult = _mm_div_ps(P, vResult); + // Any that are infinity, set to zero + vResult = _mm_and_ps(vResult, vLengthSq); + return vResult; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product on x,y and z only + XMVECTOR vLengthSq = _mm_mul_ps(P, P); + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 1, 2, 1)); + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + // Prepare for the division + XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); + // Failsafe on zero (Or epsilon) length planes + // If the length is infinity, set the elements to zero + vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); + // Reciprocal mul to perform the normalization + vResult = _mm_div_ps(P, vResult); + // Any that are infinity, set to zero + vResult = _mm_and_ps(vResult, vLengthSq); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMPlaneIntersectLine +( + FXMVECTOR P, + FXMVECTOR LinePoint1, + FXMVECTOR LinePoint2 +) noexcept +{ + XMVECTOR V1 = XMVector3Dot(P, LinePoint1); + XMVECTOR V2 = XMVector3Dot(P, LinePoint2); + XMVECTOR D = XMVectorSubtract(V1, V2); + + XMVECTOR VT = XMPlaneDotCoord(P, LinePoint1); + VT = XMVectorDivide(VT, D); + + XMVECTOR Point = XMVectorSubtract(LinePoint2, LinePoint1); + Point = XMVectorMultiplyAdd(Point, VT, LinePoint1); + + const XMVECTOR Zero = XMVectorZero(); + XMVECTOR Control = XMVectorNearEqual(D, Zero, g_XMEpsilon.v); + + return XMVectorSelect(Point, g_XMQNaN.v, Control); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMPlaneIntersectPlane +( + XMVECTOR* pLinePoint1, + XMVECTOR* pLinePoint2, + FXMVECTOR P1, + FXMVECTOR P2 +) noexcept +{ + assert(pLinePoint1); + assert(pLinePoint2); + + XMVECTOR V1 = XMVector3Cross(P2, P1); + + XMVECTOR LengthSq = XMVector3LengthSq(V1); + + XMVECTOR V2 = XMVector3Cross(P2, V1); + + XMVECTOR P1W = XMVectorSplatW(P1); + XMVECTOR Point = XMVectorMultiply(V2, P1W); + + XMVECTOR V3 = XMVector3Cross(V1, P1); + + XMVECTOR P2W = XMVectorSplatW(P2); + Point = XMVectorMultiplyAdd(V3, P2W, Point); + + XMVECTOR LinePoint1 = XMVectorDivide(Point, LengthSq); + + XMVECTOR LinePoint2 = XMVectorAdd(LinePoint1, V1); + + XMVECTOR Control = XMVectorLessOrEqual(LengthSq, g_XMEpsilon.v); + *pLinePoint1 = XMVectorSelect(LinePoint1, g_XMQNaN.v, Control); + *pLinePoint2 = XMVectorSelect(LinePoint2, g_XMQNaN.v, Control); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMPlaneTransform +( + FXMVECTOR P, + FXMMATRIX ITM +) noexcept +{ + XMVECTOR W = XMVectorSplatW(P); + XMVECTOR Z = XMVectorSplatZ(P); + XMVECTOR Y = XMVectorSplatY(P); + XMVECTOR X = XMVectorSplatX(P); + + XMVECTOR Result = XMVectorMultiply(W, ITM.r[3]); + Result = XMVectorMultiplyAdd(Z, ITM.r[2], Result); + Result = XMVectorMultiplyAdd(Y, ITM.r[1], Result); + Result = XMVectorMultiplyAdd(X, ITM.r[0], Result); + return Result; +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMFLOAT4* XM_CALLCONV XMPlaneTransformStream +( + XMFLOAT4* pOutputStream, + size_t OutputStride, + const XMFLOAT4* pInputStream, + size_t InputStride, + size_t PlaneCount, + FXMMATRIX ITM +) noexcept +{ + return XMVector4TransformStream(pOutputStream, + OutputStride, + pInputStream, + InputStride, + PlaneCount, + ITM); +} + +//------------------------------------------------------------------------------ +// Conversion operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMPlaneFromPointNormal +( + FXMVECTOR Point, + FXMVECTOR Normal +) noexcept +{ + XMVECTOR W = XMVector3Dot(Point, Normal); + W = XMVectorNegate(W); + return XMVectorSelect(W, Normal, g_XMSelect1110.v); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMPlaneFromPoints +( + FXMVECTOR Point1, + FXMVECTOR Point2, + FXMVECTOR Point3 +) noexcept +{ + XMVECTOR V21 = XMVectorSubtract(Point1, Point2); + XMVECTOR V31 = XMVectorSubtract(Point1, Point3); + + XMVECTOR N = XMVector3Cross(V21, V31); + N = XMVector3Normalize(N); + + XMVECTOR D = XMPlaneDotNormal(N, Point1); + D = XMVectorNegate(D); + + XMVECTOR Result = XMVectorSelect(D, N, g_XMSelect1110.v); + + return Result; +} + +/**************************************************************************** + * + * Color + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ +// Comparison operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMColorEqual +( + FXMVECTOR C1, + FXMVECTOR C2 +) noexcept +{ + return XMVector4Equal(C1, C2); +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMColorNotEqual +( + FXMVECTOR C1, + FXMVECTOR C2 +) noexcept +{ + return XMVector4NotEqual(C1, C2); +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMColorGreater +( + FXMVECTOR C1, + FXMVECTOR C2 +) noexcept +{ + return XMVector4Greater(C1, C2); +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMColorGreaterOrEqual +( + FXMVECTOR C1, + FXMVECTOR C2 +) noexcept +{ + return XMVector4GreaterOrEqual(C1, C2); +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMColorLess +( + FXMVECTOR C1, + FXMVECTOR C2 +) noexcept +{ + return XMVector4Less(C1, C2); +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMColorLessOrEqual +( + FXMVECTOR C1, + FXMVECTOR C2 +) noexcept +{ + return XMVector4LessOrEqual(C1, C2); +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMColorIsNaN(FXMVECTOR C) noexcept +{ + return XMVector4IsNaN(C); +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMColorIsInfinite(FXMVECTOR C) noexcept +{ + return XMVector4IsInfinite(C); +} + +//------------------------------------------------------------------------------ +// Computation operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMColorNegative(FXMVECTOR vColor) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + 1.0f - vColor.vector4_f32[0], + 1.0f - vColor.vector4_f32[1], + 1.0f - vColor.vector4_f32[2], + vColor.vector4_f32[3] + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vTemp = veorq_u32(vreinterpretq_u32_f32(vColor), g_XMNegate3); + return vaddq_f32(vreinterpretq_f32_u32(vTemp), g_XMOne3); +#elif defined(_XM_SSE_INTRINSICS_) + // Negate only x,y and z. + XMVECTOR vTemp = _mm_xor_ps(vColor, g_XMNegate3); + // Add 1,1,1,0 to -x,-y,-z,w + return _mm_add_ps(vTemp, g_XMOne3); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMColorModulate +( + FXMVECTOR C1, + FXMVECTOR C2 +) noexcept +{ + return XMVectorMultiply(C1, C2); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMColorAdjustSaturation +( + FXMVECTOR vColor, + float fSaturation +) noexcept +{ + // Luminance = 0.2125f * C[0] + 0.7154f * C[1] + 0.0721f * C[2]; + // Result = (C - Luminance) * Saturation + Luminance; + + const XMVECTORF32 gvLuminance = { { { 0.2125f, 0.7154f, 0.0721f, 0.0f } } }; +#if defined(_XM_NO_INTRINSICS_) + float fLuminance = (vColor.vector4_f32[0] * gvLuminance.f[0]) + (vColor.vector4_f32[1] * gvLuminance.f[1]) + (vColor.vector4_f32[2] * gvLuminance.f[2]); + XMVECTOR vResult; + vResult.vector4_f32[0] = ((vColor.vector4_f32[0] - fLuminance) * fSaturation) + fLuminance; + vResult.vector4_f32[1] = ((vColor.vector4_f32[1] - fLuminance) * fSaturation) + fLuminance; + vResult.vector4_f32[2] = ((vColor.vector4_f32[2] - fLuminance) * fSaturation) + fLuminance; + vResult.vector4_f32[3] = vColor.vector4_f32[3]; + return vResult; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + XMVECTOR vLuminance = XMVector3Dot(vColor, gvLuminance); + XMVECTOR vResult = vsubq_f32(vColor, vLuminance); + vResult = vmlaq_n_f32(vLuminance, vResult, fSaturation); + return vbslq_f32(g_XMSelect1110, vResult, vColor); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vLuminance = XMVector3Dot(vColor, gvLuminance); + // Splat fSaturation + XMVECTOR vSaturation = _mm_set_ps1(fSaturation); + // vResult = ((vColor-vLuminance)*vSaturation)+vLuminance; + XMVECTOR vResult = _mm_sub_ps(vColor, vLuminance); + vResult = XM_FMADD_PS(vResult, vSaturation, vLuminance); + // Retain w from the source color + vLuminance = _mm_shuffle_ps(vResult, vColor, _MM_SHUFFLE(3, 2, 2, 2)); // x = vResult.z,y = vResult.z,z = vColor.z,w=vColor.w + vResult = _mm_shuffle_ps(vResult, vLuminance, _MM_SHUFFLE(3, 0, 1, 0)); // x = vResult.x,y = vResult.y,z = vResult.z,w=vColor.w + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMColorAdjustContrast +( + FXMVECTOR vColor, + float fContrast +) noexcept +{ + // Result = (vColor - 0.5f) * fContrast + 0.5f; + +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + ((vColor.vector4_f32[0] - 0.5f) * fContrast) + 0.5f, + ((vColor.vector4_f32[1] - 0.5f) * fContrast) + 0.5f, + ((vColor.vector4_f32[2] - 0.5f) * fContrast) + 0.5f, + vColor.vector4_f32[3] // Leave W untouched + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + XMVECTOR vResult = vsubq_f32(vColor, g_XMOneHalf.v); + vResult = vmlaq_n_f32(g_XMOneHalf.v, vResult, fContrast); + return vbslq_f32(g_XMSelect1110, vResult, vColor); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vScale = _mm_set_ps1(fContrast); // Splat the scale + XMVECTOR vResult = _mm_sub_ps(vColor, g_XMOneHalf); // Subtract 0.5f from the source (Saving source) + vResult = XM_FMADD_PS(vResult, vScale, g_XMOneHalf); +// Retain w from the source color + vScale = _mm_shuffle_ps(vResult, vColor, _MM_SHUFFLE(3, 2, 2, 2)); // x = vResult.z,y = vResult.z,z = vColor.z,w=vColor.w + vResult = _mm_shuffle_ps(vResult, vScale, _MM_SHUFFLE(3, 0, 1, 0)); // x = vResult.x,y = vResult.y,z = vResult.z,w=vColor.w + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMColorRGBToHSL(FXMVECTOR rgb) noexcept +{ + XMVECTOR r = XMVectorSplatX(rgb); + XMVECTOR g = XMVectorSplatY(rgb); + XMVECTOR b = XMVectorSplatZ(rgb); + + XMVECTOR min = XMVectorMin(r, XMVectorMin(g, b)); + XMVECTOR max = XMVectorMax(r, XMVectorMax(g, b)); + + XMVECTOR l = XMVectorMultiply(XMVectorAdd(min, max), g_XMOneHalf); + + XMVECTOR d = XMVectorSubtract(max, min); + + XMVECTOR la = XMVectorSelect(rgb, l, g_XMSelect1110); + + if (XMVector3Less(d, g_XMEpsilon)) + { + // Achromatic, assume H and S of 0 + return XMVectorSelect(la, g_XMZero, g_XMSelect1100); + } + else + { + XMVECTOR s, h; + + XMVECTOR d2 = XMVectorAdd(min, max); + + if (XMVector3Greater(l, g_XMOneHalf)) + { + // d / (2-max-min) + s = XMVectorDivide(d, XMVectorSubtract(g_XMTwo, d2)); + } + else + { + // d / (max+min) + s = XMVectorDivide(d, d2); + } + + if (XMVector3Equal(r, max)) + { + // Red is max + h = XMVectorDivide(XMVectorSubtract(g, b), d); + } + else if (XMVector3Equal(g, max)) + { + // Green is max + h = XMVectorDivide(XMVectorSubtract(b, r), d); + h = XMVectorAdd(h, g_XMTwo); + } + else + { + // Blue is max + h = XMVectorDivide(XMVectorSubtract(r, g), d); + h = XMVectorAdd(h, g_XMFour); + } + + h = XMVectorDivide(h, g_XMSix); + + if (XMVector3Less(h, g_XMZero)) + h = XMVectorAdd(h, g_XMOne); + + XMVECTOR lha = XMVectorSelect(la, h, g_XMSelect1100); + return XMVectorSelect(s, lha, g_XMSelect1011); + } +} + +//------------------------------------------------------------------------------ + +namespace MathInternal +{ + + inline XMVECTOR XM_CALLCONV XMColorHue2Clr(FXMVECTOR p, FXMVECTOR q, FXMVECTOR h) noexcept + { + static const XMVECTORF32 oneSixth = { { { 1.0f / 6.0f, 1.0f / 6.0f, 1.0f / 6.0f, 1.0f / 6.0f } } }; + static const XMVECTORF32 twoThirds = { { { 2.0f / 3.0f, 2.0f / 3.0f, 2.0f / 3.0f, 2.0f / 3.0f } } }; + + XMVECTOR t = h; + + if (XMVector3Less(t, g_XMZero)) + t = XMVectorAdd(t, g_XMOne); + + if (XMVector3Greater(t, g_XMOne)) + t = XMVectorSubtract(t, g_XMOne); + + if (XMVector3Less(t, oneSixth)) + { + // p + (q - p) * 6 * t + XMVECTOR t1 = XMVectorSubtract(q, p); + XMVECTOR t2 = XMVectorMultiply(g_XMSix, t); + return XMVectorMultiplyAdd(t1, t2, p); + } + + if (XMVector3Less(t, g_XMOneHalf)) + return q; + + if (XMVector3Less(t, twoThirds)) + { + // p + (q - p) * 6 * (2/3 - t) + XMVECTOR t1 = XMVectorSubtract(q, p); + XMVECTOR t2 = XMVectorMultiply(g_XMSix, XMVectorSubtract(twoThirds, t)); + return XMVectorMultiplyAdd(t1, t2, p); + } + + return p; + } + +} // namespace MathInternal + +inline XMVECTOR XM_CALLCONV XMColorHSLToRGB(FXMVECTOR hsl) noexcept +{ + static const XMVECTORF32 oneThird = { { { 1.0f / 3.0f, 1.0f / 3.0f, 1.0f / 3.0f, 1.0f / 3.0f } } }; + + XMVECTOR s = XMVectorSplatY(hsl); + XMVECTOR l = XMVectorSplatZ(hsl); + + if (XMVector3NearEqual(s, g_XMZero, g_XMEpsilon)) + { + // Achromatic + return XMVectorSelect(hsl, l, g_XMSelect1110); + } + else + { + XMVECTOR h = XMVectorSplatX(hsl); + + XMVECTOR q; + if (XMVector3Less(l, g_XMOneHalf)) + { + q = XMVectorMultiply(l, XMVectorAdd(g_XMOne, s)); + } + else + { + q = XMVectorSubtract(XMVectorAdd(l, s), XMVectorMultiply(l, s)); + } + + XMVECTOR p = XMVectorSubtract(XMVectorMultiply(g_XMTwo, l), q); + + XMVECTOR r = DirectX::MathInternal::XMColorHue2Clr(p, q, XMVectorAdd(h, oneThird)); + XMVECTOR g = DirectX::MathInternal::XMColorHue2Clr(p, q, h); + XMVECTOR b = DirectX::MathInternal::XMColorHue2Clr(p, q, XMVectorSubtract(h, oneThird)); + + XMVECTOR rg = XMVectorSelect(g, r, g_XMSelect1000); + XMVECTOR ba = XMVectorSelect(hsl, b, g_XMSelect1110); + + return XMVectorSelect(ba, rg, g_XMSelect1100); + } +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMColorRGBToHSV(FXMVECTOR rgb) noexcept +{ + XMVECTOR r = XMVectorSplatX(rgb); + XMVECTOR g = XMVectorSplatY(rgb); + XMVECTOR b = XMVectorSplatZ(rgb); + + XMVECTOR min = XMVectorMin(r, XMVectorMin(g, b)); + XMVECTOR v = XMVectorMax(r, XMVectorMax(g, b)); + + XMVECTOR d = XMVectorSubtract(v, min); + + XMVECTOR s = (XMVector3NearEqual(v, g_XMZero, g_XMEpsilon)) ? g_XMZero : XMVectorDivide(d, v); + + if (XMVector3Less(d, g_XMEpsilon)) + { + // Achromatic, assume H of 0 + XMVECTOR hv = XMVectorSelect(v, g_XMZero, g_XMSelect1000); + XMVECTOR hva = XMVectorSelect(rgb, hv, g_XMSelect1110); + return XMVectorSelect(s, hva, g_XMSelect1011); + } + else + { + XMVECTOR h; + + if (XMVector3Equal(r, v)) + { + // Red is max + h = XMVectorDivide(XMVectorSubtract(g, b), d); + + if (XMVector3Less(g, b)) + h = XMVectorAdd(h, g_XMSix); + } + else if (XMVector3Equal(g, v)) + { + // Green is max + h = XMVectorDivide(XMVectorSubtract(b, r), d); + h = XMVectorAdd(h, g_XMTwo); + } + else + { + // Blue is max + h = XMVectorDivide(XMVectorSubtract(r, g), d); + h = XMVectorAdd(h, g_XMFour); + } + + h = XMVectorDivide(h, g_XMSix); + + XMVECTOR hv = XMVectorSelect(v, h, g_XMSelect1000); + XMVECTOR hva = XMVectorSelect(rgb, hv, g_XMSelect1110); + return XMVectorSelect(s, hva, g_XMSelect1011); + } +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMColorHSVToRGB(FXMVECTOR hsv) noexcept +{ + XMVECTOR h = XMVectorSplatX(hsv); + XMVECTOR s = XMVectorSplatY(hsv); + XMVECTOR v = XMVectorSplatZ(hsv); + + XMVECTOR h6 = XMVectorMultiply(h, g_XMSix); + + XMVECTOR i = XMVectorFloor(h6); + XMVECTOR f = XMVectorSubtract(h6, i); + + // p = v* (1-s) + XMVECTOR p = XMVectorMultiply(v, XMVectorSubtract(g_XMOne, s)); + + // q = v*(1-f*s) + XMVECTOR q = XMVectorMultiply(v, XMVectorSubtract(g_XMOne, XMVectorMultiply(f, s))); + + // t = v*(1 - (1-f)*s) + XMVECTOR t = XMVectorMultiply(v, XMVectorSubtract(g_XMOne, XMVectorMultiply(XMVectorSubtract(g_XMOne, f), s))); + + auto ii = static_cast(XMVectorGetX(XMVectorMod(i, g_XMSix))); + + XMVECTOR _rgb; + + switch (ii) + { + case 0: // rgb = vtp + { + XMVECTOR vt = XMVectorSelect(t, v, g_XMSelect1000); + _rgb = XMVectorSelect(p, vt, g_XMSelect1100); + } + break; + case 1: // rgb = qvp + { + XMVECTOR qv = XMVectorSelect(v, q, g_XMSelect1000); + _rgb = XMVectorSelect(p, qv, g_XMSelect1100); + } + break; + case 2: // rgb = pvt + { + XMVECTOR pv = XMVectorSelect(v, p, g_XMSelect1000); + _rgb = XMVectorSelect(t, pv, g_XMSelect1100); + } + break; + case 3: // rgb = pqv + { + XMVECTOR pq = XMVectorSelect(q, p, g_XMSelect1000); + _rgb = XMVectorSelect(v, pq, g_XMSelect1100); + } + break; + case 4: // rgb = tpv + { + XMVECTOR tp = XMVectorSelect(p, t, g_XMSelect1000); + _rgb = XMVectorSelect(v, tp, g_XMSelect1100); + } + break; + default: // rgb = vpq + { + XMVECTOR vp = XMVectorSelect(p, v, g_XMSelect1000); + _rgb = XMVectorSelect(q, vp, g_XMSelect1100); + } + break; + } + + return XMVectorSelect(hsv, _rgb, g_XMSelect1110); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMColorRGBToYUV(FXMVECTOR rgb) noexcept +{ + static const XMVECTORF32 Scale0 = { { { 0.299f, -0.147f, 0.615f, 0.0f } } }; + static const XMVECTORF32 Scale1 = { { { 0.587f, -0.289f, -0.515f, 0.0f } } }; + static const XMVECTORF32 Scale2 = { { { 0.114f, 0.436f, -0.100f, 0.0f } } }; + + XMMATRIX M(Scale0, Scale1, Scale2, g_XMZero); + XMVECTOR clr = XMVector3Transform(rgb, M); + + return XMVectorSelect(rgb, clr, g_XMSelect1110); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMColorYUVToRGB(FXMVECTOR yuv) noexcept +{ + static const XMVECTORF32 Scale1 = { { { 0.0f, -0.395f, 2.032f, 0.0f } } }; + static const XMVECTORF32 Scale2 = { { { 1.140f, -0.581f, 0.0f, 0.0f } } }; + + XMMATRIX M(g_XMOne, Scale1, Scale2, g_XMZero); + XMVECTOR clr = XMVector3Transform(yuv, M); + + return XMVectorSelect(yuv, clr, g_XMSelect1110); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMColorRGBToYUV_HD(FXMVECTOR rgb) noexcept +{ + static const XMVECTORF32 Scale0 = { { { 0.2126f, -0.0997f, 0.6150f, 0.0f } } }; + static const XMVECTORF32 Scale1 = { { { 0.7152f, -0.3354f, -0.5586f, 0.0f } } }; + static const XMVECTORF32 Scale2 = { { { 0.0722f, 0.4351f, -0.0564f, 0.0f } } }; + + XMMATRIX M(Scale0, Scale1, Scale2, g_XMZero); + XMVECTOR clr = XMVector3Transform(rgb, M); + + return XMVectorSelect(rgb, clr, g_XMSelect1110); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMColorYUVToRGB_HD(FXMVECTOR yuv) noexcept +{ + static const XMVECTORF32 Scale1 = { { { 0.0f, -0.2153f, 2.1324f, 0.0f } } }; + static const XMVECTORF32 Scale2 = { { { 1.2803f, -0.3806f, 0.0f, 0.0f } } }; + + XMMATRIX M(g_XMOne, Scale1, Scale2, g_XMZero); + XMVECTOR clr = XMVector3Transform(yuv, M); + + return XMVectorSelect(yuv, clr, g_XMSelect1110); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMColorRGBToYUV_UHD(FXMVECTOR rgb) noexcept +{ + static const XMVECTORF32 Scale0 = { { { 0.2627f, -0.1215f, 0.6150f, 0.0f } } }; + static const XMVECTORF32 Scale1 = { { { 0.6780f, -0.3136f, -0.5655f, 0.0f } } }; + static const XMVECTORF32 Scale2 = { { { 0.0593f, 0.4351f, -0.0495f, 0.0f } } }; + + XMMATRIX M(Scale0, Scale1, Scale2, g_XMZero); + XMVECTOR clr = XMVector3Transform(rgb, M); + + return XMVectorSelect(rgb, clr, g_XMSelect1110); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMColorYUVToRGB_UHD(FXMVECTOR yuv) noexcept +{ + static const XMVECTORF32 Scale1 = { { { 0.0f, -0.1891f, 2.1620f, 0.0f } } }; + static const XMVECTORF32 Scale2 = { { { 1.1989f, -0.4645f, 0.0f, 0.0f } } }; + + XMMATRIX M(g_XMOne, Scale1, Scale2, g_XMZero); + XMVECTOR clr = XMVector3Transform(yuv, M); + + return XMVectorSelect(yuv, clr, g_XMSelect1110); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMColorRGBToXYZ(FXMVECTOR rgb) noexcept +{ + static const XMVECTORF32 Scale0 = { { { 0.4887180f, 0.1762044f, 0.0000000f, 0.0f } } }; + static const XMVECTORF32 Scale1 = { { { 0.3106803f, 0.8129847f, 0.0102048f, 0.0f } } }; + static const XMVECTORF32 Scale2 = { { { 0.2006017f, 0.0108109f, 0.9897952f, 0.0f } } }; + static const XMVECTORF32 Scale = { { { 1.f / 0.17697f, 1.f / 0.17697f, 1.f / 0.17697f, 0.0f } } }; + + XMMATRIX M(Scale0, Scale1, Scale2, g_XMZero); + XMVECTOR clr = XMVectorMultiply(XMVector3Transform(rgb, M), Scale); + + return XMVectorSelect(rgb, clr, g_XMSelect1110); +} + +inline XMVECTOR XM_CALLCONV XMColorXYZToRGB(FXMVECTOR xyz) noexcept +{ + static const XMVECTORF32 Scale0 = { { { 2.3706743f, -0.5138850f, 0.0052982f, 0.0f } } }; + static const XMVECTORF32 Scale1 = { { { -0.9000405f, 1.4253036f, -0.0146949f, 0.0f } } }; + static const XMVECTORF32 Scale2 = { { { -0.4706338f, 0.0885814f, 1.0093968f, 0.0f } } }; + static const XMVECTORF32 Scale = { { { 0.17697f, 0.17697f, 0.17697f, 0.0f } } }; + + XMMATRIX M(Scale0, Scale1, Scale2, g_XMZero); + XMVECTOR clr = XMVector3Transform(XMVectorMultiply(xyz, Scale), M); + + return XMVectorSelect(xyz, clr, g_XMSelect1110); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMColorXYZToSRGB(FXMVECTOR xyz) noexcept +{ + static const XMVECTORF32 Scale0 = { { { 3.2406f, -0.9689f, 0.0557f, 0.0f } } }; + static const XMVECTORF32 Scale1 = { { { -1.5372f, 1.8758f, -0.2040f, 0.0f } } }; + static const XMVECTORF32 Scale2 = { { { -0.4986f, 0.0415f, 1.0570f, 0.0f } } }; + static const XMVECTORF32 Cutoff = { { { 0.0031308f, 0.0031308f, 0.0031308f, 0.0f } } }; + static const XMVECTORF32 Exp = { { { 1.0f / 2.4f, 1.0f / 2.4f, 1.0f / 2.4f, 1.0f } } }; + + XMMATRIX M(Scale0, Scale1, Scale2, g_XMZero); + XMVECTOR lclr = XMVector3Transform(xyz, M); + + XMVECTOR sel = XMVectorGreater(lclr, Cutoff); + + // clr = 12.92 * lclr for lclr <= 0.0031308f + XMVECTOR smallC = XMVectorMultiply(lclr, g_XMsrgbScale); + + // clr = (1+a)*pow(lclr, 1/2.4) - a for lclr > 0.0031308 (where a = 0.055) + XMVECTOR largeC = XMVectorSubtract(XMVectorMultiply(g_XMsrgbA1, XMVectorPow(lclr, Exp)), g_XMsrgbA); + + XMVECTOR clr = XMVectorSelect(smallC, largeC, sel); + + return XMVectorSelect(xyz, clr, g_XMSelect1110); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMColorSRGBToXYZ(FXMVECTOR srgb) noexcept +{ + static const XMVECTORF32 Scale0 = { { { 0.4124f, 0.2126f, 0.0193f, 0.0f } } }; + static const XMVECTORF32 Scale1 = { { { 0.3576f, 0.7152f, 0.1192f, 0.0f } } }; + static const XMVECTORF32 Scale2 = { { { 0.1805f, 0.0722f, 0.9505f, 0.0f } } }; + static const XMVECTORF32 Cutoff = { { { 0.04045f, 0.04045f, 0.04045f, 0.0f } } }; + static const XMVECTORF32 Exp = { { { 2.4f, 2.4f, 2.4f, 1.0f } } }; + + XMVECTOR sel = XMVectorGreater(srgb, Cutoff); + + // lclr = clr / 12.92 + XMVECTOR smallC = XMVectorDivide(srgb, g_XMsrgbScale); + + // lclr = pow( (clr + a) / (1+a), 2.4 ) + XMVECTOR largeC = XMVectorPow(XMVectorDivide(XMVectorAdd(srgb, g_XMsrgbA), g_XMsrgbA1), Exp); + + XMVECTOR lclr = XMVectorSelect(smallC, largeC, sel); + + XMMATRIX M(Scale0, Scale1, Scale2, g_XMZero); + XMVECTOR clr = XMVector3Transform(lclr, M); + + return XMVectorSelect(srgb, clr, g_XMSelect1110); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMColorRGBToSRGB(FXMVECTOR rgb) noexcept +{ + static const XMVECTORF32 Cutoff = { { { 0.0031308f, 0.0031308f, 0.0031308f, 1.f } } }; + static const XMVECTORF32 Linear = { { { 12.92f, 12.92f, 12.92f, 1.f } } }; + static const XMVECTORF32 Scale = { { { 1.055f, 1.055f, 1.055f, 1.f } } }; + static const XMVECTORF32 Bias = { { { 0.055f, 0.055f, 0.055f, 0.f } } }; + static const XMVECTORF32 InvGamma = { { { 1.0f / 2.4f, 1.0f / 2.4f, 1.0f / 2.4f, 1.f } } }; + + XMVECTOR V = XMVectorSaturate(rgb); + XMVECTOR V0 = XMVectorMultiply(V, Linear); + XMVECTOR V1 = XMVectorSubtract(XMVectorMultiply(Scale, XMVectorPow(V, InvGamma)), Bias); + XMVECTOR select = XMVectorLess(V, Cutoff); + V = XMVectorSelect(V1, V0, select); + return XMVectorSelect(rgb, V, g_XMSelect1110); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMColorSRGBToRGB(FXMVECTOR srgb) noexcept +{ + static const XMVECTORF32 Cutoff = { { { 0.04045f, 0.04045f, 0.04045f, 1.f } } }; + static const XMVECTORF32 ILinear = { { { 1.f / 12.92f, 1.f / 12.92f, 1.f / 12.92f, 1.f } } }; + static const XMVECTORF32 Scale = { { { 1.f / 1.055f, 1.f / 1.055f, 1.f / 1.055f, 1.f } } }; + static const XMVECTORF32 Bias = { { { 0.055f, 0.055f, 0.055f, 0.f } } }; + static const XMVECTORF32 Gamma = { { { 2.4f, 2.4f, 2.4f, 1.f } } }; + + XMVECTOR V = XMVectorSaturate(srgb); + XMVECTOR V0 = XMVectorMultiply(V, ILinear); + XMVECTOR V1 = XMVectorPow(XMVectorMultiply(XMVectorAdd(V, Bias), Scale), Gamma); + XMVECTOR select = XMVectorGreater(V, Cutoff); + V = XMVectorSelect(V0, V1, select); + return XMVectorSelect(srgb, V, g_XMSelect1110); +} + +/**************************************************************************** + * + * Miscellaneous + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline bool XMVerifyCPUSupport() noexcept +{ +#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + int CPUInfo[4] = { -1 }; +#if (defined(__clang__) || defined(__GNUC__)) && defined(__cpuid) + __cpuid(0, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); +#else + __cpuid(CPUInfo, 0); +#endif + +#ifdef __AVX2__ + if (CPUInfo[0] < 7) + return false; +#else + if (CPUInfo[0] < 1) + return false; +#endif + +#if (defined(__clang__) || defined(__GNUC__)) && defined(__cpuid) + __cpuid(1, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); +#else + __cpuid(CPUInfo, 1); +#endif + +#if defined(__AVX2__) || defined(_XM_AVX2_INTRINSICS_) + // The compiler can emit FMA3 instructions even without explicit intrinsics use + if ((CPUInfo[2] & 0x38081001) != 0x38081001) + return false; // No F16C/AVX/OSXSAVE/SSE4.1/FMA3/SSE3 support +#elif defined(_XM_FMA3_INTRINSICS_) && defined(_XM_F16C_INTRINSICS_) + if ((CPUInfo[2] & 0x38081001) != 0x38081001) + return false; // No F16C/AVX/OSXSAVE/SSE4.1/FMA3/SSE3 support +#elif defined(_XM_FMA3_INTRINSICS_) + if ((CPUInfo[2] & 0x18081001) != 0x18081001) + return false; // No AVX/OSXSAVE/SSE4.1/FMA3/SSE3 support +#elif defined(_XM_F16C_INTRINSICS_) + if ((CPUInfo[2] & 0x38080001) != 0x38080001) + return false; // No F16C/AVX/OSXSAVE/SSE4.1/SSE3 support +#elif defined(__AVX__) || defined(_XM_AVX_INTRINSICS_) + if ((CPUInfo[2] & 0x18080001) != 0x18080001) + return false; // No AVX/OSXSAVE/SSE4.1/SSE3 support +#elif defined(_XM_SSE4_INTRINSICS_) + if ((CPUInfo[2] & 0x80001) != 0x80001) + return false; // No SSE3/SSE4.1 support +#elif defined(_XM_SSE3_INTRINSICS_) + if (!(CPUInfo[2] & 0x1)) + return false; // No SSE3 support +#endif + + // The x64 processor model requires SSE2 support, but no harm in checking + if ((CPUInfo[3] & 0x6000000) != 0x6000000) + return false; // No SSE2/SSE support + +#if defined(__AVX2__) || defined(_XM_AVX2_INTRINSICS_) +#if defined(__clang__) || defined(__GNUC__) + __cpuid_count(7, 0, CPUInfo[0], CPUInfo[1], CPUInfo[2], CPUInfo[3]); +#else + __cpuidex(CPUInfo, 7, 0); +#endif + if (!(CPUInfo[1] & 0x20)) + return false; // No AVX2 support +#endif + + return true; +#elif defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + // ARM-NEON support is required for the Windows on ARM platform + return true; +#else + // No intrinsics path always supported + return true; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMFresnelTerm +( + FXMVECTOR CosIncidentAngle, + FXMVECTOR RefractionIndex +) noexcept +{ + assert(!XMVector4IsInfinite(CosIncidentAngle)); + + // Result = 0.5f * (g - c)^2 / (g + c)^2 * ((c * (g + c) - 1)^2 / (c * (g - c) + 1)^2 + 1) where + // c = CosIncidentAngle + // g = sqrt(c^2 + RefractionIndex^2 - 1) + +#if defined(_XM_NO_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) + + XMVECTOR G = XMVectorMultiplyAdd(RefractionIndex, RefractionIndex, g_XMNegativeOne.v); + G = XMVectorMultiplyAdd(CosIncidentAngle, CosIncidentAngle, G); + G = XMVectorAbs(G); + G = XMVectorSqrt(G); + + XMVECTOR S = XMVectorAdd(G, CosIncidentAngle); + XMVECTOR D = XMVectorSubtract(G, CosIncidentAngle); + + XMVECTOR V0 = XMVectorMultiply(D, D); + XMVECTOR V1 = XMVectorMultiply(S, S); + V1 = XMVectorReciprocal(V1); + V0 = XMVectorMultiply(g_XMOneHalf.v, V0); + V0 = XMVectorMultiply(V0, V1); + + XMVECTOR V2 = XMVectorMultiplyAdd(CosIncidentAngle, S, g_XMNegativeOne.v); + XMVECTOR V3 = XMVectorMultiplyAdd(CosIncidentAngle, D, g_XMOne.v); + V2 = XMVectorMultiply(V2, V2); + V3 = XMVectorMultiply(V3, V3); + V3 = XMVectorReciprocal(V3); + V2 = XMVectorMultiplyAdd(V2, V3, g_XMOne.v); + + XMVECTOR Result = XMVectorMultiply(V0, V2); + + Result = XMVectorSaturate(Result); + + return Result; + +#elif defined(_XM_SSE_INTRINSICS_) + // G = sqrt(abs((RefractionIndex^2-1) + CosIncidentAngle^2)) + XMVECTOR G = _mm_mul_ps(RefractionIndex, RefractionIndex); + XMVECTOR vTemp = _mm_mul_ps(CosIncidentAngle, CosIncidentAngle); + G = _mm_sub_ps(G, g_XMOne); + vTemp = _mm_add_ps(vTemp, G); + // max((0-vTemp),vTemp) == abs(vTemp) + // The abs is needed to deal with refraction and cosine being zero + G = _mm_setzero_ps(); + G = _mm_sub_ps(G, vTemp); + G = _mm_max_ps(G, vTemp); + // Last operation, the sqrt() + G = _mm_sqrt_ps(G); + + // Calc G-C and G+C + XMVECTOR GAddC = _mm_add_ps(G, CosIncidentAngle); + XMVECTOR GSubC = _mm_sub_ps(G, CosIncidentAngle); + // Perform the term (0.5f *(g - c)^2) / (g + c)^2 + XMVECTOR vResult = _mm_mul_ps(GSubC, GSubC); + vTemp = _mm_mul_ps(GAddC, GAddC); + vResult = _mm_mul_ps(vResult, g_XMOneHalf); + vResult = _mm_div_ps(vResult, vTemp); + // Perform the term ((c * (g + c) - 1)^2 / (c * (g - c) + 1)^2 + 1) + GAddC = _mm_mul_ps(GAddC, CosIncidentAngle); + GSubC = _mm_mul_ps(GSubC, CosIncidentAngle); + GAddC = _mm_sub_ps(GAddC, g_XMOne); + GSubC = _mm_add_ps(GSubC, g_XMOne); + GAddC = _mm_mul_ps(GAddC, GAddC); + GSubC = _mm_mul_ps(GSubC, GSubC); + GAddC = _mm_div_ps(GAddC, GSubC); + GAddC = _mm_add_ps(GAddC, g_XMOne); + // Multiply the two term parts + vResult = _mm_mul_ps(vResult, GAddC); + // Clamp to 0.0 - 1.0f + vResult = _mm_max_ps(vResult, g_XMZero); + vResult = _mm_min_ps(vResult, g_XMOne); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XMScalarNearEqual +( + float S1, + float S2, + float Epsilon +) noexcept +{ + float Delta = S1 - S2; + return (fabsf(Delta) <= Epsilon); +} + +//------------------------------------------------------------------------------ +// Modulo the range of the given angle such that -XM_PI <= Angle < XM_PI +inline float XMScalarModAngle(float Angle) noexcept +{ + // Note: The modulo is performed with unsigned math only to work + // around a precision error on numbers that are close to PI + + // Normalize the range from 0.0f to XM_2PI + Angle = Angle + XM_PI; + // Perform the modulo, unsigned + float fTemp = fabsf(Angle); + fTemp = fTemp - (XM_2PI * static_cast(static_cast(fTemp / XM_2PI))); + // Restore the number to the range of -XM_PI to XM_PI-epsilon + fTemp = fTemp - XM_PI; + // If the modulo'd value was negative, restore negation + if (Angle < 0.0f) + { + fTemp = -fTemp; + } + return fTemp; +} + +//------------------------------------------------------------------------------ + +inline float XMScalarSin(float Value) noexcept +{ + // Map Value to y in [-pi,pi], x = 2*pi*quotient + remainder. + float quotient = XM_1DIV2PI * Value; + if (Value >= 0.0f) + { + quotient = static_cast(static_cast(quotient + 0.5f)); + } + else + { + quotient = static_cast(static_cast(quotient - 0.5f)); + } + float y = Value - XM_2PI * quotient; + + // Map y to [-pi/2,pi/2] with sin(y) = sin(Value). + if (y > XM_PIDIV2) + { + y = XM_PI - y; + } + else if (y < -XM_PIDIV2) + { + y = -XM_PI - y; + } + + // 11-degree minimax approximation + float y2 = y * y; + return (((((-2.3889859e-08f * y2 + 2.7525562e-06f) * y2 - 0.00019840874f) * y2 + 0.0083333310f) * y2 - 0.16666667f) * y2 + 1.0f) * y; +} + +//------------------------------------------------------------------------------ + +inline float XMScalarSinEst(float Value) noexcept +{ + // Map Value to y in [-pi,pi], x = 2*pi*quotient + remainder. + float quotient = XM_1DIV2PI * Value; + if (Value >= 0.0f) + { + quotient = static_cast(static_cast(quotient + 0.5f)); + } + else + { + quotient = static_cast(static_cast(quotient - 0.5f)); + } + float y = Value - XM_2PI * quotient; + + // Map y to [-pi/2,pi/2] with sin(y) = sin(Value). + if (y > XM_PIDIV2) + { + y = XM_PI - y; + } + else if (y < -XM_PIDIV2) + { + y = -XM_PI - y; + } + + // 7-degree minimax approximation + float y2 = y * y; + return (((-0.00018524670f * y2 + 0.0083139502f) * y2 - 0.16665852f) * y2 + 1.0f) * y; +} + +//------------------------------------------------------------------------------ + +inline float XMScalarCos(float Value) noexcept +{ + // Map Value to y in [-pi,pi], x = 2*pi*quotient + remainder. + float quotient = XM_1DIV2PI * Value; + if (Value >= 0.0f) + { + quotient = static_cast(static_cast(quotient + 0.5f)); + } + else + { + quotient = static_cast(static_cast(quotient - 0.5f)); + } + float y = Value - XM_2PI * quotient; + + // Map y to [-pi/2,pi/2] with cos(y) = sign*cos(x). + float sign; + if (y > XM_PIDIV2) + { + y = XM_PI - y; + sign = -1.0f; + } + else if (y < -XM_PIDIV2) + { + y = -XM_PI - y; + sign = -1.0f; + } + else + { + sign = +1.0f; + } + + // 10-degree minimax approximation + float y2 = y * y; + float p = ((((-2.6051615e-07f * y2 + 2.4760495e-05f) * y2 - 0.0013888378f) * y2 + 0.041666638f) * y2 - 0.5f) * y2 + 1.0f; + return sign * p; +} + +//------------------------------------------------------------------------------ + +inline float XMScalarCosEst(float Value) noexcept +{ + // Map Value to y in [-pi,pi], x = 2*pi*quotient + remainder. + float quotient = XM_1DIV2PI * Value; + if (Value >= 0.0f) + { + quotient = static_cast(static_cast(quotient + 0.5f)); + } + else + { + quotient = static_cast(static_cast(quotient - 0.5f)); + } + float y = Value - XM_2PI * quotient; + + // Map y to [-pi/2,pi/2] with cos(y) = sign*cos(x). + float sign; + if (y > XM_PIDIV2) + { + y = XM_PI - y; + sign = -1.0f; + } + else if (y < -XM_PIDIV2) + { + y = -XM_PI - y; + sign = -1.0f; + } + else + { + sign = +1.0f; + } + + // 6-degree minimax approximation + float y2 = y * y; + float p = ((-0.0012712436f * y2 + 0.041493919f) * y2 - 0.49992746f) * y2 + 1.0f; + return sign * p; +} + +//------------------------------------------------------------------------------ + +_Use_decl_annotations_ +inline void XMScalarSinCos +( + float* pSin, + float* pCos, + float Value +) noexcept +{ + assert(pSin); + assert(pCos); + + // Map Value to y in [-pi,pi], x = 2*pi*quotient + remainder. + float quotient = XM_1DIV2PI * Value; + if (Value >= 0.0f) + { + quotient = static_cast(static_cast(quotient + 0.5f)); + } + else + { + quotient = static_cast(static_cast(quotient - 0.5f)); + } + float y = Value - XM_2PI * quotient; + + // Map y to [-pi/2,pi/2] with sin(y) = sin(Value). + float sign; + if (y > XM_PIDIV2) + { + y = XM_PI - y; + sign = -1.0f; + } + else if (y < -XM_PIDIV2) + { + y = -XM_PI - y; + sign = -1.0f; + } + else + { + sign = +1.0f; + } + + float y2 = y * y; + + // 11-degree minimax approximation + *pSin = (((((-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; + *pCos = sign * p; +} + +//------------------------------------------------------------------------------ + +_Use_decl_annotations_ +inline void XMScalarSinCosEst +( + float* pSin, + float* pCos, + float Value +) noexcept +{ + assert(pSin); + assert(pCos); + + // Map Value to y in [-pi,pi], x = 2*pi*quotient + remainder. + float quotient = XM_1DIV2PI * Value; + if (Value >= 0.0f) + { + quotient = static_cast(static_cast(quotient + 0.5f)); + } + else + { + quotient = static_cast(static_cast(quotient - 0.5f)); + } + float y = Value - XM_2PI * quotient; + + // Map y to [-pi/2,pi/2] with sin(y) = sin(Value). + float sign; + if (y > XM_PIDIV2) + { + y = XM_PI - y; + sign = -1.0f; + } + else if (y < -XM_PIDIV2) + { + y = -XM_PI - y; + sign = -1.0f; + } + else + { + sign = +1.0f; + } + + float y2 = y * y; + + // 7-degree minimax approximation + *pSin = (((-0.00018524670f * y2 + 0.0083139502f) * y2 - 0.16665852f) * y2 + 1.0f) * y; + + // 6-degree minimax approximation + float p = ((-0.0012712436f * y2 + 0.041493919f) * y2 - 0.49992746f) * y2 + 1.0f; + *pCos = sign * p; +} + +//------------------------------------------------------------------------------ + +inline float XMScalarASin(float Value) noexcept +{ + // Clamp input to [-1,1]. + bool nonnegative = (Value >= 0.0f); + float x = fabsf(Value); + float omx = 1.0f - x; + if (omx < 0.0f) + { + omx = 0.0f; + } + float root = sqrtf(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 + 1.5707963050f; + result *= root; // acos(|x|) + + // acos(x) = pi - acos(-x) when x < 0, asin(x) = pi/2 - acos(x) + return (nonnegative ? XM_PIDIV2 - result : result - XM_PIDIV2); +} + +//------------------------------------------------------------------------------ + +inline float XMScalarASinEst(float Value) noexcept +{ + // Clamp input to [-1,1]. + bool nonnegative = (Value >= 0.0f); + float x = fabsf(Value); + float omx = 1.0f - x; + if (omx < 0.0f) + { + omx = 0.0f; + } + float root = sqrtf(omx); + + // 3-degree minimax approximation + float result = ((-0.0187293f * x + 0.0742610f) * x - 0.2121144f) * x + 1.5707288f; + result *= root; // acos(|x|) + + // acos(x) = pi - acos(-x) when x < 0, asin(x) = pi/2 - acos(x) + return (nonnegative ? XM_PIDIV2 - result : result - XM_PIDIV2); +} + +//------------------------------------------------------------------------------ + +inline float XMScalarACos(float Value) noexcept +{ + // Clamp input to [-1,1]. + bool nonnegative = (Value >= 0.0f); + float x = fabsf(Value); + float omx = 1.0f - x; + if (omx < 0.0f) + { + omx = 0.0f; + } + float root = sqrtf(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 + 1.5707963050f; + result *= root; + + // acos(x) = pi - acos(-x) when x < 0 + return (nonnegative ? result : XM_PI - result); +} + +//------------------------------------------------------------------------------ + +inline float XMScalarACosEst(float Value) noexcept +{ + // Clamp input to [-1,1]. + bool nonnegative = (Value >= 0.0f); + float x = fabsf(Value); + float omx = 1.0f - x; + if (omx < 0.0f) + { + omx = 0.0f; + } + float root = sqrtf(omx); + + // 3-degree minimax approximation + float result = ((-0.0187293f * x + 0.0742610f) * x - 0.2121144f) * x + 1.5707288f; + result *= root; + + // acos(x) = pi - acos(-x) when x < 0 + return (nonnegative ? result : XM_PI - result); +} + diff --git a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXMathVector.inl b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXMathVector.inl similarity index 97% rename from Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXMathVector.inl rename to Minecraft.Client/Linux/Stubs/DirectXMath/DirectXMathVector.inl index e1ee3d91f..c25b902ca 100644 --- a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXMathVector.inl +++ b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXMathVector.inl @@ -1,14869 +1,14869 @@ -//------------------------------------------------------------------------------------- -// DirectXMathVector.inl -- SIMD C++ Math library -// -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. -// -// http://go.microsoft.com/fwlink/?LinkID=615560 -//------------------------------------------------------------------------------------- - -#pragma once - -#if defined(_XM_NO_INTRINSICS_) -#define XMISNAN(x) isnan(x) -#define XMISINF(x) isinf(x) -#endif - -#if defined(_XM_SSE_INTRINSICS_) - -#define XM3UNPACK3INTO4(l1, l2, l3) \ - XMVECTOR V3 = _mm_shuffle_ps(l2, l3, _MM_SHUFFLE(0, 0, 3, 2));\ - XMVECTOR V2 = _mm_shuffle_ps(l2, l1, _MM_SHUFFLE(3, 3, 1, 0));\ - V2 = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 0, 2));\ - XMVECTOR V4 = _mm_castsi128_ps(_mm_srli_si128(_mm_castps_si128(L3), 32 / 8)) - -#define XM3PACK4INTO3(v2x) \ - v2x = _mm_shuffle_ps(V2, V3, _MM_SHUFFLE(1, 0, 2, 1));\ - V2 = _mm_shuffle_ps(V2, V1, _MM_SHUFFLE(2, 2, 0, 0));\ - V1 = _mm_shuffle_ps(V1, V2, _MM_SHUFFLE(0, 2, 1, 0));\ - V3 = _mm_shuffle_ps(V3, V4, _MM_SHUFFLE(0, 0, 2, 2));\ - V3 = _mm_shuffle_ps(V3, V4, _MM_SHUFFLE(2, 1, 2, 0)) - -#endif - -/**************************************************************************** - * - * General Vector - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ -// Assignment operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -// Return a vector with all elements equaling zero -inline XMVECTOR XM_CALLCONV XMVectorZero() noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { 0.0f, 0.0f, 0.0f, 0.0f } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vdupq_n_f32(0); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_setzero_ps(); -#endif -} - -//------------------------------------------------------------------------------ -// Initialize a vector with four floating point values -inline XMVECTOR XM_CALLCONV XMVectorSet -( - float x, - float y, - float z, - float w -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { x, y, z, w } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t V0 = vcreate_f32( - static_cast(*reinterpret_cast(&x)) - | (static_cast(*reinterpret_cast(&y)) << 32)); - float32x2_t V1 = vcreate_f32( - static_cast(*reinterpret_cast(&z)) - | (static_cast(*reinterpret_cast(&w)) << 32)); - return vcombine_f32(V0, V1); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_set_ps(w, z, y, x); -#endif -} - -//------------------------------------------------------------------------------ -// Initialize a vector with four integer values -inline XMVECTOR XM_CALLCONV XMVectorSetInt -( - uint32_t x, - uint32_t y, - uint32_t z, - uint32_t w -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 vResult = { { { x, y, z, w } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t V0 = vcreate_u32(static_cast(x) | (static_cast(y) << 32)); - uint32x2_t V1 = vcreate_u32(static_cast(z) | (static_cast(w) << 32)); - return vreinterpretq_f32_u32(vcombine_u32(V0, V1)); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i V = _mm_set_epi32(static_cast(w), static_cast(z), static_cast(y), static_cast(x)); - return _mm_castsi128_ps(V); -#endif -} - -//------------------------------------------------------------------------------ -// Initialize a vector with a replicated floating point value -inline XMVECTOR XM_CALLCONV XMVectorReplicate(float Value) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult; - vResult.f[0] = - vResult.f[1] = - vResult.f[2] = - vResult.f[3] = Value; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vdupq_n_f32(Value); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_set_ps1(Value); -#endif -} - -//------------------------------------------------------------------------------ -// Initialize a vector with a replicated floating point value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorReplicatePtr(const float* pValue) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - float Value = pValue[0]; - XMVECTORF32 vResult; - vResult.f[0] = - vResult.f[1] = - vResult.f[2] = - vResult.f[3] = Value; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vld1q_dup_f32(pValue); -#elif defined(_XM_AVX_INTRINSICS_) - return _mm_broadcast_ss(pValue); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_load_ps1(pValue); -#endif -} - -//------------------------------------------------------------------------------ -// Initialize a vector with a replicated integer value -inline XMVECTOR XM_CALLCONV XMVectorReplicateInt(uint32_t Value) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 vResult; - vResult.u[0] = - vResult.u[1] = - vResult.u[2] = - vResult.u[3] = Value; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vdupq_n_u32(Value)); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i vTemp = _mm_set1_epi32(static_cast(Value)); - return _mm_castsi128_ps(vTemp); -#endif -} - -//------------------------------------------------------------------------------ -// Initialize a vector with a replicated integer value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorReplicateIntPtr(const uint32_t* pValue) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - uint32_t Value = pValue[0]; - XMVECTORU32 vResult; - vResult.u[0] = - vResult.u[1] = - vResult.u[2] = - vResult.u[3] = Value; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vld1q_dup_u32(pValue)); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_load_ps1(reinterpret_cast(pValue)); -#endif -} - -//------------------------------------------------------------------------------ -// Initialize a vector with all bits set (true mask) -inline XMVECTOR XM_CALLCONV XMVectorTrueInt() noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 vResult = { { { 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_s32(vdupq_n_s32(-1)); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i V = _mm_set1_epi32(-1); - return _mm_castsi128_ps(V); -#endif -} - -//------------------------------------------------------------------------------ -// Initialize a vector with all bits clear (false mask) -inline XMVECTOR XM_CALLCONV XMVectorFalseInt() noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { 0.0f, 0.0f, 0.0f, 0.0f } } }; - return vResult; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vdupq_n_u32(0)); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_setzero_ps(); -#endif -} - -//------------------------------------------------------------------------------ -// Replicate the x component of the vector -inline XMVECTOR XM_CALLCONV XMVectorSplatX(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult; - vResult.f[0] = - vResult.f[1] = - vResult.f[2] = - vResult.f[3] = V.vector4_f32[0]; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vdupq_lane_f32(vget_low_f32(V), 0); -#elif defined(_XM_AVX2_INTRINSICS_) && defined(_XM_FAVOR_INTEL_) - return _mm_broadcastss_ps(V); -#elif defined(_XM_SSE_INTRINSICS_) - return XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); -#endif -} - -//------------------------------------------------------------------------------ -// Replicate the y component of the vector -inline XMVECTOR XM_CALLCONV XMVectorSplatY(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult; - vResult.f[0] = - vResult.f[1] = - vResult.f[2] = - vResult.f[3] = V.vector4_f32[1]; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vdupq_lane_f32(vget_low_f32(V), 1); -#elif defined(_XM_SSE_INTRINSICS_) - return XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); -#endif -} - -//------------------------------------------------------------------------------ -// Replicate the z component of the vector -inline XMVECTOR XM_CALLCONV XMVectorSplatZ(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult; - vResult.f[0] = - vResult.f[1] = - vResult.f[2] = - vResult.f[3] = V.vector4_f32[2]; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vdupq_lane_f32(vget_high_f32(V), 0); -#elif defined(_XM_SSE_INTRINSICS_) - return XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); -#endif -} - -//------------------------------------------------------------------------------ -// Replicate the w component of the vector -inline XMVECTOR XM_CALLCONV XMVectorSplatW(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult; - vResult.f[0] = - vResult.f[1] = - vResult.f[2] = - vResult.f[3] = V.vector4_f32[3]; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vdupq_lane_f32(vget_high_f32(V), 1); -#elif defined(_XM_SSE_INTRINSICS_) - return XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); -#endif -} - -//------------------------------------------------------------------------------ -// Return a vector of 1.0f,1.0f,1.0f,1.0f -inline XMVECTOR XM_CALLCONV XMVectorSplatOne() noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult; - vResult.f[0] = - vResult.f[1] = - vResult.f[2] = - vResult.f[3] = 1.0f; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vdupq_n_f32(1.0f); -#elif defined(_XM_SSE_INTRINSICS_) - return g_XMOne; -#endif -} - -//------------------------------------------------------------------------------ -// Return a vector of INF,INF,INF,INF -inline XMVECTOR XM_CALLCONV XMVectorSplatInfinity() noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 vResult; - vResult.u[0] = - vResult.u[1] = - vResult.u[2] = - vResult.u[3] = 0x7F800000; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vdupq_n_u32(0x7F800000)); -#elif defined(_XM_SSE_INTRINSICS_) - return g_XMInfinity; -#endif -} - -//------------------------------------------------------------------------------ -// Return a vector of Q_NAN,Q_NAN,Q_NAN,Q_NAN -inline XMVECTOR XM_CALLCONV XMVectorSplatQNaN() noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 vResult; - vResult.u[0] = - vResult.u[1] = - vResult.u[2] = - vResult.u[3] = 0x7FC00000; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vdupq_n_u32(0x7FC00000)); -#elif defined(_XM_SSE_INTRINSICS_) - return g_XMQNaN; -#endif -} - -//------------------------------------------------------------------------------ -// Return a vector of 1.192092896e-7f,1.192092896e-7f,1.192092896e-7f,1.192092896e-7f -inline XMVECTOR XM_CALLCONV XMVectorSplatEpsilon() noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 vResult; - vResult.u[0] = - vResult.u[1] = - vResult.u[2] = - vResult.u[3] = 0x34000000; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vdupq_n_u32(0x34000000)); -#elif defined(_XM_SSE_INTRINSICS_) - return g_XMEpsilon; -#endif -} - -//------------------------------------------------------------------------------ -// Return a vector of -0.0f (0x80000000),-0.0f,-0.0f,-0.0f -inline XMVECTOR XM_CALLCONV XMVectorSplatSignMask() noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 vResult; - vResult.u[0] = - vResult.u[1] = - vResult.u[2] = - vResult.u[3] = 0x80000000U; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vdupq_n_u32(0x80000000U)); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i V = _mm_set1_epi32(static_cast(0x80000000)); - return _mm_castsi128_ps(V); -#endif -} - -//------------------------------------------------------------------------------ -// Return a floating point value via an index. This is not a recommended -// function to use due to performance loss. -inline float XM_CALLCONV XMVectorGetByIndex(FXMVECTOR V, size_t i) noexcept -{ - assert(i < 4); - _Analysis_assume_(i < 4); -#if defined(_XM_NO_INTRINSICS_) - return V.vector4_f32[i]; -#else - XMVECTORF32 U; - U.v = V; - return U.f[i]; -#endif -} - -//------------------------------------------------------------------------------ -// Return the X component in an FPU register. -inline float XM_CALLCONV XMVectorGetX(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return V.vector4_f32[0]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vgetq_lane_f32(V, 0); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_cvtss_f32(V); -#endif -} - -// Return the Y component in an FPU register. -inline float XM_CALLCONV XMVectorGetY(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return V.vector4_f32[1]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vgetq_lane_f32(V, 1); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - return _mm_cvtss_f32(vTemp); -#endif -} - -// Return the Z component in an FPU register. -inline float XM_CALLCONV XMVectorGetZ(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return V.vector4_f32[2]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vgetq_lane_f32(V, 2); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - return _mm_cvtss_f32(vTemp); -#endif -} - -// Return the W component in an FPU register. -inline float XM_CALLCONV XMVectorGetW(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return V.vector4_f32[3]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vgetq_lane_f32(V, 3); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); - return _mm_cvtss_f32(vTemp); -#endif -} - -//------------------------------------------------------------------------------ - -// Store a component indexed by i into a 32 bit float location in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetByIndexPtr(float* f, FXMVECTOR V, size_t i) noexcept -{ - assert(f != nullptr); - assert(i < 4); - _Analysis_assume_(i < 4); -#if defined(_XM_NO_INTRINSICS_) - *f = V.vector4_f32[i]; -#else - XMVECTORF32 U; - U.v = V; - *f = U.f[i]; -#endif -} - -//------------------------------------------------------------------------------ - -// Store the X component into a 32 bit float location in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetXPtr(float* x, FXMVECTOR V) noexcept -{ - assert(x != nullptr); -#if defined(_XM_NO_INTRINSICS_) - *x = V.vector4_f32[0]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - vst1q_lane_f32(x, V, 0); -#elif defined(_XM_SSE_INTRINSICS_) - _mm_store_ss(x, V); -#endif -} - -// Store the Y component into a 32 bit float location in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetYPtr(float* y, FXMVECTOR V) noexcept -{ - assert(y != nullptr); -#if defined(_XM_NO_INTRINSICS_) - *y = V.vector4_f32[1]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - vst1q_lane_f32(y, V, 1); -#elif defined(_XM_SSE4_INTRINSICS_) - * (reinterpret_cast(y)) = _mm_extract_ps(V, 1); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - _mm_store_ss(y, vResult); -#endif -} - -// Store the Z component into a 32 bit float location in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetZPtr(float* z, FXMVECTOR V) noexcept -{ - assert(z != nullptr); -#if defined(_XM_NO_INTRINSICS_) - *z = V.vector4_f32[2]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - vst1q_lane_f32(z, V, 2); -#elif defined(_XM_SSE4_INTRINSICS_) - * (reinterpret_cast(z)) = _mm_extract_ps(V, 2); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - _mm_store_ss(z, vResult); -#endif -} - -// Store the W component into a 32 bit float location in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetWPtr(float* w, FXMVECTOR V) noexcept -{ - assert(w != nullptr); -#if defined(_XM_NO_INTRINSICS_) - *w = V.vector4_f32[3]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - vst1q_lane_f32(w, V, 3); -#elif defined(_XM_SSE4_INTRINSICS_) - * (reinterpret_cast(w)) = _mm_extract_ps(V, 3); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); - _mm_store_ss(w, vResult); -#endif -} - -//------------------------------------------------------------------------------ - -// Return an integer value via an index. This is not a recommended -// function to use due to performance loss. -inline uint32_t XM_CALLCONV XMVectorGetIntByIndex(FXMVECTOR V, size_t i) noexcept -{ - assert(i < 4); - _Analysis_assume_(i < 4); -#if defined(_XM_NO_INTRINSICS_) - return V.vector4_u32[i]; -#else - XMVECTORU32 U; - U.v = V; - return U.u[i]; -#endif -} - -//------------------------------------------------------------------------------ - -// Return the X component in an integer register. -inline uint32_t XM_CALLCONV XMVectorGetIntX(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return V.vector4_u32[0]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vgetq_lane_u32(vreinterpretq_u32_f32(V), 0); -#elif defined(_XM_SSE_INTRINSICS_) - return static_cast(_mm_cvtsi128_si32(_mm_castps_si128(V))); -#endif -} - -// Return the Y component in an integer register. -inline uint32_t XM_CALLCONV XMVectorGetIntY(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return V.vector4_u32[1]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vgetq_lane_u32(vreinterpretq_u32_f32(V), 1); -#elif defined(_XM_SSE4_INTRINSICS_) - __m128i V1 = _mm_castps_si128(V); - return static_cast(_mm_extract_epi32(V1, 1)); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i vResulti = _mm_shuffle_epi32(_mm_castps_si128(V), _MM_SHUFFLE(1, 1, 1, 1)); - return static_cast(_mm_cvtsi128_si32(vResulti)); -#endif -} - -// Return the Z component in an integer register. -inline uint32_t XM_CALLCONV XMVectorGetIntZ(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return V.vector4_u32[2]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vgetq_lane_u32(vreinterpretq_u32_f32(V), 2); -#elif defined(_XM_SSE4_INTRINSICS_) - __m128i V1 = _mm_castps_si128(V); - return static_cast(_mm_extract_epi32(V1, 2)); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i vResulti = _mm_shuffle_epi32(_mm_castps_si128(V), _MM_SHUFFLE(2, 2, 2, 2)); - return static_cast(_mm_cvtsi128_si32(vResulti)); -#endif -} - -// Return the W component in an integer register. -inline uint32_t XM_CALLCONV XMVectorGetIntW(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return V.vector4_u32[3]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vgetq_lane_u32(vreinterpretq_u32_f32(V), 3); -#elif defined(_XM_SSE4_INTRINSICS_) - __m128i V1 = _mm_castps_si128(V); - return static_cast(_mm_extract_epi32(V1, 3)); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i vResulti = _mm_shuffle_epi32(_mm_castps_si128(V), _MM_SHUFFLE(3, 3, 3, 3)); - return static_cast(_mm_cvtsi128_si32(vResulti)); -#endif -} - -//------------------------------------------------------------------------------ - -// Store a component indexed by i into a 32 bit integer location in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetIntByIndexPtr(uint32_t* x, FXMVECTOR V, size_t i) noexcept -{ - assert(x != nullptr); - assert(i < 4); - _Analysis_assume_(i < 4); -#if defined(_XM_NO_INTRINSICS_) - *x = V.vector4_u32[i]; -#else - XMVECTORU32 U; - U.v = V; - *x = U.u[i]; -#endif -} - -//------------------------------------------------------------------------------ - -// Store the X component into a 32 bit integer location in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetIntXPtr(uint32_t* x, FXMVECTOR V) noexcept -{ - assert(x != nullptr); -#if defined(_XM_NO_INTRINSICS_) - *x = V.vector4_u32[0]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - vst1q_lane_u32(x, *reinterpret_cast(&V), 0); -#elif defined(_XM_SSE_INTRINSICS_) - _mm_store_ss(reinterpret_cast(x), V); -#endif -} - -// Store the Y component into a 32 bit integer location in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetIntYPtr(uint32_t* y, FXMVECTOR V) noexcept -{ - assert(y != nullptr); -#if defined(_XM_NO_INTRINSICS_) - *y = V.vector4_u32[1]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - vst1q_lane_u32(y, *reinterpret_cast(&V), 1); -#elif defined(_XM_SSE4_INTRINSICS_) - __m128i V1 = _mm_castps_si128(V); - *y = static_cast(_mm_extract_epi32(V1, 1)); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - _mm_store_ss(reinterpret_cast(y), vResult); -#endif -} - -// Store the Z component into a 32 bit integer locaCantion in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetIntZPtr(uint32_t* z, FXMVECTOR V) noexcept -{ - assert(z != nullptr); -#if defined(_XM_NO_INTRINSICS_) - *z = V.vector4_u32[2]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - vst1q_lane_u32(z, *reinterpret_cast(&V), 2); -#elif defined(_XM_SSE4_INTRINSICS_) - __m128i V1 = _mm_castps_si128(V); - *z = static_cast(_mm_extract_epi32(V1, 2)); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - _mm_store_ss(reinterpret_cast(z), vResult); -#endif -} - -// Store the W component into a 32 bit integer location in memory. -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorGetIntWPtr(uint32_t* w, FXMVECTOR V) noexcept -{ - assert(w != nullptr); -#if defined(_XM_NO_INTRINSICS_) - *w = V.vector4_u32[3]; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - vst1q_lane_u32(w, *reinterpret_cast(&V), 3); -#elif defined(_XM_SSE4_INTRINSICS_) - __m128i V1 = _mm_castps_si128(V); - *w = static_cast(_mm_extract_epi32(V1, 3)); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); - _mm_store_ss(reinterpret_cast(w), vResult); -#endif -} - -//------------------------------------------------------------------------------ - -// Set a single indexed floating point component -inline XMVECTOR XM_CALLCONV XMVectorSetByIndex(FXMVECTOR V, float f, size_t i) noexcept -{ - assert(i < 4); - _Analysis_assume_(i < 4); - XMVECTORF32 U; - U.v = V; - U.f[i] = f; - return U.v; -} - -//------------------------------------------------------------------------------ - -// Sets the X component of a vector to a passed floating point value -inline XMVECTOR XM_CALLCONV XMVectorSetX(FXMVECTOR V, float x) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 U = { { { - x, - V.vector4_f32[1], - V.vector4_f32[2], - V.vector4_f32[3] - } } }; - return U.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vsetq_lane_f32(x, V, 0); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = _mm_set_ss(x); - vResult = _mm_move_ss(V, vResult); - return vResult; -#endif -} - -// Sets the Y component of a vector to a passed floating point value -inline XMVECTOR XM_CALLCONV XMVectorSetY(FXMVECTOR V, float y) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 U = { { { - V.vector4_f32[0], - y, - V.vector4_f32[2], - V.vector4_f32[3] - } } }; - return U.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vsetq_lane_f32(y, V, 1); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vResult = _mm_set_ss(y); - vResult = _mm_insert_ps(V, vResult, 0x10); - return vResult; -#elif defined(_XM_SSE_INTRINSICS_) - // Swap y and x - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 2, 0, 1)); - // Convert input to vector - XMVECTOR vTemp = _mm_set_ss(y); - // Replace the x component - vResult = _mm_move_ss(vResult, vTemp); - // Swap y and x again - vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 2, 0, 1)); - return vResult; -#endif -} -// Sets the Z component of a vector to a passed floating point value -inline XMVECTOR XM_CALLCONV XMVectorSetZ(FXMVECTOR V, float z) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 U = { { { - V.vector4_f32[0], - V.vector4_f32[1], - z, - V.vector4_f32[3] - } } }; - return U.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vsetq_lane_f32(z, V, 2); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vResult = _mm_set_ss(z); - vResult = _mm_insert_ps(V, vResult, 0x20); - return vResult; -#elif defined(_XM_SSE_INTRINSICS_) - // Swap z and x - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 0, 1, 2)); - // Convert input to vector - XMVECTOR vTemp = _mm_set_ss(z); - // Replace the x component - vResult = _mm_move_ss(vResult, vTemp); - // Swap z and x again - vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 0, 1, 2)); - return vResult; -#endif -} - -// Sets the W component of a vector to a passed floating point value -inline XMVECTOR XM_CALLCONV XMVectorSetW(FXMVECTOR V, float w) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 U = { { { - V.vector4_f32[0], - V.vector4_f32[1], - V.vector4_f32[2], - w - } } }; - return U.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vsetq_lane_f32(w, V, 3); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vResult = _mm_set_ss(w); - vResult = _mm_insert_ps(V, vResult, 0x30); - return vResult; -#elif defined(_XM_SSE_INTRINSICS_) - // Swap w and x - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 2, 1, 3)); - // Convert input to vector - XMVECTOR vTemp = _mm_set_ss(w); - // Replace the x component - vResult = _mm_move_ss(vResult, vTemp); - // Swap w and x again - vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(0, 2, 1, 3)); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -// Sets a component of a vector to a floating point value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetByIndexPtr(FXMVECTOR V, const float* f, size_t i) noexcept -{ - assert(f != nullptr); - assert(i < 4); - _Analysis_assume_(i < 4); - XMVECTORF32 U; - U.v = V; - U.f[i] = *f; - return U.v; -} - -//------------------------------------------------------------------------------ - -// Sets the X component of a vector to a floating point value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetXPtr(FXMVECTOR V, const float* x) noexcept -{ - assert(x != nullptr); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 U = { { { - *x, - V.vector4_f32[1], - V.vector4_f32[2], - V.vector4_f32[3] - } } }; - return U.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vld1q_lane_f32(x, V, 0); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = _mm_load_ss(x); - vResult = _mm_move_ss(V, vResult); - return vResult; -#endif -} - -// Sets the Y component of a vector to a floating point value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetYPtr(FXMVECTOR V, const float* y) noexcept -{ - assert(y != nullptr); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 U = { { { - V.vector4_f32[0], - *y, - V.vector4_f32[2], - V.vector4_f32[3] - } } }; - return U.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vld1q_lane_f32(y, V, 1); -#elif defined(_XM_SSE_INTRINSICS_) - // Swap y and x - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 2, 0, 1)); - // Convert input to vector - XMVECTOR vTemp = _mm_load_ss(y); - // Replace the x component - vResult = _mm_move_ss(vResult, vTemp); - // Swap y and x again - vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 2, 0, 1)); - return vResult; -#endif -} - -// Sets the Z component of a vector to a floating point value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetZPtr(FXMVECTOR V, const float* z) noexcept -{ - assert(z != nullptr); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 U = { { { - V.vector4_f32[0], - V.vector4_f32[1], - *z, - V.vector4_f32[3] - } } }; - return U.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vld1q_lane_f32(z, V, 2); -#elif defined(_XM_SSE_INTRINSICS_) - // Swap z and x - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 0, 1, 2)); - // Convert input to vector - XMVECTOR vTemp = _mm_load_ss(z); - // Replace the x component - vResult = _mm_move_ss(vResult, vTemp); - // Swap z and x again - vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 0, 1, 2)); - return vResult; -#endif -} - -// Sets the W component of a vector to a floating point value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetWPtr(FXMVECTOR V, const float* w) noexcept -{ - assert(w != nullptr); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 U = { { { - V.vector4_f32[0], - V.vector4_f32[1], - V.vector4_f32[2], - *w - } } }; - return U.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vld1q_lane_f32(w, V, 3); -#elif defined(_XM_SSE_INTRINSICS_) - // Swap w and x - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 2, 1, 3)); - // Convert input to vector - XMVECTOR vTemp = _mm_load_ss(w); - // Replace the x component - vResult = _mm_move_ss(vResult, vTemp); - // Swap w and x again - vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(0, 2, 1, 3)); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -// Sets a component of a vector to an integer passed by value -inline XMVECTOR XM_CALLCONV XMVectorSetIntByIndex(FXMVECTOR V, uint32_t x, size_t i) noexcept -{ - assert(i < 4); - _Analysis_assume_(i < 4); - XMVECTORU32 tmp; - tmp.v = V; - tmp.u[i] = x; - return tmp; -} - -//------------------------------------------------------------------------------ - -// Sets the X component of a vector to an integer passed by value -inline XMVECTOR XM_CALLCONV XMVectorSetIntX(FXMVECTOR V, uint32_t x) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 U = { { { - x, - V.vector4_u32[1], - V.vector4_u32[2], - V.vector4_u32[3] - } } }; - return U.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vsetq_lane_u32(x, vreinterpretq_u32_f32(V), 0)); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i vTemp = _mm_cvtsi32_si128(static_cast(x)); - XMVECTOR vResult = _mm_move_ss(V, _mm_castsi128_ps(vTemp)); - return vResult; -#endif -} - -// Sets the Y component of a vector to an integer passed by value -inline XMVECTOR XM_CALLCONV XMVectorSetIntY(FXMVECTOR V, uint32_t y) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 U = { { { - V.vector4_u32[0], - y, - V.vector4_u32[2], - V.vector4_u32[3] - } } }; - return U.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vsetq_lane_u32(y, vreinterpretq_u32_f32(V), 1)); -#elif defined(_XM_SSE4_INTRINSICS_) - __m128i vResult = _mm_castps_si128(V); - vResult = _mm_insert_epi32(vResult, static_cast(y), 1); - return _mm_castsi128_ps(vResult); -#elif defined(_XM_SSE_INTRINSICS_) - // Swap y and x - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 2, 0, 1)); - // Convert input to vector - __m128i vTemp = _mm_cvtsi32_si128(static_cast(y)); - // Replace the x component - vResult = _mm_move_ss(vResult, _mm_castsi128_ps(vTemp)); - // Swap y and x again - vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 2, 0, 1)); - return vResult; -#endif -} - -// Sets the Z component of a vector to an integer passed by value -inline XMVECTOR XM_CALLCONV XMVectorSetIntZ(FXMVECTOR V, uint32_t z) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 U = { { { - V.vector4_u32[0], - V.vector4_u32[1], - z, - V.vector4_u32[3] - } } }; - return U.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vsetq_lane_u32(z, vreinterpretq_u32_f32(V), 2)); -#elif defined(_XM_SSE4_INTRINSICS_) - __m128i vResult = _mm_castps_si128(V); - vResult = _mm_insert_epi32(vResult, static_cast(z), 2); - return _mm_castsi128_ps(vResult); -#elif defined(_XM_SSE_INTRINSICS_) - // Swap z and x - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 0, 1, 2)); - // Convert input to vector - __m128i vTemp = _mm_cvtsi32_si128(static_cast(z)); - // Replace the x component - vResult = _mm_move_ss(vResult, _mm_castsi128_ps(vTemp)); - // Swap z and x again - vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 0, 1, 2)); - return vResult; -#endif -} - -// Sets the W component of a vector to an integer passed by value -inline XMVECTOR XM_CALLCONV XMVectorSetIntW(FXMVECTOR V, uint32_t w) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 U = { { { - V.vector4_u32[0], - V.vector4_u32[1], - V.vector4_u32[2], - w - } } }; - return U.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vsetq_lane_u32(w, vreinterpretq_u32_f32(V), 3)); -#elif defined(_XM_SSE4_INTRINSICS_) - __m128i vResult = _mm_castps_si128(V); - vResult = _mm_insert_epi32(vResult, static_cast(w), 3); - return _mm_castsi128_ps(vResult); -#elif defined(_XM_SSE_INTRINSICS_) - // Swap w and x - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 2, 1, 3)); - // Convert input to vector - __m128i vTemp = _mm_cvtsi32_si128(static_cast(w)); - // Replace the x component - vResult = _mm_move_ss(vResult, _mm_castsi128_ps(vTemp)); - // Swap w and x again - vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(0, 2, 1, 3)); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -// Sets a component of a vector to an integer value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetIntByIndexPtr(FXMVECTOR V, const uint32_t* x, size_t i) noexcept -{ - assert(x != nullptr); - assert(i < 4); - _Analysis_assume_(i < 4); - XMVECTORU32 tmp; - tmp.v = V; - tmp.u[i] = *x; - return tmp; -} - -//------------------------------------------------------------------------------ - -// Sets the X component of a vector to an integer value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetIntXPtr(FXMVECTOR V, const uint32_t* x) noexcept -{ - assert(x != nullptr); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 U = { { { - *x, - V.vector4_u32[1], - V.vector4_u32[2], - V.vector4_u32[3] - } } }; - return U.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vld1q_lane_u32(x, *reinterpret_cast(&V), 0)); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_load_ss(reinterpret_cast(x)); - XMVECTOR vResult = _mm_move_ss(V, vTemp); - return vResult; -#endif -} - -// Sets the Y component of a vector to an integer value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetIntYPtr(FXMVECTOR V, const uint32_t* y) noexcept -{ - assert(y != nullptr); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 U = { { { - V.vector4_u32[0], - *y, - V.vector4_u32[2], - V.vector4_u32[3] - } } }; - return U.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vld1q_lane_u32(y, *reinterpret_cast(&V), 1)); -#elif defined(_XM_SSE_INTRINSICS_) - // Swap y and x - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 2, 0, 1)); - // Convert input to vector - XMVECTOR vTemp = _mm_load_ss(reinterpret_cast(y)); - // Replace the x component - vResult = _mm_move_ss(vResult, vTemp); - // Swap y and x again - vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 2, 0, 1)); - return vResult; -#endif -} - -// Sets the Z component of a vector to an integer value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetIntZPtr(FXMVECTOR V, const uint32_t* z) noexcept -{ - assert(z != nullptr); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 U = { { { - V.vector4_u32[0], - V.vector4_u32[1], - *z, - V.vector4_u32[3] - } } }; - return U.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vld1q_lane_u32(z, *reinterpret_cast(&V), 2)); -#elif defined(_XM_SSE_INTRINSICS_) - // Swap z and x - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 0, 1, 2)); - // Convert input to vector - XMVECTOR vTemp = _mm_load_ss(reinterpret_cast(z)); - // Replace the x component - vResult = _mm_move_ss(vResult, vTemp); - // Swap z and x again - vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 0, 1, 2)); - return vResult; -#endif -} - -// Sets the W component of a vector to an integer value passed by pointer -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorSetIntWPtr(FXMVECTOR V, const uint32_t* w) noexcept -{ - assert(w != nullptr); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORU32 U = { { { - V.vector4_u32[0], - V.vector4_u32[1], - V.vector4_u32[2], - *w - } } }; - return U.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vld1q_lane_u32(w, *reinterpret_cast(&V), 3)); -#elif defined(_XM_SSE_INTRINSICS_) - // Swap w and x - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 2, 1, 3)); - // Convert input to vector - XMVECTOR vTemp = _mm_load_ss(reinterpret_cast(w)); - // Replace the x component - vResult = _mm_move_ss(vResult, vTemp); - // Swap w and x again - vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(0, 2, 1, 3)); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorSwizzle -( - FXMVECTOR V, - uint32_t E0, - uint32_t E1, - uint32_t E2, - uint32_t E3 -) noexcept -{ - assert((E0 < 4) && (E1 < 4) && (E2 < 4) && (E3 < 4)); - _Analysis_assume_((E0 < 4) && (E1 < 4) && (E2 < 4) && (E3 < 4)); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORF32 Result = { { { - V.vector4_f32[E0], - V.vector4_f32[E1], - V.vector4_f32[E2], - V.vector4_f32[E3] - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const uint32_t ControlElement[4] = - { - 0x03020100, // XM_SWIZZLE_X - 0x07060504, // XM_SWIZZLE_Y - 0x0B0A0908, // XM_SWIZZLE_Z - 0x0F0E0D0C, // XM_SWIZZLE_W - }; - - uint8x8x2_t tbl; - tbl.val[0] = vreinterpret_u8_f32(vget_low_f32(V)); - tbl.val[1] = vreinterpret_u8_f32(vget_high_f32(V)); - - uint32x2_t idx = vcreate_u32(static_cast(ControlElement[E0]) | (static_cast(ControlElement[E1]) << 32)); - const uint8x8_t rL = vtbl2_u8(tbl, vreinterpret_u8_u32(idx)); - - idx = vcreate_u32(static_cast(ControlElement[E2]) | (static_cast(ControlElement[E3]) << 32)); - const uint8x8_t rH = vtbl2_u8(tbl, vreinterpret_u8_u32(idx)); - - return vcombine_f32(vreinterpret_f32_u8(rL), vreinterpret_f32_u8(rH)); -#elif defined(_XM_AVX_INTRINSICS_) - unsigned int elem[4] = { E0, E1, E2, E3 }; - __m128i vControl = _mm_loadu_si128(reinterpret_cast(&elem[0])); - return _mm_permutevar_ps(V, vControl); -#else - auto aPtr = reinterpret_cast(&V); - - XMVECTOR Result; - auto pWork = reinterpret_cast(&Result); - - pWork[0] = aPtr[E0]; - pWork[1] = aPtr[E1]; - pWork[2] = aPtr[E2]; - pWork[3] = aPtr[E3]; - - return Result; -#endif -} - -//------------------------------------------------------------------------------ -inline XMVECTOR XM_CALLCONV XMVectorPermute -( - FXMVECTOR V1, - FXMVECTOR V2, - uint32_t PermuteX, - uint32_t PermuteY, - uint32_t PermuteZ, - uint32_t PermuteW -) noexcept -{ - assert(PermuteX <= 7 && PermuteY <= 7 && PermuteZ <= 7 && PermuteW <= 7); - _Analysis_assume_(PermuteX <= 7 && PermuteY <= 7 && PermuteZ <= 7 && PermuteW <= 7); - -#if defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - static const uint32_t ControlElement[8] = - { - 0x03020100, // XM_PERMUTE_0X - 0x07060504, // XM_PERMUTE_0Y - 0x0B0A0908, // XM_PERMUTE_0Z - 0x0F0E0D0C, // XM_PERMUTE_0W - 0x13121110, // XM_PERMUTE_1X - 0x17161514, // XM_PERMUTE_1Y - 0x1B1A1918, // XM_PERMUTE_1Z - 0x1F1E1D1C, // XM_PERMUTE_1W - }; - - uint8x8x4_t tbl; - tbl.val[0] = vreinterpret_u8_f32(vget_low_f32(V1)); - tbl.val[1] = vreinterpret_u8_f32(vget_high_f32(V1)); - tbl.val[2] = vreinterpret_u8_f32(vget_low_f32(V2)); - tbl.val[3] = vreinterpret_u8_f32(vget_high_f32(V2)); - - uint32x2_t idx = vcreate_u32(static_cast(ControlElement[PermuteX]) | (static_cast(ControlElement[PermuteY]) << 32)); - const uint8x8_t rL = vtbl4_u8(tbl, vreinterpret_u8_u32(idx)); - - idx = vcreate_u32(static_cast(ControlElement[PermuteZ]) | (static_cast(ControlElement[PermuteW]) << 32)); - const uint8x8_t rH = vtbl4_u8(tbl, vreinterpret_u8_u32(idx)); - - return vcombine_f32(vreinterpret_f32_u8(rL), vreinterpret_f32_u8(rH)); -#elif defined(_XM_AVX_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - static const XMVECTORU32 three = { { { 3, 3, 3, 3 } } }; - - XM_ALIGNED_DATA(16) unsigned int elem[4] = { PermuteX, PermuteY, PermuteZ, PermuteW }; - __m128i vControl = _mm_load_si128(reinterpret_cast(&elem[0])); - - __m128i vSelect = _mm_cmpgt_epi32(vControl, three); - vControl = _mm_castps_si128(_mm_and_ps(_mm_castsi128_ps(vControl), three)); - - __m128 shuffled1 = _mm_permutevar_ps(V1, vControl); - __m128 shuffled2 = _mm_permutevar_ps(V2, vControl); - - __m128 masked1 = _mm_andnot_ps(_mm_castsi128_ps(vSelect), shuffled1); - __m128 masked2 = _mm_and_ps(_mm_castsi128_ps(vSelect), shuffled2); - - return _mm_or_ps(masked1, masked2); -#else - - const uint32_t* aPtr[2]; - aPtr[0] = reinterpret_cast(&V1); - aPtr[1] = reinterpret_cast(&V2); - - XMVECTOR Result; - auto pWork = reinterpret_cast(&Result); - - const uint32_t i0 = PermuteX & 3; - const uint32_t vi0 = PermuteX >> 2; - pWork[0] = aPtr[vi0][i0]; - - const uint32_t i1 = PermuteY & 3; - const uint32_t vi1 = PermuteY >> 2; - pWork[1] = aPtr[vi1][i1]; - - const uint32_t i2 = PermuteZ & 3; - const uint32_t vi2 = PermuteZ >> 2; - pWork[2] = aPtr[vi2][i2]; - - const uint32_t i3 = PermuteW & 3; - const uint32_t vi3 = PermuteW >> 2; - pWork[3] = aPtr[vi3][i3]; - - return Result; -#endif -} - -//------------------------------------------------------------------------------ -// Define a control vector to be used in XMVectorSelect -// operations. The four integers specified in XMVectorSelectControl -// serve as indices to select between components in two vectors. -// The first index controls selection for the first component of -// the vectors involved in a select operation, the second index -// controls selection for the second component etc. A value of -// zero for an index causes the corresponding component from the first -// vector to be selected whereas a one causes the component from the -// second vector to be selected instead. - -inline XMVECTOR XM_CALLCONV XMVectorSelectControl -( - uint32_t VectorIndex0, - uint32_t VectorIndex1, - uint32_t VectorIndex2, - uint32_t VectorIndex3 -) noexcept -{ -#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - // x=Index0,y=Index1,z=Index2,w=Index3 - __m128i vTemp = _mm_set_epi32(static_cast(VectorIndex3), static_cast(VectorIndex2), static_cast(VectorIndex1), static_cast(VectorIndex0)); - // Any non-zero entries become 0xFFFFFFFF else 0 - vTemp = _mm_cmpgt_epi32(vTemp, g_XMZero); - return _mm_castsi128_ps(vTemp); -#elif defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - int32x2_t V0 = vcreate_s32(static_cast(VectorIndex0) | (static_cast(VectorIndex1) << 32)); - int32x2_t V1 = vcreate_s32(static_cast(VectorIndex2) | (static_cast(VectorIndex3) << 32)); - int32x4_t vTemp = vcombine_s32(V0, V1); - // Any non-zero entries become 0xFFFFFFFF else 0 - return vreinterpretq_f32_u32(vcgtq_s32(vTemp, g_XMZero)); -#else - XMVECTOR ControlVector; - const uint32_t ControlElement[] = - { - XM_SELECT_0, - XM_SELECT_1 - }; - - assert(VectorIndex0 < 2); - assert(VectorIndex1 < 2); - assert(VectorIndex2 < 2); - assert(VectorIndex3 < 2); - _Analysis_assume_(VectorIndex0 < 2); - _Analysis_assume_(VectorIndex1 < 2); - _Analysis_assume_(VectorIndex2 < 2); - _Analysis_assume_(VectorIndex3 < 2); - - ControlVector.vector4_u32[0] = ControlElement[VectorIndex0]; - ControlVector.vector4_u32[1] = ControlElement[VectorIndex1]; - ControlVector.vector4_u32[2] = ControlElement[VectorIndex2]; - ControlVector.vector4_u32[3] = ControlElement[VectorIndex3]; - - return ControlVector; - -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorSelect -( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR Control -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORU32 Result = { { { - (V1.vector4_u32[0] & ~Control.vector4_u32[0]) | (V2.vector4_u32[0] & Control.vector4_u32[0]), - (V1.vector4_u32[1] & ~Control.vector4_u32[1]) | (V2.vector4_u32[1] & Control.vector4_u32[1]), - (V1.vector4_u32[2] & ~Control.vector4_u32[2]) | (V2.vector4_u32[2] & Control.vector4_u32[2]), - (V1.vector4_u32[3] & ~Control.vector4_u32[3]) | (V2.vector4_u32[3] & Control.vector4_u32[3]), - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vbslq_f32(vreinterpretq_u32_f32(Control), V2, V1); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp1 = _mm_andnot_ps(Control, V1); - XMVECTOR vTemp2 = _mm_and_ps(V2, Control); - return _mm_or_ps(vTemp1, vTemp2); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorMergeXY -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORU32 Result = { { { - V1.vector4_u32[0], - V2.vector4_u32[0], - V1.vector4_u32[1], - V2.vector4_u32[1], - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vzipq_f32(V1, V2).val[0]; -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_unpacklo_ps(V1, V2); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorMergeZW -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORU32 Result = { { { - V1.vector4_u32[2], - V2.vector4_u32[2], - V1.vector4_u32[3], - V2.vector4_u32[3] - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vzipq_f32(V1, V2).val[1]; -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_unpackhi_ps(V1, V2); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorShiftLeft(FXMVECTOR V1, FXMVECTOR V2, uint32_t Elements) noexcept -{ - assert(Elements < 4); - _Analysis_assume_(Elements < 4); - return XMVectorPermute(V1, V2, Elements, ((Elements)+1), ((Elements)+2), ((Elements)+3)); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorRotateLeft(FXMVECTOR V, uint32_t Elements) noexcept -{ - assert(Elements < 4); - _Analysis_assume_(Elements < 4); - return XMVectorSwizzle(V, Elements & 3, (Elements + 1) & 3, (Elements + 2) & 3, (Elements + 3) & 3); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorRotateRight(FXMVECTOR V, uint32_t Elements) noexcept -{ - assert(Elements < 4); - _Analysis_assume_(Elements < 4); - return XMVectorSwizzle(V, (4 - (Elements)) & 3, (5 - (Elements)) & 3, (6 - (Elements)) & 3, (7 - (Elements)) & 3); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorInsert( - FXMVECTOR VD, FXMVECTOR VS, - uint32_t VSLeftRotateElements, - uint32_t Select0, uint32_t Select1, uint32_t Select2, uint32_t Select3) noexcept -{ - XMVECTOR Control = XMVectorSelectControl(Select0 & 1, Select1 & 1, Select2 & 1, Select3 & 1); - return XMVectorSelect(VD, XMVectorRotateLeft(VS, VSLeftRotateElements), Control); -} - -//------------------------------------------------------------------------------ -// Comparison operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORU32 Control = { { { - (V1.vector4_f32[0] == V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[1] == V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[2] == V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[3] == V2.vector4_f32[3]) ? 0xFFFFFFFF : 0, - } } }; - return Control.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vceqq_f32(V1, V2)); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_cmpeq_ps(V1, V2); -#endif -} - -//------------------------------------------------------------------------------ - -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorEqualR -( - uint32_t* pCR, - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ - assert(pCR != nullptr); -#if defined(_XM_NO_INTRINSICS_) - uint32_t ux = (V1.vector4_f32[0] == V2.vector4_f32[0]) ? 0xFFFFFFFFU : 0; - uint32_t uy = (V1.vector4_f32[1] == V2.vector4_f32[1]) ? 0xFFFFFFFFU : 0; - uint32_t uz = (V1.vector4_f32[2] == V2.vector4_f32[2]) ? 0xFFFFFFFFU : 0; - uint32_t uw = (V1.vector4_f32[3] == V2.vector4_f32[3]) ? 0xFFFFFFFFU : 0; - uint32_t CR = 0; - if (ux & uy & uz & uw) - { - // All elements are greater - CR = XM_CRMASK_CR6TRUE; - } - else if (!(ux | uy | uz | uw)) - { - // All elements are not greater - CR = XM_CRMASK_CR6FALSE; - } - *pCR = CR; - - XMVECTORU32 Control = { { { ux, uy, uz, uw } } }; - return Control; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vreinterpret_u8_u32(vget_low_u32(vResult)), vreinterpret_u8_u32(vget_high_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); - uint32_t CR = 0; - if (r == 0xFFFFFFFFU) - { - // All elements are equal - CR = XM_CRMASK_CR6TRUE; - } - else if (!r) - { - // All elements are not equal - CR = XM_CRMASK_CR6FALSE; - } - *pCR = CR; - return vreinterpretq_f32_u32(vResult); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); - uint32_t CR = 0; - int iTest = _mm_movemask_ps(vTemp); - if (iTest == 0xf) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!iTest) - { - // All elements are not greater - CR = XM_CRMASK_CR6FALSE; - } - *pCR = CR; - return vTemp; -#endif -} - -//------------------------------------------------------------------------------ -// Treat the components of the vectors as unsigned integers and -// compare individual bits between the two. This is useful for -// comparing control vectors and result vectors returned from -// other comparison operations. - -inline XMVECTOR XM_CALLCONV XMVectorEqualInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORU32 Control = { { { - (V1.vector4_u32[0] == V2.vector4_u32[0]) ? 0xFFFFFFFF : 0, - (V1.vector4_u32[1] == V2.vector4_u32[1]) ? 0xFFFFFFFF : 0, - (V1.vector4_u32[2] == V2.vector4_u32[2]) ? 0xFFFFFFFF : 0, - (V1.vector4_u32[3] == V2.vector4_u32[3]) ? 0xFFFFFFFF : 0, - } } }; - return Control.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vceqq_s32(vreinterpretq_s32_f32(V1), vreinterpretq_s32_f32(V2))); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i V = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); - return _mm_castsi128_ps(V); -#endif -} - -//------------------------------------------------------------------------------ - -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorEqualIntR -( - uint32_t* pCR, - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ - assert(pCR != nullptr); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Control = XMVectorEqualInt(V1, V2); - - *pCR = 0; - if (XMVector4EqualInt(Control, XMVectorTrueInt())) - { - // All elements are equal - *pCR |= XM_CRMASK_CR6TRUE; - } - else if (XMVector4EqualInt(Control, XMVectorFalseInt())) - { - // All elements are not equal - *pCR |= XM_CRMASK_CR6FALSE; - } - return Control; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); - uint32_t CR = 0; - if (r == 0xFFFFFFFFU) - { - // All elements are equal - CR = XM_CRMASK_CR6TRUE; - } - else if (!r) - { - // All elements are not equal - CR = XM_CRMASK_CR6FALSE; - } - *pCR = CR; - return vreinterpretq_f32_u32(vResult); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i V = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); - int iTemp = _mm_movemask_ps(_mm_castsi128_ps(V)); - uint32_t CR = 0; - if (iTemp == 0x0F) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!iTemp) - { - CR = XM_CRMASK_CR6FALSE; - } - *pCR = CR; - return _mm_castsi128_ps(V); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorNearEqual -( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR Epsilon -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - float fDeltax = V1.vector4_f32[0] - V2.vector4_f32[0]; - float fDeltay = V1.vector4_f32[1] - V2.vector4_f32[1]; - float fDeltaz = V1.vector4_f32[2] - V2.vector4_f32[2]; - float fDeltaw = V1.vector4_f32[3] - V2.vector4_f32[3]; - - fDeltax = fabsf(fDeltax); - fDeltay = fabsf(fDeltay); - fDeltaz = fabsf(fDeltaz); - fDeltaw = fabsf(fDeltaw); - - XMVECTORU32 Control = { { { - (fDeltax <= Epsilon.vector4_f32[0]) ? 0xFFFFFFFFU : 0, - (fDeltay <= Epsilon.vector4_f32[1]) ? 0xFFFFFFFFU : 0, - (fDeltaz <= Epsilon.vector4_f32[2]) ? 0xFFFFFFFFU : 0, - (fDeltaw <= Epsilon.vector4_f32[3]) ? 0xFFFFFFFFU : 0, - } } }; - return Control.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t vDelta = vsubq_f32(V1, V2); -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - return vacleq_f32(vDelta, Epsilon); -#else - return vreinterpretq_f32_u32(vcleq_f32(vabsq_f32(vDelta), Epsilon)); -#endif -#elif defined(_XM_SSE_INTRINSICS_) - // Get the difference - XMVECTOR vDelta = _mm_sub_ps(V1, V2); - // Get the absolute value of the difference - XMVECTOR vTemp = _mm_setzero_ps(); - vTemp = _mm_sub_ps(vTemp, vDelta); - vTemp = _mm_max_ps(vTemp, vDelta); - vTemp = _mm_cmple_ps(vTemp, Epsilon); - return vTemp; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorNotEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORU32 Control = { { { - (V1.vector4_f32[0] != V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[1] != V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[2] != V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[3] != V2.vector4_f32[3]) ? 0xFFFFFFFF : 0, - } } }; - return Control.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vmvnq_u32(vceqq_f32(V1, V2))); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_cmpneq_ps(V1, V2); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorNotEqualInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORU32 Control = { { { - (V1.vector4_u32[0] != V2.vector4_u32[0]) ? 0xFFFFFFFFU : 0, - (V1.vector4_u32[1] != V2.vector4_u32[1]) ? 0xFFFFFFFFU : 0, - (V1.vector4_u32[2] != V2.vector4_u32[2]) ? 0xFFFFFFFFU : 0, - (V1.vector4_u32[3] != V2.vector4_u32[3]) ? 0xFFFFFFFFU : 0 - } } }; - return Control.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vmvnq_u32( - vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)))); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i V = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); - return _mm_xor_ps(_mm_castsi128_ps(V), g_XMNegOneMask); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorGreater -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORU32 Control = { { { - (V1.vector4_f32[0] > V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[1] > V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[2] > V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[3] > V2.vector4_f32[3]) ? 0xFFFFFFFF : 0 - } } }; - return Control.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vcgtq_f32(V1, V2)); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_cmpgt_ps(V1, V2); -#endif -} - -//------------------------------------------------------------------------------ - -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorGreaterR -( - uint32_t* pCR, - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ - assert(pCR != nullptr); -#if defined(_XM_NO_INTRINSICS_) - - uint32_t ux = (V1.vector4_f32[0] > V2.vector4_f32[0]) ? 0xFFFFFFFFU : 0; - uint32_t uy = (V1.vector4_f32[1] > V2.vector4_f32[1]) ? 0xFFFFFFFFU : 0; - uint32_t uz = (V1.vector4_f32[2] > V2.vector4_f32[2]) ? 0xFFFFFFFFU : 0; - uint32_t uw = (V1.vector4_f32[3] > V2.vector4_f32[3]) ? 0xFFFFFFFFU : 0; - uint32_t CR = 0; - if (ux & uy & uz & uw) - { - // All elements are greater - CR = XM_CRMASK_CR6TRUE; - } - else if (!(ux | uy | uz | uw)) - { - // All elements are not greater - CR = XM_CRMASK_CR6FALSE; - } - *pCR = CR; - - XMVECTORU32 Control = { { { ux, uy, uz, uw } } }; - return Control.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgtq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); - uint32_t CR = 0; - if (r == 0xFFFFFFFFU) - { - // All elements are greater - CR = XM_CRMASK_CR6TRUE; - } - else if (!r) - { - // All elements are not greater - CR = XM_CRMASK_CR6FALSE; - } - *pCR = CR; - return vreinterpretq_f32_u32(vResult); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); - uint32_t CR = 0; - int iTest = _mm_movemask_ps(vTemp); - if (iTest == 0xf) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!iTest) - { - // All elements are not greater - CR = XM_CRMASK_CR6FALSE; - } - *pCR = CR; - return vTemp; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorGreaterOrEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORU32 Control = { { { - (V1.vector4_f32[0] >= V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[1] >= V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[2] >= V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[3] >= V2.vector4_f32[3]) ? 0xFFFFFFFF : 0 - } } }; - return Control.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vcgeq_f32(V1, V2)); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_cmpge_ps(V1, V2); -#endif -} - -//------------------------------------------------------------------------------ - -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorGreaterOrEqualR -( - uint32_t* pCR, - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ - assert(pCR != nullptr); -#if defined(_XM_NO_INTRINSICS_) - - uint32_t ux = (V1.vector4_f32[0] >= V2.vector4_f32[0]) ? 0xFFFFFFFFU : 0; - uint32_t uy = (V1.vector4_f32[1] >= V2.vector4_f32[1]) ? 0xFFFFFFFFU : 0; - uint32_t uz = (V1.vector4_f32[2] >= V2.vector4_f32[2]) ? 0xFFFFFFFFU : 0; - uint32_t uw = (V1.vector4_f32[3] >= V2.vector4_f32[3]) ? 0xFFFFFFFFU : 0; - uint32_t CR = 0; - if (ux & uy & uz & uw) - { - // All elements are greater - CR = XM_CRMASK_CR6TRUE; - } - else if (!(ux | uy | uz | uw)) - { - // All elements are not greater - CR = XM_CRMASK_CR6FALSE; - } - *pCR = CR; - - XMVECTORU32 Control = { { { ux, uy, uz, uw } } }; - return Control.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgeq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); - uint32_t CR = 0; - if (r == 0xFFFFFFFFU) - { - // All elements are greater or equal - CR = XM_CRMASK_CR6TRUE; - } - else if (!r) - { - // All elements are not greater or equal - CR = XM_CRMASK_CR6FALSE; - } - *pCR = CR; - return vreinterpretq_f32_u32(vResult); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); - uint32_t CR = 0; - int iTest = _mm_movemask_ps(vTemp); - if (iTest == 0xf) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!iTest) - { - // All elements are not greater - CR = XM_CRMASK_CR6FALSE; - } - *pCR = CR; - return vTemp; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorLess -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORU32 Control = { { { - (V1.vector4_f32[0] < V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[1] < V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[2] < V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[3] < V2.vector4_f32[3]) ? 0xFFFFFFFF : 0 - } } }; - return Control.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vcltq_f32(V1, V2)); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_cmplt_ps(V1, V2); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorLessOrEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORU32 Control = { { { - (V1.vector4_f32[0] <= V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[1] <= V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[2] <= V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, - (V1.vector4_f32[3] <= V2.vector4_f32[3]) ? 0xFFFFFFFF : 0 - } } }; - return Control.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vcleq_f32(V1, V2)); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_cmple_ps(V1, V2); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorInBounds -( - FXMVECTOR V, - FXMVECTOR Bounds -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORU32 Control = { { { - (V.vector4_f32[0] <= Bounds.vector4_f32[0] && V.vector4_f32[0] >= -Bounds.vector4_f32[0]) ? 0xFFFFFFFF : 0, - (V.vector4_f32[1] <= Bounds.vector4_f32[1] && V.vector4_f32[1] >= -Bounds.vector4_f32[1]) ? 0xFFFFFFFF : 0, - (V.vector4_f32[2] <= Bounds.vector4_f32[2] && V.vector4_f32[2] >= -Bounds.vector4_f32[2]) ? 0xFFFFFFFF : 0, - (V.vector4_f32[3] <= Bounds.vector4_f32[3] && V.vector4_f32[3] >= -Bounds.vector4_f32[3]) ? 0xFFFFFFFF : 0 - } } }; - return Control.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Test if less than or equal - uint32x4_t vTemp1 = vcleq_f32(V, Bounds); - // Negate the bounds - uint32x4_t vTemp2 = vreinterpretq_u32_f32(vnegq_f32(Bounds)); - // Test if greater or equal (Reversed) - vTemp2 = vcleq_f32(vreinterpretq_f32_u32(vTemp2), V); - // Blend answers - vTemp1 = vandq_u32(vTemp1, vTemp2); - return vreinterpretq_f32_u32(vTemp1); -#elif defined(_XM_SSE_INTRINSICS_) - // Test if less than or equal - XMVECTOR vTemp1 = _mm_cmple_ps(V, Bounds); - // Negate the bounds - XMVECTOR vTemp2 = _mm_mul_ps(Bounds, g_XMNegativeOne); - // Test if greater or equal (Reversed) - vTemp2 = _mm_cmple_ps(vTemp2, V); - // Blend answers - vTemp1 = _mm_and_ps(vTemp1, vTemp2); - return vTemp1; -#endif -} - -//------------------------------------------------------------------------------ - -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMVectorInBoundsR -( - uint32_t* pCR, - FXMVECTOR V, - FXMVECTOR Bounds -) noexcept -{ - assert(pCR != nullptr); -#if defined(_XM_NO_INTRINSICS_) - - uint32_t ux = (V.vector4_f32[0] <= Bounds.vector4_f32[0] && V.vector4_f32[0] >= -Bounds.vector4_f32[0]) ? 0xFFFFFFFFU : 0; - uint32_t uy = (V.vector4_f32[1] <= Bounds.vector4_f32[1] && V.vector4_f32[1] >= -Bounds.vector4_f32[1]) ? 0xFFFFFFFFU : 0; - uint32_t uz = (V.vector4_f32[2] <= Bounds.vector4_f32[2] && V.vector4_f32[2] >= -Bounds.vector4_f32[2]) ? 0xFFFFFFFFU : 0; - uint32_t uw = (V.vector4_f32[3] <= Bounds.vector4_f32[3] && V.vector4_f32[3] >= -Bounds.vector4_f32[3]) ? 0xFFFFFFFFU : 0; - - uint32_t CR = 0; - if (ux & uy & uz & uw) - { - // All elements are in bounds - CR = XM_CRMASK_CR6BOUNDS; - } - *pCR = CR; - - XMVECTORU32 Control = { { { ux, uy, uz, uw } } }; - return Control.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Test if less than or equal - uint32x4_t vTemp1 = vcleq_f32(V, Bounds); - // Negate the bounds - uint32x4_t vTemp2 = vreinterpretq_u32_f32(vnegq_f32(Bounds)); - // Test if greater or equal (Reversed) - vTemp2 = vcleq_f32(vreinterpretq_f32_u32(vTemp2), V); - // Blend answers - vTemp1 = vandq_u32(vTemp1, vTemp2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTemp1)), vget_high_u8(vreinterpretq_u8_u32(vTemp1))); - uint16x4x2_t vTemp3 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp3.val[1]), 1); - uint32_t CR = 0; - if (r == 0xFFFFFFFFU) - { - // All elements are in bounds - CR = XM_CRMASK_CR6BOUNDS; - } - *pCR = CR; - return vreinterpretq_f32_u32(vTemp1); -#elif defined(_XM_SSE_INTRINSICS_) - // Test if less than or equal - XMVECTOR vTemp1 = _mm_cmple_ps(V, Bounds); - // Negate the bounds - XMVECTOR vTemp2 = _mm_mul_ps(Bounds, g_XMNegativeOne); - // Test if greater or equal (Reversed) - vTemp2 = _mm_cmple_ps(vTemp2, V); - // Blend answers - vTemp1 = _mm_and_ps(vTemp1, vTemp2); - - uint32_t CR = 0; - if (_mm_movemask_ps(vTemp1) == 0xf) - { - // All elements are in bounds - CR = XM_CRMASK_CR6BOUNDS; - } - *pCR = CR; - return vTemp1; -#endif -} - -//------------------------------------------------------------------------------ - -#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) -#pragma float_control(push) -#pragma float_control(precise, on) -#endif - -inline XMVECTOR XM_CALLCONV XMVectorIsNaN(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORU32 Control = { { { - XMISNAN(V.vector4_f32[0]) ? 0xFFFFFFFFU : 0, - XMISNAN(V.vector4_f32[1]) ? 0xFFFFFFFFU : 0, - XMISNAN(V.vector4_f32[2]) ? 0xFFFFFFFFU : 0, - XMISNAN(V.vector4_f32[3]) ? 0xFFFFFFFFU : 0 - } } }; - return Control.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(__clang__) && defined(__FINITE_MATH_ONLY__) - XMVECTORU32 vResult = { { { - isnan(vgetq_lane_f32(V, 0)) ? 0xFFFFFFFFU : 0, - isnan(vgetq_lane_f32(V, 1)) ? 0xFFFFFFFFU : 0, - isnan(vgetq_lane_f32(V, 2)) ? 0xFFFFFFFFU : 0, - isnan(vgetq_lane_f32(V, 3)) ? 0xFFFFFFFFU : 0 } } }; - return vResult.v; -#else -// Test against itself. NaN is always not equal - uint32x4_t vTempNan = vceqq_f32(V, V); - // Flip results - return vreinterpretq_f32_u32(vmvnq_u32(vTempNan)); -#endif -#elif defined(_XM_SSE_INTRINSICS_) -#if defined(__clang__) && defined(__FINITE_MATH_ONLY__) - XM_ALIGNED_DATA(16) float tmp[4]; - _mm_store_ps(tmp, V); - XMVECTORU32 vResult = { { { - isnan(tmp[0]) ? 0xFFFFFFFFU : 0, - isnan(tmp[1]) ? 0xFFFFFFFFU : 0, - isnan(tmp[2]) ? 0xFFFFFFFFU : 0, - isnan(tmp[3]) ? 0xFFFFFFFFU : 0 } } }; - return vResult.v; -#else -// Test against itself. NaN is always not equal - return _mm_cmpneq_ps(V, V); -#endif -#endif -} - -#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) -#pragma float_control(pop) -#endif - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorIsInfinite(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORU32 Control = { { { - XMISINF(V.vector4_f32[0]) ? 0xFFFFFFFFU : 0, - XMISINF(V.vector4_f32[1]) ? 0xFFFFFFFFU : 0, - XMISINF(V.vector4_f32[2]) ? 0xFFFFFFFFU : 0, - XMISINF(V.vector4_f32[3]) ? 0xFFFFFFFFU : 0 - } } }; - return Control.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Mask off the sign bit - uint32x4_t vTemp = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); - // Compare to infinity - vTemp = vceqq_f32(vreinterpretq_f32_u32(vTemp), g_XMInfinity); - // If any are infinity, the signs are true. - return vreinterpretq_f32_u32(vTemp); -#elif defined(_XM_SSE_INTRINSICS_) - // Mask off the sign bit - __m128 vTemp = _mm_and_ps(V, g_XMAbsMask); - // Compare to infinity - vTemp = _mm_cmpeq_ps(vTemp, g_XMInfinity); - // If any are infinity, the signs are true. - return vTemp; -#endif -} - -//------------------------------------------------------------------------------ -// Rounding and clamping operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorMin -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORF32 Result = { { { - (V1.vector4_f32[0] < V2.vector4_f32[0]) ? V1.vector4_f32[0] : V2.vector4_f32[0], - (V1.vector4_f32[1] < V2.vector4_f32[1]) ? V1.vector4_f32[1] : V2.vector4_f32[1], - (V1.vector4_f32[2] < V2.vector4_f32[2]) ? V1.vector4_f32[2] : V2.vector4_f32[2], - (V1.vector4_f32[3] < V2.vector4_f32[3]) ? V1.vector4_f32[3] : V2.vector4_f32[3] - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vminq_f32(V1, V2); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_min_ps(V1, V2); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorMax -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORF32 Result = { { { - (V1.vector4_f32[0] > V2.vector4_f32[0]) ? V1.vector4_f32[0] : V2.vector4_f32[0], - (V1.vector4_f32[1] > V2.vector4_f32[1]) ? V1.vector4_f32[1] : V2.vector4_f32[1], - (V1.vector4_f32[2] > V2.vector4_f32[2]) ? V1.vector4_f32[2] : V2.vector4_f32[2], - (V1.vector4_f32[3] > V2.vector4_f32[3]) ? V1.vector4_f32[3] : V2.vector4_f32[3] - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vmaxq_f32(V1, V2); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_max_ps(V1, V2); -#endif -} - -//------------------------------------------------------------------------------ - -namespace MathInternal -{ - // Round to nearest (even) a.k.a. banker's rounding - inline float round_to_nearest(float x) noexcept - { - float i = floorf(x); - x -= i; - if (x < 0.5f) - return i; - if (x > 0.5f) - return i + 1.f; - - float int_part; - (void)modff(i / 2.f, &int_part); - if ((2.f * int_part) == i) - { - return i; - } - - return i + 1.f; - } -} - -#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) -#pragma float_control(push) -#pragma float_control(precise, on) -#endif - -inline XMVECTOR XM_CALLCONV XMVectorRound(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORF32 Result = { { { - MathInternal::round_to_nearest(V.vector4_f32[0]), - MathInternal::round_to_nearest(V.vector4_f32[1]), - MathInternal::round_to_nearest(V.vector4_f32[2]), - MathInternal::round_to_nearest(V.vector4_f32[3]) - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ - return vrndnq_f32(V); -#else - uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(V), g_XMNegativeZero); - float32x4_t sMagic = vreinterpretq_f32_u32(vorrq_u32(g_XMNoFraction, sign)); - float32x4_t R1 = vaddq_f32(V, sMagic); - R1 = vsubq_f32(R1, sMagic); - float32x4_t R2 = vabsq_f32(V); - uint32x4_t mask = vcleq_f32(R2, g_XMNoFraction); - return vbslq_f32(mask, R1, V); -#endif -#elif defined(_XM_SSE4_INTRINSICS_) - return _mm_round_ps(V, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); -#elif defined(_XM_SSE_INTRINSICS_) - __m128 sign = _mm_and_ps(V, g_XMNegativeZero); - __m128 sMagic = _mm_or_ps(g_XMNoFraction, sign); - __m128 R1 = _mm_add_ps(V, sMagic); - R1 = _mm_sub_ps(R1, sMagic); - __m128 R2 = _mm_and_ps(V, g_XMAbsMask); - __m128 mask = _mm_cmple_ps(R2, g_XMNoFraction); - R2 = _mm_andnot_ps(mask, V); - R1 = _mm_and_ps(R1, mask); - XMVECTOR vResult = _mm_xor_ps(R1, R2); - return vResult; -#endif -} - -#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) -#pragma float_control(pop) -#endif - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorTruncate(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR Result; - uint32_t i; - - // Avoid C4701 - Result.vector4_f32[0] = 0.0f; - - for (i = 0; i < 4; i++) - { - if (XMISNAN(V.vector4_f32[i])) - { - Result.vector4_u32[i] = 0x7FC00000; - } - else if (fabsf(V.vector4_f32[i]) < 8388608.0f) - { - Result.vector4_f32[i] = static_cast(static_cast(V.vector4_f32[i])); - } - else - { - Result.vector4_f32[i] = V.vector4_f32[i]; - } - } - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ - return vrndq_f32(V); -#else - float32x4_t vTest = vabsq_f32(V); - vTest = vreinterpretq_f32_u32(vcltq_f32(vTest, g_XMNoFraction)); - - int32x4_t vInt = vcvtq_s32_f32(V); - float32x4_t vResult = vcvtq_f32_s32(vInt); - - // All numbers less than 8388608 will use the round to int - // All others, use the ORIGINAL value - return vbslq_f32(vreinterpretq_u32_f32(vTest), vResult, V); -#endif -#elif defined(_XM_SSE4_INTRINSICS_) - return _mm_round_ps(V, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC); -#elif defined(_XM_SSE_INTRINSICS_) - // To handle NAN, INF and numbers greater than 8388608, use masking - // Get the abs value - __m128i vTest = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); - // Test for greater than 8388608 (All floats with NO fractionals, NAN and INF - vTest = _mm_cmplt_epi32(vTest, g_XMNoFraction); - // Convert to int and back to float for rounding with truncation - __m128i vInt = _mm_cvttps_epi32(V); - // Convert back to floats - XMVECTOR vResult = _mm_cvtepi32_ps(vInt); - // All numbers less than 8388608 will use the round to int - vResult = _mm_and_ps(vResult, _mm_castsi128_ps(vTest)); - // All others, use the ORIGINAL value - vTest = _mm_andnot_si128(vTest, _mm_castps_si128(V)); - vResult = _mm_or_ps(vResult, _mm_castsi128_ps(vTest)); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorFloor(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - floorf(V.vector4_f32[0]), - floorf(V.vector4_f32[1]), - floorf(V.vector4_f32[2]), - floorf(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ - return vrndmq_f32(V); -#else - float32x4_t vTest = vabsq_f32(V); - vTest = vreinterpretq_f32_u32(vcltq_f32(vTest, g_XMNoFraction)); - // Truncate - int32x4_t vInt = vcvtq_s32_f32(V); - float32x4_t vResult = vcvtq_f32_s32(vInt); - uint32x4_t vLargerMask = vcgtq_f32(vResult, V); - // 0 -> 0, 0xffffffff -> -1.0f - float32x4_t vLarger = vcvtq_f32_s32(vreinterpretq_s32_u32(vLargerMask)); - vResult = vaddq_f32(vResult, vLarger); - // All numbers less than 8388608 will use the round to int - // All others, use the ORIGINAL value - return vbslq_f32(vreinterpretq_u32_f32(vTest), vResult, V); -#endif -#elif defined(_XM_SSE4_INTRINSICS_) - return _mm_floor_ps(V); -#elif defined(_XM_SSE_INTRINSICS_) - // To handle NAN, INF and numbers greater than 8388608, use masking - __m128i vTest = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); - vTest = _mm_cmplt_epi32(vTest, g_XMNoFraction); - // Truncate - __m128i vInt = _mm_cvttps_epi32(V); - XMVECTOR vResult = _mm_cvtepi32_ps(vInt); - __m128 vLarger = _mm_cmpgt_ps(vResult, V); - // 0 -> 0, 0xffffffff -> -1.0f - vLarger = _mm_cvtepi32_ps(_mm_castps_si128(vLarger)); - vResult = _mm_add_ps(vResult, vLarger); - // All numbers less than 8388608 will use the round to int - vResult = _mm_and_ps(vResult, _mm_castsi128_ps(vTest)); - // All others, use the ORIGINAL value - vTest = _mm_andnot_si128(vTest, _mm_castps_si128(V)); - vResult = _mm_or_ps(vResult, _mm_castsi128_ps(vTest)); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorCeiling(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - ceilf(V.vector4_f32[0]), - ceilf(V.vector4_f32[1]), - ceilf(V.vector4_f32[2]), - ceilf(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ - return vrndpq_f32(V); -#else - float32x4_t vTest = vabsq_f32(V); - vTest = vreinterpretq_f32_u32(vcltq_f32(vTest, g_XMNoFraction)); - // Truncate - int32x4_t vInt = vcvtq_s32_f32(V); - float32x4_t vResult = vcvtq_f32_s32(vInt); - uint32x4_t vSmallerMask = vcltq_f32(vResult, V); - // 0 -> 0, 0xffffffff -> -1.0f - float32x4_t vSmaller = vcvtq_f32_s32(vreinterpretq_s32_u32(vSmallerMask)); - vResult = vsubq_f32(vResult, vSmaller); - // All numbers less than 8388608 will use the round to int - // All others, use the ORIGINAL value - return vbslq_f32(vreinterpretq_u32_f32(vTest), vResult, V); -#endif -#elif defined(_XM_SSE4_INTRINSICS_) - return _mm_ceil_ps(V); -#elif defined(_XM_SSE_INTRINSICS_) - // To handle NAN, INF and numbers greater than 8388608, use masking - __m128i vTest = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); - vTest = _mm_cmplt_epi32(vTest, g_XMNoFraction); - // Truncate - __m128i vInt = _mm_cvttps_epi32(V); - XMVECTOR vResult = _mm_cvtepi32_ps(vInt); - __m128 vSmaller = _mm_cmplt_ps(vResult, V); - // 0 -> 0, 0xffffffff -> -1.0f - vSmaller = _mm_cvtepi32_ps(_mm_castps_si128(vSmaller)); - vResult = _mm_sub_ps(vResult, vSmaller); - // All numbers less than 8388608 will use the round to int - vResult = _mm_and_ps(vResult, _mm_castsi128_ps(vTest)); - // All others, use the ORIGINAL value - vTest = _mm_andnot_si128(vTest, _mm_castps_si128(V)); - vResult = _mm_or_ps(vResult, _mm_castsi128_ps(vTest)); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorClamp -( - FXMVECTOR V, - FXMVECTOR Min, - FXMVECTOR Max -) noexcept -{ - assert(XMVector4LessOrEqual(Min, Max)); - -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Result; - Result = XMVectorMax(Min, V); - Result = XMVectorMin(Max, Result); - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t vResult = vmaxq_f32(Min, V); - vResult = vminq_f32(Max, vResult); - return vResult; -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult; - vResult = _mm_max_ps(Min, V); - vResult = _mm_min_ps(Max, vResult); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorSaturate(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - const XMVECTOR Zero = XMVectorZero(); - - return XMVectorClamp(V, Zero, g_XMOne.v); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Set <0 to 0 - float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); - // Set>1 to 1 - return vminq_f32(vResult, vdupq_n_f32(1.0f)); -#elif defined(_XM_SSE_INTRINSICS_) - // Set <0 to 0 - XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - // Set>1 to 1 - return _mm_min_ps(vResult, g_XMOne); -#endif -} - -//------------------------------------------------------------------------------ -// Bitwise logical operations -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorAndInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORU32 Result = { { { - V1.vector4_u32[0] & V2.vector4_u32[0], - V1.vector4_u32[1] & V2.vector4_u32[1], - V1.vector4_u32[2] & V2.vector4_u32[2], - V1.vector4_u32[3] & V2.vector4_u32[3] - } } }; - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2))); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_and_ps(V1, V2); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorAndCInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORU32 Result = { { { - V1.vector4_u32[0] & ~V2.vector4_u32[0], - V1.vector4_u32[1] & ~V2.vector4_u32[1], - V1.vector4_u32[2] & ~V2.vector4_u32[2], - V1.vector4_u32[3] & ~V2.vector4_u32[3] - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vbicq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2))); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i V = _mm_andnot_si128(_mm_castps_si128(V2), _mm_castps_si128(V1)); - return _mm_castsi128_ps(V); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorOrInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORU32 Result = { { { - V1.vector4_u32[0] | V2.vector4_u32[0], - V1.vector4_u32[1] | V2.vector4_u32[1], - V1.vector4_u32[2] | V2.vector4_u32[2], - V1.vector4_u32[3] | V2.vector4_u32[3] - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(vorrq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2))); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i V = _mm_or_si128(_mm_castps_si128(V1), _mm_castps_si128(V2)); - return _mm_castsi128_ps(V); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorNorInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORU32 Result = { { { - ~(V1.vector4_u32[0] | V2.vector4_u32[0]), - ~(V1.vector4_u32[1] | V2.vector4_u32[1]), - ~(V1.vector4_u32[2] | V2.vector4_u32[2]), - ~(V1.vector4_u32[3] | V2.vector4_u32[3]) - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t Result = vorrq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); - return vreinterpretq_f32_u32(vbicq_u32(g_XMNegOneMask, Result)); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i Result; - Result = _mm_or_si128(_mm_castps_si128(V1), _mm_castps_si128(V2)); - Result = _mm_andnot_si128(Result, g_XMNegOneMask); - return _mm_castsi128_ps(Result); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorXorInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORU32 Result = { { { - V1.vector4_u32[0] ^ V2.vector4_u32[0], - V1.vector4_u32[1] ^ V2.vector4_u32[1], - V1.vector4_u32[2] ^ V2.vector4_u32[2], - V1.vector4_u32[3] ^ V2.vector4_u32[3] - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vreinterpretq_f32_u32(veorq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2))); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i V = _mm_xor_si128(_mm_castps_si128(V1), _mm_castps_si128(V2)); - return _mm_castsi128_ps(V); -#endif -} - -//------------------------------------------------------------------------------ -// Computation operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorNegate(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORF32 Result = { { { - -V.vector4_f32[0], - -V.vector4_f32[1], - -V.vector4_f32[2], - -V.vector4_f32[3] - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vnegq_f32(V); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR Z; - - Z = _mm_setzero_ps(); - - return _mm_sub_ps(Z, V); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorAdd -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORF32 Result = { { { - V1.vector4_f32[0] + V2.vector4_f32[0], - V1.vector4_f32[1] + V2.vector4_f32[1], - V1.vector4_f32[2] + V2.vector4_f32[2], - V1.vector4_f32[3] + V2.vector4_f32[3] - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vaddq_f32(V1, V2); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_add_ps(V1, V2); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorSum(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORF32 Result; - Result.f[0] = - Result.f[1] = - Result.f[2] = - Result.f[3] = V.vector4_f32[0] + V.vector4_f32[1] + V.vector4_f32[2] + V.vector4_f32[3]; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ - float32x4_t vTemp = vpaddq_f32(V, V); - return vpaddq_f32(vTemp, vTemp); -#else - float32x2_t v1 = vget_low_f32(V); - float32x2_t v2 = vget_high_f32(V); - v1 = vadd_f32(v1, v2); - v1 = vpadd_f32(v1, v1); - return vcombine_f32(v1, v1); -#endif -#elif defined(_XM_SSE3_INTRINSICS_) - XMVECTOR vTemp = _mm_hadd_ps(V, V); - return _mm_hadd_ps(vTemp, vTemp); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 3, 0, 1)); - XMVECTOR vTemp2 = _mm_add_ps(V, vTemp); - vTemp = XM_PERMUTE_PS(vTemp2, _MM_SHUFFLE(1, 0, 3, 2)); - return _mm_add_ps(vTemp, vTemp2); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorAddAngles -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - const XMVECTOR Zero = XMVectorZero(); - - // Add the given angles together. If the range of V1 is such - // that -Pi <= V1 < Pi and the range of V2 is such that - // -2Pi <= V2 <= 2Pi, then the range of the resulting angle - // will be -Pi <= Result < Pi. - XMVECTOR Result = XMVectorAdd(V1, V2); - - XMVECTOR Mask = XMVectorLess(Result, g_XMNegativePi.v); - XMVECTOR Offset = XMVectorSelect(Zero, g_XMTwoPi.v, Mask); - - Mask = XMVectorGreaterOrEqual(Result, g_XMPi.v); - Offset = XMVectorSelect(Offset, g_XMNegativeTwoPi.v, Mask); - - Result = XMVectorAdd(Result, Offset); - - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Adjust the angles - float32x4_t vResult = vaddq_f32(V1, V2); - // Less than Pi? - uint32x4_t vOffset = vcltq_f32(vResult, g_XMNegativePi); - vOffset = vandq_u32(vOffset, g_XMTwoPi); - // Add 2Pi to all entries less than -Pi - vResult = vaddq_f32(vResult, vreinterpretq_f32_u32(vOffset)); - // Greater than or equal to Pi? - vOffset = vcgeq_f32(vResult, g_XMPi); - vOffset = vandq_u32(vOffset, g_XMTwoPi); - // Sub 2Pi to all entries greater than Pi - vResult = vsubq_f32(vResult, vreinterpretq_f32_u32(vOffset)); - return vResult; -#elif defined(_XM_SSE_INTRINSICS_) - // Adjust the angles - XMVECTOR vResult = _mm_add_ps(V1, V2); - // Less than Pi? - XMVECTOR vOffset = _mm_cmplt_ps(vResult, g_XMNegativePi); - vOffset = _mm_and_ps(vOffset, g_XMTwoPi); - // Add 2Pi to all entries less than -Pi - vResult = _mm_add_ps(vResult, vOffset); - // Greater than or equal to Pi? - vOffset = _mm_cmpge_ps(vResult, g_XMPi); - vOffset = _mm_and_ps(vOffset, g_XMTwoPi); - // Sub 2Pi to all entries greater than Pi - vResult = _mm_sub_ps(vResult, vOffset); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorSubtract -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORF32 Result = { { { - V1.vector4_f32[0] - V2.vector4_f32[0], - V1.vector4_f32[1] - V2.vector4_f32[1], - V1.vector4_f32[2] - V2.vector4_f32[2], - V1.vector4_f32[3] - V2.vector4_f32[3] - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vsubq_f32(V1, V2); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_sub_ps(V1, V2); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorSubtractAngles -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - const XMVECTOR Zero = XMVectorZero(); - - // Subtract the given angles. If the range of V1 is such - // that -Pi <= V1 < Pi and the range of V2 is such that - // -2Pi <= V2 <= 2Pi, then the range of the resulting angle - // will be -Pi <= Result < Pi. - XMVECTOR Result = XMVectorSubtract(V1, V2); - - XMVECTOR Mask = XMVectorLess(Result, g_XMNegativePi.v); - XMVECTOR Offset = XMVectorSelect(Zero, g_XMTwoPi.v, Mask); - - Mask = XMVectorGreaterOrEqual(Result, g_XMPi.v); - Offset = XMVectorSelect(Offset, g_XMNegativeTwoPi.v, Mask); - - Result = XMVectorAdd(Result, Offset); - - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Adjust the angles - XMVECTOR vResult = vsubq_f32(V1, V2); - // Less than Pi? - uint32x4_t vOffset = vcltq_f32(vResult, g_XMNegativePi); - vOffset = vandq_u32(vOffset, g_XMTwoPi); - // Add 2Pi to all entries less than -Pi - vResult = vaddq_f32(vResult, vreinterpretq_f32_u32(vOffset)); - // Greater than or equal to Pi? - vOffset = vcgeq_f32(vResult, g_XMPi); - vOffset = vandq_u32(vOffset, g_XMTwoPi); - // Sub 2Pi to all entries greater than Pi - vResult = vsubq_f32(vResult, vreinterpretq_f32_u32(vOffset)); - return vResult; -#elif defined(_XM_SSE_INTRINSICS_) - // Adjust the angles - XMVECTOR vResult = _mm_sub_ps(V1, V2); - // Less than Pi? - XMVECTOR vOffset = _mm_cmplt_ps(vResult, g_XMNegativePi); - vOffset = _mm_and_ps(vOffset, g_XMTwoPi); - // Add 2Pi to all entries less than -Pi - vResult = _mm_add_ps(vResult, vOffset); - // Greater than or equal to Pi? - vOffset = _mm_cmpge_ps(vResult, g_XMPi); - vOffset = _mm_and_ps(vOffset, g_XMTwoPi); - // Sub 2Pi to all entries greater than Pi - vResult = _mm_sub_ps(vResult, vOffset); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorMultiply -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - V1.vector4_f32[0] * V2.vector4_f32[0], - V1.vector4_f32[1] * V2.vector4_f32[1], - V1.vector4_f32[2] * V2.vector4_f32[2], - V1.vector4_f32[3] * V2.vector4_f32[3] - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vmulq_f32(V1, V2); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_mul_ps(V1, V2); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorMultiplyAdd -( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR V3 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - V1.vector4_f32[0] * V2.vector4_f32[0] + V3.vector4_f32[0], - V1.vector4_f32[1] * V2.vector4_f32[1] + V3.vector4_f32[1], - V1.vector4_f32[2] * V2.vector4_f32[2] + V3.vector4_f32[2], - V1.vector4_f32[3] * V2.vector4_f32[3] + V3.vector4_f32[3] - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ - return vfmaq_f32(V3, V1, V2); -#else - return vmlaq_f32(V3, V1, V2); -#endif -#elif defined(_XM_SSE_INTRINSICS_) - return XM_FMADD_PS(V1, V2, V3); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorDivide -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - V1.vector4_f32[0] / V2.vector4_f32[0], - V1.vector4_f32[1] / V2.vector4_f32[1], - V1.vector4_f32[2] / V2.vector4_f32[2], - V1.vector4_f32[3] / V2.vector4_f32[3] - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ - return vdivq_f32(V1, V2); -#else - // 2 iterations of Newton-Raphson refinement of reciprocal - float32x4_t Reciprocal = vrecpeq_f32(V2); - float32x4_t S = vrecpsq_f32(Reciprocal, V2); - Reciprocal = vmulq_f32(S, Reciprocal); - S = vrecpsq_f32(Reciprocal, V2); - Reciprocal = vmulq_f32(S, Reciprocal); - return vmulq_f32(V1, Reciprocal); -#endif -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_div_ps(V1, V2); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorNegativeMultiplySubtract -( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR V3 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - V3.vector4_f32[0] - (V1.vector4_f32[0] * V2.vector4_f32[0]), - V3.vector4_f32[1] - (V1.vector4_f32[1] * V2.vector4_f32[1]), - V3.vector4_f32[2] - (V1.vector4_f32[2] * V2.vector4_f32[2]), - V3.vector4_f32[3] - (V1.vector4_f32[3] * V2.vector4_f32[3]) - } } }; - return Result; -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ - return vfmsq_f32(V3, V1, V2); -#else - return vmlsq_f32(V3, V1, V2); -#endif -#elif defined(_XM_SSE_INTRINSICS_) - return XM_FNMADD_PS(V1, V2, V3); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorScale -( - FXMVECTOR V, - float ScaleFactor -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - V.vector4_f32[0] * ScaleFactor, - V.vector4_f32[1] * ScaleFactor, - V.vector4_f32[2] * ScaleFactor, - V.vector4_f32[3] * ScaleFactor - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vmulq_n_f32(V, ScaleFactor); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = _mm_set_ps1(ScaleFactor); - return _mm_mul_ps(vResult, V); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorReciprocalEst(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - 1.f / V.vector4_f32[0], - 1.f / V.vector4_f32[1], - 1.f / V.vector4_f32[2], - 1.f / V.vector4_f32[3] - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vrecpeq_f32(V); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_rcp_ps(V); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorReciprocal(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - 1.f / V.vector4_f32[0], - 1.f / V.vector4_f32[1], - 1.f / V.vector4_f32[2], - 1.f / V.vector4_f32[3] - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ - float32x4_t one = vdupq_n_f32(1.0f); - return vdivq_f32(one, V); -#else - // 2 iterations of Newton-Raphson refinement - float32x4_t Reciprocal = vrecpeq_f32(V); - float32x4_t S = vrecpsq_f32(Reciprocal, V); - Reciprocal = vmulq_f32(S, Reciprocal); - S = vrecpsq_f32(Reciprocal, V); - return vmulq_f32(S, Reciprocal); -#endif -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_div_ps(g_XMOne, V); -#endif -} - -//------------------------------------------------------------------------------ -// Return an estimated square root -inline XMVECTOR XM_CALLCONV XMVectorSqrtEst(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - sqrtf(V.vector4_f32[0]), - sqrtf(V.vector4_f32[1]), - sqrtf(V.vector4_f32[2]), - sqrtf(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // 1 iteration of Newton-Raphson refinment of sqrt - float32x4_t S0 = vrsqrteq_f32(V); - float32x4_t P0 = vmulq_f32(V, S0); - float32x4_t R0 = vrsqrtsq_f32(P0, S0); - float32x4_t S1 = vmulq_f32(S0, R0); - - XMVECTOR VEqualsInfinity = XMVectorEqualInt(V, g_XMInfinity.v); - XMVECTOR VEqualsZero = XMVectorEqual(V, vdupq_n_f32(0)); - XMVECTOR Result = vmulq_f32(V, S1); - XMVECTOR Select = XMVectorEqualInt(VEqualsInfinity, VEqualsZero); - return XMVectorSelect(V, Result, Select); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_sqrt_ps(V); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorSqrt(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - sqrtf(V.vector4_f32[0]), - sqrtf(V.vector4_f32[1]), - sqrtf(V.vector4_f32[2]), - sqrtf(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // 3 iterations of Newton-Raphson refinment of sqrt - float32x4_t S0 = vrsqrteq_f32(V); - float32x4_t P0 = vmulq_f32(V, S0); - float32x4_t R0 = vrsqrtsq_f32(P0, S0); - float32x4_t S1 = vmulq_f32(S0, R0); - float32x4_t P1 = vmulq_f32(V, S1); - float32x4_t R1 = vrsqrtsq_f32(P1, S1); - float32x4_t S2 = vmulq_f32(S1, R1); - float32x4_t P2 = vmulq_f32(V, S2); - float32x4_t R2 = vrsqrtsq_f32(P2, S2); - float32x4_t S3 = vmulq_f32(S2, R2); - - XMVECTOR VEqualsInfinity = XMVectorEqualInt(V, g_XMInfinity.v); - XMVECTOR VEqualsZero = XMVectorEqual(V, vdupq_n_f32(0)); - XMVECTOR Result = vmulq_f32(V, S3); - XMVECTOR Select = XMVectorEqualInt(VEqualsInfinity, VEqualsZero); - return XMVectorSelect(V, Result, Select); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_sqrt_ps(V); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorReciprocalSqrtEst(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - 1.f / sqrtf(V.vector4_f32[0]), - 1.f / sqrtf(V.vector4_f32[1]), - 1.f / sqrtf(V.vector4_f32[2]), - 1.f / sqrtf(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vrsqrteq_f32(V); -#elif defined(_XM_SSE_INTRINSICS_) - return _mm_rsqrt_ps(V); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorReciprocalSqrt(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - 1.f / sqrtf(V.vector4_f32[0]), - 1.f / sqrtf(V.vector4_f32[1]), - 1.f / sqrtf(V.vector4_f32[2]), - 1.f / sqrtf(V.vector4_f32[3]) - } } }; - return Result; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // 2 iterations of Newton-Raphson refinement of reciprocal - float32x4_t S0 = vrsqrteq_f32(V); - - float32x4_t P0 = vmulq_f32(V, S0); - float32x4_t R0 = vrsqrtsq_f32(P0, S0); - - float32x4_t S1 = vmulq_f32(S0, R0); - float32x4_t P1 = vmulq_f32(V, S1); - float32x4_t R1 = vrsqrtsq_f32(P1, S1); - - return vmulq_f32(S1, R1); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = _mm_sqrt_ps(V); - vResult = _mm_div_ps(g_XMOne, vResult); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorExp2(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - exp2f(V.vector4_f32[0]), - exp2f(V.vector4_f32[1]), - exp2f(V.vector4_f32[2]), - exp2f(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - int32x4_t itrunc = vcvtq_s32_f32(V); - float32x4_t ftrunc = vcvtq_f32_s32(itrunc); - float32x4_t y = vsubq_f32(V, ftrunc); - - float32x4_t poly = vmlaq_f32(g_XMExpEst6, g_XMExpEst7, y); - poly = vmlaq_f32(g_XMExpEst5, poly, y); - poly = vmlaq_f32(g_XMExpEst4, poly, y); - poly = vmlaq_f32(g_XMExpEst3, poly, y); - poly = vmlaq_f32(g_XMExpEst2, poly, y); - poly = vmlaq_f32(g_XMExpEst1, poly, y); - poly = vmlaq_f32(g_XMOne, poly, y); - - int32x4_t biased = vaddq_s32(itrunc, g_XMExponentBias); - biased = vshlq_n_s32(biased, 23); - float32x4_t result0 = XMVectorDivide(vreinterpretq_f32_s32(biased), poly); - - biased = vaddq_s32(itrunc, g_XM253); - biased = vshlq_n_s32(biased, 23); - float32x4_t result1 = XMVectorDivide(vreinterpretq_f32_s32(biased), poly); - result1 = vmulq_f32(g_XMMinNormal.v, result1); - - // Use selection to handle the cases - // if (V is NaN) -> QNaN; - // else if (V sign bit set) - // if (V > -150) - // if (V.exponent < -126) -> result1 - // else -> result0 - // else -> +0 - // else - // if (V < 128) -> result0 - // else -> +inf - - uint32x4_t comp = vcltq_s32(vreinterpretq_s32_f32(V), g_XMBin128); - float32x4_t result2 = vbslq_f32(comp, result0, g_XMInfinity); - - comp = vcltq_s32(itrunc, g_XMSubnormalExponent); - float32x4_t result3 = vbslq_f32(comp, result1, result0); - - comp = vcltq_s32(vreinterpretq_s32_f32(V), g_XMBinNeg150); - float32x4_t result4 = vbslq_f32(comp, result3, g_XMZero); - - int32x4_t sign = vandq_s32(vreinterpretq_s32_f32(V), g_XMNegativeZero); - comp = vceqq_s32(sign, g_XMNegativeZero); - float32x4_t result5 = vbslq_f32(comp, result4, result2); - - int32x4_t t0 = vandq_s32(vreinterpretq_s32_f32(V), g_XMQNaNTest); - int32x4_t t1 = vandq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); - t0 = vreinterpretq_s32_u32(vceqq_s32(t0, g_XMZero)); - t1 = vreinterpretq_s32_u32(vceqq_s32(t1, g_XMInfinity)); - int32x4_t isNaN = vbicq_s32(t1, t0); - - float32x4_t vResult = vbslq_f32(vreinterpretq_u32_s32(isNaN), g_XMQNaN, result5); - return vResult; -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_exp2_ps(V); - return Result; -#elif defined(_XM_SSE_INTRINSICS_) - __m128i itrunc = _mm_cvttps_epi32(V); - __m128 ftrunc = _mm_cvtepi32_ps(itrunc); - __m128 y = _mm_sub_ps(V, ftrunc); - - __m128 poly = XM_FMADD_PS(g_XMExpEst7, y, g_XMExpEst6); - poly = XM_FMADD_PS(poly, y, g_XMExpEst5); - poly = XM_FMADD_PS(poly, y, g_XMExpEst4); - poly = XM_FMADD_PS(poly, y, g_XMExpEst3); - poly = XM_FMADD_PS(poly, y, g_XMExpEst2); - poly = XM_FMADD_PS(poly, y, g_XMExpEst1); - poly = XM_FMADD_PS(poly, y, g_XMOne); - - __m128i biased = _mm_add_epi32(itrunc, g_XMExponentBias); - biased = _mm_slli_epi32(biased, 23); - __m128 result0 = _mm_div_ps(_mm_castsi128_ps(biased), poly); - - biased = _mm_add_epi32(itrunc, g_XM253); - biased = _mm_slli_epi32(biased, 23); - __m128 result1 = _mm_div_ps(_mm_castsi128_ps(biased), poly); - result1 = _mm_mul_ps(g_XMMinNormal.v, result1); - - // Use selection to handle the cases - // if (V is NaN) -> QNaN; - // else if (V sign bit set) - // if (V > -150) - // if (V.exponent < -126) -> result1 - // else -> result0 - // else -> +0 - // else - // if (V < 128) -> result0 - // else -> +inf - - __m128i comp = _mm_cmplt_epi32(_mm_castps_si128(V), g_XMBin128); - __m128i select0 = _mm_and_si128(comp, _mm_castps_si128(result0)); - __m128i select1 = _mm_andnot_si128(comp, g_XMInfinity); - __m128i result2 = _mm_or_si128(select0, select1); - - comp = _mm_cmplt_epi32(itrunc, g_XMSubnormalExponent); - select1 = _mm_and_si128(comp, _mm_castps_si128(result1)); - select0 = _mm_andnot_si128(comp, _mm_castps_si128(result0)); - __m128i result3 = _mm_or_si128(select0, select1); - - comp = _mm_cmplt_epi32(_mm_castps_si128(V), g_XMBinNeg150); - select0 = _mm_and_si128(comp, result3); - select1 = _mm_andnot_si128(comp, g_XMZero); - __m128i result4 = _mm_or_si128(select0, select1); - - __m128i sign = _mm_and_si128(_mm_castps_si128(V), g_XMNegativeZero); - comp = _mm_cmpeq_epi32(sign, g_XMNegativeZero); - select0 = _mm_and_si128(comp, result4); - select1 = _mm_andnot_si128(comp, result2); - __m128i result5 = _mm_or_si128(select0, select1); - - __m128i t0 = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); - __m128i t1 = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); - t0 = _mm_cmpeq_epi32(t0, g_XMZero); - t1 = _mm_cmpeq_epi32(t1, g_XMInfinity); - __m128i isNaN = _mm_andnot_si128(t0, t1); - - select0 = _mm_and_si128(isNaN, g_XMQNaN); - select1 = _mm_andnot_si128(isNaN, result5); - __m128i vResult = _mm_or_si128(select0, select1); - - return _mm_castsi128_ps(vResult); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorExp10(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORF32 Result = { { { - powf(10.0f, V.vector4_f32[0]), - powf(10.0f, V.vector4_f32[1]), - powf(10.0f, V.vector4_f32[2]), - powf(10.0f, V.vector4_f32[3]) - } } }; - return Result.v; - -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_exp10_ps(V); - return Result; -#else - // exp10(V) = exp2(vin*log2(10)) - XMVECTOR Vten = XMVectorMultiply(g_XMLg10, V); - return XMVectorExp2(Vten); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorExpE(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORF32 Result = { { { - expf(V.vector4_f32[0]), - expf(V.vector4_f32[1]), - expf(V.vector4_f32[2]), - expf(V.vector4_f32[3]) - } } }; - return Result.v; - -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_exp_ps(V); - return Result; -#else - // expE(V) = exp2(vin*log2(e)) - XMVECTOR Ve = XMVectorMultiply(g_XMLgE, V); - return XMVectorExp2(Ve); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorExp(FXMVECTOR V) noexcept -{ - return XMVectorExp2(V); -} - -//------------------------------------------------------------------------------ - -#if defined(_XM_SSE_INTRINSICS_) - -namespace MathInternal -{ - inline __m128i multi_sll_epi32(__m128i value, __m128i count) noexcept - { - __m128i v = _mm_shuffle_epi32(value, _MM_SHUFFLE(0, 0, 0, 0)); - __m128i c = _mm_shuffle_epi32(count, _MM_SHUFFLE(0, 0, 0, 0)); - c = _mm_and_si128(c, g_XMMaskX); - __m128i r0 = _mm_sll_epi32(v, c); - - v = _mm_shuffle_epi32(value, _MM_SHUFFLE(1, 1, 1, 1)); - c = _mm_shuffle_epi32(count, _MM_SHUFFLE(1, 1, 1, 1)); - c = _mm_and_si128(c, g_XMMaskX); - __m128i r1 = _mm_sll_epi32(v, c); - - v = _mm_shuffle_epi32(value, _MM_SHUFFLE(2, 2, 2, 2)); - c = _mm_shuffle_epi32(count, _MM_SHUFFLE(2, 2, 2, 2)); - c = _mm_and_si128(c, g_XMMaskX); - __m128i r2 = _mm_sll_epi32(v, c); - - v = _mm_shuffle_epi32(value, _MM_SHUFFLE(3, 3, 3, 3)); - c = _mm_shuffle_epi32(count, _MM_SHUFFLE(3, 3, 3, 3)); - c = _mm_and_si128(c, g_XMMaskX); - __m128i r3 = _mm_sll_epi32(v, c); - - // (r0,r0,r1,r1) - __m128 r01 = _mm_shuffle_ps(_mm_castsi128_ps(r0), _mm_castsi128_ps(r1), _MM_SHUFFLE(0, 0, 0, 0)); - // (r2,r2,r3,r3) - __m128 r23 = _mm_shuffle_ps(_mm_castsi128_ps(r2), _mm_castsi128_ps(r3), _MM_SHUFFLE(0, 0, 0, 0)); - // (r0,r1,r2,r3) - __m128 result = _mm_shuffle_ps(r01, r23, _MM_SHUFFLE(2, 0, 2, 0)); - return _mm_castps_si128(result); - } - - inline __m128i multi_srl_epi32(__m128i value, __m128i count) noexcept - { - __m128i v = _mm_shuffle_epi32(value, _MM_SHUFFLE(0, 0, 0, 0)); - __m128i c = _mm_shuffle_epi32(count, _MM_SHUFFLE(0, 0, 0, 0)); - c = _mm_and_si128(c, g_XMMaskX); - __m128i r0 = _mm_srl_epi32(v, c); - - v = _mm_shuffle_epi32(value, _MM_SHUFFLE(1, 1, 1, 1)); - c = _mm_shuffle_epi32(count, _MM_SHUFFLE(1, 1, 1, 1)); - c = _mm_and_si128(c, g_XMMaskX); - __m128i r1 = _mm_srl_epi32(v, c); - - v = _mm_shuffle_epi32(value, _MM_SHUFFLE(2, 2, 2, 2)); - c = _mm_shuffle_epi32(count, _MM_SHUFFLE(2, 2, 2, 2)); - c = _mm_and_si128(c, g_XMMaskX); - __m128i r2 = _mm_srl_epi32(v, c); - - v = _mm_shuffle_epi32(value, _MM_SHUFFLE(3, 3, 3, 3)); - c = _mm_shuffle_epi32(count, _MM_SHUFFLE(3, 3, 3, 3)); - c = _mm_and_si128(c, g_XMMaskX); - __m128i r3 = _mm_srl_epi32(v, c); - - // (r0,r0,r1,r1) - __m128 r01 = _mm_shuffle_ps(_mm_castsi128_ps(r0), _mm_castsi128_ps(r1), _MM_SHUFFLE(0, 0, 0, 0)); - // (r2,r2,r3,r3) - __m128 r23 = _mm_shuffle_ps(_mm_castsi128_ps(r2), _mm_castsi128_ps(r3), _MM_SHUFFLE(0, 0, 0, 0)); - // (r0,r1,r2,r3) - __m128 result = _mm_shuffle_ps(r01, r23, _MM_SHUFFLE(2, 0, 2, 0)); - return _mm_castps_si128(result); - } - - inline __m128i GetLeadingBit(const __m128i value) noexcept - { - static const XMVECTORI32 g_XM0000FFFF = { { { 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF } } }; - static const XMVECTORI32 g_XM000000FF = { { { 0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF } } }; - static const XMVECTORI32 g_XM0000000F = { { { 0x0000000F, 0x0000000F, 0x0000000F, 0x0000000F } } }; - static const XMVECTORI32 g_XM00000003 = { { { 0x00000003, 0x00000003, 0x00000003, 0x00000003 } } }; - - __m128i v = value, r, c, b, s; - - c = _mm_cmpgt_epi32(v, g_XM0000FFFF); // c = (v > 0xFFFF) - b = _mm_srli_epi32(c, 31); // b = (c ? 1 : 0) - r = _mm_slli_epi32(b, 4); // r = (b << 4) - v = multi_srl_epi32(v, r); // v = (v >> r) - - c = _mm_cmpgt_epi32(v, g_XM000000FF); // c = (v > 0xFF) - b = _mm_srli_epi32(c, 31); // b = (c ? 1 : 0) - s = _mm_slli_epi32(b, 3); // s = (b << 3) - v = multi_srl_epi32(v, s); // v = (v >> s) - r = _mm_or_si128(r, s); // r = (r | s) - - c = _mm_cmpgt_epi32(v, g_XM0000000F); // c = (v > 0xF) - b = _mm_srli_epi32(c, 31); // b = (c ? 1 : 0) - s = _mm_slli_epi32(b, 2); // s = (b << 2) - v = multi_srl_epi32(v, s); // v = (v >> s) - r = _mm_or_si128(r, s); // r = (r | s) - - c = _mm_cmpgt_epi32(v, g_XM00000003); // c = (v > 0x3) - b = _mm_srli_epi32(c, 31); // b = (c ? 1 : 0) - s = _mm_slli_epi32(b, 1); // s = (b << 1) - v = multi_srl_epi32(v, s); // v = (v >> s) - r = _mm_or_si128(r, s); // r = (r | s) - - s = _mm_srli_epi32(v, 1); - r = _mm_or_si128(r, s); - return r; - } -} // namespace MathInternal - -#endif // _XM_SSE_INTRINSICS_ - -#if defined(_XM_ARM_NEON_INTRINSICS_) - -namespace MathInternal -{ - inline int32x4_t GetLeadingBit(const int32x4_t value) noexcept - { - static const XMVECTORI32 g_XM0000FFFF = { { { 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF } } }; - static const XMVECTORI32 g_XM000000FF = { { { 0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF } } }; - static const XMVECTORI32 g_XM0000000F = { { { 0x0000000F, 0x0000000F, 0x0000000F, 0x0000000F } } }; - static const XMVECTORI32 g_XM00000003 = { { { 0x00000003, 0x00000003, 0x00000003, 0x00000003 } } }; - - uint32x4_t c = vcgtq_s32(value, g_XM0000FFFF); // c = (v > 0xFFFF) - int32x4_t b = vshrq_n_s32(vreinterpretq_s32_u32(c), 31); // b = (c ? 1 : 0) - int32x4_t r = vshlq_n_s32(b, 4); // r = (b << 4) - r = vnegq_s32(r); - int32x4_t v = vshlq_s32(value, r); // v = (v >> r) - - c = vcgtq_s32(v, g_XM000000FF); // c = (v > 0xFF) - b = vshrq_n_s32(vreinterpretq_s32_u32(c), 31); // b = (c ? 1 : 0) - int32x4_t s = vshlq_n_s32(b, 3); // s = (b << 3) - s = vnegq_s32(s); - v = vshlq_s32(v, s); // v = (v >> s) - r = vorrq_s32(r, s); // r = (r | s) - - c = vcgtq_s32(v, g_XM0000000F); // c = (v > 0xF) - b = vshrq_n_s32(vreinterpretq_s32_u32(c), 31); // b = (c ? 1 : 0) - s = vshlq_n_s32(b, 2); // s = (b << 2) - s = vnegq_s32(s); - v = vshlq_s32(v, s); // v = (v >> s) - r = vorrq_s32(r, s); // r = (r | s) - - c = vcgtq_s32(v, g_XM00000003); // c = (v > 0x3) - b = vshrq_n_s32(vreinterpretq_s32_u32(c), 31); // b = (c ? 1 : 0) - s = vshlq_n_s32(b, 1); // s = (b << 1) - s = vnegq_s32(s); - v = vshlq_s32(v, s); // v = (v >> s) - r = vorrq_s32(r, s); // r = (r | s) - - s = vshrq_n_s32(v, 1); - r = vorrq_s32(r, s); - return r; - } - -} // namespace MathInternal - -#endif - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorLog2(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - log2f(V.vector4_f32[0]), - log2f(V.vector4_f32[1]), - log2f(V.vector4_f32[2]), - log2f(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - int32x4_t rawBiased = vandq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); - int32x4_t trailing = vandq_s32(vreinterpretq_s32_f32(V), g_XMQNaNTest); - uint32x4_t isExponentZero = vceqq_s32(vreinterpretq_s32_f32(g_XMZero), rawBiased); - - // Compute exponent and significand for normals. - int32x4_t biased = vshrq_n_s32(rawBiased, 23); - int32x4_t exponentNor = vsubq_s32(biased, g_XMExponentBias); - int32x4_t trailingNor = trailing; - - // Compute exponent and significand for subnormals. - int32x4_t leading = MathInternal::GetLeadingBit(trailing); - int32x4_t shift = vsubq_s32(g_XMNumTrailing, leading); - int32x4_t exponentSub = vsubq_s32(g_XMSubnormalExponent, shift); - int32x4_t trailingSub = vshlq_s32(trailing, shift); - trailingSub = vandq_s32(trailingSub, g_XMQNaNTest); - int32x4_t e = vbslq_s32(isExponentZero, exponentSub, exponentNor); - int32x4_t t = vbslq_s32(isExponentZero, trailingSub, trailingNor); - - // Compute the approximation. - int32x4_t tmp = vorrq_s32(vreinterpretq_s32_f32(g_XMOne), t); - float32x4_t y = vsubq_f32(vreinterpretq_f32_s32(tmp), g_XMOne); - - float32x4_t log2 = vmlaq_f32(g_XMLogEst6, g_XMLogEst7, y); - log2 = vmlaq_f32(g_XMLogEst5, log2, y); - log2 = vmlaq_f32(g_XMLogEst4, log2, y); - log2 = vmlaq_f32(g_XMLogEst3, log2, y); - log2 = vmlaq_f32(g_XMLogEst2, log2, y); - log2 = vmlaq_f32(g_XMLogEst1, log2, y); - log2 = vmlaq_f32(g_XMLogEst0, log2, y); - log2 = vmlaq_f32(vcvtq_f32_s32(e), log2, y); - - // if (x is NaN) -> QNaN - // else if (V is positive) - // if (V is infinite) -> +inf - // else -> log2(V) - // else - // if (V is zero) -> -inf - // else -> -QNaN - - uint32x4_t isInfinite = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); - isInfinite = vceqq_u32(isInfinite, g_XMInfinity); - - uint32x4_t isGreaterZero = vcgtq_f32(V, g_XMZero); - uint32x4_t isNotFinite = vcgtq_f32(V, g_XMInfinity); - uint32x4_t isPositive = vbicq_u32(isGreaterZero, isNotFinite); - - uint32x4_t isZero = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); - isZero = vceqq_u32(isZero, g_XMZero); - - uint32x4_t t0 = vandq_u32(vreinterpretq_u32_f32(V), g_XMQNaNTest); - uint32x4_t t1 = vandq_u32(vreinterpretq_u32_f32(V), g_XMInfinity); - t0 = vceqq_u32(t0, g_XMZero); - t1 = vceqq_u32(t1, g_XMInfinity); - uint32x4_t isNaN = vbicq_u32(t1, t0); - - float32x4_t result = vbslq_f32(isInfinite, g_XMInfinity, log2); - float32x4_t tmp2 = vbslq_f32(isZero, g_XMNegInfinity, g_XMNegQNaN); - result = vbslq_f32(isPositive, result, tmp2); - result = vbslq_f32(isNaN, g_XMQNaN, result); - return result; -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_log2_ps(V); - return Result; -#elif defined(_XM_SSE_INTRINSICS_) - __m128i rawBiased = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); - __m128i trailing = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); - __m128i isExponentZero = _mm_cmpeq_epi32(g_XMZero, rawBiased); - - // Compute exponent and significand for normals. - __m128i biased = _mm_srli_epi32(rawBiased, 23); - __m128i exponentNor = _mm_sub_epi32(biased, g_XMExponentBias); - __m128i trailingNor = trailing; - - // Compute exponent and significand for subnormals. - __m128i leading = MathInternal::GetLeadingBit(trailing); - __m128i shift = _mm_sub_epi32(g_XMNumTrailing, leading); - __m128i exponentSub = _mm_sub_epi32(g_XMSubnormalExponent, shift); - __m128i trailingSub = MathInternal::multi_sll_epi32(trailing, shift); - trailingSub = _mm_and_si128(trailingSub, g_XMQNaNTest); - - __m128i select0 = _mm_and_si128(isExponentZero, exponentSub); - __m128i select1 = _mm_andnot_si128(isExponentZero, exponentNor); - __m128i e = _mm_or_si128(select0, select1); - - select0 = _mm_and_si128(isExponentZero, trailingSub); - select1 = _mm_andnot_si128(isExponentZero, trailingNor); - __m128i t = _mm_or_si128(select0, select1); - - // Compute the approximation. - __m128i tmp = _mm_or_si128(g_XMOne, t); - __m128 y = _mm_sub_ps(_mm_castsi128_ps(tmp), g_XMOne); - - __m128 log2 = XM_FMADD_PS(g_XMLogEst7, y, g_XMLogEst6); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst5); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst4); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst3); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst2); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst1); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst0); - log2 = XM_FMADD_PS(log2, y, _mm_cvtepi32_ps(e)); - - // if (x is NaN) -> QNaN - // else if (V is positive) - // if (V is infinite) -> +inf - // else -> log2(V) - // else - // if (V is zero) -> -inf - // else -> -QNaN - - __m128i isInfinite = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); - isInfinite = _mm_cmpeq_epi32(isInfinite, g_XMInfinity); - - __m128i isGreaterZero = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMZero); - __m128i isNotFinite = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMInfinity); - __m128i isPositive = _mm_andnot_si128(isNotFinite, isGreaterZero); - - __m128i isZero = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); - isZero = _mm_cmpeq_epi32(isZero, g_XMZero); - - __m128i t0 = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); - __m128i t1 = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); - t0 = _mm_cmpeq_epi32(t0, g_XMZero); - t1 = _mm_cmpeq_epi32(t1, g_XMInfinity); - __m128i isNaN = _mm_andnot_si128(t0, t1); - - select0 = _mm_and_si128(isInfinite, g_XMInfinity); - select1 = _mm_andnot_si128(isInfinite, _mm_castps_si128(log2)); - __m128i result = _mm_or_si128(select0, select1); - - select0 = _mm_and_si128(isZero, g_XMNegInfinity); - select1 = _mm_andnot_si128(isZero, g_XMNegQNaN); - tmp = _mm_or_si128(select0, select1); - - select0 = _mm_and_si128(isPositive, result); - select1 = _mm_andnot_si128(isPositive, tmp); - result = _mm_or_si128(select0, select1); - - select0 = _mm_and_si128(isNaN, g_XMQNaN); - select1 = _mm_andnot_si128(isNaN, result); - result = _mm_or_si128(select0, select1); - - return _mm_castsi128_ps(result); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorLog10(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORF32 Result = { { { - log10f(V.vector4_f32[0]), - log10f(V.vector4_f32[1]), - log10f(V.vector4_f32[2]), - log10f(V.vector4_f32[3]) - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - int32x4_t rawBiased = vandq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); - int32x4_t trailing = vandq_s32(vreinterpretq_s32_f32(V), g_XMQNaNTest); - uint32x4_t isExponentZero = vceqq_s32(g_XMZero, rawBiased); - - // Compute exponent and significand for normals. - int32x4_t biased = vshrq_n_s32(rawBiased, 23); - int32x4_t exponentNor = vsubq_s32(biased, g_XMExponentBias); - int32x4_t trailingNor = trailing; - - // Compute exponent and significand for subnormals. - int32x4_t leading = MathInternal::GetLeadingBit(trailing); - int32x4_t shift = vsubq_s32(g_XMNumTrailing, leading); - int32x4_t exponentSub = vsubq_s32(g_XMSubnormalExponent, shift); - int32x4_t trailingSub = vshlq_s32(trailing, shift); - trailingSub = vandq_s32(trailingSub, g_XMQNaNTest); - int32x4_t e = vbslq_s32(isExponentZero, exponentSub, exponentNor); - int32x4_t t = vbslq_s32(isExponentZero, trailingSub, trailingNor); - - // Compute the approximation. - int32x4_t tmp = vorrq_s32(g_XMOne, t); - float32x4_t y = vsubq_f32(vreinterpretq_f32_s32(tmp), g_XMOne); - - float32x4_t log2 = vmlaq_f32(g_XMLogEst6, g_XMLogEst7, y); - log2 = vmlaq_f32(g_XMLogEst5, log2, y); - log2 = vmlaq_f32(g_XMLogEst4, log2, y); - log2 = vmlaq_f32(g_XMLogEst3, log2, y); - log2 = vmlaq_f32(g_XMLogEst2, log2, y); - log2 = vmlaq_f32(g_XMLogEst1, log2, y); - log2 = vmlaq_f32(g_XMLogEst0, log2, y); - log2 = vmlaq_f32(vcvtq_f32_s32(e), log2, y); - - log2 = vmulq_f32(g_XMInvLg10, log2); - - // if (x is NaN) -> QNaN - // else if (V is positive) - // if (V is infinite) -> +inf - // else -> log2(V) - // else - // if (V is zero) -> -inf - // else -> -QNaN - - uint32x4_t isInfinite = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); - isInfinite = vceqq_u32(isInfinite, g_XMInfinity); - - uint32x4_t isGreaterZero = vcgtq_s32(vreinterpretq_s32_f32(V), g_XMZero); - uint32x4_t isNotFinite = vcgtq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); - uint32x4_t isPositive = vbicq_u32(isGreaterZero, isNotFinite); - - uint32x4_t isZero = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); - isZero = vceqq_u32(isZero, g_XMZero); - - uint32x4_t t0 = vandq_u32(vreinterpretq_u32_f32(V), g_XMQNaNTest); - uint32x4_t t1 = vandq_u32(vreinterpretq_u32_f32(V), g_XMInfinity); - t0 = vceqq_u32(t0, g_XMZero); - t1 = vceqq_u32(t1, g_XMInfinity); - uint32x4_t isNaN = vbicq_u32(t1, t0); - - float32x4_t result = vbslq_f32(isInfinite, g_XMInfinity, log2); - float32x4_t tmp2 = vbslq_f32(isZero, g_XMNegInfinity, g_XMNegQNaN); - result = vbslq_f32(isPositive, result, tmp2); - result = vbslq_f32(isNaN, g_XMQNaN, result); - return result; -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_log10_ps(V); - return Result; -#elif defined(_XM_SSE_INTRINSICS_) - __m128i rawBiased = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); - __m128i trailing = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); - __m128i isExponentZero = _mm_cmpeq_epi32(g_XMZero, rawBiased); - - // Compute exponent and significand for normals. - __m128i biased = _mm_srli_epi32(rawBiased, 23); - __m128i exponentNor = _mm_sub_epi32(biased, g_XMExponentBias); - __m128i trailingNor = trailing; - - // Compute exponent and significand for subnormals. - __m128i leading = MathInternal::GetLeadingBit(trailing); - __m128i shift = _mm_sub_epi32(g_XMNumTrailing, leading); - __m128i exponentSub = _mm_sub_epi32(g_XMSubnormalExponent, shift); - __m128i trailingSub = MathInternal::multi_sll_epi32(trailing, shift); - trailingSub = _mm_and_si128(trailingSub, g_XMQNaNTest); - - __m128i select0 = _mm_and_si128(isExponentZero, exponentSub); - __m128i select1 = _mm_andnot_si128(isExponentZero, exponentNor); - __m128i e = _mm_or_si128(select0, select1); - - select0 = _mm_and_si128(isExponentZero, trailingSub); - select1 = _mm_andnot_si128(isExponentZero, trailingNor); - __m128i t = _mm_or_si128(select0, select1); - - // Compute the approximation. - __m128i tmp = _mm_or_si128(g_XMOne, t); - __m128 y = _mm_sub_ps(_mm_castsi128_ps(tmp), g_XMOne); - - __m128 log2 = XM_FMADD_PS(g_XMLogEst7, y, g_XMLogEst6); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst5); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst4); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst3); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst2); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst1); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst0); - log2 = XM_FMADD_PS(log2, y, _mm_cvtepi32_ps(e)); - - log2 = _mm_mul_ps(g_XMInvLg10, log2); - - // if (x is NaN) -> QNaN - // else if (V is positive) - // if (V is infinite) -> +inf - // else -> log2(V) - // else - // if (V is zero) -> -inf - // else -> -QNaN - - __m128i isInfinite = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); - isInfinite = _mm_cmpeq_epi32(isInfinite, g_XMInfinity); - - __m128i isGreaterZero = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMZero); - __m128i isNotFinite = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMInfinity); - __m128i isPositive = _mm_andnot_si128(isNotFinite, isGreaterZero); - - __m128i isZero = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); - isZero = _mm_cmpeq_epi32(isZero, g_XMZero); - - __m128i t0 = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); - __m128i t1 = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); - t0 = _mm_cmpeq_epi32(t0, g_XMZero); - t1 = _mm_cmpeq_epi32(t1, g_XMInfinity); - __m128i isNaN = _mm_andnot_si128(t0, t1); - - select0 = _mm_and_si128(isInfinite, g_XMInfinity); - select1 = _mm_andnot_si128(isInfinite, _mm_castps_si128(log2)); - __m128i result = _mm_or_si128(select0, select1); - - select0 = _mm_and_si128(isZero, g_XMNegInfinity); - select1 = _mm_andnot_si128(isZero, g_XMNegQNaN); - tmp = _mm_or_si128(select0, select1); - - select0 = _mm_and_si128(isPositive, result); - select1 = _mm_andnot_si128(isPositive, tmp); - result = _mm_or_si128(select0, select1); - - select0 = _mm_and_si128(isNaN, g_XMQNaN); - select1 = _mm_andnot_si128(isNaN, result); - result = _mm_or_si128(select0, select1); - - return _mm_castsi128_ps(result); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorLogE(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORF32 Result = { { { - logf(V.vector4_f32[0]), - logf(V.vector4_f32[1]), - logf(V.vector4_f32[2]), - logf(V.vector4_f32[3]) - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - int32x4_t rawBiased = vandq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); - int32x4_t trailing = vandq_s32(vreinterpretq_s32_f32(V), g_XMQNaNTest); - uint32x4_t isExponentZero = vceqq_s32(g_XMZero, rawBiased); - - // Compute exponent and significand for normals. - int32x4_t biased = vshrq_n_s32(rawBiased, 23); - int32x4_t exponentNor = vsubq_s32(biased, g_XMExponentBias); - int32x4_t trailingNor = trailing; - - // Compute exponent and significand for subnormals. - int32x4_t leading = MathInternal::GetLeadingBit(trailing); - int32x4_t shift = vsubq_s32(g_XMNumTrailing, leading); - int32x4_t exponentSub = vsubq_s32(g_XMSubnormalExponent, shift); - int32x4_t trailingSub = vshlq_s32(trailing, shift); - trailingSub = vandq_s32(trailingSub, g_XMQNaNTest); - int32x4_t e = vbslq_s32(isExponentZero, exponentSub, exponentNor); - int32x4_t t = vbslq_s32(isExponentZero, trailingSub, trailingNor); - - // Compute the approximation. - int32x4_t tmp = vorrq_s32(g_XMOne, t); - float32x4_t y = vsubq_f32(vreinterpretq_f32_s32(tmp), g_XMOne); - - float32x4_t log2 = vmlaq_f32(g_XMLogEst6, g_XMLogEst7, y); - log2 = vmlaq_f32(g_XMLogEst5, log2, y); - log2 = vmlaq_f32(g_XMLogEst4, log2, y); - log2 = vmlaq_f32(g_XMLogEst3, log2, y); - log2 = vmlaq_f32(g_XMLogEst2, log2, y); - log2 = vmlaq_f32(g_XMLogEst1, log2, y); - log2 = vmlaq_f32(g_XMLogEst0, log2, y); - log2 = vmlaq_f32(vcvtq_f32_s32(e), log2, y); - - log2 = vmulq_f32(g_XMInvLgE, log2); - - // if (x is NaN) -> QNaN - // else if (V is positive) - // if (V is infinite) -> +inf - // else -> log2(V) - // else - // if (V is zero) -> -inf - // else -> -QNaN - - uint32x4_t isInfinite = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); - isInfinite = vceqq_u32(isInfinite, g_XMInfinity); - - uint32x4_t isGreaterZero = vcgtq_s32(vreinterpretq_s32_f32(V), g_XMZero); - uint32x4_t isNotFinite = vcgtq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); - uint32x4_t isPositive = vbicq_u32(isGreaterZero, isNotFinite); - - uint32x4_t isZero = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); - isZero = vceqq_u32(isZero, g_XMZero); - - uint32x4_t t0 = vandq_u32(vreinterpretq_u32_f32(V), g_XMQNaNTest); - uint32x4_t t1 = vandq_u32(vreinterpretq_u32_f32(V), g_XMInfinity); - t0 = vceqq_u32(t0, g_XMZero); - t1 = vceqq_u32(t1, g_XMInfinity); - uint32x4_t isNaN = vbicq_u32(t1, t0); - - float32x4_t result = vbslq_f32(isInfinite, g_XMInfinity, log2); - float32x4_t tmp2 = vbslq_f32(isZero, g_XMNegInfinity, g_XMNegQNaN); - result = vbslq_f32(isPositive, result, tmp2); - result = vbslq_f32(isNaN, g_XMQNaN, result); - return result; -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_log_ps(V); - return Result; -#elif defined(_XM_SSE_INTRINSICS_) - __m128i rawBiased = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); - __m128i trailing = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); - __m128i isExponentZero = _mm_cmpeq_epi32(g_XMZero, rawBiased); - - // Compute exponent and significand for normals. - __m128i biased = _mm_srli_epi32(rawBiased, 23); - __m128i exponentNor = _mm_sub_epi32(biased, g_XMExponentBias); - __m128i trailingNor = trailing; - - // Compute exponent and significand for subnormals. - __m128i leading = MathInternal::GetLeadingBit(trailing); - __m128i shift = _mm_sub_epi32(g_XMNumTrailing, leading); - __m128i exponentSub = _mm_sub_epi32(g_XMSubnormalExponent, shift); - __m128i trailingSub = MathInternal::multi_sll_epi32(trailing, shift); - trailingSub = _mm_and_si128(trailingSub, g_XMQNaNTest); - - __m128i select0 = _mm_and_si128(isExponentZero, exponentSub); - __m128i select1 = _mm_andnot_si128(isExponentZero, exponentNor); - __m128i e = _mm_or_si128(select0, select1); - - select0 = _mm_and_si128(isExponentZero, trailingSub); - select1 = _mm_andnot_si128(isExponentZero, trailingNor); - __m128i t = _mm_or_si128(select0, select1); - - // Compute the approximation. - __m128i tmp = _mm_or_si128(g_XMOne, t); - __m128 y = _mm_sub_ps(_mm_castsi128_ps(tmp), g_XMOne); - - __m128 log2 = XM_FMADD_PS(g_XMLogEst7, y, g_XMLogEst6); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst5); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst4); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst3); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst2); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst1); - log2 = XM_FMADD_PS(log2, y, g_XMLogEst0); - log2 = XM_FMADD_PS(log2, y, _mm_cvtepi32_ps(e)); - - log2 = _mm_mul_ps(g_XMInvLgE, log2); - - // if (x is NaN) -> QNaN - // else if (V is positive) - // if (V is infinite) -> +inf - // else -> log2(V) - // else - // if (V is zero) -> -inf - // else -> -QNaN - - __m128i isInfinite = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); - isInfinite = _mm_cmpeq_epi32(isInfinite, g_XMInfinity); - - __m128i isGreaterZero = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMZero); - __m128i isNotFinite = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMInfinity); - __m128i isPositive = _mm_andnot_si128(isNotFinite, isGreaterZero); - - __m128i isZero = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); - isZero = _mm_cmpeq_epi32(isZero, g_XMZero); - - __m128i t0 = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); - __m128i t1 = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); - t0 = _mm_cmpeq_epi32(t0, g_XMZero); - t1 = _mm_cmpeq_epi32(t1, g_XMInfinity); - __m128i isNaN = _mm_andnot_si128(t0, t1); - - select0 = _mm_and_si128(isInfinite, g_XMInfinity); - select1 = _mm_andnot_si128(isInfinite, _mm_castps_si128(log2)); - __m128i result = _mm_or_si128(select0, select1); - - select0 = _mm_and_si128(isZero, g_XMNegInfinity); - select1 = _mm_andnot_si128(isZero, g_XMNegQNaN); - tmp = _mm_or_si128(select0, select1); - - select0 = _mm_and_si128(isPositive, result); - select1 = _mm_andnot_si128(isPositive, tmp); - result = _mm_or_si128(select0, select1); - - select0 = _mm_and_si128(isNaN, g_XMQNaN); - select1 = _mm_andnot_si128(isNaN, result); - result = _mm_or_si128(select0, select1); - - return _mm_castsi128_ps(result); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorLog(FXMVECTOR V) noexcept -{ - return XMVectorLog2(V); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorPow -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORF32 Result = { { { - powf(V1.vector4_f32[0], V2.vector4_f32[0]), - powf(V1.vector4_f32[1], V2.vector4_f32[1]), - powf(V1.vector4_f32[2], V2.vector4_f32[2]), - powf(V1.vector4_f32[3], V2.vector4_f32[3]) - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - XMVECTORF32 vResult = { { { - powf(vgetq_lane_f32(V1, 0), vgetq_lane_f32(V2, 0)), - powf(vgetq_lane_f32(V1, 1), vgetq_lane_f32(V2, 1)), - powf(vgetq_lane_f32(V1, 2), vgetq_lane_f32(V2, 2)), - powf(vgetq_lane_f32(V1, 3), vgetq_lane_f32(V2, 3)) - } } }; - return vResult.v; -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_pow_ps(V1, V2); - return Result; -#elif defined(_XM_SSE_INTRINSICS_) - XM_ALIGNED_DATA(16) float a[4]; - XM_ALIGNED_DATA(16) float b[4]; - _mm_store_ps(a, V1); - _mm_store_ps(b, V2); - XMVECTOR vResult = _mm_setr_ps( - powf(a[0], b[0]), - powf(a[1], b[1]), - powf(a[2], b[2]), - powf(a[3], b[3])); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorAbs(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - fabsf(V.vector4_f32[0]), - fabsf(V.vector4_f32[1]), - fabsf(V.vector4_f32[2]), - fabsf(V.vector4_f32[3]) - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - return vabsq_f32(V); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = _mm_setzero_ps(); - vResult = _mm_sub_ps(vResult, V); - vResult = _mm_max_ps(vResult, V); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorMod -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ - // V1 % V2 = V1 - V2 * truncate(V1 / V2) - -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Quotient = XMVectorDivide(V1, V2); - Quotient = XMVectorTruncate(Quotient); - XMVECTOR Result = XMVectorNegativeMultiplySubtract(V2, Quotient, V1); - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - XMVECTOR vResult = XMVectorDivide(V1, V2); - vResult = XMVectorTruncate(vResult); - return vmlsq_f32(V1, vResult, V2); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = _mm_div_ps(V1, V2); - vResult = XMVectorTruncate(vResult); - return XM_FNMADD_PS(vResult, V2, V1); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorModAngles(FXMVECTOR Angles) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR V; - XMVECTOR Result; - - // Modulo the range of the given angles such that -XM_PI <= Angles < XM_PI - V = XMVectorMultiply(Angles, g_XMReciprocalTwoPi.v); - V = XMVectorRound(V); - Result = XMVectorNegativeMultiplySubtract(g_XMTwoPi.v, V, Angles); - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Modulo the range of the given angles such that -XM_PI <= Angles < XM_PI - XMVECTOR vResult = vmulq_f32(Angles, g_XMReciprocalTwoPi); - // Use the inline function due to complexity for rounding - vResult = XMVectorRound(vResult); - return vmlsq_f32(Angles, vResult, g_XMTwoPi); -#elif defined(_XM_SSE_INTRINSICS_) - // Modulo the range of the given angles such that -XM_PI <= Angles < XM_PI - XMVECTOR vResult = _mm_mul_ps(Angles, g_XMReciprocalTwoPi); - // Use the inline function due to complexity for rounding - vResult = XMVectorRound(vResult); - return XM_FNMADD_PS(vResult, g_XMTwoPi, Angles); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorSin(FXMVECTOR V) noexcept -{ - // 11-degree minimax approximation - -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - sinf(V.vector4_f32[0]), - sinf(V.vector4_f32[1]), - sinf(V.vector4_f32[2]), - sinf(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Force the value within the bounds of pi - XMVECTOR x = XMVectorModAngles(V); - - // Map in [-pi/2,pi/2] with sin(y) = sin(x). - uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); - uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - float32x4_t absx = vabsq_f32(x); - float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); - uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); - x = vbslq_f32(comp, x, rflx); - - float32x4_t x2 = vmulq_f32(x, x); - - // Compute polynomial approximation - const XMVECTOR SC1 = g_XMSinCoefficients1; - const XMVECTOR SC0 = g_XMSinCoefficients0; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(SC0), 1); - XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_low_f32(SC1), 0); - - vConstants = vdupq_lane_f32(vget_high_f32(SC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); - - vConstants = vdupq_lane_f32(vget_low_f32(SC0), 1); - Result = vmlaq_f32(vConstants, Result, x2); - - vConstants = vdupq_lane_f32(vget_low_f32(SC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); - - Result = vmlaq_f32(g_XMOne, Result, x2); - Result = vmulq_f32(Result, x); - return Result; -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_sin_ps(V); - return Result; -#elif defined(_XM_SSE_INTRINSICS_) - // Force the value within the bounds of pi - XMVECTOR x = XMVectorModAngles(V); - - // Map in [-pi/2,pi/2] with sin(y) = sin(x). - __m128 sign = _mm_and_ps(x, g_XMNegativeZero); - __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - __m128 absx = _mm_andnot_ps(sign, x); // |x| - __m128 rflx = _mm_sub_ps(c, x); - __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); - __m128 select0 = _mm_and_ps(comp, x); - __m128 select1 = _mm_andnot_ps(comp, rflx); - x = _mm_or_ps(select0, select1); - - __m128 x2 = _mm_mul_ps(x, x); - - // Compute polynomial approximation - const XMVECTOR SC1 = g_XMSinCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(SC1, _MM_SHUFFLE(0, 0, 0, 0)); - const XMVECTOR SC0 = g_XMSinCoefficients0; - __m128 vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); - - vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(2, 2, 2, 2)); - Result = XM_FMADD_PS(Result, x2, vConstants); - - vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); - - vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(0, 0, 0, 0)); - Result = XM_FMADD_PS(Result, x2, vConstants); - - Result = XM_FMADD_PS(Result, x2, g_XMOne); - Result = _mm_mul_ps(Result, x); - return Result; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorCos(FXMVECTOR V) noexcept -{ - // 10-degree minimax approximation - -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - cosf(V.vector4_f32[0]), - cosf(V.vector4_f32[1]), - cosf(V.vector4_f32[2]), - cosf(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Map V to x in [-pi,pi]. - XMVECTOR x = XMVectorModAngles(V); - - // Map in [-pi/2,pi/2] with cos(y) = sign*cos(x). - uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); - uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - float32x4_t absx = vabsq_f32(x); - float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); - uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); - x = vbslq_f32(comp, x, rflx); - float32x4_t fsign = vbslq_f32(comp, g_XMOne, g_XMNegativeOne); - - float32x4_t x2 = vmulq_f32(x, x); - - // Compute polynomial approximation - const XMVECTOR CC1 = g_XMCosCoefficients1; - const XMVECTOR CC0 = g_XMCosCoefficients0; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(CC0), 1); - XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_low_f32(CC1), 0); - - vConstants = vdupq_lane_f32(vget_high_f32(CC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); - - vConstants = vdupq_lane_f32(vget_low_f32(CC0), 1); - Result = vmlaq_f32(vConstants, Result, x2); - - vConstants = vdupq_lane_f32(vget_low_f32(CC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); - - Result = vmlaq_f32(g_XMOne, Result, x2); - Result = vmulq_f32(Result, fsign); - return Result; -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_cos_ps(V); - return Result; -#elif defined(_XM_SSE_INTRINSICS_) - // Map V to x in [-pi,pi]. - XMVECTOR x = XMVectorModAngles(V); - - // Map in [-pi/2,pi/2] with cos(y) = sign*cos(x). - XMVECTOR sign = _mm_and_ps(x, g_XMNegativeZero); - __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - __m128 absx = _mm_andnot_ps(sign, x); // |x| - __m128 rflx = _mm_sub_ps(c, x); - __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); - __m128 select0 = _mm_and_ps(comp, x); - __m128 select1 = _mm_andnot_ps(comp, rflx); - x = _mm_or_ps(select0, select1); - select0 = _mm_and_ps(comp, g_XMOne); - select1 = _mm_andnot_ps(comp, g_XMNegativeOne); - sign = _mm_or_ps(select0, select1); - - __m128 x2 = _mm_mul_ps(x, x); - - // Compute polynomial approximation - const XMVECTOR CC1 = g_XMCosCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(CC1, _MM_SHUFFLE(0, 0, 0, 0)); - const XMVECTOR CC0 = g_XMCosCoefficients0; - __m128 vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); - - vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(2, 2, 2, 2)); - Result = XM_FMADD_PS(Result, x2, vConstants); - - vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); - - vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(0, 0, 0, 0)); - Result = XM_FMADD_PS(Result, x2, vConstants); - - Result = XM_FMADD_PS(Result, x2, g_XMOne); - Result = _mm_mul_ps(Result, sign); - return Result; -#endif -} - -//------------------------------------------------------------------------------ - -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorSinCos -( - XMVECTOR* pSin, - XMVECTOR* pCos, - FXMVECTOR V -) noexcept -{ - assert(pSin != nullptr); - assert(pCos != nullptr); - - // 11/10-degree minimax approximation - -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Sin = { { { - sinf(V.vector4_f32[0]), - sinf(V.vector4_f32[1]), - sinf(V.vector4_f32[2]), - sinf(V.vector4_f32[3]) - } } }; - - XMVECTORF32 Cos = { { { - cosf(V.vector4_f32[0]), - cosf(V.vector4_f32[1]), - cosf(V.vector4_f32[2]), - cosf(V.vector4_f32[3]) - } } }; - - *pSin = Sin.v; - *pCos = Cos.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Force the value within the bounds of pi - XMVECTOR x = XMVectorModAngles(V); - - // Map in [-pi/2,pi/2] with cos(y) = sign*cos(x). - uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); - uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - float32x4_t absx = vabsq_f32(x); - float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); - uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); - x = vbslq_f32(comp, x, rflx); - float32x4_t fsign = vbslq_f32(comp, g_XMOne, g_XMNegativeOne); - - float32x4_t x2 = vmulq_f32(x, x); - - // Compute polynomial approximation for sine - const XMVECTOR SC1 = g_XMSinCoefficients1; - const XMVECTOR SC0 = g_XMSinCoefficients0; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(SC0), 1); - XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_low_f32(SC1), 0); - - vConstants = vdupq_lane_f32(vget_high_f32(SC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); - - vConstants = vdupq_lane_f32(vget_low_f32(SC0), 1); - Result = vmlaq_f32(vConstants, Result, x2); - - vConstants = vdupq_lane_f32(vget_low_f32(SC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); - - Result = vmlaq_f32(g_XMOne, Result, x2); - *pSin = vmulq_f32(Result, x); - - // Compute polynomial approximation for cosine - const XMVECTOR CC1 = g_XMCosCoefficients1; - const XMVECTOR CC0 = g_XMCosCoefficients0; - vConstants = vdupq_lane_f32(vget_high_f32(CC0), 1); - Result = vmlaq_lane_f32(vConstants, x2, vget_low_f32(CC1), 0); - - vConstants = vdupq_lane_f32(vget_high_f32(CC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); - - vConstants = vdupq_lane_f32(vget_low_f32(CC0), 1); - Result = vmlaq_f32(vConstants, Result, x2); - - vConstants = vdupq_lane_f32(vget_low_f32(CC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); - - Result = vmlaq_f32(g_XMOne, Result, x2); - *pCos = vmulq_f32(Result, fsign); -#elif defined(_XM_SVML_INTRINSICS_) - *pSin = _mm_sincos_ps(pCos, V); -#elif defined(_XM_SSE_INTRINSICS_) - // Force the value within the bounds of pi - XMVECTOR x = XMVectorModAngles(V); - - // Map in [-pi/2,pi/2] with sin(y) = sin(x), cos(y) = sign*cos(x). - XMVECTOR sign = _mm_and_ps(x, g_XMNegativeZero); - __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - __m128 absx = _mm_andnot_ps(sign, x); // |x| - __m128 rflx = _mm_sub_ps(c, x); - __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); - __m128 select0 = _mm_and_ps(comp, x); - __m128 select1 = _mm_andnot_ps(comp, rflx); - x = _mm_or_ps(select0, select1); - select0 = _mm_and_ps(comp, g_XMOne); - select1 = _mm_andnot_ps(comp, g_XMNegativeOne); - sign = _mm_or_ps(select0, select1); - - __m128 x2 = _mm_mul_ps(x, x); - - // Compute polynomial approximation of sine - const XMVECTOR SC1 = g_XMSinCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(SC1, _MM_SHUFFLE(0, 0, 0, 0)); - const XMVECTOR SC0 = g_XMSinCoefficients0; - __m128 vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); - - vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(2, 2, 2, 2)); - Result = XM_FMADD_PS(Result, x2, vConstants); - - vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); - - vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(0, 0, 0, 0)); - Result = XM_FMADD_PS(Result, x2, vConstants); - - Result = XM_FMADD_PS(Result, x2, g_XMOne); - Result = _mm_mul_ps(Result, x); - *pSin = Result; - - // Compute polynomial approximation of cosine - const XMVECTOR CC1 = g_XMCosCoefficients1; - vConstantsB = XM_PERMUTE_PS(CC1, _MM_SHUFFLE(0, 0, 0, 0)); - const XMVECTOR CC0 = g_XMCosCoefficients0; - vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(3, 3, 3, 3)); - Result = XM_FMADD_PS(vConstantsB, x2, vConstants); - - vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(2, 2, 2, 2)); - Result = XM_FMADD_PS(Result, x2, vConstants); - - vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); - - vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(0, 0, 0, 0)); - Result = XM_FMADD_PS(Result, x2, vConstants); - - Result = XM_FMADD_PS(Result, x2, g_XMOne); - Result = _mm_mul_ps(Result, sign); - *pCos = Result; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorTan(FXMVECTOR V) noexcept -{ - // Cody and Waite algorithm to compute tangent. - -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - tanf(V.vector4_f32[0]), - tanf(V.vector4_f32[1]), - tanf(V.vector4_f32[2]), - tanf(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_tan_ps(V); - return Result; -#elif defined(_XM_SSE_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) - - static const XMVECTORF32 TanCoefficients0 = { { { 1.0f, -4.667168334e-1f, 2.566383229e-2f, -3.118153191e-4f } } }; - static const XMVECTORF32 TanCoefficients1 = { { { 4.981943399e-7f, -1.333835001e-1f, 3.424887824e-3f, -1.786170734e-5f } } }; - static const XMVECTORF32 TanConstants = { { { 1.570796371f, 6.077100628e-11f, 0.000244140625f, 0.63661977228f /*2 / Pi*/ } } }; - static const XMVECTORU32 Mask = { { { 0x1, 0x1, 0x1, 0x1 } } }; - - XMVECTOR TwoDivPi = XMVectorSplatW(TanConstants.v); - - XMVECTOR Zero = XMVectorZero(); - - XMVECTOR C0 = XMVectorSplatX(TanConstants.v); - XMVECTOR C1 = XMVectorSplatY(TanConstants.v); - XMVECTOR Epsilon = XMVectorSplatZ(TanConstants.v); - - XMVECTOR VA = XMVectorMultiply(V, TwoDivPi); - - VA = XMVectorRound(VA); - - XMVECTOR VC = XMVectorNegativeMultiplySubtract(VA, C0, V); - - XMVECTOR VB = XMVectorAbs(VA); - - VC = XMVectorNegativeMultiplySubtract(VA, C1, VC); - -#if defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - VB = vreinterpretq_f32_u32(vcvtq_u32_f32(VB)); -#elif defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - reinterpret_cast<__m128i*>(&VB)[0] = _mm_cvttps_epi32(VB); -#else - for (size_t i = 0; i < 4; i++) - { - VB.vector4_u32[i] = static_cast(VB.vector4_f32[i]); - } -#endif - - XMVECTOR VC2 = XMVectorMultiply(VC, VC); - - XMVECTOR T7 = XMVectorSplatW(TanCoefficients1.v); - XMVECTOR T6 = XMVectorSplatZ(TanCoefficients1.v); - XMVECTOR T4 = XMVectorSplatX(TanCoefficients1.v); - XMVECTOR T3 = XMVectorSplatW(TanCoefficients0.v); - XMVECTOR T5 = XMVectorSplatY(TanCoefficients1.v); - XMVECTOR T2 = XMVectorSplatZ(TanCoefficients0.v); - XMVECTOR T1 = XMVectorSplatY(TanCoefficients0.v); - XMVECTOR T0 = XMVectorSplatX(TanCoefficients0.v); - - XMVECTOR VBIsEven = XMVectorAndInt(VB, Mask.v); - VBIsEven = XMVectorEqualInt(VBIsEven, Zero); - - XMVECTOR N = XMVectorMultiplyAdd(VC2, T7, T6); - XMVECTOR D = XMVectorMultiplyAdd(VC2, T4, T3); - N = XMVectorMultiplyAdd(VC2, N, T5); - D = XMVectorMultiplyAdd(VC2, D, T2); - N = XMVectorMultiply(VC2, N); - D = XMVectorMultiplyAdd(VC2, D, T1); - N = XMVectorMultiplyAdd(VC, N, VC); - XMVECTOR VCNearZero = XMVectorInBounds(VC, Epsilon); - D = XMVectorMultiplyAdd(VC2, D, T0); - - N = XMVectorSelect(N, VC, VCNearZero); - D = XMVectorSelect(D, g_XMOne.v, VCNearZero); - - XMVECTOR R0 = XMVectorNegate(N); - XMVECTOR R1 = XMVectorDivide(N, D); - R0 = XMVectorDivide(D, R0); - - XMVECTOR VIsZero = XMVectorEqual(V, Zero); - - XMVECTOR Result = XMVectorSelect(R0, R1, VBIsEven); - - Result = XMVectorSelect(Result, Zero, VIsZero); - - return Result; - -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorSinH(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - sinhf(V.vector4_f32[0]), - sinhf(V.vector4_f32[1]), - sinhf(V.vector4_f32[2]), - sinhf(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 1.442695040888963f, 1.442695040888963f, 1.442695040888963f, 1.442695040888963f } } }; // 1.0f / ln(2.0f) - - XMVECTOR V1 = vmlaq_f32(g_XMNegativeOne.v, V, Scale.v); - XMVECTOR V2 = vmlsq_f32(g_XMNegativeOne.v, V, Scale.v); - XMVECTOR E1 = XMVectorExp(V1); - XMVECTOR E2 = XMVectorExp(V2); - - return vsubq_f32(E1, E2); -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_sinh_ps(V); - return Result; -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 1.442695040888963f, 1.442695040888963f, 1.442695040888963f, 1.442695040888963f } } }; // 1.0f / ln(2.0f) - - XMVECTOR V1 = XM_FMADD_PS(V, Scale, g_XMNegativeOne); - XMVECTOR V2 = XM_FNMADD_PS(V, Scale, g_XMNegativeOne); - XMVECTOR E1 = XMVectorExp(V1); - XMVECTOR E2 = XMVectorExp(V2); - - return _mm_sub_ps(E1, E2); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorCosH(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - coshf(V.vector4_f32[0]), - coshf(V.vector4_f32[1]), - coshf(V.vector4_f32[2]), - coshf(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 1.442695040888963f, 1.442695040888963f, 1.442695040888963f, 1.442695040888963f } } }; // 1.0f / ln(2.0f) - - XMVECTOR V1 = vmlaq_f32(g_XMNegativeOne.v, V, Scale.v); - XMVECTOR V2 = vmlsq_f32(g_XMNegativeOne.v, V, Scale.v); - XMVECTOR E1 = XMVectorExp(V1); - XMVECTOR E2 = XMVectorExp(V2); - return vaddq_f32(E1, E2); -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_cosh_ps(V); - return Result; -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 1.442695040888963f, 1.442695040888963f, 1.442695040888963f, 1.442695040888963f } } }; // 1.0f / ln(2.0f) - - XMVECTOR V1 = XM_FMADD_PS(V, Scale.v, g_XMNegativeOne.v); - XMVECTOR V2 = XM_FNMADD_PS(V, Scale.v, g_XMNegativeOne.v); - XMVECTOR E1 = XMVectorExp(V1); - XMVECTOR E2 = XMVectorExp(V2); - return _mm_add_ps(E1, E2); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorTanH(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - tanhf(V.vector4_f32[0]), - tanhf(V.vector4_f32[1]), - tanhf(V.vector4_f32[2]), - tanhf(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 2.8853900817779268f, 2.8853900817779268f, 2.8853900817779268f, 2.8853900817779268f } } }; // 2.0f / ln(2.0f) - - XMVECTOR E = vmulq_f32(V, Scale.v); - E = XMVectorExp(E); - E = vmlaq_f32(g_XMOneHalf.v, E, g_XMOneHalf.v); - E = XMVectorReciprocal(E); - return vsubq_f32(g_XMOne.v, E); -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_tanh_ps(V); - return Result; -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 2.8853900817779268f, 2.8853900817779268f, 2.8853900817779268f, 2.8853900817779268f } } }; // 2.0f / ln(2.0f) - - XMVECTOR E = _mm_mul_ps(V, Scale.v); - E = XMVectorExp(E); - E = XM_FMADD_PS(E, g_XMOneHalf.v, g_XMOneHalf.v); - E = _mm_div_ps(g_XMOne.v, E); - return _mm_sub_ps(g_XMOne.v, E); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorASin(FXMVECTOR V) noexcept -{ - // 7-degree minimax approximation - -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - asinf(V.vector4_f32[0]), - asinf(V.vector4_f32[1]), - asinf(V.vector4_f32[2]), - asinf(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t nonnegative = vcgeq_f32(V, g_XMZero); - float32x4_t x = vabsq_f32(V); - - // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. - float32x4_t oneMValue = vsubq_f32(g_XMOne, x); - float32x4_t clampOneMValue = vmaxq_f32(g_XMZero, oneMValue); - float32x4_t root = XMVectorSqrt(clampOneMValue); - - // Compute polynomial approximation - const XMVECTOR AC1 = g_XMArcCoefficients1; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AC1), 0); - XMVECTOR t0 = vmlaq_lane_f32(vConstants, x, vget_high_f32(AC1), 1); - - vConstants = vdupq_lane_f32(vget_low_f32(AC1), 1); - t0 = vmlaq_f32(vConstants, t0, x); - - vConstants = vdupq_lane_f32(vget_low_f32(AC1), 0); - t0 = vmlaq_f32(vConstants, t0, x); - - const XMVECTOR AC0 = g_XMArcCoefficients0; - vConstants = vdupq_lane_f32(vget_high_f32(AC0), 1); - t0 = vmlaq_f32(vConstants, t0, x); - - vConstants = vdupq_lane_f32(vget_high_f32(AC0), 0); - t0 = vmlaq_f32(vConstants, t0, x); - - vConstants = vdupq_lane_f32(vget_low_f32(AC0), 1); - t0 = vmlaq_f32(vConstants, t0, x); - - vConstants = vdupq_lane_f32(vget_low_f32(AC0), 0); - t0 = vmlaq_f32(vConstants, t0, x); - t0 = vmulq_f32(t0, root); - - float32x4_t t1 = vsubq_f32(g_XMPi, t0); - t0 = vbslq_f32(nonnegative, t0, t1); - t0 = vsubq_f32(g_XMHalfPi, t0); - return t0; -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_asin_ps(V); - return Result; -#elif defined(_XM_SSE_INTRINSICS_) - __m128 nonnegative = _mm_cmpge_ps(V, g_XMZero); - __m128 mvalue = _mm_sub_ps(g_XMZero, V); - __m128 x = _mm_max_ps(V, mvalue); // |V| - - // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. - __m128 oneMValue = _mm_sub_ps(g_XMOne, x); - __m128 clampOneMValue = _mm_max_ps(g_XMZero, oneMValue); - __m128 root = _mm_sqrt_ps(clampOneMValue); // sqrt(1-|V|) - - // Compute polynomial approximation - const XMVECTOR AC1 = g_XMArcCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 t0 = XM_FMADD_PS(vConstantsB, x, vConstants); - - vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(1, 1, 1, 1)); - t0 = XM_FMADD_PS(t0, x, vConstants); - - vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(0, 0, 0, 0)); - t0 = XM_FMADD_PS(t0, x, vConstants); - - const XMVECTOR AC0 = g_XMArcCoefficients0; - vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(3, 3, 3, 3)); - t0 = XM_FMADD_PS(t0, x, vConstants); - - vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(2, 2, 2, 2)); - t0 = XM_FMADD_PS(t0, x, vConstants); - - vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(1, 1, 1, 1)); - t0 = XM_FMADD_PS(t0, x, vConstants); - - vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(0, 0, 0, 0)); - t0 = XM_FMADD_PS(t0, x, vConstants); - t0 = _mm_mul_ps(t0, root); - - __m128 t1 = _mm_sub_ps(g_XMPi, t0); - t0 = _mm_and_ps(nonnegative, t0); - t1 = _mm_andnot_ps(nonnegative, t1); - t0 = _mm_or_ps(t0, t1); - t0 = _mm_sub_ps(g_XMHalfPi, t0); - return t0; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorACos(FXMVECTOR V) noexcept -{ - // 7-degree minimax approximation - -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - acosf(V.vector4_f32[0]), - acosf(V.vector4_f32[1]), - acosf(V.vector4_f32[2]), - acosf(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t nonnegative = vcgeq_f32(V, g_XMZero); - float32x4_t x = vabsq_f32(V); - - // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. - float32x4_t oneMValue = vsubq_f32(g_XMOne, x); - float32x4_t clampOneMValue = vmaxq_f32(g_XMZero, oneMValue); - float32x4_t root = XMVectorSqrt(clampOneMValue); - - // Compute polynomial approximation - const XMVECTOR AC1 = g_XMArcCoefficients1; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AC1), 0); - XMVECTOR t0 = vmlaq_lane_f32(vConstants, x, vget_high_f32(AC1), 1); - - vConstants = vdupq_lane_f32(vget_low_f32(AC1), 1); - t0 = vmlaq_f32(vConstants, t0, x); - - vConstants = vdupq_lane_f32(vget_low_f32(AC1), 0); - t0 = vmlaq_f32(vConstants, t0, x); - - const XMVECTOR AC0 = g_XMArcCoefficients0; - vConstants = vdupq_lane_f32(vget_high_f32(AC0), 1); - t0 = vmlaq_f32(vConstants, t0, x); - - vConstants = vdupq_lane_f32(vget_high_f32(AC0), 0); - t0 = vmlaq_f32(vConstants, t0, x); - - vConstants = vdupq_lane_f32(vget_low_f32(AC0), 1); - t0 = vmlaq_f32(vConstants, t0, x); - - vConstants = vdupq_lane_f32(vget_low_f32(AC0), 0); - t0 = vmlaq_f32(vConstants, t0, x); - t0 = vmulq_f32(t0, root); - - float32x4_t t1 = vsubq_f32(g_XMPi, t0); - t0 = vbslq_f32(nonnegative, t0, t1); - return t0; -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_acos_ps(V); - return Result; -#elif defined(_XM_SSE_INTRINSICS_) - __m128 nonnegative = _mm_cmpge_ps(V, g_XMZero); - __m128 mvalue = _mm_sub_ps(g_XMZero, V); - __m128 x = _mm_max_ps(V, mvalue); // |V| - - // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. - __m128 oneMValue = _mm_sub_ps(g_XMOne, x); - __m128 clampOneMValue = _mm_max_ps(g_XMZero, oneMValue); - __m128 root = _mm_sqrt_ps(clampOneMValue); // sqrt(1-|V|) - - // Compute polynomial approximation - const XMVECTOR AC1 = g_XMArcCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 t0 = XM_FMADD_PS(vConstantsB, x, vConstants); - - vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(1, 1, 1, 1)); - t0 = XM_FMADD_PS(t0, x, vConstants); - - vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(0, 0, 0, 0)); - t0 = XM_FMADD_PS(t0, x, vConstants); - - const XMVECTOR AC0 = g_XMArcCoefficients0; - vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(3, 3, 3, 3)); - t0 = XM_FMADD_PS(t0, x, vConstants); - - vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(2, 2, 2, 2)); - t0 = XM_FMADD_PS(t0, x, vConstants); - - vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(1, 1, 1, 1)); - t0 = XM_FMADD_PS(t0, x, vConstants); - - vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(0, 0, 0, 0)); - t0 = XM_FMADD_PS(t0, x, vConstants); - t0 = _mm_mul_ps(t0, root); - - __m128 t1 = _mm_sub_ps(g_XMPi, t0); - t0 = _mm_and_ps(nonnegative, t0); - t1 = _mm_andnot_ps(nonnegative, t1); - t0 = _mm_or_ps(t0, t1); - return t0; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorATan(FXMVECTOR V) noexcept -{ - // 17-degree minimax approximation - -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - atanf(V.vector4_f32[0]), - atanf(V.vector4_f32[1]), - atanf(V.vector4_f32[2]), - atanf(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t absV = vabsq_f32(V); - float32x4_t invV = XMVectorReciprocal(V); - uint32x4_t comp = vcgtq_f32(V, g_XMOne); - float32x4_t sign = vbslq_f32(comp, g_XMOne, g_XMNegativeOne); - comp = vcleq_f32(absV, g_XMOne); - sign = vbslq_f32(comp, g_XMZero, sign); - float32x4_t x = vbslq_f32(comp, V, invV); - - float32x4_t x2 = vmulq_f32(x, x); - - // Compute polynomial approximation - const XMVECTOR TC1 = g_XMATanCoefficients1; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(TC1), 0); - XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(TC1), 1); - - vConstants = vdupq_lane_f32(vget_low_f32(TC1), 1); - Result = vmlaq_f32(vConstants, Result, x2); - - vConstants = vdupq_lane_f32(vget_low_f32(TC1), 0); - Result = vmlaq_f32(vConstants, Result, x2); - - const XMVECTOR TC0 = g_XMATanCoefficients0; - vConstants = vdupq_lane_f32(vget_high_f32(TC0), 1); - Result = vmlaq_f32(vConstants, Result, x2); - - vConstants = vdupq_lane_f32(vget_high_f32(TC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); - - vConstants = vdupq_lane_f32(vget_low_f32(TC0), 1); - Result = vmlaq_f32(vConstants, Result, x2); - - vConstants = vdupq_lane_f32(vget_low_f32(TC0), 0); - Result = vmlaq_f32(vConstants, Result, x2); - - Result = vmlaq_f32(g_XMOne, Result, x2); - Result = vmulq_f32(Result, x); - - float32x4_t result1 = vmulq_f32(sign, g_XMHalfPi); - result1 = vsubq_f32(result1, Result); - - comp = vceqq_f32(sign, g_XMZero); - Result = vbslq_f32(comp, Result, result1); - return Result; -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_atan_ps(V); - return Result; -#elif defined(_XM_SSE_INTRINSICS_) - __m128 absV = XMVectorAbs(V); - __m128 invV = _mm_div_ps(g_XMOne, V); - __m128 comp = _mm_cmpgt_ps(V, g_XMOne); - __m128 select0 = _mm_and_ps(comp, g_XMOne); - __m128 select1 = _mm_andnot_ps(comp, g_XMNegativeOne); - __m128 sign = _mm_or_ps(select0, select1); - comp = _mm_cmple_ps(absV, g_XMOne); - select0 = _mm_and_ps(comp, g_XMZero); - select1 = _mm_andnot_ps(comp, sign); - sign = _mm_or_ps(select0, select1); - select0 = _mm_and_ps(comp, V); - select1 = _mm_andnot_ps(comp, invV); - __m128 x = _mm_or_ps(select0, select1); - - __m128 x2 = _mm_mul_ps(x, x); - - // Compute polynomial approximation - const XMVECTOR TC1 = g_XMATanCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(TC1, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 vConstants = XM_PERMUTE_PS(TC1, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); - - vConstants = XM_PERMUTE_PS(TC1, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); - - vConstants = XM_PERMUTE_PS(TC1, _MM_SHUFFLE(0, 0, 0, 0)); - Result = XM_FMADD_PS(Result, x2, vConstants); - - const XMVECTOR TC0 = g_XMATanCoefficients0; - vConstants = XM_PERMUTE_PS(TC0, _MM_SHUFFLE(3, 3, 3, 3)); - Result = XM_FMADD_PS(Result, x2, vConstants); - - vConstants = XM_PERMUTE_PS(TC0, _MM_SHUFFLE(2, 2, 2, 2)); - Result = XM_FMADD_PS(Result, x2, vConstants); - - vConstants = XM_PERMUTE_PS(TC0, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); - - vConstants = XM_PERMUTE_PS(TC0, _MM_SHUFFLE(0, 0, 0, 0)); - Result = XM_FMADD_PS(Result, x2, vConstants); - - Result = XM_FMADD_PS(Result, x2, g_XMOne); - - Result = _mm_mul_ps(Result, x); - __m128 result1 = _mm_mul_ps(sign, g_XMHalfPi); - result1 = _mm_sub_ps(result1, Result); - - comp = _mm_cmpeq_ps(sign, g_XMZero); - select0 = _mm_and_ps(comp, Result); - select1 = _mm_andnot_ps(comp, result1); - Result = _mm_or_ps(select0, select1); - return Result; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorATan2 -( - FXMVECTOR Y, - FXMVECTOR X -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - atan2f(Y.vector4_f32[0], X.vector4_f32[0]), - atan2f(Y.vector4_f32[1], X.vector4_f32[1]), - atan2f(Y.vector4_f32[2], X.vector4_f32[2]), - atan2f(Y.vector4_f32[3], X.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_atan2_ps(Y, X); - return Result; -#else - - // Return the inverse tangent of Y / X in the range of -Pi to Pi with the following exceptions: - - // Y == 0 and X is Negative -> Pi with the sign of Y - // y == 0 and x is positive -> 0 with the sign of y - // Y != 0 and X == 0 -> Pi / 2 with the sign of Y - // Y != 0 and X is Negative -> atan(y/x) + (PI with the sign of Y) - // X == -Infinity and Finite Y -> Pi with the sign of Y - // X == +Infinity and Finite Y -> 0 with the sign of Y - // Y == Infinity and X is Finite -> Pi / 2 with the sign of Y - // Y == Infinity and X == -Infinity -> 3Pi / 4 with the sign of Y - // Y == Infinity and X == +Infinity -> Pi / 4 with the sign of Y - - static const XMVECTORF32 ATan2Constants = { { { XM_PI, XM_PIDIV2, XM_PIDIV4, XM_PI * 3.0f / 4.0f } } }; - - XMVECTOR Zero = XMVectorZero(); - XMVECTOR ATanResultValid = XMVectorTrueInt(); - - XMVECTOR Pi = XMVectorSplatX(ATan2Constants); - XMVECTOR PiOverTwo = XMVectorSplatY(ATan2Constants); - XMVECTOR PiOverFour = XMVectorSplatZ(ATan2Constants); - XMVECTOR ThreePiOverFour = XMVectorSplatW(ATan2Constants); - - XMVECTOR YEqualsZero = XMVectorEqual(Y, Zero); - XMVECTOR XEqualsZero = XMVectorEqual(X, Zero); - XMVECTOR XIsPositive = XMVectorAndInt(X, g_XMNegativeZero.v); - XIsPositive = XMVectorEqualInt(XIsPositive, Zero); - XMVECTOR YEqualsInfinity = XMVectorIsInfinite(Y); - XMVECTOR XEqualsInfinity = XMVectorIsInfinite(X); - - XMVECTOR YSign = XMVectorAndInt(Y, g_XMNegativeZero.v); - Pi = XMVectorOrInt(Pi, YSign); - PiOverTwo = XMVectorOrInt(PiOverTwo, YSign); - PiOverFour = XMVectorOrInt(PiOverFour, YSign); - ThreePiOverFour = XMVectorOrInt(ThreePiOverFour, YSign); - - XMVECTOR R1 = XMVectorSelect(Pi, YSign, XIsPositive); - XMVECTOR R2 = XMVectorSelect(ATanResultValid, PiOverTwo, XEqualsZero); - XMVECTOR R3 = XMVectorSelect(R2, R1, YEqualsZero); - XMVECTOR R4 = XMVectorSelect(ThreePiOverFour, PiOverFour, XIsPositive); - XMVECTOR R5 = XMVectorSelect(PiOverTwo, R4, XEqualsInfinity); - XMVECTOR Result = XMVectorSelect(R3, R5, YEqualsInfinity); - ATanResultValid = XMVectorEqualInt(Result, ATanResultValid); - - XMVECTOR V = XMVectorDivide(Y, X); - - XMVECTOR R0 = XMVectorATan(V); - - R1 = XMVectorSelect(Pi, g_XMNegativeZero, XIsPositive); - R2 = XMVectorAdd(R0, R1); - - return XMVectorSelect(Result, R2, ATanResultValid); - -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorSinEst(FXMVECTOR V) noexcept -{ - // 7-degree minimax approximation - -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - sinf(V.vector4_f32[0]), - sinf(V.vector4_f32[1]), - sinf(V.vector4_f32[2]), - sinf(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Force the value within the bounds of pi - XMVECTOR x = XMVectorModAngles(V); - - // Map in [-pi/2,pi/2] with sin(y) = sin(x). - uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); - uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - float32x4_t absx = vabsq_f32(x); - float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); - uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); - x = vbslq_f32(comp, x, rflx); - - float32x4_t x2 = vmulq_f32(x, x); - - // Compute polynomial approximation - const XMVECTOR SEC = g_XMSinCoefficients1; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(SEC), 0); - XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(SEC), 1); - - vConstants = vdupq_lane_f32(vget_low_f32(SEC), 1); - Result = vmlaq_f32(vConstants, Result, x2); - - Result = vmlaq_f32(g_XMOne, Result, x2); - Result = vmulq_f32(Result, x); - return Result; -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_sin_ps(V); - return Result; -#elif defined(_XM_SSE_INTRINSICS_) - // Force the value within the bounds of pi - XMVECTOR x = XMVectorModAngles(V); - - // Map in [-pi/2,pi/2] with sin(y) = sin(x). - __m128 sign = _mm_and_ps(x, g_XMNegativeZero); - __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - __m128 absx = _mm_andnot_ps(sign, x); // |x| - __m128 rflx = _mm_sub_ps(c, x); - __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); - __m128 select0 = _mm_and_ps(comp, x); - __m128 select1 = _mm_andnot_ps(comp, rflx); - x = _mm_or_ps(select0, select1); - - __m128 x2 = _mm_mul_ps(x, x); - - // Compute polynomial approximation - const XMVECTOR SEC = g_XMSinCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 vConstants = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); - - vConstants = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); - Result = XM_FMADD_PS(Result, x2, g_XMOne); - Result = _mm_mul_ps(Result, x); - return Result; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorCosEst(FXMVECTOR V) noexcept -{ - // 6-degree minimax approximation - -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - cosf(V.vector4_f32[0]), - cosf(V.vector4_f32[1]), - cosf(V.vector4_f32[2]), - cosf(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Map V to x in [-pi,pi]. - XMVECTOR x = XMVectorModAngles(V); - - // Map in [-pi/2,pi/2] with cos(y) = sign*cos(x). - uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); - uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - float32x4_t absx = vabsq_f32(x); - float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); - uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); - x = vbslq_f32(comp, x, rflx); - float32x4_t fsign = vbslq_f32(comp, g_XMOne, g_XMNegativeOne); - - float32x4_t x2 = vmulq_f32(x, x); - - // Compute polynomial approximation - const XMVECTOR CEC = g_XMCosCoefficients1; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(CEC), 0); - XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(CEC), 1); - - vConstants = vdupq_lane_f32(vget_low_f32(CEC), 1); - Result = vmlaq_f32(vConstants, Result, x2); - - Result = vmlaq_f32(g_XMOne, Result, x2); - Result = vmulq_f32(Result, fsign); - return Result; -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_cos_ps(V); - return Result; -#elif defined(_XM_SSE_INTRINSICS_) - // Map V to x in [-pi,pi]. - XMVECTOR x = XMVectorModAngles(V); - - // Map in [-pi/2,pi/2] with cos(y) = sign*cos(x). - XMVECTOR sign = _mm_and_ps(x, g_XMNegativeZero); - __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - __m128 absx = _mm_andnot_ps(sign, x); // |x| - __m128 rflx = _mm_sub_ps(c, x); - __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); - __m128 select0 = _mm_and_ps(comp, x); - __m128 select1 = _mm_andnot_ps(comp, rflx); - x = _mm_or_ps(select0, select1); - select0 = _mm_and_ps(comp, g_XMOne); - select1 = _mm_andnot_ps(comp, g_XMNegativeOne); - sign = _mm_or_ps(select0, select1); - - __m128 x2 = _mm_mul_ps(x, x); - - // Compute polynomial approximation - const XMVECTOR CEC = g_XMCosCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 vConstants = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); - - vConstants = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); - Result = XM_FMADD_PS(Result, x2, g_XMOne); - Result = _mm_mul_ps(Result, sign); - return Result; -#endif -} - -//------------------------------------------------------------------------------ - -_Use_decl_annotations_ -inline void XM_CALLCONV XMVectorSinCosEst -( - XMVECTOR* pSin, - XMVECTOR* pCos, - FXMVECTOR V -) noexcept -{ - assert(pSin != nullptr); - assert(pCos != nullptr); - - // 7/6-degree minimax approximation - -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Sin = { { { - sinf(V.vector4_f32[0]), - sinf(V.vector4_f32[1]), - sinf(V.vector4_f32[2]), - sinf(V.vector4_f32[3]) - } } }; - - XMVECTORF32 Cos = { { { - cosf(V.vector4_f32[0]), - cosf(V.vector4_f32[1]), - cosf(V.vector4_f32[2]), - cosf(V.vector4_f32[3]) - } } }; - - *pSin = Sin.v; - *pCos = Cos.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Force the value within the bounds of pi - XMVECTOR x = XMVectorModAngles(V); - - // Map in [-pi/2,pi/2] with cos(y) = sign*cos(x). - uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); - uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - float32x4_t absx = vabsq_f32(x); - float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); - uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); - x = vbslq_f32(comp, x, rflx); - float32x4_t fsign = vbslq_f32(comp, g_XMOne, g_XMNegativeOne); - - float32x4_t x2 = vmulq_f32(x, x); - - // Compute polynomial approximation for sine - const XMVECTOR SEC = g_XMSinCoefficients1; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(SEC), 0); - XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(SEC), 1); - - vConstants = vdupq_lane_f32(vget_low_f32(SEC), 1); - Result = vmlaq_f32(vConstants, Result, x2); - - Result = vmlaq_f32(g_XMOne, Result, x2); - *pSin = vmulq_f32(Result, x); - - // Compute polynomial approximation - const XMVECTOR CEC = g_XMCosCoefficients1; - vConstants = vdupq_lane_f32(vget_high_f32(CEC), 0); - Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(CEC), 1); - - vConstants = vdupq_lane_f32(vget_low_f32(CEC), 1); - Result = vmlaq_f32(vConstants, Result, x2); - - Result = vmlaq_f32(g_XMOne, Result, x2); - *pCos = vmulq_f32(Result, fsign); -#elif defined(_XM_SSE_INTRINSICS_) - // Force the value within the bounds of pi - XMVECTOR x = XMVectorModAngles(V); - - // Map in [-pi/2,pi/2] with sin(y) = sin(x), cos(y) = sign*cos(x). - XMVECTOR sign = _mm_and_ps(x, g_XMNegativeZero); - __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 - __m128 absx = _mm_andnot_ps(sign, x); // |x| - __m128 rflx = _mm_sub_ps(c, x); - __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); - __m128 select0 = _mm_and_ps(comp, x); - __m128 select1 = _mm_andnot_ps(comp, rflx); - x = _mm_or_ps(select0, select1); - select0 = _mm_and_ps(comp, g_XMOne); - select1 = _mm_andnot_ps(comp, g_XMNegativeOne); - sign = _mm_or_ps(select0, select1); - - __m128 x2 = _mm_mul_ps(x, x); - - // Compute polynomial approximation for sine - const XMVECTOR SEC = g_XMSinCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 vConstants = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); - - vConstants = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); - Result = XM_FMADD_PS(Result, x2, g_XMOne); - Result = _mm_mul_ps(Result, x); - *pSin = Result; - - // Compute polynomial approximation for cosine - const XMVECTOR CEC = g_XMCosCoefficients1; - vConstantsB = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(3, 3, 3, 3)); - vConstants = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(2, 2, 2, 2)); - Result = XM_FMADD_PS(vConstantsB, x2, vConstants); - - vConstants = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); - Result = XM_FMADD_PS(Result, x2, g_XMOne); - Result = _mm_mul_ps(Result, sign); - *pCos = Result; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorTanEst(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - tanf(V.vector4_f32[0]), - tanf(V.vector4_f32[1]), - tanf(V.vector4_f32[2]), - tanf(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_tan_ps(V); - return Result; -#else - - XMVECTOR OneOverPi = XMVectorSplatW(g_XMTanEstCoefficients.v); - - XMVECTOR V1 = XMVectorMultiply(V, OneOverPi); - V1 = XMVectorRound(V1); - - V1 = XMVectorNegativeMultiplySubtract(g_XMPi.v, V1, V); - - XMVECTOR T0 = XMVectorSplatX(g_XMTanEstCoefficients.v); - XMVECTOR T1 = XMVectorSplatY(g_XMTanEstCoefficients.v); - XMVECTOR T2 = XMVectorSplatZ(g_XMTanEstCoefficients.v); - - XMVECTOR V2T2 = XMVectorNegativeMultiplySubtract(V1, V1, T2); - XMVECTOR V2 = XMVectorMultiply(V1, V1); - XMVECTOR V1T0 = XMVectorMultiply(V1, T0); - XMVECTOR V1T1 = XMVectorMultiply(V1, T1); - - XMVECTOR D = XMVectorReciprocalEst(V2T2); - XMVECTOR N = XMVectorMultiplyAdd(V2, V1T1, V1T0); - - return XMVectorMultiply(N, D); - -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorASinEst(FXMVECTOR V) noexcept -{ - // 3-degree minimax approximation - -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result; - Result.f[0] = asinf(V.vector4_f32[0]); - Result.f[1] = asinf(V.vector4_f32[1]); - Result.f[2] = asinf(V.vector4_f32[2]); - Result.f[3] = asinf(V.vector4_f32[3]); - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t nonnegative = vcgeq_f32(V, g_XMZero); - float32x4_t x = vabsq_f32(V); - - // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. - float32x4_t oneMValue = vsubq_f32(g_XMOne, x); - float32x4_t clampOneMValue = vmaxq_f32(g_XMZero, oneMValue); - float32x4_t root = XMVectorSqrt(clampOneMValue); - - // Compute polynomial approximation - const XMVECTOR AEC = g_XMArcEstCoefficients; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AEC), 0); - XMVECTOR t0 = vmlaq_lane_f32(vConstants, x, vget_high_f32(AEC), 1); - - vConstants = vdupq_lane_f32(vget_low_f32(AEC), 1); - t0 = vmlaq_f32(vConstants, t0, x); - - vConstants = vdupq_lane_f32(vget_low_f32(AEC), 0); - t0 = vmlaq_f32(vConstants, t0, x); - t0 = vmulq_f32(t0, root); - - float32x4_t t1 = vsubq_f32(g_XMPi, t0); - t0 = vbslq_f32(nonnegative, t0, t1); - t0 = vsubq_f32(g_XMHalfPi, t0); - return t0; -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_asin_ps(V); - return Result; -#elif defined(_XM_SSE_INTRINSICS_) - __m128 nonnegative = _mm_cmpge_ps(V, g_XMZero); - __m128 mvalue = _mm_sub_ps(g_XMZero, V); - __m128 x = _mm_max_ps(V, mvalue); // |V| - - // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. - __m128 oneMValue = _mm_sub_ps(g_XMOne, x); - __m128 clampOneMValue = _mm_max_ps(g_XMZero, oneMValue); - __m128 root = _mm_sqrt_ps(clampOneMValue); // sqrt(1-|V|) - - // Compute polynomial approximation - const XMVECTOR AEC = g_XMArcEstCoefficients; - __m128 vConstantsB = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 t0 = XM_FMADD_PS(vConstantsB, x, vConstants); - - vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(1, 1, 1, 1)); - t0 = XM_FMADD_PS(t0, x, vConstants); - - vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(0, 0, 0, 0)); - t0 = XM_FMADD_PS(t0, x, vConstants); - t0 = _mm_mul_ps(t0, root); - - __m128 t1 = _mm_sub_ps(g_XMPi, t0); - t0 = _mm_and_ps(nonnegative, t0); - t1 = _mm_andnot_ps(nonnegative, t1); - t0 = _mm_or_ps(t0, t1); - t0 = _mm_sub_ps(g_XMHalfPi, t0); - return t0; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorACosEst(FXMVECTOR V) noexcept -{ - // 3-degree minimax approximation - -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - acosf(V.vector4_f32[0]), - acosf(V.vector4_f32[1]), - acosf(V.vector4_f32[2]), - acosf(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t nonnegative = vcgeq_f32(V, g_XMZero); - float32x4_t x = vabsq_f32(V); - - // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. - float32x4_t oneMValue = vsubq_f32(g_XMOne, x); - float32x4_t clampOneMValue = vmaxq_f32(g_XMZero, oneMValue); - float32x4_t root = XMVectorSqrt(clampOneMValue); - - // Compute polynomial approximation - const XMVECTOR AEC = g_XMArcEstCoefficients; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AEC), 0); - XMVECTOR t0 = vmlaq_lane_f32(vConstants, x, vget_high_f32(AEC), 1); - - vConstants = vdupq_lane_f32(vget_low_f32(AEC), 1); - t0 = vmlaq_f32(vConstants, t0, x); - - vConstants = vdupq_lane_f32(vget_low_f32(AEC), 0); - t0 = vmlaq_f32(vConstants, t0, x); - t0 = vmulq_f32(t0, root); - - float32x4_t t1 = vsubq_f32(g_XMPi, t0); - t0 = vbslq_f32(nonnegative, t0, t1); - return t0; -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_acos_ps(V); - return Result; -#elif defined(_XM_SSE_INTRINSICS_) - __m128 nonnegative = _mm_cmpge_ps(V, g_XMZero); - __m128 mvalue = _mm_sub_ps(g_XMZero, V); - __m128 x = _mm_max_ps(V, mvalue); // |V| - - // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. - __m128 oneMValue = _mm_sub_ps(g_XMOne, x); - __m128 clampOneMValue = _mm_max_ps(g_XMZero, oneMValue); - __m128 root = _mm_sqrt_ps(clampOneMValue); // sqrt(1-|V|) - - // Compute polynomial approximation - const XMVECTOR AEC = g_XMArcEstCoefficients; - __m128 vConstantsB = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 t0 = XM_FMADD_PS(vConstantsB, x, vConstants); - - vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(1, 1, 1, 1)); - t0 = XM_FMADD_PS(t0, x, vConstants); - - vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(0, 0, 0, 0)); - t0 = XM_FMADD_PS(t0, x, vConstants); - t0 = _mm_mul_ps(t0, root); - - __m128 t1 = _mm_sub_ps(g_XMPi, t0); - t0 = _mm_and_ps(nonnegative, t0); - t1 = _mm_andnot_ps(nonnegative, t1); - t0 = _mm_or_ps(t0, t1); - return t0; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorATanEst(FXMVECTOR V) noexcept -{ - // 9-degree minimax approximation - -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - atanf(V.vector4_f32[0]), - atanf(V.vector4_f32[1]), - atanf(V.vector4_f32[2]), - atanf(V.vector4_f32[3]) - } } }; - return Result.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t absV = vabsq_f32(V); - float32x4_t invV = XMVectorReciprocalEst(V); - uint32x4_t comp = vcgtq_f32(V, g_XMOne); - float32x4_t sign = vbslq_f32(comp, g_XMOne, g_XMNegativeOne); - comp = vcleq_f32(absV, g_XMOne); - sign = vbslq_f32(comp, g_XMZero, sign); - float32x4_t x = vbslq_f32(comp, V, invV); - - float32x4_t x2 = vmulq_f32(x, x); - - // Compute polynomial approximation - const XMVECTOR AEC = g_XMATanEstCoefficients1; - XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AEC), 0); - XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(AEC), 1); - - vConstants = vdupq_lane_f32(vget_low_f32(AEC), 1); - Result = vmlaq_f32(vConstants, Result, x2); - - vConstants = vdupq_lane_f32(vget_low_f32(AEC), 0); - Result = vmlaq_f32(vConstants, Result, x2); - - // ATanEstCoefficients0 is already splatted - Result = vmlaq_f32(g_XMATanEstCoefficients0, Result, x2); - Result = vmulq_f32(Result, x); - - float32x4_t result1 = vmulq_f32(sign, g_XMHalfPi); - result1 = vsubq_f32(result1, Result); - - comp = vceqq_f32(sign, g_XMZero); - Result = vbslq_f32(comp, Result, result1); - return Result; -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_atan_ps(V); - return Result; -#elif defined(_XM_SSE_INTRINSICS_) - __m128 absV = XMVectorAbs(V); - __m128 invV = _mm_div_ps(g_XMOne, V); - __m128 comp = _mm_cmpgt_ps(V, g_XMOne); - __m128 select0 = _mm_and_ps(comp, g_XMOne); - __m128 select1 = _mm_andnot_ps(comp, g_XMNegativeOne); - __m128 sign = _mm_or_ps(select0, select1); - comp = _mm_cmple_ps(absV, g_XMOne); - select0 = _mm_and_ps(comp, g_XMZero); - select1 = _mm_andnot_ps(comp, sign); - sign = _mm_or_ps(select0, select1); - select0 = _mm_and_ps(comp, V); - select1 = _mm_andnot_ps(comp, invV); - __m128 x = _mm_or_ps(select0, select1); - - __m128 x2 = _mm_mul_ps(x, x); - - // Compute polynomial approximation - const XMVECTOR AEC = g_XMATanEstCoefficients1; - __m128 vConstantsB = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(3, 3, 3, 3)); - __m128 vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(2, 2, 2, 2)); - __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); - - vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(1, 1, 1, 1)); - Result = XM_FMADD_PS(Result, x2, vConstants); - - vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(0, 0, 0, 0)); - Result = XM_FMADD_PS(Result, x2, vConstants); - // ATanEstCoefficients0 is already splatted - Result = XM_FMADD_PS(Result, x2, g_XMATanEstCoefficients0); - Result = _mm_mul_ps(Result, x); - __m128 result1 = _mm_mul_ps(sign, g_XMHalfPi); - result1 = _mm_sub_ps(result1, Result); - - comp = _mm_cmpeq_ps(sign, g_XMZero); - select0 = _mm_and_ps(comp, Result); - select1 = _mm_andnot_ps(comp, result1); - Result = _mm_or_ps(select0, select1); - return Result; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorATan2Est -( - FXMVECTOR Y, - FXMVECTOR X -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 Result = { { { - atan2f(Y.vector4_f32[0], X.vector4_f32[0]), - atan2f(Y.vector4_f32[1], X.vector4_f32[1]), - atan2f(Y.vector4_f32[2], X.vector4_f32[2]), - atan2f(Y.vector4_f32[3], X.vector4_f32[3]), - } } }; - return Result.v; -#elif defined(_XM_SVML_INTRINSICS_) - XMVECTOR Result = _mm_atan2_ps(Y, X); - return Result; -#else - - static const XMVECTORF32 ATan2Constants = { { { XM_PI, XM_PIDIV2, XM_PIDIV4, 2.3561944905f /* Pi*3/4 */ } } }; - - const XMVECTOR Zero = XMVectorZero(); - XMVECTOR ATanResultValid = XMVectorTrueInt(); - - XMVECTOR Pi = XMVectorSplatX(ATan2Constants); - XMVECTOR PiOverTwo = XMVectorSplatY(ATan2Constants); - XMVECTOR PiOverFour = XMVectorSplatZ(ATan2Constants); - XMVECTOR ThreePiOverFour = XMVectorSplatW(ATan2Constants); - - XMVECTOR YEqualsZero = XMVectorEqual(Y, Zero); - XMVECTOR XEqualsZero = XMVectorEqual(X, Zero); - XMVECTOR XIsPositive = XMVectorAndInt(X, g_XMNegativeZero.v); - XIsPositive = XMVectorEqualInt(XIsPositive, Zero); - XMVECTOR YEqualsInfinity = XMVectorIsInfinite(Y); - XMVECTOR XEqualsInfinity = XMVectorIsInfinite(X); - - XMVECTOR YSign = XMVectorAndInt(Y, g_XMNegativeZero.v); - Pi = XMVectorOrInt(Pi, YSign); - PiOverTwo = XMVectorOrInt(PiOverTwo, YSign); - PiOverFour = XMVectorOrInt(PiOverFour, YSign); - ThreePiOverFour = XMVectorOrInt(ThreePiOverFour, YSign); - - XMVECTOR R1 = XMVectorSelect(Pi, YSign, XIsPositive); - XMVECTOR R2 = XMVectorSelect(ATanResultValid, PiOverTwo, XEqualsZero); - XMVECTOR R3 = XMVectorSelect(R2, R1, YEqualsZero); - XMVECTOR R4 = XMVectorSelect(ThreePiOverFour, PiOverFour, XIsPositive); - XMVECTOR R5 = XMVectorSelect(PiOverTwo, R4, XEqualsInfinity); - XMVECTOR Result = XMVectorSelect(R3, R5, YEqualsInfinity); - ATanResultValid = XMVectorEqualInt(Result, ATanResultValid); - - XMVECTOR Reciprocal = XMVectorReciprocalEst(X); - XMVECTOR V = XMVectorMultiply(Y, Reciprocal); - XMVECTOR R0 = XMVectorATanEst(V); - - R1 = XMVectorSelect(Pi, g_XMNegativeZero, XIsPositive); - R2 = XMVectorAdd(R0, R1); - - Result = XMVectorSelect(Result, R2, ATanResultValid); - - return Result; - -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorLerp -( - FXMVECTOR V0, - FXMVECTOR V1, - float t -) noexcept -{ - // V0 + t * (V1 - V0) - -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Scale = XMVectorReplicate(t); - XMVECTOR Length = XMVectorSubtract(V1, V0); - return XMVectorMultiplyAdd(Length, Scale, V0); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - XMVECTOR L = vsubq_f32(V1, V0); - return vmlaq_n_f32(V0, L, t); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR L = _mm_sub_ps(V1, V0); - XMVECTOR S = _mm_set_ps1(t); - return XM_FMADD_PS(L, S, V0); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorLerpV -( - FXMVECTOR V0, - FXMVECTOR V1, - FXMVECTOR T -) noexcept -{ - // V0 + T * (V1 - V0) - -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Length = XMVectorSubtract(V1, V0); - return XMVectorMultiplyAdd(Length, T, V0); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - XMVECTOR L = vsubq_f32(V1, V0); - return vmlaq_f32(V0, L, T); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR Length = _mm_sub_ps(V1, V0); - return XM_FMADD_PS(Length, T, V0); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorHermite -( - FXMVECTOR Position0, - FXMVECTOR Tangent0, - FXMVECTOR Position1, - GXMVECTOR Tangent1, - float t -) noexcept -{ - // Result = (2 * t^3 - 3 * t^2 + 1) * Position0 + - // (t^3 - 2 * t^2 + t) * Tangent0 + - // (-2 * t^3 + 3 * t^2) * Position1 + - // (t^3 - t^2) * Tangent1 - -#if defined(_XM_NO_INTRINSICS_) - - float t2 = t * t; - float t3 = t * t2; - - XMVECTOR P0 = XMVectorReplicate(2.0f * t3 - 3.0f * t2 + 1.0f); - XMVECTOR T0 = XMVectorReplicate(t3 - 2.0f * t2 + t); - XMVECTOR P1 = XMVectorReplicate(-2.0f * t3 + 3.0f * t2); - XMVECTOR T1 = XMVectorReplicate(t3 - t2); - - XMVECTOR Result = XMVectorMultiply(P0, Position0); - Result = XMVectorMultiplyAdd(T0, Tangent0, Result); - Result = XMVectorMultiplyAdd(P1, Position1, Result); - Result = XMVectorMultiplyAdd(T1, Tangent1, Result); - - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float t2 = t * t; - float t3 = t * t2; - - float p0 = 2.0f * t3 - 3.0f * t2 + 1.0f; - float t0 = t3 - 2.0f * t2 + t; - float p1 = -2.0f * t3 + 3.0f * t2; - float t1 = t3 - t2; - - XMVECTOR vResult = vmulq_n_f32(Position0, p0); - vResult = vmlaq_n_f32(vResult, Tangent0, t0); - vResult = vmlaq_n_f32(vResult, Position1, p1); - vResult = vmlaq_n_f32(vResult, Tangent1, t1); - return vResult; -#elif defined(_XM_SSE_INTRINSICS_) - float t2 = t * t; - float t3 = t * t2; - - XMVECTOR P0 = _mm_set_ps1(2.0f * t3 - 3.0f * t2 + 1.0f); - XMVECTOR T0 = _mm_set_ps1(t3 - 2.0f * t2 + t); - XMVECTOR P1 = _mm_set_ps1(-2.0f * t3 + 3.0f * t2); - XMVECTOR T1 = _mm_set_ps1(t3 - t2); - - XMVECTOR vResult = _mm_mul_ps(P0, Position0); - vResult = XM_FMADD_PS(Tangent0, T0, vResult); - vResult = XM_FMADD_PS(Position1, P1, vResult); - vResult = XM_FMADD_PS(Tangent1, T1, vResult); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorHermiteV -( - FXMVECTOR Position0, - FXMVECTOR Tangent0, - FXMVECTOR Position1, - GXMVECTOR Tangent1, - HXMVECTOR T -) noexcept -{ - // Result = (2 * t^3 - 3 * t^2 + 1) * Position0 + - // (t^3 - 2 * t^2 + t) * Tangent0 + - // (-2 * t^3 + 3 * t^2) * Position1 + - // (t^3 - t^2) * Tangent1 - -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR T2 = XMVectorMultiply(T, T); - XMVECTOR T3 = XMVectorMultiply(T, T2); - - XMVECTOR P0 = XMVectorReplicate(2.0f * T3.vector4_f32[0] - 3.0f * T2.vector4_f32[0] + 1.0f); - XMVECTOR T0 = XMVectorReplicate(T3.vector4_f32[1] - 2.0f * T2.vector4_f32[1] + T.vector4_f32[1]); - XMVECTOR P1 = XMVectorReplicate(-2.0f * T3.vector4_f32[2] + 3.0f * T2.vector4_f32[2]); - XMVECTOR T1 = XMVectorReplicate(T3.vector4_f32[3] - T2.vector4_f32[3]); - - XMVECTOR Result = XMVectorMultiply(P0, Position0); - Result = XMVectorMultiplyAdd(T0, Tangent0, Result); - Result = XMVectorMultiplyAdd(P1, Position1, Result); - Result = XMVectorMultiplyAdd(T1, Tangent1, Result); - - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 CatMulT2 = { { { -3.0f, -2.0f, 3.0f, -1.0f } } }; - static const XMVECTORF32 CatMulT3 = { { { 2.0f, 1.0f, -2.0f, 1.0f } } }; - - XMVECTOR T2 = vmulq_f32(T, T); - XMVECTOR T3 = vmulq_f32(T, T2); - // Mul by the constants against t^2 - T2 = vmulq_f32(T2, CatMulT2); - // Mul by the constants against t^3 - T3 = vmlaq_f32(T2, T3, CatMulT3); - // T3 now has the pre-result. - // I need to add t.y only - T2 = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T), g_XMMaskY)); - T3 = vaddq_f32(T3, T2); - // Add 1.0f to x - T3 = vaddq_f32(T3, g_XMIdentityR0); - // Now, I have the constants created - // Mul the x constant to Position0 - XMVECTOR vResult = vmulq_lane_f32(Position0, vget_low_f32(T3), 0); // T3[0] - // Mul the y constant to Tangent0 - vResult = vmlaq_lane_f32(vResult, Tangent0, vget_low_f32(T3), 1); // T3[1] - // Mul the z constant to Position1 - vResult = vmlaq_lane_f32(vResult, Position1, vget_high_f32(T3), 0); // T3[2] - // Mul the w constant to Tangent1 - vResult = vmlaq_lane_f32(vResult, Tangent1, vget_high_f32(T3), 1); // T3[3] - return vResult; -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 CatMulT2 = { { { -3.0f, -2.0f, 3.0f, -1.0f } } }; - static const XMVECTORF32 CatMulT3 = { { { 2.0f, 1.0f, -2.0f, 1.0f } } }; - - XMVECTOR T2 = _mm_mul_ps(T, T); - XMVECTOR T3 = _mm_mul_ps(T, T2); - // Mul by the constants against t^2 - T2 = _mm_mul_ps(T2, CatMulT2); - // Mul by the constants against t^3 - T3 = XM_FMADD_PS(T3, CatMulT3, T2); - // T3 now has the pre-result. - // I need to add t.y only - T2 = _mm_and_ps(T, g_XMMaskY); - T3 = _mm_add_ps(T3, T2); - // Add 1.0f to x - T3 = _mm_add_ps(T3, g_XMIdentityR0); - // Now, I have the constants created - // Mul the x constant to Position0 - XMVECTOR vResult = XM_PERMUTE_PS(T3, _MM_SHUFFLE(0, 0, 0, 0)); - vResult = _mm_mul_ps(vResult, Position0); - // Mul the y constant to Tangent0 - T2 = XM_PERMUTE_PS(T3, _MM_SHUFFLE(1, 1, 1, 1)); - vResult = XM_FMADD_PS(T2, Tangent0, vResult); - // Mul the z constant to Position1 - T2 = XM_PERMUTE_PS(T3, _MM_SHUFFLE(2, 2, 2, 2)); - vResult = XM_FMADD_PS(T2, Position1, vResult); - // Mul the w constant to Tangent1 - T3 = XM_PERMUTE_PS(T3, _MM_SHUFFLE(3, 3, 3, 3)); - vResult = XM_FMADD_PS(T3, Tangent1, vResult); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorCatmullRom -( - FXMVECTOR Position0, - FXMVECTOR Position1, - FXMVECTOR Position2, - GXMVECTOR Position3, - float t -) noexcept -{ - // Result = ((-t^3 + 2 * t^2 - t) * Position0 + - // (3 * t^3 - 5 * t^2 + 2) * Position1 + - // (-3 * t^3 + 4 * t^2 + t) * Position2 + - // (t^3 - t^2) * Position3) * 0.5 - -#if defined(_XM_NO_INTRINSICS_) - - float t2 = t * t; - float t3 = t * t2; - - XMVECTOR P0 = XMVectorReplicate((-t3 + 2.0f * t2 - t) * 0.5f); - XMVECTOR P1 = XMVectorReplicate((3.0f * t3 - 5.0f * t2 + 2.0f) * 0.5f); - XMVECTOR P2 = XMVectorReplicate((-3.0f * t3 + 4.0f * t2 + t) * 0.5f); - XMVECTOR P3 = XMVectorReplicate((t3 - t2) * 0.5f); - - XMVECTOR Result = XMVectorMultiply(P0, Position0); - Result = XMVectorMultiplyAdd(P1, Position1, Result); - Result = XMVectorMultiplyAdd(P2, Position2, Result); - Result = XMVectorMultiplyAdd(P3, Position3, Result); - - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float t2 = t * t; - float t3 = t * t2; - - float p0 = (-t3 + 2.0f * t2 - t) * 0.5f; - float p1 = (3.0f * t3 - 5.0f * t2 + 2.0f) * 0.5f; - float p2 = (-3.0f * t3 + 4.0f * t2 + t) * 0.5f; - float p3 = (t3 - t2) * 0.5f; - - XMVECTOR P1 = vmulq_n_f32(Position1, p1); - XMVECTOR P0 = vmlaq_n_f32(P1, Position0, p0); - XMVECTOR P3 = vmulq_n_f32(Position3, p3); - XMVECTOR P2 = vmlaq_n_f32(P3, Position2, p2); - P0 = vaddq_f32(P0, P2); - return P0; -#elif defined(_XM_SSE_INTRINSICS_) - float t2 = t * t; - float t3 = t * t2; - - XMVECTOR P0 = _mm_set_ps1((-t3 + 2.0f * t2 - t) * 0.5f); - XMVECTOR P1 = _mm_set_ps1((3.0f * t3 - 5.0f * t2 + 2.0f) * 0.5f); - XMVECTOR P2 = _mm_set_ps1((-3.0f * t3 + 4.0f * t2 + t) * 0.5f); - XMVECTOR P3 = _mm_set_ps1((t3 - t2) * 0.5f); - - P1 = _mm_mul_ps(Position1, P1); - P0 = XM_FMADD_PS(Position0, P0, P1); - P3 = _mm_mul_ps(Position3, P3); - P2 = XM_FMADD_PS(Position2, P2, P3); - P0 = _mm_add_ps(P0, P2); - return P0; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorCatmullRomV -( - FXMVECTOR Position0, - FXMVECTOR Position1, - FXMVECTOR Position2, - GXMVECTOR Position3, - HXMVECTOR T -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - float fx = T.vector4_f32[0]; - float fy = T.vector4_f32[1]; - float fz = T.vector4_f32[2]; - float fw = T.vector4_f32[3]; - XMVECTORF32 vResult = { { { - 0.5f * ((-fx * fx * fx + 2 * fx * fx - fx) * Position0.vector4_f32[0] - + (3 * fx * fx * fx - 5 * fx * fx + 2) * Position1.vector4_f32[0] - + (-3 * fx * fx * fx + 4 * fx * fx + fx) * Position2.vector4_f32[0] - + (fx * fx * fx - fx * fx) * Position3.vector4_f32[0]), - - 0.5f * ((-fy * fy * fy + 2 * fy * fy - fy) * Position0.vector4_f32[1] - + (3 * fy * fy * fy - 5 * fy * fy + 2) * Position1.vector4_f32[1] - + (-3 * fy * fy * fy + 4 * fy * fy + fy) * Position2.vector4_f32[1] - + (fy * fy * fy - fy * fy) * Position3.vector4_f32[1]), - - 0.5f * ((-fz * fz * fz + 2 * fz * fz - fz) * Position0.vector4_f32[2] - + (3 * fz * fz * fz - 5 * fz * fz + 2) * Position1.vector4_f32[2] - + (-3 * fz * fz * fz + 4 * fz * fz + fz) * Position2.vector4_f32[2] - + (fz * fz * fz - fz * fz) * Position3.vector4_f32[2]), - - 0.5f * ((-fw * fw * fw + 2 * fw * fw - fw) * Position0.vector4_f32[3] - + (3 * fw * fw * fw - 5 * fw * fw + 2) * Position1.vector4_f32[3] - + (-3 * fw * fw * fw + 4 * fw * fw + fw) * Position2.vector4_f32[3] - + (fw * fw * fw - fw * fw) * Position3.vector4_f32[3]) - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Catmul2 = { { { 2.0f, 2.0f, 2.0f, 2.0f } } }; - static const XMVECTORF32 Catmul3 = { { { 3.0f, 3.0f, 3.0f, 3.0f } } }; - static const XMVECTORF32 Catmul4 = { { { 4.0f, 4.0f, 4.0f, 4.0f } } }; - static const XMVECTORF32 Catmul5 = { { { 5.0f, 5.0f, 5.0f, 5.0f } } }; - // Cache T^2 and T^3 - XMVECTOR T2 = vmulq_f32(T, T); - XMVECTOR T3 = vmulq_f32(T, T2); - // Perform the Position0 term - XMVECTOR vResult = vaddq_f32(T2, T2); - vResult = vsubq_f32(vResult, T); - vResult = vsubq_f32(vResult, T3); - vResult = vmulq_f32(vResult, Position0); - // Perform the Position1 term and add - XMVECTOR vTemp = vmulq_f32(T3, Catmul3); - vTemp = vmlsq_f32(vTemp, T2, Catmul5); - vTemp = vaddq_f32(vTemp, Catmul2); - vResult = vmlaq_f32(vResult, vTemp, Position1); - // Perform the Position2 term and add - vTemp = vmulq_f32(T2, Catmul4); - vTemp = vmlsq_f32(vTemp, T3, Catmul3); - vTemp = vaddq_f32(vTemp, T); - vResult = vmlaq_f32(vResult, vTemp, Position2); - // Position3 is the last term - T3 = vsubq_f32(T3, T2); - vResult = vmlaq_f32(vResult, T3, Position3); - // Multiply by 0.5f and exit - vResult = vmulq_f32(vResult, g_XMOneHalf); - return vResult; -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 Catmul2 = { { { 2.0f, 2.0f, 2.0f, 2.0f } } }; - static const XMVECTORF32 Catmul3 = { { { 3.0f, 3.0f, 3.0f, 3.0f } } }; - static const XMVECTORF32 Catmul4 = { { { 4.0f, 4.0f, 4.0f, 4.0f } } }; - static const XMVECTORF32 Catmul5 = { { { 5.0f, 5.0f, 5.0f, 5.0f } } }; - // Cache T^2 and T^3 - XMVECTOR T2 = _mm_mul_ps(T, T); - XMVECTOR T3 = _mm_mul_ps(T, T2); - // Perform the Position0 term - XMVECTOR vResult = _mm_add_ps(T2, T2); - vResult = _mm_sub_ps(vResult, T); - vResult = _mm_sub_ps(vResult, T3); - vResult = _mm_mul_ps(vResult, Position0); - // Perform the Position1 term and add - XMVECTOR vTemp = _mm_mul_ps(T3, Catmul3); - vTemp = XM_FNMADD_PS(T2, Catmul5, vTemp); - vTemp = _mm_add_ps(vTemp, Catmul2); - vResult = XM_FMADD_PS(vTemp, Position1, vResult); - // Perform the Position2 term and add - vTemp = _mm_mul_ps(T2, Catmul4); - vTemp = XM_FNMADD_PS(T3, Catmul3, vTemp); - vTemp = _mm_add_ps(vTemp, T); - vResult = XM_FMADD_PS(vTemp, Position2, vResult); - // Position3 is the last term - T3 = _mm_sub_ps(T3, T2); - vResult = XM_FMADD_PS(T3, Position3, vResult); - // Multiply by 0.5f and exit - vResult = _mm_mul_ps(vResult, g_XMOneHalf); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorBaryCentric -( - FXMVECTOR Position0, - FXMVECTOR Position1, - FXMVECTOR Position2, - float f, - float g -) noexcept -{ - // Result = Position0 + f * (Position1 - Position0) + g * (Position2 - Position0) - -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR P10 = XMVectorSubtract(Position1, Position0); - XMVECTOR ScaleF = XMVectorReplicate(f); - - XMVECTOR P20 = XMVectorSubtract(Position2, Position0); - XMVECTOR ScaleG = XMVectorReplicate(g); - - XMVECTOR Result = XMVectorMultiplyAdd(P10, ScaleF, Position0); - Result = XMVectorMultiplyAdd(P20, ScaleG, Result); - - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - XMVECTOR R1 = vsubq_f32(Position1, Position0); - XMVECTOR R2 = vsubq_f32(Position2, Position0); - R1 = vmlaq_n_f32(Position0, R1, f); - return vmlaq_n_f32(R1, R2, g); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR R1 = _mm_sub_ps(Position1, Position0); - XMVECTOR R2 = _mm_sub_ps(Position2, Position0); - XMVECTOR SF = _mm_set_ps1(f); - R1 = XM_FMADD_PS(R1, SF, Position0); - XMVECTOR SG = _mm_set_ps1(g); - return XM_FMADD_PS(R2, SG, R1); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVectorBaryCentricV -( - FXMVECTOR Position0, - FXMVECTOR Position1, - FXMVECTOR Position2, - GXMVECTOR F, - HXMVECTOR G -) noexcept -{ - // Result = Position0 + f * (Position1 - Position0) + g * (Position2 - Position0) - -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR P10 = XMVectorSubtract(Position1, Position0); - XMVECTOR P20 = XMVectorSubtract(Position2, Position0); - - XMVECTOR Result = XMVectorMultiplyAdd(P10, F, Position0); - Result = XMVectorMultiplyAdd(P20, G, Result); - - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - XMVECTOR R1 = vsubq_f32(Position1, Position0); - XMVECTOR R2 = vsubq_f32(Position2, Position0); - R1 = vmlaq_f32(Position0, R1, F); - return vmlaq_f32(R1, R2, G); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR R1 = _mm_sub_ps(Position1, Position0); - XMVECTOR R2 = _mm_sub_ps(Position2, Position0); - R1 = XM_FMADD_PS(R1, F, Position0); - return XM_FMADD_PS(R2, G, R1); -#endif -} - -/**************************************************************************** - * - * 2D Vector - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ -// Comparison operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector2Equal -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] == V2.vector4_f32[0]) && (V1.vector4_f32[1] == V2.vector4_f32[1])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vTemp = vceq_f32(vget_low_f32(V1), vget_low_f32(V2)); - return (vget_lane_u64(vreinterpret_u64_u32(vTemp), 0) == 0xFFFFFFFFFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); - // z and w are don't care - return (((_mm_movemask_ps(vTemp) & 3) == 3) != 0); -#endif -} - - -//------------------------------------------------------------------------------ - -inline uint32_t XM_CALLCONV XMVector2EqualR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - uint32_t CR = 0; - if ((V1.vector4_f32[0] == V2.vector4_f32[0]) && - (V1.vector4_f32[1] == V2.vector4_f32[1])) - { - CR = XM_CRMASK_CR6TRUE; - } - else if ((V1.vector4_f32[0] != V2.vector4_f32[0]) && - (V1.vector4_f32[1] != V2.vector4_f32[1])) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vTemp = vceq_f32(vget_low_f32(V1), vget_low_f32(V2)); - uint64_t r = vget_lane_u64(vreinterpret_u64_u32(vTemp), 0); - uint32_t CR = 0; - if (r == 0xFFFFFFFFFFFFFFFFU) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!r) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); - // z and w are don't care - int iTest = _mm_movemask_ps(vTemp) & 3; - uint32_t CR = 0; - if (iTest == 3) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!iTest) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector2EqualInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_u32[0] == V2.vector4_u32[0]) && (V1.vector4_u32[1] == V2.vector4_u32[1])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vTemp = vceq_u32(vget_low_u32(vreinterpretq_u32_f32(V1)), vget_low_u32(vreinterpretq_u32_f32(V2))); - return (vget_lane_u64(vreinterpret_u64_u32(vTemp), 0) == 0xFFFFFFFFFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); - return (((_mm_movemask_ps(_mm_castsi128_ps(vTemp)) & 3) == 3) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -inline uint32_t XM_CALLCONV XMVector2EqualIntR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - uint32_t CR = 0; - if ((V1.vector4_u32[0] == V2.vector4_u32[0]) && - (V1.vector4_u32[1] == V2.vector4_u32[1])) - { - CR = XM_CRMASK_CR6TRUE; - } - else if ((V1.vector4_u32[0] != V2.vector4_u32[0]) && - (V1.vector4_u32[1] != V2.vector4_u32[1])) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vTemp = vceq_u32(vget_low_u32(vreinterpretq_u32_f32(V1)), vget_low_u32(vreinterpretq_u32_f32(V2))); - uint64_t r = vget_lane_u64(vreinterpret_u64_u32(vTemp), 0); - uint32_t CR = 0; - if (r == 0xFFFFFFFFFFFFFFFFU) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!r) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#elif defined(_XM_SSE_INTRINSICS_) - __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); - int iTest = _mm_movemask_ps(_mm_castsi128_ps(vTemp)) & 3; - uint32_t CR = 0; - if (iTest == 3) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!iTest) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector2NearEqual -( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR Epsilon -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - float dx = fabsf(V1.vector4_f32[0] - V2.vector4_f32[0]); - float dy = fabsf(V1.vector4_f32[1] - V2.vector4_f32[1]); - return ((dx <= Epsilon.vector4_f32[0]) && - (dy <= Epsilon.vector4_f32[1])); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t vDelta = vsub_f32(vget_low_f32(V1), vget_low_f32(V2)); -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - uint32x2_t vTemp = vacle_f32(vDelta, vget_low_u32(Epsilon)); -#else - uint32x2_t vTemp = vcle_f32(vabs_f32(vDelta), vget_low_f32(Epsilon)); -#endif - uint64_t r = vget_lane_u64(vreinterpret_u64_u32(vTemp), 0); - return (r == 0xFFFFFFFFFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - // Get the difference - XMVECTOR vDelta = _mm_sub_ps(V1, V2); - // Get the absolute value of the difference - XMVECTOR vTemp = _mm_setzero_ps(); - vTemp = _mm_sub_ps(vTemp, vDelta); - vTemp = _mm_max_ps(vTemp, vDelta); - vTemp = _mm_cmple_ps(vTemp, Epsilon); - // z and w are don't care - return (((_mm_movemask_ps(vTemp) & 3) == 0x3) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector2NotEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] != V2.vector4_f32[0]) || (V1.vector4_f32[1] != V2.vector4_f32[1])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vTemp = vceq_f32(vget_low_f32(V1), vget_low_f32(V2)); - return (vget_lane_u64(vreinterpret_u64_u32(vTemp), 0) != 0xFFFFFFFFFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); - // z and w are don't care - return (((_mm_movemask_ps(vTemp) & 3) != 3) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector2NotEqualInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_u32[0] != V2.vector4_u32[0]) || (V1.vector4_u32[1] != V2.vector4_u32[1])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vTemp = vceq_u32(vget_low_u32(vreinterpretq_u32_f32(V1)), vget_low_u32(vreinterpretq_u32_f32(V2))); - return (vget_lane_u64(vreinterpret_u64_u32(vTemp), 0) != 0xFFFFFFFFFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); - return (((_mm_movemask_ps(_mm_castsi128_ps(vTemp)) & 3) != 3) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector2Greater -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] > V2.vector4_f32[0]) && (V1.vector4_f32[1] > V2.vector4_f32[1])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vTemp = vcgt_f32(vget_low_f32(V1), vget_low_f32(V2)); - return (vget_lane_u64(vreinterpret_u64_u32(vTemp), 0) == 0xFFFFFFFFFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); - // z and w are don't care - return (((_mm_movemask_ps(vTemp) & 3) == 3) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -inline uint32_t XM_CALLCONV XMVector2GreaterR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - uint32_t CR = 0; - if ((V1.vector4_f32[0] > V2.vector4_f32[0]) && - (V1.vector4_f32[1] > V2.vector4_f32[1])) - { - CR = XM_CRMASK_CR6TRUE; - } - else if ((V1.vector4_f32[0] <= V2.vector4_f32[0]) && - (V1.vector4_f32[1] <= V2.vector4_f32[1])) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vTemp = vcgt_f32(vget_low_f32(V1), vget_low_f32(V2)); - uint64_t r = vget_lane_u64(vreinterpret_u64_u32(vTemp), 0); - uint32_t CR = 0; - if (r == 0xFFFFFFFFFFFFFFFFU) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!r) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); - int iTest = _mm_movemask_ps(vTemp) & 3; - uint32_t CR = 0; - if (iTest == 3) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!iTest) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector2GreaterOrEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] >= V2.vector4_f32[0]) && (V1.vector4_f32[1] >= V2.vector4_f32[1])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vTemp = vcge_f32(vget_low_f32(V1), vget_low_f32(V2)); - return (vget_lane_u64(vreinterpret_u64_u32(vTemp), 0) == 0xFFFFFFFFFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); - return (((_mm_movemask_ps(vTemp) & 3) == 3) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -inline uint32_t XM_CALLCONV XMVector2GreaterOrEqualR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - uint32_t CR = 0; - if ((V1.vector4_f32[0] >= V2.vector4_f32[0]) && - (V1.vector4_f32[1] >= V2.vector4_f32[1])) - { - CR = XM_CRMASK_CR6TRUE; - } - else if ((V1.vector4_f32[0] < V2.vector4_f32[0]) && - (V1.vector4_f32[1] < V2.vector4_f32[1])) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vTemp = vcge_f32(vget_low_f32(V1), vget_low_f32(V2)); - uint64_t r = vget_lane_u64(vreinterpret_u64_u32(vTemp), 0); - uint32_t CR = 0; - if (r == 0xFFFFFFFFFFFFFFFFU) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!r) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); - int iTest = _mm_movemask_ps(vTemp) & 3; - uint32_t CR = 0; - if (iTest == 3) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!iTest) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector2Less -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] < V2.vector4_f32[0]) && (V1.vector4_f32[1] < V2.vector4_f32[1])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vTemp = vclt_f32(vget_low_f32(V1), vget_low_f32(V2)); - return (vget_lane_u64(vreinterpret_u64_u32(vTemp), 0) == 0xFFFFFFFFFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmplt_ps(V1, V2); - return (((_mm_movemask_ps(vTemp) & 3) == 3) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector2LessOrEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] <= V2.vector4_f32[0]) && (V1.vector4_f32[1] <= V2.vector4_f32[1])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vTemp = vcle_f32(vget_low_f32(V1), vget_low_f32(V2)); - return (vget_lane_u64(vreinterpret_u64_u32(vTemp), 0) == 0xFFFFFFFFFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmple_ps(V1, V2); - return (((_mm_movemask_ps(vTemp) & 3) == 3) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector2InBounds -( - FXMVECTOR V, - FXMVECTOR Bounds -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V.vector4_f32[0] <= Bounds.vector4_f32[0] && V.vector4_f32[0] >= -Bounds.vector4_f32[0]) && - (V.vector4_f32[1] <= Bounds.vector4_f32[1] && V.vector4_f32[1] >= -Bounds.vector4_f32[1])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); - float32x2_t B = vget_low_f32(Bounds); - // Test if less than or equal - uint32x2_t ivTemp1 = vcle_f32(VL, B); - // Negate the bounds - float32x2_t vTemp2 = vneg_f32(B); - // Test if greater or equal (Reversed) - uint32x2_t ivTemp2 = vcle_f32(vTemp2, VL); - // Blend answers - ivTemp1 = vand_u32(ivTemp1, ivTemp2); - // x and y in bounds? - return (vget_lane_u64(vreinterpret_u64_u32(ivTemp1), 0) == 0xFFFFFFFFFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - // Test if less than or equal - XMVECTOR vTemp1 = _mm_cmple_ps(V, Bounds); - // Negate the bounds - XMVECTOR vTemp2 = _mm_mul_ps(Bounds, g_XMNegativeOne); - // Test if greater or equal (Reversed) - vTemp2 = _mm_cmple_ps(vTemp2, V); - // Blend answers - vTemp1 = _mm_and_ps(vTemp1, vTemp2); - // x and y in bounds? (z and w are don't care) - return (((_mm_movemask_ps(vTemp1) & 0x3) == 0x3) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) -#pragma float_control(push) -#pragma float_control(precise, on) -#endif - -inline bool XM_CALLCONV XMVector2IsNaN(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (XMISNAN(V.vector4_f32[0]) || - XMISNAN(V.vector4_f32[1])); -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(__clang__) && defined(__FINITE_MATH_ONLY__) - return isnan(vgetq_lane_f32(V, 0)) || isnan(vgetq_lane_f32(V, 1)); -#else - float32x2_t VL = vget_low_f32(V); - // Test against itself. NaN is always not equal - uint32x2_t vTempNan = vceq_f32(VL, VL); - // If x or y are NaN, the mask is zero - return (vget_lane_u64(vreinterpret_u64_u32(vTempNan), 0) != 0xFFFFFFFFFFFFFFFFU); -#endif -#elif defined(_XM_SSE_INTRINSICS_) -#if defined(__clang__) && defined(__FINITE_MATH_ONLY__) - XM_ALIGNED_DATA(16) float tmp[4]; - _mm_store_ps(tmp, V); - return isnan(tmp[0]) || isnan(tmp[1]); -#else -// Test against itself. NaN is always not equal - XMVECTOR vTempNan = _mm_cmpneq_ps(V, V); - // If x or y are NaN, the mask is non-zero - return ((_mm_movemask_ps(vTempNan) & 3) != 0); -#endif -#endif -} - -#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) -#pragma float_control(pop) -#endif - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector2IsInfinite(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - return (XMISINF(V.vector4_f32[0]) || - XMISINF(V.vector4_f32[1])); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Mask off the sign bit - uint32x2_t vTemp = vand_u32(vget_low_u32(vreinterpretq_u32_f32(V)), vget_low_u32(g_XMAbsMask)); - // Compare to infinity - vTemp = vceq_f32(vreinterpret_f32_u32(vTemp), vget_low_f32(g_XMInfinity)); - // If any are infinity, the signs are true. - return vget_lane_u64(vreinterpret_u64_u32(vTemp), 0) != 0; -#elif defined(_XM_SSE_INTRINSICS_) - // Mask off the sign bit - __m128 vTemp = _mm_and_ps(V, g_XMAbsMask); - // Compare to infinity - vTemp = _mm_cmpeq_ps(vTemp, g_XMInfinity); - // If x or z are infinity, the signs are true. - return ((_mm_movemask_ps(vTemp) & 3) != 0); -#endif -} - -//------------------------------------------------------------------------------ -// Computation operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2Dot -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORF32 Result; - Result.f[0] = - Result.f[1] = - Result.f[2] = - Result.f[3] = V1.vector4_f32[0] * V2.vector4_f32[0] + V1.vector4_f32[1] * V2.vector4_f32[1]; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Perform the dot product on x and y - float32x2_t vTemp = vmul_f32(vget_low_f32(V1), vget_low_f32(V2)); - vTemp = vpadd_f32(vTemp, vTemp); - return vcombine_f32(vTemp, vTemp); -#elif defined(_XM_SSE4_INTRINSICS_) - return _mm_dp_ps(V1, V2, 0x3f); -#elif defined(_XM_SSE3_INTRINSICS_) - XMVECTOR vDot = _mm_mul_ps(V1, V2); - vDot = _mm_hadd_ps(vDot, vDot); - vDot = _mm_moveldup_ps(vDot); - return vDot; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product on x and y - XMVECTOR vLengthSq = _mm_mul_ps(V1, V2); - // vTemp has y splatted - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 1, 1, 1)); - // x+y - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); - return vLengthSq; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2Cross -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ - // [ V1.x*V2.y - V1.y*V2.x, V1.x*V2.y - V1.y*V2.x ] - -#if defined(_XM_NO_INTRINSICS_) - float fCross = (V1.vector4_f32[0] * V2.vector4_f32[1]) - (V1.vector4_f32[1] * V2.vector4_f32[0]); - XMVECTORF32 vResult; - vResult.f[0] = - vResult.f[1] = - vResult.f[2] = - vResult.f[3] = fCross; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Negate = { { { 1.f, -1.f, 0, 0 } } }; - - float32x2_t vTemp = vmul_f32(vget_low_f32(V1), vrev64_f32(vget_low_f32(V2))); - vTemp = vmul_f32(vTemp, vget_low_f32(Negate)); - vTemp = vpadd_f32(vTemp, vTemp); - return vcombine_f32(vTemp, vTemp); -#elif defined(_XM_SSE_INTRINSICS_) - // Swap x and y - XMVECTOR vResult = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 1, 0, 1)); - // Perform the muls - vResult = _mm_mul_ps(vResult, V1); - // Splat y - XMVECTOR vTemp = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(1, 1, 1, 1)); - // Sub the values - vResult = _mm_sub_ss(vResult, vTemp); - // Splat the cross product - vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(0, 0, 0, 0)); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2LengthSq(FXMVECTOR V) noexcept -{ - return XMVector2Dot(V, V); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2ReciprocalLengthEst(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Result; - Result = XMVector2LengthSq(V); - Result = XMVectorReciprocalSqrtEst(Result); - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); - // Dot2 - float32x2_t vTemp = vmul_f32(VL, VL); - vTemp = vpadd_f32(vTemp, vTemp); - // Reciprocal sqrt (estimate) - vTemp = vrsqrte_f32(vTemp); - return vcombine_f32(vTemp, vTemp); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); - return _mm_rsqrt_ps(vTemp); -#elif defined(_XM_SSE3_INTRINSICS_) - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - XMVECTOR vTemp = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_rsqrt_ss(vTemp); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); - return vLengthSq; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product on x and y - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - // vTemp has y splatted - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 1, 1, 1)); - // x+y - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - vLengthSq = _mm_rsqrt_ss(vLengthSq); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); - return vLengthSq; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2ReciprocalLength(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Result; - Result = XMVector2LengthSq(V); - Result = XMVectorReciprocalSqrt(Result); - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); - // Dot2 - float32x2_t vTemp = vmul_f32(VL, VL); - vTemp = vpadd_f32(vTemp, vTemp); - // Reciprocal sqrt - float32x2_t S0 = vrsqrte_f32(vTemp); - float32x2_t P0 = vmul_f32(vTemp, S0); - float32x2_t R0 = vrsqrts_f32(P0, S0); - float32x2_t S1 = vmul_f32(S0, R0); - float32x2_t P1 = vmul_f32(vTemp, S1); - float32x2_t R1 = vrsqrts_f32(P1, S1); - float32x2_t Result = vmul_f32(S1, R1); - return vcombine_f32(Result, Result); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); - XMVECTOR vLengthSq = _mm_sqrt_ps(vTemp); - return _mm_div_ps(g_XMOne, vLengthSq); -#elif defined(_XM_SSE3_INTRINSICS_) - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - XMVECTOR vTemp = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_sqrt_ss(vTemp); - vLengthSq = _mm_div_ss(g_XMOne, vLengthSq); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); - return vLengthSq; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product on x and y - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - // vTemp has y splatted - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 1, 1, 1)); - // x+y - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - vLengthSq = _mm_sqrt_ss(vLengthSq); - vLengthSq = _mm_div_ss(g_XMOne, vLengthSq); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); - return vLengthSq; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2LengthEst(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Result; - Result = XMVector2LengthSq(V); - Result = XMVectorSqrtEst(Result); - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); - // Dot2 - float32x2_t vTemp = vmul_f32(VL, VL); - vTemp = vpadd_f32(vTemp, vTemp); - const float32x2_t zero = vdup_n_f32(0); - uint32x2_t VEqualsZero = vceq_f32(vTemp, zero); - // Sqrt (estimate) - float32x2_t Result = vrsqrte_f32(vTemp); - Result = vmul_f32(vTemp, Result); - Result = vbsl_f32(VEqualsZero, zero, Result); - return vcombine_f32(Result, Result); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); - return _mm_sqrt_ps(vTemp); -#elif defined(_XM_SSE3_INTRINSICS_) - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - XMVECTOR vTemp = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_sqrt_ss(vTemp); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); - return vLengthSq; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product on x and y - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - // vTemp has y splatted - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 1, 1, 1)); - // x+y - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - vLengthSq = _mm_sqrt_ss(vLengthSq); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); - return vLengthSq; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2Length(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Result; - Result = XMVector2LengthSq(V); - Result = XMVectorSqrt(Result); - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); - // Dot2 - float32x2_t vTemp = vmul_f32(VL, VL); - vTemp = vpadd_f32(vTemp, vTemp); - const float32x2_t zero = vdup_n_f32(0); - uint32x2_t VEqualsZero = vceq_f32(vTemp, zero); - // Sqrt - float32x2_t S0 = vrsqrte_f32(vTemp); - float32x2_t P0 = vmul_f32(vTemp, S0); - float32x2_t R0 = vrsqrts_f32(P0, S0); - float32x2_t S1 = vmul_f32(S0, R0); - float32x2_t P1 = vmul_f32(vTemp, S1); - float32x2_t R1 = vrsqrts_f32(P1, S1); - float32x2_t Result = vmul_f32(S1, R1); - Result = vmul_f32(vTemp, Result); - Result = vbsl_f32(VEqualsZero, zero, Result); - return vcombine_f32(Result, Result); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); - return _mm_sqrt_ps(vTemp); -#elif defined(_XM_SSE3_INTRINSICS_) - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - XMVECTOR vTemp = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_sqrt_ss(vTemp); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); - return vLengthSq; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product on x and y - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - // vTemp has y splatted - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 1, 1, 1)); - // x+y - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); - vLengthSq = _mm_sqrt_ps(vLengthSq); - return vLengthSq; -#endif -} - -//------------------------------------------------------------------------------ -// XMVector2NormalizeEst uses a reciprocal estimate and -// returns QNaN on zero and infinite vectors. - -inline XMVECTOR XM_CALLCONV XMVector2NormalizeEst(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Result; - Result = XMVector2ReciprocalLength(V); - Result = XMVectorMultiply(V, Result); - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); - // Dot2 - float32x2_t vTemp = vmul_f32(VL, VL); - vTemp = vpadd_f32(vTemp, vTemp); - // Reciprocal sqrt (estimate) - vTemp = vrsqrte_f32(vTemp); - // Normalize - float32x2_t Result = vmul_f32(VL, vTemp); - return vcombine_f32(Result, Result); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); - XMVECTOR vResult = _mm_rsqrt_ps(vTemp); - return _mm_mul_ps(vResult, V); -#elif defined(_XM_SSE3_INTRINSICS_) - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_rsqrt_ss(vLengthSq); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); - vLengthSq = _mm_mul_ps(vLengthSq, V); - return vLengthSq; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product on x and y - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - // vTemp has y splatted - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 1, 1, 1)); - // x+y - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - vLengthSq = _mm_rsqrt_ss(vLengthSq); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); - vLengthSq = _mm_mul_ps(vLengthSq, V); - return vLengthSq; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2Normalize(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR vResult = XMVector2Length(V); - float fLength = vResult.vector4_f32[0]; - - // Prevent divide by zero - if (fLength > 0) - { - fLength = 1.0f / fLength; - } - - vResult.vector4_f32[0] = V.vector4_f32[0] * fLength; - vResult.vector4_f32[1] = V.vector4_f32[1] * fLength; - vResult.vector4_f32[2] = V.vector4_f32[2] * fLength; - vResult.vector4_f32[3] = V.vector4_f32[3] * fLength; - return vResult; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); - // Dot2 - float32x2_t vTemp = vmul_f32(VL, VL); - vTemp = vpadd_f32(vTemp, vTemp); - uint32x2_t VEqualsZero = vceq_f32(vTemp, vdup_n_f32(0)); - uint32x2_t VEqualsInf = vceq_f32(vTemp, vget_low_f32(g_XMInfinity)); - // Reciprocal sqrt (2 iterations of Newton-Raphson) - float32x2_t S0 = vrsqrte_f32(vTemp); - float32x2_t P0 = vmul_f32(vTemp, S0); - float32x2_t R0 = vrsqrts_f32(P0, S0); - float32x2_t S1 = vmul_f32(S0, R0); - float32x2_t P1 = vmul_f32(vTemp, S1); - float32x2_t R1 = vrsqrts_f32(P1, S1); - vTemp = vmul_f32(S1, R1); - // Normalize - float32x2_t Result = vmul_f32(VL, vTemp); - Result = vbsl_f32(VEqualsZero, vdup_n_f32(0), Result); - Result = vbsl_f32(VEqualsInf, vget_low_f32(g_XMQNaN), Result); - return vcombine_f32(Result, Result); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vLengthSq = _mm_dp_ps(V, V, 0x3f); - // Prepare for the division - XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); - // Create zero with a single instruction - XMVECTOR vZeroMask = _mm_setzero_ps(); - // Test for a divide by zero (Must be FP to detect -0.0) - vZeroMask = _mm_cmpneq_ps(vZeroMask, vResult); - // Failsafe on zero (Or epsilon) length planes - // If the length is infinity, set the elements to zero - vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); - // Reciprocal mul to perform the normalization - vResult = _mm_div_ps(V, vResult); - // Any that are infinity, set to zero - vResult = _mm_and_ps(vResult, vZeroMask); - // Select qnan or result based on infinite length - XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); - XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); - return vResult; -#elif defined(_XM_SSE3_INTRINSICS_) - // Perform the dot product on x and y only - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_moveldup_ps(vLengthSq); - // Prepare for the division - XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); - // Create zero with a single instruction - XMVECTOR vZeroMask = _mm_setzero_ps(); - // Test for a divide by zero (Must be FP to detect -0.0) - vZeroMask = _mm_cmpneq_ps(vZeroMask, vResult); - // Failsafe on zero (Or epsilon) length planes - // If the length is infinity, set the elements to zero - vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); - // Reciprocal mul to perform the normalization - vResult = _mm_div_ps(V, vResult); - // Any that are infinity, set to zero - vResult = _mm_and_ps(vResult, vZeroMask); - // Select qnan or result based on infinite length - XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); - XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); - return vResult; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product on x and y only - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 1, 1, 1)); - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); - // Prepare for the division - XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); - // Create zero with a single instruction - XMVECTOR vZeroMask = _mm_setzero_ps(); - // Test for a divide by zero (Must be FP to detect -0.0) - vZeroMask = _mm_cmpneq_ps(vZeroMask, vResult); - // Failsafe on zero (Or epsilon) length planes - // If the length is infinity, set the elements to zero - vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); - // Reciprocal mul to perform the normalization - vResult = _mm_div_ps(V, vResult); - // Any that are infinity, set to zero - vResult = _mm_and_ps(vResult, vZeroMask); - // Select qnan or result based on infinite length - XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); - XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2ClampLength -( - FXMVECTOR V, - float LengthMin, - float LengthMax -) noexcept -{ - XMVECTOR ClampMax = XMVectorReplicate(LengthMax); - XMVECTOR ClampMin = XMVectorReplicate(LengthMin); - return XMVector2ClampLengthV(V, ClampMin, ClampMax); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2ClampLengthV -( - FXMVECTOR V, - FXMVECTOR LengthMin, - FXMVECTOR LengthMax -) noexcept -{ - assert((XMVectorGetY(LengthMin) == XMVectorGetX(LengthMin))); - assert((XMVectorGetY(LengthMax) == XMVectorGetX(LengthMax))); - assert(XMVector2GreaterOrEqual(LengthMin, g_XMZero)); - assert(XMVector2GreaterOrEqual(LengthMax, g_XMZero)); - assert(XMVector2GreaterOrEqual(LengthMax, LengthMin)); - - XMVECTOR LengthSq = XMVector2LengthSq(V); - - const XMVECTOR Zero = XMVectorZero(); - - XMVECTOR RcpLength = XMVectorReciprocalSqrt(LengthSq); - - XMVECTOR InfiniteLength = XMVectorEqualInt(LengthSq, g_XMInfinity.v); - XMVECTOR ZeroLength = XMVectorEqual(LengthSq, Zero); - - XMVECTOR Length = XMVectorMultiply(LengthSq, RcpLength); - - XMVECTOR Normal = XMVectorMultiply(V, RcpLength); - - XMVECTOR Select = XMVectorEqualInt(InfiniteLength, ZeroLength); - Length = XMVectorSelect(LengthSq, Length, Select); - Normal = XMVectorSelect(LengthSq, Normal, Select); - - XMVECTOR ControlMax = XMVectorGreater(Length, LengthMax); - XMVECTOR ControlMin = XMVectorLess(Length, LengthMin); - - XMVECTOR ClampLength = XMVectorSelect(Length, LengthMax, ControlMax); - ClampLength = XMVectorSelect(ClampLength, LengthMin, ControlMin); - - XMVECTOR Result = XMVectorMultiply(Normal, ClampLength); - - // Preserve the original vector (with no precision loss) if the length falls within the given range - XMVECTOR Control = XMVectorEqualInt(ControlMax, ControlMin); - Result = XMVectorSelect(Result, V, Control); - - return Result; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2Reflect -( - FXMVECTOR Incident, - FXMVECTOR Normal -) noexcept -{ - // Result = Incident - (2 * dot(Incident, Normal)) * Normal - - XMVECTOR Result; - Result = XMVector2Dot(Incident, Normal); - Result = XMVectorAdd(Result, Result); - Result = XMVectorNegativeMultiplySubtract(Result, Normal, Incident); - return Result; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2Refract -( - FXMVECTOR Incident, - FXMVECTOR Normal, - float RefractionIndex -) noexcept -{ - XMVECTOR Index = XMVectorReplicate(RefractionIndex); - return XMVector2RefractV(Incident, Normal, Index); -} - -//------------------------------------------------------------------------------ - -// Return the refraction of a 2D vector -inline XMVECTOR XM_CALLCONV XMVector2RefractV -( - FXMVECTOR Incident, - FXMVECTOR Normal, - FXMVECTOR RefractionIndex -) noexcept -{ - // Result = RefractionIndex * Incident - Normal * (RefractionIndex * dot(Incident, Normal) + - // sqrt(1 - RefractionIndex * RefractionIndex * (1 - dot(Incident, Normal) * dot(Incident, Normal)))) - -#if defined(_XM_NO_INTRINSICS_) - - float IDotN = (Incident.vector4_f32[0] * Normal.vector4_f32[0]) + (Incident.vector4_f32[1] * Normal.vector4_f32[1]); - // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) - float RY = 1.0f - (IDotN * IDotN); - float RX = 1.0f - (RY * RefractionIndex.vector4_f32[0] * RefractionIndex.vector4_f32[0]); - RY = 1.0f - (RY * RefractionIndex.vector4_f32[1] * RefractionIndex.vector4_f32[1]); - if (RX >= 0.0f) - { - RX = (RefractionIndex.vector4_f32[0] * Incident.vector4_f32[0]) - (Normal.vector4_f32[0] * ((RefractionIndex.vector4_f32[0] * IDotN) + sqrtf(RX))); - } - else - { - RX = 0.0f; - } - if (RY >= 0.0f) - { - RY = (RefractionIndex.vector4_f32[1] * Incident.vector4_f32[1]) - (Normal.vector4_f32[1] * ((RefractionIndex.vector4_f32[1] * IDotN) + sqrtf(RY))); - } - else - { - RY = 0.0f; - } - - XMVECTOR vResult; - vResult.vector4_f32[0] = RX; - vResult.vector4_f32[1] = RY; - vResult.vector4_f32[2] = 0.0f; - vResult.vector4_f32[3] = 0.0f; - return vResult; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t IL = vget_low_f32(Incident); - float32x2_t NL = vget_low_f32(Normal); - float32x2_t RIL = vget_low_f32(RefractionIndex); - // Get the 2D Dot product of Incident-Normal - float32x2_t vTemp = vmul_f32(IL, NL); - float32x2_t IDotN = vpadd_f32(vTemp, vTemp); - // vTemp = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) - vTemp = vmls_f32(vget_low_f32(g_XMOne), IDotN, IDotN); - vTemp = vmul_f32(vTemp, RIL); - vTemp = vmls_f32(vget_low_f32(g_XMOne), vTemp, RIL); - // If any terms are <=0, sqrt() will fail, punt to zero - uint32x2_t vMask = vcgt_f32(vTemp, vget_low_f32(g_XMZero)); - // Sqrt(vTemp) - float32x2_t S0 = vrsqrte_f32(vTemp); - float32x2_t P0 = vmul_f32(vTemp, S0); - float32x2_t R0 = vrsqrts_f32(P0, S0); - float32x2_t S1 = vmul_f32(S0, R0); - float32x2_t P1 = vmul_f32(vTemp, S1); - float32x2_t R1 = vrsqrts_f32(P1, S1); - float32x2_t S2 = vmul_f32(S1, R1); - vTemp = vmul_f32(vTemp, S2); - // R = RefractionIndex * IDotN + sqrt(R) - vTemp = vmla_f32(vTemp, RIL, IDotN); - // Result = RefractionIndex * Incident - Normal * R - float32x2_t vResult = vmul_f32(RIL, IL); - vResult = vmls_f32(vResult, vTemp, NL); - vResult = vreinterpret_f32_u32(vand_u32(vreinterpret_u32_f32(vResult), vMask)); - return vcombine_f32(vResult, vResult); -#elif defined(_XM_SSE_INTRINSICS_) - // Result = RefractionIndex * Incident - Normal * (RefractionIndex * dot(Incident, Normal) + - // sqrt(1 - RefractionIndex * RefractionIndex * (1 - dot(Incident, Normal) * dot(Incident, Normal)))) - // Get the 2D Dot product of Incident-Normal - XMVECTOR IDotN = XMVector2Dot(Incident, Normal); - // vTemp = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) - XMVECTOR vTemp = XM_FNMADD_PS(IDotN, IDotN, g_XMOne); - vTemp = _mm_mul_ps(vTemp, RefractionIndex); - vTemp = XM_FNMADD_PS(vTemp, RefractionIndex, g_XMOne); - // If any terms are <=0, sqrt() will fail, punt to zero - XMVECTOR vMask = _mm_cmpgt_ps(vTemp, g_XMZero); - // R = RefractionIndex * IDotN + sqrt(R) - vTemp = _mm_sqrt_ps(vTemp); - vTemp = XM_FMADD_PS(RefractionIndex, IDotN, vTemp); - // Result = RefractionIndex * Incident - Normal * R - XMVECTOR vResult = _mm_mul_ps(RefractionIndex, Incident); - vResult = XM_FNMADD_PS(vTemp, Normal, vResult); - vResult = _mm_and_ps(vResult, vMask); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2Orthogonal(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORF32 Result = { { { - -V.vector4_f32[1], - V.vector4_f32[0], - 0.f, - 0.f - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Negate = { { { -1.f, 1.f, 0, 0 } } }; - const float32x2_t zero = vdup_n_f32(0); - - float32x2_t VL = vget_low_f32(V); - float32x2_t Result = vmul_f32(vrev64_f32(VL), vget_low_f32(Negate)); - return vcombine_f32(Result, zero); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 2, 0, 1)); - vResult = _mm_mul_ps(vResult, g_XMNegateX); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2AngleBetweenNormalsEst -( - FXMVECTOR N1, - FXMVECTOR N2 -) noexcept -{ - XMVECTOR Result = XMVector2Dot(N1, N2); - Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); - Result = XMVectorACosEst(Result); - return Result; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2AngleBetweenNormals -( - FXMVECTOR N1, - FXMVECTOR N2 -) noexcept -{ - XMVECTOR Result = XMVector2Dot(N1, N2); - Result = XMVectorClamp(Result, g_XMNegativeOne, g_XMOne); - Result = XMVectorACos(Result); - return Result; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2AngleBetweenVectors -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ - XMVECTOR L1 = XMVector2ReciprocalLength(V1); - XMVECTOR L2 = XMVector2ReciprocalLength(V2); - - XMVECTOR Dot = XMVector2Dot(V1, V2); - - L1 = XMVectorMultiply(L1, L2); - - XMVECTOR CosAngle = XMVectorMultiply(Dot, L1); - CosAngle = XMVectorClamp(CosAngle, g_XMNegativeOne.v, g_XMOne.v); - - return XMVectorACos(CosAngle); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2LinePointDistance -( - FXMVECTOR LinePoint1, - FXMVECTOR LinePoint2, - FXMVECTOR Point -) noexcept -{ - // Given a vector PointVector from LinePoint1 to Point and a vector - // LineVector from LinePoint1 to LinePoint2, the scaled distance - // PointProjectionScale from LinePoint1 to the perpendicular projection - // of PointVector onto the line is defined as: - // - // PointProjectionScale = dot(PointVector, LineVector) / LengthSq(LineVector) - - XMVECTOR PointVector = XMVectorSubtract(Point, LinePoint1); - XMVECTOR LineVector = XMVectorSubtract(LinePoint2, LinePoint1); - - XMVECTOR LengthSq = XMVector2LengthSq(LineVector); - - XMVECTOR PointProjectionScale = XMVector2Dot(PointVector, LineVector); - PointProjectionScale = XMVectorDivide(PointProjectionScale, LengthSq); - - XMVECTOR DistanceVector = XMVectorMultiply(LineVector, PointProjectionScale); - DistanceVector = XMVectorSubtract(PointVector, DistanceVector); - - return XMVector2Length(DistanceVector); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2IntersectLine -( - FXMVECTOR Line1Point1, - FXMVECTOR Line1Point2, - FXMVECTOR Line2Point1, - GXMVECTOR Line2Point2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) - - XMVECTOR V1 = XMVectorSubtract(Line1Point2, Line1Point1); - XMVECTOR V2 = XMVectorSubtract(Line2Point2, Line2Point1); - XMVECTOR V3 = XMVectorSubtract(Line1Point1, Line2Point1); - - XMVECTOR C1 = XMVector2Cross(V1, V2); - XMVECTOR C2 = XMVector2Cross(V2, V3); - - XMVECTOR Result; - const XMVECTOR Zero = XMVectorZero(); - if (XMVector2NearEqual(C1, Zero, g_XMEpsilon.v)) - { - if (XMVector2NearEqual(C2, Zero, g_XMEpsilon.v)) - { - // Coincident - Result = g_XMInfinity.v; - } - else - { - // Parallel - Result = g_XMQNaN.v; - } - } - else - { - // Intersection point = Line1Point1 + V1 * (C2 / C1) - XMVECTOR Scale = XMVectorReciprocal(C1); - Scale = XMVectorMultiply(C2, Scale); - Result = XMVectorMultiplyAdd(V1, Scale, Line1Point1); - } - - return Result; - -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR V1 = _mm_sub_ps(Line1Point2, Line1Point1); - XMVECTOR V2 = _mm_sub_ps(Line2Point2, Line2Point1); - XMVECTOR V3 = _mm_sub_ps(Line1Point1, Line2Point1); - // Generate the cross products - XMVECTOR C1 = XMVector2Cross(V1, V2); - XMVECTOR C2 = XMVector2Cross(V2, V3); - // If C1 is not close to epsilon, use the calculated value - XMVECTOR vResultMask = _mm_setzero_ps(); - vResultMask = _mm_sub_ps(vResultMask, C1); - vResultMask = _mm_max_ps(vResultMask, C1); - // 0xFFFFFFFF if the calculated value is to be used - vResultMask = _mm_cmpgt_ps(vResultMask, g_XMEpsilon); - // If C1 is close to epsilon, which fail type is it? INFINITY or NAN? - XMVECTOR vFailMask = _mm_setzero_ps(); - vFailMask = _mm_sub_ps(vFailMask, C2); - vFailMask = _mm_max_ps(vFailMask, C2); - vFailMask = _mm_cmple_ps(vFailMask, g_XMEpsilon); - XMVECTOR vFail = _mm_and_ps(vFailMask, g_XMInfinity); - vFailMask = _mm_andnot_ps(vFailMask, g_XMQNaN); - // vFail is NAN or INF - vFail = _mm_or_ps(vFail, vFailMask); - // Intersection point = Line1Point1 + V1 * (C2 / C1) - XMVECTOR vResult = _mm_div_ps(C2, C1); - vResult = XM_FMADD_PS(vResult, V1, Line1Point1); - // Use result, or failure value - vResult = _mm_and_ps(vResult, vResultMask); - vResultMask = _mm_andnot_ps(vResultMask, vFail); - vResult = _mm_or_ps(vResult, vResultMask); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2Transform -( - FXMVECTOR V, - FXMMATRIX M -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Y = XMVectorSplatY(V); - XMVECTOR X = XMVectorSplatX(V); - - XMVECTOR Result = XMVectorMultiplyAdd(Y, M.r[1], M.r[3]); - Result = XMVectorMultiplyAdd(X, M.r[0], Result); - - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); - float32x4_t Result = vmlaq_lane_f32(M.r[3], M.r[1], VL, 1); // Y - return vmlaq_lane_f32(Result, M.r[0], VL, 0); // X -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = XM_FMADD_PS(vResult, M.r[1], M.r[3]); - XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -_Use_decl_annotations_ -inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream -( - XMFLOAT4* pOutputStream, - size_t OutputStride, - const XMFLOAT2* pInputStream, - size_t InputStride, - size_t VectorCount, - FXMMATRIX M -) noexcept -{ - assert(pOutputStream != nullptr); - assert(pInputStream != nullptr); - - assert(InputStride >= sizeof(XMFLOAT2)); - _Analysis_assume_(InputStride >= sizeof(XMFLOAT2)); - - assert(OutputStride >= sizeof(XMFLOAT4)); - _Analysis_assume_(OutputStride >= sizeof(XMFLOAT4)); - -#if defined(_XM_NO_INTRINSICS_) - - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row3 = M.r[3]; - - for (size_t i = 0; i < VectorCount; i++) - { - XMVECTOR V = XMLoadFloat2(reinterpret_cast(pInputVector)); - XMVECTOR Y = XMVectorSplatY(V); - XMVECTOR X = XMVectorSplatX(V); - - XMVECTOR Result = XMVectorMultiplyAdd(Y, row1, row3); - Result = XMVectorMultiplyAdd(X, row0, Result); - - #ifdef _PREFAST_ - #pragma prefast(push) - #pragma prefast(disable : 26015, "PREfast noise: Esp:1307" ) - #endif - - XMStoreFloat4(reinterpret_cast(pOutputVector), Result); - - #ifdef _PREFAST_ - #pragma prefast(pop) - #endif - - pInputVector += InputStride; - pOutputVector += OutputStride; - } - - return pOutputStream; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row3 = M.r[3]; - - size_t i = 0; - size_t four = VectorCount >> 2; - if (four > 0) - { - if ((InputStride == sizeof(XMFLOAT2)) && (OutputStride == sizeof(XMFLOAT4))) - { - for (size_t j = 0; j < four; ++j) - { - float32x4x2_t V = vld2q_f32(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 4; - - float32x2_t r3 = vget_low_f32(row3); - float32x2_t r = vget_low_f32(row0); - XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M - XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N - - XM_PREFETCH(pInputVector); - - r3 = vget_high_f32(row3); - r = vget_high_f32(row0); - XMVECTOR vResult2 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Cx+O - XMVECTOR vResult3 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Dx+P - - XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); - - r = vget_low_f32(row1); - vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey+M - vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy+N - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); - - r = vget_high_f32(row1); - vResult2 = vmlaq_lane_f32(vResult2, V.val[1], r, 0); // Cx+Gy+O - vResult3 = vmlaq_lane_f32(vResult3, V.val[1], r, 1); // Dx+Hy+P - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); - - float32x4x4_t R; - R.val[0] = vResult0; - R.val[1] = vResult1; - R.val[2] = vResult2; - R.val[3] = vResult3; - - vst4q_f32(reinterpret_cast(pOutputVector), R); - pOutputVector += sizeof(XMFLOAT4) * 4; - - i += 4; - } - } - } - - for (; i < VectorCount; i++) - { - float32x2_t V = vld1_f32(reinterpret_cast(pInputVector)); - pInputVector += InputStride; - - XMVECTOR vResult = vmlaq_lane_f32(row3, row0, V, 0); // X - vResult = vmlaq_lane_f32(vResult, row1, V, 1); // Y - - vst1q_f32(reinterpret_cast(pOutputVector), vResult); - pOutputVector += OutputStride; - } - - return pOutputStream; -#elif defined(_XM_AVX2_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - size_t i = 0; - size_t four = VectorCount >> 2; - if (four > 0) - { - __m256 row0 = _mm256_broadcast_ps(&M.r[0]); - __m256 row1 = _mm256_broadcast_ps(&M.r[1]); - __m256 row3 = _mm256_broadcast_ps(&M.r[3]); - - if (InputStride == sizeof(XMFLOAT2)) - { - if (OutputStride == sizeof(XMFLOAT4)) - { - if (!(reinterpret_cast(pOutputStream) & 0x1F)) - { - // Packed input, aligned & packed output - for (size_t j = 0; j < four; ++j) - { - __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 4; - - __m256 Y2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); - __m256 X2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); - __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); - __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); - - __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); - __m256 vTempB2 = _mm256_fmadd_ps(Y2, row1, row3); - __m256 vTempA = _mm256_mul_ps(X1, row0); - __m256 vTempA2 = _mm256_mul_ps(X2, row0); - vTempA = _mm256_add_ps(vTempA, vTempB); - vTempA2 = _mm256_add_ps(vTempA2, vTempB2); - - X1 = _mm256_insertf128_ps(vTempA, _mm256_castps256_ps128(vTempA2), 1); - XM256_STREAM_PS(reinterpret_cast(pOutputVector), X1); - pOutputVector += sizeof(XMFLOAT4) * 2; - - X2 = _mm256_insertf128_ps(vTempA2, _mm256_extractf128_ps(vTempA, 1), 0); - XM256_STREAM_PS(reinterpret_cast(pOutputVector), X2); - pOutputVector += sizeof(XMFLOAT4) * 2; - - i += 4; - } - } - else - { - // Packed input, packed output - for (size_t j = 0; j < four; ++j) - { - __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 4; - - __m256 Y2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); - __m256 X2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); - __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); - __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); - - __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); - __m256 vTempB2 = _mm256_fmadd_ps(Y2, row1, row3); - __m256 vTempA = _mm256_mul_ps(X1, row0); - __m256 vTempA2 = _mm256_mul_ps(X2, row0); - vTempA = _mm256_add_ps(vTempA, vTempB); - vTempA2 = _mm256_add_ps(vTempA2, vTempB2); - - X1 = _mm256_insertf128_ps(vTempA, _mm256_castps256_ps128(vTempA2), 1); - _mm256_storeu_ps(reinterpret_cast(pOutputVector), X1); - pOutputVector += sizeof(XMFLOAT4) * 2; - - X2 = _mm256_insertf128_ps(vTempA2, _mm256_extractf128_ps(vTempA, 1), 0); - _mm256_storeu_ps(reinterpret_cast(pOutputVector), X2); - pOutputVector += sizeof(XMFLOAT4) * 2; - - i += 4; - } - } - } - else - { - // Packed input, unpacked output - for (size_t j = 0; j < four; ++j) - { - __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 4; - - __m256 Y2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); - __m256 X2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); - __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); - __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); - - __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); - __m256 vTempB2 = _mm256_fmadd_ps(Y2, row1, row3); - __m256 vTempA = _mm256_mul_ps(X1, row0); - __m256 vTempA2 = _mm256_mul_ps(X2, row0); - vTempA = _mm256_add_ps(vTempA, vTempB); - vTempA2 = _mm256_add_ps(vTempA2, vTempB2); - - _mm_storeu_ps(reinterpret_cast(pOutputVector), _mm256_castps256_ps128(vTempA)); - pOutputVector += OutputStride; - - _mm_storeu_ps(reinterpret_cast(pOutputVector), _mm256_castps256_ps128(vTempA2)); - pOutputVector += OutputStride; - - _mm_storeu_ps(reinterpret_cast(pOutputVector), _mm256_extractf128_ps(vTempA, 1)); - pOutputVector += OutputStride; - - _mm_storeu_ps(reinterpret_cast(pOutputVector), _mm256_extractf128_ps(vTempA2, 1)); - pOutputVector += OutputStride; - - i += 4; - } - } - } - } - - if (i < VectorCount) - { - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row3 = M.r[3]; - - for (; i < VectorCount; i++) - { - __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pInputVector))); - pInputVector += InputStride; - - XMVECTOR Y = XM_PERMUTE_PS(xy, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(xy, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); - XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - - _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - } - } - - XM_SFENCE(); - - return pOutputStream; -#elif defined(_XM_SSE_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row3 = M.r[3]; - - size_t i = 0; - size_t two = VectorCount >> 1; - if (two > 0) - { - if (InputStride == sizeof(XMFLOAT2)) - { - if (!(reinterpret_cast(pOutputStream) & 0xF) && !(OutputStride & 0xF)) - { - // Packed input, aligned output - for (size_t j = 0; j < two; ++j) - { - XMVECTOR V = _mm_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 2; - - XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); - XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - - XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); - X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - - vTemp = XM_FMADD_PS(Y, row1, row3); - vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - - XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - i += 2; - } - } - else - { - // Packed input, unaligned output - for (size_t j = 0; j < two; ++j) - { - XMVECTOR V = _mm_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 2; - - XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); - XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - - _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); - X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - - vTemp = XM_FMADD_PS(Y, row1, row3); - vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - - _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - i += 2; - } - } - } - } - - if (!(reinterpret_cast(pInputVector) & 0xF) && !(InputStride & 0xF)) - { - if (!(reinterpret_cast(pOutputStream) & 0xF) && !(OutputStride & 0xF)) - { - // Aligned input, aligned output - for (; i < VectorCount; i++) - { - XMVECTOR V = _mm_castsi128_ps(_mm_loadl_epi64(reinterpret_cast(pInputVector))); - pInputVector += InputStride; - - XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); - XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - - XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - } - } - else - { - // Aligned input, unaligned output - for (; i < VectorCount; i++) - { - XMVECTOR V = _mm_castsi128_ps(_mm_loadl_epi64(reinterpret_cast(pInputVector))); - pInputVector += InputStride; - - XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); - XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - - _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - } - } - } - else - { - // Unaligned input - for (; i < VectorCount; i++) - { - __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pInputVector))); - pInputVector += InputStride; - - XMVECTOR Y = XM_PERMUTE_PS(xy, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(xy, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); - XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - - _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - } - } - - XM_SFENCE(); - - return pOutputStream; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2TransformCoord -( - FXMVECTOR V, - FXMMATRIX M -) noexcept -{ - XMVECTOR Y = XMVectorSplatY(V); - XMVECTOR X = XMVectorSplatX(V); - - XMVECTOR Result = XMVectorMultiplyAdd(Y, M.r[1], M.r[3]); - Result = XMVectorMultiplyAdd(X, M.r[0], Result); - - XMVECTOR W = XMVectorSplatW(Result); - return XMVectorDivide(Result, W); -} - -//------------------------------------------------------------------------------ - -_Use_decl_annotations_ -inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream -( - XMFLOAT2* pOutputStream, - size_t OutputStride, - const XMFLOAT2* pInputStream, - size_t InputStride, - size_t VectorCount, - FXMMATRIX M -) noexcept -{ - assert(pOutputStream != nullptr); - assert(pInputStream != nullptr); - - assert(InputStride >= sizeof(XMFLOAT2)); - _Analysis_assume_(InputStride >= sizeof(XMFLOAT2)); - - assert(OutputStride >= sizeof(XMFLOAT2)); - _Analysis_assume_(OutputStride >= sizeof(XMFLOAT2)); - -#if defined(_XM_NO_INTRINSICS_) - - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row3 = M.r[3]; - - for (size_t i = 0; i < VectorCount; i++) - { - XMVECTOR V = XMLoadFloat2(reinterpret_cast(pInputVector)); - XMVECTOR Y = XMVectorSplatY(V); - XMVECTOR X = XMVectorSplatX(V); - - XMVECTOR Result = XMVectorMultiplyAdd(Y, row1, row3); - Result = XMVectorMultiplyAdd(X, row0, Result); - - XMVECTOR W = XMVectorSplatW(Result); - - Result = XMVectorDivide(Result, W); - - #ifdef _PREFAST_ - #pragma prefast(push) - #pragma prefast(disable : 26015, "PREfast noise: Esp:1307" ) - #endif - - XMStoreFloat2(reinterpret_cast(pOutputVector), Result); - - #ifdef _PREFAST_ - #pragma prefast(pop) - #endif - - pInputVector += InputStride; - pOutputVector += OutputStride; - } - - return pOutputStream; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row3 = M.r[3]; - - size_t i = 0; - size_t four = VectorCount >> 2; - if (four > 0) - { - if ((InputStride == sizeof(XMFLOAT2)) && (OutputStride == sizeof(XMFLOAT2))) - { - for (size_t j = 0; j < four; ++j) - { - float32x4x2_t V = vld2q_f32(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 4; - - float32x2_t r3 = vget_low_f32(row3); - float32x2_t r = vget_low_f32(row0); - XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M - XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N - - XM_PREFETCH(pInputVector); - - r3 = vget_high_f32(row3); - r = vget_high_f32(row0); - XMVECTOR W = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Dx+P - - XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); - - r = vget_low_f32(row1); - vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey+M - vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy+N - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); - - r = vget_high_f32(row1); - W = vmlaq_lane_f32(W, V.val[1], r, 1); // Dx+Hy+P - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); - - #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ - V.val[0] = vdivq_f32(vResult0, W); - V.val[1] = vdivq_f32(vResult1, W); - #else - // 2 iterations of Newton-Raphson refinement of reciprocal - float32x4_t Reciprocal = vrecpeq_f32(W); - float32x4_t S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - - V.val[0] = vmulq_f32(vResult0, Reciprocal); - V.val[1] = vmulq_f32(vResult1, Reciprocal); - #endif - - vst2q_f32(reinterpret_cast(pOutputVector), V); - pOutputVector += sizeof(XMFLOAT2) * 4; - - i += 4; - } - } - } - - for (; i < VectorCount; i++) - { - float32x2_t V = vld1_f32(reinterpret_cast(pInputVector)); - pInputVector += InputStride; - - XMVECTOR vResult = vmlaq_lane_f32(row3, row0, V, 0); // X - vResult = vmlaq_lane_f32(vResult, row1, V, 1); // Y - - V = vget_high_f32(vResult); - float32x2_t W = vdup_lane_f32(V, 1); - - #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ - V = vget_low_f32(vResult); - V = vdiv_f32(V, W); - #else - // 2 iterations of Newton-Raphson refinement of reciprocal for W - float32x2_t Reciprocal = vrecpe_f32(W); - float32x2_t S = vrecps_f32(Reciprocal, W); - Reciprocal = vmul_f32(S, Reciprocal); - S = vrecps_f32(Reciprocal, W); - Reciprocal = vmul_f32(S, Reciprocal); - - V = vget_low_f32(vResult); - V = vmul_f32(V, Reciprocal); - #endif - - vst1_f32(reinterpret_cast(pOutputVector), V); - pOutputVector += OutputStride; - } - - return pOutputStream; -#elif defined(_XM_AVX2_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - size_t i = 0; - size_t four = VectorCount >> 2; - if (four > 0) - { - __m256 row0 = _mm256_broadcast_ps(&M.r[0]); - __m256 row1 = _mm256_broadcast_ps(&M.r[1]); - __m256 row3 = _mm256_broadcast_ps(&M.r[3]); - - if (InputStride == sizeof(XMFLOAT2)) - { - if (OutputStride == sizeof(XMFLOAT2)) - { - if (!(reinterpret_cast(pOutputStream) & 0x1F)) - { - // Packed input, aligned & packed output - for (size_t j = 0; j < four; ++j) - { - __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 4; - - __m256 Y2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); - __m256 X2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); - __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); - __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); - - __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); - __m256 vTempB2 = _mm256_fmadd_ps(Y2, row1, row3); - __m256 vTempA = _mm256_mul_ps(X1, row0); - __m256 vTempA2 = _mm256_mul_ps(X2, row0); - vTempA = _mm256_add_ps(vTempA, vTempB); - vTempA2 = _mm256_add_ps(vTempA2, vTempB2); - - __m256 W = _mm256_shuffle_ps(vTempA, vTempA, _MM_SHUFFLE(3, 3, 3, 3)); - vTempA = _mm256_div_ps(vTempA, W); - - W = _mm256_shuffle_ps(vTempA2, vTempA2, _MM_SHUFFLE(3, 3, 3, 3)); - vTempA2 = _mm256_div_ps(vTempA2, W); - - X1 = _mm256_shuffle_ps(vTempA, vTempA2, 0x44); - XM256_STREAM_PS(reinterpret_cast(pOutputVector), X1); - pOutputVector += sizeof(XMFLOAT2) * 4; - - i += 4; - } - } - else - { - // Packed input, packed output - for (size_t j = 0; j < four; ++j) - { - __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 4; - - __m256 Y2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); - __m256 X2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); - __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); - __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); - - __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); - __m256 vTempB2 = _mm256_fmadd_ps(Y2, row1, row3); - __m256 vTempA = _mm256_mul_ps(X1, row0); - __m256 vTempA2 = _mm256_mul_ps(X2, row0); - vTempA = _mm256_add_ps(vTempA, vTempB); - vTempA2 = _mm256_add_ps(vTempA2, vTempB2); - - __m256 W = _mm256_shuffle_ps(vTempA, vTempA, _MM_SHUFFLE(3, 3, 3, 3)); - vTempA = _mm256_div_ps(vTempA, W); - - W = _mm256_shuffle_ps(vTempA2, vTempA2, _MM_SHUFFLE(3, 3, 3, 3)); - vTempA2 = _mm256_div_ps(vTempA2, W); - - X1 = _mm256_shuffle_ps(vTempA, vTempA2, 0x44); - _mm256_storeu_ps(reinterpret_cast(pOutputVector), X1); - pOutputVector += sizeof(XMFLOAT2) * 4; - - i += 4; - } - } - } - else - { - // Packed input, unpacked output - for (size_t j = 0; j < four; ++j) - { - __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 4; - - __m256 Y2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); - __m256 X2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); - __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); - __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); - - __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); - __m256 vTempB2 = _mm256_fmadd_ps(Y2, row1, row3); - __m256 vTempA = _mm256_mul_ps(X1, row0); - __m256 vTempA2 = _mm256_mul_ps(X2, row0); - vTempA = _mm256_add_ps(vTempA, vTempB); - vTempA2 = _mm256_add_ps(vTempA2, vTempB2); - - __m256 W = _mm256_shuffle_ps(vTempA, vTempA, _MM_SHUFFLE(3, 3, 3, 3)); - vTempA = _mm256_div_ps(vTempA, W); - - W = _mm256_shuffle_ps(vTempA2, vTempA2, _MM_SHUFFLE(3, 3, 3, 3)); - vTempA2 = _mm256_div_ps(vTempA2, W); - - _mm_store_sd(reinterpret_cast(pOutputVector), - _mm_castps_pd(_mm256_castps256_ps128(vTempA))); - pOutputVector += OutputStride; - - _mm_store_sd(reinterpret_cast(pOutputVector), - _mm_castps_pd(_mm256_castps256_ps128(vTempA2))); - pOutputVector += OutputStride; - - _mm_store_sd(reinterpret_cast(pOutputVector), - _mm_castps_pd(_mm256_extractf128_ps(vTempA, 1))); - pOutputVector += OutputStride; - - _mm_store_sd(reinterpret_cast(pOutputVector), - _mm_castps_pd(_mm256_extractf128_ps(vTempA2, 1))); - pOutputVector += OutputStride; - - i += 4; - } - } - } - } - - if (i < VectorCount) - { - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row3 = M.r[3]; - - for (; i < VectorCount; i++) - { - __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pInputVector))); - pInputVector += InputStride; - - XMVECTOR Y = XM_PERMUTE_PS(xy, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(xy, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); - XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - - XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - - _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); - pOutputVector += OutputStride; - } - } - - XM_SFENCE(); - - return pOutputStream; -#elif defined(_XM_SSE_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row3 = M.r[3]; - - size_t i = 0; - size_t two = VectorCount >> 1; - if (two > 0) - { - if (InputStride == sizeof(XMFLOAT2)) - { - if (OutputStride == sizeof(XMFLOAT2)) - { - if (!(reinterpret_cast(pOutputStream) & 0xF)) - { - // Packed input, aligned & packed output - for (size_t j = 0; j < two; ++j) - { - XMVECTOR V = _mm_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 2; - - // Result 1 - XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); - XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - - XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - XMVECTOR V1 = _mm_div_ps(vTemp, W); - - // Result 2 - Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); - X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - - vTemp = XM_FMADD_PS(Y, row1, row3); - vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - XMVECTOR V2 = _mm_div_ps(vTemp, W); - - vTemp = _mm_movelh_ps(V1, V2); - - XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += sizeof(XMFLOAT2) * 2; - - i += 2; - } - } - else - { - // Packed input, unaligned & packed output - for (size_t j = 0; j < two; ++j) - { - XMVECTOR V = _mm_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 2; - - // Result 1 - XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); - XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - - XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - XMVECTOR V1 = _mm_div_ps(vTemp, W); - - // Result 2 - Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); - X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - - vTemp = XM_FMADD_PS(Y, row1, row3); - vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - XMVECTOR V2 = _mm_div_ps(vTemp, W); - - vTemp = _mm_movelh_ps(V1, V2); - - _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += sizeof(XMFLOAT2) * 2; - - i += 2; - } - } - } - else - { - // Packed input, unpacked output - for (size_t j = 0; j < two; ++j) - { - XMVECTOR V = _mm_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 2; - - // Result 1 - XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); - XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - - XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - vTemp = _mm_div_ps(vTemp, W); - - _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); - pOutputVector += OutputStride; - - // Result 2 - Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); - X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - - vTemp = XM_FMADD_PS(Y, row1, row3); - vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - vTemp = _mm_div_ps(vTemp, W); - - _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); - pOutputVector += OutputStride; - - i += 2; - } - } - } - } - - if (!(reinterpret_cast(pInputVector) & 0xF) && !(InputStride & 0xF)) - { - // Aligned input - for (; i < VectorCount; i++) - { - XMVECTOR V = _mm_castsi128_ps(_mm_loadl_epi64(reinterpret_cast(pInputVector))); - pInputVector += InputStride; - - XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); - XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - - XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - vTemp = _mm_div_ps(vTemp, W); - - _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); - pOutputVector += OutputStride; - } - } - else - { - // Unaligned input - for (; i < VectorCount; i++) - { - __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pInputVector))); - pInputVector += InputStride; - - XMVECTOR Y = XM_PERMUTE_PS(xy, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(xy, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); - XMVECTOR vTemp2 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - - XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - vTemp = _mm_div_ps(vTemp, W); - - _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); - pOutputVector += OutputStride; - } - } - - XM_SFENCE(); - - return pOutputStream; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector2TransformNormal -( - FXMVECTOR V, - FXMMATRIX M -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Y = XMVectorSplatY(V); - XMVECTOR X = XMVectorSplatX(V); - - XMVECTOR Result = XMVectorMultiply(Y, M.r[1]); - Result = XMVectorMultiplyAdd(X, M.r[0], Result); - - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); - float32x4_t Result = vmulq_lane_f32(M.r[1], VL, 1); // Y - return vmlaq_lane_f32(Result, M.r[0], VL, 0); // X -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = _mm_mul_ps(vResult, M.r[1]); - XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -_Use_decl_annotations_ -inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream -( - XMFLOAT2* pOutputStream, - size_t OutputStride, - const XMFLOAT2* pInputStream, - size_t InputStride, - size_t VectorCount, - FXMMATRIX M -) noexcept -{ - assert(pOutputStream != nullptr); - assert(pInputStream != nullptr); - - assert(InputStride >= sizeof(XMFLOAT2)); - _Analysis_assume_(InputStride >= sizeof(XMFLOAT2)); - - assert(OutputStride >= sizeof(XMFLOAT2)); - _Analysis_assume_(OutputStride >= sizeof(XMFLOAT2)); - -#if defined(_XM_NO_INTRINSICS_) - - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - - for (size_t i = 0; i < VectorCount; i++) - { - XMVECTOR V = XMLoadFloat2(reinterpret_cast(pInputVector)); - XMVECTOR Y = XMVectorSplatY(V); - XMVECTOR X = XMVectorSplatX(V); - - XMVECTOR Result = XMVectorMultiply(Y, row1); - Result = XMVectorMultiplyAdd(X, row0, Result); - - #ifdef _PREFAST_ - #pragma prefast(push) - #pragma prefast(disable : 26015, "PREfast noise: Esp:1307" ) - #endif - - XMStoreFloat2(reinterpret_cast(pOutputVector), Result); - - #ifdef _PREFAST_ - #pragma prefast(pop) - #endif - - pInputVector += InputStride; - pOutputVector += OutputStride; - } - - return pOutputStream; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - - size_t i = 0; - size_t four = VectorCount >> 2; - if (four > 0) - { - if ((InputStride == sizeof(XMFLOAT2)) && (OutputStride == sizeof(XMFLOAT2))) - { - for (size_t j = 0; j < four; ++j) - { - float32x4x2_t V = vld2q_f32(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 4; - - float32x2_t r = vget_low_f32(row0); - XMVECTOR vResult0 = vmulq_lane_f32(V.val[0], r, 0); // Ax - XMVECTOR vResult1 = vmulq_lane_f32(V.val[0], r, 1); // Bx - - XM_PREFETCH(pInputVector); - XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); - - r = vget_low_f32(row1); - vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey - vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); - - V.val[0] = vResult0; - V.val[1] = vResult1; - - vst2q_f32(reinterpret_cast(pOutputVector), V); - pOutputVector += sizeof(XMFLOAT2) * 4; - - i += 4; - } - } - } - - for (; i < VectorCount; i++) - { - float32x2_t V = vld1_f32(reinterpret_cast(pInputVector)); - pInputVector += InputStride; - - XMVECTOR vResult = vmulq_lane_f32(row0, V, 0); // X - vResult = vmlaq_lane_f32(vResult, row1, V, 1); // Y - - V = vget_low_f32(vResult); - vst1_f32(reinterpret_cast(pOutputVector), V); - pOutputVector += OutputStride; - } - - return pOutputStream; -#elif defined(_XM_AVX2_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - size_t i = 0; - size_t four = VectorCount >> 2; - if (four > 0) - { - __m256 row0 = _mm256_broadcast_ps(&M.r[0]); - __m256 row1 = _mm256_broadcast_ps(&M.r[1]); - - if (InputStride == sizeof(XMFLOAT2)) - { - if (OutputStride == sizeof(XMFLOAT2)) - { - if (!(reinterpret_cast(pOutputStream) & 0x1F)) - { - // Packed input, aligned & packed output - for (size_t j = 0; j < four; ++j) - { - __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 4; - - __m256 Y2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); - __m256 X2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); - __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); - __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); - - __m256 vTempA = _mm256_mul_ps(Y1, row1); - __m256 vTempB = _mm256_mul_ps(Y2, row1); - vTempA = _mm256_fmadd_ps(X1, row0, vTempA); - vTempB = _mm256_fmadd_ps(X2, row0, vTempB); - - X1 = _mm256_shuffle_ps(vTempA, vTempB, 0x44); - XM256_STREAM_PS(reinterpret_cast(pOutputVector), X1); - pOutputVector += sizeof(XMFLOAT2) * 4; - - i += 4; - } - } - else - { - // Packed input, packed output - for (size_t j = 0; j < four; ++j) - { - __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 4; - - __m256 Y2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); - __m256 X2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); - __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); - __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); - - __m256 vTempA = _mm256_mul_ps(Y1, row1); - __m256 vTempB = _mm256_mul_ps(Y2, row1); - vTempA = _mm256_fmadd_ps(X1, row0, vTempA); - vTempB = _mm256_fmadd_ps(X2, row0, vTempB); - - X1 = _mm256_shuffle_ps(vTempA, vTempB, 0x44); - _mm256_storeu_ps(reinterpret_cast(pOutputVector), X1); - pOutputVector += sizeof(XMFLOAT2) * 4; - - i += 4; - } - } - } - else - { - // Packed input, unpacked output - for (size_t j = 0; j < four; ++j) - { - __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 4; - - __m256 Y2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); - __m256 X2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); - __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); - __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); - - __m256 vTempA = _mm256_mul_ps(Y1, row1); - __m256 vTempB = _mm256_mul_ps(Y2, row1); - vTempA = _mm256_fmadd_ps(X1, row0, vTempA); - vTempB = _mm256_fmadd_ps(X2, row0, vTempB); - - _mm_store_sd(reinterpret_cast(pOutputVector), - _mm_castps_pd(_mm256_castps256_ps128(vTempA))); - pOutputVector += OutputStride; - - _mm_store_sd(reinterpret_cast(pOutputVector), - _mm_castps_pd(_mm256_castps256_ps128(vTempB))); - pOutputVector += OutputStride; - - _mm_store_sd(reinterpret_cast(pOutputVector), - _mm_castps_pd(_mm256_extractf128_ps(vTempA, 1))); - pOutputVector += OutputStride; - - _mm_store_sd(reinterpret_cast(pOutputVector), - _mm_castps_pd(_mm256_extractf128_ps(vTempB, 1))); - pOutputVector += OutputStride; - - i += 4; - } - } - } - } - - if (i < VectorCount) - { - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - - for (; i < VectorCount; i++) - { - __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pInputVector))); - pInputVector += InputStride; - - XMVECTOR Y = XM_PERMUTE_PS(xy, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(xy, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = _mm_mul_ps(Y, row1); - vTemp = XM_FMADD_PS(X, row0, vTemp); - - _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); - pOutputVector += OutputStride; - } - } - - XM_SFENCE(); - - return pOutputStream; -#elif defined(_XM_SSE_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - - size_t i = 0; - size_t two = VectorCount >> 1; - if (two > 0) - { - if (InputStride == sizeof(XMFLOAT2)) - { - if (OutputStride == sizeof(XMFLOAT2)) - { - if (!(reinterpret_cast(pOutputStream) & 0xF)) - { - // Packed input, aligned & packed output - for (size_t j = 0; j < two; ++j) - { - XMVECTOR V = _mm_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 2; - - // Result 1 - XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = _mm_mul_ps(Y, row1); - XMVECTOR V1 = XM_FMADD_PS(X, row0, vTemp); - - // Result 2 - Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); - X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - - vTemp = _mm_mul_ps(Y, row1); - XMVECTOR V2 = XM_FMADD_PS(X, row0, vTemp); - - vTemp = _mm_movelh_ps(V1, V2); - - XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += sizeof(XMFLOAT2) * 2; - - i += 2; - } - } - else - { - // Packed input, unaligned & packed output - for (size_t j = 0; j < two; ++j) - { - XMVECTOR V = _mm_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 2; - - // Result 1 - XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = _mm_mul_ps(Y, row1); - XMVECTOR V1 = XM_FMADD_PS(X, row0, vTemp); - - // Result 2 - Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); - X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - - vTemp = _mm_mul_ps(Y, row1); - XMVECTOR V2 = XM_FMADD_PS(X, row0, vTemp); - - vTemp = _mm_movelh_ps(V1, V2); - - _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += sizeof(XMFLOAT2) * 2; - - i += 2; - } - } - } - else - { - // Packed input, unpacked output - for (size_t j = 0; j < two; ++j) - { - XMVECTOR V = _mm_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT2) * 2; - - // Result 1 - XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = _mm_mul_ps(Y, row1); - vTemp = XM_FMADD_PS(X, row0, vTemp); - - _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); - pOutputVector += OutputStride; - - // Result 2 - Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); - X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - - vTemp = _mm_mul_ps(Y, row1); - vTemp = XM_FMADD_PS(X, row0, vTemp); - - _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); - pOutputVector += OutputStride; - - i += 2; - } - } - } - } - - if (!(reinterpret_cast(pInputVector) & 0xF) && !(InputStride & 0xF)) - { - // Aligned input - for (; i < VectorCount; i++) - { - XMVECTOR V = _mm_castsi128_ps(_mm_loadl_epi64(reinterpret_cast(pInputVector))); - pInputVector += InputStride; - - XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = _mm_mul_ps(Y, row1); - vTemp = XM_FMADD_PS(X, row0, vTemp); - - _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); - pOutputVector += OutputStride; - } - } - else - { - // Unaligned input - for (; i < VectorCount; i++) - { - __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pInputVector))); - pInputVector += InputStride; - - XMVECTOR Y = XM_PERMUTE_PS(xy, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(xy, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = _mm_mul_ps(Y, row1); - vTemp = XM_FMADD_PS(X, row0, vTemp); - - _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); - pOutputVector += OutputStride; - } - } - - XM_SFENCE(); - - return pOutputStream; -#endif -} - -/**************************************************************************** - * - * 3D Vector - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ -// Comparison operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector3Equal -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] == V2.vector4_f32[0]) && (V1.vector4_f32[1] == V2.vector4_f32[1]) && (V1.vector4_f32[2] == V2.vector4_f32[2])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); - return (((_mm_movemask_ps(vTemp) & 7) == 7) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -inline uint32_t XM_CALLCONV XMVector3EqualR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - uint32_t CR = 0; - if ((V1.vector4_f32[0] == V2.vector4_f32[0]) && - (V1.vector4_f32[1] == V2.vector4_f32[1]) && - (V1.vector4_f32[2] == V2.vector4_f32[2])) - { - CR = XM_CRMASK_CR6TRUE; - } - else if ((V1.vector4_f32[0] != V2.vector4_f32[0]) && - (V1.vector4_f32[1] != V2.vector4_f32[1]) && - (V1.vector4_f32[2] != V2.vector4_f32[2])) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU; - - uint32_t CR = 0; - if (r == 0xFFFFFFU) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!r) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); - int iTest = _mm_movemask_ps(vTemp) & 7; - uint32_t CR = 0; - if (iTest == 7) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!iTest) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector3EqualInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_u32[0] == V2.vector4_u32[0]) && (V1.vector4_u32[1] == V2.vector4_u32[1]) && (V1.vector4_u32[2] == V2.vector4_u32[2])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); - return (((_mm_movemask_ps(_mm_castsi128_ps(vTemp)) & 7) == 7) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -inline uint32_t XM_CALLCONV XMVector3EqualIntR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - uint32_t CR = 0; - if ((V1.vector4_u32[0] == V2.vector4_u32[0]) && - (V1.vector4_u32[1] == V2.vector4_u32[1]) && - (V1.vector4_u32[2] == V2.vector4_u32[2])) - { - CR = XM_CRMASK_CR6TRUE; - } - else if ((V1.vector4_u32[0] != V2.vector4_u32[0]) && - (V1.vector4_u32[1] != V2.vector4_u32[1]) && - (V1.vector4_u32[2] != V2.vector4_u32[2])) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU; - - uint32_t CR = 0; - if (r == 0xFFFFFFU) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!r) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#elif defined(_XM_SSE_INTRINSICS_) - __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); - int iTemp = _mm_movemask_ps(_mm_castsi128_ps(vTemp)) & 7; - uint32_t CR = 0; - if (iTemp == 7) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!iTemp) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector3NearEqual -( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR Epsilon -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - float dx, dy, dz; - - dx = fabsf(V1.vector4_f32[0] - V2.vector4_f32[0]); - dy = fabsf(V1.vector4_f32[1] - V2.vector4_f32[1]); - dz = fabsf(V1.vector4_f32[2] - V2.vector4_f32[2]); - return (((dx <= Epsilon.vector4_f32[0]) && - (dy <= Epsilon.vector4_f32[1]) && - (dz <= Epsilon.vector4_f32[2])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t vDelta = vsubq_f32(V1, V2); -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - uint32x4_t vResult = vacleq_f32(vDelta, Epsilon); -#else - uint32x4_t vResult = vcleq_f32(vabsq_f32(vDelta), Epsilon); -#endif - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - // Get the difference - XMVECTOR vDelta = _mm_sub_ps(V1, V2); - // Get the absolute value of the difference - XMVECTOR vTemp = _mm_setzero_ps(); - vTemp = _mm_sub_ps(vTemp, vDelta); - vTemp = _mm_max_ps(vTemp, vDelta); - vTemp = _mm_cmple_ps(vTemp, Epsilon); - // w is don't care - return (((_mm_movemask_ps(vTemp) & 7) == 0x7) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector3NotEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] != V2.vector4_f32[0]) || (V1.vector4_f32[1] != V2.vector4_f32[1]) || (V1.vector4_f32[2] != V2.vector4_f32[2])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) != 0xFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); - return (((_mm_movemask_ps(vTemp) & 7) != 7) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector3NotEqualInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_u32[0] != V2.vector4_u32[0]) || (V1.vector4_u32[1] != V2.vector4_u32[1]) || (V1.vector4_u32[2] != V2.vector4_u32[2])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) != 0xFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); - return (((_mm_movemask_ps(_mm_castsi128_ps(vTemp)) & 7) != 7) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector3Greater -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] > V2.vector4_f32[0]) && (V1.vector4_f32[1] > V2.vector4_f32[1]) && (V1.vector4_f32[2] > V2.vector4_f32[2])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgtq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); - return (((_mm_movemask_ps(vTemp) & 7) == 7) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -inline uint32_t XM_CALLCONV XMVector3GreaterR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - uint32_t CR = 0; - if ((V1.vector4_f32[0] > V2.vector4_f32[0]) && - (V1.vector4_f32[1] > V2.vector4_f32[1]) && - (V1.vector4_f32[2] > V2.vector4_f32[2])) - { - CR = XM_CRMASK_CR6TRUE; - } - else if ((V1.vector4_f32[0] <= V2.vector4_f32[0]) && - (V1.vector4_f32[1] <= V2.vector4_f32[1]) && - (V1.vector4_f32[2] <= V2.vector4_f32[2])) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgtq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU; - - uint32_t CR = 0; - if (r == 0xFFFFFFU) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!r) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); - uint32_t CR = 0; - int iTest = _mm_movemask_ps(vTemp) & 7; - if (iTest == 7) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!iTest) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector3GreaterOrEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] >= V2.vector4_f32[0]) && (V1.vector4_f32[1] >= V2.vector4_f32[1]) && (V1.vector4_f32[2] >= V2.vector4_f32[2])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgeq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); - return (((_mm_movemask_ps(vTemp) & 7) == 7) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -inline uint32_t XM_CALLCONV XMVector3GreaterOrEqualR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - uint32_t CR = 0; - if ((V1.vector4_f32[0] >= V2.vector4_f32[0]) && - (V1.vector4_f32[1] >= V2.vector4_f32[1]) && - (V1.vector4_f32[2] >= V2.vector4_f32[2])) - { - CR = XM_CRMASK_CR6TRUE; - } - else if ((V1.vector4_f32[0] < V2.vector4_f32[0]) && - (V1.vector4_f32[1] < V2.vector4_f32[1]) && - (V1.vector4_f32[2] < V2.vector4_f32[2])) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgeq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU; - - uint32_t CR = 0; - if (r == 0xFFFFFFU) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!r) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); - uint32_t CR = 0; - int iTest = _mm_movemask_ps(vTemp) & 7; - if (iTest == 7) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!iTest) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector3Less -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] < V2.vector4_f32[0]) && (V1.vector4_f32[1] < V2.vector4_f32[1]) && (V1.vector4_f32[2] < V2.vector4_f32[2])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcltq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmplt_ps(V1, V2); - return (((_mm_movemask_ps(vTemp) & 7) == 7) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector3LessOrEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] <= V2.vector4_f32[0]) && (V1.vector4_f32[1] <= V2.vector4_f32[1]) && (V1.vector4_f32[2] <= V2.vector4_f32[2])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcleq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmple_ps(V1, V2); - return (((_mm_movemask_ps(vTemp) & 7) == 7) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector3InBounds -( - FXMVECTOR V, - FXMVECTOR Bounds -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V.vector4_f32[0] <= Bounds.vector4_f32[0] && V.vector4_f32[0] >= -Bounds.vector4_f32[0]) && - (V.vector4_f32[1] <= Bounds.vector4_f32[1] && V.vector4_f32[1] >= -Bounds.vector4_f32[1]) && - (V.vector4_f32[2] <= Bounds.vector4_f32[2] && V.vector4_f32[2] >= -Bounds.vector4_f32[2])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Test if less than or equal - uint32x4_t ivTemp1 = vcleq_f32(V, Bounds); - // Negate the bounds - float32x4_t vTemp2 = vnegq_f32(Bounds); - // Test if greater or equal (Reversed) - uint32x4_t ivTemp2 = vcleq_f32(vTemp2, V); - // Blend answers - ivTemp1 = vandq_u32(ivTemp1, ivTemp2); - // in bounds? - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(ivTemp1)), vget_high_u8(vreinterpretq_u8_u32(ivTemp1))); - uint16x4x2_t vTemp3 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return ((vget_lane_u32(vreinterpret_u32_u16(vTemp3.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - // Test if less than or equal - XMVECTOR vTemp1 = _mm_cmple_ps(V, Bounds); - // Negate the bounds - XMVECTOR vTemp2 = _mm_mul_ps(Bounds, g_XMNegativeOne); - // Test if greater or equal (Reversed) - vTemp2 = _mm_cmple_ps(vTemp2, V); - // Blend answers - vTemp1 = _mm_and_ps(vTemp1, vTemp2); - // x,y and z in bounds? (w is don't care) - return (((_mm_movemask_ps(vTemp1) & 0x7) == 0x7) != 0); -#else - return XMComparisonAllInBounds(XMVector3InBoundsR(V, Bounds)); -#endif -} - -//------------------------------------------------------------------------------ - -#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) -#pragma float_control(push) -#pragma float_control(precise, on) -#endif - -inline bool XM_CALLCONV XMVector3IsNaN(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - return (XMISNAN(V.vector4_f32[0]) || - XMISNAN(V.vector4_f32[1]) || - XMISNAN(V.vector4_f32[2])); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(__clang__) && defined(__FINITE_MATH_ONLY__) - return isnan(vgetq_lane_f32(V, 0)) || isnan(vgetq_lane_f32(V, 1)) || isnan(vgetq_lane_f32(V, 2)); -#else -// Test against itself. NaN is always not equal - uint32x4_t vTempNan = vceqq_f32(V, V); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTempNan)), vget_high_u8(vreinterpretq_u8_u32(vTempNan))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - // If x or y or z are NaN, the mask is zero - return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) != 0xFFFFFFU); -#endif -#elif defined(_XM_SSE_INTRINSICS_) -#if defined(__clang__) && defined(__FINITE_MATH_ONLY__) - XM_ALIGNED_DATA(16) float tmp[4]; - _mm_store_ps(tmp, V); - return isnan(tmp[0]) || isnan(tmp[1]) || isnan(tmp[2]); -#else -// Test against itself. NaN is always not equal - XMVECTOR vTempNan = _mm_cmpneq_ps(V, V); - // If x or y or z are NaN, the mask is non-zero - return ((_mm_movemask_ps(vTempNan) & 7) != 0); -#endif -#endif -} - -#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) -#pragma float_control(pop) -#endif - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector3IsInfinite(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (XMISINF(V.vector4_f32[0]) || - XMISINF(V.vector4_f32[1]) || - XMISINF(V.vector4_f32[2])); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Mask off the sign bit - uint32x4_t vTempInf = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); - // Compare to infinity - vTempInf = vceqq_f32(vreinterpretq_f32_u32(vTempInf), g_XMInfinity); - // If any are infinity, the signs are true. - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTempInf)), vget_high_u8(vreinterpretq_u8_u32(vTempInf))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) != 0); -#elif defined(_XM_SSE_INTRINSICS_) - // Mask off the sign bit - __m128 vTemp = _mm_and_ps(V, g_XMAbsMask); - // Compare to infinity - vTemp = _mm_cmpeq_ps(vTemp, g_XMInfinity); - // If x,y or z are infinity, the signs are true. - return ((_mm_movemask_ps(vTemp) & 7) != 0); -#endif -} - -//------------------------------------------------------------------------------ -// Computation operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3Dot -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - float fValue = V1.vector4_f32[0] * V2.vector4_f32[0] + V1.vector4_f32[1] * V2.vector4_f32[1] + V1.vector4_f32[2] * V2.vector4_f32[2]; - XMVECTORF32 vResult; - vResult.f[0] = - vResult.f[1] = - vResult.f[2] = - vResult.f[3] = fValue; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t vTemp = vmulq_f32(V1, V2); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vpadd_f32(v1, v1); - v2 = vdup_lane_f32(v2, 0); - v1 = vadd_f32(v1, v2); - return vcombine_f32(v1, v1); -#elif defined(_XM_SSE4_INTRINSICS_) - return _mm_dp_ps(V1, V2, 0x7f); -#elif defined(_XM_SSE3_INTRINSICS_) - XMVECTOR vTemp = _mm_mul_ps(V1, V2); - vTemp = _mm_and_ps(vTemp, g_XMMask3); - vTemp = _mm_hadd_ps(vTemp, vTemp); - return _mm_hadd_ps(vTemp, vTemp); -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product - XMVECTOR vDot = _mm_mul_ps(V1, V2); - // x=Dot.vector4_f32[1], y=Dot.vector4_f32[2] - XMVECTOR vTemp = XM_PERMUTE_PS(vDot, _MM_SHUFFLE(2, 1, 2, 1)); - // Result.vector4_f32[0] = x+y - vDot = _mm_add_ss(vDot, vTemp); - // x=Dot.vector4_f32[2] - vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); - // Result.vector4_f32[0] = (x+y)+z - vDot = _mm_add_ss(vDot, vTemp); - // Splat x - return XM_PERMUTE_PS(vDot, _MM_SHUFFLE(0, 0, 0, 0)); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3Cross -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ - // [ V1.y*V2.z - V1.z*V2.y, V1.z*V2.x - V1.x*V2.z, V1.x*V2.y - V1.y*V2.x ] - -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - (V1.vector4_f32[1] * V2.vector4_f32[2]) - (V1.vector4_f32[2] * V2.vector4_f32[1]), - (V1.vector4_f32[2] * V2.vector4_f32[0]) - (V1.vector4_f32[0] * V2.vector4_f32[2]), - (V1.vector4_f32[0] * V2.vector4_f32[1]) - (V1.vector4_f32[1] * V2.vector4_f32[0]), - 0.0f - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t v1xy = vget_low_f32(V1); - float32x2_t v2xy = vget_low_f32(V2); - - float32x2_t v1yx = vrev64_f32(v1xy); - float32x2_t v2yx = vrev64_f32(v2xy); - - float32x2_t v1zz = vdup_lane_f32(vget_high_f32(V1), 0); - float32x2_t v2zz = vdup_lane_f32(vget_high_f32(V2), 0); - - XMVECTOR vResult = vmulq_f32(vcombine_f32(v1yx, v1xy), vcombine_f32(v2zz, v2yx)); - vResult = vmlsq_f32(vResult, vcombine_f32(v1zz, v1yx), vcombine_f32(v2yx, v2xy)); - vResult = vreinterpretq_f32_u32(veorq_u32(vreinterpretq_u32_f32(vResult), g_XMFlipY)); - return vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(vResult), g_XMMask3)); -#elif defined(_XM_SSE_INTRINSICS_) - // y1,z1,x1,w1 - XMVECTOR vTemp1 = XM_PERMUTE_PS(V1, _MM_SHUFFLE(3, 0, 2, 1)); - // z2,x2,y2,w2 - XMVECTOR vTemp2 = XM_PERMUTE_PS(V2, _MM_SHUFFLE(3, 1, 0, 2)); - // Perform the left operation - XMVECTOR vResult = _mm_mul_ps(vTemp1, vTemp2); - // z1,x1,y1,w1 - vTemp1 = XM_PERMUTE_PS(vTemp1, _MM_SHUFFLE(3, 0, 2, 1)); - // y2,z2,x2,w2 - vTemp2 = XM_PERMUTE_PS(vTemp2, _MM_SHUFFLE(3, 1, 0, 2)); - // Perform the right operation - vResult = XM_FNMADD_PS(vTemp1, vTemp2, vResult); - // Set w to zero - return _mm_and_ps(vResult, g_XMMask3); -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3LengthSq(FXMVECTOR V) noexcept -{ - return XMVector3Dot(V, V); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3ReciprocalLengthEst(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Result; - - Result = XMVector3LengthSq(V); - Result = XMVectorReciprocalSqrtEst(Result); - - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Dot3 - float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vpadd_f32(v1, v1); - v2 = vdup_lane_f32(v2, 0); - v1 = vadd_f32(v1, v2); - // Reciprocal sqrt (estimate) - v2 = vrsqrte_f32(v1); - return vcombine_f32(v2, v2); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); - return _mm_rsqrt_ps(vTemp); -#elif defined(_XM_SSE3_INTRINSICS_) - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_and_ps(vLengthSq, g_XMMask3); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_rsqrt_ps(vLengthSq); - return vLengthSq; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product on x,y and z - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - // vTemp has z and y - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 2, 1, 2)); - // x+z, y - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - // y,y,y,y - vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); - // x+z+y,??,??,?? - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - // Splat the length squared - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); - // Get the reciprocal - vLengthSq = _mm_rsqrt_ps(vLengthSq); - return vLengthSq; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3ReciprocalLength(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Result; - - Result = XMVector3LengthSq(V); - Result = XMVectorReciprocalSqrt(Result); - - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Dot3 - float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vpadd_f32(v1, v1); - v2 = vdup_lane_f32(v2, 0); - v1 = vadd_f32(v1, v2); - // Reciprocal sqrt - float32x2_t S0 = vrsqrte_f32(v1); - float32x2_t P0 = vmul_f32(v1, S0); - float32x2_t R0 = vrsqrts_f32(P0, S0); - float32x2_t S1 = vmul_f32(S0, R0); - float32x2_t P1 = vmul_f32(v1, S1); - float32x2_t R1 = vrsqrts_f32(P1, S1); - float32x2_t Result = vmul_f32(S1, R1); - return vcombine_f32(Result, Result); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); - XMVECTOR vLengthSq = _mm_sqrt_ps(vTemp); - return _mm_div_ps(g_XMOne, vLengthSq); -#elif defined(_XM_SSE3_INTRINSICS_) - XMVECTOR vDot = _mm_mul_ps(V, V); - vDot = _mm_and_ps(vDot, g_XMMask3); - vDot = _mm_hadd_ps(vDot, vDot); - vDot = _mm_hadd_ps(vDot, vDot); - vDot = _mm_sqrt_ps(vDot); - vDot = _mm_div_ps(g_XMOne, vDot); - return vDot; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product - XMVECTOR vDot = _mm_mul_ps(V, V); - // x=Dot.y, y=Dot.z - XMVECTOR vTemp = XM_PERMUTE_PS(vDot, _MM_SHUFFLE(2, 1, 2, 1)); - // Result.x = x+y - vDot = _mm_add_ss(vDot, vTemp); - // x=Dot.z - vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); - // Result.x = (x+y)+z - vDot = _mm_add_ss(vDot, vTemp); - // Splat x - vDot = XM_PERMUTE_PS(vDot, _MM_SHUFFLE(0, 0, 0, 0)); - // Get the reciprocal - vDot = _mm_sqrt_ps(vDot); - // Get the reciprocal - vDot = _mm_div_ps(g_XMOne, vDot); - return vDot; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3LengthEst(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Result; - - Result = XMVector3LengthSq(V); - Result = XMVectorSqrtEst(Result); - - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Dot3 - float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vpadd_f32(v1, v1); - v2 = vdup_lane_f32(v2, 0); - v1 = vadd_f32(v1, v2); - const float32x2_t zero = vdup_n_f32(0); - uint32x2_t VEqualsZero = vceq_f32(v1, zero); - // Sqrt (estimate) - float32x2_t Result = vrsqrte_f32(v1); - Result = vmul_f32(v1, Result); - Result = vbsl_f32(VEqualsZero, zero, Result); - return vcombine_f32(Result, Result); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); - return _mm_sqrt_ps(vTemp); -#elif defined(_XM_SSE3_INTRINSICS_) - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_and_ps(vLengthSq, g_XMMask3); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_sqrt_ps(vLengthSq); - return vLengthSq; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product on x,y and z - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - // vTemp has z and y - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 2, 1, 2)); - // x+z, y - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - // y,y,y,y - vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); - // x+z+y,??,??,?? - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - // Splat the length squared - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); - // Get the length - vLengthSq = _mm_sqrt_ps(vLengthSq); - return vLengthSq; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3Length(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Result; - - Result = XMVector3LengthSq(V); - Result = XMVectorSqrt(Result); - - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Dot3 - float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vpadd_f32(v1, v1); - v2 = vdup_lane_f32(v2, 0); - v1 = vadd_f32(v1, v2); - const float32x2_t zero = vdup_n_f32(0); - uint32x2_t VEqualsZero = vceq_f32(v1, zero); - // Sqrt - float32x2_t S0 = vrsqrte_f32(v1); - float32x2_t P0 = vmul_f32(v1, S0); - float32x2_t R0 = vrsqrts_f32(P0, S0); - float32x2_t S1 = vmul_f32(S0, R0); - float32x2_t P1 = vmul_f32(v1, S1); - float32x2_t R1 = vrsqrts_f32(P1, S1); - float32x2_t Result = vmul_f32(S1, R1); - Result = vmul_f32(v1, Result); - Result = vbsl_f32(VEqualsZero, zero, Result); - return vcombine_f32(Result, Result); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); - return _mm_sqrt_ps(vTemp); -#elif defined(_XM_SSE3_INTRINSICS_) - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_and_ps(vLengthSq, g_XMMask3); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_sqrt_ps(vLengthSq); - return vLengthSq; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product on x,y and z - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - // vTemp has z and y - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 2, 1, 2)); - // x+z, y - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - // y,y,y,y - vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); - // x+z+y,??,??,?? - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - // Splat the length squared - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); - // Get the length - vLengthSq = _mm_sqrt_ps(vLengthSq); - return vLengthSq; -#endif -} - -//------------------------------------------------------------------------------ -// XMVector3NormalizeEst uses a reciprocal estimate and -// returns QNaN on zero and infinite vectors. - -inline XMVECTOR XM_CALLCONV XMVector3NormalizeEst(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Result; - Result = XMVector3ReciprocalLength(V); - Result = XMVectorMultiply(V, Result); - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Dot3 - float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vpadd_f32(v1, v1); - v2 = vdup_lane_f32(v2, 0); - v1 = vadd_f32(v1, v2); - // Reciprocal sqrt (estimate) - v2 = vrsqrte_f32(v1); - // Normalize - return vmulq_f32(V, vcombine_f32(v2, v2)); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); - XMVECTOR vResult = _mm_rsqrt_ps(vTemp); - return _mm_mul_ps(vResult, V); -#elif defined(_XM_SSE3_INTRINSICS_) - XMVECTOR vDot = _mm_mul_ps(V, V); - vDot = _mm_and_ps(vDot, g_XMMask3); - vDot = _mm_hadd_ps(vDot, vDot); - vDot = _mm_hadd_ps(vDot, vDot); - vDot = _mm_rsqrt_ps(vDot); - vDot = _mm_mul_ps(vDot, V); - return vDot; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product - XMVECTOR vDot = _mm_mul_ps(V, V); - // x=Dot.y, y=Dot.z - XMVECTOR vTemp = XM_PERMUTE_PS(vDot, _MM_SHUFFLE(2, 1, 2, 1)); - // Result.x = x+y - vDot = _mm_add_ss(vDot, vTemp); - // x=Dot.z - vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); - // Result.x = (x+y)+z - vDot = _mm_add_ss(vDot, vTemp); - // Splat x - vDot = XM_PERMUTE_PS(vDot, _MM_SHUFFLE(0, 0, 0, 0)); - // Get the reciprocal - vDot = _mm_rsqrt_ps(vDot); - // Perform the normalization - vDot = _mm_mul_ps(vDot, V); - return vDot; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3Normalize(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - float fLength; - XMVECTOR vResult; - - vResult = XMVector3Length(V); - fLength = vResult.vector4_f32[0]; - - // Prevent divide by zero - if (fLength > 0) - { - fLength = 1.0f / fLength; - } - - vResult.vector4_f32[0] = V.vector4_f32[0] * fLength; - vResult.vector4_f32[1] = V.vector4_f32[1] * fLength; - vResult.vector4_f32[2] = V.vector4_f32[2] * fLength; - vResult.vector4_f32[3] = V.vector4_f32[3] * fLength; - return vResult; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Dot3 - float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vpadd_f32(v1, v1); - v2 = vdup_lane_f32(v2, 0); - v1 = vadd_f32(v1, v2); - uint32x2_t VEqualsZero = vceq_f32(v1, vdup_n_f32(0)); - uint32x2_t VEqualsInf = vceq_f32(v1, vget_low_f32(g_XMInfinity)); - // Reciprocal sqrt (2 iterations of Newton-Raphson) - float32x2_t S0 = vrsqrte_f32(v1); - float32x2_t P0 = vmul_f32(v1, S0); - float32x2_t R0 = vrsqrts_f32(P0, S0); - float32x2_t S1 = vmul_f32(S0, R0); - float32x2_t P1 = vmul_f32(v1, S1); - float32x2_t R1 = vrsqrts_f32(P1, S1); - v2 = vmul_f32(S1, R1); - // Normalize - XMVECTOR vResult = vmulq_f32(V, vcombine_f32(v2, v2)); - vResult = vbslq_f32(vcombine_u32(VEqualsZero, VEqualsZero), vdupq_n_f32(0), vResult); - return vbslq_f32(vcombine_u32(VEqualsInf, VEqualsInf), g_XMQNaN, vResult); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vLengthSq = _mm_dp_ps(V, V, 0x7f); - // Prepare for the division - XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); - // Create zero with a single instruction - XMVECTOR vZeroMask = _mm_setzero_ps(); - // Test for a divide by zero (Must be FP to detect -0.0) - vZeroMask = _mm_cmpneq_ps(vZeroMask, vResult); - // Failsafe on zero (Or epsilon) length planes - // If the length is infinity, set the elements to zero - vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); - // Divide to perform the normalization - vResult = _mm_div_ps(V, vResult); - // Any that are infinity, set to zero - vResult = _mm_and_ps(vResult, vZeroMask); - // Select qnan or result based on infinite length - XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); - XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); - return vResult; -#elif defined(_XM_SSE3_INTRINSICS_) - // Perform the dot product on x,y and z only - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_and_ps(vLengthSq, g_XMMask3); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - // Prepare for the division - XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); - // Create zero with a single instruction - XMVECTOR vZeroMask = _mm_setzero_ps(); - // Test for a divide by zero (Must be FP to detect -0.0) - vZeroMask = _mm_cmpneq_ps(vZeroMask, vResult); - // Failsafe on zero (Or epsilon) length planes - // If the length is infinity, set the elements to zero - vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); - // Divide to perform the normalization - vResult = _mm_div_ps(V, vResult); - // Any that are infinity, set to zero - vResult = _mm_and_ps(vResult, vZeroMask); - // Select qnan or result based on infinite length - XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); - XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); - return vResult; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product on x,y and z only - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 1, 2, 1)); - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); - vLengthSq = _mm_add_ss(vLengthSq, vTemp); - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); - // Prepare for the division - XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); - // Create zero with a single instruction - XMVECTOR vZeroMask = _mm_setzero_ps(); - // Test for a divide by zero (Must be FP to detect -0.0) - vZeroMask = _mm_cmpneq_ps(vZeroMask, vResult); - // Failsafe on zero (Or epsilon) length planes - // If the length is infinity, set the elements to zero - vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); - // Divide to perform the normalization - vResult = _mm_div_ps(V, vResult); - // Any that are infinity, set to zero - vResult = _mm_and_ps(vResult, vZeroMask); - // Select qnan or result based on infinite length - XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); - XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3ClampLength -( - FXMVECTOR V, - float LengthMin, - float LengthMax -) noexcept -{ - XMVECTOR ClampMax = XMVectorReplicate(LengthMax); - XMVECTOR ClampMin = XMVectorReplicate(LengthMin); - - return XMVector3ClampLengthV(V, ClampMin, ClampMax); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3ClampLengthV -( - FXMVECTOR V, - FXMVECTOR LengthMin, - FXMVECTOR LengthMax -) noexcept -{ - assert((XMVectorGetY(LengthMin) == XMVectorGetX(LengthMin)) && (XMVectorGetZ(LengthMin) == XMVectorGetX(LengthMin))); - assert((XMVectorGetY(LengthMax) == XMVectorGetX(LengthMax)) && (XMVectorGetZ(LengthMax) == XMVectorGetX(LengthMax))); - assert(XMVector3GreaterOrEqual(LengthMin, XMVectorZero())); - assert(XMVector3GreaterOrEqual(LengthMax, XMVectorZero())); - assert(XMVector3GreaterOrEqual(LengthMax, LengthMin)); - - XMVECTOR LengthSq = XMVector3LengthSq(V); - - const XMVECTOR Zero = XMVectorZero(); - - XMVECTOR RcpLength = XMVectorReciprocalSqrt(LengthSq); - - XMVECTOR InfiniteLength = XMVectorEqualInt(LengthSq, g_XMInfinity.v); - XMVECTOR ZeroLength = XMVectorEqual(LengthSq, Zero); - - XMVECTOR Normal = XMVectorMultiply(V, RcpLength); - - XMVECTOR Length = XMVectorMultiply(LengthSq, RcpLength); - - XMVECTOR Select = XMVectorEqualInt(InfiniteLength, ZeroLength); - Length = XMVectorSelect(LengthSq, Length, Select); - Normal = XMVectorSelect(LengthSq, Normal, Select); - - XMVECTOR ControlMax = XMVectorGreater(Length, LengthMax); - XMVECTOR ControlMin = XMVectorLess(Length, LengthMin); - - XMVECTOR ClampLength = XMVectorSelect(Length, LengthMax, ControlMax); - ClampLength = XMVectorSelect(ClampLength, LengthMin, ControlMin); - - XMVECTOR Result = XMVectorMultiply(Normal, ClampLength); - - // Preserve the original vector (with no precision loss) if the length falls within the given range - XMVECTOR Control = XMVectorEqualInt(ControlMax, ControlMin); - Result = XMVectorSelect(Result, V, Control); - - return Result; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3Reflect -( - FXMVECTOR Incident, - FXMVECTOR Normal -) noexcept -{ - // Result = Incident - (2 * dot(Incident, Normal)) * Normal - - XMVECTOR Result = XMVector3Dot(Incident, Normal); - Result = XMVectorAdd(Result, Result); - Result = XMVectorNegativeMultiplySubtract(Result, Normal, Incident); - - return Result; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3Refract -( - FXMVECTOR Incident, - FXMVECTOR Normal, - float RefractionIndex -) noexcept -{ - XMVECTOR Index = XMVectorReplicate(RefractionIndex); - return XMVector3RefractV(Incident, Normal, Index); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3RefractV -( - FXMVECTOR Incident, - FXMVECTOR Normal, - FXMVECTOR RefractionIndex -) noexcept -{ - // Result = RefractionIndex * Incident - Normal * (RefractionIndex * dot(Incident, Normal) + - // sqrt(1 - RefractionIndex * RefractionIndex * (1 - dot(Incident, Normal) * dot(Incident, Normal)))) - -#if defined(_XM_NO_INTRINSICS_) - - const XMVECTOR Zero = XMVectorZero(); - - XMVECTOR IDotN = XMVector3Dot(Incident, Normal); - - // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) - XMVECTOR R = XMVectorNegativeMultiplySubtract(IDotN, IDotN, g_XMOne.v); - R = XMVectorMultiply(R, RefractionIndex); - R = XMVectorNegativeMultiplySubtract(R, RefractionIndex, g_XMOne.v); - - if (XMVector4LessOrEqual(R, Zero)) - { - // Total internal reflection - return Zero; - } - else - { - // R = RefractionIndex * IDotN + sqrt(R) - R = XMVectorSqrt(R); - R = XMVectorMultiplyAdd(RefractionIndex, IDotN, R); - - // Result = RefractionIndex * Incident - Normal * R - XMVECTOR Result = XMVectorMultiply(RefractionIndex, Incident); - Result = XMVectorNegativeMultiplySubtract(Normal, R, Result); - - return Result; - } - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - XMVECTOR IDotN = XMVector3Dot(Incident, Normal); - - // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) - float32x4_t R = vmlsq_f32(g_XMOne, IDotN, IDotN); - R = vmulq_f32(R, RefractionIndex); - R = vmlsq_f32(g_XMOne, R, RefractionIndex); - - uint32x4_t isrzero = vcleq_f32(R, g_XMZero); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(isrzero)), vget_high_u8(vreinterpretq_u8_u32(isrzero))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - - float32x4_t vResult; - if (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU) - { - // Total internal reflection - vResult = g_XMZero; - } - else - { - // Sqrt(R) - float32x4_t S0 = vrsqrteq_f32(R); - float32x4_t P0 = vmulq_f32(R, S0); - float32x4_t R0 = vrsqrtsq_f32(P0, S0); - float32x4_t S1 = vmulq_f32(S0, R0); - float32x4_t P1 = vmulq_f32(R, S1); - float32x4_t R1 = vrsqrtsq_f32(P1, S1); - float32x4_t S2 = vmulq_f32(S1, R1); - R = vmulq_f32(R, S2); - // R = RefractionIndex * IDotN + sqrt(R) - R = vmlaq_f32(R, RefractionIndex, IDotN); - // Result = RefractionIndex * Incident - Normal * R - vResult = vmulq_f32(RefractionIndex, Incident); - vResult = vmlsq_f32(vResult, R, Normal); - } - return vResult; -#elif defined(_XM_SSE_INTRINSICS_) - // Result = RefractionIndex * Incident - Normal * (RefractionIndex * dot(Incident, Normal) + - // sqrt(1 - RefractionIndex * RefractionIndex * (1 - dot(Incident, Normal) * dot(Incident, Normal)))) - XMVECTOR IDotN = XMVector3Dot(Incident, Normal); - // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) - XMVECTOR R = XM_FNMADD_PS(IDotN, IDotN, g_XMOne); - XMVECTOR R2 = _mm_mul_ps(RefractionIndex, RefractionIndex); - R = XM_FNMADD_PS(R, R2, g_XMOne); - - XMVECTOR vResult = _mm_cmple_ps(R, g_XMZero); - if (_mm_movemask_ps(vResult) == 0x0f) - { - // Total internal reflection - vResult = g_XMZero; - } - else - { - // R = RefractionIndex * IDotN + sqrt(R) - R = _mm_sqrt_ps(R); - R = XM_FMADD_PS(RefractionIndex, IDotN, R); - // Result = RefractionIndex * Incident - Normal * R - vResult = _mm_mul_ps(RefractionIndex, Incident); - vResult = XM_FNMADD_PS(R, Normal, vResult); - } - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3Orthogonal(FXMVECTOR V) noexcept -{ - XMVECTOR Zero = XMVectorZero(); - XMVECTOR Z = XMVectorSplatZ(V); - XMVECTOR YZYY = XMVectorSwizzle(V); - - XMVECTOR NegativeV = XMVectorSubtract(Zero, V); - - XMVECTOR ZIsNegative = XMVectorLess(Z, Zero); - XMVECTOR YZYYIsNegative = XMVectorLess(YZYY, Zero); - - XMVECTOR S = XMVectorAdd(YZYY, Z); - XMVECTOR D = XMVectorSubtract(YZYY, Z); - - XMVECTOR Select = XMVectorEqualInt(ZIsNegative, YZYYIsNegative); - - XMVECTOR R0 = XMVectorPermute(NegativeV, S); - XMVECTOR R1 = XMVectorPermute(V, D); - - return XMVectorSelect(R1, R0, Select); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3AngleBetweenNormalsEst -( - FXMVECTOR N1, - FXMVECTOR N2 -) noexcept -{ - XMVECTOR Result = XMVector3Dot(N1, N2); - Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); - Result = XMVectorACosEst(Result); - return Result; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3AngleBetweenNormals -( - FXMVECTOR N1, - FXMVECTOR N2 -) noexcept -{ - XMVECTOR Result = XMVector3Dot(N1, N2); - Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); - Result = XMVectorACos(Result); - return Result; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3AngleBetweenVectors -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ - XMVECTOR L1 = XMVector3ReciprocalLength(V1); - XMVECTOR L2 = XMVector3ReciprocalLength(V2); - - XMVECTOR Dot = XMVector3Dot(V1, V2); - - L1 = XMVectorMultiply(L1, L2); - - XMVECTOR CosAngle = XMVectorMultiply(Dot, L1); - CosAngle = XMVectorClamp(CosAngle, g_XMNegativeOne.v, g_XMOne.v); - - return XMVectorACos(CosAngle); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3LinePointDistance -( - FXMVECTOR LinePoint1, - FXMVECTOR LinePoint2, - FXMVECTOR Point -) noexcept -{ - // Given a vector PointVector from LinePoint1 to Point and a vector - // LineVector from LinePoint1 to LinePoint2, the scaled distance - // PointProjectionScale from LinePoint1 to the perpendicular projection - // of PointVector onto the line is defined as: - // - // PointProjectionScale = dot(PointVector, LineVector) / LengthSq(LineVector) - - XMVECTOR PointVector = XMVectorSubtract(Point, LinePoint1); - XMVECTOR LineVector = XMVectorSubtract(LinePoint2, LinePoint1); - - XMVECTOR LengthSq = XMVector3LengthSq(LineVector); - - XMVECTOR PointProjectionScale = XMVector3Dot(PointVector, LineVector); - PointProjectionScale = XMVectorDivide(PointProjectionScale, LengthSq); - - XMVECTOR DistanceVector = XMVectorMultiply(LineVector, PointProjectionScale); - DistanceVector = XMVectorSubtract(PointVector, DistanceVector); - - return XMVector3Length(DistanceVector); -} - -//------------------------------------------------------------------------------ - -_Use_decl_annotations_ -inline void XM_CALLCONV XMVector3ComponentsFromNormal -( - XMVECTOR* pParallel, - XMVECTOR* pPerpendicular, - FXMVECTOR V, - FXMVECTOR Normal -) noexcept -{ - assert(pParallel != nullptr); - assert(pPerpendicular != nullptr); - - XMVECTOR Scale = XMVector3Dot(V, Normal); - - XMVECTOR Parallel = XMVectorMultiply(Normal, Scale); - - *pParallel = Parallel; - *pPerpendicular = XMVectorSubtract(V, Parallel); -} - -//------------------------------------------------------------------------------ -// Transform a vector using a rotation expressed as a unit quaternion - -inline XMVECTOR XM_CALLCONV XMVector3Rotate -( - FXMVECTOR V, - FXMVECTOR RotationQuaternion -) noexcept -{ - XMVECTOR A = XMVectorSelect(g_XMSelect1110.v, V, g_XMSelect1110.v); - XMVECTOR Q = XMQuaternionConjugate(RotationQuaternion); - XMVECTOR Result = XMQuaternionMultiply(Q, A); - return XMQuaternionMultiply(Result, RotationQuaternion); -} - -//------------------------------------------------------------------------------ -// Transform a vector using the inverse of a rotation expressed as a unit quaternion - -inline XMVECTOR XM_CALLCONV XMVector3InverseRotate -( - FXMVECTOR V, - FXMVECTOR RotationQuaternion -) noexcept -{ - XMVECTOR A = XMVectorSelect(g_XMSelect1110.v, V, g_XMSelect1110.v); - XMVECTOR Result = XMQuaternionMultiply(RotationQuaternion, A); - XMVECTOR Q = XMQuaternionConjugate(RotationQuaternion); - return XMQuaternionMultiply(Result, Q); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3Transform -( - FXMVECTOR V, - FXMMATRIX M -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Z = XMVectorSplatZ(V); - XMVECTOR Y = XMVectorSplatY(V); - XMVECTOR X = XMVectorSplatX(V); - - XMVECTOR Result = XMVectorMultiplyAdd(Z, M.r[2], M.r[3]); - Result = XMVectorMultiplyAdd(Y, M.r[1], Result); - Result = XMVectorMultiplyAdd(X, M.r[0], Result); - - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); - XMVECTOR vResult = vmlaq_lane_f32(M.r[3], M.r[0], VL, 0); // X - vResult = vmlaq_lane_f32(vResult, M.r[1], VL, 1); // Y - return vmlaq_lane_f32(vResult, M.r[2], vget_high_f32(V), 0); // Z -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z - vResult = XM_FMADD_PS(vResult, M.r[2], M.r[3]); - XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = XM_FMADD_PS(vTemp, M.r[1], vResult); - vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -#ifdef _PREFAST_ -#pragma prefast(push) -#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307" ) -#endif - -_Use_decl_annotations_ -inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream -( - XMFLOAT4* pOutputStream, - size_t OutputStride, - const XMFLOAT3* pInputStream, - size_t InputStride, - size_t VectorCount, - FXMMATRIX M -) noexcept -{ - assert(pOutputStream != nullptr); - assert(pInputStream != nullptr); - - assert(InputStride >= sizeof(XMFLOAT3)); - _Analysis_assume_(InputStride >= sizeof(XMFLOAT3)); - - assert(OutputStride >= sizeof(XMFLOAT4)); - _Analysis_assume_(OutputStride >= sizeof(XMFLOAT4)); - -#if defined(_XM_NO_INTRINSICS_) - - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row2 = M.r[2]; - const XMVECTOR row3 = M.r[3]; - - for (size_t i = 0; i < VectorCount; i++) - { - XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); - XMVECTOR Z = XMVectorSplatZ(V); - XMVECTOR Y = XMVectorSplatY(V); - XMVECTOR X = XMVectorSplatX(V); - - XMVECTOR Result = XMVectorMultiplyAdd(Z, row2, row3); - Result = XMVectorMultiplyAdd(Y, row1, Result); - Result = XMVectorMultiplyAdd(X, row0, Result); - - XMStoreFloat4(reinterpret_cast(pOutputVector), Result); - - pInputVector += InputStride; - pOutputVector += OutputStride; - } - - return pOutputStream; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row2 = M.r[2]; - const XMVECTOR row3 = M.r[3]; - - size_t i = 0; - size_t four = VectorCount >> 2; - if (four > 0) - { - if ((InputStride == sizeof(XMFLOAT3)) && (OutputStride == sizeof(XMFLOAT4))) - { - for (size_t j = 0; j < four; ++j) - { - float32x4x3_t V = vld3q_f32(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT3) * 4; - - float32x2_t r3 = vget_low_f32(row3); - float32x2_t r = vget_low_f32(row0); - XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M - XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N - - XM_PREFETCH(pInputVector); - - r3 = vget_high_f32(row3); - r = vget_high_f32(row0); - XMVECTOR vResult2 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Cx+O - XMVECTOR vResult3 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Dx+P - - XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); - - r = vget_low_f32(row1); - vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey+M - vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy+N - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); - - r = vget_high_f32(row1); - vResult2 = vmlaq_lane_f32(vResult2, V.val[1], r, 0); // Cx+Gy+O - vResult3 = vmlaq_lane_f32(vResult3, V.val[1], r, 1); // Dx+Hy+P - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); - - r = vget_low_f32(row2); - vResult0 = vmlaq_lane_f32(vResult0, V.val[2], r, 0); // Ax+Ey+Iz+M - vResult1 = vmlaq_lane_f32(vResult1, V.val[2], r, 1); // Bx+Fy+Jz+N - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 4)); - - r = vget_high_f32(row2); - vResult2 = vmlaq_lane_f32(vResult2, V.val[2], r, 0); // Cx+Gy+Kz+O - vResult3 = vmlaq_lane_f32(vResult3, V.val[2], r, 1); // Dx+Hy+Lz+P - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 5)); - - float32x4x4_t R; - R.val[0] = vResult0; - R.val[1] = vResult1; - R.val[2] = vResult2; - R.val[3] = vResult3; - - vst4q_f32(reinterpret_cast(pOutputVector), R); - pOutputVector += sizeof(XMFLOAT4) * 4; - - i += 4; - } - } - } - - for (; i < VectorCount; i++) - { - float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); - float32x2_t zero = vdup_n_f32(0); - float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); - pInputVector += InputStride; - - XMVECTOR vResult = vmlaq_lane_f32(row3, row0, VL, 0); // X - vResult = vmlaq_lane_f32(vResult, row1, VL, 1); // Y - vResult = vmlaq_lane_f32(vResult, row2, VH, 0); // Z - - vst1q_f32(reinterpret_cast(pOutputVector), vResult); - pOutputVector += OutputStride; - } - - return pOutputStream; -#elif defined(_XM_SSE_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row2 = M.r[2]; - const XMVECTOR row3 = M.r[3]; - - size_t i = 0; - size_t four = VectorCount >> 2; - if (four > 0) - { - if (InputStride == sizeof(XMFLOAT3)) - { - if (!(reinterpret_cast(pOutputStream) & 0xF) && !(OutputStride & 0xF)) - { - // Packed input, aligned output - for (size_t j = 0; j < four; ++j) - { - __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); - __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); - __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); - pInputVector += sizeof(XMFLOAT3) * 4; - - // Unpack the 4 vectors (.w components are junk) - XM3UNPACK3INTO4(V1, L2, L3); - - // Result 1 - XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); - XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); - XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - // Result 2 - Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, row2, row3); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - // Result 3 - Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, row2, row3); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - // Result 4 - Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, row2, row3); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - i += 4; - } - } - else - { - // Packed input, unaligned output - for (size_t j = 0; j < four; ++j) - { - __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); - __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); - __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); - pInputVector += sizeof(XMFLOAT3) * 4; - - // Unpack the 4 vectors (.w components are junk) - XM3UNPACK3INTO4(V1, L2, L3); - - // Result 1 - XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); - XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); - XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - // Result 2 - Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, row2, row3); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - // Result 3 - Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, row2, row3); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - // Result 4 - Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, row2, row3); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - i += 4; - } - } - } - } - - if (!(reinterpret_cast(pOutputStream) & 0xF) && !(OutputStride & 0xF)) - { - // Aligned output - for (; i < VectorCount; ++i) - { - XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); - pInputVector += InputStride; - - XMVECTOR Z = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); - XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); - XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - } - } - else - { - // Unaligned output - for (; i < VectorCount; ++i) - { - XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); - pInputVector += InputStride; - - XMVECTOR Z = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); - XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); - XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - } - } - - XM_SFENCE(); - - return pOutputStream; -#endif -} - -#ifdef _PREFAST_ -#pragma prefast(pop) -#endif - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3TransformCoord -( - FXMVECTOR V, - FXMMATRIX M -) noexcept -{ - XMVECTOR Z = XMVectorSplatZ(V); - XMVECTOR Y = XMVectorSplatY(V); - XMVECTOR X = XMVectorSplatX(V); - - XMVECTOR Result = XMVectorMultiplyAdd(Z, M.r[2], M.r[3]); - Result = XMVectorMultiplyAdd(Y, M.r[1], Result); - Result = XMVectorMultiplyAdd(X, M.r[0], Result); - - XMVECTOR W = XMVectorSplatW(Result); - return XMVectorDivide(Result, W); -} - -//------------------------------------------------------------------------------ - -#ifdef _PREFAST_ -#pragma prefast(push) -#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307" ) -#endif - -_Use_decl_annotations_ -inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream -( - XMFLOAT3* pOutputStream, - size_t OutputStride, - const XMFLOAT3* pInputStream, - size_t InputStride, - size_t VectorCount, - FXMMATRIX M -) noexcept -{ - assert(pOutputStream != nullptr); - assert(pInputStream != nullptr); - - assert(InputStride >= sizeof(XMFLOAT3)); - _Analysis_assume_(InputStride >= sizeof(XMFLOAT3)); - - assert(OutputStride >= sizeof(XMFLOAT3)); - _Analysis_assume_(OutputStride >= sizeof(XMFLOAT3)); - -#if defined(_XM_NO_INTRINSICS_) - - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row2 = M.r[2]; - const XMVECTOR row3 = M.r[3]; - - for (size_t i = 0; i < VectorCount; i++) - { - XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); - XMVECTOR Z = XMVectorSplatZ(V); - XMVECTOR Y = XMVectorSplatY(V); - XMVECTOR X = XMVectorSplatX(V); - - XMVECTOR Result = XMVectorMultiplyAdd(Z, row2, row3); - Result = XMVectorMultiplyAdd(Y, row1, Result); - Result = XMVectorMultiplyAdd(X, row0, Result); - - XMVECTOR W = XMVectorSplatW(Result); - - Result = XMVectorDivide(Result, W); - - XMStoreFloat3(reinterpret_cast(pOutputVector), Result); - - pInputVector += InputStride; - pOutputVector += OutputStride; - } - - return pOutputStream; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row2 = M.r[2]; - const XMVECTOR row3 = M.r[3]; - - size_t i = 0; - size_t four = VectorCount >> 2; - if (four > 0) - { - if ((InputStride == sizeof(XMFLOAT3)) && (OutputStride == sizeof(XMFLOAT3))) - { - for (size_t j = 0; j < four; ++j) - { - float32x4x3_t V = vld3q_f32(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT3) * 4; - - float32x2_t r3 = vget_low_f32(row3); - float32x2_t r = vget_low_f32(row0); - XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M - XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N - - XM_PREFETCH(pInputVector); - - r3 = vget_high_f32(row3); - r = vget_high_f32(row0); - XMVECTOR vResult2 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Cx+O - XMVECTOR W = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Dx+P - - XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); - - r = vget_low_f32(row1); - vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey+M - vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy+N - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); - - r = vget_high_f32(row1); - vResult2 = vmlaq_lane_f32(vResult2, V.val[1], r, 0); // Cx+Gy+O - W = vmlaq_lane_f32(W, V.val[1], r, 1); // Dx+Hy+P - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); - - r = vget_low_f32(row2); - vResult0 = vmlaq_lane_f32(vResult0, V.val[2], r, 0); // Ax+Ey+Iz+M - vResult1 = vmlaq_lane_f32(vResult1, V.val[2], r, 1); // Bx+Fy+Jz+N - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 4)); - - r = vget_high_f32(row2); - vResult2 = vmlaq_lane_f32(vResult2, V.val[2], r, 0); // Cx+Gy+Kz+O - W = vmlaq_lane_f32(W, V.val[2], r, 1); // Dx+Hy+Lz+P - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 5)); - - #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ - V.val[0] = vdivq_f32(vResult0, W); - V.val[1] = vdivq_f32(vResult1, W); - V.val[2] = vdivq_f32(vResult2, W); - #else - // 2 iterations of Newton-Raphson refinement of reciprocal - float32x4_t Reciprocal = vrecpeq_f32(W); - float32x4_t S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - - V.val[0] = vmulq_f32(vResult0, Reciprocal); - V.val[1] = vmulq_f32(vResult1, Reciprocal); - V.val[2] = vmulq_f32(vResult2, Reciprocal); - #endif - - vst3q_f32(reinterpret_cast(pOutputVector), V); - pOutputVector += sizeof(XMFLOAT3) * 4; - - i += 4; - } - } - } - - for (; i < VectorCount; i++) - { - float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); - float32x2_t zero = vdup_n_f32(0); - float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); - pInputVector += InputStride; - - XMVECTOR vResult = vmlaq_lane_f32(row3, row0, VL, 0); // X - vResult = vmlaq_lane_f32(vResult, row1, VL, 1); // Y - vResult = vmlaq_lane_f32(vResult, row2, VH, 0); // Z - - VH = vget_high_f32(vResult); - XMVECTOR W = vdupq_lane_f32(VH, 1); - - #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ - vResult = vdivq_f32(vResult, W); - #else - // 2 iterations of Newton-Raphson refinement of reciprocal for W - float32x4_t Reciprocal = vrecpeq_f32(W); - float32x4_t S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - - vResult = vmulq_f32(vResult, Reciprocal); - #endif - - VL = vget_low_f32(vResult); - vst1_f32(reinterpret_cast(pOutputVector), VL); - vst1q_lane_f32(reinterpret_cast(pOutputVector) + 2, vResult, 2); - pOutputVector += OutputStride; - } - - return pOutputStream; -#elif defined(_XM_SSE_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row2 = M.r[2]; - const XMVECTOR row3 = M.r[3]; - - size_t i = 0; - size_t four = VectorCount >> 2; - if (four > 0) - { - if (InputStride == sizeof(XMFLOAT3)) - { - if (OutputStride == sizeof(XMFLOAT3)) - { - if (!(reinterpret_cast(pOutputStream) & 0xF)) - { - // Packed input, aligned & packed output - for (size_t j = 0; j < four; ++j) - { - __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); - __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); - __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); - pInputVector += sizeof(XMFLOAT3) * 4; - - // Unpack the 4 vectors (.w components are junk) - XM3UNPACK3INTO4(V1, L2, L3); - - // Result 1 - XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); - XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); - XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - V1 = _mm_div_ps(vTemp, W); - - // Result 2 - Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, row2, row3); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - V2 = _mm_div_ps(vTemp, W); - - // Result 3 - Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, row2, row3); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - V3 = _mm_div_ps(vTemp, W); - - // Result 4 - Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, row2, row3); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - V4 = _mm_div_ps(vTemp, W); - - // Pack and store the vectors - XM3PACK4INTO3(vTemp); - XM_STREAM_PS(reinterpret_cast(pOutputVector), V1); - XM_STREAM_PS(reinterpret_cast(pOutputVector + 16), vTemp); - XM_STREAM_PS(reinterpret_cast(pOutputVector + 32), V3); - pOutputVector += sizeof(XMFLOAT3) * 4; - i += 4; - } - } - else - { - // Packed input, unaligned & packed output - for (size_t j = 0; j < four; ++j) - { - __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); - __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); - __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); - pInputVector += sizeof(XMFLOAT3) * 4; - - // Unpack the 4 vectors (.w components are junk) - XM3UNPACK3INTO4(V1, L2, L3); - - // Result 1 - XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); - XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); - XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - V1 = _mm_div_ps(vTemp, W); - - // Result 2 - Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, row2, row3); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - V2 = _mm_div_ps(vTemp, W); - - // Result 3 - Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, row2, row3); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - V3 = _mm_div_ps(vTemp, W); - - // Result 4 - Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, row2, row3); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - V4 = _mm_div_ps(vTemp, W); - - // Pack and store the vectors - XM3PACK4INTO3(vTemp); - _mm_storeu_ps(reinterpret_cast(pOutputVector), V1); - _mm_storeu_ps(reinterpret_cast(pOutputVector + 16), vTemp); - _mm_storeu_ps(reinterpret_cast(pOutputVector + 32), V3); - pOutputVector += sizeof(XMFLOAT3) * 4; - i += 4; - } - } - } - else - { - // Packed input, unpacked output - for (size_t j = 0; j < four; ++j) - { - __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); - __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); - __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); - pInputVector += sizeof(XMFLOAT3) * 4; - - // Unpack the 4 vectors (.w components are junk) - XM3UNPACK3INTO4(V1, L2, L3); - - // Result 1 - XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); - XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); - XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - vTemp = _mm_div_ps(vTemp, W); - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - // Result 2 - Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, row2, row3); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - vTemp = _mm_div_ps(vTemp, W); - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - // Result 3 - Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, row2, row3); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - vTemp = _mm_div_ps(vTemp, W); - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - // Result 4 - Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, row2, row3); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - vTemp = _mm_div_ps(vTemp, W); - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - i += 4; - } - } - } - } - - for (; i < VectorCount; i++) - { - XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); - pInputVector += InputStride; - - XMVECTOR Z = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); - XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); - XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - - vTemp = _mm_div_ps(vTemp, W); - - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - } - - XM_SFENCE(); - - return pOutputStream; -#endif -} - -#ifdef _PREFAST_ -#pragma prefast(pop) -#endif - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3TransformNormal -( - FXMVECTOR V, - FXMMATRIX M -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Z = XMVectorSplatZ(V); - XMVECTOR Y = XMVectorSplatY(V); - XMVECTOR X = XMVectorSplatX(V); - - XMVECTOR Result = XMVectorMultiply(Z, M.r[2]); - Result = XMVectorMultiplyAdd(Y, M.r[1], Result); - Result = XMVectorMultiplyAdd(X, M.r[0], Result); - - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); - XMVECTOR vResult = vmulq_lane_f32(M.r[0], VL, 0); // X - vResult = vmlaq_lane_f32(vResult, M.r[1], VL, 1); // Y - return vmlaq_lane_f32(vResult, M.r[2], vget_high_f32(V), 0); // Z -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z - vResult = _mm_mul_ps(vResult, M.r[2]); - XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = XM_FMADD_PS(vTemp, M.r[1], vResult); - vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -#ifdef _PREFAST_ -#pragma prefast(push) -#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307" ) -#endif - -_Use_decl_annotations_ -inline XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream -( - XMFLOAT3* pOutputStream, - size_t OutputStride, - const XMFLOAT3* pInputStream, - size_t InputStride, - size_t VectorCount, - FXMMATRIX M -) noexcept -{ - assert(pOutputStream != nullptr); - assert(pInputStream != nullptr); - - assert(InputStride >= sizeof(XMFLOAT3)); - _Analysis_assume_(InputStride >= sizeof(XMFLOAT3)); - - assert(OutputStride >= sizeof(XMFLOAT3)); - _Analysis_assume_(OutputStride >= sizeof(XMFLOAT3)); - -#if defined(_XM_NO_INTRINSICS_) - - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row2 = M.r[2]; - - for (size_t i = 0; i < VectorCount; i++) - { - XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); - XMVECTOR Z = XMVectorSplatZ(V); - XMVECTOR Y = XMVectorSplatY(V); - XMVECTOR X = XMVectorSplatX(V); - - XMVECTOR Result = XMVectorMultiply(Z, row2); - Result = XMVectorMultiplyAdd(Y, row1, Result); - Result = XMVectorMultiplyAdd(X, row0, Result); - - XMStoreFloat3(reinterpret_cast(pOutputVector), Result); - - pInputVector += InputStride; - pOutputVector += OutputStride; - } - - return pOutputStream; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row2 = M.r[2]; - - size_t i = 0; - size_t four = VectorCount >> 2; - if (four > 0) - { - if ((InputStride == sizeof(XMFLOAT3)) && (OutputStride == sizeof(XMFLOAT3))) - { - for (size_t j = 0; j < four; ++j) - { - float32x4x3_t V = vld3q_f32(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT3) * 4; - - float32x2_t r = vget_low_f32(row0); - XMVECTOR vResult0 = vmulq_lane_f32(V.val[0], r, 0); // Ax - XMVECTOR vResult1 = vmulq_lane_f32(V.val[0], r, 1); // Bx - - XM_PREFETCH(pInputVector); - - r = vget_high_f32(row0); - XMVECTOR vResult2 = vmulq_lane_f32(V.val[0], r, 0); // Cx - - XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); - - r = vget_low_f32(row1); - vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey - vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); - - r = vget_high_f32(row1); - vResult2 = vmlaq_lane_f32(vResult2, V.val[1], r, 0); // Cx+Gy - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); - - r = vget_low_f32(row2); - vResult0 = vmlaq_lane_f32(vResult0, V.val[2], r, 0); // Ax+Ey+Iz - vResult1 = vmlaq_lane_f32(vResult1, V.val[2], r, 1); // Bx+Fy+Jz - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 4)); - - r = vget_high_f32(row2); - vResult2 = vmlaq_lane_f32(vResult2, V.val[2], r, 0); // Cx+Gy+Kz - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 5)); - - V.val[0] = vResult0; - V.val[1] = vResult1; - V.val[2] = vResult2; - - vst3q_f32(reinterpret_cast(pOutputVector), V); - pOutputVector += sizeof(XMFLOAT3) * 4; - - i += 4; - } - } - } - - for (; i < VectorCount; i++) - { - float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); - float32x2_t zero = vdup_n_f32(0); - float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); - pInputVector += InputStride; - - XMVECTOR vResult = vmulq_lane_f32(row0, VL, 0); // X - vResult = vmlaq_lane_f32(vResult, row1, VL, 1); // Y - vResult = vmlaq_lane_f32(vResult, row2, VH, 0); // Z - - VL = vget_low_f32(vResult); - vst1_f32(reinterpret_cast(pOutputVector), VL); - vst1q_lane_f32(reinterpret_cast(pOutputVector) + 2, vResult, 2); - pOutputVector += OutputStride; - } - - return pOutputStream; -#elif defined(_XM_SSE_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row2 = M.r[2]; - - size_t i = 0; - size_t four = VectorCount >> 2; - if (four > 0) - { - if (InputStride == sizeof(XMFLOAT3)) - { - if (OutputStride == sizeof(XMFLOAT3)) - { - if (!(reinterpret_cast(pOutputStream) & 0xF)) - { - // Packed input, aligned & packed output - for (size_t j = 0; j < four; ++j) - { - __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); - __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); - __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); - pInputVector += sizeof(XMFLOAT3) * 4; - - // Unpack the 4 vectors (.w components are junk) - XM3UNPACK3INTO4(V1, L2, L3); - - // Result 1 - XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = _mm_mul_ps(Z, row2); - XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); - XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - V1 = _mm_add_ps(vTemp, vTemp3); - - // Result 2 - Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = _mm_mul_ps(Z, row2); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - V2 = _mm_add_ps(vTemp, vTemp3); - - // Result 3 - Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = _mm_mul_ps(Z, row2); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - V3 = _mm_add_ps(vTemp, vTemp3); - - // Result 4 - Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = _mm_mul_ps(Z, row2); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - V4 = _mm_add_ps(vTemp, vTemp3); - - // Pack and store the vectors - XM3PACK4INTO3(vTemp); - XM_STREAM_PS(reinterpret_cast(pOutputVector), V1); - XM_STREAM_PS(reinterpret_cast(pOutputVector + 16), vTemp); - XM_STREAM_PS(reinterpret_cast(pOutputVector + 32), V3); - pOutputVector += sizeof(XMFLOAT3) * 4; - i += 4; - } - } - else - { - // Packed input, unaligned & packed output - for (size_t j = 0; j < four; ++j) - { - __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); - __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); - __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); - pInputVector += sizeof(XMFLOAT3) * 4; - - // Unpack the 4 vectors (.w components are junk) - XM3UNPACK3INTO4(V1, L2, L3); - - // Result 1 - XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = _mm_mul_ps(Z, row2); - XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); - XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - V1 = _mm_add_ps(vTemp, vTemp3); - - // Result 2 - Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = _mm_mul_ps(Z, row2); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - V2 = _mm_add_ps(vTemp, vTemp3); - - // Result 3 - Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = _mm_mul_ps(Z, row2); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - V3 = _mm_add_ps(vTemp, vTemp3); - - // Result 4 - Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = _mm_mul_ps(Z, row2); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - V4 = _mm_add_ps(vTemp, vTemp3); - - // Pack and store the vectors - XM3PACK4INTO3(vTemp); - _mm_storeu_ps(reinterpret_cast(pOutputVector), V1); - _mm_storeu_ps(reinterpret_cast(pOutputVector + 16), vTemp); - _mm_storeu_ps(reinterpret_cast(pOutputVector + 32), V3); - pOutputVector += sizeof(XMFLOAT3) * 4; - i += 4; - } - } - } - else - { - // Packed input, unpacked output - for (size_t j = 0; j < four; ++j) - { - __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); - __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); - __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); - pInputVector += sizeof(XMFLOAT3) * 4; - - // Unpack the 4 vectors (.w components are junk) - XM3UNPACK3INTO4(V1, L2, L3); - - // Result 1 - XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = _mm_mul_ps(Z, row2); - XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); - XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - // Result 2 - Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = _mm_mul_ps(Z, row2); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - // Result 3 - Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = _mm_mul_ps(Z, row2); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - // Result 4 - Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = _mm_mul_ps(Z, row2); - vTemp2 = _mm_mul_ps(Y, row1); - vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - i += 4; - } - } - } - } - - for (; i < VectorCount; i++) - { - XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); - pInputVector += InputStride; - - XMVECTOR Z = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = _mm_mul_ps(Z, row2); - XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); - XMVECTOR vTemp3 = _mm_mul_ps(X, row0); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - } - - XM_SFENCE(); - - return pOutputStream; -#endif -} - -#ifdef _PREFAST_ -#pragma prefast(pop) -#endif - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3Project -( - FXMVECTOR V, - float ViewportX, - float ViewportY, - float ViewportWidth, - float ViewportHeight, - float ViewportMinZ, - float ViewportMaxZ, - FXMMATRIX Projection, - CXMMATRIX View, - CXMMATRIX World -) noexcept -{ - const float HalfViewportWidth = ViewportWidth * 0.5f; - const float HalfViewportHeight = ViewportHeight * 0.5f; - - XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 0.0f); - XMVECTOR Offset = XMVectorSet(ViewportX + HalfViewportWidth, ViewportY + HalfViewportHeight, ViewportMinZ, 0.0f); - - XMMATRIX Transform = XMMatrixMultiply(World, View); - Transform = XMMatrixMultiply(Transform, Projection); - - XMVECTOR Result = XMVector3TransformCoord(V, Transform); - - Result = XMVectorMultiplyAdd(Result, Scale, Offset); - - return Result; -} - -//------------------------------------------------------------------------------ - -#ifdef _PREFAST_ -#pragma prefast(push) -#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307" ) -#endif - -_Use_decl_annotations_ -inline XMFLOAT3* XM_CALLCONV XMVector3ProjectStream -( - XMFLOAT3* pOutputStream, - size_t OutputStride, - const XMFLOAT3* pInputStream, - size_t InputStride, - size_t VectorCount, - float ViewportX, - float ViewportY, - float ViewportWidth, - float ViewportHeight, - float ViewportMinZ, - float ViewportMaxZ, - FXMMATRIX Projection, - CXMMATRIX View, - CXMMATRIX World -) noexcept -{ - assert(pOutputStream != nullptr); - assert(pInputStream != nullptr); - - assert(InputStride >= sizeof(XMFLOAT3)); - _Analysis_assume_(InputStride >= sizeof(XMFLOAT3)); - - assert(OutputStride >= sizeof(XMFLOAT3)); - _Analysis_assume_(OutputStride >= sizeof(XMFLOAT3)); - -#if defined(_XM_NO_INTRINSICS_) - - const float HalfViewportWidth = ViewportWidth * 0.5f; - const float HalfViewportHeight = ViewportHeight * 0.5f; - - XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 1.0f); - XMVECTOR Offset = XMVectorSet(ViewportX + HalfViewportWidth, ViewportY + HalfViewportHeight, ViewportMinZ, 0.0f); - - XMMATRIX Transform = XMMatrixMultiply(World, View); - Transform = XMMatrixMultiply(Transform, Projection); - - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - for (size_t i = 0; i < VectorCount; i++) - { - XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); - - XMVECTOR Result = XMVector3TransformCoord(V, Transform); - Result = XMVectorMultiplyAdd(Result, Scale, Offset); - - XMStoreFloat3(reinterpret_cast(pOutputVector), Result); - - pInputVector += InputStride; - pOutputVector += OutputStride; - } - - return pOutputStream; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - const float HalfViewportWidth = ViewportWidth * 0.5f; - const float HalfViewportHeight = ViewportHeight * 0.5f; - - XMMATRIX Transform = XMMatrixMultiply(World, View); - Transform = XMMatrixMultiply(Transform, Projection); - - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - size_t i = 0; - size_t four = VectorCount >> 2; - if (four > 0) - { - if ((InputStride == sizeof(XMFLOAT3)) && (OutputStride == sizeof(XMFLOAT3))) - { - XMVECTOR ScaleX = vdupq_n_f32(HalfViewportWidth); - XMVECTOR ScaleY = vdupq_n_f32(-HalfViewportHeight); - XMVECTOR ScaleZ = vdupq_n_f32(ViewportMaxZ - ViewportMinZ); - - XMVECTOR OffsetX = vdupq_n_f32(ViewportX + HalfViewportWidth); - XMVECTOR OffsetY = vdupq_n_f32(ViewportY + HalfViewportHeight); - XMVECTOR OffsetZ = vdupq_n_f32(ViewportMinZ); - - for (size_t j = 0; j < four; ++j) - { - float32x4x3_t V = vld3q_f32(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT3) * 4; - - float32x2_t r3 = vget_low_f32(Transform.r[3]); - float32x2_t r = vget_low_f32(Transform.r[0]); - XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M - XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N - - XM_PREFETCH(pInputVector); - - r3 = vget_high_f32(Transform.r[3]); - r = vget_high_f32(Transform.r[0]); - XMVECTOR vResult2 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Cx+O - XMVECTOR W = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Dx+P - - XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); - - r = vget_low_f32(Transform.r[1]); - vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey+M - vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy+N - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); - - r = vget_high_f32(Transform.r[1]); - vResult2 = vmlaq_lane_f32(vResult2, V.val[1], r, 0); // Cx+Gy+O - W = vmlaq_lane_f32(W, V.val[1], r, 1); // Dx+Hy+P - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); - - r = vget_low_f32(Transform.r[2]); - vResult0 = vmlaq_lane_f32(vResult0, V.val[2], r, 0); // Ax+Ey+Iz+M - vResult1 = vmlaq_lane_f32(vResult1, V.val[2], r, 1); // Bx+Fy+Jz+N - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 4)); - - r = vget_high_f32(Transform.r[2]); - vResult2 = vmlaq_lane_f32(vResult2, V.val[2], r, 0); // Cx+Gy+Kz+O - W = vmlaq_lane_f32(W, V.val[2], r, 1); // Dx+Hy+Lz+P - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 5)); - - #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ - vResult0 = vdivq_f32(vResult0, W); - vResult1 = vdivq_f32(vResult1, W); - vResult2 = vdivq_f32(vResult2, W); - #else - // 2 iterations of Newton-Raphson refinement of reciprocal - float32x4_t Reciprocal = vrecpeq_f32(W); - float32x4_t S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - - vResult0 = vmulq_f32(vResult0, Reciprocal); - vResult1 = vmulq_f32(vResult1, Reciprocal); - vResult2 = vmulq_f32(vResult2, Reciprocal); - #endif - - V.val[0] = vmlaq_f32(OffsetX, vResult0, ScaleX); - V.val[1] = vmlaq_f32(OffsetY, vResult1, ScaleY); - V.val[2] = vmlaq_f32(OffsetZ, vResult2, ScaleZ); - - vst3q_f32(reinterpret_cast(pOutputVector), V); - pOutputVector += sizeof(XMFLOAT3) * 4; - - i += 4; - } - } - } - - if (i < VectorCount) - { - XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 1.0f); - XMVECTOR Offset = XMVectorSet(ViewportX + HalfViewportWidth, ViewportY + HalfViewportHeight, ViewportMinZ, 0.0f); - - for (; i < VectorCount; i++) - { - float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); - float32x2_t zero = vdup_n_f32(0); - float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); - pInputVector += InputStride; - - XMVECTOR vResult = vmlaq_lane_f32(Transform.r[3], Transform.r[0], VL, 0); // X - vResult = vmlaq_lane_f32(vResult, Transform.r[1], VL, 1); // Y - vResult = vmlaq_lane_f32(vResult, Transform.r[2], VH, 0); // Z - - VH = vget_high_f32(vResult); - XMVECTOR W = vdupq_lane_f32(VH, 1); - - #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ - vResult = vdivq_f32(vResult, W); - #else - // 2 iterations of Newton-Raphson refinement of reciprocal for W - float32x4_t Reciprocal = vrecpeq_f32(W); - float32x4_t S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - - vResult = vmulq_f32(vResult, Reciprocal); - #endif - - vResult = vmlaq_f32(Offset, vResult, Scale); - - VL = vget_low_f32(vResult); - vst1_f32(reinterpret_cast(pOutputVector), VL); - vst1q_lane_f32(reinterpret_cast(pOutputVector) + 2, vResult, 2); - pOutputVector += OutputStride; - } - } - - return pOutputStream; -#elif defined(_XM_SSE_INTRINSICS_) - const float HalfViewportWidth = ViewportWidth * 0.5f; - const float HalfViewportHeight = ViewportHeight * 0.5f; - - XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 1.0f); - XMVECTOR Offset = XMVectorSet(ViewportX + HalfViewportWidth, ViewportY + HalfViewportHeight, ViewportMinZ, 0.0f); - - XMMATRIX Transform = XMMatrixMultiply(World, View); - Transform = XMMatrixMultiply(Transform, Projection); - - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - size_t i = 0; - size_t four = VectorCount >> 2; - if (four > 0) - { - if (InputStride == sizeof(XMFLOAT3)) - { - if (OutputStride == sizeof(XMFLOAT3)) - { - if (!(reinterpret_cast(pOutputStream) & 0xF)) - { - // Packed input, aligned & packed output - for (size_t j = 0; j < four; ++j) - { - __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); - __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); - __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); - pInputVector += sizeof(XMFLOAT3) * 4; - - // Unpack the 4 vectors (.w components are junk) - XM3UNPACK3INTO4(V1, L2, L3); - - // Result 1 - XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - V1 = XM_FMADD_PS(vTemp, Scale, Offset); - - // Result 2 - Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - V2 = XM_FMADD_PS(vTemp, Scale, Offset); - - // Result 3 - Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - V3 = XM_FMADD_PS(vTemp, Scale, Offset); - - // Result 4 - Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - V4 = XM_FMADD_PS(vTemp, Scale, Offset); - - // Pack and store the vectors - XM3PACK4INTO3(vTemp); - XM_STREAM_PS(reinterpret_cast(pOutputVector), V1); - XM_STREAM_PS(reinterpret_cast(pOutputVector + 16), vTemp); - XM_STREAM_PS(reinterpret_cast(pOutputVector + 32), V3); - pOutputVector += sizeof(XMFLOAT3) * 4; - i += 4; - } - } - else - { - // Packed input, unaligned & packed output - for (size_t j = 0; j < four; ++j) - { - __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); - __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); - __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); - pInputVector += sizeof(XMFLOAT3) * 4; - - // Unpack the 4 vectors (.w components are junk) - XM3UNPACK3INTO4(V1, L2, L3); - - // Result 1 - XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - V1 = XM_FMADD_PS(vTemp, Scale, Offset); - - // Result 2 - Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - V2 = XM_FMADD_PS(vTemp, Scale, Offset); - - // Result 3 - Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - V3 = XM_FMADD_PS(vTemp, Scale, Offset); - - // Result 4 - Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - V4 = XM_FMADD_PS(vTemp, Scale, Offset); - - // Pack and store the vectors - XM3PACK4INTO3(vTemp); - _mm_storeu_ps(reinterpret_cast(pOutputVector), V1); - _mm_storeu_ps(reinterpret_cast(pOutputVector + 16), vTemp); - _mm_storeu_ps(reinterpret_cast(pOutputVector + 32), V3); - pOutputVector += sizeof(XMFLOAT3) * 4; - i += 4; - } - } - } - else - { - // Packed input, unpacked output - for (size_t j = 0; j < four; ++j) - { - __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); - __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); - __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); - pInputVector += sizeof(XMFLOAT3) * 4; - - // Unpack the 4 vectors (.w components are junk) - XM3UNPACK3INTO4(V1, L2, L3); - - // Result 1 - XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - vTemp = XM_FMADD_PS(vTemp, Scale, Offset); - - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - // Result 2 - Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - vTemp = XM_FMADD_PS(vTemp, Scale, Offset); - - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - // Result 3 - Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - vTemp = XM_FMADD_PS(vTemp, Scale, Offset); - - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - // Result 4 - Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - vTemp = XM_FMADD_PS(vTemp, Scale, Offset); - - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - i += 4; - } - } - } - } - - for (; i < VectorCount; i++) - { - XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); - pInputVector += InputStride; - - XMVECTOR Z = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - vTemp = XM_FMADD_PS(vTemp, Scale, Offset); - - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - } - - XM_SFENCE(); - - return pOutputStream; -#endif -} - -#ifdef _PREFAST_ -#pragma prefast(pop) -#endif - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector3Unproject -( - FXMVECTOR V, - float ViewportX, - float ViewportY, - float ViewportWidth, - float ViewportHeight, - float ViewportMinZ, - float ViewportMaxZ, - FXMMATRIX Projection, - CXMMATRIX View, - CXMMATRIX World -) noexcept -{ - static const XMVECTORF32 D = { { { -1.0f, 1.0f, 0.0f, 0.0f } } }; - - XMVECTOR Scale = XMVectorSet(ViewportWidth * 0.5f, -ViewportHeight * 0.5f, ViewportMaxZ - ViewportMinZ, 1.0f); - Scale = XMVectorReciprocal(Scale); - - XMVECTOR Offset = XMVectorSet(-ViewportX, -ViewportY, -ViewportMinZ, 0.0f); - Offset = XMVectorMultiplyAdd(Scale, Offset, D.v); - - XMMATRIX Transform = XMMatrixMultiply(World, View); - Transform = XMMatrixMultiply(Transform, Projection); - Transform = XMMatrixInverse(nullptr, Transform); - - XMVECTOR Result = XMVectorMultiplyAdd(V, Scale, Offset); - - return XMVector3TransformCoord(Result, Transform); -} - -//------------------------------------------------------------------------------ - -#ifdef _PREFAST_ -#pragma prefast(push) -#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307" ) -#endif - -_Use_decl_annotations_ -inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream -( - XMFLOAT3* pOutputStream, - size_t OutputStride, - const XMFLOAT3* pInputStream, - size_t InputStride, - size_t VectorCount, - float ViewportX, - float ViewportY, - float ViewportWidth, - float ViewportHeight, - float ViewportMinZ, - float ViewportMaxZ, - FXMMATRIX Projection, - CXMMATRIX View, - CXMMATRIX World -) noexcept -{ - assert(pOutputStream != nullptr); - assert(pInputStream != nullptr); - - assert(InputStride >= sizeof(XMFLOAT3)); - _Analysis_assume_(InputStride >= sizeof(XMFLOAT3)); - - assert(OutputStride >= sizeof(XMFLOAT3)); - _Analysis_assume_(OutputStride >= sizeof(XMFLOAT3)); - -#if defined(_XM_NO_INTRINSICS_) - - static const XMVECTORF32 D = { { { -1.0f, 1.0f, 0.0f, 0.0f } } }; - - XMVECTOR Scale = XMVectorSet(ViewportWidth * 0.5f, -ViewportHeight * 0.5f, ViewportMaxZ - ViewportMinZ, 1.0f); - Scale = XMVectorReciprocal(Scale); - - XMVECTOR Offset = XMVectorSet(-ViewportX, -ViewportY, -ViewportMinZ, 0.0f); - Offset = XMVectorMultiplyAdd(Scale, Offset, D.v); - - XMMATRIX Transform = XMMatrixMultiply(World, View); - Transform = XMMatrixMultiply(Transform, Projection); - Transform = XMMatrixInverse(nullptr, Transform); - - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - for (size_t i = 0; i < VectorCount; i++) - { - XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); - - XMVECTOR Result = XMVectorMultiplyAdd(V, Scale, Offset); - - Result = XMVector3TransformCoord(Result, Transform); - - XMStoreFloat3(reinterpret_cast(pOutputVector), Result); - - pInputVector += InputStride; - pOutputVector += OutputStride; - } - - return pOutputStream; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - XMMATRIX Transform = XMMatrixMultiply(World, View); - Transform = XMMatrixMultiply(Transform, Projection); - Transform = XMMatrixInverse(nullptr, Transform); - - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - float sx = 1.f / (ViewportWidth * 0.5f); - float sy = 1.f / (-ViewportHeight * 0.5f); - float sz = 1.f / (ViewportMaxZ - ViewportMinZ); - - float ox = (-ViewportX * sx) - 1.f; - float oy = (-ViewportY * sy) + 1.f; - float oz = (-ViewportMinZ * sz); - - size_t i = 0; - size_t four = VectorCount >> 2; - if (four > 0) - { - if ((InputStride == sizeof(XMFLOAT3)) && (OutputStride == sizeof(XMFLOAT3))) - { - for (size_t j = 0; j < four; ++j) - { - float32x4x3_t V = vld3q_f32(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT3) * 4; - - XMVECTOR ScaleX = vdupq_n_f32(sx); - XMVECTOR OffsetX = vdupq_n_f32(ox); - XMVECTOR VX = vmlaq_f32(OffsetX, ScaleX, V.val[0]); - - float32x2_t r3 = vget_low_f32(Transform.r[3]); - float32x2_t r = vget_low_f32(Transform.r[0]); - XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), VX, r, 0); // Ax+M - XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), VX, r, 1); // Bx+N - - XM_PREFETCH(pInputVector); - - r3 = vget_high_f32(Transform.r[3]); - r = vget_high_f32(Transform.r[0]); - XMVECTOR vResult2 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), VX, r, 0); // Cx+O - XMVECTOR W = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), VX, r, 1); // Dx+P - - XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); - - XMVECTOR ScaleY = vdupq_n_f32(sy); - XMVECTOR OffsetY = vdupq_n_f32(oy); - XMVECTOR VY = vmlaq_f32(OffsetY, ScaleY, V.val[1]); - - r = vget_low_f32(Transform.r[1]); - vResult0 = vmlaq_lane_f32(vResult0, VY, r, 0); // Ax+Ey+M - vResult1 = vmlaq_lane_f32(vResult1, VY, r, 1); // Bx+Fy+N - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); - - r = vget_high_f32(Transform.r[1]); - vResult2 = vmlaq_lane_f32(vResult2, VY, r, 0); // Cx+Gy+O - W = vmlaq_lane_f32(W, VY, r, 1); // Dx+Hy+P - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); - - XMVECTOR ScaleZ = vdupq_n_f32(sz); - XMVECTOR OffsetZ = vdupq_n_f32(oz); - XMVECTOR VZ = vmlaq_f32(OffsetZ, ScaleZ, V.val[2]); - - r = vget_low_f32(Transform.r[2]); - vResult0 = vmlaq_lane_f32(vResult0, VZ, r, 0); // Ax+Ey+Iz+M - vResult1 = vmlaq_lane_f32(vResult1, VZ, r, 1); // Bx+Fy+Jz+N - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 4)); - - r = vget_high_f32(Transform.r[2]); - vResult2 = vmlaq_lane_f32(vResult2, VZ, r, 0); // Cx+Gy+Kz+O - W = vmlaq_lane_f32(W, VZ, r, 1); // Dx+Hy+Lz+P - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 5)); - - #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ - V.val[0] = vdivq_f32(vResult0, W); - V.val[1] = vdivq_f32(vResult1, W); - V.val[2] = vdivq_f32(vResult2, W); - #else - // 2 iterations of Newton-Raphson refinement of reciprocal - float32x4_t Reciprocal = vrecpeq_f32(W); - float32x4_t S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - - V.val[0] = vmulq_f32(vResult0, Reciprocal); - V.val[1] = vmulq_f32(vResult1, Reciprocal); - V.val[2] = vmulq_f32(vResult2, Reciprocal); - #endif - - vst3q_f32(reinterpret_cast(pOutputVector), V); - pOutputVector += sizeof(XMFLOAT3) * 4; - - i += 4; - } - } - } - - if (i < VectorCount) - { - float32x2_t ScaleL = vcreate_f32( - static_cast(*reinterpret_cast(&sx)) - | (static_cast(*reinterpret_cast(&sy)) << 32)); - float32x2_t ScaleH = vcreate_f32(static_cast(*reinterpret_cast(&sz))); - - float32x2_t OffsetL = vcreate_f32( - static_cast(*reinterpret_cast(&ox)) - | (static_cast(*reinterpret_cast(&oy)) << 32)); - float32x2_t OffsetH = vcreate_f32(static_cast(*reinterpret_cast(&oz))); - - for (; i < VectorCount; i++) - { - float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); - float32x2_t zero = vdup_n_f32(0); - float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); - pInputVector += InputStride; - - VL = vmla_f32(OffsetL, VL, ScaleL); - VH = vmla_f32(OffsetH, VH, ScaleH); - - XMVECTOR vResult = vmlaq_lane_f32(Transform.r[3], Transform.r[0], VL, 0); // X - vResult = vmlaq_lane_f32(vResult, Transform.r[1], VL, 1); // Y - vResult = vmlaq_lane_f32(vResult, Transform.r[2], VH, 0); // Z - - VH = vget_high_f32(vResult); - XMVECTOR W = vdupq_lane_f32(VH, 1); - - #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ - vResult = vdivq_f32(vResult, W); - #else - // 2 iterations of Newton-Raphson refinement of reciprocal for W - float32x4_t Reciprocal = vrecpeq_f32(W); - float32x4_t S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - S = vrecpsq_f32(Reciprocal, W); - Reciprocal = vmulq_f32(S, Reciprocal); - - vResult = vmulq_f32(vResult, Reciprocal); - #endif - - VL = vget_low_f32(vResult); - vst1_f32(reinterpret_cast(pOutputVector), VL); - vst1q_lane_f32(reinterpret_cast(pOutputVector) + 2, vResult, 2); - pOutputVector += OutputStride; - } - } - - return pOutputStream; -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 D = { { { -1.0f, 1.0f, 0.0f, 0.0f } } }; - - XMVECTOR Scale = XMVectorSet(ViewportWidth * 0.5f, -ViewportHeight * 0.5f, ViewportMaxZ - ViewportMinZ, 1.0f); - Scale = XMVectorReciprocal(Scale); - - XMVECTOR Offset = XMVectorSet(-ViewportX, -ViewportY, -ViewportMinZ, 0.0f); - Offset = _mm_mul_ps(Scale, Offset); - Offset = _mm_add_ps(Offset, D); - - XMMATRIX Transform = XMMatrixMultiply(World, View); - Transform = XMMatrixMultiply(Transform, Projection); - Transform = XMMatrixInverse(nullptr, Transform); - - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - size_t i = 0; - size_t four = VectorCount >> 2; - if (four > 0) - { - if (InputStride == sizeof(XMFLOAT3)) - { - if (OutputStride == sizeof(XMFLOAT3)) - { - if (!(reinterpret_cast(pOutputStream) & 0xF)) - { - // Packed input, aligned & packed output - for (size_t j = 0; j < four; ++j) - { - __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); - __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); - __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); - pInputVector += sizeof(XMFLOAT3) * 4; - - // Unpack the 4 vectors (.w components are junk) - XM3UNPACK3INTO4(V1, L2, L3); - - // Result 1 - V1 = XM_FMADD_PS(V1, Scale, Offset); - - XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - V1 = _mm_div_ps(vTemp, W); - - // Result 2 - V2 = XM_FMADD_PS(V2, Scale, Offset); - - Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - V2 = _mm_div_ps(vTemp, W); - - // Result 3 - V3 = XM_FMADD_PS(V3, Scale, Offset); - - Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - V3 = _mm_div_ps(vTemp, W); - - // Result 4 - V4 = XM_FMADD_PS(V4, Scale, Offset); - - Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - V4 = _mm_div_ps(vTemp, W); - - // Pack and store the vectors - XM3PACK4INTO3(vTemp); - XM_STREAM_PS(reinterpret_cast(pOutputVector), V1); - XM_STREAM_PS(reinterpret_cast(pOutputVector + 16), vTemp); - XM_STREAM_PS(reinterpret_cast(pOutputVector + 32), V3); - pOutputVector += sizeof(XMFLOAT3) * 4; - i += 4; - } - } - else - { - // Packed input, unaligned & packed output - for (size_t j = 0; j < four; ++j) - { - __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); - __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); - __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); - pInputVector += sizeof(XMFLOAT3) * 4; - - // Unpack the 4 vectors (.w components are junk) - XM3UNPACK3INTO4(V1, L2, L3); - - // Result 1 - V1 = XM_FMADD_PS(V1, Scale, Offset); - - XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - V1 = _mm_div_ps(vTemp, W); - - // Result 2 - V2 = XM_FMADD_PS(V2, Scale, Offset); - - Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - V2 = _mm_div_ps(vTemp, W); - - // Result 3 - V3 = XM_FMADD_PS(V3, Scale, Offset); - - Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - V3 = _mm_div_ps(vTemp, W); - - // Result 4 - V4 = XM_FMADD_PS(V4, Scale, Offset); - - Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - V4 = _mm_div_ps(vTemp, W); - - // Pack and store the vectors - XM3PACK4INTO3(vTemp); - _mm_storeu_ps(reinterpret_cast(pOutputVector), V1); - _mm_storeu_ps(reinterpret_cast(pOutputVector + 16), vTemp); - _mm_storeu_ps(reinterpret_cast(pOutputVector + 32), V3); - pOutputVector += sizeof(XMFLOAT3) * 4; - i += 4; - } - } - } - else - { - // Packed input, unpacked output - for (size_t j = 0; j < four; ++j) - { - __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); - __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); - __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); - pInputVector += sizeof(XMFLOAT3) * 4; - - // Unpack the 4 vectors (.w components are junk) - XM3UNPACK3INTO4(V1, L2, L3); - - // Result 1 - V1 = XM_FMADD_PS(V1, Scale, Offset); - - XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - // Result 2 - V2 = XM_FMADD_PS(V2, Scale, Offset); - - Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - // Result 3 - V3 = XM_FMADD_PS(V3, Scale, Offset); - - Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - // Result 4 - V4 = XM_FMADD_PS(V4, Scale, Offset); - - Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); - Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); - X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); - - vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - - i += 4; - } - } - } - } - - for (; i < VectorCount; i++) - { - XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); - pInputVector += InputStride; - - V = _mm_mul_ps(V, Scale); - V = _mm_add_ps(V, Offset); - - XMVECTOR Z = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - - XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); - XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); - XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); - vTemp = _mm_add_ps(vTemp, vTemp2); - vTemp = _mm_add_ps(vTemp, vTemp3); - - XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); - vTemp = _mm_div_ps(vTemp, W); - - XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); - pOutputVector += OutputStride; - } - - XM_SFENCE(); - - return pOutputStream; -#endif -} - -#ifdef _PREFAST_ -#pragma prefast(pop) -#endif - -/**************************************************************************** - * - * 4D Vector - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ -// Comparison operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector4Equal -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] == V2.vector4_f32[0]) && (V1.vector4_f32[1] == V2.vector4_f32[1]) && (V1.vector4_f32[2] == V2.vector4_f32[2]) && (V1.vector4_f32[3] == V2.vector4_f32[3])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); - return ((_mm_movemask_ps(vTemp) == 0x0f) != 0); -#else - return XMComparisonAllTrue(XMVector4EqualR(V1, V2)); -#endif -} - -//------------------------------------------------------------------------------ - -inline uint32_t XM_CALLCONV XMVector4EqualR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - uint32_t CR = 0; - - if ((V1.vector4_f32[0] == V2.vector4_f32[0]) && - (V1.vector4_f32[1] == V2.vector4_f32[1]) && - (V1.vector4_f32[2] == V2.vector4_f32[2]) && - (V1.vector4_f32[3] == V2.vector4_f32[3])) - { - CR = XM_CRMASK_CR6TRUE; - } - else if ((V1.vector4_f32[0] != V2.vector4_f32[0]) && - (V1.vector4_f32[1] != V2.vector4_f32[1]) && - (V1.vector4_f32[2] != V2.vector4_f32[2]) && - (V1.vector4_f32[3] != V2.vector4_f32[3])) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); - - uint32_t CR = 0; - if (r == 0xFFFFFFFFU) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!r) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); - int iTest = _mm_movemask_ps(vTemp); - uint32_t CR = 0; - if (iTest == 0xf) // All equal? - { - CR = XM_CRMASK_CR6TRUE; - } - else if (iTest == 0) // All not equal? - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector4EqualInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_u32[0] == V2.vector4_u32[0]) && (V1.vector4_u32[1] == V2.vector4_u32[1]) && (V1.vector4_u32[2] == V2.vector4_u32[2]) && (V1.vector4_u32[3] == V2.vector4_u32[3])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); - return ((_mm_movemask_ps(_mm_castsi128_ps(vTemp)) == 0xf) != 0); -#else - return XMComparisonAllTrue(XMVector4EqualIntR(V1, V2)); -#endif -} - -//------------------------------------------------------------------------------ - -inline uint32_t XM_CALLCONV XMVector4EqualIntR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - uint32_t CR = 0; - if (V1.vector4_u32[0] == V2.vector4_u32[0] && - V1.vector4_u32[1] == V2.vector4_u32[1] && - V1.vector4_u32[2] == V2.vector4_u32[2] && - V1.vector4_u32[3] == V2.vector4_u32[3]) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (V1.vector4_u32[0] != V2.vector4_u32[0] && - V1.vector4_u32[1] != V2.vector4_u32[1] && - V1.vector4_u32[2] != V2.vector4_u32[2] && - V1.vector4_u32[3] != V2.vector4_u32[3]) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); - - uint32_t CR = 0; - if (r == 0xFFFFFFFFU) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!r) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#elif defined(_XM_SSE_INTRINSICS_) - __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); - int iTest = _mm_movemask_ps(_mm_castsi128_ps(vTemp)); - uint32_t CR = 0; - if (iTest == 0xf) // All equal? - { - CR = XM_CRMASK_CR6TRUE; - } - else if (iTest == 0) // All not equal? - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#endif -} - -inline bool XM_CALLCONV XMVector4NearEqual -( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR Epsilon -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - float dx, dy, dz, dw; - - dx = fabsf(V1.vector4_f32[0] - V2.vector4_f32[0]); - dy = fabsf(V1.vector4_f32[1] - V2.vector4_f32[1]); - dz = fabsf(V1.vector4_f32[2] - V2.vector4_f32[2]); - dw = fabsf(V1.vector4_f32[3] - V2.vector4_f32[3]); - return (((dx <= Epsilon.vector4_f32[0]) && - (dy <= Epsilon.vector4_f32[1]) && - (dz <= Epsilon.vector4_f32[2]) && - (dw <= Epsilon.vector4_f32[3])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t vDelta = vsubq_f32(V1, V2); -#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) - uint32x4_t vResult = vacleq_f32(vDelta, Epsilon); -#else - uint32x4_t vResult = vcleq_f32(vabsq_f32(vDelta), Epsilon); -#endif - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - // Get the difference - XMVECTOR vDelta = _mm_sub_ps(V1, V2); - // Get the absolute value of the difference - XMVECTOR vTemp = _mm_setzero_ps(); - vTemp = _mm_sub_ps(vTemp, vDelta); - vTemp = _mm_max_ps(vTemp, vDelta); - vTemp = _mm_cmple_ps(vTemp, Epsilon); - return ((_mm_movemask_ps(vTemp) == 0xf) != 0); -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector4NotEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] != V2.vector4_f32[0]) || (V1.vector4_f32[1] != V2.vector4_f32[1]) || (V1.vector4_f32[2] != V2.vector4_f32[2]) || (V1.vector4_f32[3] != V2.vector4_f32[3])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) != 0xFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpneq_ps(V1, V2); - return ((_mm_movemask_ps(vTemp)) != 0); -#else - return XMComparisonAnyFalse(XMVector4EqualR(V1, V2)); -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector4NotEqualInt -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_u32[0] != V2.vector4_u32[0]) || (V1.vector4_u32[1] != V2.vector4_u32[1]) || (V1.vector4_u32[2] != V2.vector4_u32[2]) || (V1.vector4_u32[3] != V2.vector4_u32[3])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) != 0xFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); - return ((_mm_movemask_ps(_mm_castsi128_ps(vTemp)) != 0xF) != 0); -#else - return XMComparisonAnyFalse(XMVector4EqualIntR(V1, V2)); -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector4Greater -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] > V2.vector4_f32[0]) && (V1.vector4_f32[1] > V2.vector4_f32[1]) && (V1.vector4_f32[2] > V2.vector4_f32[2]) && (V1.vector4_f32[3] > V2.vector4_f32[3])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgtq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); - return ((_mm_movemask_ps(vTemp) == 0x0f) != 0); -#else - return XMComparisonAllTrue(XMVector4GreaterR(V1, V2)); -#endif -} - -//------------------------------------------------------------------------------ - -inline uint32_t XM_CALLCONV XMVector4GreaterR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - uint32_t CR = 0; - if (V1.vector4_f32[0] > V2.vector4_f32[0] && - V1.vector4_f32[1] > V2.vector4_f32[1] && - V1.vector4_f32[2] > V2.vector4_f32[2] && - V1.vector4_f32[3] > V2.vector4_f32[3]) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (V1.vector4_f32[0] <= V2.vector4_f32[0] && - V1.vector4_f32[1] <= V2.vector4_f32[1] && - V1.vector4_f32[2] <= V2.vector4_f32[2] && - V1.vector4_f32[3] <= V2.vector4_f32[3]) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgtq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); - - uint32_t CR = 0; - if (r == 0xFFFFFFFFU) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!r) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#elif defined(_XM_SSE_INTRINSICS_) - uint32_t CR = 0; - XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); - int iTest = _mm_movemask_ps(vTemp); - if (iTest == 0xf) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!iTest) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector4GreaterOrEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] >= V2.vector4_f32[0]) && (V1.vector4_f32[1] >= V2.vector4_f32[1]) && (V1.vector4_f32[2] >= V2.vector4_f32[2]) && (V1.vector4_f32[3] >= V2.vector4_f32[3])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgeq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); - return ((_mm_movemask_ps(vTemp) == 0x0f) != 0); -#else - return XMComparisonAllTrue(XMVector4GreaterOrEqualR(V1, V2)); -#endif -} - -//------------------------------------------------------------------------------ - -inline uint32_t XM_CALLCONV XMVector4GreaterOrEqualR -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - uint32_t CR = 0; - if ((V1.vector4_f32[0] >= V2.vector4_f32[0]) && - (V1.vector4_f32[1] >= V2.vector4_f32[1]) && - (V1.vector4_f32[2] >= V2.vector4_f32[2]) && - (V1.vector4_f32[3] >= V2.vector4_f32[3])) - { - CR = XM_CRMASK_CR6TRUE; - } - else if ((V1.vector4_f32[0] < V2.vector4_f32[0]) && - (V1.vector4_f32[1] < V2.vector4_f32[1]) && - (V1.vector4_f32[2] < V2.vector4_f32[2]) && - (V1.vector4_f32[3] < V2.vector4_f32[3])) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcgeq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); - - uint32_t CR = 0; - if (r == 0xFFFFFFFFU) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!r) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#elif defined(_XM_SSE_INTRINSICS_) - uint32_t CR = 0; - XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); - int iTest = _mm_movemask_ps(vTemp); - if (iTest == 0x0f) - { - CR = XM_CRMASK_CR6TRUE; - } - else if (!iTest) - { - CR = XM_CRMASK_CR6FALSE; - } - return CR; -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector4Less -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] < V2.vector4_f32[0]) && (V1.vector4_f32[1] < V2.vector4_f32[1]) && (V1.vector4_f32[2] < V2.vector4_f32[2]) && (V1.vector4_f32[3] < V2.vector4_f32[3])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcltq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmplt_ps(V1, V2); - return ((_mm_movemask_ps(vTemp) == 0x0f) != 0); -#else - return XMComparisonAllTrue(XMVector4GreaterR(V2, V1)); -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector4LessOrEqual -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V1.vector4_f32[0] <= V2.vector4_f32[0]) && (V1.vector4_f32[1] <= V2.vector4_f32[1]) && (V1.vector4_f32[2] <= V2.vector4_f32[2]) && (V1.vector4_f32[3] <= V2.vector4_f32[3])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vResult = vcleq_f32(V1, V2); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp = _mm_cmple_ps(V1, V2); - return ((_mm_movemask_ps(vTemp) == 0x0f) != 0); -#else - return XMComparisonAllTrue(XMVector4GreaterOrEqualR(V2, V1)); -#endif -} - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector4InBounds -( - FXMVECTOR V, - FXMVECTOR Bounds -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (((V.vector4_f32[0] <= Bounds.vector4_f32[0] && V.vector4_f32[0] >= -Bounds.vector4_f32[0]) && - (V.vector4_f32[1] <= Bounds.vector4_f32[1] && V.vector4_f32[1] >= -Bounds.vector4_f32[1]) && - (V.vector4_f32[2] <= Bounds.vector4_f32[2] && V.vector4_f32[2] >= -Bounds.vector4_f32[2]) && - (V.vector4_f32[3] <= Bounds.vector4_f32[3] && V.vector4_f32[3] >= -Bounds.vector4_f32[3])) != 0); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Test if less than or equal - uint32x4_t ivTemp1 = vcleq_f32(V, Bounds); - // Negate the bounds - float32x4_t vTemp2 = vnegq_f32(Bounds); - // Test if greater or equal (Reversed) - uint32x4_t ivTemp2 = vcleq_f32(vTemp2, V); - // Blend answers - ivTemp1 = vandq_u32(ivTemp1, ivTemp2); - // in bounds? - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(ivTemp1)), vget_high_u8(vreinterpretq_u8_u32(ivTemp1))); - uint16x4x2_t vTemp3 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return (vget_lane_u32(vreinterpret_u32_u16(vTemp3.val[1]), 1) == 0xFFFFFFFFU); -#elif defined(_XM_SSE_INTRINSICS_) - // Test if less than or equal - XMVECTOR vTemp1 = _mm_cmple_ps(V, Bounds); - // Negate the bounds - XMVECTOR vTemp2 = _mm_mul_ps(Bounds, g_XMNegativeOne); - // Test if greater or equal (Reversed) - vTemp2 = _mm_cmple_ps(vTemp2, V); - // Blend answers - vTemp1 = _mm_and_ps(vTemp1, vTemp2); - // All in bounds? - return ((_mm_movemask_ps(vTemp1) == 0x0f) != 0); -#else - return XMComparisonAllInBounds(XMVector4InBoundsR(V, Bounds)); -#endif -} - -//------------------------------------------------------------------------------ - -#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) -#pragma float_control(push) -#pragma float_control(precise, on) -#endif - -inline bool XM_CALLCONV XMVector4IsNaN(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - return (XMISNAN(V.vector4_f32[0]) || - XMISNAN(V.vector4_f32[1]) || - XMISNAN(V.vector4_f32[2]) || - XMISNAN(V.vector4_f32[3])); -#elif defined(_XM_ARM_NEON_INTRINSICS_) -#if defined(__clang__) && defined(__FINITE_MATH_ONLY__) - return isnan(vgetq_lane_f32(V, 0)) || isnan(vgetq_lane_f32(V, 1)) || isnan(vgetq_lane_f32(V, 2)) || isnan(vgetq_lane_f32(V, 3)); -#else -// Test against itself. NaN is always not equal - uint32x4_t vTempNan = vceqq_f32(V, V); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTempNan)), vget_high_u8(vreinterpretq_u8_u32(vTempNan))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - // If any are NaN, the mask is zero - return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) != 0xFFFFFFFFU); -#endif -#elif defined(_XM_SSE_INTRINSICS_) -#if defined(__clang__) && defined(__FINITE_MATH_ONLY__) - XM_ALIGNED_DATA(16) float tmp[4]; - _mm_store_ps(tmp, V); - return isnan(tmp[0]) || isnan(tmp[1]) || isnan(tmp[2]) || isnan(tmp[3]); -#else -// Test against itself. NaN is always not equal - XMVECTOR vTempNan = _mm_cmpneq_ps(V, V); - // If any are NaN, the mask is non-zero - return (_mm_movemask_ps(vTempNan) != 0); -#endif -#endif -} - -#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) -#pragma float_control(pop) -#endif - -//------------------------------------------------------------------------------ - -inline bool XM_CALLCONV XMVector4IsInfinite(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - return (XMISINF(V.vector4_f32[0]) || - XMISINF(V.vector4_f32[1]) || - XMISINF(V.vector4_f32[2]) || - XMISINF(V.vector4_f32[3])); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Mask off the sign bit - uint32x4_t vTempInf = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); - // Compare to infinity - vTempInf = vceqq_f32(vreinterpretq_f32_u32(vTempInf), g_XMInfinity); - // If any are infinity, the signs are true. - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTempInf)), vget_high_u8(vreinterpretq_u8_u32(vTempInf))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) != 0); -#elif defined(_XM_SSE_INTRINSICS_) - // Mask off the sign bit - XMVECTOR vTemp = _mm_and_ps(V, g_XMAbsMask); - // Compare to infinity - vTemp = _mm_cmpeq_ps(vTemp, g_XMInfinity); - // If any are infinity, the signs are true. - return (_mm_movemask_ps(vTemp) != 0); -#endif -} - -//------------------------------------------------------------------------------ -// Computation operations -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector4Dot -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORF32 Result; - Result.f[0] = - Result.f[1] = - Result.f[2] = - Result.f[3] = V1.vector4_f32[0] * V2.vector4_f32[0] + V1.vector4_f32[1] * V2.vector4_f32[1] + V1.vector4_f32[2] * V2.vector4_f32[2] + V1.vector4_f32[3] * V2.vector4_f32[3]; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t vTemp = vmulq_f32(V1, V2); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vadd_f32(v1, v2); - v1 = vpadd_f32(v1, v1); - return vcombine_f32(v1, v1); -#elif defined(_XM_SSE4_INTRINSICS_) - return _mm_dp_ps(V1, V2, 0xff); -#elif defined(_XM_SSE3_INTRINSICS_) - XMVECTOR vTemp = _mm_mul_ps(V1, V2); - vTemp = _mm_hadd_ps(vTemp, vTemp); - return _mm_hadd_ps(vTemp, vTemp); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vTemp2 = V2; - XMVECTOR vTemp = _mm_mul_ps(V1, vTemp2); - vTemp2 = _mm_shuffle_ps(vTemp2, vTemp, _MM_SHUFFLE(1, 0, 0, 0)); // Copy X to the Z position and Y to the W position - vTemp2 = _mm_add_ps(vTemp2, vTemp); // Add Z = X+Z; W = Y+W; - vTemp = _mm_shuffle_ps(vTemp, vTemp2, _MM_SHUFFLE(0, 3, 0, 0)); // Copy W to the Z position - vTemp = _mm_add_ps(vTemp, vTemp2); // Add Z and W together - return XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(2, 2, 2, 2)); // Splat Z and return -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector4Cross -( - FXMVECTOR V1, - FXMVECTOR V2, - FXMVECTOR V3 -) noexcept -{ - // [ ((v2.z*v3.w-v2.w*v3.z)*v1.y)-((v2.y*v3.w-v2.w*v3.y)*v1.z)+((v2.y*v3.z-v2.z*v3.y)*v1.w), - // ((v2.w*v3.z-v2.z*v3.w)*v1.x)-((v2.w*v3.x-v2.x*v3.w)*v1.z)+((v2.z*v3.x-v2.x*v3.z)*v1.w), - // ((v2.y*v3.w-v2.w*v3.y)*v1.x)-((v2.x*v3.w-v2.w*v3.x)*v1.y)+((v2.x*v3.y-v2.y*v3.x)*v1.w), - // ((v2.z*v3.y-v2.y*v3.z)*v1.x)-((v2.z*v3.x-v2.x*v3.z)*v1.y)+((v2.y*v3.x-v2.x*v3.y)*v1.z) ] - -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORF32 Result = { { { - (((V2.vector4_f32[2] * V3.vector4_f32[3]) - (V2.vector4_f32[3] * V3.vector4_f32[2])) * V1.vector4_f32[1]) - (((V2.vector4_f32[1] * V3.vector4_f32[3]) - (V2.vector4_f32[3] * V3.vector4_f32[1])) * V1.vector4_f32[2]) + (((V2.vector4_f32[1] * V3.vector4_f32[2]) - (V2.vector4_f32[2] * V3.vector4_f32[1])) * V1.vector4_f32[3]), - (((V2.vector4_f32[3] * V3.vector4_f32[2]) - (V2.vector4_f32[2] * V3.vector4_f32[3])) * V1.vector4_f32[0]) - (((V2.vector4_f32[3] * V3.vector4_f32[0]) - (V2.vector4_f32[0] * V3.vector4_f32[3])) * V1.vector4_f32[2]) + (((V2.vector4_f32[2] * V3.vector4_f32[0]) - (V2.vector4_f32[0] * V3.vector4_f32[2])) * V1.vector4_f32[3]), - (((V2.vector4_f32[1] * V3.vector4_f32[3]) - (V2.vector4_f32[3] * V3.vector4_f32[1])) * V1.vector4_f32[0]) - (((V2.vector4_f32[0] * V3.vector4_f32[3]) - (V2.vector4_f32[3] * V3.vector4_f32[0])) * V1.vector4_f32[1]) + (((V2.vector4_f32[0] * V3.vector4_f32[1]) - (V2.vector4_f32[1] * V3.vector4_f32[0])) * V1.vector4_f32[3]), - (((V2.vector4_f32[2] * V3.vector4_f32[1]) - (V2.vector4_f32[1] * V3.vector4_f32[2])) * V1.vector4_f32[0]) - (((V2.vector4_f32[2] * V3.vector4_f32[0]) - (V2.vector4_f32[0] * V3.vector4_f32[2])) * V1.vector4_f32[1]) + (((V2.vector4_f32[1] * V3.vector4_f32[0]) - (V2.vector4_f32[0] * V3.vector4_f32[1])) * V1.vector4_f32[2]), - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - const uint32x2_t select = vget_low_u32(g_XMMaskX); - - // Term1: V2zwyz * V3wzwy - const float32x2_t v2xy = vget_low_f32(V2); - const float32x2_t v2zw = vget_high_f32(V2); - const float32x2_t v2yx = vrev64_f32(v2xy); - const float32x2_t v2wz = vrev64_f32(v2zw); - const float32x2_t v2yz = vbsl_f32(select, v2yx, v2wz); - - const float32x2_t v3zw = vget_high_f32(V3); - const float32x2_t v3wz = vrev64_f32(v3zw); - const float32x2_t v3xy = vget_low_f32(V3); - const float32x2_t v3wy = vbsl_f32(select, v3wz, v3xy); - - float32x4_t vTemp1 = vcombine_f32(v2zw, v2yz); - float32x4_t vTemp2 = vcombine_f32(v3wz, v3wy); - XMVECTOR vResult = vmulq_f32(vTemp1, vTemp2); - - // - V2wzwy * V3zwyz - const float32x2_t v2wy = vbsl_f32(select, v2wz, v2xy); - - const float32x2_t v3yx = vrev64_f32(v3xy); - const float32x2_t v3yz = vbsl_f32(select, v3yx, v3wz); - - vTemp1 = vcombine_f32(v2wz, v2wy); - vTemp2 = vcombine_f32(v3zw, v3yz); - vResult = vmlsq_f32(vResult, vTemp1, vTemp2); - - // term1 * V1yxxx - const float32x2_t v1xy = vget_low_f32(V1); - const float32x2_t v1yx = vrev64_f32(v1xy); - - vTemp1 = vcombine_f32(v1yx, vdup_lane_f32(v1yx, 1)); - vResult = vmulq_f32(vResult, vTemp1); - - // Term2: V2ywxz * V3wxwx - const float32x2_t v2yw = vrev64_f32(v2wy); - const float32x2_t v2xz = vbsl_f32(select, v2xy, v2wz); - - const float32x2_t v3wx = vbsl_f32(select, v3wz, v3yx); - - vTemp1 = vcombine_f32(v2yw, v2xz); - vTemp2 = vcombine_f32(v3wx, v3wx); - float32x4_t vTerm = vmulq_f32(vTemp1, vTemp2); - - // - V2wxwx * V3ywxz - const float32x2_t v2wx = vbsl_f32(select, v2wz, v2yx); - - const float32x2_t v3yw = vrev64_f32(v3wy); - const float32x2_t v3xz = vbsl_f32(select, v3xy, v3wz); - - vTemp1 = vcombine_f32(v2wx, v2wx); - vTemp2 = vcombine_f32(v3yw, v3xz); - vTerm = vmlsq_f32(vTerm, vTemp1, vTemp2); - - // vResult - term2 * V1zzyy - const float32x2_t v1zw = vget_high_f32(V1); - - vTemp1 = vcombine_f32(vdup_lane_f32(v1zw, 0), vdup_lane_f32(v1yx, 0)); - vResult = vmlsq_f32(vResult, vTerm, vTemp1); - - // Term3: V2yzxy * V3zxyx - const float32x2_t v3zx = vrev64_f32(v3xz); - - vTemp1 = vcombine_f32(v2yz, v2xy); - vTemp2 = vcombine_f32(v3zx, v3yx); - vTerm = vmulq_f32(vTemp1, vTemp2); - - // - V2zxyx * V3yzxy - const float32x2_t v2zx = vrev64_f32(v2xz); - - vTemp1 = vcombine_f32(v2zx, v2yx); - vTemp2 = vcombine_f32(v3yz, v3xy); - vTerm = vmlsq_f32(vTerm, vTemp1, vTemp2); - - // vResult + term3 * V1wwwz - const float32x2_t v1wz = vrev64_f32(v1zw); - - vTemp1 = vcombine_f32(vdup_lane_f32(v1wz, 0), v1wz); - return vmlaq_f32(vResult, vTerm, vTemp1); -#elif defined(_XM_SSE_INTRINSICS_) - // V2zwyz * V3wzwy - XMVECTOR vResult = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 1, 3, 2)); - XMVECTOR vTemp3 = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 3, 2, 3)); - vResult = _mm_mul_ps(vResult, vTemp3); - // - V2wzwy * V3zwyz - XMVECTOR vTemp2 = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 3, 2, 3)); - vTemp3 = XM_PERMUTE_PS(vTemp3, _MM_SHUFFLE(1, 3, 0, 1)); - vResult = XM_FNMADD_PS(vTemp2, vTemp3, vResult); - // term1 * V1yxxx - XMVECTOR vTemp1 = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 1)); - vResult = _mm_mul_ps(vResult, vTemp1); - - // V2ywxz * V3wxwx - vTemp2 = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 0, 3, 1)); - vTemp3 = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 3, 0, 3)); - vTemp3 = _mm_mul_ps(vTemp3, vTemp2); - // - V2wxwx * V3ywxz - vTemp2 = XM_PERMUTE_PS(vTemp2, _MM_SHUFFLE(2, 1, 2, 1)); - vTemp1 = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 0, 3, 1)); - vTemp3 = XM_FNMADD_PS(vTemp2, vTemp1, vTemp3); - // vResult - temp * V1zzyy - vTemp1 = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 2, 2)); - vResult = XM_FNMADD_PS(vTemp1, vTemp3, vResult); - - // V2yzxy * V3zxyx - vTemp2 = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 0, 2, 1)); - vTemp3 = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 1, 0, 2)); - vTemp3 = _mm_mul_ps(vTemp3, vTemp2); - // - V2zxyx * V3yzxy - vTemp2 = XM_PERMUTE_PS(vTemp2, _MM_SHUFFLE(2, 0, 2, 1)); - vTemp1 = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 0, 2, 1)); - vTemp3 = XM_FNMADD_PS(vTemp1, vTemp2, vTemp3); - // vResult + term * V1wwwz - vTemp1 = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 3, 3, 3)); - vResult = XM_FMADD_PS(vTemp3, vTemp1, vResult); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector4LengthSq(FXMVECTOR V) noexcept -{ - return XMVector4Dot(V, V); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector4ReciprocalLengthEst(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Result; - - Result = XMVector4LengthSq(V); - Result = XMVectorReciprocalSqrtEst(Result); - - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Dot4 - float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vadd_f32(v1, v2); - v1 = vpadd_f32(v1, v1); - // Reciprocal sqrt (estimate) - v2 = vrsqrte_f32(v1); - return vcombine_f32(v2, v2); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); - return _mm_rsqrt_ps(vTemp); -#elif defined(_XM_SSE3_INTRINSICS_) - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_rsqrt_ps(vLengthSq); - return vLengthSq; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product on x,y,z and w - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - // vTemp has z and w - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(3, 2, 3, 2)); - // x+z, y+w - vLengthSq = _mm_add_ps(vLengthSq, vTemp); - // x+z,x+z,x+z,y+w - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 0, 0, 0)); - // ??,??,y+w,y+w - vTemp = _mm_shuffle_ps(vTemp, vLengthSq, _MM_SHUFFLE(3, 3, 0, 0)); - // ??,??,x+z+y+w,?? - vLengthSq = _mm_add_ps(vLengthSq, vTemp); - // Splat the length - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 2, 2, 2)); - // Get the reciprocal - vLengthSq = _mm_rsqrt_ps(vLengthSq); - return vLengthSq; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector4ReciprocalLength(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Result; - - Result = XMVector4LengthSq(V); - Result = XMVectorReciprocalSqrt(Result); - - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Dot4 - float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vadd_f32(v1, v2); - v1 = vpadd_f32(v1, v1); - // Reciprocal sqrt - float32x2_t S0 = vrsqrte_f32(v1); - float32x2_t P0 = vmul_f32(v1, S0); - float32x2_t R0 = vrsqrts_f32(P0, S0); - float32x2_t S1 = vmul_f32(S0, R0); - float32x2_t P1 = vmul_f32(v1, S1); - float32x2_t R1 = vrsqrts_f32(P1, S1); - float32x2_t Result = vmul_f32(S1, R1); - return vcombine_f32(Result, Result); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); - XMVECTOR vLengthSq = _mm_sqrt_ps(vTemp); - return _mm_div_ps(g_XMOne, vLengthSq); -#elif defined(_XM_SSE3_INTRINSICS_) - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_sqrt_ps(vLengthSq); - vLengthSq = _mm_div_ps(g_XMOne, vLengthSq); - return vLengthSq; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product on x,y,z and w - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - // vTemp has z and w - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(3, 2, 3, 2)); - // x+z, y+w - vLengthSq = _mm_add_ps(vLengthSq, vTemp); - // x+z,x+z,x+z,y+w - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 0, 0, 0)); - // ??,??,y+w,y+w - vTemp = _mm_shuffle_ps(vTemp, vLengthSq, _MM_SHUFFLE(3, 3, 0, 0)); - // ??,??,x+z+y+w,?? - vLengthSq = _mm_add_ps(vLengthSq, vTemp); - // Splat the length - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 2, 2, 2)); - // Get the reciprocal - vLengthSq = _mm_sqrt_ps(vLengthSq); - // Accurate! - vLengthSq = _mm_div_ps(g_XMOne, vLengthSq); - return vLengthSq; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector4LengthEst(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Result; - - Result = XMVector4LengthSq(V); - Result = XMVectorSqrtEst(Result); - - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Dot4 - float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vadd_f32(v1, v2); - v1 = vpadd_f32(v1, v1); - const float32x2_t zero = vdup_n_f32(0); - uint32x2_t VEqualsZero = vceq_f32(v1, zero); - // Sqrt (estimate) - float32x2_t Result = vrsqrte_f32(v1); - Result = vmul_f32(v1, Result); - Result = vbsl_f32(VEqualsZero, zero, Result); - return vcombine_f32(Result, Result); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); - return _mm_sqrt_ps(vTemp); -#elif defined(_XM_SSE3_INTRINSICS_) - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_sqrt_ps(vLengthSq); - return vLengthSq; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product on x,y,z and w - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - // vTemp has z and w - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(3, 2, 3, 2)); - // x+z, y+w - vLengthSq = _mm_add_ps(vLengthSq, vTemp); - // x+z,x+z,x+z,y+w - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 0, 0, 0)); - // ??,??,y+w,y+w - vTemp = _mm_shuffle_ps(vTemp, vLengthSq, _MM_SHUFFLE(3, 3, 0, 0)); - // ??,??,x+z+y+w,?? - vLengthSq = _mm_add_ps(vLengthSq, vTemp); - // Splat the length - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 2, 2, 2)); - // Get the length - vLengthSq = _mm_sqrt_ps(vLengthSq); - return vLengthSq; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector4Length(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Result; - - Result = XMVector4LengthSq(V); - Result = XMVectorSqrt(Result); - - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Dot4 - float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vadd_f32(v1, v2); - v1 = vpadd_f32(v1, v1); - const float32x2_t zero = vdup_n_f32(0); - uint32x2_t VEqualsZero = vceq_f32(v1, zero); - // Sqrt - float32x2_t S0 = vrsqrte_f32(v1); - float32x2_t P0 = vmul_f32(v1, S0); - float32x2_t R0 = vrsqrts_f32(P0, S0); - float32x2_t S1 = vmul_f32(S0, R0); - float32x2_t P1 = vmul_f32(v1, S1); - float32x2_t R1 = vrsqrts_f32(P1, S1); - float32x2_t Result = vmul_f32(S1, R1); - Result = vmul_f32(v1, Result); - Result = vbsl_f32(VEqualsZero, zero, Result); - return vcombine_f32(Result, Result); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); - return _mm_sqrt_ps(vTemp); -#elif defined(_XM_SSE3_INTRINSICS_) - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_sqrt_ps(vLengthSq); - return vLengthSq; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product on x,y,z and w - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - // vTemp has z and w - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(3, 2, 3, 2)); - // x+z, y+w - vLengthSq = _mm_add_ps(vLengthSq, vTemp); - // x+z,x+z,x+z,y+w - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 0, 0, 0)); - // ??,??,y+w,y+w - vTemp = _mm_shuffle_ps(vTemp, vLengthSq, _MM_SHUFFLE(3, 3, 0, 0)); - // ??,??,x+z+y+w,?? - vLengthSq = _mm_add_ps(vLengthSq, vTemp); - // Splat the length - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 2, 2, 2)); - // Get the length - vLengthSq = _mm_sqrt_ps(vLengthSq); - return vLengthSq; -#endif -} - -//------------------------------------------------------------------------------ -// XMVector4NormalizeEst uses a reciprocal estimate and -// returns QNaN on zero and infinite vectors. - -inline XMVECTOR XM_CALLCONV XMVector4NormalizeEst(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR Result; - Result = XMVector4ReciprocalLength(V); - Result = XMVectorMultiply(V, Result); - return Result; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Dot4 - float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vadd_f32(v1, v2); - v1 = vpadd_f32(v1, v1); - // Reciprocal sqrt (estimate) - v2 = vrsqrte_f32(v1); - // Normalize - return vmulq_f32(V, vcombine_f32(v2, v2)); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); - XMVECTOR vResult = _mm_rsqrt_ps(vTemp); - return _mm_mul_ps(vResult, V); -#elif defined(_XM_SSE3_INTRINSICS_) - XMVECTOR vDot = _mm_mul_ps(V, V); - vDot = _mm_hadd_ps(vDot, vDot); - vDot = _mm_hadd_ps(vDot, vDot); - vDot = _mm_rsqrt_ps(vDot); - vDot = _mm_mul_ps(vDot, V); - return vDot; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product on x,y,z and w - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - // vTemp has z and w - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(3, 2, 3, 2)); - // x+z, y+w - vLengthSq = _mm_add_ps(vLengthSq, vTemp); - // x+z,x+z,x+z,y+w - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 0, 0, 0)); - // ??,??,y+w,y+w - vTemp = _mm_shuffle_ps(vTemp, vLengthSq, _MM_SHUFFLE(3, 3, 0, 0)); - // ??,??,x+z+y+w,?? - vLengthSq = _mm_add_ps(vLengthSq, vTemp); - // Splat the length - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 2, 2, 2)); - // Get the reciprocal - XMVECTOR vResult = _mm_rsqrt_ps(vLengthSq); - // Reciprocal mul to perform the normalization - vResult = _mm_mul_ps(vResult, V); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector4Normalize(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - float fLength; - XMVECTOR vResult; - - vResult = XMVector4Length(V); - fLength = vResult.vector4_f32[0]; - - // Prevent divide by zero - if (fLength > 0) - { - fLength = 1.0f / fLength; - } - - vResult.vector4_f32[0] = V.vector4_f32[0] * fLength; - vResult.vector4_f32[1] = V.vector4_f32[1] * fLength; - vResult.vector4_f32[2] = V.vector4_f32[2] * fLength; - vResult.vector4_f32[3] = V.vector4_f32[3] * fLength; - return vResult; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - // Dot4 - float32x4_t vTemp = vmulq_f32(V, V); - float32x2_t v1 = vget_low_f32(vTemp); - float32x2_t v2 = vget_high_f32(vTemp); - v1 = vadd_f32(v1, v2); - v1 = vpadd_f32(v1, v1); - uint32x2_t VEqualsZero = vceq_f32(v1, vdup_n_f32(0)); - uint32x2_t VEqualsInf = vceq_f32(v1, vget_low_f32(g_XMInfinity)); - // Reciprocal sqrt (2 iterations of Newton-Raphson) - float32x2_t S0 = vrsqrte_f32(v1); - float32x2_t P0 = vmul_f32(v1, S0); - float32x2_t R0 = vrsqrts_f32(P0, S0); - float32x2_t S1 = vmul_f32(S0, R0); - float32x2_t P1 = vmul_f32(v1, S1); - float32x2_t R1 = vrsqrts_f32(P1, S1); - v2 = vmul_f32(S1, R1); - // Normalize - XMVECTOR vResult = vmulq_f32(V, vcombine_f32(v2, v2)); - vResult = vbslq_f32(vcombine_u32(VEqualsZero, VEqualsZero), vdupq_n_f32(0), vResult); - return vbslq_f32(vcombine_u32(VEqualsInf, VEqualsInf), g_XMQNaN, vResult); -#elif defined(_XM_SSE4_INTRINSICS_) - XMVECTOR vLengthSq = _mm_dp_ps(V, V, 0xff); - // Prepare for the division - XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); - // Create zero with a single instruction - XMVECTOR vZeroMask = _mm_setzero_ps(); - // Test for a divide by zero (Must be FP to detect -0.0) - vZeroMask = _mm_cmpneq_ps(vZeroMask, vResult); - // Failsafe on zero (Or epsilon) length planes - // If the length is infinity, set the elements to zero - vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); - // Divide to perform the normalization - vResult = _mm_div_ps(V, vResult); - // Any that are infinity, set to zero - vResult = _mm_and_ps(vResult, vZeroMask); - // Select qnan or result based on infinite length - XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); - XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); - return vResult; -#elif defined(_XM_SSE3_INTRINSICS_) - // Perform the dot product on x,y,z and w - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); - // Prepare for the division - XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); - // Create zero with a single instruction - XMVECTOR vZeroMask = _mm_setzero_ps(); - // Test for a divide by zero (Must be FP to detect -0.0) - vZeroMask = _mm_cmpneq_ps(vZeroMask, vResult); - // Failsafe on zero (Or epsilon) length planes - // If the length is infinity, set the elements to zero - vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); - // Divide to perform the normalization - vResult = _mm_div_ps(V, vResult); - // Any that are infinity, set to zero - vResult = _mm_and_ps(vResult, vZeroMask); - // Select qnan or result based on infinite length - XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); - XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); - return vResult; -#elif defined(_XM_SSE_INTRINSICS_) - // Perform the dot product on x,y,z and w - XMVECTOR vLengthSq = _mm_mul_ps(V, V); - // vTemp has z and w - XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(3, 2, 3, 2)); - // x+z, y+w - vLengthSq = _mm_add_ps(vLengthSq, vTemp); - // x+z,x+z,x+z,y+w - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 0, 0, 0)); - // ??,??,y+w,y+w - vTemp = _mm_shuffle_ps(vTemp, vLengthSq, _MM_SHUFFLE(3, 3, 0, 0)); - // ??,??,x+z+y+w,?? - vLengthSq = _mm_add_ps(vLengthSq, vTemp); - // Splat the length - vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 2, 2, 2)); - // Prepare for the division - XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); - // Create zero with a single instruction - XMVECTOR vZeroMask = _mm_setzero_ps(); - // Test for a divide by zero (Must be FP to detect -0.0) - vZeroMask = _mm_cmpneq_ps(vZeroMask, vResult); - // Failsafe on zero (Or epsilon) length planes - // If the length is infinity, set the elements to zero - vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); - // Divide to perform the normalization - vResult = _mm_div_ps(V, vResult); - // Any that are infinity, set to zero - vResult = _mm_and_ps(vResult, vZeroMask); - // Select qnan or result based on infinite length - XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); - XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); - vResult = _mm_or_ps(vTemp1, vTemp2); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector4ClampLength -( - FXMVECTOR V, - float LengthMin, - float LengthMax -) noexcept -{ - XMVECTOR ClampMax = XMVectorReplicate(LengthMax); - XMVECTOR ClampMin = XMVectorReplicate(LengthMin); - - return XMVector4ClampLengthV(V, ClampMin, ClampMax); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector4ClampLengthV -( - FXMVECTOR V, - FXMVECTOR LengthMin, - FXMVECTOR LengthMax -) noexcept -{ - assert((XMVectorGetY(LengthMin) == XMVectorGetX(LengthMin)) && (XMVectorGetZ(LengthMin) == XMVectorGetX(LengthMin)) && (XMVectorGetW(LengthMin) == XMVectorGetX(LengthMin))); - assert((XMVectorGetY(LengthMax) == XMVectorGetX(LengthMax)) && (XMVectorGetZ(LengthMax) == XMVectorGetX(LengthMax)) && (XMVectorGetW(LengthMax) == XMVectorGetX(LengthMax))); - assert(XMVector4GreaterOrEqual(LengthMin, XMVectorZero())); - assert(XMVector4GreaterOrEqual(LengthMax, XMVectorZero())); - assert(XMVector4GreaterOrEqual(LengthMax, LengthMin)); - - XMVECTOR LengthSq = XMVector4LengthSq(V); - - const XMVECTOR Zero = XMVectorZero(); - - XMVECTOR RcpLength = XMVectorReciprocalSqrt(LengthSq); - - XMVECTOR InfiniteLength = XMVectorEqualInt(LengthSq, g_XMInfinity.v); - XMVECTOR ZeroLength = XMVectorEqual(LengthSq, Zero); - - XMVECTOR Normal = XMVectorMultiply(V, RcpLength); - - XMVECTOR Length = XMVectorMultiply(LengthSq, RcpLength); - - XMVECTOR Select = XMVectorEqualInt(InfiniteLength, ZeroLength); - Length = XMVectorSelect(LengthSq, Length, Select); - Normal = XMVectorSelect(LengthSq, Normal, Select); - - XMVECTOR ControlMax = XMVectorGreater(Length, LengthMax); - XMVECTOR ControlMin = XMVectorLess(Length, LengthMin); - - XMVECTOR ClampLength = XMVectorSelect(Length, LengthMax, ControlMax); - ClampLength = XMVectorSelect(ClampLength, LengthMin, ControlMin); - - XMVECTOR Result = XMVectorMultiply(Normal, ClampLength); - - // Preserve the original vector (with no precision loss) if the length falls within the given range - XMVECTOR Control = XMVectorEqualInt(ControlMax, ControlMin); - Result = XMVectorSelect(Result, V, Control); - - return Result; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector4Reflect -( - FXMVECTOR Incident, - FXMVECTOR Normal -) noexcept -{ - // Result = Incident - (2 * dot(Incident, Normal)) * Normal - - XMVECTOR Result = XMVector4Dot(Incident, Normal); - Result = XMVectorAdd(Result, Result); - Result = XMVectorNegativeMultiplySubtract(Result, Normal, Incident); - - return Result; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector4Refract -( - FXMVECTOR Incident, - FXMVECTOR Normal, - float RefractionIndex -) noexcept -{ - XMVECTOR Index = XMVectorReplicate(RefractionIndex); - return XMVector4RefractV(Incident, Normal, Index); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector4RefractV -( - FXMVECTOR Incident, - FXMVECTOR Normal, - FXMVECTOR RefractionIndex -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR IDotN; - XMVECTOR R; - const XMVECTOR Zero = XMVectorZero(); - - // Result = RefractionIndex * Incident - Normal * (RefractionIndex * dot(Incident, Normal) + - // sqrt(1 - RefractionIndex * RefractionIndex * (1 - dot(Incident, Normal) * dot(Incident, Normal)))) - - IDotN = XMVector4Dot(Incident, Normal); - - // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) - R = XMVectorNegativeMultiplySubtract(IDotN, IDotN, g_XMOne.v); - R = XMVectorMultiply(R, RefractionIndex); - R = XMVectorNegativeMultiplySubtract(R, RefractionIndex, g_XMOne.v); - - if (XMVector4LessOrEqual(R, Zero)) - { - // Total internal reflection - return Zero; - } - else - { - XMVECTOR Result; - - // R = RefractionIndex * IDotN + sqrt(R) - R = XMVectorSqrt(R); - R = XMVectorMultiplyAdd(RefractionIndex, IDotN, R); - - // Result = RefractionIndex * Incident - Normal * R - Result = XMVectorMultiply(RefractionIndex, Incident); - Result = XMVectorNegativeMultiplySubtract(Normal, R, Result); - - return Result; - } - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - XMVECTOR IDotN = XMVector4Dot(Incident, Normal); - - // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) - float32x4_t R = vmlsq_f32(g_XMOne, IDotN, IDotN); - R = vmulq_f32(R, RefractionIndex); - R = vmlsq_f32(g_XMOne, R, RefractionIndex); - - uint32x4_t isrzero = vcleq_f32(R, g_XMZero); - uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(isrzero)), vget_high_u8(vreinterpretq_u8_u32(isrzero))); - uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); - - float32x4_t vResult; - if (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU) - { - // Total internal reflection - vResult = g_XMZero; - } - else - { - // Sqrt(R) - float32x4_t S0 = vrsqrteq_f32(R); - float32x4_t P0 = vmulq_f32(R, S0); - float32x4_t R0 = vrsqrtsq_f32(P0, S0); - float32x4_t S1 = vmulq_f32(S0, R0); - float32x4_t P1 = vmulq_f32(R, S1); - float32x4_t R1 = vrsqrtsq_f32(P1, S1); - float32x4_t S2 = vmulq_f32(S1, R1); - R = vmulq_f32(R, S2); - // R = RefractionIndex * IDotN + sqrt(R) - R = vmlaq_f32(R, RefractionIndex, IDotN); - // Result = RefractionIndex * Incident - Normal * R - vResult = vmulq_f32(RefractionIndex, Incident); - vResult = vmlsq_f32(vResult, R, Normal); - } - return vResult; -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR IDotN = XMVector4Dot(Incident, Normal); - - // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) - XMVECTOR R = XM_FNMADD_PS(IDotN, IDotN, g_XMOne); - XMVECTOR R2 = _mm_mul_ps(RefractionIndex, RefractionIndex); - R = XM_FNMADD_PS(R, R2, g_XMOne); - - XMVECTOR vResult = _mm_cmple_ps(R, g_XMZero); - if (_mm_movemask_ps(vResult) == 0x0f) - { - // Total internal reflection - vResult = g_XMZero; - } - else - { - // R = RefractionIndex * IDotN + sqrt(R) - R = _mm_sqrt_ps(R); - R = XM_FMADD_PS(RefractionIndex, IDotN, R); - // Result = RefractionIndex * Incident - Normal * R - vResult = _mm_mul_ps(RefractionIndex, Incident); - vResult = XM_FNMADD_PS(R, Normal, vResult); - } - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector4Orthogonal(FXMVECTOR V) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - XMVECTORF32 Result = { { { - V.vector4_f32[2], - V.vector4_f32[3], - -V.vector4_f32[0], - -V.vector4_f32[1] - } } }; - return Result.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Negate = { { { 1.f, 1.f, -1.f, -1.f } } }; - - float32x4_t Result = vcombine_f32(vget_high_f32(V), vget_low_f32(V)); - return vmulq_f32(Result, Negate); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 FlipZW = { { { 1.0f, 1.0f, -1.0f, -1.0f } } }; - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 0, 3, 2)); - vResult = _mm_mul_ps(vResult, FlipZW); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector4AngleBetweenNormalsEst -( - FXMVECTOR N1, - FXMVECTOR N2 -) noexcept -{ - XMVECTOR Result = XMVector4Dot(N1, N2); - Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); - Result = XMVectorACosEst(Result); - return Result; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector4AngleBetweenNormals -( - FXMVECTOR N1, - FXMVECTOR N2 -) noexcept -{ - XMVECTOR Result = XMVector4Dot(N1, N2); - Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); - Result = XMVectorACos(Result); - return Result; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector4AngleBetweenVectors -( - FXMVECTOR V1, - FXMVECTOR V2 -) noexcept -{ - XMVECTOR L1 = XMVector4ReciprocalLength(V1); - XMVECTOR L2 = XMVector4ReciprocalLength(V2); - - XMVECTOR Dot = XMVector4Dot(V1, V2); - - L1 = XMVectorMultiply(L1, L2); - - XMVECTOR CosAngle = XMVectorMultiply(Dot, L1); - CosAngle = XMVectorClamp(CosAngle, g_XMNegativeOne.v, g_XMOne.v); - - return XMVectorACos(CosAngle); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV XMVector4Transform -( - FXMVECTOR V, - FXMMATRIX M -) noexcept -{ -#if defined(_XM_NO_INTRINSICS_) - - float fX = (M.m[0][0] * V.vector4_f32[0]) + (M.m[1][0] * V.vector4_f32[1]) + (M.m[2][0] * V.vector4_f32[2]) + (M.m[3][0] * V.vector4_f32[3]); - float fY = (M.m[0][1] * V.vector4_f32[0]) + (M.m[1][1] * V.vector4_f32[1]) + (M.m[2][1] * V.vector4_f32[2]) + (M.m[3][1] * V.vector4_f32[3]); - float fZ = (M.m[0][2] * V.vector4_f32[0]) + (M.m[1][2] * V.vector4_f32[1]) + (M.m[2][2] * V.vector4_f32[2]) + (M.m[3][2] * V.vector4_f32[3]); - float fW = (M.m[0][3] * V.vector4_f32[0]) + (M.m[1][3] * V.vector4_f32[1]) + (M.m[2][3] * V.vector4_f32[2]) + (M.m[3][3] * V.vector4_f32[3]); - XMVECTORF32 vResult = { { { fX, fY, fZ, fW } } }; - return vResult.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x2_t VL = vget_low_f32(V); - XMVECTOR vResult = vmulq_lane_f32(M.r[0], VL, 0); // X - vResult = vmlaq_lane_f32(vResult, M.r[1], VL, 1); // Y - float32x2_t VH = vget_high_f32(V); - vResult = vmlaq_lane_f32(vResult, M.r[2], VH, 0); // Z - return vmlaq_lane_f32(vResult, M.r[3], VH, 1); // W -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); // W - vResult = _mm_mul_ps(vResult, M.r[3]); - XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z - vResult = XM_FMADD_PS(vTemp, M.r[2], vResult); - vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y - vResult = XM_FMADD_PS(vTemp, M.r[1], vResult); - vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X - vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMFLOAT4* XM_CALLCONV XMVector4TransformStream -( - XMFLOAT4* pOutputStream, - size_t OutputStride, - const XMFLOAT4* pInputStream, - size_t InputStride, - size_t VectorCount, - FXMMATRIX M -) noexcept -{ - assert(pOutputStream != nullptr); - assert(pInputStream != nullptr); - - assert(InputStride >= sizeof(XMFLOAT4)); - _Analysis_assume_(InputStride >= sizeof(XMFLOAT4)); - - assert(OutputStride >= sizeof(XMFLOAT4)); - _Analysis_assume_(OutputStride >= sizeof(XMFLOAT4)); - -#if defined(_XM_NO_INTRINSICS_) - - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row2 = M.r[2]; - const XMVECTOR row3 = M.r[3]; - - for (size_t i = 0; i < VectorCount; i++) - { - XMVECTOR V = XMLoadFloat4(reinterpret_cast(pInputVector)); - XMVECTOR W = XMVectorSplatW(V); - XMVECTOR Z = XMVectorSplatZ(V); - XMVECTOR Y = XMVectorSplatY(V); - XMVECTOR X = XMVectorSplatX(V); - - XMVECTOR Result = XMVectorMultiply(W, row3); - Result = XMVectorMultiplyAdd(Z, row2, Result); - Result = XMVectorMultiplyAdd(Y, row1, Result); - Result = XMVectorMultiplyAdd(X, row0, Result); - - #ifdef _PREFAST_ - #pragma prefast(push) - #pragma prefast(disable : 26015, "PREfast noise: Esp:1307" ) - #endif - - XMStoreFloat4(reinterpret_cast(pOutputVector), Result); - - #ifdef _PREFAST_ - #pragma prefast(pop) - #endif - - pInputVector += InputStride; - pOutputVector += OutputStride; - } - - return pOutputStream; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row2 = M.r[2]; - const XMVECTOR row3 = M.r[3]; - - size_t i = 0; - size_t four = VectorCount >> 2; - if (four > 0) - { - if ((InputStride == sizeof(XMFLOAT4)) && (OutputStride == sizeof(XMFLOAT4))) - { - for (size_t j = 0; j < four; ++j) - { - float32x4x4_t V = vld4q_f32(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT4) * 4; - - float32x2_t r = vget_low_f32(row0); - XMVECTOR vResult0 = vmulq_lane_f32(V.val[0], r, 0); // Ax - XMVECTOR vResult1 = vmulq_lane_f32(V.val[0], r, 1); // Bx - - XM_PREFETCH(pInputVector); - - r = vget_high_f32(row0); - XMVECTOR vResult2 = vmulq_lane_f32(V.val[0], r, 0); // Cx - XMVECTOR vResult3 = vmulq_lane_f32(V.val[0], r, 1); // Dx - - XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); - - r = vget_low_f32(row1); - vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey - vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); - - r = vget_high_f32(row1); - vResult2 = vmlaq_lane_f32(vResult2, V.val[1], r, 0); // Cx+Gy - vResult3 = vmlaq_lane_f32(vResult3, V.val[1], r, 1); // Dx+Hy - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); - - r = vget_low_f32(row2); - vResult0 = vmlaq_lane_f32(vResult0, V.val[2], r, 0); // Ax+Ey+Iz - vResult1 = vmlaq_lane_f32(vResult1, V.val[2], r, 1); // Bx+Fy+Jz - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 4)); - - r = vget_high_f32(row2); - vResult2 = vmlaq_lane_f32(vResult2, V.val[2], r, 0); // Cx+Gy+Kz - vResult3 = vmlaq_lane_f32(vResult3, V.val[2], r, 1); // Dx+Hy+Lz - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 5)); - - r = vget_low_f32(row3); - vResult0 = vmlaq_lane_f32(vResult0, V.val[3], r, 0); // Ax+Ey+Iz+Mw - vResult1 = vmlaq_lane_f32(vResult1, V.val[3], r, 1); // Bx+Fy+Jz+Nw - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 6)); - - r = vget_high_f32(row3); - vResult2 = vmlaq_lane_f32(vResult2, V.val[3], r, 0); // Cx+Gy+Kz+Ow - vResult3 = vmlaq_lane_f32(vResult3, V.val[3], r, 1); // Dx+Hy+Lz+Pw - - XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 7)); - - V.val[0] = vResult0; - V.val[1] = vResult1; - V.val[2] = vResult2; - V.val[3] = vResult3; - - vst4q_f32(reinterpret_cast(pOutputVector), V); - pOutputVector += sizeof(XMFLOAT4) * 4; - - i += 4; - } - } - } - - for (; i < VectorCount; i++) - { - XMVECTOR V = vld1q_f32(reinterpret_cast(pInputVector)); - pInputVector += InputStride; - - float32x2_t VL = vget_low_f32(V); - XMVECTOR vResult = vmulq_lane_f32(row0, VL, 0); // X - vResult = vmlaq_lane_f32(vResult, row1, VL, 1); // Y - float32x2_t VH = vget_high_f32(V); - vResult = vmlaq_lane_f32(vResult, row2, VH, 0); // Z - vResult = vmlaq_lane_f32(vResult, row3, VH, 1); // W - - vst1q_f32(reinterpret_cast(pOutputVector), vResult); - pOutputVector += OutputStride; - } - - return pOutputStream; -#elif defined(_XM_AVX2_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - size_t i = 0; - size_t two = VectorCount >> 1; - if (two > 0) - { - __m256 row0 = _mm256_broadcast_ps(&M.r[0]); - __m256 row1 = _mm256_broadcast_ps(&M.r[1]); - __m256 row2 = _mm256_broadcast_ps(&M.r[2]); - __m256 row3 = _mm256_broadcast_ps(&M.r[3]); - - if (InputStride == sizeof(XMFLOAT4)) - { - if (OutputStride == sizeof(XMFLOAT4)) - { - if (!(reinterpret_cast(pOutputStream) & 0x1F)) - { - // Packed input, aligned & packed output - for (size_t j = 0; j < two; ++j) - { - __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT4) * 2; - - __m256 vTempX = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); - __m256 vTempY = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); - __m256 vTempZ = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); - __m256 vTempW = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); - - vTempX = _mm256_mul_ps(vTempX, row0); - vTempY = _mm256_mul_ps(vTempY, row1); - vTempZ = _mm256_fmadd_ps(vTempZ, row2, vTempX); - vTempW = _mm256_fmadd_ps(vTempW, row3, vTempY); - vTempX = _mm256_add_ps(vTempZ, vTempW); - - XM256_STREAM_PS(reinterpret_cast(pOutputVector), vTempX); - pOutputVector += sizeof(XMFLOAT4) * 2; - - i += 2; - } - } - else - { - // Packed input, packed output - for (size_t j = 0; j < two; ++j) - { - __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT4) * 2; - - __m256 vTempX = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); - __m256 vTempY = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); - __m256 vTempZ = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); - __m256 vTempW = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); - - vTempX = _mm256_mul_ps(vTempX, row0); - vTempY = _mm256_mul_ps(vTempY, row1); - vTempZ = _mm256_fmadd_ps(vTempZ, row2, vTempX); - vTempW = _mm256_fmadd_ps(vTempW, row3, vTempY); - vTempX = _mm256_add_ps(vTempZ, vTempW); - - _mm256_storeu_ps(reinterpret_cast(pOutputVector), vTempX); - pOutputVector += sizeof(XMFLOAT4) * 2; - - i += 2; - } - } - } - else - { - // Packed input, unpacked output - for (size_t j = 0; j < two; ++j) - { - __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += sizeof(XMFLOAT4) * 2; - - __m256 vTempX = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); - __m256 vTempY = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); - __m256 vTempZ = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); - __m256 vTempW = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); - - vTempX = _mm256_mul_ps(vTempX, row0); - vTempY = _mm256_mul_ps(vTempY, row1); - vTempZ = _mm256_fmadd_ps(vTempZ, row2, vTempX); - vTempW = _mm256_fmadd_ps(vTempW, row3, vTempY); - vTempX = _mm256_add_ps(vTempZ, vTempW); - - _mm_storeu_ps(reinterpret_cast(pOutputVector), _mm256_castps256_ps128(vTempX)); - pOutputVector += OutputStride; - - _mm_storeu_ps(reinterpret_cast(pOutputVector), _mm256_extractf128_ps(vTempX, 1)); - pOutputVector += OutputStride; - i += 2; - } - } - } - } - - if (i < VectorCount) - { - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row2 = M.r[2]; - const XMVECTOR row3 = M.r[3]; - - for (; i < VectorCount; i++) - { - __m128 V = _mm_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += InputStride; - - XMVECTOR vTempX = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTempY = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR vTempZ = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR vTempW = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); - - vTempX = _mm_mul_ps(vTempX, row0); - vTempY = _mm_mul_ps(vTempY, row1); - vTempZ = XM_FMADD_PS(vTempZ, row2, vTempX); - vTempW = XM_FMADD_PS(vTempW, row3, vTempY); - vTempX = _mm_add_ps(vTempZ, vTempW); - - _mm_storeu_ps(reinterpret_cast(pOutputVector), vTempX); - pOutputVector += OutputStride; - } - } - - XM_SFENCE(); - - return pOutputStream; -#elif defined(_XM_SSE_INTRINSICS_) - auto pInputVector = reinterpret_cast(pInputStream); - auto pOutputVector = reinterpret_cast(pOutputStream); - - const XMVECTOR row0 = M.r[0]; - const XMVECTOR row1 = M.r[1]; - const XMVECTOR row2 = M.r[2]; - const XMVECTOR row3 = M.r[3]; - - if (!(reinterpret_cast(pOutputStream) & 0xF) && !(OutputStride & 0xF)) - { - if (!(reinterpret_cast(pInputStream) & 0xF) && !(InputStride & 0xF)) - { - // Aligned input, aligned output - for (size_t i = 0; i < VectorCount; i++) - { - __m128 V = _mm_load_ps(reinterpret_cast(pInputVector)); - pInputVector += InputStride; - - XMVECTOR vTempX = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTempY = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR vTempZ = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR vTempW = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); - - vTempX = _mm_mul_ps(vTempX, row0); - vTempY = _mm_mul_ps(vTempY, row1); - vTempZ = XM_FMADD_PS(vTempZ, row2, vTempX); - vTempW = XM_FMADD_PS(vTempW, row3, vTempY); - vTempX = _mm_add_ps(vTempZ, vTempW); - - XM_STREAM_PS(reinterpret_cast(pOutputVector), vTempX); - pOutputVector += OutputStride; - } - } - else - { - // Unaligned input, aligned output - for (size_t i = 0; i < VectorCount; i++) - { - __m128 V = _mm_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += InputStride; - - XMVECTOR vTempX = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTempY = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR vTempZ = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR vTempW = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); - - vTempX = _mm_mul_ps(vTempX, row0); - vTempY = _mm_mul_ps(vTempY, row1); - vTempZ = XM_FMADD_PS(vTempZ, row2, vTempX); - vTempW = XM_FMADD_PS(vTempW, row3, vTempY); - vTempX = _mm_add_ps(vTempZ, vTempW); - - XM_STREAM_PS(reinterpret_cast(pOutputVector), vTempX); - pOutputVector += OutputStride; - } - } - } - else - { - if (!(reinterpret_cast(pInputStream) & 0xF) && !(InputStride & 0xF)) - { - // Aligned input, unaligned output - for (size_t i = 0; i < VectorCount; i++) - { - __m128 V = _mm_load_ps(reinterpret_cast(pInputVector)); - pInputVector += InputStride; - - XMVECTOR vTempX = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTempY = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR vTempZ = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR vTempW = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); - - vTempX = _mm_mul_ps(vTempX, row0); - vTempY = _mm_mul_ps(vTempY, row1); - vTempZ = XM_FMADD_PS(vTempZ, row2, vTempX); - vTempW = XM_FMADD_PS(vTempW, row3, vTempY); - vTempX = _mm_add_ps(vTempZ, vTempW); - - _mm_storeu_ps(reinterpret_cast(pOutputVector), vTempX); - pOutputVector += OutputStride; - } - } - else - { - // Unaligned input, unaligned output - for (size_t i = 0; i < VectorCount; i++) - { - __m128 V = _mm_loadu_ps(reinterpret_cast(pInputVector)); - pInputVector += InputStride; - - XMVECTOR vTempX = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); - XMVECTOR vTempY = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); - XMVECTOR vTempZ = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); - XMVECTOR vTempW = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); - - vTempX = _mm_mul_ps(vTempX, row0); - vTempY = _mm_mul_ps(vTempY, row1); - vTempZ = XM_FMADD_PS(vTempZ, row2, vTempX); - vTempW = XM_FMADD_PS(vTempW, row3, vTempY); - vTempX = _mm_add_ps(vTempZ, vTempW); - - _mm_storeu_ps(reinterpret_cast(pOutputVector), vTempX); - pOutputVector += OutputStride; - } - } - } - - XM_SFENCE(); - - return pOutputStream; -#endif -} - -/**************************************************************************** - * - * XMVECTOR operators - * - ****************************************************************************/ - -#ifndef _XM_NO_XMVECTOR_OVERLOADS_ - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV operator+ (FXMVECTOR V) noexcept -{ - return V; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV operator- (FXMVECTOR V) noexcept -{ - return XMVectorNegate(V); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR& XM_CALLCONV operator+= -( - XMVECTOR& V1, - FXMVECTOR V2 - ) noexcept -{ - V1 = XMVectorAdd(V1, V2); - return V1; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR& XM_CALLCONV operator-= -( - XMVECTOR& V1, - FXMVECTOR V2 - ) noexcept -{ - V1 = XMVectorSubtract(V1, V2); - return V1; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR& XM_CALLCONV operator*= -( - XMVECTOR& V1, - FXMVECTOR V2 - ) noexcept -{ - V1 = XMVectorMultiply(V1, V2); - return V1; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR& XM_CALLCONV operator/= -( - XMVECTOR& V1, - FXMVECTOR V2 - ) noexcept -{ - V1 = XMVectorDivide(V1, V2); - return V1; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR& operator*= -( - XMVECTOR& V, - const float S - ) noexcept -{ - V = XMVectorScale(V, S); - return V; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR& operator/= -( - XMVECTOR& V, - const float S - ) noexcept -{ - XMVECTOR vS = XMVectorReplicate(S); - V = XMVectorDivide(V, vS); - return V; -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV operator+ -( - FXMVECTOR V1, - FXMVECTOR V2 - ) noexcept -{ - return XMVectorAdd(V1, V2); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV operator- -( - FXMVECTOR V1, - FXMVECTOR V2 - ) noexcept -{ - return XMVectorSubtract(V1, V2); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV operator* -( - FXMVECTOR V1, - FXMVECTOR V2 - ) noexcept -{ - return XMVectorMultiply(V1, V2); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV operator/ -( - FXMVECTOR V1, - FXMVECTOR V2 - ) noexcept -{ - return XMVectorDivide(V1, V2); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV operator* -( - FXMVECTOR V, - const float S - ) noexcept -{ - return XMVectorScale(V, S); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV operator/ -( - FXMVECTOR V, - const float S - ) noexcept -{ - XMVECTOR vS = XMVectorReplicate(S); - return XMVectorDivide(V, vS); -} - -//------------------------------------------------------------------------------ - -inline XMVECTOR XM_CALLCONV operator* -( - float S, - FXMVECTOR V - ) noexcept -{ - return XMVectorScale(V, S); -} - -#endif /* !_XM_NO_XMVECTOR_OVERLOADS_ */ - -#if defined(_XM_NO_INTRINSICS_) -#undef XMISNAN -#undef XMISINF -#endif - -#if defined(_XM_SSE_INTRINSICS_) -#undef XM3UNPACK3INTO4 -#undef XM3PACK4INTO3 -#endif - +//------------------------------------------------------------------------------------- +// DirectXMathVector.inl -- SIMD C++ Math library +// +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +// +// http://go.microsoft.com/fwlink/?LinkID=615560 +//------------------------------------------------------------------------------------- + +#pragma once + +#if defined(_XM_NO_INTRINSICS_) +#define XMISNAN(x) isnan(x) +#define XMISINF(x) isinf(x) +#endif + +#if defined(_XM_SSE_INTRINSICS_) + +#define XM3UNPACK3INTO4(l1, l2, l3) \ + XMVECTOR V3 = _mm_shuffle_ps(l2, l3, _MM_SHUFFLE(0, 0, 3, 2));\ + XMVECTOR V2 = _mm_shuffle_ps(l2, l1, _MM_SHUFFLE(3, 3, 1, 0));\ + V2 = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 0, 2));\ + XMVECTOR V4 = _mm_castsi128_ps(_mm_srli_si128(_mm_castps_si128(L3), 32 / 8)) + +#define XM3PACK4INTO3(v2x) \ + v2x = _mm_shuffle_ps(V2, V3, _MM_SHUFFLE(1, 0, 2, 1));\ + V2 = _mm_shuffle_ps(V2, V1, _MM_SHUFFLE(2, 2, 0, 0));\ + V1 = _mm_shuffle_ps(V1, V2, _MM_SHUFFLE(0, 2, 1, 0));\ + V3 = _mm_shuffle_ps(V3, V4, _MM_SHUFFLE(0, 0, 2, 2));\ + V3 = _mm_shuffle_ps(V3, V4, _MM_SHUFFLE(2, 1, 2, 0)) + +#endif + +/**************************************************************************** + * + * General Vector + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ +// Assignment operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ +// Return a vector with all elements equaling zero +inline XMVECTOR XM_CALLCONV XMVectorZero() noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { 0.0f, 0.0f, 0.0f, 0.0f } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vdupq_n_f32(0); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_setzero_ps(); +#endif +} + +//------------------------------------------------------------------------------ +// Initialize a vector with four floating point values +inline XMVECTOR XM_CALLCONV XMVectorSet +( + float x, + float y, + float z, + float w +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { x, y, z, w } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t V0 = vcreate_f32( + static_cast(*reinterpret_cast(&x)) + | (static_cast(*reinterpret_cast(&y)) << 32)); + float32x2_t V1 = vcreate_f32( + static_cast(*reinterpret_cast(&z)) + | (static_cast(*reinterpret_cast(&w)) << 32)); + return vcombine_f32(V0, V1); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_set_ps(w, z, y, x); +#endif +} + +//------------------------------------------------------------------------------ +// Initialize a vector with four integer values +inline XMVECTOR XM_CALLCONV XMVectorSetInt +( + uint32_t x, + uint32_t y, + uint32_t z, + uint32_t w +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORU32 vResult = { { { x, y, z, w } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t V0 = vcreate_u32(static_cast(x) | (static_cast(y) << 32)); + uint32x2_t V1 = vcreate_u32(static_cast(z) | (static_cast(w) << 32)); + return vreinterpretq_f32_u32(vcombine_u32(V0, V1)); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i V = _mm_set_epi32(static_cast(w), static_cast(z), static_cast(y), static_cast(x)); + return _mm_castsi128_ps(V); +#endif +} + +//------------------------------------------------------------------------------ +// Initialize a vector with a replicated floating point value +inline XMVECTOR XM_CALLCONV XMVectorReplicate(float Value) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult; + vResult.f[0] = + vResult.f[1] = + vResult.f[2] = + vResult.f[3] = Value; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vdupq_n_f32(Value); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_set_ps1(Value); +#endif +} + +//------------------------------------------------------------------------------ +// Initialize a vector with a replicated floating point value passed by pointer +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMVectorReplicatePtr(const float* pValue) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + float Value = pValue[0]; + XMVECTORF32 vResult; + vResult.f[0] = + vResult.f[1] = + vResult.f[2] = + vResult.f[3] = Value; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vld1q_dup_f32(pValue); +#elif defined(_XM_AVX_INTRINSICS_) + return _mm_broadcast_ss(pValue); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_load_ps1(pValue); +#endif +} + +//------------------------------------------------------------------------------ +// Initialize a vector with a replicated integer value +inline XMVECTOR XM_CALLCONV XMVectorReplicateInt(uint32_t Value) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORU32 vResult; + vResult.u[0] = + vResult.u[1] = + vResult.u[2] = + vResult.u[3] = Value; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vdupq_n_u32(Value)); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i vTemp = _mm_set1_epi32(static_cast(Value)); + return _mm_castsi128_ps(vTemp); +#endif +} + +//------------------------------------------------------------------------------ +// Initialize a vector with a replicated integer value passed by pointer +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMVectorReplicateIntPtr(const uint32_t* pValue) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + uint32_t Value = pValue[0]; + XMVECTORU32 vResult; + vResult.u[0] = + vResult.u[1] = + vResult.u[2] = + vResult.u[3] = Value; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vld1q_dup_u32(pValue)); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_load_ps1(reinterpret_cast(pValue)); +#endif +} + +//------------------------------------------------------------------------------ +// Initialize a vector with all bits set (true mask) +inline XMVECTOR XM_CALLCONV XMVectorTrueInt() noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORU32 vResult = { { { 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU, 0xFFFFFFFFU } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_s32(vdupq_n_s32(-1)); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i V = _mm_set1_epi32(-1); + return _mm_castsi128_ps(V); +#endif +} + +//------------------------------------------------------------------------------ +// Initialize a vector with all bits clear (false mask) +inline XMVECTOR XM_CALLCONV XMVectorFalseInt() noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { 0.0f, 0.0f, 0.0f, 0.0f } } }; + return vResult; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vdupq_n_u32(0)); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_setzero_ps(); +#endif +} + +//------------------------------------------------------------------------------ +// Replicate the x component of the vector +inline XMVECTOR XM_CALLCONV XMVectorSplatX(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult; + vResult.f[0] = + vResult.f[1] = + vResult.f[2] = + vResult.f[3] = V.vector4_f32[0]; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vdupq_lane_f32(vget_low_f32(V), 0); +#elif defined(_XM_AVX2_INTRINSICS_) && defined(_XM_FAVOR_INTEL_) + return _mm_broadcastss_ps(V); +#elif defined(_XM_SSE_INTRINSICS_) + return XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); +#endif +} + +//------------------------------------------------------------------------------ +// Replicate the y component of the vector +inline XMVECTOR XM_CALLCONV XMVectorSplatY(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult; + vResult.f[0] = + vResult.f[1] = + vResult.f[2] = + vResult.f[3] = V.vector4_f32[1]; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vdupq_lane_f32(vget_low_f32(V), 1); +#elif defined(_XM_SSE_INTRINSICS_) + return XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); +#endif +} + +//------------------------------------------------------------------------------ +// Replicate the z component of the vector +inline XMVECTOR XM_CALLCONV XMVectorSplatZ(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult; + vResult.f[0] = + vResult.f[1] = + vResult.f[2] = + vResult.f[3] = V.vector4_f32[2]; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vdupq_lane_f32(vget_high_f32(V), 0); +#elif defined(_XM_SSE_INTRINSICS_) + return XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); +#endif +} + +//------------------------------------------------------------------------------ +// Replicate the w component of the vector +inline XMVECTOR XM_CALLCONV XMVectorSplatW(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult; + vResult.f[0] = + vResult.f[1] = + vResult.f[2] = + vResult.f[3] = V.vector4_f32[3]; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vdupq_lane_f32(vget_high_f32(V), 1); +#elif defined(_XM_SSE_INTRINSICS_) + return XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); +#endif +} + +//------------------------------------------------------------------------------ +// Return a vector of 1.0f,1.0f,1.0f,1.0f +inline XMVECTOR XM_CALLCONV XMVectorSplatOne() noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult; + vResult.f[0] = + vResult.f[1] = + vResult.f[2] = + vResult.f[3] = 1.0f; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vdupq_n_f32(1.0f); +#elif defined(_XM_SSE_INTRINSICS_) + return g_XMOne; +#endif +} + +//------------------------------------------------------------------------------ +// Return a vector of INF,INF,INF,INF +inline XMVECTOR XM_CALLCONV XMVectorSplatInfinity() noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORU32 vResult; + vResult.u[0] = + vResult.u[1] = + vResult.u[2] = + vResult.u[3] = 0x7F800000; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vdupq_n_u32(0x7F800000)); +#elif defined(_XM_SSE_INTRINSICS_) + return g_XMInfinity; +#endif +} + +//------------------------------------------------------------------------------ +// Return a vector of Q_NAN,Q_NAN,Q_NAN,Q_NAN +inline XMVECTOR XM_CALLCONV XMVectorSplatQNaN() noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORU32 vResult; + vResult.u[0] = + vResult.u[1] = + vResult.u[2] = + vResult.u[3] = 0x7FC00000; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vdupq_n_u32(0x7FC00000)); +#elif defined(_XM_SSE_INTRINSICS_) + return g_XMQNaN; +#endif +} + +//------------------------------------------------------------------------------ +// Return a vector of 1.192092896e-7f,1.192092896e-7f,1.192092896e-7f,1.192092896e-7f +inline XMVECTOR XM_CALLCONV XMVectorSplatEpsilon() noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORU32 vResult; + vResult.u[0] = + vResult.u[1] = + vResult.u[2] = + vResult.u[3] = 0x34000000; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vdupq_n_u32(0x34000000)); +#elif defined(_XM_SSE_INTRINSICS_) + return g_XMEpsilon; +#endif +} + +//------------------------------------------------------------------------------ +// Return a vector of -0.0f (0x80000000),-0.0f,-0.0f,-0.0f +inline XMVECTOR XM_CALLCONV XMVectorSplatSignMask() noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORU32 vResult; + vResult.u[0] = + vResult.u[1] = + vResult.u[2] = + vResult.u[3] = 0x80000000U; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vdupq_n_u32(0x80000000U)); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i V = _mm_set1_epi32(static_cast(0x80000000)); + return _mm_castsi128_ps(V); +#endif +} + +//------------------------------------------------------------------------------ +// Return a floating point value via an index. This is not a recommended +// function to use due to performance loss. +inline float XM_CALLCONV XMVectorGetByIndex(FXMVECTOR V, size_t i) noexcept +{ + assert(i < 4); + _Analysis_assume_(i < 4); +#if defined(_XM_NO_INTRINSICS_) + return V.vector4_f32[i]; +#else + XMVECTORF32 U; + U.v = V; + return U.f[i]; +#endif +} + +//------------------------------------------------------------------------------ +// Return the X component in an FPU register. +inline float XM_CALLCONV XMVectorGetX(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return V.vector4_f32[0]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vgetq_lane_f32(V, 0); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_cvtss_f32(V); +#endif +} + +// Return the Y component in an FPU register. +inline float XM_CALLCONV XMVectorGetY(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return V.vector4_f32[1]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vgetq_lane_f32(V, 1); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + return _mm_cvtss_f32(vTemp); +#endif +} + +// Return the Z component in an FPU register. +inline float XM_CALLCONV XMVectorGetZ(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return V.vector4_f32[2]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vgetq_lane_f32(V, 2); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + return _mm_cvtss_f32(vTemp); +#endif +} + +// Return the W component in an FPU register. +inline float XM_CALLCONV XMVectorGetW(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return V.vector4_f32[3]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vgetq_lane_f32(V, 3); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); + return _mm_cvtss_f32(vTemp); +#endif +} + +//------------------------------------------------------------------------------ + +// Store a component indexed by i into a 32 bit float location in memory. +_Use_decl_annotations_ +inline void XM_CALLCONV XMVectorGetByIndexPtr(float* f, FXMVECTOR V, size_t i) noexcept +{ + assert(f != nullptr); + assert(i < 4); + _Analysis_assume_(i < 4); +#if defined(_XM_NO_INTRINSICS_) + *f = V.vector4_f32[i]; +#else + XMVECTORF32 U; + U.v = V; + *f = U.f[i]; +#endif +} + +//------------------------------------------------------------------------------ + +// Store the X component into a 32 bit float location in memory. +_Use_decl_annotations_ +inline void XM_CALLCONV XMVectorGetXPtr(float* x, FXMVECTOR V) noexcept +{ + assert(x != nullptr); +#if defined(_XM_NO_INTRINSICS_) + *x = V.vector4_f32[0]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + vst1q_lane_f32(x, V, 0); +#elif defined(_XM_SSE_INTRINSICS_) + _mm_store_ss(x, V); +#endif +} + +// Store the Y component into a 32 bit float location in memory. +_Use_decl_annotations_ +inline void XM_CALLCONV XMVectorGetYPtr(float* y, FXMVECTOR V) noexcept +{ + assert(y != nullptr); +#if defined(_XM_NO_INTRINSICS_) + *y = V.vector4_f32[1]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + vst1q_lane_f32(y, V, 1); +#elif defined(_XM_SSE4_INTRINSICS_) + * (reinterpret_cast(y)) = _mm_extract_ps(V, 1); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + _mm_store_ss(y, vResult); +#endif +} + +// Store the Z component into a 32 bit float location in memory. +_Use_decl_annotations_ +inline void XM_CALLCONV XMVectorGetZPtr(float* z, FXMVECTOR V) noexcept +{ + assert(z != nullptr); +#if defined(_XM_NO_INTRINSICS_) + *z = V.vector4_f32[2]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + vst1q_lane_f32(z, V, 2); +#elif defined(_XM_SSE4_INTRINSICS_) + * (reinterpret_cast(z)) = _mm_extract_ps(V, 2); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + _mm_store_ss(z, vResult); +#endif +} + +// Store the W component into a 32 bit float location in memory. +_Use_decl_annotations_ +inline void XM_CALLCONV XMVectorGetWPtr(float* w, FXMVECTOR V) noexcept +{ + assert(w != nullptr); +#if defined(_XM_NO_INTRINSICS_) + *w = V.vector4_f32[3]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + vst1q_lane_f32(w, V, 3); +#elif defined(_XM_SSE4_INTRINSICS_) + * (reinterpret_cast(w)) = _mm_extract_ps(V, 3); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); + _mm_store_ss(w, vResult); +#endif +} + +//------------------------------------------------------------------------------ + +// Return an integer value via an index. This is not a recommended +// function to use due to performance loss. +inline uint32_t XM_CALLCONV XMVectorGetIntByIndex(FXMVECTOR V, size_t i) noexcept +{ + assert(i < 4); + _Analysis_assume_(i < 4); +#if defined(_XM_NO_INTRINSICS_) + return V.vector4_u32[i]; +#else + XMVECTORU32 U; + U.v = V; + return U.u[i]; +#endif +} + +//------------------------------------------------------------------------------ + +// Return the X component in an integer register. +inline uint32_t XM_CALLCONV XMVectorGetIntX(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return V.vector4_u32[0]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vgetq_lane_u32(vreinterpretq_u32_f32(V), 0); +#elif defined(_XM_SSE_INTRINSICS_) + return static_cast(_mm_cvtsi128_si32(_mm_castps_si128(V))); +#endif +} + +// Return the Y component in an integer register. +inline uint32_t XM_CALLCONV XMVectorGetIntY(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return V.vector4_u32[1]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vgetq_lane_u32(vreinterpretq_u32_f32(V), 1); +#elif defined(_XM_SSE4_INTRINSICS_) + __m128i V1 = _mm_castps_si128(V); + return static_cast(_mm_extract_epi32(V1, 1)); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i vResulti = _mm_shuffle_epi32(_mm_castps_si128(V), _MM_SHUFFLE(1, 1, 1, 1)); + return static_cast(_mm_cvtsi128_si32(vResulti)); +#endif +} + +// Return the Z component in an integer register. +inline uint32_t XM_CALLCONV XMVectorGetIntZ(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return V.vector4_u32[2]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vgetq_lane_u32(vreinterpretq_u32_f32(V), 2); +#elif defined(_XM_SSE4_INTRINSICS_) + __m128i V1 = _mm_castps_si128(V); + return static_cast(_mm_extract_epi32(V1, 2)); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i vResulti = _mm_shuffle_epi32(_mm_castps_si128(V), _MM_SHUFFLE(2, 2, 2, 2)); + return static_cast(_mm_cvtsi128_si32(vResulti)); +#endif +} + +// Return the W component in an integer register. +inline uint32_t XM_CALLCONV XMVectorGetIntW(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return V.vector4_u32[3]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vgetq_lane_u32(vreinterpretq_u32_f32(V), 3); +#elif defined(_XM_SSE4_INTRINSICS_) + __m128i V1 = _mm_castps_si128(V); + return static_cast(_mm_extract_epi32(V1, 3)); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i vResulti = _mm_shuffle_epi32(_mm_castps_si128(V), _MM_SHUFFLE(3, 3, 3, 3)); + return static_cast(_mm_cvtsi128_si32(vResulti)); +#endif +} + +//------------------------------------------------------------------------------ + +// Store a component indexed by i into a 32 bit integer location in memory. +_Use_decl_annotations_ +inline void XM_CALLCONV XMVectorGetIntByIndexPtr(uint32_t* x, FXMVECTOR V, size_t i) noexcept +{ + assert(x != nullptr); + assert(i < 4); + _Analysis_assume_(i < 4); +#if defined(_XM_NO_INTRINSICS_) + *x = V.vector4_u32[i]; +#else + XMVECTORU32 U; + U.v = V; + *x = U.u[i]; +#endif +} + +//------------------------------------------------------------------------------ + +// Store the X component into a 32 bit integer location in memory. +_Use_decl_annotations_ +inline void XM_CALLCONV XMVectorGetIntXPtr(uint32_t* x, FXMVECTOR V) noexcept +{ + assert(x != nullptr); +#if defined(_XM_NO_INTRINSICS_) + *x = V.vector4_u32[0]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + vst1q_lane_u32(x, *reinterpret_cast(&V), 0); +#elif defined(_XM_SSE_INTRINSICS_) + _mm_store_ss(reinterpret_cast(x), V); +#endif +} + +// Store the Y component into a 32 bit integer location in memory. +_Use_decl_annotations_ +inline void XM_CALLCONV XMVectorGetIntYPtr(uint32_t* y, FXMVECTOR V) noexcept +{ + assert(y != nullptr); +#if defined(_XM_NO_INTRINSICS_) + *y = V.vector4_u32[1]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + vst1q_lane_u32(y, *reinterpret_cast(&V), 1); +#elif defined(_XM_SSE4_INTRINSICS_) + __m128i V1 = _mm_castps_si128(V); + *y = static_cast(_mm_extract_epi32(V1, 1)); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + _mm_store_ss(reinterpret_cast(y), vResult); +#endif +} + +// Store the Z component into a 32 bit integer locaCantion in memory. +_Use_decl_annotations_ +inline void XM_CALLCONV XMVectorGetIntZPtr(uint32_t* z, FXMVECTOR V) noexcept +{ + assert(z != nullptr); +#if defined(_XM_NO_INTRINSICS_) + *z = V.vector4_u32[2]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + vst1q_lane_u32(z, *reinterpret_cast(&V), 2); +#elif defined(_XM_SSE4_INTRINSICS_) + __m128i V1 = _mm_castps_si128(V); + *z = static_cast(_mm_extract_epi32(V1, 2)); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + _mm_store_ss(reinterpret_cast(z), vResult); +#endif +} + +// Store the W component into a 32 bit integer location in memory. +_Use_decl_annotations_ +inline void XM_CALLCONV XMVectorGetIntWPtr(uint32_t* w, FXMVECTOR V) noexcept +{ + assert(w != nullptr); +#if defined(_XM_NO_INTRINSICS_) + *w = V.vector4_u32[3]; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + vst1q_lane_u32(w, *reinterpret_cast(&V), 3); +#elif defined(_XM_SSE4_INTRINSICS_) + __m128i V1 = _mm_castps_si128(V); + *w = static_cast(_mm_extract_epi32(V1, 3)); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); + _mm_store_ss(reinterpret_cast(w), vResult); +#endif +} + +//------------------------------------------------------------------------------ + +// Set a single indexed floating point component +inline XMVECTOR XM_CALLCONV XMVectorSetByIndex(FXMVECTOR V, float f, size_t i) noexcept +{ + assert(i < 4); + _Analysis_assume_(i < 4); + XMVECTORF32 U; + U.v = V; + U.f[i] = f; + return U.v; +} + +//------------------------------------------------------------------------------ + +// Sets the X component of a vector to a passed floating point value +inline XMVECTOR XM_CALLCONV XMVectorSetX(FXMVECTOR V, float x) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 U = { { { + x, + V.vector4_f32[1], + V.vector4_f32[2], + V.vector4_f32[3] + } } }; + return U.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vsetq_lane_f32(x, V, 0); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = _mm_set_ss(x); + vResult = _mm_move_ss(V, vResult); + return vResult; +#endif +} + +// Sets the Y component of a vector to a passed floating point value +inline XMVECTOR XM_CALLCONV XMVectorSetY(FXMVECTOR V, float y) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 U = { { { + V.vector4_f32[0], + y, + V.vector4_f32[2], + V.vector4_f32[3] + } } }; + return U.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vsetq_lane_f32(y, V, 1); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vResult = _mm_set_ss(y); + vResult = _mm_insert_ps(V, vResult, 0x10); + return vResult; +#elif defined(_XM_SSE_INTRINSICS_) + // Swap y and x + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 2, 0, 1)); + // Convert input to vector + XMVECTOR vTemp = _mm_set_ss(y); + // Replace the x component + vResult = _mm_move_ss(vResult, vTemp); + // Swap y and x again + vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 2, 0, 1)); + return vResult; +#endif +} +// Sets the Z component of a vector to a passed floating point value +inline XMVECTOR XM_CALLCONV XMVectorSetZ(FXMVECTOR V, float z) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 U = { { { + V.vector4_f32[0], + V.vector4_f32[1], + z, + V.vector4_f32[3] + } } }; + return U.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vsetq_lane_f32(z, V, 2); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vResult = _mm_set_ss(z); + vResult = _mm_insert_ps(V, vResult, 0x20); + return vResult; +#elif defined(_XM_SSE_INTRINSICS_) + // Swap z and x + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 0, 1, 2)); + // Convert input to vector + XMVECTOR vTemp = _mm_set_ss(z); + // Replace the x component + vResult = _mm_move_ss(vResult, vTemp); + // Swap z and x again + vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 0, 1, 2)); + return vResult; +#endif +} + +// Sets the W component of a vector to a passed floating point value +inline XMVECTOR XM_CALLCONV XMVectorSetW(FXMVECTOR V, float w) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 U = { { { + V.vector4_f32[0], + V.vector4_f32[1], + V.vector4_f32[2], + w + } } }; + return U.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vsetq_lane_f32(w, V, 3); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vResult = _mm_set_ss(w); + vResult = _mm_insert_ps(V, vResult, 0x30); + return vResult; +#elif defined(_XM_SSE_INTRINSICS_) + // Swap w and x + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 2, 1, 3)); + // Convert input to vector + XMVECTOR vTemp = _mm_set_ss(w); + // Replace the x component + vResult = _mm_move_ss(vResult, vTemp); + // Swap w and x again + vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(0, 2, 1, 3)); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +// Sets a component of a vector to a floating point value passed by pointer +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMVectorSetByIndexPtr(FXMVECTOR V, const float* f, size_t i) noexcept +{ + assert(f != nullptr); + assert(i < 4); + _Analysis_assume_(i < 4); + XMVECTORF32 U; + U.v = V; + U.f[i] = *f; + return U.v; +} + +//------------------------------------------------------------------------------ + +// Sets the X component of a vector to a floating point value passed by pointer +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMVectorSetXPtr(FXMVECTOR V, const float* x) noexcept +{ + assert(x != nullptr); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 U = { { { + *x, + V.vector4_f32[1], + V.vector4_f32[2], + V.vector4_f32[3] + } } }; + return U.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vld1q_lane_f32(x, V, 0); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = _mm_load_ss(x); + vResult = _mm_move_ss(V, vResult); + return vResult; +#endif +} + +// Sets the Y component of a vector to a floating point value passed by pointer +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMVectorSetYPtr(FXMVECTOR V, const float* y) noexcept +{ + assert(y != nullptr); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 U = { { { + V.vector4_f32[0], + *y, + V.vector4_f32[2], + V.vector4_f32[3] + } } }; + return U.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vld1q_lane_f32(y, V, 1); +#elif defined(_XM_SSE_INTRINSICS_) + // Swap y and x + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 2, 0, 1)); + // Convert input to vector + XMVECTOR vTemp = _mm_load_ss(y); + // Replace the x component + vResult = _mm_move_ss(vResult, vTemp); + // Swap y and x again + vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 2, 0, 1)); + return vResult; +#endif +} + +// Sets the Z component of a vector to a floating point value passed by pointer +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMVectorSetZPtr(FXMVECTOR V, const float* z) noexcept +{ + assert(z != nullptr); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 U = { { { + V.vector4_f32[0], + V.vector4_f32[1], + *z, + V.vector4_f32[3] + } } }; + return U.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vld1q_lane_f32(z, V, 2); +#elif defined(_XM_SSE_INTRINSICS_) + // Swap z and x + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 0, 1, 2)); + // Convert input to vector + XMVECTOR vTemp = _mm_load_ss(z); + // Replace the x component + vResult = _mm_move_ss(vResult, vTemp); + // Swap z and x again + vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 0, 1, 2)); + return vResult; +#endif +} + +// Sets the W component of a vector to a floating point value passed by pointer +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMVectorSetWPtr(FXMVECTOR V, const float* w) noexcept +{ + assert(w != nullptr); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 U = { { { + V.vector4_f32[0], + V.vector4_f32[1], + V.vector4_f32[2], + *w + } } }; + return U.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vld1q_lane_f32(w, V, 3); +#elif defined(_XM_SSE_INTRINSICS_) + // Swap w and x + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 2, 1, 3)); + // Convert input to vector + XMVECTOR vTemp = _mm_load_ss(w); + // Replace the x component + vResult = _mm_move_ss(vResult, vTemp); + // Swap w and x again + vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(0, 2, 1, 3)); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +// Sets a component of a vector to an integer passed by value +inline XMVECTOR XM_CALLCONV XMVectorSetIntByIndex(FXMVECTOR V, uint32_t x, size_t i) noexcept +{ + assert(i < 4); + _Analysis_assume_(i < 4); + XMVECTORU32 tmp; + tmp.v = V; + tmp.u[i] = x; + return tmp; +} + +//------------------------------------------------------------------------------ + +// Sets the X component of a vector to an integer passed by value +inline XMVECTOR XM_CALLCONV XMVectorSetIntX(FXMVECTOR V, uint32_t x) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORU32 U = { { { + x, + V.vector4_u32[1], + V.vector4_u32[2], + V.vector4_u32[3] + } } }; + return U.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vsetq_lane_u32(x, vreinterpretq_u32_f32(V), 0)); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i vTemp = _mm_cvtsi32_si128(static_cast(x)); + XMVECTOR vResult = _mm_move_ss(V, _mm_castsi128_ps(vTemp)); + return vResult; +#endif +} + +// Sets the Y component of a vector to an integer passed by value +inline XMVECTOR XM_CALLCONV XMVectorSetIntY(FXMVECTOR V, uint32_t y) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORU32 U = { { { + V.vector4_u32[0], + y, + V.vector4_u32[2], + V.vector4_u32[3] + } } }; + return U.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vsetq_lane_u32(y, vreinterpretq_u32_f32(V), 1)); +#elif defined(_XM_SSE4_INTRINSICS_) + __m128i vResult = _mm_castps_si128(V); + vResult = _mm_insert_epi32(vResult, static_cast(y), 1); + return _mm_castsi128_ps(vResult); +#elif defined(_XM_SSE_INTRINSICS_) + // Swap y and x + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 2, 0, 1)); + // Convert input to vector + __m128i vTemp = _mm_cvtsi32_si128(static_cast(y)); + // Replace the x component + vResult = _mm_move_ss(vResult, _mm_castsi128_ps(vTemp)); + // Swap y and x again + vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 2, 0, 1)); + return vResult; +#endif +} + +// Sets the Z component of a vector to an integer passed by value +inline XMVECTOR XM_CALLCONV XMVectorSetIntZ(FXMVECTOR V, uint32_t z) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORU32 U = { { { + V.vector4_u32[0], + V.vector4_u32[1], + z, + V.vector4_u32[3] + } } }; + return U.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vsetq_lane_u32(z, vreinterpretq_u32_f32(V), 2)); +#elif defined(_XM_SSE4_INTRINSICS_) + __m128i vResult = _mm_castps_si128(V); + vResult = _mm_insert_epi32(vResult, static_cast(z), 2); + return _mm_castsi128_ps(vResult); +#elif defined(_XM_SSE_INTRINSICS_) + // Swap z and x + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 0, 1, 2)); + // Convert input to vector + __m128i vTemp = _mm_cvtsi32_si128(static_cast(z)); + // Replace the x component + vResult = _mm_move_ss(vResult, _mm_castsi128_ps(vTemp)); + // Swap z and x again + vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 0, 1, 2)); + return vResult; +#endif +} + +// Sets the W component of a vector to an integer passed by value +inline XMVECTOR XM_CALLCONV XMVectorSetIntW(FXMVECTOR V, uint32_t w) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORU32 U = { { { + V.vector4_u32[0], + V.vector4_u32[1], + V.vector4_u32[2], + w + } } }; + return U.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vsetq_lane_u32(w, vreinterpretq_u32_f32(V), 3)); +#elif defined(_XM_SSE4_INTRINSICS_) + __m128i vResult = _mm_castps_si128(V); + vResult = _mm_insert_epi32(vResult, static_cast(w), 3); + return _mm_castsi128_ps(vResult); +#elif defined(_XM_SSE_INTRINSICS_) + // Swap w and x + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 2, 1, 3)); + // Convert input to vector + __m128i vTemp = _mm_cvtsi32_si128(static_cast(w)); + // Replace the x component + vResult = _mm_move_ss(vResult, _mm_castsi128_ps(vTemp)); + // Swap w and x again + vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(0, 2, 1, 3)); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +// Sets a component of a vector to an integer value passed by pointer +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMVectorSetIntByIndexPtr(FXMVECTOR V, const uint32_t* x, size_t i) noexcept +{ + assert(x != nullptr); + assert(i < 4); + _Analysis_assume_(i < 4); + XMVECTORU32 tmp; + tmp.v = V; + tmp.u[i] = *x; + return tmp; +} + +//------------------------------------------------------------------------------ + +// Sets the X component of a vector to an integer value passed by pointer +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMVectorSetIntXPtr(FXMVECTOR V, const uint32_t* x) noexcept +{ + assert(x != nullptr); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORU32 U = { { { + *x, + V.vector4_u32[1], + V.vector4_u32[2], + V.vector4_u32[3] + } } }; + return U.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vld1q_lane_u32(x, *reinterpret_cast(&V), 0)); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_load_ss(reinterpret_cast(x)); + XMVECTOR vResult = _mm_move_ss(V, vTemp); + return vResult; +#endif +} + +// Sets the Y component of a vector to an integer value passed by pointer +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMVectorSetIntYPtr(FXMVECTOR V, const uint32_t* y) noexcept +{ + assert(y != nullptr); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORU32 U = { { { + V.vector4_u32[0], + *y, + V.vector4_u32[2], + V.vector4_u32[3] + } } }; + return U.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vld1q_lane_u32(y, *reinterpret_cast(&V), 1)); +#elif defined(_XM_SSE_INTRINSICS_) + // Swap y and x + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 2, 0, 1)); + // Convert input to vector + XMVECTOR vTemp = _mm_load_ss(reinterpret_cast(y)); + // Replace the x component + vResult = _mm_move_ss(vResult, vTemp); + // Swap y and x again + vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 2, 0, 1)); + return vResult; +#endif +} + +// Sets the Z component of a vector to an integer value passed by pointer +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMVectorSetIntZPtr(FXMVECTOR V, const uint32_t* z) noexcept +{ + assert(z != nullptr); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORU32 U = { { { + V.vector4_u32[0], + V.vector4_u32[1], + *z, + V.vector4_u32[3] + } } }; + return U.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vld1q_lane_u32(z, *reinterpret_cast(&V), 2)); +#elif defined(_XM_SSE_INTRINSICS_) + // Swap z and x + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 0, 1, 2)); + // Convert input to vector + XMVECTOR vTemp = _mm_load_ss(reinterpret_cast(z)); + // Replace the x component + vResult = _mm_move_ss(vResult, vTemp); + // Swap z and x again + vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 0, 1, 2)); + return vResult; +#endif +} + +// Sets the W component of a vector to an integer value passed by pointer +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMVectorSetIntWPtr(FXMVECTOR V, const uint32_t* w) noexcept +{ + assert(w != nullptr); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORU32 U = { { { + V.vector4_u32[0], + V.vector4_u32[1], + V.vector4_u32[2], + *w + } } }; + return U.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vld1q_lane_u32(w, *reinterpret_cast(&V), 3)); +#elif defined(_XM_SSE_INTRINSICS_) + // Swap w and x + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 2, 1, 3)); + // Convert input to vector + XMVECTOR vTemp = _mm_load_ss(reinterpret_cast(w)); + // Replace the x component + vResult = _mm_move_ss(vResult, vTemp); + // Swap w and x again + vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(0, 2, 1, 3)); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorSwizzle +( + FXMVECTOR V, + uint32_t E0, + uint32_t E1, + uint32_t E2, + uint32_t E3 +) noexcept +{ + assert((E0 < 4) && (E1 < 4) && (E2 < 4) && (E3 < 4)); + _Analysis_assume_((E0 < 4) && (E1 < 4) && (E2 < 4) && (E3 < 4)); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORF32 Result = { { { + V.vector4_f32[E0], + V.vector4_f32[E1], + V.vector4_f32[E2], + V.vector4_f32[E3] + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const uint32_t ControlElement[4] = + { + 0x03020100, // XM_SWIZZLE_X + 0x07060504, // XM_SWIZZLE_Y + 0x0B0A0908, // XM_SWIZZLE_Z + 0x0F0E0D0C, // XM_SWIZZLE_W + }; + + uint8x8x2_t tbl; + tbl.val[0] = vreinterpret_u8_f32(vget_low_f32(V)); + tbl.val[1] = vreinterpret_u8_f32(vget_high_f32(V)); + + uint32x2_t idx = vcreate_u32(static_cast(ControlElement[E0]) | (static_cast(ControlElement[E1]) << 32)); + const uint8x8_t rL = vtbl2_u8(tbl, vreinterpret_u8_u32(idx)); + + idx = vcreate_u32(static_cast(ControlElement[E2]) | (static_cast(ControlElement[E3]) << 32)); + const uint8x8_t rH = vtbl2_u8(tbl, vreinterpret_u8_u32(idx)); + + return vcombine_f32(vreinterpret_f32_u8(rL), vreinterpret_f32_u8(rH)); +#elif defined(_XM_AVX_INTRINSICS_) + unsigned int elem[4] = { E0, E1, E2, E3 }; + __m128i vControl = _mm_loadu_si128(reinterpret_cast(&elem[0])); + return _mm_permutevar_ps(V, vControl); +#else + auto aPtr = reinterpret_cast(&V); + + XMVECTOR Result; + auto pWork = reinterpret_cast(&Result); + + pWork[0] = aPtr[E0]; + pWork[1] = aPtr[E1]; + pWork[2] = aPtr[E2]; + pWork[3] = aPtr[E3]; + + return Result; +#endif +} + +//------------------------------------------------------------------------------ +inline XMVECTOR XM_CALLCONV XMVectorPermute +( + FXMVECTOR V1, + FXMVECTOR V2, + uint32_t PermuteX, + uint32_t PermuteY, + uint32_t PermuteZ, + uint32_t PermuteW +) noexcept +{ + assert(PermuteX <= 7 && PermuteY <= 7 && PermuteZ <= 7 && PermuteW <= 7); + _Analysis_assume_(PermuteX <= 7 && PermuteY <= 7 && PermuteZ <= 7 && PermuteW <= 7); + +#if defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + static const uint32_t ControlElement[8] = + { + 0x03020100, // XM_PERMUTE_0X + 0x07060504, // XM_PERMUTE_0Y + 0x0B0A0908, // XM_PERMUTE_0Z + 0x0F0E0D0C, // XM_PERMUTE_0W + 0x13121110, // XM_PERMUTE_1X + 0x17161514, // XM_PERMUTE_1Y + 0x1B1A1918, // XM_PERMUTE_1Z + 0x1F1E1D1C, // XM_PERMUTE_1W + }; + + uint8x8x4_t tbl; + tbl.val[0] = vreinterpret_u8_f32(vget_low_f32(V1)); + tbl.val[1] = vreinterpret_u8_f32(vget_high_f32(V1)); + tbl.val[2] = vreinterpret_u8_f32(vget_low_f32(V2)); + tbl.val[3] = vreinterpret_u8_f32(vget_high_f32(V2)); + + uint32x2_t idx = vcreate_u32(static_cast(ControlElement[PermuteX]) | (static_cast(ControlElement[PermuteY]) << 32)); + const uint8x8_t rL = vtbl4_u8(tbl, vreinterpret_u8_u32(idx)); + + idx = vcreate_u32(static_cast(ControlElement[PermuteZ]) | (static_cast(ControlElement[PermuteW]) << 32)); + const uint8x8_t rH = vtbl4_u8(tbl, vreinterpret_u8_u32(idx)); + + return vcombine_f32(vreinterpret_f32_u8(rL), vreinterpret_f32_u8(rH)); +#elif defined(_XM_AVX_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + static const XMVECTORU32 three = { { { 3, 3, 3, 3 } } }; + + XM_ALIGNED_DATA(16) unsigned int elem[4] = { PermuteX, PermuteY, PermuteZ, PermuteW }; + __m128i vControl = _mm_load_si128(reinterpret_cast(&elem[0])); + + __m128i vSelect = _mm_cmpgt_epi32(vControl, three); + vControl = _mm_castps_si128(_mm_and_ps(_mm_castsi128_ps(vControl), three)); + + __m128 shuffled1 = _mm_permutevar_ps(V1, vControl); + __m128 shuffled2 = _mm_permutevar_ps(V2, vControl); + + __m128 masked1 = _mm_andnot_ps(_mm_castsi128_ps(vSelect), shuffled1); + __m128 masked2 = _mm_and_ps(_mm_castsi128_ps(vSelect), shuffled2); + + return _mm_or_ps(masked1, masked2); +#else + + const uint32_t* aPtr[2]; + aPtr[0] = reinterpret_cast(&V1); + aPtr[1] = reinterpret_cast(&V2); + + XMVECTOR Result; + auto pWork = reinterpret_cast(&Result); + + const uint32_t i0 = PermuteX & 3; + const uint32_t vi0 = PermuteX >> 2; + pWork[0] = aPtr[vi0][i0]; + + const uint32_t i1 = PermuteY & 3; + const uint32_t vi1 = PermuteY >> 2; + pWork[1] = aPtr[vi1][i1]; + + const uint32_t i2 = PermuteZ & 3; + const uint32_t vi2 = PermuteZ >> 2; + pWork[2] = aPtr[vi2][i2]; + + const uint32_t i3 = PermuteW & 3; + const uint32_t vi3 = PermuteW >> 2; + pWork[3] = aPtr[vi3][i3]; + + return Result; +#endif +} + +//------------------------------------------------------------------------------ +// Define a control vector to be used in XMVectorSelect +// operations. The four integers specified in XMVectorSelectControl +// serve as indices to select between components in two vectors. +// The first index controls selection for the first component of +// the vectors involved in a select operation, the second index +// controls selection for the second component etc. A value of +// zero for an index causes the corresponding component from the first +// vector to be selected whereas a one causes the component from the +// second vector to be selected instead. + +inline XMVECTOR XM_CALLCONV XMVectorSelectControl +( + uint32_t VectorIndex0, + uint32_t VectorIndex1, + uint32_t VectorIndex2, + uint32_t VectorIndex3 +) noexcept +{ +#if defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + // x=Index0,y=Index1,z=Index2,w=Index3 + __m128i vTemp = _mm_set_epi32(static_cast(VectorIndex3), static_cast(VectorIndex2), static_cast(VectorIndex1), static_cast(VectorIndex0)); + // Any non-zero entries become 0xFFFFFFFF else 0 + vTemp = _mm_cmpgt_epi32(vTemp, g_XMZero); + return _mm_castsi128_ps(vTemp); +#elif defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + int32x2_t V0 = vcreate_s32(static_cast(VectorIndex0) | (static_cast(VectorIndex1) << 32)); + int32x2_t V1 = vcreate_s32(static_cast(VectorIndex2) | (static_cast(VectorIndex3) << 32)); + int32x4_t vTemp = vcombine_s32(V0, V1); + // Any non-zero entries become 0xFFFFFFFF else 0 + return vreinterpretq_f32_u32(vcgtq_s32(vTemp, g_XMZero)); +#else + XMVECTOR ControlVector; + const uint32_t ControlElement[] = + { + XM_SELECT_0, + XM_SELECT_1 + }; + + assert(VectorIndex0 < 2); + assert(VectorIndex1 < 2); + assert(VectorIndex2 < 2); + assert(VectorIndex3 < 2); + _Analysis_assume_(VectorIndex0 < 2); + _Analysis_assume_(VectorIndex1 < 2); + _Analysis_assume_(VectorIndex2 < 2); + _Analysis_assume_(VectorIndex3 < 2); + + ControlVector.vector4_u32[0] = ControlElement[VectorIndex0]; + ControlVector.vector4_u32[1] = ControlElement[VectorIndex1]; + ControlVector.vector4_u32[2] = ControlElement[VectorIndex2]; + ControlVector.vector4_u32[3] = ControlElement[VectorIndex3]; + + return ControlVector; + +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorSelect +( + FXMVECTOR V1, + FXMVECTOR V2, + FXMVECTOR Control +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORU32 Result = { { { + (V1.vector4_u32[0] & ~Control.vector4_u32[0]) | (V2.vector4_u32[0] & Control.vector4_u32[0]), + (V1.vector4_u32[1] & ~Control.vector4_u32[1]) | (V2.vector4_u32[1] & Control.vector4_u32[1]), + (V1.vector4_u32[2] & ~Control.vector4_u32[2]) | (V2.vector4_u32[2] & Control.vector4_u32[2]), + (V1.vector4_u32[3] & ~Control.vector4_u32[3]) | (V2.vector4_u32[3] & Control.vector4_u32[3]), + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vbslq_f32(vreinterpretq_u32_f32(Control), V2, V1); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp1 = _mm_andnot_ps(Control, V1); + XMVECTOR vTemp2 = _mm_and_ps(V2, Control); + return _mm_or_ps(vTemp1, vTemp2); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorMergeXY +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORU32 Result = { { { + V1.vector4_u32[0], + V2.vector4_u32[0], + V1.vector4_u32[1], + V2.vector4_u32[1], + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vzipq_f32(V1, V2).val[0]; +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_unpacklo_ps(V1, V2); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorMergeZW +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORU32 Result = { { { + V1.vector4_u32[2], + V2.vector4_u32[2], + V1.vector4_u32[3], + V2.vector4_u32[3] + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vzipq_f32(V1, V2).val[1]; +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_unpackhi_ps(V1, V2); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorShiftLeft(FXMVECTOR V1, FXMVECTOR V2, uint32_t Elements) noexcept +{ + assert(Elements < 4); + _Analysis_assume_(Elements < 4); + return XMVectorPermute(V1, V2, Elements, ((Elements)+1), ((Elements)+2), ((Elements)+3)); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorRotateLeft(FXMVECTOR V, uint32_t Elements) noexcept +{ + assert(Elements < 4); + _Analysis_assume_(Elements < 4); + return XMVectorSwizzle(V, Elements & 3, (Elements + 1) & 3, (Elements + 2) & 3, (Elements + 3) & 3); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorRotateRight(FXMVECTOR V, uint32_t Elements) noexcept +{ + assert(Elements < 4); + _Analysis_assume_(Elements < 4); + return XMVectorSwizzle(V, (4 - (Elements)) & 3, (5 - (Elements)) & 3, (6 - (Elements)) & 3, (7 - (Elements)) & 3); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorInsert( + FXMVECTOR VD, FXMVECTOR VS, + uint32_t VSLeftRotateElements, + uint32_t Select0, uint32_t Select1, uint32_t Select2, uint32_t Select3) noexcept +{ + XMVECTOR Control = XMVectorSelectControl(Select0 & 1, Select1 & 1, Select2 & 1, Select3 & 1); + return XMVectorSelect(VD, XMVectorRotateLeft(VS, VSLeftRotateElements), Control); +} + +//------------------------------------------------------------------------------ +// Comparison operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorEqual +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORU32 Control = { { { + (V1.vector4_f32[0] == V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[1] == V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[2] == V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[3] == V2.vector4_f32[3]) ? 0xFFFFFFFF : 0, + } } }; + return Control.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vceqq_f32(V1, V2)); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_cmpeq_ps(V1, V2); +#endif +} + +//------------------------------------------------------------------------------ + +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMVectorEqualR +( + uint32_t* pCR, + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ + assert(pCR != nullptr); +#if defined(_XM_NO_INTRINSICS_) + uint32_t ux = (V1.vector4_f32[0] == V2.vector4_f32[0]) ? 0xFFFFFFFFU : 0; + uint32_t uy = (V1.vector4_f32[1] == V2.vector4_f32[1]) ? 0xFFFFFFFFU : 0; + uint32_t uz = (V1.vector4_f32[2] == V2.vector4_f32[2]) ? 0xFFFFFFFFU : 0; + uint32_t uw = (V1.vector4_f32[3] == V2.vector4_f32[3]) ? 0xFFFFFFFFU : 0; + uint32_t CR = 0; + if (ux & uy & uz & uw) + { + // All elements are greater + CR = XM_CRMASK_CR6TRUE; + } + else if (!(ux | uy | uz | uw)) + { + // All elements are not greater + CR = XM_CRMASK_CR6FALSE; + } + *pCR = CR; + + XMVECTORU32 Control = { { { ux, uy, uz, uw } } }; + return Control; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vceqq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vreinterpret_u8_u32(vget_low_u32(vResult)), vreinterpret_u8_u32(vget_high_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + uint32_t CR = 0; + if (r == 0xFFFFFFFFU) + { + // All elements are equal + CR = XM_CRMASK_CR6TRUE; + } + else if (!r) + { + // All elements are not equal + CR = XM_CRMASK_CR6FALSE; + } + *pCR = CR; + return vreinterpretq_f32_u32(vResult); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); + uint32_t CR = 0; + int iTest = _mm_movemask_ps(vTemp); + if (iTest == 0xf) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!iTest) + { + // All elements are not greater + CR = XM_CRMASK_CR6FALSE; + } + *pCR = CR; + return vTemp; +#endif +} + +//------------------------------------------------------------------------------ +// Treat the components of the vectors as unsigned integers and +// compare individual bits between the two. This is useful for +// comparing control vectors and result vectors returned from +// other comparison operations. + +inline XMVECTOR XM_CALLCONV XMVectorEqualInt +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORU32 Control = { { { + (V1.vector4_u32[0] == V2.vector4_u32[0]) ? 0xFFFFFFFF : 0, + (V1.vector4_u32[1] == V2.vector4_u32[1]) ? 0xFFFFFFFF : 0, + (V1.vector4_u32[2] == V2.vector4_u32[2]) ? 0xFFFFFFFF : 0, + (V1.vector4_u32[3] == V2.vector4_u32[3]) ? 0xFFFFFFFF : 0, + } } }; + return Control.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vceqq_s32(vreinterpretq_s32_f32(V1), vreinterpretq_s32_f32(V2))); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i V = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); + return _mm_castsi128_ps(V); +#endif +} + +//------------------------------------------------------------------------------ + +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMVectorEqualIntR +( + uint32_t* pCR, + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ + assert(pCR != nullptr); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Control = XMVectorEqualInt(V1, V2); + + *pCR = 0; + if (XMVector4EqualInt(Control, XMVectorTrueInt())) + { + // All elements are equal + *pCR |= XM_CRMASK_CR6TRUE; + } + else if (XMVector4EqualInt(Control, XMVectorFalseInt())) + { + // All elements are not equal + *pCR |= XM_CRMASK_CR6FALSE; + } + return Control; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + uint32_t CR = 0; + if (r == 0xFFFFFFFFU) + { + // All elements are equal + CR = XM_CRMASK_CR6TRUE; + } + else if (!r) + { + // All elements are not equal + CR = XM_CRMASK_CR6FALSE; + } + *pCR = CR; + return vreinterpretq_f32_u32(vResult); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i V = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); + int iTemp = _mm_movemask_ps(_mm_castsi128_ps(V)); + uint32_t CR = 0; + if (iTemp == 0x0F) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!iTemp) + { + CR = XM_CRMASK_CR6FALSE; + } + *pCR = CR; + return _mm_castsi128_ps(V); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorNearEqual +( + FXMVECTOR V1, + FXMVECTOR V2, + FXMVECTOR Epsilon +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + float fDeltax = V1.vector4_f32[0] - V2.vector4_f32[0]; + float fDeltay = V1.vector4_f32[1] - V2.vector4_f32[1]; + float fDeltaz = V1.vector4_f32[2] - V2.vector4_f32[2]; + float fDeltaw = V1.vector4_f32[3] - V2.vector4_f32[3]; + + fDeltax = fabsf(fDeltax); + fDeltay = fabsf(fDeltay); + fDeltaz = fabsf(fDeltaz); + fDeltaw = fabsf(fDeltaw); + + XMVECTORU32 Control = { { { + (fDeltax <= Epsilon.vector4_f32[0]) ? 0xFFFFFFFFU : 0, + (fDeltay <= Epsilon.vector4_f32[1]) ? 0xFFFFFFFFU : 0, + (fDeltaz <= Epsilon.vector4_f32[2]) ? 0xFFFFFFFFU : 0, + (fDeltaw <= Epsilon.vector4_f32[3]) ? 0xFFFFFFFFU : 0, + } } }; + return Control.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t vDelta = vsubq_f32(V1, V2); +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + return vacleq_f32(vDelta, Epsilon); +#else + return vreinterpretq_f32_u32(vcleq_f32(vabsq_f32(vDelta), Epsilon)); +#endif +#elif defined(_XM_SSE_INTRINSICS_) + // Get the difference + XMVECTOR vDelta = _mm_sub_ps(V1, V2); + // Get the absolute value of the difference + XMVECTOR vTemp = _mm_setzero_ps(); + vTemp = _mm_sub_ps(vTemp, vDelta); + vTemp = _mm_max_ps(vTemp, vDelta); + vTemp = _mm_cmple_ps(vTemp, Epsilon); + return vTemp; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorNotEqual +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORU32 Control = { { { + (V1.vector4_f32[0] != V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[1] != V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[2] != V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[3] != V2.vector4_f32[3]) ? 0xFFFFFFFF : 0, + } } }; + return Control.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vmvnq_u32(vceqq_f32(V1, V2))); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_cmpneq_ps(V1, V2); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorNotEqualInt +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORU32 Control = { { { + (V1.vector4_u32[0] != V2.vector4_u32[0]) ? 0xFFFFFFFFU : 0, + (V1.vector4_u32[1] != V2.vector4_u32[1]) ? 0xFFFFFFFFU : 0, + (V1.vector4_u32[2] != V2.vector4_u32[2]) ? 0xFFFFFFFFU : 0, + (V1.vector4_u32[3] != V2.vector4_u32[3]) ? 0xFFFFFFFFU : 0 + } } }; + return Control.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vmvnq_u32( + vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)))); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i V = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); + return _mm_xor_ps(_mm_castsi128_ps(V), g_XMNegOneMask); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorGreater +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORU32 Control = { { { + (V1.vector4_f32[0] > V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[1] > V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[2] > V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[3] > V2.vector4_f32[3]) ? 0xFFFFFFFF : 0 + } } }; + return Control.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vcgtq_f32(V1, V2)); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_cmpgt_ps(V1, V2); +#endif +} + +//------------------------------------------------------------------------------ + +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMVectorGreaterR +( + uint32_t* pCR, + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ + assert(pCR != nullptr); +#if defined(_XM_NO_INTRINSICS_) + + uint32_t ux = (V1.vector4_f32[0] > V2.vector4_f32[0]) ? 0xFFFFFFFFU : 0; + uint32_t uy = (V1.vector4_f32[1] > V2.vector4_f32[1]) ? 0xFFFFFFFFU : 0; + uint32_t uz = (V1.vector4_f32[2] > V2.vector4_f32[2]) ? 0xFFFFFFFFU : 0; + uint32_t uw = (V1.vector4_f32[3] > V2.vector4_f32[3]) ? 0xFFFFFFFFU : 0; + uint32_t CR = 0; + if (ux & uy & uz & uw) + { + // All elements are greater + CR = XM_CRMASK_CR6TRUE; + } + else if (!(ux | uy | uz | uw)) + { + // All elements are not greater + CR = XM_CRMASK_CR6FALSE; + } + *pCR = CR; + + XMVECTORU32 Control = { { { ux, uy, uz, uw } } }; + return Control.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vcgtq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + uint32_t CR = 0; + if (r == 0xFFFFFFFFU) + { + // All elements are greater + CR = XM_CRMASK_CR6TRUE; + } + else if (!r) + { + // All elements are not greater + CR = XM_CRMASK_CR6FALSE; + } + *pCR = CR; + return vreinterpretq_f32_u32(vResult); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); + uint32_t CR = 0; + int iTest = _mm_movemask_ps(vTemp); + if (iTest == 0xf) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!iTest) + { + // All elements are not greater + CR = XM_CRMASK_CR6FALSE; + } + *pCR = CR; + return vTemp; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorGreaterOrEqual +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORU32 Control = { { { + (V1.vector4_f32[0] >= V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[1] >= V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[2] >= V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[3] >= V2.vector4_f32[3]) ? 0xFFFFFFFF : 0 + } } }; + return Control.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vcgeq_f32(V1, V2)); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_cmpge_ps(V1, V2); +#endif +} + +//------------------------------------------------------------------------------ + +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMVectorGreaterOrEqualR +( + uint32_t* pCR, + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ + assert(pCR != nullptr); +#if defined(_XM_NO_INTRINSICS_) + + uint32_t ux = (V1.vector4_f32[0] >= V2.vector4_f32[0]) ? 0xFFFFFFFFU : 0; + uint32_t uy = (V1.vector4_f32[1] >= V2.vector4_f32[1]) ? 0xFFFFFFFFU : 0; + uint32_t uz = (V1.vector4_f32[2] >= V2.vector4_f32[2]) ? 0xFFFFFFFFU : 0; + uint32_t uw = (V1.vector4_f32[3] >= V2.vector4_f32[3]) ? 0xFFFFFFFFU : 0; + uint32_t CR = 0; + if (ux & uy & uz & uw) + { + // All elements are greater + CR = XM_CRMASK_CR6TRUE; + } + else if (!(ux | uy | uz | uw)) + { + // All elements are not greater + CR = XM_CRMASK_CR6FALSE; + } + *pCR = CR; + + XMVECTORU32 Control = { { { ux, uy, uz, uw } } }; + return Control.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vcgeq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + uint32_t CR = 0; + if (r == 0xFFFFFFFFU) + { + // All elements are greater or equal + CR = XM_CRMASK_CR6TRUE; + } + else if (!r) + { + // All elements are not greater or equal + CR = XM_CRMASK_CR6FALSE; + } + *pCR = CR; + return vreinterpretq_f32_u32(vResult); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); + uint32_t CR = 0; + int iTest = _mm_movemask_ps(vTemp); + if (iTest == 0xf) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!iTest) + { + // All elements are not greater + CR = XM_CRMASK_CR6FALSE; + } + *pCR = CR; + return vTemp; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorLess +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORU32 Control = { { { + (V1.vector4_f32[0] < V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[1] < V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[2] < V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[3] < V2.vector4_f32[3]) ? 0xFFFFFFFF : 0 + } } }; + return Control.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vcltq_f32(V1, V2)); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_cmplt_ps(V1, V2); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorLessOrEqual +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORU32 Control = { { { + (V1.vector4_f32[0] <= V2.vector4_f32[0]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[1] <= V2.vector4_f32[1]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[2] <= V2.vector4_f32[2]) ? 0xFFFFFFFF : 0, + (V1.vector4_f32[3] <= V2.vector4_f32[3]) ? 0xFFFFFFFF : 0 + } } }; + return Control.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vcleq_f32(V1, V2)); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_cmple_ps(V1, V2); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorInBounds +( + FXMVECTOR V, + FXMVECTOR Bounds +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORU32 Control = { { { + (V.vector4_f32[0] <= Bounds.vector4_f32[0] && V.vector4_f32[0] >= -Bounds.vector4_f32[0]) ? 0xFFFFFFFF : 0, + (V.vector4_f32[1] <= Bounds.vector4_f32[1] && V.vector4_f32[1] >= -Bounds.vector4_f32[1]) ? 0xFFFFFFFF : 0, + (V.vector4_f32[2] <= Bounds.vector4_f32[2] && V.vector4_f32[2] >= -Bounds.vector4_f32[2]) ? 0xFFFFFFFF : 0, + (V.vector4_f32[3] <= Bounds.vector4_f32[3] && V.vector4_f32[3] >= -Bounds.vector4_f32[3]) ? 0xFFFFFFFF : 0 + } } }; + return Control.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Test if less than or equal + uint32x4_t vTemp1 = vcleq_f32(V, Bounds); + // Negate the bounds + uint32x4_t vTemp2 = vreinterpretq_u32_f32(vnegq_f32(Bounds)); + // Test if greater or equal (Reversed) + vTemp2 = vcleq_f32(vreinterpretq_f32_u32(vTemp2), V); + // Blend answers + vTemp1 = vandq_u32(vTemp1, vTemp2); + return vreinterpretq_f32_u32(vTemp1); +#elif defined(_XM_SSE_INTRINSICS_) + // Test if less than or equal + XMVECTOR vTemp1 = _mm_cmple_ps(V, Bounds); + // Negate the bounds + XMVECTOR vTemp2 = _mm_mul_ps(Bounds, g_XMNegativeOne); + // Test if greater or equal (Reversed) + vTemp2 = _mm_cmple_ps(vTemp2, V); + // Blend answers + vTemp1 = _mm_and_ps(vTemp1, vTemp2); + return vTemp1; +#endif +} + +//------------------------------------------------------------------------------ + +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMVectorInBoundsR +( + uint32_t* pCR, + FXMVECTOR V, + FXMVECTOR Bounds +) noexcept +{ + assert(pCR != nullptr); +#if defined(_XM_NO_INTRINSICS_) + + uint32_t ux = (V.vector4_f32[0] <= Bounds.vector4_f32[0] && V.vector4_f32[0] >= -Bounds.vector4_f32[0]) ? 0xFFFFFFFFU : 0; + uint32_t uy = (V.vector4_f32[1] <= Bounds.vector4_f32[1] && V.vector4_f32[1] >= -Bounds.vector4_f32[1]) ? 0xFFFFFFFFU : 0; + uint32_t uz = (V.vector4_f32[2] <= Bounds.vector4_f32[2] && V.vector4_f32[2] >= -Bounds.vector4_f32[2]) ? 0xFFFFFFFFU : 0; + uint32_t uw = (V.vector4_f32[3] <= Bounds.vector4_f32[3] && V.vector4_f32[3] >= -Bounds.vector4_f32[3]) ? 0xFFFFFFFFU : 0; + + uint32_t CR = 0; + if (ux & uy & uz & uw) + { + // All elements are in bounds + CR = XM_CRMASK_CR6BOUNDS; + } + *pCR = CR; + + XMVECTORU32 Control = { { { ux, uy, uz, uw } } }; + return Control.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Test if less than or equal + uint32x4_t vTemp1 = vcleq_f32(V, Bounds); + // Negate the bounds + uint32x4_t vTemp2 = vreinterpretq_u32_f32(vnegq_f32(Bounds)); + // Test if greater or equal (Reversed) + vTemp2 = vcleq_f32(vreinterpretq_f32_u32(vTemp2), V); + // Blend answers + vTemp1 = vandq_u32(vTemp1, vTemp2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTemp1)), vget_high_u8(vreinterpretq_u8_u32(vTemp1))); + uint16x4x2_t vTemp3 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp3.val[1]), 1); + uint32_t CR = 0; + if (r == 0xFFFFFFFFU) + { + // All elements are in bounds + CR = XM_CRMASK_CR6BOUNDS; + } + *pCR = CR; + return vreinterpretq_f32_u32(vTemp1); +#elif defined(_XM_SSE_INTRINSICS_) + // Test if less than or equal + XMVECTOR vTemp1 = _mm_cmple_ps(V, Bounds); + // Negate the bounds + XMVECTOR vTemp2 = _mm_mul_ps(Bounds, g_XMNegativeOne); + // Test if greater or equal (Reversed) + vTemp2 = _mm_cmple_ps(vTemp2, V); + // Blend answers + vTemp1 = _mm_and_ps(vTemp1, vTemp2); + + uint32_t CR = 0; + if (_mm_movemask_ps(vTemp1) == 0xf) + { + // All elements are in bounds + CR = XM_CRMASK_CR6BOUNDS; + } + *pCR = CR; + return vTemp1; +#endif +} + +//------------------------------------------------------------------------------ + +#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) +#pragma float_control(push) +#pragma float_control(precise, on) +#endif + +inline XMVECTOR XM_CALLCONV XMVectorIsNaN(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORU32 Control = { { { + XMISNAN(V.vector4_f32[0]) ? 0xFFFFFFFFU : 0, + XMISNAN(V.vector4_f32[1]) ? 0xFFFFFFFFU : 0, + XMISNAN(V.vector4_f32[2]) ? 0xFFFFFFFFU : 0, + XMISNAN(V.vector4_f32[3]) ? 0xFFFFFFFFU : 0 + } } }; + return Control.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(__clang__) && defined(__FINITE_MATH_ONLY__) + XMVECTORU32 vResult = { { { + isnan(vgetq_lane_f32(V, 0)) ? 0xFFFFFFFFU : 0, + isnan(vgetq_lane_f32(V, 1)) ? 0xFFFFFFFFU : 0, + isnan(vgetq_lane_f32(V, 2)) ? 0xFFFFFFFFU : 0, + isnan(vgetq_lane_f32(V, 3)) ? 0xFFFFFFFFU : 0 } } }; + return vResult.v; +#else +// Test against itself. NaN is always not equal + uint32x4_t vTempNan = vceqq_f32(V, V); + // Flip results + return vreinterpretq_f32_u32(vmvnq_u32(vTempNan)); +#endif +#elif defined(_XM_SSE_INTRINSICS_) +#if defined(__clang__) && defined(__FINITE_MATH_ONLY__) + XM_ALIGNED_DATA(16) float tmp[4]; + _mm_store_ps(tmp, V); + XMVECTORU32 vResult = { { { + isnan(tmp[0]) ? 0xFFFFFFFFU : 0, + isnan(tmp[1]) ? 0xFFFFFFFFU : 0, + isnan(tmp[2]) ? 0xFFFFFFFFU : 0, + isnan(tmp[3]) ? 0xFFFFFFFFU : 0 } } }; + return vResult.v; +#else +// Test against itself. NaN is always not equal + return _mm_cmpneq_ps(V, V); +#endif +#endif +} + +#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) +#pragma float_control(pop) +#endif + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorIsInfinite(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORU32 Control = { { { + XMISINF(V.vector4_f32[0]) ? 0xFFFFFFFFU : 0, + XMISINF(V.vector4_f32[1]) ? 0xFFFFFFFFU : 0, + XMISINF(V.vector4_f32[2]) ? 0xFFFFFFFFU : 0, + XMISINF(V.vector4_f32[3]) ? 0xFFFFFFFFU : 0 + } } }; + return Control.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Mask off the sign bit + uint32x4_t vTemp = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); + // Compare to infinity + vTemp = vceqq_f32(vreinterpretq_f32_u32(vTemp), g_XMInfinity); + // If any are infinity, the signs are true. + return vreinterpretq_f32_u32(vTemp); +#elif defined(_XM_SSE_INTRINSICS_) + // Mask off the sign bit + __m128 vTemp = _mm_and_ps(V, g_XMAbsMask); + // Compare to infinity + vTemp = _mm_cmpeq_ps(vTemp, g_XMInfinity); + // If any are infinity, the signs are true. + return vTemp; +#endif +} + +//------------------------------------------------------------------------------ +// Rounding and clamping operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorMin +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORF32 Result = { { { + (V1.vector4_f32[0] < V2.vector4_f32[0]) ? V1.vector4_f32[0] : V2.vector4_f32[0], + (V1.vector4_f32[1] < V2.vector4_f32[1]) ? V1.vector4_f32[1] : V2.vector4_f32[1], + (V1.vector4_f32[2] < V2.vector4_f32[2]) ? V1.vector4_f32[2] : V2.vector4_f32[2], + (V1.vector4_f32[3] < V2.vector4_f32[3]) ? V1.vector4_f32[3] : V2.vector4_f32[3] + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vminq_f32(V1, V2); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_min_ps(V1, V2); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorMax +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORF32 Result = { { { + (V1.vector4_f32[0] > V2.vector4_f32[0]) ? V1.vector4_f32[0] : V2.vector4_f32[0], + (V1.vector4_f32[1] > V2.vector4_f32[1]) ? V1.vector4_f32[1] : V2.vector4_f32[1], + (V1.vector4_f32[2] > V2.vector4_f32[2]) ? V1.vector4_f32[2] : V2.vector4_f32[2], + (V1.vector4_f32[3] > V2.vector4_f32[3]) ? V1.vector4_f32[3] : V2.vector4_f32[3] + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vmaxq_f32(V1, V2); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_max_ps(V1, V2); +#endif +} + +//------------------------------------------------------------------------------ + +namespace MathInternal +{ + // Round to nearest (even) a.k.a. banker's rounding + inline float round_to_nearest(float x) noexcept + { + float i = floorf(x); + x -= i; + if (x < 0.5f) + return i; + if (x > 0.5f) + return i + 1.f; + + float int_part; + (void)modff(i / 2.f, &int_part); + if ((2.f * int_part) == i) + { + return i; + } + + return i + 1.f; + } +} + +#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) +#pragma float_control(push) +#pragma float_control(precise, on) +#endif + +inline XMVECTOR XM_CALLCONV XMVectorRound(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORF32 Result = { { { + MathInternal::round_to_nearest(V.vector4_f32[0]), + MathInternal::round_to_nearest(V.vector4_f32[1]), + MathInternal::round_to_nearest(V.vector4_f32[2]), + MathInternal::round_to_nearest(V.vector4_f32[3]) + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ + return vrndnq_f32(V); +#else + uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(V), g_XMNegativeZero); + float32x4_t sMagic = vreinterpretq_f32_u32(vorrq_u32(g_XMNoFraction, sign)); + float32x4_t R1 = vaddq_f32(V, sMagic); + R1 = vsubq_f32(R1, sMagic); + float32x4_t R2 = vabsq_f32(V); + uint32x4_t mask = vcleq_f32(R2, g_XMNoFraction); + return vbslq_f32(mask, R1, V); +#endif +#elif defined(_XM_SSE4_INTRINSICS_) + return _mm_round_ps(V, _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); +#elif defined(_XM_SSE_INTRINSICS_) + __m128 sign = _mm_and_ps(V, g_XMNegativeZero); + __m128 sMagic = _mm_or_ps(g_XMNoFraction, sign); + __m128 R1 = _mm_add_ps(V, sMagic); + R1 = _mm_sub_ps(R1, sMagic); + __m128 R2 = _mm_and_ps(V, g_XMAbsMask); + __m128 mask = _mm_cmple_ps(R2, g_XMNoFraction); + R2 = _mm_andnot_ps(mask, V); + R1 = _mm_and_ps(R1, mask); + XMVECTOR vResult = _mm_xor_ps(R1, R2); + return vResult; +#endif +} + +#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) +#pragma float_control(pop) +#endif + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorTruncate(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR Result; + uint32_t i; + + // Avoid C4701 + Result.vector4_f32[0] = 0.0f; + + for (i = 0; i < 4; i++) + { + if (XMISNAN(V.vector4_f32[i])) + { + Result.vector4_u32[i] = 0x7FC00000; + } + else if (fabsf(V.vector4_f32[i]) < 8388608.0f) + { + Result.vector4_f32[i] = static_cast(static_cast(V.vector4_f32[i])); + } + else + { + Result.vector4_f32[i] = V.vector4_f32[i]; + } + } + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ + return vrndq_f32(V); +#else + float32x4_t vTest = vabsq_f32(V); + vTest = vreinterpretq_f32_u32(vcltq_f32(vTest, g_XMNoFraction)); + + int32x4_t vInt = vcvtq_s32_f32(V); + float32x4_t vResult = vcvtq_f32_s32(vInt); + + // All numbers less than 8388608 will use the round to int + // All others, use the ORIGINAL value + return vbslq_f32(vreinterpretq_u32_f32(vTest), vResult, V); +#endif +#elif defined(_XM_SSE4_INTRINSICS_) + return _mm_round_ps(V, _MM_FROUND_TO_ZERO | _MM_FROUND_NO_EXC); +#elif defined(_XM_SSE_INTRINSICS_) + // To handle NAN, INF and numbers greater than 8388608, use masking + // Get the abs value + __m128i vTest = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); + // Test for greater than 8388608 (All floats with NO fractionals, NAN and INF + vTest = _mm_cmplt_epi32(vTest, g_XMNoFraction); + // Convert to int and back to float for rounding with truncation + __m128i vInt = _mm_cvttps_epi32(V); + // Convert back to floats + XMVECTOR vResult = _mm_cvtepi32_ps(vInt); + // All numbers less than 8388608 will use the round to int + vResult = _mm_and_ps(vResult, _mm_castsi128_ps(vTest)); + // All others, use the ORIGINAL value + vTest = _mm_andnot_si128(vTest, _mm_castps_si128(V)); + vResult = _mm_or_ps(vResult, _mm_castsi128_ps(vTest)); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorFloor(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + floorf(V.vector4_f32[0]), + floorf(V.vector4_f32[1]), + floorf(V.vector4_f32[2]), + floorf(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ + return vrndmq_f32(V); +#else + float32x4_t vTest = vabsq_f32(V); + vTest = vreinterpretq_f32_u32(vcltq_f32(vTest, g_XMNoFraction)); + // Truncate + int32x4_t vInt = vcvtq_s32_f32(V); + float32x4_t vResult = vcvtq_f32_s32(vInt); + uint32x4_t vLargerMask = vcgtq_f32(vResult, V); + // 0 -> 0, 0xffffffff -> -1.0f + float32x4_t vLarger = vcvtq_f32_s32(vreinterpretq_s32_u32(vLargerMask)); + vResult = vaddq_f32(vResult, vLarger); + // All numbers less than 8388608 will use the round to int + // All others, use the ORIGINAL value + return vbslq_f32(vreinterpretq_u32_f32(vTest), vResult, V); +#endif +#elif defined(_XM_SSE4_INTRINSICS_) + return _mm_floor_ps(V); +#elif defined(_XM_SSE_INTRINSICS_) + // To handle NAN, INF and numbers greater than 8388608, use masking + __m128i vTest = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); + vTest = _mm_cmplt_epi32(vTest, g_XMNoFraction); + // Truncate + __m128i vInt = _mm_cvttps_epi32(V); + XMVECTOR vResult = _mm_cvtepi32_ps(vInt); + __m128 vLarger = _mm_cmpgt_ps(vResult, V); + // 0 -> 0, 0xffffffff -> -1.0f + vLarger = _mm_cvtepi32_ps(_mm_castps_si128(vLarger)); + vResult = _mm_add_ps(vResult, vLarger); + // All numbers less than 8388608 will use the round to int + vResult = _mm_and_ps(vResult, _mm_castsi128_ps(vTest)); + // All others, use the ORIGINAL value + vTest = _mm_andnot_si128(vTest, _mm_castps_si128(V)); + vResult = _mm_or_ps(vResult, _mm_castsi128_ps(vTest)); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorCeiling(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + ceilf(V.vector4_f32[0]), + ceilf(V.vector4_f32[1]), + ceilf(V.vector4_f32[2]), + ceilf(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ + return vrndpq_f32(V); +#else + float32x4_t vTest = vabsq_f32(V); + vTest = vreinterpretq_f32_u32(vcltq_f32(vTest, g_XMNoFraction)); + // Truncate + int32x4_t vInt = vcvtq_s32_f32(V); + float32x4_t vResult = vcvtq_f32_s32(vInt); + uint32x4_t vSmallerMask = vcltq_f32(vResult, V); + // 0 -> 0, 0xffffffff -> -1.0f + float32x4_t vSmaller = vcvtq_f32_s32(vreinterpretq_s32_u32(vSmallerMask)); + vResult = vsubq_f32(vResult, vSmaller); + // All numbers less than 8388608 will use the round to int + // All others, use the ORIGINAL value + return vbslq_f32(vreinterpretq_u32_f32(vTest), vResult, V); +#endif +#elif defined(_XM_SSE4_INTRINSICS_) + return _mm_ceil_ps(V); +#elif defined(_XM_SSE_INTRINSICS_) + // To handle NAN, INF and numbers greater than 8388608, use masking + __m128i vTest = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); + vTest = _mm_cmplt_epi32(vTest, g_XMNoFraction); + // Truncate + __m128i vInt = _mm_cvttps_epi32(V); + XMVECTOR vResult = _mm_cvtepi32_ps(vInt); + __m128 vSmaller = _mm_cmplt_ps(vResult, V); + // 0 -> 0, 0xffffffff -> -1.0f + vSmaller = _mm_cvtepi32_ps(_mm_castps_si128(vSmaller)); + vResult = _mm_sub_ps(vResult, vSmaller); + // All numbers less than 8388608 will use the round to int + vResult = _mm_and_ps(vResult, _mm_castsi128_ps(vTest)); + // All others, use the ORIGINAL value + vTest = _mm_andnot_si128(vTest, _mm_castps_si128(V)); + vResult = _mm_or_ps(vResult, _mm_castsi128_ps(vTest)); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorClamp +( + FXMVECTOR V, + FXMVECTOR Min, + FXMVECTOR Max +) noexcept +{ + assert(XMVector4LessOrEqual(Min, Max)); + +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Result; + Result = XMVectorMax(Min, V); + Result = XMVectorMin(Max, Result); + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t vResult = vmaxq_f32(Min, V); + vResult = vminq_f32(Max, vResult); + return vResult; +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult; + vResult = _mm_max_ps(Min, V); + vResult = _mm_min_ps(Max, vResult); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorSaturate(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + const XMVECTOR Zero = XMVectorZero(); + + return XMVectorClamp(V, Zero, g_XMOne.v); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Set <0 to 0 + float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); + // Set>1 to 1 + return vminq_f32(vResult, vdupq_n_f32(1.0f)); +#elif defined(_XM_SSE_INTRINSICS_) + // Set <0 to 0 + XMVECTOR vResult = _mm_max_ps(V, g_XMZero); + // Set>1 to 1 + return _mm_min_ps(vResult, g_XMOne); +#endif +} + +//------------------------------------------------------------------------------ +// Bitwise logical operations +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorAndInt +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORU32 Result = { { { + V1.vector4_u32[0] & V2.vector4_u32[0], + V1.vector4_u32[1] & V2.vector4_u32[1], + V1.vector4_u32[2] & V2.vector4_u32[2], + V1.vector4_u32[3] & V2.vector4_u32[3] + } } }; + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2))); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_and_ps(V1, V2); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorAndCInt +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORU32 Result = { { { + V1.vector4_u32[0] & ~V2.vector4_u32[0], + V1.vector4_u32[1] & ~V2.vector4_u32[1], + V1.vector4_u32[2] & ~V2.vector4_u32[2], + V1.vector4_u32[3] & ~V2.vector4_u32[3] + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vbicq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2))); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i V = _mm_andnot_si128(_mm_castps_si128(V2), _mm_castps_si128(V1)); + return _mm_castsi128_ps(V); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorOrInt +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORU32 Result = { { { + V1.vector4_u32[0] | V2.vector4_u32[0], + V1.vector4_u32[1] | V2.vector4_u32[1], + V1.vector4_u32[2] | V2.vector4_u32[2], + V1.vector4_u32[3] | V2.vector4_u32[3] + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(vorrq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2))); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i V = _mm_or_si128(_mm_castps_si128(V1), _mm_castps_si128(V2)); + return _mm_castsi128_ps(V); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorNorInt +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORU32 Result = { { { + ~(V1.vector4_u32[0] | V2.vector4_u32[0]), + ~(V1.vector4_u32[1] | V2.vector4_u32[1]), + ~(V1.vector4_u32[2] | V2.vector4_u32[2]), + ~(V1.vector4_u32[3] | V2.vector4_u32[3]) + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t Result = vorrq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); + return vreinterpretq_f32_u32(vbicq_u32(g_XMNegOneMask, Result)); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i Result; + Result = _mm_or_si128(_mm_castps_si128(V1), _mm_castps_si128(V2)); + Result = _mm_andnot_si128(Result, g_XMNegOneMask); + return _mm_castsi128_ps(Result); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorXorInt +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORU32 Result = { { { + V1.vector4_u32[0] ^ V2.vector4_u32[0], + V1.vector4_u32[1] ^ V2.vector4_u32[1], + V1.vector4_u32[2] ^ V2.vector4_u32[2], + V1.vector4_u32[3] ^ V2.vector4_u32[3] + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vreinterpretq_f32_u32(veorq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2))); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i V = _mm_xor_si128(_mm_castps_si128(V1), _mm_castps_si128(V2)); + return _mm_castsi128_ps(V); +#endif +} + +//------------------------------------------------------------------------------ +// Computation operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorNegate(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORF32 Result = { { { + -V.vector4_f32[0], + -V.vector4_f32[1], + -V.vector4_f32[2], + -V.vector4_f32[3] + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vnegq_f32(V); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR Z; + + Z = _mm_setzero_ps(); + + return _mm_sub_ps(Z, V); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorAdd +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORF32 Result = { { { + V1.vector4_f32[0] + V2.vector4_f32[0], + V1.vector4_f32[1] + V2.vector4_f32[1], + V1.vector4_f32[2] + V2.vector4_f32[2], + V1.vector4_f32[3] + V2.vector4_f32[3] + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vaddq_f32(V1, V2); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_add_ps(V1, V2); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorSum(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORF32 Result; + Result.f[0] = + Result.f[1] = + Result.f[2] = + Result.f[3] = V.vector4_f32[0] + V.vector4_f32[1] + V.vector4_f32[2] + V.vector4_f32[3]; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ + float32x4_t vTemp = vpaddq_f32(V, V); + return vpaddq_f32(vTemp, vTemp); +#else + float32x2_t v1 = vget_low_f32(V); + float32x2_t v2 = vget_high_f32(V); + v1 = vadd_f32(v1, v2); + v1 = vpadd_f32(v1, v1); + return vcombine_f32(v1, v1); +#endif +#elif defined(_XM_SSE3_INTRINSICS_) + XMVECTOR vTemp = _mm_hadd_ps(V, V); + return _mm_hadd_ps(vTemp, vTemp); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 3, 0, 1)); + XMVECTOR vTemp2 = _mm_add_ps(V, vTemp); + vTemp = XM_PERMUTE_PS(vTemp2, _MM_SHUFFLE(1, 0, 3, 2)); + return _mm_add_ps(vTemp, vTemp2); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorAddAngles +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + const XMVECTOR Zero = XMVectorZero(); + + // Add the given angles together. If the range of V1 is such + // that -Pi <= V1 < Pi and the range of V2 is such that + // -2Pi <= V2 <= 2Pi, then the range of the resulting angle + // will be -Pi <= Result < Pi. + XMVECTOR Result = XMVectorAdd(V1, V2); + + XMVECTOR Mask = XMVectorLess(Result, g_XMNegativePi.v); + XMVECTOR Offset = XMVectorSelect(Zero, g_XMTwoPi.v, Mask); + + Mask = XMVectorGreaterOrEqual(Result, g_XMPi.v); + Offset = XMVectorSelect(Offset, g_XMNegativeTwoPi.v, Mask); + + Result = XMVectorAdd(Result, Offset); + + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Adjust the angles + float32x4_t vResult = vaddq_f32(V1, V2); + // Less than Pi? + uint32x4_t vOffset = vcltq_f32(vResult, g_XMNegativePi); + vOffset = vandq_u32(vOffset, g_XMTwoPi); + // Add 2Pi to all entries less than -Pi + vResult = vaddq_f32(vResult, vreinterpretq_f32_u32(vOffset)); + // Greater than or equal to Pi? + vOffset = vcgeq_f32(vResult, g_XMPi); + vOffset = vandq_u32(vOffset, g_XMTwoPi); + // Sub 2Pi to all entries greater than Pi + vResult = vsubq_f32(vResult, vreinterpretq_f32_u32(vOffset)); + return vResult; +#elif defined(_XM_SSE_INTRINSICS_) + // Adjust the angles + XMVECTOR vResult = _mm_add_ps(V1, V2); + // Less than Pi? + XMVECTOR vOffset = _mm_cmplt_ps(vResult, g_XMNegativePi); + vOffset = _mm_and_ps(vOffset, g_XMTwoPi); + // Add 2Pi to all entries less than -Pi + vResult = _mm_add_ps(vResult, vOffset); + // Greater than or equal to Pi? + vOffset = _mm_cmpge_ps(vResult, g_XMPi); + vOffset = _mm_and_ps(vOffset, g_XMTwoPi); + // Sub 2Pi to all entries greater than Pi + vResult = _mm_sub_ps(vResult, vOffset); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorSubtract +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORF32 Result = { { { + V1.vector4_f32[0] - V2.vector4_f32[0], + V1.vector4_f32[1] - V2.vector4_f32[1], + V1.vector4_f32[2] - V2.vector4_f32[2], + V1.vector4_f32[3] - V2.vector4_f32[3] + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vsubq_f32(V1, V2); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_sub_ps(V1, V2); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorSubtractAngles +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + const XMVECTOR Zero = XMVectorZero(); + + // Subtract the given angles. If the range of V1 is such + // that -Pi <= V1 < Pi and the range of V2 is such that + // -2Pi <= V2 <= 2Pi, then the range of the resulting angle + // will be -Pi <= Result < Pi. + XMVECTOR Result = XMVectorSubtract(V1, V2); + + XMVECTOR Mask = XMVectorLess(Result, g_XMNegativePi.v); + XMVECTOR Offset = XMVectorSelect(Zero, g_XMTwoPi.v, Mask); + + Mask = XMVectorGreaterOrEqual(Result, g_XMPi.v); + Offset = XMVectorSelect(Offset, g_XMNegativeTwoPi.v, Mask); + + Result = XMVectorAdd(Result, Offset); + + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Adjust the angles + XMVECTOR vResult = vsubq_f32(V1, V2); + // Less than Pi? + uint32x4_t vOffset = vcltq_f32(vResult, g_XMNegativePi); + vOffset = vandq_u32(vOffset, g_XMTwoPi); + // Add 2Pi to all entries less than -Pi + vResult = vaddq_f32(vResult, vreinterpretq_f32_u32(vOffset)); + // Greater than or equal to Pi? + vOffset = vcgeq_f32(vResult, g_XMPi); + vOffset = vandq_u32(vOffset, g_XMTwoPi); + // Sub 2Pi to all entries greater than Pi + vResult = vsubq_f32(vResult, vreinterpretq_f32_u32(vOffset)); + return vResult; +#elif defined(_XM_SSE_INTRINSICS_) + // Adjust the angles + XMVECTOR vResult = _mm_sub_ps(V1, V2); + // Less than Pi? + XMVECTOR vOffset = _mm_cmplt_ps(vResult, g_XMNegativePi); + vOffset = _mm_and_ps(vOffset, g_XMTwoPi); + // Add 2Pi to all entries less than -Pi + vResult = _mm_add_ps(vResult, vOffset); + // Greater than or equal to Pi? + vOffset = _mm_cmpge_ps(vResult, g_XMPi); + vOffset = _mm_and_ps(vOffset, g_XMTwoPi); + // Sub 2Pi to all entries greater than Pi + vResult = _mm_sub_ps(vResult, vOffset); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorMultiply +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + V1.vector4_f32[0] * V2.vector4_f32[0], + V1.vector4_f32[1] * V2.vector4_f32[1], + V1.vector4_f32[2] * V2.vector4_f32[2], + V1.vector4_f32[3] * V2.vector4_f32[3] + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vmulq_f32(V1, V2); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_mul_ps(V1, V2); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorMultiplyAdd +( + FXMVECTOR V1, + FXMVECTOR V2, + FXMVECTOR V3 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + V1.vector4_f32[0] * V2.vector4_f32[0] + V3.vector4_f32[0], + V1.vector4_f32[1] * V2.vector4_f32[1] + V3.vector4_f32[1], + V1.vector4_f32[2] * V2.vector4_f32[2] + V3.vector4_f32[2], + V1.vector4_f32[3] * V2.vector4_f32[3] + V3.vector4_f32[3] + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ + return vfmaq_f32(V3, V1, V2); +#else + return vmlaq_f32(V3, V1, V2); +#endif +#elif defined(_XM_SSE_INTRINSICS_) + return XM_FMADD_PS(V1, V2, V3); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorDivide +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + V1.vector4_f32[0] / V2.vector4_f32[0], + V1.vector4_f32[1] / V2.vector4_f32[1], + V1.vector4_f32[2] / V2.vector4_f32[2], + V1.vector4_f32[3] / V2.vector4_f32[3] + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ + return vdivq_f32(V1, V2); +#else + // 2 iterations of Newton-Raphson refinement of reciprocal + float32x4_t Reciprocal = vrecpeq_f32(V2); + float32x4_t S = vrecpsq_f32(Reciprocal, V2); + Reciprocal = vmulq_f32(S, Reciprocal); + S = vrecpsq_f32(Reciprocal, V2); + Reciprocal = vmulq_f32(S, Reciprocal); + return vmulq_f32(V1, Reciprocal); +#endif +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_div_ps(V1, V2); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorNegativeMultiplySubtract +( + FXMVECTOR V1, + FXMVECTOR V2, + FXMVECTOR V3 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + V3.vector4_f32[0] - (V1.vector4_f32[0] * V2.vector4_f32[0]), + V3.vector4_f32[1] - (V1.vector4_f32[1] * V2.vector4_f32[1]), + V3.vector4_f32[2] - (V1.vector4_f32[2] * V2.vector4_f32[2]), + V3.vector4_f32[3] - (V1.vector4_f32[3] * V2.vector4_f32[3]) + } } }; + return Result; +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ + return vfmsq_f32(V3, V1, V2); +#else + return vmlsq_f32(V3, V1, V2); +#endif +#elif defined(_XM_SSE_INTRINSICS_) + return XM_FNMADD_PS(V1, V2, V3); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorScale +( + FXMVECTOR V, + float ScaleFactor +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + V.vector4_f32[0] * ScaleFactor, + V.vector4_f32[1] * ScaleFactor, + V.vector4_f32[2] * ScaleFactor, + V.vector4_f32[3] * ScaleFactor + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vmulq_n_f32(V, ScaleFactor); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = _mm_set_ps1(ScaleFactor); + return _mm_mul_ps(vResult, V); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorReciprocalEst(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + 1.f / V.vector4_f32[0], + 1.f / V.vector4_f32[1], + 1.f / V.vector4_f32[2], + 1.f / V.vector4_f32[3] + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vrecpeq_f32(V); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_rcp_ps(V); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorReciprocal(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + 1.f / V.vector4_f32[0], + 1.f / V.vector4_f32[1], + 1.f / V.vector4_f32[2], + 1.f / V.vector4_f32[3] + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ + float32x4_t one = vdupq_n_f32(1.0f); + return vdivq_f32(one, V); +#else + // 2 iterations of Newton-Raphson refinement + float32x4_t Reciprocal = vrecpeq_f32(V); + float32x4_t S = vrecpsq_f32(Reciprocal, V); + Reciprocal = vmulq_f32(S, Reciprocal); + S = vrecpsq_f32(Reciprocal, V); + return vmulq_f32(S, Reciprocal); +#endif +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_div_ps(g_XMOne, V); +#endif +} + +//------------------------------------------------------------------------------ +// Return an estimated square root +inline XMVECTOR XM_CALLCONV XMVectorSqrtEst(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + sqrtf(V.vector4_f32[0]), + sqrtf(V.vector4_f32[1]), + sqrtf(V.vector4_f32[2]), + sqrtf(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // 1 iteration of Newton-Raphson refinment of sqrt + float32x4_t S0 = vrsqrteq_f32(V); + float32x4_t P0 = vmulq_f32(V, S0); + float32x4_t R0 = vrsqrtsq_f32(P0, S0); + float32x4_t S1 = vmulq_f32(S0, R0); + + XMVECTOR VEqualsInfinity = XMVectorEqualInt(V, g_XMInfinity.v); + XMVECTOR VEqualsZero = XMVectorEqual(V, vdupq_n_f32(0)); + XMVECTOR Result = vmulq_f32(V, S1); + XMVECTOR Select = XMVectorEqualInt(VEqualsInfinity, VEqualsZero); + return XMVectorSelect(V, Result, Select); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_sqrt_ps(V); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorSqrt(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + sqrtf(V.vector4_f32[0]), + sqrtf(V.vector4_f32[1]), + sqrtf(V.vector4_f32[2]), + sqrtf(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // 3 iterations of Newton-Raphson refinment of sqrt + float32x4_t S0 = vrsqrteq_f32(V); + float32x4_t P0 = vmulq_f32(V, S0); + float32x4_t R0 = vrsqrtsq_f32(P0, S0); + float32x4_t S1 = vmulq_f32(S0, R0); + float32x4_t P1 = vmulq_f32(V, S1); + float32x4_t R1 = vrsqrtsq_f32(P1, S1); + float32x4_t S2 = vmulq_f32(S1, R1); + float32x4_t P2 = vmulq_f32(V, S2); + float32x4_t R2 = vrsqrtsq_f32(P2, S2); + float32x4_t S3 = vmulq_f32(S2, R2); + + XMVECTOR VEqualsInfinity = XMVectorEqualInt(V, g_XMInfinity.v); + XMVECTOR VEqualsZero = XMVectorEqual(V, vdupq_n_f32(0)); + XMVECTOR Result = vmulq_f32(V, S3); + XMVECTOR Select = XMVectorEqualInt(VEqualsInfinity, VEqualsZero); + return XMVectorSelect(V, Result, Select); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_sqrt_ps(V); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorReciprocalSqrtEst(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + 1.f / sqrtf(V.vector4_f32[0]), + 1.f / sqrtf(V.vector4_f32[1]), + 1.f / sqrtf(V.vector4_f32[2]), + 1.f / sqrtf(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vrsqrteq_f32(V); +#elif defined(_XM_SSE_INTRINSICS_) + return _mm_rsqrt_ps(V); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorReciprocalSqrt(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + 1.f / sqrtf(V.vector4_f32[0]), + 1.f / sqrtf(V.vector4_f32[1]), + 1.f / sqrtf(V.vector4_f32[2]), + 1.f / sqrtf(V.vector4_f32[3]) + } } }; + return Result; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // 2 iterations of Newton-Raphson refinement of reciprocal + float32x4_t S0 = vrsqrteq_f32(V); + + float32x4_t P0 = vmulq_f32(V, S0); + float32x4_t R0 = vrsqrtsq_f32(P0, S0); + + float32x4_t S1 = vmulq_f32(S0, R0); + float32x4_t P1 = vmulq_f32(V, S1); + float32x4_t R1 = vrsqrtsq_f32(P1, S1); + + return vmulq_f32(S1, R1); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = _mm_sqrt_ps(V); + vResult = _mm_div_ps(g_XMOne, vResult); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorExp2(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + exp2f(V.vector4_f32[0]), + exp2f(V.vector4_f32[1]), + exp2f(V.vector4_f32[2]), + exp2f(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + int32x4_t itrunc = vcvtq_s32_f32(V); + float32x4_t ftrunc = vcvtq_f32_s32(itrunc); + float32x4_t y = vsubq_f32(V, ftrunc); + + float32x4_t poly = vmlaq_f32(g_XMExpEst6, g_XMExpEst7, y); + poly = vmlaq_f32(g_XMExpEst5, poly, y); + poly = vmlaq_f32(g_XMExpEst4, poly, y); + poly = vmlaq_f32(g_XMExpEst3, poly, y); + poly = vmlaq_f32(g_XMExpEst2, poly, y); + poly = vmlaq_f32(g_XMExpEst1, poly, y); + poly = vmlaq_f32(g_XMOne, poly, y); + + int32x4_t biased = vaddq_s32(itrunc, g_XMExponentBias); + biased = vshlq_n_s32(biased, 23); + float32x4_t result0 = XMVectorDivide(vreinterpretq_f32_s32(biased), poly); + + biased = vaddq_s32(itrunc, g_XM253); + biased = vshlq_n_s32(biased, 23); + float32x4_t result1 = XMVectorDivide(vreinterpretq_f32_s32(biased), poly); + result1 = vmulq_f32(g_XMMinNormal.v, result1); + + // Use selection to handle the cases + // if (V is NaN) -> QNaN; + // else if (V sign bit set) + // if (V > -150) + // if (V.exponent < -126) -> result1 + // else -> result0 + // else -> +0 + // else + // if (V < 128) -> result0 + // else -> +inf + + uint32x4_t comp = vcltq_s32(vreinterpretq_s32_f32(V), g_XMBin128); + float32x4_t result2 = vbslq_f32(comp, result0, g_XMInfinity); + + comp = vcltq_s32(itrunc, g_XMSubnormalExponent); + float32x4_t result3 = vbslq_f32(comp, result1, result0); + + comp = vcltq_s32(vreinterpretq_s32_f32(V), g_XMBinNeg150); + float32x4_t result4 = vbslq_f32(comp, result3, g_XMZero); + + int32x4_t sign = vandq_s32(vreinterpretq_s32_f32(V), g_XMNegativeZero); + comp = vceqq_s32(sign, g_XMNegativeZero); + float32x4_t result5 = vbslq_f32(comp, result4, result2); + + int32x4_t t0 = vandq_s32(vreinterpretq_s32_f32(V), g_XMQNaNTest); + int32x4_t t1 = vandq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); + t0 = vreinterpretq_s32_u32(vceqq_s32(t0, g_XMZero)); + t1 = vreinterpretq_s32_u32(vceqq_s32(t1, g_XMInfinity)); + int32x4_t isNaN = vbicq_s32(t1, t0); + + float32x4_t vResult = vbslq_f32(vreinterpretq_u32_s32(isNaN), g_XMQNaN, result5); + return vResult; +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_exp2_ps(V); + return Result; +#elif defined(_XM_SSE_INTRINSICS_) + __m128i itrunc = _mm_cvttps_epi32(V); + __m128 ftrunc = _mm_cvtepi32_ps(itrunc); + __m128 y = _mm_sub_ps(V, ftrunc); + + __m128 poly = XM_FMADD_PS(g_XMExpEst7, y, g_XMExpEst6); + poly = XM_FMADD_PS(poly, y, g_XMExpEst5); + poly = XM_FMADD_PS(poly, y, g_XMExpEst4); + poly = XM_FMADD_PS(poly, y, g_XMExpEst3); + poly = XM_FMADD_PS(poly, y, g_XMExpEst2); + poly = XM_FMADD_PS(poly, y, g_XMExpEst1); + poly = XM_FMADD_PS(poly, y, g_XMOne); + + __m128i biased = _mm_add_epi32(itrunc, g_XMExponentBias); + biased = _mm_slli_epi32(biased, 23); + __m128 result0 = _mm_div_ps(_mm_castsi128_ps(biased), poly); + + biased = _mm_add_epi32(itrunc, g_XM253); + biased = _mm_slli_epi32(biased, 23); + __m128 result1 = _mm_div_ps(_mm_castsi128_ps(biased), poly); + result1 = _mm_mul_ps(g_XMMinNormal.v, result1); + + // Use selection to handle the cases + // if (V is NaN) -> QNaN; + // else if (V sign bit set) + // if (V > -150) + // if (V.exponent < -126) -> result1 + // else -> result0 + // else -> +0 + // else + // if (V < 128) -> result0 + // else -> +inf + + __m128i comp = _mm_cmplt_epi32(_mm_castps_si128(V), g_XMBin128); + __m128i select0 = _mm_and_si128(comp, _mm_castps_si128(result0)); + __m128i select1 = _mm_andnot_si128(comp, g_XMInfinity); + __m128i result2 = _mm_or_si128(select0, select1); + + comp = _mm_cmplt_epi32(itrunc, g_XMSubnormalExponent); + select1 = _mm_and_si128(comp, _mm_castps_si128(result1)); + select0 = _mm_andnot_si128(comp, _mm_castps_si128(result0)); + __m128i result3 = _mm_or_si128(select0, select1); + + comp = _mm_cmplt_epi32(_mm_castps_si128(V), g_XMBinNeg150); + select0 = _mm_and_si128(comp, result3); + select1 = _mm_andnot_si128(comp, g_XMZero); + __m128i result4 = _mm_or_si128(select0, select1); + + __m128i sign = _mm_and_si128(_mm_castps_si128(V), g_XMNegativeZero); + comp = _mm_cmpeq_epi32(sign, g_XMNegativeZero); + select0 = _mm_and_si128(comp, result4); + select1 = _mm_andnot_si128(comp, result2); + __m128i result5 = _mm_or_si128(select0, select1); + + __m128i t0 = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); + __m128i t1 = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); + t0 = _mm_cmpeq_epi32(t0, g_XMZero); + t1 = _mm_cmpeq_epi32(t1, g_XMInfinity); + __m128i isNaN = _mm_andnot_si128(t0, t1); + + select0 = _mm_and_si128(isNaN, g_XMQNaN); + select1 = _mm_andnot_si128(isNaN, result5); + __m128i vResult = _mm_or_si128(select0, select1); + + return _mm_castsi128_ps(vResult); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorExp10(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORF32 Result = { { { + powf(10.0f, V.vector4_f32[0]), + powf(10.0f, V.vector4_f32[1]), + powf(10.0f, V.vector4_f32[2]), + powf(10.0f, V.vector4_f32[3]) + } } }; + return Result.v; + +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_exp10_ps(V); + return Result; +#else + // exp10(V) = exp2(vin*log2(10)) + XMVECTOR Vten = XMVectorMultiply(g_XMLg10, V); + return XMVectorExp2(Vten); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorExpE(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORF32 Result = { { { + expf(V.vector4_f32[0]), + expf(V.vector4_f32[1]), + expf(V.vector4_f32[2]), + expf(V.vector4_f32[3]) + } } }; + return Result.v; + +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_exp_ps(V); + return Result; +#else + // expE(V) = exp2(vin*log2(e)) + XMVECTOR Ve = XMVectorMultiply(g_XMLgE, V); + return XMVectorExp2(Ve); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorExp(FXMVECTOR V) noexcept +{ + return XMVectorExp2(V); +} + +//------------------------------------------------------------------------------ + +#if defined(_XM_SSE_INTRINSICS_) + +namespace MathInternal +{ + inline __m128i multi_sll_epi32(__m128i value, __m128i count) noexcept + { + __m128i v = _mm_shuffle_epi32(value, _MM_SHUFFLE(0, 0, 0, 0)); + __m128i c = _mm_shuffle_epi32(count, _MM_SHUFFLE(0, 0, 0, 0)); + c = _mm_and_si128(c, g_XMMaskX); + __m128i r0 = _mm_sll_epi32(v, c); + + v = _mm_shuffle_epi32(value, _MM_SHUFFLE(1, 1, 1, 1)); + c = _mm_shuffle_epi32(count, _MM_SHUFFLE(1, 1, 1, 1)); + c = _mm_and_si128(c, g_XMMaskX); + __m128i r1 = _mm_sll_epi32(v, c); + + v = _mm_shuffle_epi32(value, _MM_SHUFFLE(2, 2, 2, 2)); + c = _mm_shuffle_epi32(count, _MM_SHUFFLE(2, 2, 2, 2)); + c = _mm_and_si128(c, g_XMMaskX); + __m128i r2 = _mm_sll_epi32(v, c); + + v = _mm_shuffle_epi32(value, _MM_SHUFFLE(3, 3, 3, 3)); + c = _mm_shuffle_epi32(count, _MM_SHUFFLE(3, 3, 3, 3)); + c = _mm_and_si128(c, g_XMMaskX); + __m128i r3 = _mm_sll_epi32(v, c); + + // (r0,r0,r1,r1) + __m128 r01 = _mm_shuffle_ps(_mm_castsi128_ps(r0), _mm_castsi128_ps(r1), _MM_SHUFFLE(0, 0, 0, 0)); + // (r2,r2,r3,r3) + __m128 r23 = _mm_shuffle_ps(_mm_castsi128_ps(r2), _mm_castsi128_ps(r3), _MM_SHUFFLE(0, 0, 0, 0)); + // (r0,r1,r2,r3) + __m128 result = _mm_shuffle_ps(r01, r23, _MM_SHUFFLE(2, 0, 2, 0)); + return _mm_castps_si128(result); + } + + inline __m128i multi_srl_epi32(__m128i value, __m128i count) noexcept + { + __m128i v = _mm_shuffle_epi32(value, _MM_SHUFFLE(0, 0, 0, 0)); + __m128i c = _mm_shuffle_epi32(count, _MM_SHUFFLE(0, 0, 0, 0)); + c = _mm_and_si128(c, g_XMMaskX); + __m128i r0 = _mm_srl_epi32(v, c); + + v = _mm_shuffle_epi32(value, _MM_SHUFFLE(1, 1, 1, 1)); + c = _mm_shuffle_epi32(count, _MM_SHUFFLE(1, 1, 1, 1)); + c = _mm_and_si128(c, g_XMMaskX); + __m128i r1 = _mm_srl_epi32(v, c); + + v = _mm_shuffle_epi32(value, _MM_SHUFFLE(2, 2, 2, 2)); + c = _mm_shuffle_epi32(count, _MM_SHUFFLE(2, 2, 2, 2)); + c = _mm_and_si128(c, g_XMMaskX); + __m128i r2 = _mm_srl_epi32(v, c); + + v = _mm_shuffle_epi32(value, _MM_SHUFFLE(3, 3, 3, 3)); + c = _mm_shuffle_epi32(count, _MM_SHUFFLE(3, 3, 3, 3)); + c = _mm_and_si128(c, g_XMMaskX); + __m128i r3 = _mm_srl_epi32(v, c); + + // (r0,r0,r1,r1) + __m128 r01 = _mm_shuffle_ps(_mm_castsi128_ps(r0), _mm_castsi128_ps(r1), _MM_SHUFFLE(0, 0, 0, 0)); + // (r2,r2,r3,r3) + __m128 r23 = _mm_shuffle_ps(_mm_castsi128_ps(r2), _mm_castsi128_ps(r3), _MM_SHUFFLE(0, 0, 0, 0)); + // (r0,r1,r2,r3) + __m128 result = _mm_shuffle_ps(r01, r23, _MM_SHUFFLE(2, 0, 2, 0)); + return _mm_castps_si128(result); + } + + inline __m128i GetLeadingBit(const __m128i value) noexcept + { + static const XMVECTORI32 g_XM0000FFFF = { { { 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF } } }; + static const XMVECTORI32 g_XM000000FF = { { { 0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF } } }; + static const XMVECTORI32 g_XM0000000F = { { { 0x0000000F, 0x0000000F, 0x0000000F, 0x0000000F } } }; + static const XMVECTORI32 g_XM00000003 = { { { 0x00000003, 0x00000003, 0x00000003, 0x00000003 } } }; + + __m128i v = value, r, c, b, s; + + c = _mm_cmpgt_epi32(v, g_XM0000FFFF); // c = (v > 0xFFFF) + b = _mm_srli_epi32(c, 31); // b = (c ? 1 : 0) + r = _mm_slli_epi32(b, 4); // r = (b << 4) + v = multi_srl_epi32(v, r); // v = (v >> r) + + c = _mm_cmpgt_epi32(v, g_XM000000FF); // c = (v > 0xFF) + b = _mm_srli_epi32(c, 31); // b = (c ? 1 : 0) + s = _mm_slli_epi32(b, 3); // s = (b << 3) + v = multi_srl_epi32(v, s); // v = (v >> s) + r = _mm_or_si128(r, s); // r = (r | s) + + c = _mm_cmpgt_epi32(v, g_XM0000000F); // c = (v > 0xF) + b = _mm_srli_epi32(c, 31); // b = (c ? 1 : 0) + s = _mm_slli_epi32(b, 2); // s = (b << 2) + v = multi_srl_epi32(v, s); // v = (v >> s) + r = _mm_or_si128(r, s); // r = (r | s) + + c = _mm_cmpgt_epi32(v, g_XM00000003); // c = (v > 0x3) + b = _mm_srli_epi32(c, 31); // b = (c ? 1 : 0) + s = _mm_slli_epi32(b, 1); // s = (b << 1) + v = multi_srl_epi32(v, s); // v = (v >> s) + r = _mm_or_si128(r, s); // r = (r | s) + + s = _mm_srli_epi32(v, 1); + r = _mm_or_si128(r, s); + return r; + } +} // namespace MathInternal + +#endif // _XM_SSE_INTRINSICS_ + +#if defined(_XM_ARM_NEON_INTRINSICS_) + +namespace MathInternal +{ + inline int32x4_t GetLeadingBit(const int32x4_t value) noexcept + { + static const XMVECTORI32 g_XM0000FFFF = { { { 0x0000FFFF, 0x0000FFFF, 0x0000FFFF, 0x0000FFFF } } }; + static const XMVECTORI32 g_XM000000FF = { { { 0x000000FF, 0x000000FF, 0x000000FF, 0x000000FF } } }; + static const XMVECTORI32 g_XM0000000F = { { { 0x0000000F, 0x0000000F, 0x0000000F, 0x0000000F } } }; + static const XMVECTORI32 g_XM00000003 = { { { 0x00000003, 0x00000003, 0x00000003, 0x00000003 } } }; + + uint32x4_t c = vcgtq_s32(value, g_XM0000FFFF); // c = (v > 0xFFFF) + int32x4_t b = vshrq_n_s32(vreinterpretq_s32_u32(c), 31); // b = (c ? 1 : 0) + int32x4_t r = vshlq_n_s32(b, 4); // r = (b << 4) + r = vnegq_s32(r); + int32x4_t v = vshlq_s32(value, r); // v = (v >> r) + + c = vcgtq_s32(v, g_XM000000FF); // c = (v > 0xFF) + b = vshrq_n_s32(vreinterpretq_s32_u32(c), 31); // b = (c ? 1 : 0) + int32x4_t s = vshlq_n_s32(b, 3); // s = (b << 3) + s = vnegq_s32(s); + v = vshlq_s32(v, s); // v = (v >> s) + r = vorrq_s32(r, s); // r = (r | s) + + c = vcgtq_s32(v, g_XM0000000F); // c = (v > 0xF) + b = vshrq_n_s32(vreinterpretq_s32_u32(c), 31); // b = (c ? 1 : 0) + s = vshlq_n_s32(b, 2); // s = (b << 2) + s = vnegq_s32(s); + v = vshlq_s32(v, s); // v = (v >> s) + r = vorrq_s32(r, s); // r = (r | s) + + c = vcgtq_s32(v, g_XM00000003); // c = (v > 0x3) + b = vshrq_n_s32(vreinterpretq_s32_u32(c), 31); // b = (c ? 1 : 0) + s = vshlq_n_s32(b, 1); // s = (b << 1) + s = vnegq_s32(s); + v = vshlq_s32(v, s); // v = (v >> s) + r = vorrq_s32(r, s); // r = (r | s) + + s = vshrq_n_s32(v, 1); + r = vorrq_s32(r, s); + return r; + } + +} // namespace MathInternal + +#endif + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorLog2(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + log2f(V.vector4_f32[0]), + log2f(V.vector4_f32[1]), + log2f(V.vector4_f32[2]), + log2f(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + int32x4_t rawBiased = vandq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); + int32x4_t trailing = vandq_s32(vreinterpretq_s32_f32(V), g_XMQNaNTest); + uint32x4_t isExponentZero = vceqq_s32(vreinterpretq_s32_f32(g_XMZero), rawBiased); + + // Compute exponent and significand for normals. + int32x4_t biased = vshrq_n_s32(rawBiased, 23); + int32x4_t exponentNor = vsubq_s32(biased, g_XMExponentBias); + int32x4_t trailingNor = trailing; + + // Compute exponent and significand for subnormals. + int32x4_t leading = MathInternal::GetLeadingBit(trailing); + int32x4_t shift = vsubq_s32(g_XMNumTrailing, leading); + int32x4_t exponentSub = vsubq_s32(g_XMSubnormalExponent, shift); + int32x4_t trailingSub = vshlq_s32(trailing, shift); + trailingSub = vandq_s32(trailingSub, g_XMQNaNTest); + int32x4_t e = vbslq_s32(isExponentZero, exponentSub, exponentNor); + int32x4_t t = vbslq_s32(isExponentZero, trailingSub, trailingNor); + + // Compute the approximation. + int32x4_t tmp = vorrq_s32(vreinterpretq_s32_f32(g_XMOne), t); + float32x4_t y = vsubq_f32(vreinterpretq_f32_s32(tmp), g_XMOne); + + float32x4_t log2 = vmlaq_f32(g_XMLogEst6, g_XMLogEst7, y); + log2 = vmlaq_f32(g_XMLogEst5, log2, y); + log2 = vmlaq_f32(g_XMLogEst4, log2, y); + log2 = vmlaq_f32(g_XMLogEst3, log2, y); + log2 = vmlaq_f32(g_XMLogEst2, log2, y); + log2 = vmlaq_f32(g_XMLogEst1, log2, y); + log2 = vmlaq_f32(g_XMLogEst0, log2, y); + log2 = vmlaq_f32(vcvtq_f32_s32(e), log2, y); + + // if (x is NaN) -> QNaN + // else if (V is positive) + // if (V is infinite) -> +inf + // else -> log2(V) + // else + // if (V is zero) -> -inf + // else -> -QNaN + + uint32x4_t isInfinite = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); + isInfinite = vceqq_u32(isInfinite, g_XMInfinity); + + uint32x4_t isGreaterZero = vcgtq_f32(V, g_XMZero); + uint32x4_t isNotFinite = vcgtq_f32(V, g_XMInfinity); + uint32x4_t isPositive = vbicq_u32(isGreaterZero, isNotFinite); + + uint32x4_t isZero = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); + isZero = vceqq_u32(isZero, g_XMZero); + + uint32x4_t t0 = vandq_u32(vreinterpretq_u32_f32(V), g_XMQNaNTest); + uint32x4_t t1 = vandq_u32(vreinterpretq_u32_f32(V), g_XMInfinity); + t0 = vceqq_u32(t0, g_XMZero); + t1 = vceqq_u32(t1, g_XMInfinity); + uint32x4_t isNaN = vbicq_u32(t1, t0); + + float32x4_t result = vbslq_f32(isInfinite, g_XMInfinity, log2); + float32x4_t tmp2 = vbslq_f32(isZero, g_XMNegInfinity, g_XMNegQNaN); + result = vbslq_f32(isPositive, result, tmp2); + result = vbslq_f32(isNaN, g_XMQNaN, result); + return result; +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_log2_ps(V); + return Result; +#elif defined(_XM_SSE_INTRINSICS_) + __m128i rawBiased = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); + __m128i trailing = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); + __m128i isExponentZero = _mm_cmpeq_epi32(g_XMZero, rawBiased); + + // Compute exponent and significand for normals. + __m128i biased = _mm_srli_epi32(rawBiased, 23); + __m128i exponentNor = _mm_sub_epi32(biased, g_XMExponentBias); + __m128i trailingNor = trailing; + + // Compute exponent and significand for subnormals. + __m128i leading = MathInternal::GetLeadingBit(trailing); + __m128i shift = _mm_sub_epi32(g_XMNumTrailing, leading); + __m128i exponentSub = _mm_sub_epi32(g_XMSubnormalExponent, shift); + __m128i trailingSub = MathInternal::multi_sll_epi32(trailing, shift); + trailingSub = _mm_and_si128(trailingSub, g_XMQNaNTest); + + __m128i select0 = _mm_and_si128(isExponentZero, exponentSub); + __m128i select1 = _mm_andnot_si128(isExponentZero, exponentNor); + __m128i e = _mm_or_si128(select0, select1); + + select0 = _mm_and_si128(isExponentZero, trailingSub); + select1 = _mm_andnot_si128(isExponentZero, trailingNor); + __m128i t = _mm_or_si128(select0, select1); + + // Compute the approximation. + __m128i tmp = _mm_or_si128(g_XMOne, t); + __m128 y = _mm_sub_ps(_mm_castsi128_ps(tmp), g_XMOne); + + __m128 log2 = XM_FMADD_PS(g_XMLogEst7, y, g_XMLogEst6); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst5); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst4); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst3); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst2); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst1); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst0); + log2 = XM_FMADD_PS(log2, y, _mm_cvtepi32_ps(e)); + + // if (x is NaN) -> QNaN + // else if (V is positive) + // if (V is infinite) -> +inf + // else -> log2(V) + // else + // if (V is zero) -> -inf + // else -> -QNaN + + __m128i isInfinite = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); + isInfinite = _mm_cmpeq_epi32(isInfinite, g_XMInfinity); + + __m128i isGreaterZero = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMZero); + __m128i isNotFinite = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMInfinity); + __m128i isPositive = _mm_andnot_si128(isNotFinite, isGreaterZero); + + __m128i isZero = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); + isZero = _mm_cmpeq_epi32(isZero, g_XMZero); + + __m128i t0 = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); + __m128i t1 = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); + t0 = _mm_cmpeq_epi32(t0, g_XMZero); + t1 = _mm_cmpeq_epi32(t1, g_XMInfinity); + __m128i isNaN = _mm_andnot_si128(t0, t1); + + select0 = _mm_and_si128(isInfinite, g_XMInfinity); + select1 = _mm_andnot_si128(isInfinite, _mm_castps_si128(log2)); + __m128i result = _mm_or_si128(select0, select1); + + select0 = _mm_and_si128(isZero, g_XMNegInfinity); + select1 = _mm_andnot_si128(isZero, g_XMNegQNaN); + tmp = _mm_or_si128(select0, select1); + + select0 = _mm_and_si128(isPositive, result); + select1 = _mm_andnot_si128(isPositive, tmp); + result = _mm_or_si128(select0, select1); + + select0 = _mm_and_si128(isNaN, g_XMQNaN); + select1 = _mm_andnot_si128(isNaN, result); + result = _mm_or_si128(select0, select1); + + return _mm_castsi128_ps(result); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorLog10(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORF32 Result = { { { + log10f(V.vector4_f32[0]), + log10f(V.vector4_f32[1]), + log10f(V.vector4_f32[2]), + log10f(V.vector4_f32[3]) + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + int32x4_t rawBiased = vandq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); + int32x4_t trailing = vandq_s32(vreinterpretq_s32_f32(V), g_XMQNaNTest); + uint32x4_t isExponentZero = vceqq_s32(g_XMZero, rawBiased); + + // Compute exponent and significand for normals. + int32x4_t biased = vshrq_n_s32(rawBiased, 23); + int32x4_t exponentNor = vsubq_s32(biased, g_XMExponentBias); + int32x4_t trailingNor = trailing; + + // Compute exponent and significand for subnormals. + int32x4_t leading = MathInternal::GetLeadingBit(trailing); + int32x4_t shift = vsubq_s32(g_XMNumTrailing, leading); + int32x4_t exponentSub = vsubq_s32(g_XMSubnormalExponent, shift); + int32x4_t trailingSub = vshlq_s32(trailing, shift); + trailingSub = vandq_s32(trailingSub, g_XMQNaNTest); + int32x4_t e = vbslq_s32(isExponentZero, exponentSub, exponentNor); + int32x4_t t = vbslq_s32(isExponentZero, trailingSub, trailingNor); + + // Compute the approximation. + int32x4_t tmp = vorrq_s32(g_XMOne, t); + float32x4_t y = vsubq_f32(vreinterpretq_f32_s32(tmp), g_XMOne); + + float32x4_t log2 = vmlaq_f32(g_XMLogEst6, g_XMLogEst7, y); + log2 = vmlaq_f32(g_XMLogEst5, log2, y); + log2 = vmlaq_f32(g_XMLogEst4, log2, y); + log2 = vmlaq_f32(g_XMLogEst3, log2, y); + log2 = vmlaq_f32(g_XMLogEst2, log2, y); + log2 = vmlaq_f32(g_XMLogEst1, log2, y); + log2 = vmlaq_f32(g_XMLogEst0, log2, y); + log2 = vmlaq_f32(vcvtq_f32_s32(e), log2, y); + + log2 = vmulq_f32(g_XMInvLg10, log2); + + // if (x is NaN) -> QNaN + // else if (V is positive) + // if (V is infinite) -> +inf + // else -> log2(V) + // else + // if (V is zero) -> -inf + // else -> -QNaN + + uint32x4_t isInfinite = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); + isInfinite = vceqq_u32(isInfinite, g_XMInfinity); + + uint32x4_t isGreaterZero = vcgtq_s32(vreinterpretq_s32_f32(V), g_XMZero); + uint32x4_t isNotFinite = vcgtq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); + uint32x4_t isPositive = vbicq_u32(isGreaterZero, isNotFinite); + + uint32x4_t isZero = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); + isZero = vceqq_u32(isZero, g_XMZero); + + uint32x4_t t0 = vandq_u32(vreinterpretq_u32_f32(V), g_XMQNaNTest); + uint32x4_t t1 = vandq_u32(vreinterpretq_u32_f32(V), g_XMInfinity); + t0 = vceqq_u32(t0, g_XMZero); + t1 = vceqq_u32(t1, g_XMInfinity); + uint32x4_t isNaN = vbicq_u32(t1, t0); + + float32x4_t result = vbslq_f32(isInfinite, g_XMInfinity, log2); + float32x4_t tmp2 = vbslq_f32(isZero, g_XMNegInfinity, g_XMNegQNaN); + result = vbslq_f32(isPositive, result, tmp2); + result = vbslq_f32(isNaN, g_XMQNaN, result); + return result; +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_log10_ps(V); + return Result; +#elif defined(_XM_SSE_INTRINSICS_) + __m128i rawBiased = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); + __m128i trailing = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); + __m128i isExponentZero = _mm_cmpeq_epi32(g_XMZero, rawBiased); + + // Compute exponent and significand for normals. + __m128i biased = _mm_srli_epi32(rawBiased, 23); + __m128i exponentNor = _mm_sub_epi32(biased, g_XMExponentBias); + __m128i trailingNor = trailing; + + // Compute exponent and significand for subnormals. + __m128i leading = MathInternal::GetLeadingBit(trailing); + __m128i shift = _mm_sub_epi32(g_XMNumTrailing, leading); + __m128i exponentSub = _mm_sub_epi32(g_XMSubnormalExponent, shift); + __m128i trailingSub = MathInternal::multi_sll_epi32(trailing, shift); + trailingSub = _mm_and_si128(trailingSub, g_XMQNaNTest); + + __m128i select0 = _mm_and_si128(isExponentZero, exponentSub); + __m128i select1 = _mm_andnot_si128(isExponentZero, exponentNor); + __m128i e = _mm_or_si128(select0, select1); + + select0 = _mm_and_si128(isExponentZero, trailingSub); + select1 = _mm_andnot_si128(isExponentZero, trailingNor); + __m128i t = _mm_or_si128(select0, select1); + + // Compute the approximation. + __m128i tmp = _mm_or_si128(g_XMOne, t); + __m128 y = _mm_sub_ps(_mm_castsi128_ps(tmp), g_XMOne); + + __m128 log2 = XM_FMADD_PS(g_XMLogEst7, y, g_XMLogEst6); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst5); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst4); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst3); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst2); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst1); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst0); + log2 = XM_FMADD_PS(log2, y, _mm_cvtepi32_ps(e)); + + log2 = _mm_mul_ps(g_XMInvLg10, log2); + + // if (x is NaN) -> QNaN + // else if (V is positive) + // if (V is infinite) -> +inf + // else -> log2(V) + // else + // if (V is zero) -> -inf + // else -> -QNaN + + __m128i isInfinite = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); + isInfinite = _mm_cmpeq_epi32(isInfinite, g_XMInfinity); + + __m128i isGreaterZero = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMZero); + __m128i isNotFinite = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMInfinity); + __m128i isPositive = _mm_andnot_si128(isNotFinite, isGreaterZero); + + __m128i isZero = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); + isZero = _mm_cmpeq_epi32(isZero, g_XMZero); + + __m128i t0 = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); + __m128i t1 = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); + t0 = _mm_cmpeq_epi32(t0, g_XMZero); + t1 = _mm_cmpeq_epi32(t1, g_XMInfinity); + __m128i isNaN = _mm_andnot_si128(t0, t1); + + select0 = _mm_and_si128(isInfinite, g_XMInfinity); + select1 = _mm_andnot_si128(isInfinite, _mm_castps_si128(log2)); + __m128i result = _mm_or_si128(select0, select1); + + select0 = _mm_and_si128(isZero, g_XMNegInfinity); + select1 = _mm_andnot_si128(isZero, g_XMNegQNaN); + tmp = _mm_or_si128(select0, select1); + + select0 = _mm_and_si128(isPositive, result); + select1 = _mm_andnot_si128(isPositive, tmp); + result = _mm_or_si128(select0, select1); + + select0 = _mm_and_si128(isNaN, g_XMQNaN); + select1 = _mm_andnot_si128(isNaN, result); + result = _mm_or_si128(select0, select1); + + return _mm_castsi128_ps(result); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorLogE(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORF32 Result = { { { + logf(V.vector4_f32[0]), + logf(V.vector4_f32[1]), + logf(V.vector4_f32[2]), + logf(V.vector4_f32[3]) + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + int32x4_t rawBiased = vandq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); + int32x4_t trailing = vandq_s32(vreinterpretq_s32_f32(V), g_XMQNaNTest); + uint32x4_t isExponentZero = vceqq_s32(g_XMZero, rawBiased); + + // Compute exponent and significand for normals. + int32x4_t biased = vshrq_n_s32(rawBiased, 23); + int32x4_t exponentNor = vsubq_s32(biased, g_XMExponentBias); + int32x4_t trailingNor = trailing; + + // Compute exponent and significand for subnormals. + int32x4_t leading = MathInternal::GetLeadingBit(trailing); + int32x4_t shift = vsubq_s32(g_XMNumTrailing, leading); + int32x4_t exponentSub = vsubq_s32(g_XMSubnormalExponent, shift); + int32x4_t trailingSub = vshlq_s32(trailing, shift); + trailingSub = vandq_s32(trailingSub, g_XMQNaNTest); + int32x4_t e = vbslq_s32(isExponentZero, exponentSub, exponentNor); + int32x4_t t = vbslq_s32(isExponentZero, trailingSub, trailingNor); + + // Compute the approximation. + int32x4_t tmp = vorrq_s32(g_XMOne, t); + float32x4_t y = vsubq_f32(vreinterpretq_f32_s32(tmp), g_XMOne); + + float32x4_t log2 = vmlaq_f32(g_XMLogEst6, g_XMLogEst7, y); + log2 = vmlaq_f32(g_XMLogEst5, log2, y); + log2 = vmlaq_f32(g_XMLogEst4, log2, y); + log2 = vmlaq_f32(g_XMLogEst3, log2, y); + log2 = vmlaq_f32(g_XMLogEst2, log2, y); + log2 = vmlaq_f32(g_XMLogEst1, log2, y); + log2 = vmlaq_f32(g_XMLogEst0, log2, y); + log2 = vmlaq_f32(vcvtq_f32_s32(e), log2, y); + + log2 = vmulq_f32(g_XMInvLgE, log2); + + // if (x is NaN) -> QNaN + // else if (V is positive) + // if (V is infinite) -> +inf + // else -> log2(V) + // else + // if (V is zero) -> -inf + // else -> -QNaN + + uint32x4_t isInfinite = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); + isInfinite = vceqq_u32(isInfinite, g_XMInfinity); + + uint32x4_t isGreaterZero = vcgtq_s32(vreinterpretq_s32_f32(V), g_XMZero); + uint32x4_t isNotFinite = vcgtq_s32(vreinterpretq_s32_f32(V), g_XMInfinity); + uint32x4_t isPositive = vbicq_u32(isGreaterZero, isNotFinite); + + uint32x4_t isZero = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); + isZero = vceqq_u32(isZero, g_XMZero); + + uint32x4_t t0 = vandq_u32(vreinterpretq_u32_f32(V), g_XMQNaNTest); + uint32x4_t t1 = vandq_u32(vreinterpretq_u32_f32(V), g_XMInfinity); + t0 = vceqq_u32(t0, g_XMZero); + t1 = vceqq_u32(t1, g_XMInfinity); + uint32x4_t isNaN = vbicq_u32(t1, t0); + + float32x4_t result = vbslq_f32(isInfinite, g_XMInfinity, log2); + float32x4_t tmp2 = vbslq_f32(isZero, g_XMNegInfinity, g_XMNegQNaN); + result = vbslq_f32(isPositive, result, tmp2); + result = vbslq_f32(isNaN, g_XMQNaN, result); + return result; +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_log_ps(V); + return Result; +#elif defined(_XM_SSE_INTRINSICS_) + __m128i rawBiased = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); + __m128i trailing = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); + __m128i isExponentZero = _mm_cmpeq_epi32(g_XMZero, rawBiased); + + // Compute exponent and significand for normals. + __m128i biased = _mm_srli_epi32(rawBiased, 23); + __m128i exponentNor = _mm_sub_epi32(biased, g_XMExponentBias); + __m128i trailingNor = trailing; + + // Compute exponent and significand for subnormals. + __m128i leading = MathInternal::GetLeadingBit(trailing); + __m128i shift = _mm_sub_epi32(g_XMNumTrailing, leading); + __m128i exponentSub = _mm_sub_epi32(g_XMSubnormalExponent, shift); + __m128i trailingSub = MathInternal::multi_sll_epi32(trailing, shift); + trailingSub = _mm_and_si128(trailingSub, g_XMQNaNTest); + + __m128i select0 = _mm_and_si128(isExponentZero, exponentSub); + __m128i select1 = _mm_andnot_si128(isExponentZero, exponentNor); + __m128i e = _mm_or_si128(select0, select1); + + select0 = _mm_and_si128(isExponentZero, trailingSub); + select1 = _mm_andnot_si128(isExponentZero, trailingNor); + __m128i t = _mm_or_si128(select0, select1); + + // Compute the approximation. + __m128i tmp = _mm_or_si128(g_XMOne, t); + __m128 y = _mm_sub_ps(_mm_castsi128_ps(tmp), g_XMOne); + + __m128 log2 = XM_FMADD_PS(g_XMLogEst7, y, g_XMLogEst6); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst5); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst4); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst3); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst2); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst1); + log2 = XM_FMADD_PS(log2, y, g_XMLogEst0); + log2 = XM_FMADD_PS(log2, y, _mm_cvtepi32_ps(e)); + + log2 = _mm_mul_ps(g_XMInvLgE, log2); + + // if (x is NaN) -> QNaN + // else if (V is positive) + // if (V is infinite) -> +inf + // else -> log2(V) + // else + // if (V is zero) -> -inf + // else -> -QNaN + + __m128i isInfinite = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); + isInfinite = _mm_cmpeq_epi32(isInfinite, g_XMInfinity); + + __m128i isGreaterZero = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMZero); + __m128i isNotFinite = _mm_cmpgt_epi32(_mm_castps_si128(V), g_XMInfinity); + __m128i isPositive = _mm_andnot_si128(isNotFinite, isGreaterZero); + + __m128i isZero = _mm_and_si128(_mm_castps_si128(V), g_XMAbsMask); + isZero = _mm_cmpeq_epi32(isZero, g_XMZero); + + __m128i t0 = _mm_and_si128(_mm_castps_si128(V), g_XMQNaNTest); + __m128i t1 = _mm_and_si128(_mm_castps_si128(V), g_XMInfinity); + t0 = _mm_cmpeq_epi32(t0, g_XMZero); + t1 = _mm_cmpeq_epi32(t1, g_XMInfinity); + __m128i isNaN = _mm_andnot_si128(t0, t1); + + select0 = _mm_and_si128(isInfinite, g_XMInfinity); + select1 = _mm_andnot_si128(isInfinite, _mm_castps_si128(log2)); + __m128i result = _mm_or_si128(select0, select1); + + select0 = _mm_and_si128(isZero, g_XMNegInfinity); + select1 = _mm_andnot_si128(isZero, g_XMNegQNaN); + tmp = _mm_or_si128(select0, select1); + + select0 = _mm_and_si128(isPositive, result); + select1 = _mm_andnot_si128(isPositive, tmp); + result = _mm_or_si128(select0, select1); + + select0 = _mm_and_si128(isNaN, g_XMQNaN); + select1 = _mm_andnot_si128(isNaN, result); + result = _mm_or_si128(select0, select1); + + return _mm_castsi128_ps(result); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorLog(FXMVECTOR V) noexcept +{ + return XMVectorLog2(V); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorPow +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORF32 Result = { { { + powf(V1.vector4_f32[0], V2.vector4_f32[0]), + powf(V1.vector4_f32[1], V2.vector4_f32[1]), + powf(V1.vector4_f32[2], V2.vector4_f32[2]), + powf(V1.vector4_f32[3], V2.vector4_f32[3]) + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + XMVECTORF32 vResult = { { { + powf(vgetq_lane_f32(V1, 0), vgetq_lane_f32(V2, 0)), + powf(vgetq_lane_f32(V1, 1), vgetq_lane_f32(V2, 1)), + powf(vgetq_lane_f32(V1, 2), vgetq_lane_f32(V2, 2)), + powf(vgetq_lane_f32(V1, 3), vgetq_lane_f32(V2, 3)) + } } }; + return vResult.v; +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_pow_ps(V1, V2); + return Result; +#elif defined(_XM_SSE_INTRINSICS_) + XM_ALIGNED_DATA(16) float a[4]; + XM_ALIGNED_DATA(16) float b[4]; + _mm_store_ps(a, V1); + _mm_store_ps(b, V2); + XMVECTOR vResult = _mm_setr_ps( + powf(a[0], b[0]), + powf(a[1], b[1]), + powf(a[2], b[2]), + powf(a[3], b[3])); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorAbs(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + fabsf(V.vector4_f32[0]), + fabsf(V.vector4_f32[1]), + fabsf(V.vector4_f32[2]), + fabsf(V.vector4_f32[3]) + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + return vabsq_f32(V); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = _mm_setzero_ps(); + vResult = _mm_sub_ps(vResult, V); + vResult = _mm_max_ps(vResult, V); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorMod +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ + // V1 % V2 = V1 - V2 * truncate(V1 / V2) + +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Quotient = XMVectorDivide(V1, V2); + Quotient = XMVectorTruncate(Quotient); + XMVECTOR Result = XMVectorNegativeMultiplySubtract(V2, Quotient, V1); + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + XMVECTOR vResult = XMVectorDivide(V1, V2); + vResult = XMVectorTruncate(vResult); + return vmlsq_f32(V1, vResult, V2); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = _mm_div_ps(V1, V2); + vResult = XMVectorTruncate(vResult); + return XM_FNMADD_PS(vResult, V2, V1); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorModAngles(FXMVECTOR Angles) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR V; + XMVECTOR Result; + + // Modulo the range of the given angles such that -XM_PI <= Angles < XM_PI + V = XMVectorMultiply(Angles, g_XMReciprocalTwoPi.v); + V = XMVectorRound(V); + Result = XMVectorNegativeMultiplySubtract(g_XMTwoPi.v, V, Angles); + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Modulo the range of the given angles such that -XM_PI <= Angles < XM_PI + XMVECTOR vResult = vmulq_f32(Angles, g_XMReciprocalTwoPi); + // Use the inline function due to complexity for rounding + vResult = XMVectorRound(vResult); + return vmlsq_f32(Angles, vResult, g_XMTwoPi); +#elif defined(_XM_SSE_INTRINSICS_) + // Modulo the range of the given angles such that -XM_PI <= Angles < XM_PI + XMVECTOR vResult = _mm_mul_ps(Angles, g_XMReciprocalTwoPi); + // Use the inline function due to complexity for rounding + vResult = XMVectorRound(vResult); + return XM_FNMADD_PS(vResult, g_XMTwoPi, Angles); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorSin(FXMVECTOR V) noexcept +{ + // 11-degree minimax approximation + +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + sinf(V.vector4_f32[0]), + sinf(V.vector4_f32[1]), + sinf(V.vector4_f32[2]), + sinf(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Force the value within the bounds of pi + XMVECTOR x = XMVectorModAngles(V); + + // Map in [-pi/2,pi/2] with sin(y) = sin(x). + uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); + uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + float32x4_t absx = vabsq_f32(x); + float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); + uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); + x = vbslq_f32(comp, x, rflx); + + float32x4_t x2 = vmulq_f32(x, x); + + // Compute polynomial approximation + const XMVECTOR SC1 = g_XMSinCoefficients1; + const XMVECTOR SC0 = g_XMSinCoefficients0; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(SC0), 1); + XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_low_f32(SC1), 0); + + vConstants = vdupq_lane_f32(vget_high_f32(SC0), 0); + Result = vmlaq_f32(vConstants, Result, x2); + + vConstants = vdupq_lane_f32(vget_low_f32(SC0), 1); + Result = vmlaq_f32(vConstants, Result, x2); + + vConstants = vdupq_lane_f32(vget_low_f32(SC0), 0); + Result = vmlaq_f32(vConstants, Result, x2); + + Result = vmlaq_f32(g_XMOne, Result, x2); + Result = vmulq_f32(Result, x); + return Result; +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_sin_ps(V); + return Result; +#elif defined(_XM_SSE_INTRINSICS_) + // Force the value within the bounds of pi + XMVECTOR x = XMVectorModAngles(V); + + // Map in [-pi/2,pi/2] with sin(y) = sin(x). + __m128 sign = _mm_and_ps(x, g_XMNegativeZero); + __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + __m128 absx = _mm_andnot_ps(sign, x); // |x| + __m128 rflx = _mm_sub_ps(c, x); + __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); + __m128 select0 = _mm_and_ps(comp, x); + __m128 select1 = _mm_andnot_ps(comp, rflx); + x = _mm_or_ps(select0, select1); + + __m128 x2 = _mm_mul_ps(x, x); + + // Compute polynomial approximation + const XMVECTOR SC1 = g_XMSinCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(SC1, _MM_SHUFFLE(0, 0, 0, 0)); + const XMVECTOR SC0 = g_XMSinCoefficients0; + __m128 vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + + vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(2, 2, 2, 2)); + Result = XM_FMADD_PS(Result, x2, vConstants); + + vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(1, 1, 1, 1)); + Result = XM_FMADD_PS(Result, x2, vConstants); + + vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(0, 0, 0, 0)); + Result = XM_FMADD_PS(Result, x2, vConstants); + + Result = XM_FMADD_PS(Result, x2, g_XMOne); + Result = _mm_mul_ps(Result, x); + return Result; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorCos(FXMVECTOR V) noexcept +{ + // 10-degree minimax approximation + +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + cosf(V.vector4_f32[0]), + cosf(V.vector4_f32[1]), + cosf(V.vector4_f32[2]), + cosf(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Map V to x in [-pi,pi]. + XMVECTOR x = XMVectorModAngles(V); + + // Map in [-pi/2,pi/2] with cos(y) = sign*cos(x). + uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); + uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + float32x4_t absx = vabsq_f32(x); + float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); + uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); + x = vbslq_f32(comp, x, rflx); + float32x4_t fsign = vbslq_f32(comp, g_XMOne, g_XMNegativeOne); + + float32x4_t x2 = vmulq_f32(x, x); + + // Compute polynomial approximation + const XMVECTOR CC1 = g_XMCosCoefficients1; + const XMVECTOR CC0 = g_XMCosCoefficients0; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(CC0), 1); + XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_low_f32(CC1), 0); + + vConstants = vdupq_lane_f32(vget_high_f32(CC0), 0); + Result = vmlaq_f32(vConstants, Result, x2); + + vConstants = vdupq_lane_f32(vget_low_f32(CC0), 1); + Result = vmlaq_f32(vConstants, Result, x2); + + vConstants = vdupq_lane_f32(vget_low_f32(CC0), 0); + Result = vmlaq_f32(vConstants, Result, x2); + + Result = vmlaq_f32(g_XMOne, Result, x2); + Result = vmulq_f32(Result, fsign); + return Result; +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_cos_ps(V); + return Result; +#elif defined(_XM_SSE_INTRINSICS_) + // Map V to x in [-pi,pi]. + XMVECTOR x = XMVectorModAngles(V); + + // Map in [-pi/2,pi/2] with cos(y) = sign*cos(x). + XMVECTOR sign = _mm_and_ps(x, g_XMNegativeZero); + __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + __m128 absx = _mm_andnot_ps(sign, x); // |x| + __m128 rflx = _mm_sub_ps(c, x); + __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); + __m128 select0 = _mm_and_ps(comp, x); + __m128 select1 = _mm_andnot_ps(comp, rflx); + x = _mm_or_ps(select0, select1); + select0 = _mm_and_ps(comp, g_XMOne); + select1 = _mm_andnot_ps(comp, g_XMNegativeOne); + sign = _mm_or_ps(select0, select1); + + __m128 x2 = _mm_mul_ps(x, x); + + // Compute polynomial approximation + const XMVECTOR CC1 = g_XMCosCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(CC1, _MM_SHUFFLE(0, 0, 0, 0)); + const XMVECTOR CC0 = g_XMCosCoefficients0; + __m128 vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + + vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(2, 2, 2, 2)); + Result = XM_FMADD_PS(Result, x2, vConstants); + + vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(1, 1, 1, 1)); + Result = XM_FMADD_PS(Result, x2, vConstants); + + vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(0, 0, 0, 0)); + Result = XM_FMADD_PS(Result, x2, vConstants); + + Result = XM_FMADD_PS(Result, x2, g_XMOne); + Result = _mm_mul_ps(Result, sign); + return Result; +#endif +} + +//------------------------------------------------------------------------------ + +_Use_decl_annotations_ +inline void XM_CALLCONV XMVectorSinCos +( + XMVECTOR* pSin, + XMVECTOR* pCos, + FXMVECTOR V +) noexcept +{ + assert(pSin != nullptr); + assert(pCos != nullptr); + + // 11/10-degree minimax approximation + +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Sin = { { { + sinf(V.vector4_f32[0]), + sinf(V.vector4_f32[1]), + sinf(V.vector4_f32[2]), + sinf(V.vector4_f32[3]) + } } }; + + XMVECTORF32 Cos = { { { + cosf(V.vector4_f32[0]), + cosf(V.vector4_f32[1]), + cosf(V.vector4_f32[2]), + cosf(V.vector4_f32[3]) + } } }; + + *pSin = Sin.v; + *pCos = Cos.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Force the value within the bounds of pi + XMVECTOR x = XMVectorModAngles(V); + + // Map in [-pi/2,pi/2] with cos(y) = sign*cos(x). + uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); + uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + float32x4_t absx = vabsq_f32(x); + float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); + uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); + x = vbslq_f32(comp, x, rflx); + float32x4_t fsign = vbslq_f32(comp, g_XMOne, g_XMNegativeOne); + + float32x4_t x2 = vmulq_f32(x, x); + + // Compute polynomial approximation for sine + const XMVECTOR SC1 = g_XMSinCoefficients1; + const XMVECTOR SC0 = g_XMSinCoefficients0; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(SC0), 1); + XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_low_f32(SC1), 0); + + vConstants = vdupq_lane_f32(vget_high_f32(SC0), 0); + Result = vmlaq_f32(vConstants, Result, x2); + + vConstants = vdupq_lane_f32(vget_low_f32(SC0), 1); + Result = vmlaq_f32(vConstants, Result, x2); + + vConstants = vdupq_lane_f32(vget_low_f32(SC0), 0); + Result = vmlaq_f32(vConstants, Result, x2); + + Result = vmlaq_f32(g_XMOne, Result, x2); + *pSin = vmulq_f32(Result, x); + + // Compute polynomial approximation for cosine + const XMVECTOR CC1 = g_XMCosCoefficients1; + const XMVECTOR CC0 = g_XMCosCoefficients0; + vConstants = vdupq_lane_f32(vget_high_f32(CC0), 1); + Result = vmlaq_lane_f32(vConstants, x2, vget_low_f32(CC1), 0); + + vConstants = vdupq_lane_f32(vget_high_f32(CC0), 0); + Result = vmlaq_f32(vConstants, Result, x2); + + vConstants = vdupq_lane_f32(vget_low_f32(CC0), 1); + Result = vmlaq_f32(vConstants, Result, x2); + + vConstants = vdupq_lane_f32(vget_low_f32(CC0), 0); + Result = vmlaq_f32(vConstants, Result, x2); + + Result = vmlaq_f32(g_XMOne, Result, x2); + *pCos = vmulq_f32(Result, fsign); +#elif defined(_XM_SVML_INTRINSICS_) + *pSin = _mm_sincos_ps(pCos, V); +#elif defined(_XM_SSE_INTRINSICS_) + // Force the value within the bounds of pi + XMVECTOR x = XMVectorModAngles(V); + + // Map in [-pi/2,pi/2] with sin(y) = sin(x), cos(y) = sign*cos(x). + XMVECTOR sign = _mm_and_ps(x, g_XMNegativeZero); + __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + __m128 absx = _mm_andnot_ps(sign, x); // |x| + __m128 rflx = _mm_sub_ps(c, x); + __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); + __m128 select0 = _mm_and_ps(comp, x); + __m128 select1 = _mm_andnot_ps(comp, rflx); + x = _mm_or_ps(select0, select1); + select0 = _mm_and_ps(comp, g_XMOne); + select1 = _mm_andnot_ps(comp, g_XMNegativeOne); + sign = _mm_or_ps(select0, select1); + + __m128 x2 = _mm_mul_ps(x, x); + + // Compute polynomial approximation of sine + const XMVECTOR SC1 = g_XMSinCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(SC1, _MM_SHUFFLE(0, 0, 0, 0)); + const XMVECTOR SC0 = g_XMSinCoefficients0; + __m128 vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + + vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(2, 2, 2, 2)); + Result = XM_FMADD_PS(Result, x2, vConstants); + + vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(1, 1, 1, 1)); + Result = XM_FMADD_PS(Result, x2, vConstants); + + vConstants = XM_PERMUTE_PS(SC0, _MM_SHUFFLE(0, 0, 0, 0)); + Result = XM_FMADD_PS(Result, x2, vConstants); + + Result = XM_FMADD_PS(Result, x2, g_XMOne); + Result = _mm_mul_ps(Result, x); + *pSin = Result; + + // Compute polynomial approximation of cosine + const XMVECTOR CC1 = g_XMCosCoefficients1; + vConstantsB = XM_PERMUTE_PS(CC1, _MM_SHUFFLE(0, 0, 0, 0)); + const XMVECTOR CC0 = g_XMCosCoefficients0; + vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(3, 3, 3, 3)); + Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + + vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(2, 2, 2, 2)); + Result = XM_FMADD_PS(Result, x2, vConstants); + + vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(1, 1, 1, 1)); + Result = XM_FMADD_PS(Result, x2, vConstants); + + vConstants = XM_PERMUTE_PS(CC0, _MM_SHUFFLE(0, 0, 0, 0)); + Result = XM_FMADD_PS(Result, x2, vConstants); + + Result = XM_FMADD_PS(Result, x2, g_XMOne); + Result = _mm_mul_ps(Result, sign); + *pCos = Result; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorTan(FXMVECTOR V) noexcept +{ + // Cody and Waite algorithm to compute tangent. + +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + tanf(V.vector4_f32[0]), + tanf(V.vector4_f32[1]), + tanf(V.vector4_f32[2]), + tanf(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_tan_ps(V); + return Result; +#elif defined(_XM_SSE_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) + + static const XMVECTORF32 TanCoefficients0 = { { { 1.0f, -4.667168334e-1f, 2.566383229e-2f, -3.118153191e-4f } } }; + static const XMVECTORF32 TanCoefficients1 = { { { 4.981943399e-7f, -1.333835001e-1f, 3.424887824e-3f, -1.786170734e-5f } } }; + static const XMVECTORF32 TanConstants = { { { 1.570796371f, 6.077100628e-11f, 0.000244140625f, 0.63661977228f /*2 / Pi*/ } } }; + static const XMVECTORU32 Mask = { { { 0x1, 0x1, 0x1, 0x1 } } }; + + XMVECTOR TwoDivPi = XMVectorSplatW(TanConstants.v); + + XMVECTOR Zero = XMVectorZero(); + + XMVECTOR C0 = XMVectorSplatX(TanConstants.v); + XMVECTOR C1 = XMVectorSplatY(TanConstants.v); + XMVECTOR Epsilon = XMVectorSplatZ(TanConstants.v); + + XMVECTOR VA = XMVectorMultiply(V, TwoDivPi); + + VA = XMVectorRound(VA); + + XMVECTOR VC = XMVectorNegativeMultiplySubtract(VA, C0, V); + + XMVECTOR VB = XMVectorAbs(VA); + + VC = XMVectorNegativeMultiplySubtract(VA, C1, VC); + +#if defined(_XM_ARM_NEON_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + VB = vreinterpretq_f32_u32(vcvtq_u32_f32(VB)); +#elif defined(_XM_SSE_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + reinterpret_cast<__m128i*>(&VB)[0] = _mm_cvttps_epi32(VB); +#else + for (size_t i = 0; i < 4; i++) + { + VB.vector4_u32[i] = static_cast(VB.vector4_f32[i]); + } +#endif + + XMVECTOR VC2 = XMVectorMultiply(VC, VC); + + XMVECTOR T7 = XMVectorSplatW(TanCoefficients1.v); + XMVECTOR T6 = XMVectorSplatZ(TanCoefficients1.v); + XMVECTOR T4 = XMVectorSplatX(TanCoefficients1.v); + XMVECTOR T3 = XMVectorSplatW(TanCoefficients0.v); + XMVECTOR T5 = XMVectorSplatY(TanCoefficients1.v); + XMVECTOR T2 = XMVectorSplatZ(TanCoefficients0.v); + XMVECTOR T1 = XMVectorSplatY(TanCoefficients0.v); + XMVECTOR T0 = XMVectorSplatX(TanCoefficients0.v); + + XMVECTOR VBIsEven = XMVectorAndInt(VB, Mask.v); + VBIsEven = XMVectorEqualInt(VBIsEven, Zero); + + XMVECTOR N = XMVectorMultiplyAdd(VC2, T7, T6); + XMVECTOR D = XMVectorMultiplyAdd(VC2, T4, T3); + N = XMVectorMultiplyAdd(VC2, N, T5); + D = XMVectorMultiplyAdd(VC2, D, T2); + N = XMVectorMultiply(VC2, N); + D = XMVectorMultiplyAdd(VC2, D, T1); + N = XMVectorMultiplyAdd(VC, N, VC); + XMVECTOR VCNearZero = XMVectorInBounds(VC, Epsilon); + D = XMVectorMultiplyAdd(VC2, D, T0); + + N = XMVectorSelect(N, VC, VCNearZero); + D = XMVectorSelect(D, g_XMOne.v, VCNearZero); + + XMVECTOR R0 = XMVectorNegate(N); + XMVECTOR R1 = XMVectorDivide(N, D); + R0 = XMVectorDivide(D, R0); + + XMVECTOR VIsZero = XMVectorEqual(V, Zero); + + XMVECTOR Result = XMVectorSelect(R0, R1, VBIsEven); + + Result = XMVectorSelect(Result, Zero, VIsZero); + + return Result; + +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorSinH(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + sinhf(V.vector4_f32[0]), + sinhf(V.vector4_f32[1]), + sinhf(V.vector4_f32[2]), + sinhf(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 Scale = { { { 1.442695040888963f, 1.442695040888963f, 1.442695040888963f, 1.442695040888963f } } }; // 1.0f / ln(2.0f) + + XMVECTOR V1 = vmlaq_f32(g_XMNegativeOne.v, V, Scale.v); + XMVECTOR V2 = vmlsq_f32(g_XMNegativeOne.v, V, Scale.v); + XMVECTOR E1 = XMVectorExp(V1); + XMVECTOR E2 = XMVectorExp(V2); + + return vsubq_f32(E1, E2); +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_sinh_ps(V); + return Result; +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 Scale = { { { 1.442695040888963f, 1.442695040888963f, 1.442695040888963f, 1.442695040888963f } } }; // 1.0f / ln(2.0f) + + XMVECTOR V1 = XM_FMADD_PS(V, Scale, g_XMNegativeOne); + XMVECTOR V2 = XM_FNMADD_PS(V, Scale, g_XMNegativeOne); + XMVECTOR E1 = XMVectorExp(V1); + XMVECTOR E2 = XMVectorExp(V2); + + return _mm_sub_ps(E1, E2); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorCosH(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + coshf(V.vector4_f32[0]), + coshf(V.vector4_f32[1]), + coshf(V.vector4_f32[2]), + coshf(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 Scale = { { { 1.442695040888963f, 1.442695040888963f, 1.442695040888963f, 1.442695040888963f } } }; // 1.0f / ln(2.0f) + + XMVECTOR V1 = vmlaq_f32(g_XMNegativeOne.v, V, Scale.v); + XMVECTOR V2 = vmlsq_f32(g_XMNegativeOne.v, V, Scale.v); + XMVECTOR E1 = XMVectorExp(V1); + XMVECTOR E2 = XMVectorExp(V2); + return vaddq_f32(E1, E2); +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_cosh_ps(V); + return Result; +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 Scale = { { { 1.442695040888963f, 1.442695040888963f, 1.442695040888963f, 1.442695040888963f } } }; // 1.0f / ln(2.0f) + + XMVECTOR V1 = XM_FMADD_PS(V, Scale.v, g_XMNegativeOne.v); + XMVECTOR V2 = XM_FNMADD_PS(V, Scale.v, g_XMNegativeOne.v); + XMVECTOR E1 = XMVectorExp(V1); + XMVECTOR E2 = XMVectorExp(V2); + return _mm_add_ps(E1, E2); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorTanH(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + tanhf(V.vector4_f32[0]), + tanhf(V.vector4_f32[1]), + tanhf(V.vector4_f32[2]), + tanhf(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 Scale = { { { 2.8853900817779268f, 2.8853900817779268f, 2.8853900817779268f, 2.8853900817779268f } } }; // 2.0f / ln(2.0f) + + XMVECTOR E = vmulq_f32(V, Scale.v); + E = XMVectorExp(E); + E = vmlaq_f32(g_XMOneHalf.v, E, g_XMOneHalf.v); + E = XMVectorReciprocal(E); + return vsubq_f32(g_XMOne.v, E); +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_tanh_ps(V); + return Result; +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 Scale = { { { 2.8853900817779268f, 2.8853900817779268f, 2.8853900817779268f, 2.8853900817779268f } } }; // 2.0f / ln(2.0f) + + XMVECTOR E = _mm_mul_ps(V, Scale.v); + E = XMVectorExp(E); + E = XM_FMADD_PS(E, g_XMOneHalf.v, g_XMOneHalf.v); + E = _mm_div_ps(g_XMOne.v, E); + return _mm_sub_ps(g_XMOne.v, E); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorASin(FXMVECTOR V) noexcept +{ + // 7-degree minimax approximation + +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + asinf(V.vector4_f32[0]), + asinf(V.vector4_f32[1]), + asinf(V.vector4_f32[2]), + asinf(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t nonnegative = vcgeq_f32(V, g_XMZero); + float32x4_t x = vabsq_f32(V); + + // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. + float32x4_t oneMValue = vsubq_f32(g_XMOne, x); + float32x4_t clampOneMValue = vmaxq_f32(g_XMZero, oneMValue); + float32x4_t root = XMVectorSqrt(clampOneMValue); + + // Compute polynomial approximation + const XMVECTOR AC1 = g_XMArcCoefficients1; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AC1), 0); + XMVECTOR t0 = vmlaq_lane_f32(vConstants, x, vget_high_f32(AC1), 1); + + vConstants = vdupq_lane_f32(vget_low_f32(AC1), 1); + t0 = vmlaq_f32(vConstants, t0, x); + + vConstants = vdupq_lane_f32(vget_low_f32(AC1), 0); + t0 = vmlaq_f32(vConstants, t0, x); + + const XMVECTOR AC0 = g_XMArcCoefficients0; + vConstants = vdupq_lane_f32(vget_high_f32(AC0), 1); + t0 = vmlaq_f32(vConstants, t0, x); + + vConstants = vdupq_lane_f32(vget_high_f32(AC0), 0); + t0 = vmlaq_f32(vConstants, t0, x); + + vConstants = vdupq_lane_f32(vget_low_f32(AC0), 1); + t0 = vmlaq_f32(vConstants, t0, x); + + vConstants = vdupq_lane_f32(vget_low_f32(AC0), 0); + t0 = vmlaq_f32(vConstants, t0, x); + t0 = vmulq_f32(t0, root); + + float32x4_t t1 = vsubq_f32(g_XMPi, t0); + t0 = vbslq_f32(nonnegative, t0, t1); + t0 = vsubq_f32(g_XMHalfPi, t0); + return t0; +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_asin_ps(V); + return Result; +#elif defined(_XM_SSE_INTRINSICS_) + __m128 nonnegative = _mm_cmpge_ps(V, g_XMZero); + __m128 mvalue = _mm_sub_ps(g_XMZero, V); + __m128 x = _mm_max_ps(V, mvalue); // |V| + + // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. + __m128 oneMValue = _mm_sub_ps(g_XMOne, x); + __m128 clampOneMValue = _mm_max_ps(g_XMZero, oneMValue); + __m128 root = _mm_sqrt_ps(clampOneMValue); // sqrt(1-|V|) + + // Compute polynomial approximation + const XMVECTOR AC1 = g_XMArcCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 t0 = XM_FMADD_PS(vConstantsB, x, vConstants); + + vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(1, 1, 1, 1)); + t0 = XM_FMADD_PS(t0, x, vConstants); + + vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(0, 0, 0, 0)); + t0 = XM_FMADD_PS(t0, x, vConstants); + + const XMVECTOR AC0 = g_XMArcCoefficients0; + vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(3, 3, 3, 3)); + t0 = XM_FMADD_PS(t0, x, vConstants); + + vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(2, 2, 2, 2)); + t0 = XM_FMADD_PS(t0, x, vConstants); + + vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(1, 1, 1, 1)); + t0 = XM_FMADD_PS(t0, x, vConstants); + + vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(0, 0, 0, 0)); + t0 = XM_FMADD_PS(t0, x, vConstants); + t0 = _mm_mul_ps(t0, root); + + __m128 t1 = _mm_sub_ps(g_XMPi, t0); + t0 = _mm_and_ps(nonnegative, t0); + t1 = _mm_andnot_ps(nonnegative, t1); + t0 = _mm_or_ps(t0, t1); + t0 = _mm_sub_ps(g_XMHalfPi, t0); + return t0; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorACos(FXMVECTOR V) noexcept +{ + // 7-degree minimax approximation + +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + acosf(V.vector4_f32[0]), + acosf(V.vector4_f32[1]), + acosf(V.vector4_f32[2]), + acosf(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t nonnegative = vcgeq_f32(V, g_XMZero); + float32x4_t x = vabsq_f32(V); + + // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. + float32x4_t oneMValue = vsubq_f32(g_XMOne, x); + float32x4_t clampOneMValue = vmaxq_f32(g_XMZero, oneMValue); + float32x4_t root = XMVectorSqrt(clampOneMValue); + + // Compute polynomial approximation + const XMVECTOR AC1 = g_XMArcCoefficients1; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AC1), 0); + XMVECTOR t0 = vmlaq_lane_f32(vConstants, x, vget_high_f32(AC1), 1); + + vConstants = vdupq_lane_f32(vget_low_f32(AC1), 1); + t0 = vmlaq_f32(vConstants, t0, x); + + vConstants = vdupq_lane_f32(vget_low_f32(AC1), 0); + t0 = vmlaq_f32(vConstants, t0, x); + + const XMVECTOR AC0 = g_XMArcCoefficients0; + vConstants = vdupq_lane_f32(vget_high_f32(AC0), 1); + t0 = vmlaq_f32(vConstants, t0, x); + + vConstants = vdupq_lane_f32(vget_high_f32(AC0), 0); + t0 = vmlaq_f32(vConstants, t0, x); + + vConstants = vdupq_lane_f32(vget_low_f32(AC0), 1); + t0 = vmlaq_f32(vConstants, t0, x); + + vConstants = vdupq_lane_f32(vget_low_f32(AC0), 0); + t0 = vmlaq_f32(vConstants, t0, x); + t0 = vmulq_f32(t0, root); + + float32x4_t t1 = vsubq_f32(g_XMPi, t0); + t0 = vbslq_f32(nonnegative, t0, t1); + return t0; +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_acos_ps(V); + return Result; +#elif defined(_XM_SSE_INTRINSICS_) + __m128 nonnegative = _mm_cmpge_ps(V, g_XMZero); + __m128 mvalue = _mm_sub_ps(g_XMZero, V); + __m128 x = _mm_max_ps(V, mvalue); // |V| + + // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. + __m128 oneMValue = _mm_sub_ps(g_XMOne, x); + __m128 clampOneMValue = _mm_max_ps(g_XMZero, oneMValue); + __m128 root = _mm_sqrt_ps(clampOneMValue); // sqrt(1-|V|) + + // Compute polynomial approximation + const XMVECTOR AC1 = g_XMArcCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 t0 = XM_FMADD_PS(vConstantsB, x, vConstants); + + vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(1, 1, 1, 1)); + t0 = XM_FMADD_PS(t0, x, vConstants); + + vConstants = XM_PERMUTE_PS(AC1, _MM_SHUFFLE(0, 0, 0, 0)); + t0 = XM_FMADD_PS(t0, x, vConstants); + + const XMVECTOR AC0 = g_XMArcCoefficients0; + vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(3, 3, 3, 3)); + t0 = XM_FMADD_PS(t0, x, vConstants); + + vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(2, 2, 2, 2)); + t0 = XM_FMADD_PS(t0, x, vConstants); + + vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(1, 1, 1, 1)); + t0 = XM_FMADD_PS(t0, x, vConstants); + + vConstants = XM_PERMUTE_PS(AC0, _MM_SHUFFLE(0, 0, 0, 0)); + t0 = XM_FMADD_PS(t0, x, vConstants); + t0 = _mm_mul_ps(t0, root); + + __m128 t1 = _mm_sub_ps(g_XMPi, t0); + t0 = _mm_and_ps(nonnegative, t0); + t1 = _mm_andnot_ps(nonnegative, t1); + t0 = _mm_or_ps(t0, t1); + return t0; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorATan(FXMVECTOR V) noexcept +{ + // 17-degree minimax approximation + +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + atanf(V.vector4_f32[0]), + atanf(V.vector4_f32[1]), + atanf(V.vector4_f32[2]), + atanf(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t absV = vabsq_f32(V); + float32x4_t invV = XMVectorReciprocal(V); + uint32x4_t comp = vcgtq_f32(V, g_XMOne); + float32x4_t sign = vbslq_f32(comp, g_XMOne, g_XMNegativeOne); + comp = vcleq_f32(absV, g_XMOne); + sign = vbslq_f32(comp, g_XMZero, sign); + float32x4_t x = vbslq_f32(comp, V, invV); + + float32x4_t x2 = vmulq_f32(x, x); + + // Compute polynomial approximation + const XMVECTOR TC1 = g_XMATanCoefficients1; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(TC1), 0); + XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(TC1), 1); + + vConstants = vdupq_lane_f32(vget_low_f32(TC1), 1); + Result = vmlaq_f32(vConstants, Result, x2); + + vConstants = vdupq_lane_f32(vget_low_f32(TC1), 0); + Result = vmlaq_f32(vConstants, Result, x2); + + const XMVECTOR TC0 = g_XMATanCoefficients0; + vConstants = vdupq_lane_f32(vget_high_f32(TC0), 1); + Result = vmlaq_f32(vConstants, Result, x2); + + vConstants = vdupq_lane_f32(vget_high_f32(TC0), 0); + Result = vmlaq_f32(vConstants, Result, x2); + + vConstants = vdupq_lane_f32(vget_low_f32(TC0), 1); + Result = vmlaq_f32(vConstants, Result, x2); + + vConstants = vdupq_lane_f32(vget_low_f32(TC0), 0); + Result = vmlaq_f32(vConstants, Result, x2); + + Result = vmlaq_f32(g_XMOne, Result, x2); + Result = vmulq_f32(Result, x); + + float32x4_t result1 = vmulq_f32(sign, g_XMHalfPi); + result1 = vsubq_f32(result1, Result); + + comp = vceqq_f32(sign, g_XMZero); + Result = vbslq_f32(comp, Result, result1); + return Result; +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_atan_ps(V); + return Result; +#elif defined(_XM_SSE_INTRINSICS_) + __m128 absV = XMVectorAbs(V); + __m128 invV = _mm_div_ps(g_XMOne, V); + __m128 comp = _mm_cmpgt_ps(V, g_XMOne); + __m128 select0 = _mm_and_ps(comp, g_XMOne); + __m128 select1 = _mm_andnot_ps(comp, g_XMNegativeOne); + __m128 sign = _mm_or_ps(select0, select1); + comp = _mm_cmple_ps(absV, g_XMOne); + select0 = _mm_and_ps(comp, g_XMZero); + select1 = _mm_andnot_ps(comp, sign); + sign = _mm_or_ps(select0, select1); + select0 = _mm_and_ps(comp, V); + select1 = _mm_andnot_ps(comp, invV); + __m128 x = _mm_or_ps(select0, select1); + + __m128 x2 = _mm_mul_ps(x, x); + + // Compute polynomial approximation + const XMVECTOR TC1 = g_XMATanCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(TC1, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 vConstants = XM_PERMUTE_PS(TC1, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + + vConstants = XM_PERMUTE_PS(TC1, _MM_SHUFFLE(1, 1, 1, 1)); + Result = XM_FMADD_PS(Result, x2, vConstants); + + vConstants = XM_PERMUTE_PS(TC1, _MM_SHUFFLE(0, 0, 0, 0)); + Result = XM_FMADD_PS(Result, x2, vConstants); + + const XMVECTOR TC0 = g_XMATanCoefficients0; + vConstants = XM_PERMUTE_PS(TC0, _MM_SHUFFLE(3, 3, 3, 3)); + Result = XM_FMADD_PS(Result, x2, vConstants); + + vConstants = XM_PERMUTE_PS(TC0, _MM_SHUFFLE(2, 2, 2, 2)); + Result = XM_FMADD_PS(Result, x2, vConstants); + + vConstants = XM_PERMUTE_PS(TC0, _MM_SHUFFLE(1, 1, 1, 1)); + Result = XM_FMADD_PS(Result, x2, vConstants); + + vConstants = XM_PERMUTE_PS(TC0, _MM_SHUFFLE(0, 0, 0, 0)); + Result = XM_FMADD_PS(Result, x2, vConstants); + + Result = XM_FMADD_PS(Result, x2, g_XMOne); + + Result = _mm_mul_ps(Result, x); + __m128 result1 = _mm_mul_ps(sign, g_XMHalfPi); + result1 = _mm_sub_ps(result1, Result); + + comp = _mm_cmpeq_ps(sign, g_XMZero); + select0 = _mm_and_ps(comp, Result); + select1 = _mm_andnot_ps(comp, result1); + Result = _mm_or_ps(select0, select1); + return Result; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorATan2 +( + FXMVECTOR Y, + FXMVECTOR X +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + atan2f(Y.vector4_f32[0], X.vector4_f32[0]), + atan2f(Y.vector4_f32[1], X.vector4_f32[1]), + atan2f(Y.vector4_f32[2], X.vector4_f32[2]), + atan2f(Y.vector4_f32[3], X.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_atan2_ps(Y, X); + return Result; +#else + + // Return the inverse tangent of Y / X in the range of -Pi to Pi with the following exceptions: + + // Y == 0 and X is Negative -> Pi with the sign of Y + // y == 0 and x is positive -> 0 with the sign of y + // Y != 0 and X == 0 -> Pi / 2 with the sign of Y + // Y != 0 and X is Negative -> atan(y/x) + (PI with the sign of Y) + // X == -Infinity and Finite Y -> Pi with the sign of Y + // X == +Infinity and Finite Y -> 0 with the sign of Y + // Y == Infinity and X is Finite -> Pi / 2 with the sign of Y + // Y == Infinity and X == -Infinity -> 3Pi / 4 with the sign of Y + // Y == Infinity and X == +Infinity -> Pi / 4 with the sign of Y + + static const XMVECTORF32 ATan2Constants = { { { XM_PI, XM_PIDIV2, XM_PIDIV4, XM_PI * 3.0f / 4.0f } } }; + + XMVECTOR Zero = XMVectorZero(); + XMVECTOR ATanResultValid = XMVectorTrueInt(); + + XMVECTOR Pi = XMVectorSplatX(ATan2Constants); + XMVECTOR PiOverTwo = XMVectorSplatY(ATan2Constants); + XMVECTOR PiOverFour = XMVectorSplatZ(ATan2Constants); + XMVECTOR ThreePiOverFour = XMVectorSplatW(ATan2Constants); + + XMVECTOR YEqualsZero = XMVectorEqual(Y, Zero); + XMVECTOR XEqualsZero = XMVectorEqual(X, Zero); + XMVECTOR XIsPositive = XMVectorAndInt(X, g_XMNegativeZero.v); + XIsPositive = XMVectorEqualInt(XIsPositive, Zero); + XMVECTOR YEqualsInfinity = XMVectorIsInfinite(Y); + XMVECTOR XEqualsInfinity = XMVectorIsInfinite(X); + + XMVECTOR YSign = XMVectorAndInt(Y, g_XMNegativeZero.v); + Pi = XMVectorOrInt(Pi, YSign); + PiOverTwo = XMVectorOrInt(PiOverTwo, YSign); + PiOverFour = XMVectorOrInt(PiOverFour, YSign); + ThreePiOverFour = XMVectorOrInt(ThreePiOverFour, YSign); + + XMVECTOR R1 = XMVectorSelect(Pi, YSign, XIsPositive); + XMVECTOR R2 = XMVectorSelect(ATanResultValid, PiOverTwo, XEqualsZero); + XMVECTOR R3 = XMVectorSelect(R2, R1, YEqualsZero); + XMVECTOR R4 = XMVectorSelect(ThreePiOverFour, PiOverFour, XIsPositive); + XMVECTOR R5 = XMVectorSelect(PiOverTwo, R4, XEqualsInfinity); + XMVECTOR Result = XMVectorSelect(R3, R5, YEqualsInfinity); + ATanResultValid = XMVectorEqualInt(Result, ATanResultValid); + + XMVECTOR V = XMVectorDivide(Y, X); + + XMVECTOR R0 = XMVectorATan(V); + + R1 = XMVectorSelect(Pi, g_XMNegativeZero, XIsPositive); + R2 = XMVectorAdd(R0, R1); + + return XMVectorSelect(Result, R2, ATanResultValid); + +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorSinEst(FXMVECTOR V) noexcept +{ + // 7-degree minimax approximation + +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + sinf(V.vector4_f32[0]), + sinf(V.vector4_f32[1]), + sinf(V.vector4_f32[2]), + sinf(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Force the value within the bounds of pi + XMVECTOR x = XMVectorModAngles(V); + + // Map in [-pi/2,pi/2] with sin(y) = sin(x). + uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); + uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + float32x4_t absx = vabsq_f32(x); + float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); + uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); + x = vbslq_f32(comp, x, rflx); + + float32x4_t x2 = vmulq_f32(x, x); + + // Compute polynomial approximation + const XMVECTOR SEC = g_XMSinCoefficients1; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(SEC), 0); + XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(SEC), 1); + + vConstants = vdupq_lane_f32(vget_low_f32(SEC), 1); + Result = vmlaq_f32(vConstants, Result, x2); + + Result = vmlaq_f32(g_XMOne, Result, x2); + Result = vmulq_f32(Result, x); + return Result; +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_sin_ps(V); + return Result; +#elif defined(_XM_SSE_INTRINSICS_) + // Force the value within the bounds of pi + XMVECTOR x = XMVectorModAngles(V); + + // Map in [-pi/2,pi/2] with sin(y) = sin(x). + __m128 sign = _mm_and_ps(x, g_XMNegativeZero); + __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + __m128 absx = _mm_andnot_ps(sign, x); // |x| + __m128 rflx = _mm_sub_ps(c, x); + __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); + __m128 select0 = _mm_and_ps(comp, x); + __m128 select1 = _mm_andnot_ps(comp, rflx); + x = _mm_or_ps(select0, select1); + + __m128 x2 = _mm_mul_ps(x, x); + + // Compute polynomial approximation + const XMVECTOR SEC = g_XMSinCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 vConstants = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + + vConstants = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(1, 1, 1, 1)); + Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, g_XMOne); + Result = _mm_mul_ps(Result, x); + return Result; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorCosEst(FXMVECTOR V) noexcept +{ + // 6-degree minimax approximation + +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + cosf(V.vector4_f32[0]), + cosf(V.vector4_f32[1]), + cosf(V.vector4_f32[2]), + cosf(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Map V to x in [-pi,pi]. + XMVECTOR x = XMVectorModAngles(V); + + // Map in [-pi/2,pi/2] with cos(y) = sign*cos(x). + uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); + uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + float32x4_t absx = vabsq_f32(x); + float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); + uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); + x = vbslq_f32(comp, x, rflx); + float32x4_t fsign = vbslq_f32(comp, g_XMOne, g_XMNegativeOne); + + float32x4_t x2 = vmulq_f32(x, x); + + // Compute polynomial approximation + const XMVECTOR CEC = g_XMCosCoefficients1; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(CEC), 0); + XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(CEC), 1); + + vConstants = vdupq_lane_f32(vget_low_f32(CEC), 1); + Result = vmlaq_f32(vConstants, Result, x2); + + Result = vmlaq_f32(g_XMOne, Result, x2); + Result = vmulq_f32(Result, fsign); + return Result; +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_cos_ps(V); + return Result; +#elif defined(_XM_SSE_INTRINSICS_) + // Map V to x in [-pi,pi]. + XMVECTOR x = XMVectorModAngles(V); + + // Map in [-pi/2,pi/2] with cos(y) = sign*cos(x). + XMVECTOR sign = _mm_and_ps(x, g_XMNegativeZero); + __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + __m128 absx = _mm_andnot_ps(sign, x); // |x| + __m128 rflx = _mm_sub_ps(c, x); + __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); + __m128 select0 = _mm_and_ps(comp, x); + __m128 select1 = _mm_andnot_ps(comp, rflx); + x = _mm_or_ps(select0, select1); + select0 = _mm_and_ps(comp, g_XMOne); + select1 = _mm_andnot_ps(comp, g_XMNegativeOne); + sign = _mm_or_ps(select0, select1); + + __m128 x2 = _mm_mul_ps(x, x); + + // Compute polynomial approximation + const XMVECTOR CEC = g_XMCosCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 vConstants = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + + vConstants = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(1, 1, 1, 1)); + Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, g_XMOne); + Result = _mm_mul_ps(Result, sign); + return Result; +#endif +} + +//------------------------------------------------------------------------------ + +_Use_decl_annotations_ +inline void XM_CALLCONV XMVectorSinCosEst +( + XMVECTOR* pSin, + XMVECTOR* pCos, + FXMVECTOR V +) noexcept +{ + assert(pSin != nullptr); + assert(pCos != nullptr); + + // 7/6-degree minimax approximation + +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Sin = { { { + sinf(V.vector4_f32[0]), + sinf(V.vector4_f32[1]), + sinf(V.vector4_f32[2]), + sinf(V.vector4_f32[3]) + } } }; + + XMVECTORF32 Cos = { { { + cosf(V.vector4_f32[0]), + cosf(V.vector4_f32[1]), + cosf(V.vector4_f32[2]), + cosf(V.vector4_f32[3]) + } } }; + + *pSin = Sin.v; + *pCos = Cos.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Force the value within the bounds of pi + XMVECTOR x = XMVectorModAngles(V); + + // Map in [-pi/2,pi/2] with cos(y) = sign*cos(x). + uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), g_XMNegativeZero); + uint32x4_t c = vorrq_u32(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + float32x4_t absx = vabsq_f32(x); + float32x4_t rflx = vsubq_f32(vreinterpretq_f32_u32(c), x); + uint32x4_t comp = vcleq_f32(absx, g_XMHalfPi); + x = vbslq_f32(comp, x, rflx); + float32x4_t fsign = vbslq_f32(comp, g_XMOne, g_XMNegativeOne); + + float32x4_t x2 = vmulq_f32(x, x); + + // Compute polynomial approximation for sine + const XMVECTOR SEC = g_XMSinCoefficients1; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(SEC), 0); + XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(SEC), 1); + + vConstants = vdupq_lane_f32(vget_low_f32(SEC), 1); + Result = vmlaq_f32(vConstants, Result, x2); + + Result = vmlaq_f32(g_XMOne, Result, x2); + *pSin = vmulq_f32(Result, x); + + // Compute polynomial approximation + const XMVECTOR CEC = g_XMCosCoefficients1; + vConstants = vdupq_lane_f32(vget_high_f32(CEC), 0); + Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(CEC), 1); + + vConstants = vdupq_lane_f32(vget_low_f32(CEC), 1); + Result = vmlaq_f32(vConstants, Result, x2); + + Result = vmlaq_f32(g_XMOne, Result, x2); + *pCos = vmulq_f32(Result, fsign); +#elif defined(_XM_SSE_INTRINSICS_) + // Force the value within the bounds of pi + XMVECTOR x = XMVectorModAngles(V); + + // Map in [-pi/2,pi/2] with sin(y) = sin(x), cos(y) = sign*cos(x). + XMVECTOR sign = _mm_and_ps(x, g_XMNegativeZero); + __m128 c = _mm_or_ps(g_XMPi, sign); // pi when x >= 0, -pi when x < 0 + __m128 absx = _mm_andnot_ps(sign, x); // |x| + __m128 rflx = _mm_sub_ps(c, x); + __m128 comp = _mm_cmple_ps(absx, g_XMHalfPi); + __m128 select0 = _mm_and_ps(comp, x); + __m128 select1 = _mm_andnot_ps(comp, rflx); + x = _mm_or_ps(select0, select1); + select0 = _mm_and_ps(comp, g_XMOne); + select1 = _mm_andnot_ps(comp, g_XMNegativeOne); + sign = _mm_or_ps(select0, select1); + + __m128 x2 = _mm_mul_ps(x, x); + + // Compute polynomial approximation for sine + const XMVECTOR SEC = g_XMSinCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 vConstants = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + + vConstants = XM_PERMUTE_PS(SEC, _MM_SHUFFLE(1, 1, 1, 1)); + Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, g_XMOne); + Result = _mm_mul_ps(Result, x); + *pSin = Result; + + // Compute polynomial approximation for cosine + const XMVECTOR CEC = g_XMCosCoefficients1; + vConstantsB = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(3, 3, 3, 3)); + vConstants = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(2, 2, 2, 2)); + Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + + vConstants = XM_PERMUTE_PS(CEC, _MM_SHUFFLE(1, 1, 1, 1)); + Result = XM_FMADD_PS(Result, x2, vConstants); + Result = XM_FMADD_PS(Result, x2, g_XMOne); + Result = _mm_mul_ps(Result, sign); + *pCos = Result; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorTanEst(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + tanf(V.vector4_f32[0]), + tanf(V.vector4_f32[1]), + tanf(V.vector4_f32[2]), + tanf(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_tan_ps(V); + return Result; +#else + + XMVECTOR OneOverPi = XMVectorSplatW(g_XMTanEstCoefficients.v); + + XMVECTOR V1 = XMVectorMultiply(V, OneOverPi); + V1 = XMVectorRound(V1); + + V1 = XMVectorNegativeMultiplySubtract(g_XMPi.v, V1, V); + + XMVECTOR T0 = XMVectorSplatX(g_XMTanEstCoefficients.v); + XMVECTOR T1 = XMVectorSplatY(g_XMTanEstCoefficients.v); + XMVECTOR T2 = XMVectorSplatZ(g_XMTanEstCoefficients.v); + + XMVECTOR V2T2 = XMVectorNegativeMultiplySubtract(V1, V1, T2); + XMVECTOR V2 = XMVectorMultiply(V1, V1); + XMVECTOR V1T0 = XMVectorMultiply(V1, T0); + XMVECTOR V1T1 = XMVectorMultiply(V1, T1); + + XMVECTOR D = XMVectorReciprocalEst(V2T2); + XMVECTOR N = XMVectorMultiplyAdd(V2, V1T1, V1T0); + + return XMVectorMultiply(N, D); + +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorASinEst(FXMVECTOR V) noexcept +{ + // 3-degree minimax approximation + +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result; + Result.f[0] = asinf(V.vector4_f32[0]); + Result.f[1] = asinf(V.vector4_f32[1]); + Result.f[2] = asinf(V.vector4_f32[2]); + Result.f[3] = asinf(V.vector4_f32[3]); + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t nonnegative = vcgeq_f32(V, g_XMZero); + float32x4_t x = vabsq_f32(V); + + // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. + float32x4_t oneMValue = vsubq_f32(g_XMOne, x); + float32x4_t clampOneMValue = vmaxq_f32(g_XMZero, oneMValue); + float32x4_t root = XMVectorSqrt(clampOneMValue); + + // Compute polynomial approximation + const XMVECTOR AEC = g_XMArcEstCoefficients; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AEC), 0); + XMVECTOR t0 = vmlaq_lane_f32(vConstants, x, vget_high_f32(AEC), 1); + + vConstants = vdupq_lane_f32(vget_low_f32(AEC), 1); + t0 = vmlaq_f32(vConstants, t0, x); + + vConstants = vdupq_lane_f32(vget_low_f32(AEC), 0); + t0 = vmlaq_f32(vConstants, t0, x); + t0 = vmulq_f32(t0, root); + + float32x4_t t1 = vsubq_f32(g_XMPi, t0); + t0 = vbslq_f32(nonnegative, t0, t1); + t0 = vsubq_f32(g_XMHalfPi, t0); + return t0; +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_asin_ps(V); + return Result; +#elif defined(_XM_SSE_INTRINSICS_) + __m128 nonnegative = _mm_cmpge_ps(V, g_XMZero); + __m128 mvalue = _mm_sub_ps(g_XMZero, V); + __m128 x = _mm_max_ps(V, mvalue); // |V| + + // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. + __m128 oneMValue = _mm_sub_ps(g_XMOne, x); + __m128 clampOneMValue = _mm_max_ps(g_XMZero, oneMValue); + __m128 root = _mm_sqrt_ps(clampOneMValue); // sqrt(1-|V|) + + // Compute polynomial approximation + const XMVECTOR AEC = g_XMArcEstCoefficients; + __m128 vConstantsB = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 t0 = XM_FMADD_PS(vConstantsB, x, vConstants); + + vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(1, 1, 1, 1)); + t0 = XM_FMADD_PS(t0, x, vConstants); + + vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(0, 0, 0, 0)); + t0 = XM_FMADD_PS(t0, x, vConstants); + t0 = _mm_mul_ps(t0, root); + + __m128 t1 = _mm_sub_ps(g_XMPi, t0); + t0 = _mm_and_ps(nonnegative, t0); + t1 = _mm_andnot_ps(nonnegative, t1); + t0 = _mm_or_ps(t0, t1); + t0 = _mm_sub_ps(g_XMHalfPi, t0); + return t0; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorACosEst(FXMVECTOR V) noexcept +{ + // 3-degree minimax approximation + +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + acosf(V.vector4_f32[0]), + acosf(V.vector4_f32[1]), + acosf(V.vector4_f32[2]), + acosf(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t nonnegative = vcgeq_f32(V, g_XMZero); + float32x4_t x = vabsq_f32(V); + + // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. + float32x4_t oneMValue = vsubq_f32(g_XMOne, x); + float32x4_t clampOneMValue = vmaxq_f32(g_XMZero, oneMValue); + float32x4_t root = XMVectorSqrt(clampOneMValue); + + // Compute polynomial approximation + const XMVECTOR AEC = g_XMArcEstCoefficients; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AEC), 0); + XMVECTOR t0 = vmlaq_lane_f32(vConstants, x, vget_high_f32(AEC), 1); + + vConstants = vdupq_lane_f32(vget_low_f32(AEC), 1); + t0 = vmlaq_f32(vConstants, t0, x); + + vConstants = vdupq_lane_f32(vget_low_f32(AEC), 0); + t0 = vmlaq_f32(vConstants, t0, x); + t0 = vmulq_f32(t0, root); + + float32x4_t t1 = vsubq_f32(g_XMPi, t0); + t0 = vbslq_f32(nonnegative, t0, t1); + return t0; +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_acos_ps(V); + return Result; +#elif defined(_XM_SSE_INTRINSICS_) + __m128 nonnegative = _mm_cmpge_ps(V, g_XMZero); + __m128 mvalue = _mm_sub_ps(g_XMZero, V); + __m128 x = _mm_max_ps(V, mvalue); // |V| + + // Compute (1-|V|), clamp to zero to avoid sqrt of negative number. + __m128 oneMValue = _mm_sub_ps(g_XMOne, x); + __m128 clampOneMValue = _mm_max_ps(g_XMZero, oneMValue); + __m128 root = _mm_sqrt_ps(clampOneMValue); // sqrt(1-|V|) + + // Compute polynomial approximation + const XMVECTOR AEC = g_XMArcEstCoefficients; + __m128 vConstantsB = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 t0 = XM_FMADD_PS(vConstantsB, x, vConstants); + + vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(1, 1, 1, 1)); + t0 = XM_FMADD_PS(t0, x, vConstants); + + vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(0, 0, 0, 0)); + t0 = XM_FMADD_PS(t0, x, vConstants); + t0 = _mm_mul_ps(t0, root); + + __m128 t1 = _mm_sub_ps(g_XMPi, t0); + t0 = _mm_and_ps(nonnegative, t0); + t1 = _mm_andnot_ps(nonnegative, t1); + t0 = _mm_or_ps(t0, t1); + return t0; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorATanEst(FXMVECTOR V) noexcept +{ + // 9-degree minimax approximation + +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + atanf(V.vector4_f32[0]), + atanf(V.vector4_f32[1]), + atanf(V.vector4_f32[2]), + atanf(V.vector4_f32[3]) + } } }; + return Result.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t absV = vabsq_f32(V); + float32x4_t invV = XMVectorReciprocalEst(V); + uint32x4_t comp = vcgtq_f32(V, g_XMOne); + float32x4_t sign = vbslq_f32(comp, g_XMOne, g_XMNegativeOne); + comp = vcleq_f32(absV, g_XMOne); + sign = vbslq_f32(comp, g_XMZero, sign); + float32x4_t x = vbslq_f32(comp, V, invV); + + float32x4_t x2 = vmulq_f32(x, x); + + // Compute polynomial approximation + const XMVECTOR AEC = g_XMATanEstCoefficients1; + XMVECTOR vConstants = vdupq_lane_f32(vget_high_f32(AEC), 0); + XMVECTOR Result = vmlaq_lane_f32(vConstants, x2, vget_high_f32(AEC), 1); + + vConstants = vdupq_lane_f32(vget_low_f32(AEC), 1); + Result = vmlaq_f32(vConstants, Result, x2); + + vConstants = vdupq_lane_f32(vget_low_f32(AEC), 0); + Result = vmlaq_f32(vConstants, Result, x2); + + // ATanEstCoefficients0 is already splatted + Result = vmlaq_f32(g_XMATanEstCoefficients0, Result, x2); + Result = vmulq_f32(Result, x); + + float32x4_t result1 = vmulq_f32(sign, g_XMHalfPi); + result1 = vsubq_f32(result1, Result); + + comp = vceqq_f32(sign, g_XMZero); + Result = vbslq_f32(comp, Result, result1); + return Result; +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_atan_ps(V); + return Result; +#elif defined(_XM_SSE_INTRINSICS_) + __m128 absV = XMVectorAbs(V); + __m128 invV = _mm_div_ps(g_XMOne, V); + __m128 comp = _mm_cmpgt_ps(V, g_XMOne); + __m128 select0 = _mm_and_ps(comp, g_XMOne); + __m128 select1 = _mm_andnot_ps(comp, g_XMNegativeOne); + __m128 sign = _mm_or_ps(select0, select1); + comp = _mm_cmple_ps(absV, g_XMOne); + select0 = _mm_and_ps(comp, g_XMZero); + select1 = _mm_andnot_ps(comp, sign); + sign = _mm_or_ps(select0, select1); + select0 = _mm_and_ps(comp, V); + select1 = _mm_andnot_ps(comp, invV); + __m128 x = _mm_or_ps(select0, select1); + + __m128 x2 = _mm_mul_ps(x, x); + + // Compute polynomial approximation + const XMVECTOR AEC = g_XMATanEstCoefficients1; + __m128 vConstantsB = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(3, 3, 3, 3)); + __m128 vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Result = XM_FMADD_PS(vConstantsB, x2, vConstants); + + vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(1, 1, 1, 1)); + Result = XM_FMADD_PS(Result, x2, vConstants); + + vConstants = XM_PERMUTE_PS(AEC, _MM_SHUFFLE(0, 0, 0, 0)); + Result = XM_FMADD_PS(Result, x2, vConstants); + // ATanEstCoefficients0 is already splatted + Result = XM_FMADD_PS(Result, x2, g_XMATanEstCoefficients0); + Result = _mm_mul_ps(Result, x); + __m128 result1 = _mm_mul_ps(sign, g_XMHalfPi); + result1 = _mm_sub_ps(result1, Result); + + comp = _mm_cmpeq_ps(sign, g_XMZero); + select0 = _mm_and_ps(comp, Result); + select1 = _mm_andnot_ps(comp, result1); + Result = _mm_or_ps(select0, select1); + return Result; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorATan2Est +( + FXMVECTOR Y, + FXMVECTOR X +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 Result = { { { + atan2f(Y.vector4_f32[0], X.vector4_f32[0]), + atan2f(Y.vector4_f32[1], X.vector4_f32[1]), + atan2f(Y.vector4_f32[2], X.vector4_f32[2]), + atan2f(Y.vector4_f32[3], X.vector4_f32[3]), + } } }; + return Result.v; +#elif defined(_XM_SVML_INTRINSICS_) + XMVECTOR Result = _mm_atan2_ps(Y, X); + return Result; +#else + + static const XMVECTORF32 ATan2Constants = { { { XM_PI, XM_PIDIV2, XM_PIDIV4, 2.3561944905f /* Pi*3/4 */ } } }; + + const XMVECTOR Zero = XMVectorZero(); + XMVECTOR ATanResultValid = XMVectorTrueInt(); + + XMVECTOR Pi = XMVectorSplatX(ATan2Constants); + XMVECTOR PiOverTwo = XMVectorSplatY(ATan2Constants); + XMVECTOR PiOverFour = XMVectorSplatZ(ATan2Constants); + XMVECTOR ThreePiOverFour = XMVectorSplatW(ATan2Constants); + + XMVECTOR YEqualsZero = XMVectorEqual(Y, Zero); + XMVECTOR XEqualsZero = XMVectorEqual(X, Zero); + XMVECTOR XIsPositive = XMVectorAndInt(X, g_XMNegativeZero.v); + XIsPositive = XMVectorEqualInt(XIsPositive, Zero); + XMVECTOR YEqualsInfinity = XMVectorIsInfinite(Y); + XMVECTOR XEqualsInfinity = XMVectorIsInfinite(X); + + XMVECTOR YSign = XMVectorAndInt(Y, g_XMNegativeZero.v); + Pi = XMVectorOrInt(Pi, YSign); + PiOverTwo = XMVectorOrInt(PiOverTwo, YSign); + PiOverFour = XMVectorOrInt(PiOverFour, YSign); + ThreePiOverFour = XMVectorOrInt(ThreePiOverFour, YSign); + + XMVECTOR R1 = XMVectorSelect(Pi, YSign, XIsPositive); + XMVECTOR R2 = XMVectorSelect(ATanResultValid, PiOverTwo, XEqualsZero); + XMVECTOR R3 = XMVectorSelect(R2, R1, YEqualsZero); + XMVECTOR R4 = XMVectorSelect(ThreePiOverFour, PiOverFour, XIsPositive); + XMVECTOR R5 = XMVectorSelect(PiOverTwo, R4, XEqualsInfinity); + XMVECTOR Result = XMVectorSelect(R3, R5, YEqualsInfinity); + ATanResultValid = XMVectorEqualInt(Result, ATanResultValid); + + XMVECTOR Reciprocal = XMVectorReciprocalEst(X); + XMVECTOR V = XMVectorMultiply(Y, Reciprocal); + XMVECTOR R0 = XMVectorATanEst(V); + + R1 = XMVectorSelect(Pi, g_XMNegativeZero, XIsPositive); + R2 = XMVectorAdd(R0, R1); + + Result = XMVectorSelect(Result, R2, ATanResultValid); + + return Result; + +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorLerp +( + FXMVECTOR V0, + FXMVECTOR V1, + float t +) noexcept +{ + // V0 + t * (V1 - V0) + +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Scale = XMVectorReplicate(t); + XMVECTOR Length = XMVectorSubtract(V1, V0); + return XMVectorMultiplyAdd(Length, Scale, V0); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + XMVECTOR L = vsubq_f32(V1, V0); + return vmlaq_n_f32(V0, L, t); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR L = _mm_sub_ps(V1, V0); + XMVECTOR S = _mm_set_ps1(t); + return XM_FMADD_PS(L, S, V0); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorLerpV +( + FXMVECTOR V0, + FXMVECTOR V1, + FXMVECTOR T +) noexcept +{ + // V0 + T * (V1 - V0) + +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Length = XMVectorSubtract(V1, V0); + return XMVectorMultiplyAdd(Length, T, V0); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + XMVECTOR L = vsubq_f32(V1, V0); + return vmlaq_f32(V0, L, T); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR Length = _mm_sub_ps(V1, V0); + return XM_FMADD_PS(Length, T, V0); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorHermite +( + FXMVECTOR Position0, + FXMVECTOR Tangent0, + FXMVECTOR Position1, + GXMVECTOR Tangent1, + float t +) noexcept +{ + // Result = (2 * t^3 - 3 * t^2 + 1) * Position0 + + // (t^3 - 2 * t^2 + t) * Tangent0 + + // (-2 * t^3 + 3 * t^2) * Position1 + + // (t^3 - t^2) * Tangent1 + +#if defined(_XM_NO_INTRINSICS_) + + float t2 = t * t; + float t3 = t * t2; + + XMVECTOR P0 = XMVectorReplicate(2.0f * t3 - 3.0f * t2 + 1.0f); + XMVECTOR T0 = XMVectorReplicate(t3 - 2.0f * t2 + t); + XMVECTOR P1 = XMVectorReplicate(-2.0f * t3 + 3.0f * t2); + XMVECTOR T1 = XMVectorReplicate(t3 - t2); + + XMVECTOR Result = XMVectorMultiply(P0, Position0); + Result = XMVectorMultiplyAdd(T0, Tangent0, Result); + Result = XMVectorMultiplyAdd(P1, Position1, Result); + Result = XMVectorMultiplyAdd(T1, Tangent1, Result); + + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float t2 = t * t; + float t3 = t * t2; + + float p0 = 2.0f * t3 - 3.0f * t2 + 1.0f; + float t0 = t3 - 2.0f * t2 + t; + float p1 = -2.0f * t3 + 3.0f * t2; + float t1 = t3 - t2; + + XMVECTOR vResult = vmulq_n_f32(Position0, p0); + vResult = vmlaq_n_f32(vResult, Tangent0, t0); + vResult = vmlaq_n_f32(vResult, Position1, p1); + vResult = vmlaq_n_f32(vResult, Tangent1, t1); + return vResult; +#elif defined(_XM_SSE_INTRINSICS_) + float t2 = t * t; + float t3 = t * t2; + + XMVECTOR P0 = _mm_set_ps1(2.0f * t3 - 3.0f * t2 + 1.0f); + XMVECTOR T0 = _mm_set_ps1(t3 - 2.0f * t2 + t); + XMVECTOR P1 = _mm_set_ps1(-2.0f * t3 + 3.0f * t2); + XMVECTOR T1 = _mm_set_ps1(t3 - t2); + + XMVECTOR vResult = _mm_mul_ps(P0, Position0); + vResult = XM_FMADD_PS(Tangent0, T0, vResult); + vResult = XM_FMADD_PS(Position1, P1, vResult); + vResult = XM_FMADD_PS(Tangent1, T1, vResult); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorHermiteV +( + FXMVECTOR Position0, + FXMVECTOR Tangent0, + FXMVECTOR Position1, + GXMVECTOR Tangent1, + HXMVECTOR T +) noexcept +{ + // Result = (2 * t^3 - 3 * t^2 + 1) * Position0 + + // (t^3 - 2 * t^2 + t) * Tangent0 + + // (-2 * t^3 + 3 * t^2) * Position1 + + // (t^3 - t^2) * Tangent1 + +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR T2 = XMVectorMultiply(T, T); + XMVECTOR T3 = XMVectorMultiply(T, T2); + + XMVECTOR P0 = XMVectorReplicate(2.0f * T3.vector4_f32[0] - 3.0f * T2.vector4_f32[0] + 1.0f); + XMVECTOR T0 = XMVectorReplicate(T3.vector4_f32[1] - 2.0f * T2.vector4_f32[1] + T.vector4_f32[1]); + XMVECTOR P1 = XMVectorReplicate(-2.0f * T3.vector4_f32[2] + 3.0f * T2.vector4_f32[2]); + XMVECTOR T1 = XMVectorReplicate(T3.vector4_f32[3] - T2.vector4_f32[3]); + + XMVECTOR Result = XMVectorMultiply(P0, Position0); + Result = XMVectorMultiplyAdd(T0, Tangent0, Result); + Result = XMVectorMultiplyAdd(P1, Position1, Result); + Result = XMVectorMultiplyAdd(T1, Tangent1, Result); + + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 CatMulT2 = { { { -3.0f, -2.0f, 3.0f, -1.0f } } }; + static const XMVECTORF32 CatMulT3 = { { { 2.0f, 1.0f, -2.0f, 1.0f } } }; + + XMVECTOR T2 = vmulq_f32(T, T); + XMVECTOR T3 = vmulq_f32(T, T2); + // Mul by the constants against t^2 + T2 = vmulq_f32(T2, CatMulT2); + // Mul by the constants against t^3 + T3 = vmlaq_f32(T2, T3, CatMulT3); + // T3 now has the pre-result. + // I need to add t.y only + T2 = vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(T), g_XMMaskY)); + T3 = vaddq_f32(T3, T2); + // Add 1.0f to x + T3 = vaddq_f32(T3, g_XMIdentityR0); + // Now, I have the constants created + // Mul the x constant to Position0 + XMVECTOR vResult = vmulq_lane_f32(Position0, vget_low_f32(T3), 0); // T3[0] + // Mul the y constant to Tangent0 + vResult = vmlaq_lane_f32(vResult, Tangent0, vget_low_f32(T3), 1); // T3[1] + // Mul the z constant to Position1 + vResult = vmlaq_lane_f32(vResult, Position1, vget_high_f32(T3), 0); // T3[2] + // Mul the w constant to Tangent1 + vResult = vmlaq_lane_f32(vResult, Tangent1, vget_high_f32(T3), 1); // T3[3] + return vResult; +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 CatMulT2 = { { { -3.0f, -2.0f, 3.0f, -1.0f } } }; + static const XMVECTORF32 CatMulT3 = { { { 2.0f, 1.0f, -2.0f, 1.0f } } }; + + XMVECTOR T2 = _mm_mul_ps(T, T); + XMVECTOR T3 = _mm_mul_ps(T, T2); + // Mul by the constants against t^2 + T2 = _mm_mul_ps(T2, CatMulT2); + // Mul by the constants against t^3 + T3 = XM_FMADD_PS(T3, CatMulT3, T2); + // T3 now has the pre-result. + // I need to add t.y only + T2 = _mm_and_ps(T, g_XMMaskY); + T3 = _mm_add_ps(T3, T2); + // Add 1.0f to x + T3 = _mm_add_ps(T3, g_XMIdentityR0); + // Now, I have the constants created + // Mul the x constant to Position0 + XMVECTOR vResult = XM_PERMUTE_PS(T3, _MM_SHUFFLE(0, 0, 0, 0)); + vResult = _mm_mul_ps(vResult, Position0); + // Mul the y constant to Tangent0 + T2 = XM_PERMUTE_PS(T3, _MM_SHUFFLE(1, 1, 1, 1)); + vResult = XM_FMADD_PS(T2, Tangent0, vResult); + // Mul the z constant to Position1 + T2 = XM_PERMUTE_PS(T3, _MM_SHUFFLE(2, 2, 2, 2)); + vResult = XM_FMADD_PS(T2, Position1, vResult); + // Mul the w constant to Tangent1 + T3 = XM_PERMUTE_PS(T3, _MM_SHUFFLE(3, 3, 3, 3)); + vResult = XM_FMADD_PS(T3, Tangent1, vResult); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorCatmullRom +( + FXMVECTOR Position0, + FXMVECTOR Position1, + FXMVECTOR Position2, + GXMVECTOR Position3, + float t +) noexcept +{ + // Result = ((-t^3 + 2 * t^2 - t) * Position0 + + // (3 * t^3 - 5 * t^2 + 2) * Position1 + + // (-3 * t^3 + 4 * t^2 + t) * Position2 + + // (t^3 - t^2) * Position3) * 0.5 + +#if defined(_XM_NO_INTRINSICS_) + + float t2 = t * t; + float t3 = t * t2; + + XMVECTOR P0 = XMVectorReplicate((-t3 + 2.0f * t2 - t) * 0.5f); + XMVECTOR P1 = XMVectorReplicate((3.0f * t3 - 5.0f * t2 + 2.0f) * 0.5f); + XMVECTOR P2 = XMVectorReplicate((-3.0f * t3 + 4.0f * t2 + t) * 0.5f); + XMVECTOR P3 = XMVectorReplicate((t3 - t2) * 0.5f); + + XMVECTOR Result = XMVectorMultiply(P0, Position0); + Result = XMVectorMultiplyAdd(P1, Position1, Result); + Result = XMVectorMultiplyAdd(P2, Position2, Result); + Result = XMVectorMultiplyAdd(P3, Position3, Result); + + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float t2 = t * t; + float t3 = t * t2; + + float p0 = (-t3 + 2.0f * t2 - t) * 0.5f; + float p1 = (3.0f * t3 - 5.0f * t2 + 2.0f) * 0.5f; + float p2 = (-3.0f * t3 + 4.0f * t2 + t) * 0.5f; + float p3 = (t3 - t2) * 0.5f; + + XMVECTOR P1 = vmulq_n_f32(Position1, p1); + XMVECTOR P0 = vmlaq_n_f32(P1, Position0, p0); + XMVECTOR P3 = vmulq_n_f32(Position3, p3); + XMVECTOR P2 = vmlaq_n_f32(P3, Position2, p2); + P0 = vaddq_f32(P0, P2); + return P0; +#elif defined(_XM_SSE_INTRINSICS_) + float t2 = t * t; + float t3 = t * t2; + + XMVECTOR P0 = _mm_set_ps1((-t3 + 2.0f * t2 - t) * 0.5f); + XMVECTOR P1 = _mm_set_ps1((3.0f * t3 - 5.0f * t2 + 2.0f) * 0.5f); + XMVECTOR P2 = _mm_set_ps1((-3.0f * t3 + 4.0f * t2 + t) * 0.5f); + XMVECTOR P3 = _mm_set_ps1((t3 - t2) * 0.5f); + + P1 = _mm_mul_ps(Position1, P1); + P0 = XM_FMADD_PS(Position0, P0, P1); + P3 = _mm_mul_ps(Position3, P3); + P2 = XM_FMADD_PS(Position2, P2, P3); + P0 = _mm_add_ps(P0, P2); + return P0; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorCatmullRomV +( + FXMVECTOR Position0, + FXMVECTOR Position1, + FXMVECTOR Position2, + GXMVECTOR Position3, + HXMVECTOR T +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + float fx = T.vector4_f32[0]; + float fy = T.vector4_f32[1]; + float fz = T.vector4_f32[2]; + float fw = T.vector4_f32[3]; + XMVECTORF32 vResult = { { { + 0.5f * ((-fx * fx * fx + 2 * fx * fx - fx) * Position0.vector4_f32[0] + + (3 * fx * fx * fx - 5 * fx * fx + 2) * Position1.vector4_f32[0] + + (-3 * fx * fx * fx + 4 * fx * fx + fx) * Position2.vector4_f32[0] + + (fx * fx * fx - fx * fx) * Position3.vector4_f32[0]), + + 0.5f * ((-fy * fy * fy + 2 * fy * fy - fy) * Position0.vector4_f32[1] + + (3 * fy * fy * fy - 5 * fy * fy + 2) * Position1.vector4_f32[1] + + (-3 * fy * fy * fy + 4 * fy * fy + fy) * Position2.vector4_f32[1] + + (fy * fy * fy - fy * fy) * Position3.vector4_f32[1]), + + 0.5f * ((-fz * fz * fz + 2 * fz * fz - fz) * Position0.vector4_f32[2] + + (3 * fz * fz * fz - 5 * fz * fz + 2) * Position1.vector4_f32[2] + + (-3 * fz * fz * fz + 4 * fz * fz + fz) * Position2.vector4_f32[2] + + (fz * fz * fz - fz * fz) * Position3.vector4_f32[2]), + + 0.5f * ((-fw * fw * fw + 2 * fw * fw - fw) * Position0.vector4_f32[3] + + (3 * fw * fw * fw - 5 * fw * fw + 2) * Position1.vector4_f32[3] + + (-3 * fw * fw * fw + 4 * fw * fw + fw) * Position2.vector4_f32[3] + + (fw * fw * fw - fw * fw) * Position3.vector4_f32[3]) + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 Catmul2 = { { { 2.0f, 2.0f, 2.0f, 2.0f } } }; + static const XMVECTORF32 Catmul3 = { { { 3.0f, 3.0f, 3.0f, 3.0f } } }; + static const XMVECTORF32 Catmul4 = { { { 4.0f, 4.0f, 4.0f, 4.0f } } }; + static const XMVECTORF32 Catmul5 = { { { 5.0f, 5.0f, 5.0f, 5.0f } } }; + // Cache T^2 and T^3 + XMVECTOR T2 = vmulq_f32(T, T); + XMVECTOR T3 = vmulq_f32(T, T2); + // Perform the Position0 term + XMVECTOR vResult = vaddq_f32(T2, T2); + vResult = vsubq_f32(vResult, T); + vResult = vsubq_f32(vResult, T3); + vResult = vmulq_f32(vResult, Position0); + // Perform the Position1 term and add + XMVECTOR vTemp = vmulq_f32(T3, Catmul3); + vTemp = vmlsq_f32(vTemp, T2, Catmul5); + vTemp = vaddq_f32(vTemp, Catmul2); + vResult = vmlaq_f32(vResult, vTemp, Position1); + // Perform the Position2 term and add + vTemp = vmulq_f32(T2, Catmul4); + vTemp = vmlsq_f32(vTemp, T3, Catmul3); + vTemp = vaddq_f32(vTemp, T); + vResult = vmlaq_f32(vResult, vTemp, Position2); + // Position3 is the last term + T3 = vsubq_f32(T3, T2); + vResult = vmlaq_f32(vResult, T3, Position3); + // Multiply by 0.5f and exit + vResult = vmulq_f32(vResult, g_XMOneHalf); + return vResult; +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 Catmul2 = { { { 2.0f, 2.0f, 2.0f, 2.0f } } }; + static const XMVECTORF32 Catmul3 = { { { 3.0f, 3.0f, 3.0f, 3.0f } } }; + static const XMVECTORF32 Catmul4 = { { { 4.0f, 4.0f, 4.0f, 4.0f } } }; + static const XMVECTORF32 Catmul5 = { { { 5.0f, 5.0f, 5.0f, 5.0f } } }; + // Cache T^2 and T^3 + XMVECTOR T2 = _mm_mul_ps(T, T); + XMVECTOR T3 = _mm_mul_ps(T, T2); + // Perform the Position0 term + XMVECTOR vResult = _mm_add_ps(T2, T2); + vResult = _mm_sub_ps(vResult, T); + vResult = _mm_sub_ps(vResult, T3); + vResult = _mm_mul_ps(vResult, Position0); + // Perform the Position1 term and add + XMVECTOR vTemp = _mm_mul_ps(T3, Catmul3); + vTemp = XM_FNMADD_PS(T2, Catmul5, vTemp); + vTemp = _mm_add_ps(vTemp, Catmul2); + vResult = XM_FMADD_PS(vTemp, Position1, vResult); + // Perform the Position2 term and add + vTemp = _mm_mul_ps(T2, Catmul4); + vTemp = XM_FNMADD_PS(T3, Catmul3, vTemp); + vTemp = _mm_add_ps(vTemp, T); + vResult = XM_FMADD_PS(vTemp, Position2, vResult); + // Position3 is the last term + T3 = _mm_sub_ps(T3, T2); + vResult = XM_FMADD_PS(T3, Position3, vResult); + // Multiply by 0.5f and exit + vResult = _mm_mul_ps(vResult, g_XMOneHalf); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorBaryCentric +( + FXMVECTOR Position0, + FXMVECTOR Position1, + FXMVECTOR Position2, + float f, + float g +) noexcept +{ + // Result = Position0 + f * (Position1 - Position0) + g * (Position2 - Position0) + +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR P10 = XMVectorSubtract(Position1, Position0); + XMVECTOR ScaleF = XMVectorReplicate(f); + + XMVECTOR P20 = XMVectorSubtract(Position2, Position0); + XMVECTOR ScaleG = XMVectorReplicate(g); + + XMVECTOR Result = XMVectorMultiplyAdd(P10, ScaleF, Position0); + Result = XMVectorMultiplyAdd(P20, ScaleG, Result); + + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + XMVECTOR R1 = vsubq_f32(Position1, Position0); + XMVECTOR R2 = vsubq_f32(Position2, Position0); + R1 = vmlaq_n_f32(Position0, R1, f); + return vmlaq_n_f32(R1, R2, g); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR R1 = _mm_sub_ps(Position1, Position0); + XMVECTOR R2 = _mm_sub_ps(Position2, Position0); + XMVECTOR SF = _mm_set_ps1(f); + R1 = XM_FMADD_PS(R1, SF, Position0); + XMVECTOR SG = _mm_set_ps1(g); + return XM_FMADD_PS(R2, SG, R1); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVectorBaryCentricV +( + FXMVECTOR Position0, + FXMVECTOR Position1, + FXMVECTOR Position2, + GXMVECTOR F, + HXMVECTOR G +) noexcept +{ + // Result = Position0 + f * (Position1 - Position0) + g * (Position2 - Position0) + +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR P10 = XMVectorSubtract(Position1, Position0); + XMVECTOR P20 = XMVectorSubtract(Position2, Position0); + + XMVECTOR Result = XMVectorMultiplyAdd(P10, F, Position0); + Result = XMVectorMultiplyAdd(P20, G, Result); + + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + XMVECTOR R1 = vsubq_f32(Position1, Position0); + XMVECTOR R2 = vsubq_f32(Position2, Position0); + R1 = vmlaq_f32(Position0, R1, F); + return vmlaq_f32(R1, R2, G); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR R1 = _mm_sub_ps(Position1, Position0); + XMVECTOR R2 = _mm_sub_ps(Position2, Position0); + R1 = XM_FMADD_PS(R1, F, Position0); + return XM_FMADD_PS(R2, G, R1); +#endif +} + +/**************************************************************************** + * + * 2D Vector + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ +// Comparison operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector2Equal +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_f32[0] == V2.vector4_f32[0]) && (V1.vector4_f32[1] == V2.vector4_f32[1])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vTemp = vceq_f32(vget_low_f32(V1), vget_low_f32(V2)); + return (vget_lane_u64(vreinterpret_u64_u32(vTemp), 0) == 0xFFFFFFFFFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); + // z and w are don't care + return (((_mm_movemask_ps(vTemp) & 3) == 3) != 0); +#endif +} + + +//------------------------------------------------------------------------------ + +inline uint32_t XM_CALLCONV XMVector2EqualR +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + uint32_t CR = 0; + if ((V1.vector4_f32[0] == V2.vector4_f32[0]) && + (V1.vector4_f32[1] == V2.vector4_f32[1])) + { + CR = XM_CRMASK_CR6TRUE; + } + else if ((V1.vector4_f32[0] != V2.vector4_f32[0]) && + (V1.vector4_f32[1] != V2.vector4_f32[1])) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vTemp = vceq_f32(vget_low_f32(V1), vget_low_f32(V2)); + uint64_t r = vget_lane_u64(vreinterpret_u64_u32(vTemp), 0); + uint32_t CR = 0; + if (r == 0xFFFFFFFFFFFFFFFFU) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!r) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); + // z and w are don't care + int iTest = _mm_movemask_ps(vTemp) & 3; + uint32_t CR = 0; + if (iTest == 3) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!iTest) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector2EqualInt +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_u32[0] == V2.vector4_u32[0]) && (V1.vector4_u32[1] == V2.vector4_u32[1])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vTemp = vceq_u32(vget_low_u32(vreinterpretq_u32_f32(V1)), vget_low_u32(vreinterpretq_u32_f32(V2))); + return (vget_lane_u64(vreinterpret_u64_u32(vTemp), 0) == 0xFFFFFFFFFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); + return (((_mm_movemask_ps(_mm_castsi128_ps(vTemp)) & 3) == 3) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +inline uint32_t XM_CALLCONV XMVector2EqualIntR +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + uint32_t CR = 0; + if ((V1.vector4_u32[0] == V2.vector4_u32[0]) && + (V1.vector4_u32[1] == V2.vector4_u32[1])) + { + CR = XM_CRMASK_CR6TRUE; + } + else if ((V1.vector4_u32[0] != V2.vector4_u32[0]) && + (V1.vector4_u32[1] != V2.vector4_u32[1])) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vTemp = vceq_u32(vget_low_u32(vreinterpretq_u32_f32(V1)), vget_low_u32(vreinterpretq_u32_f32(V2))); + uint64_t r = vget_lane_u64(vreinterpret_u64_u32(vTemp), 0); + uint32_t CR = 0; + if (r == 0xFFFFFFFFFFFFFFFFU) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!r) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#elif defined(_XM_SSE_INTRINSICS_) + __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); + int iTest = _mm_movemask_ps(_mm_castsi128_ps(vTemp)) & 3; + uint32_t CR = 0; + if (iTest == 3) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!iTest) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector2NearEqual +( + FXMVECTOR V1, + FXMVECTOR V2, + FXMVECTOR Epsilon +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + float dx = fabsf(V1.vector4_f32[0] - V2.vector4_f32[0]); + float dy = fabsf(V1.vector4_f32[1] - V2.vector4_f32[1]); + return ((dx <= Epsilon.vector4_f32[0]) && + (dy <= Epsilon.vector4_f32[1])); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t vDelta = vsub_f32(vget_low_f32(V1), vget_low_f32(V2)); +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + uint32x2_t vTemp = vacle_f32(vDelta, vget_low_u32(Epsilon)); +#else + uint32x2_t vTemp = vcle_f32(vabs_f32(vDelta), vget_low_f32(Epsilon)); +#endif + uint64_t r = vget_lane_u64(vreinterpret_u64_u32(vTemp), 0); + return (r == 0xFFFFFFFFFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + // Get the difference + XMVECTOR vDelta = _mm_sub_ps(V1, V2); + // Get the absolute value of the difference + XMVECTOR vTemp = _mm_setzero_ps(); + vTemp = _mm_sub_ps(vTemp, vDelta); + vTemp = _mm_max_ps(vTemp, vDelta); + vTemp = _mm_cmple_ps(vTemp, Epsilon); + // z and w are don't care + return (((_mm_movemask_ps(vTemp) & 3) == 0x3) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector2NotEqual +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_f32[0] != V2.vector4_f32[0]) || (V1.vector4_f32[1] != V2.vector4_f32[1])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vTemp = vceq_f32(vget_low_f32(V1), vget_low_f32(V2)); + return (vget_lane_u64(vreinterpret_u64_u32(vTemp), 0) != 0xFFFFFFFFFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); + // z and w are don't care + return (((_mm_movemask_ps(vTemp) & 3) != 3) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector2NotEqualInt +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_u32[0] != V2.vector4_u32[0]) || (V1.vector4_u32[1] != V2.vector4_u32[1])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vTemp = vceq_u32(vget_low_u32(vreinterpretq_u32_f32(V1)), vget_low_u32(vreinterpretq_u32_f32(V2))); + return (vget_lane_u64(vreinterpret_u64_u32(vTemp), 0) != 0xFFFFFFFFFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); + return (((_mm_movemask_ps(_mm_castsi128_ps(vTemp)) & 3) != 3) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector2Greater +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_f32[0] > V2.vector4_f32[0]) && (V1.vector4_f32[1] > V2.vector4_f32[1])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vTemp = vcgt_f32(vget_low_f32(V1), vget_low_f32(V2)); + return (vget_lane_u64(vreinterpret_u64_u32(vTemp), 0) == 0xFFFFFFFFFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); + // z and w are don't care + return (((_mm_movemask_ps(vTemp) & 3) == 3) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +inline uint32_t XM_CALLCONV XMVector2GreaterR +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + uint32_t CR = 0; + if ((V1.vector4_f32[0] > V2.vector4_f32[0]) && + (V1.vector4_f32[1] > V2.vector4_f32[1])) + { + CR = XM_CRMASK_CR6TRUE; + } + else if ((V1.vector4_f32[0] <= V2.vector4_f32[0]) && + (V1.vector4_f32[1] <= V2.vector4_f32[1])) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vTemp = vcgt_f32(vget_low_f32(V1), vget_low_f32(V2)); + uint64_t r = vget_lane_u64(vreinterpret_u64_u32(vTemp), 0); + uint32_t CR = 0; + if (r == 0xFFFFFFFFFFFFFFFFU) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!r) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); + int iTest = _mm_movemask_ps(vTemp) & 3; + uint32_t CR = 0; + if (iTest == 3) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!iTest) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector2GreaterOrEqual +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_f32[0] >= V2.vector4_f32[0]) && (V1.vector4_f32[1] >= V2.vector4_f32[1])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vTemp = vcge_f32(vget_low_f32(V1), vget_low_f32(V2)); + return (vget_lane_u64(vreinterpret_u64_u32(vTemp), 0) == 0xFFFFFFFFFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); + return (((_mm_movemask_ps(vTemp) & 3) == 3) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +inline uint32_t XM_CALLCONV XMVector2GreaterOrEqualR +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + uint32_t CR = 0; + if ((V1.vector4_f32[0] >= V2.vector4_f32[0]) && + (V1.vector4_f32[1] >= V2.vector4_f32[1])) + { + CR = XM_CRMASK_CR6TRUE; + } + else if ((V1.vector4_f32[0] < V2.vector4_f32[0]) && + (V1.vector4_f32[1] < V2.vector4_f32[1])) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vTemp = vcge_f32(vget_low_f32(V1), vget_low_f32(V2)); + uint64_t r = vget_lane_u64(vreinterpret_u64_u32(vTemp), 0); + uint32_t CR = 0; + if (r == 0xFFFFFFFFFFFFFFFFU) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!r) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); + int iTest = _mm_movemask_ps(vTemp) & 3; + uint32_t CR = 0; + if (iTest == 3) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!iTest) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector2Less +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_f32[0] < V2.vector4_f32[0]) && (V1.vector4_f32[1] < V2.vector4_f32[1])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vTemp = vclt_f32(vget_low_f32(V1), vget_low_f32(V2)); + return (vget_lane_u64(vreinterpret_u64_u32(vTemp), 0) == 0xFFFFFFFFFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmplt_ps(V1, V2); + return (((_mm_movemask_ps(vTemp) & 3) == 3) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector2LessOrEqual +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_f32[0] <= V2.vector4_f32[0]) && (V1.vector4_f32[1] <= V2.vector4_f32[1])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vTemp = vcle_f32(vget_low_f32(V1), vget_low_f32(V2)); + return (vget_lane_u64(vreinterpret_u64_u32(vTemp), 0) == 0xFFFFFFFFFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmple_ps(V1, V2); + return (((_mm_movemask_ps(vTemp) & 3) == 3) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector2InBounds +( + FXMVECTOR V, + FXMVECTOR Bounds +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V.vector4_f32[0] <= Bounds.vector4_f32[0] && V.vector4_f32[0] >= -Bounds.vector4_f32[0]) && + (V.vector4_f32[1] <= Bounds.vector4_f32[1] && V.vector4_f32[1] >= -Bounds.vector4_f32[1])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t VL = vget_low_f32(V); + float32x2_t B = vget_low_f32(Bounds); + // Test if less than or equal + uint32x2_t ivTemp1 = vcle_f32(VL, B); + // Negate the bounds + float32x2_t vTemp2 = vneg_f32(B); + // Test if greater or equal (Reversed) + uint32x2_t ivTemp2 = vcle_f32(vTemp2, VL); + // Blend answers + ivTemp1 = vand_u32(ivTemp1, ivTemp2); + // x and y in bounds? + return (vget_lane_u64(vreinterpret_u64_u32(ivTemp1), 0) == 0xFFFFFFFFFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + // Test if less than or equal + XMVECTOR vTemp1 = _mm_cmple_ps(V, Bounds); + // Negate the bounds + XMVECTOR vTemp2 = _mm_mul_ps(Bounds, g_XMNegativeOne); + // Test if greater or equal (Reversed) + vTemp2 = _mm_cmple_ps(vTemp2, V); + // Blend answers + vTemp1 = _mm_and_ps(vTemp1, vTemp2); + // x and y in bounds? (z and w are don't care) + return (((_mm_movemask_ps(vTemp1) & 0x3) == 0x3) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) +#pragma float_control(push) +#pragma float_control(precise, on) +#endif + +inline bool XM_CALLCONV XMVector2IsNaN(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (XMISNAN(V.vector4_f32[0]) || + XMISNAN(V.vector4_f32[1])); +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(__clang__) && defined(__FINITE_MATH_ONLY__) + return isnan(vgetq_lane_f32(V, 0)) || isnan(vgetq_lane_f32(V, 1)); +#else + float32x2_t VL = vget_low_f32(V); + // Test against itself. NaN is always not equal + uint32x2_t vTempNan = vceq_f32(VL, VL); + // If x or y are NaN, the mask is zero + return (vget_lane_u64(vreinterpret_u64_u32(vTempNan), 0) != 0xFFFFFFFFFFFFFFFFU); +#endif +#elif defined(_XM_SSE_INTRINSICS_) +#if defined(__clang__) && defined(__FINITE_MATH_ONLY__) + XM_ALIGNED_DATA(16) float tmp[4]; + _mm_store_ps(tmp, V); + return isnan(tmp[0]) || isnan(tmp[1]); +#else +// Test against itself. NaN is always not equal + XMVECTOR vTempNan = _mm_cmpneq_ps(V, V); + // If x or y are NaN, the mask is non-zero + return ((_mm_movemask_ps(vTempNan) & 3) != 0); +#endif +#endif +} + +#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) +#pragma float_control(pop) +#endif + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector2IsInfinite(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + return (XMISINF(V.vector4_f32[0]) || + XMISINF(V.vector4_f32[1])); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Mask off the sign bit + uint32x2_t vTemp = vand_u32(vget_low_u32(vreinterpretq_u32_f32(V)), vget_low_u32(g_XMAbsMask)); + // Compare to infinity + vTemp = vceq_f32(vreinterpret_f32_u32(vTemp), vget_low_f32(g_XMInfinity)); + // If any are infinity, the signs are true. + return vget_lane_u64(vreinterpret_u64_u32(vTemp), 0) != 0; +#elif defined(_XM_SSE_INTRINSICS_) + // Mask off the sign bit + __m128 vTemp = _mm_and_ps(V, g_XMAbsMask); + // Compare to infinity + vTemp = _mm_cmpeq_ps(vTemp, g_XMInfinity); + // If x or z are infinity, the signs are true. + return ((_mm_movemask_ps(vTemp) & 3) != 0); +#endif +} + +//------------------------------------------------------------------------------ +// Computation operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2Dot +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORF32 Result; + Result.f[0] = + Result.f[1] = + Result.f[2] = + Result.f[3] = V1.vector4_f32[0] * V2.vector4_f32[0] + V1.vector4_f32[1] * V2.vector4_f32[1]; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Perform the dot product on x and y + float32x2_t vTemp = vmul_f32(vget_low_f32(V1), vget_low_f32(V2)); + vTemp = vpadd_f32(vTemp, vTemp); + return vcombine_f32(vTemp, vTemp); +#elif defined(_XM_SSE4_INTRINSICS_) + return _mm_dp_ps(V1, V2, 0x3f); +#elif defined(_XM_SSE3_INTRINSICS_) + XMVECTOR vDot = _mm_mul_ps(V1, V2); + vDot = _mm_hadd_ps(vDot, vDot); + vDot = _mm_moveldup_ps(vDot); + return vDot; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product on x and y + XMVECTOR vLengthSq = _mm_mul_ps(V1, V2); + // vTemp has y splatted + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 1, 1, 1)); + // x+y + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + return vLengthSq; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2Cross +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ + // [ V1.x*V2.y - V1.y*V2.x, V1.x*V2.y - V1.y*V2.x ] + +#if defined(_XM_NO_INTRINSICS_) + float fCross = (V1.vector4_f32[0] * V2.vector4_f32[1]) - (V1.vector4_f32[1] * V2.vector4_f32[0]); + XMVECTORF32 vResult; + vResult.f[0] = + vResult.f[1] = + vResult.f[2] = + vResult.f[3] = fCross; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 Negate = { { { 1.f, -1.f, 0, 0 } } }; + + float32x2_t vTemp = vmul_f32(vget_low_f32(V1), vrev64_f32(vget_low_f32(V2))); + vTemp = vmul_f32(vTemp, vget_low_f32(Negate)); + vTemp = vpadd_f32(vTemp, vTemp); + return vcombine_f32(vTemp, vTemp); +#elif defined(_XM_SSE_INTRINSICS_) + // Swap x and y + XMVECTOR vResult = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 1, 0, 1)); + // Perform the muls + vResult = _mm_mul_ps(vResult, V1); + // Splat y + XMVECTOR vTemp = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(1, 1, 1, 1)); + // Sub the values + vResult = _mm_sub_ss(vResult, vTemp); + // Splat the cross product + vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(0, 0, 0, 0)); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2LengthSq(FXMVECTOR V) noexcept +{ + return XMVector2Dot(V, V); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2ReciprocalLengthEst(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Result; + Result = XMVector2LengthSq(V); + Result = XMVectorReciprocalSqrtEst(Result); + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t VL = vget_low_f32(V); + // Dot2 + float32x2_t vTemp = vmul_f32(VL, VL); + vTemp = vpadd_f32(vTemp, vTemp); + // Reciprocal sqrt (estimate) + vTemp = vrsqrte_f32(vTemp); + return vcombine_f32(vTemp, vTemp); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); + return _mm_rsqrt_ps(vTemp); +#elif defined(_XM_SSE3_INTRINSICS_) + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + XMVECTOR vTemp = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_rsqrt_ss(vTemp); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + return vLengthSq; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product on x and y + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + // vTemp has y splatted + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 1, 1, 1)); + // x+y + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + vLengthSq = _mm_rsqrt_ss(vLengthSq); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + return vLengthSq; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2ReciprocalLength(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Result; + Result = XMVector2LengthSq(V); + Result = XMVectorReciprocalSqrt(Result); + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t VL = vget_low_f32(V); + // Dot2 + float32x2_t vTemp = vmul_f32(VL, VL); + vTemp = vpadd_f32(vTemp, vTemp); + // Reciprocal sqrt + float32x2_t S0 = vrsqrte_f32(vTemp); + float32x2_t P0 = vmul_f32(vTemp, S0); + float32x2_t R0 = vrsqrts_f32(P0, S0); + float32x2_t S1 = vmul_f32(S0, R0); + float32x2_t P1 = vmul_f32(vTemp, S1); + float32x2_t R1 = vrsqrts_f32(P1, S1); + float32x2_t Result = vmul_f32(S1, R1); + return vcombine_f32(Result, Result); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); + XMVECTOR vLengthSq = _mm_sqrt_ps(vTemp); + return _mm_div_ps(g_XMOne, vLengthSq); +#elif defined(_XM_SSE3_INTRINSICS_) + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + XMVECTOR vTemp = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_sqrt_ss(vTemp); + vLengthSq = _mm_div_ss(g_XMOne, vLengthSq); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + return vLengthSq; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product on x and y + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + // vTemp has y splatted + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 1, 1, 1)); + // x+y + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + vLengthSq = _mm_sqrt_ss(vLengthSq); + vLengthSq = _mm_div_ss(g_XMOne, vLengthSq); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + return vLengthSq; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2LengthEst(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Result; + Result = XMVector2LengthSq(V); + Result = XMVectorSqrtEst(Result); + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t VL = vget_low_f32(V); + // Dot2 + float32x2_t vTemp = vmul_f32(VL, VL); + vTemp = vpadd_f32(vTemp, vTemp); + const float32x2_t zero = vdup_n_f32(0); + uint32x2_t VEqualsZero = vceq_f32(vTemp, zero); + // Sqrt (estimate) + float32x2_t Result = vrsqrte_f32(vTemp); + Result = vmul_f32(vTemp, Result); + Result = vbsl_f32(VEqualsZero, zero, Result); + return vcombine_f32(Result, Result); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); + return _mm_sqrt_ps(vTemp); +#elif defined(_XM_SSE3_INTRINSICS_) + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + XMVECTOR vTemp = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_sqrt_ss(vTemp); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + return vLengthSq; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product on x and y + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + // vTemp has y splatted + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 1, 1, 1)); + // x+y + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + vLengthSq = _mm_sqrt_ss(vLengthSq); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + return vLengthSq; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2Length(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Result; + Result = XMVector2LengthSq(V); + Result = XMVectorSqrt(Result); + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t VL = vget_low_f32(V); + // Dot2 + float32x2_t vTemp = vmul_f32(VL, VL); + vTemp = vpadd_f32(vTemp, vTemp); + const float32x2_t zero = vdup_n_f32(0); + uint32x2_t VEqualsZero = vceq_f32(vTemp, zero); + // Sqrt + float32x2_t S0 = vrsqrte_f32(vTemp); + float32x2_t P0 = vmul_f32(vTemp, S0); + float32x2_t R0 = vrsqrts_f32(P0, S0); + float32x2_t S1 = vmul_f32(S0, R0); + float32x2_t P1 = vmul_f32(vTemp, S1); + float32x2_t R1 = vrsqrts_f32(P1, S1); + float32x2_t Result = vmul_f32(S1, R1); + Result = vmul_f32(vTemp, Result); + Result = vbsl_f32(VEqualsZero, zero, Result); + return vcombine_f32(Result, Result); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); + return _mm_sqrt_ps(vTemp); +#elif defined(_XM_SSE3_INTRINSICS_) + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + XMVECTOR vTemp = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_sqrt_ss(vTemp); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + return vLengthSq; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product on x and y + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + // vTemp has y splatted + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 1, 1, 1)); + // x+y + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + vLengthSq = _mm_sqrt_ps(vLengthSq); + return vLengthSq; +#endif +} + +//------------------------------------------------------------------------------ +// XMVector2NormalizeEst uses a reciprocal estimate and +// returns QNaN on zero and infinite vectors. + +inline XMVECTOR XM_CALLCONV XMVector2NormalizeEst(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Result; + Result = XMVector2ReciprocalLength(V); + Result = XMVectorMultiply(V, Result); + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t VL = vget_low_f32(V); + // Dot2 + float32x2_t vTemp = vmul_f32(VL, VL); + vTemp = vpadd_f32(vTemp, vTemp); + // Reciprocal sqrt (estimate) + vTemp = vrsqrte_f32(vTemp); + // Normalize + float32x2_t Result = vmul_f32(VL, vTemp); + return vcombine_f32(Result, Result); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vTemp = _mm_dp_ps(V, V, 0x3f); + XMVECTOR vResult = _mm_rsqrt_ps(vTemp); + return _mm_mul_ps(vResult, V); +#elif defined(_XM_SSE3_INTRINSICS_) + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_rsqrt_ss(vLengthSq); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + vLengthSq = _mm_mul_ps(vLengthSq, V); + return vLengthSq; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product on x and y + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + // vTemp has y splatted + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 1, 1, 1)); + // x+y + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + vLengthSq = _mm_rsqrt_ss(vLengthSq); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + vLengthSq = _mm_mul_ps(vLengthSq, V); + return vLengthSq; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2Normalize(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR vResult = XMVector2Length(V); + float fLength = vResult.vector4_f32[0]; + + // Prevent divide by zero + if (fLength > 0) + { + fLength = 1.0f / fLength; + } + + vResult.vector4_f32[0] = V.vector4_f32[0] * fLength; + vResult.vector4_f32[1] = V.vector4_f32[1] * fLength; + vResult.vector4_f32[2] = V.vector4_f32[2] * fLength; + vResult.vector4_f32[3] = V.vector4_f32[3] * fLength; + return vResult; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t VL = vget_low_f32(V); + // Dot2 + float32x2_t vTemp = vmul_f32(VL, VL); + vTemp = vpadd_f32(vTemp, vTemp); + uint32x2_t VEqualsZero = vceq_f32(vTemp, vdup_n_f32(0)); + uint32x2_t VEqualsInf = vceq_f32(vTemp, vget_low_f32(g_XMInfinity)); + // Reciprocal sqrt (2 iterations of Newton-Raphson) + float32x2_t S0 = vrsqrte_f32(vTemp); + float32x2_t P0 = vmul_f32(vTemp, S0); + float32x2_t R0 = vrsqrts_f32(P0, S0); + float32x2_t S1 = vmul_f32(S0, R0); + float32x2_t P1 = vmul_f32(vTemp, S1); + float32x2_t R1 = vrsqrts_f32(P1, S1); + vTemp = vmul_f32(S1, R1); + // Normalize + float32x2_t Result = vmul_f32(VL, vTemp); + Result = vbsl_f32(VEqualsZero, vdup_n_f32(0), Result); + Result = vbsl_f32(VEqualsInf, vget_low_f32(g_XMQNaN), Result); + return vcombine_f32(Result, Result); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vLengthSq = _mm_dp_ps(V, V, 0x3f); + // Prepare for the division + XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); + // Create zero with a single instruction + XMVECTOR vZeroMask = _mm_setzero_ps(); + // Test for a divide by zero (Must be FP to detect -0.0) + vZeroMask = _mm_cmpneq_ps(vZeroMask, vResult); + // Failsafe on zero (Or epsilon) length planes + // If the length is infinity, set the elements to zero + vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); + // Reciprocal mul to perform the normalization + vResult = _mm_div_ps(V, vResult); + // Any that are infinity, set to zero + vResult = _mm_and_ps(vResult, vZeroMask); + // Select qnan or result based on infinite length + XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); + XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); + vResult = _mm_or_ps(vTemp1, vTemp2); + return vResult; +#elif defined(_XM_SSE3_INTRINSICS_) + // Perform the dot product on x and y only + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_moveldup_ps(vLengthSq); + // Prepare for the division + XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); + // Create zero with a single instruction + XMVECTOR vZeroMask = _mm_setzero_ps(); + // Test for a divide by zero (Must be FP to detect -0.0) + vZeroMask = _mm_cmpneq_ps(vZeroMask, vResult); + // Failsafe on zero (Or epsilon) length planes + // If the length is infinity, set the elements to zero + vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); + // Reciprocal mul to perform the normalization + vResult = _mm_div_ps(V, vResult); + // Any that are infinity, set to zero + vResult = _mm_and_ps(vResult, vZeroMask); + // Select qnan or result based on infinite length + XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); + XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); + vResult = _mm_or_ps(vTemp1, vTemp2); + return vResult; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product on x and y only + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 1, 1, 1)); + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + // Prepare for the division + XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); + // Create zero with a single instruction + XMVECTOR vZeroMask = _mm_setzero_ps(); + // Test for a divide by zero (Must be FP to detect -0.0) + vZeroMask = _mm_cmpneq_ps(vZeroMask, vResult); + // Failsafe on zero (Or epsilon) length planes + // If the length is infinity, set the elements to zero + vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); + // Reciprocal mul to perform the normalization + vResult = _mm_div_ps(V, vResult); + // Any that are infinity, set to zero + vResult = _mm_and_ps(vResult, vZeroMask); + // Select qnan or result based on infinite length + XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); + XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); + vResult = _mm_or_ps(vTemp1, vTemp2); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2ClampLength +( + FXMVECTOR V, + float LengthMin, + float LengthMax +) noexcept +{ + XMVECTOR ClampMax = XMVectorReplicate(LengthMax); + XMVECTOR ClampMin = XMVectorReplicate(LengthMin); + return XMVector2ClampLengthV(V, ClampMin, ClampMax); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2ClampLengthV +( + FXMVECTOR V, + FXMVECTOR LengthMin, + FXMVECTOR LengthMax +) noexcept +{ + assert((XMVectorGetY(LengthMin) == XMVectorGetX(LengthMin))); + assert((XMVectorGetY(LengthMax) == XMVectorGetX(LengthMax))); + assert(XMVector2GreaterOrEqual(LengthMin, g_XMZero)); + assert(XMVector2GreaterOrEqual(LengthMax, g_XMZero)); + assert(XMVector2GreaterOrEqual(LengthMax, LengthMin)); + + XMVECTOR LengthSq = XMVector2LengthSq(V); + + const XMVECTOR Zero = XMVectorZero(); + + XMVECTOR RcpLength = XMVectorReciprocalSqrt(LengthSq); + + XMVECTOR InfiniteLength = XMVectorEqualInt(LengthSq, g_XMInfinity.v); + XMVECTOR ZeroLength = XMVectorEqual(LengthSq, Zero); + + XMVECTOR Length = XMVectorMultiply(LengthSq, RcpLength); + + XMVECTOR Normal = XMVectorMultiply(V, RcpLength); + + XMVECTOR Select = XMVectorEqualInt(InfiniteLength, ZeroLength); + Length = XMVectorSelect(LengthSq, Length, Select); + Normal = XMVectorSelect(LengthSq, Normal, Select); + + XMVECTOR ControlMax = XMVectorGreater(Length, LengthMax); + XMVECTOR ControlMin = XMVectorLess(Length, LengthMin); + + XMVECTOR ClampLength = XMVectorSelect(Length, LengthMax, ControlMax); + ClampLength = XMVectorSelect(ClampLength, LengthMin, ControlMin); + + XMVECTOR Result = XMVectorMultiply(Normal, ClampLength); + + // Preserve the original vector (with no precision loss) if the length falls within the given range + XMVECTOR Control = XMVectorEqualInt(ControlMax, ControlMin); + Result = XMVectorSelect(Result, V, Control); + + return Result; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2Reflect +( + FXMVECTOR Incident, + FXMVECTOR Normal +) noexcept +{ + // Result = Incident - (2 * dot(Incident, Normal)) * Normal + + XMVECTOR Result; + Result = XMVector2Dot(Incident, Normal); + Result = XMVectorAdd(Result, Result); + Result = XMVectorNegativeMultiplySubtract(Result, Normal, Incident); + return Result; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2Refract +( + FXMVECTOR Incident, + FXMVECTOR Normal, + float RefractionIndex +) noexcept +{ + XMVECTOR Index = XMVectorReplicate(RefractionIndex); + return XMVector2RefractV(Incident, Normal, Index); +} + +//------------------------------------------------------------------------------ + +// Return the refraction of a 2D vector +inline XMVECTOR XM_CALLCONV XMVector2RefractV +( + FXMVECTOR Incident, + FXMVECTOR Normal, + FXMVECTOR RefractionIndex +) noexcept +{ + // Result = RefractionIndex * Incident - Normal * (RefractionIndex * dot(Incident, Normal) + + // sqrt(1 - RefractionIndex * RefractionIndex * (1 - dot(Incident, Normal) * dot(Incident, Normal)))) + +#if defined(_XM_NO_INTRINSICS_) + + float IDotN = (Incident.vector4_f32[0] * Normal.vector4_f32[0]) + (Incident.vector4_f32[1] * Normal.vector4_f32[1]); + // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) + float RY = 1.0f - (IDotN * IDotN); + float RX = 1.0f - (RY * RefractionIndex.vector4_f32[0] * RefractionIndex.vector4_f32[0]); + RY = 1.0f - (RY * RefractionIndex.vector4_f32[1] * RefractionIndex.vector4_f32[1]); + if (RX >= 0.0f) + { + RX = (RefractionIndex.vector4_f32[0] * Incident.vector4_f32[0]) - (Normal.vector4_f32[0] * ((RefractionIndex.vector4_f32[0] * IDotN) + sqrtf(RX))); + } + else + { + RX = 0.0f; + } + if (RY >= 0.0f) + { + RY = (RefractionIndex.vector4_f32[1] * Incident.vector4_f32[1]) - (Normal.vector4_f32[1] * ((RefractionIndex.vector4_f32[1] * IDotN) + sqrtf(RY))); + } + else + { + RY = 0.0f; + } + + XMVECTOR vResult; + vResult.vector4_f32[0] = RX; + vResult.vector4_f32[1] = RY; + vResult.vector4_f32[2] = 0.0f; + vResult.vector4_f32[3] = 0.0f; + return vResult; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t IL = vget_low_f32(Incident); + float32x2_t NL = vget_low_f32(Normal); + float32x2_t RIL = vget_low_f32(RefractionIndex); + // Get the 2D Dot product of Incident-Normal + float32x2_t vTemp = vmul_f32(IL, NL); + float32x2_t IDotN = vpadd_f32(vTemp, vTemp); + // vTemp = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) + vTemp = vmls_f32(vget_low_f32(g_XMOne), IDotN, IDotN); + vTemp = vmul_f32(vTemp, RIL); + vTemp = vmls_f32(vget_low_f32(g_XMOne), vTemp, RIL); + // If any terms are <=0, sqrt() will fail, punt to zero + uint32x2_t vMask = vcgt_f32(vTemp, vget_low_f32(g_XMZero)); + // Sqrt(vTemp) + float32x2_t S0 = vrsqrte_f32(vTemp); + float32x2_t P0 = vmul_f32(vTemp, S0); + float32x2_t R0 = vrsqrts_f32(P0, S0); + float32x2_t S1 = vmul_f32(S0, R0); + float32x2_t P1 = vmul_f32(vTemp, S1); + float32x2_t R1 = vrsqrts_f32(P1, S1); + float32x2_t S2 = vmul_f32(S1, R1); + vTemp = vmul_f32(vTemp, S2); + // R = RefractionIndex * IDotN + sqrt(R) + vTemp = vmla_f32(vTemp, RIL, IDotN); + // Result = RefractionIndex * Incident - Normal * R + float32x2_t vResult = vmul_f32(RIL, IL); + vResult = vmls_f32(vResult, vTemp, NL); + vResult = vreinterpret_f32_u32(vand_u32(vreinterpret_u32_f32(vResult), vMask)); + return vcombine_f32(vResult, vResult); +#elif defined(_XM_SSE_INTRINSICS_) + // Result = RefractionIndex * Incident - Normal * (RefractionIndex * dot(Incident, Normal) + + // sqrt(1 - RefractionIndex * RefractionIndex * (1 - dot(Incident, Normal) * dot(Incident, Normal)))) + // Get the 2D Dot product of Incident-Normal + XMVECTOR IDotN = XMVector2Dot(Incident, Normal); + // vTemp = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) + XMVECTOR vTemp = XM_FNMADD_PS(IDotN, IDotN, g_XMOne); + vTemp = _mm_mul_ps(vTemp, RefractionIndex); + vTemp = XM_FNMADD_PS(vTemp, RefractionIndex, g_XMOne); + // If any terms are <=0, sqrt() will fail, punt to zero + XMVECTOR vMask = _mm_cmpgt_ps(vTemp, g_XMZero); + // R = RefractionIndex * IDotN + sqrt(R) + vTemp = _mm_sqrt_ps(vTemp); + vTemp = XM_FMADD_PS(RefractionIndex, IDotN, vTemp); + // Result = RefractionIndex * Incident - Normal * R + XMVECTOR vResult = _mm_mul_ps(RefractionIndex, Incident); + vResult = XM_FNMADD_PS(vTemp, Normal, vResult); + vResult = _mm_and_ps(vResult, vMask); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2Orthogonal(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORF32 Result = { { { + -V.vector4_f32[1], + V.vector4_f32[0], + 0.f, + 0.f + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 Negate = { { { -1.f, 1.f, 0, 0 } } }; + const float32x2_t zero = vdup_n_f32(0); + + float32x2_t VL = vget_low_f32(V); + float32x2_t Result = vmul_f32(vrev64_f32(VL), vget_low_f32(Negate)); + return vcombine_f32(Result, zero); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 2, 0, 1)); + vResult = _mm_mul_ps(vResult, g_XMNegateX); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2AngleBetweenNormalsEst +( + FXMVECTOR N1, + FXMVECTOR N2 +) noexcept +{ + XMVECTOR Result = XMVector2Dot(N1, N2); + Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); + Result = XMVectorACosEst(Result); + return Result; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2AngleBetweenNormals +( + FXMVECTOR N1, + FXMVECTOR N2 +) noexcept +{ + XMVECTOR Result = XMVector2Dot(N1, N2); + Result = XMVectorClamp(Result, g_XMNegativeOne, g_XMOne); + Result = XMVectorACos(Result); + return Result; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2AngleBetweenVectors +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ + XMVECTOR L1 = XMVector2ReciprocalLength(V1); + XMVECTOR L2 = XMVector2ReciprocalLength(V2); + + XMVECTOR Dot = XMVector2Dot(V1, V2); + + L1 = XMVectorMultiply(L1, L2); + + XMVECTOR CosAngle = XMVectorMultiply(Dot, L1); + CosAngle = XMVectorClamp(CosAngle, g_XMNegativeOne.v, g_XMOne.v); + + return XMVectorACos(CosAngle); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2LinePointDistance +( + FXMVECTOR LinePoint1, + FXMVECTOR LinePoint2, + FXMVECTOR Point +) noexcept +{ + // Given a vector PointVector from LinePoint1 to Point and a vector + // LineVector from LinePoint1 to LinePoint2, the scaled distance + // PointProjectionScale from LinePoint1 to the perpendicular projection + // of PointVector onto the line is defined as: + // + // PointProjectionScale = dot(PointVector, LineVector) / LengthSq(LineVector) + + XMVECTOR PointVector = XMVectorSubtract(Point, LinePoint1); + XMVECTOR LineVector = XMVectorSubtract(LinePoint2, LinePoint1); + + XMVECTOR LengthSq = XMVector2LengthSq(LineVector); + + XMVECTOR PointProjectionScale = XMVector2Dot(PointVector, LineVector); + PointProjectionScale = XMVectorDivide(PointProjectionScale, LengthSq); + + XMVECTOR DistanceVector = XMVectorMultiply(LineVector, PointProjectionScale); + DistanceVector = XMVectorSubtract(PointVector, DistanceVector); + + return XMVector2Length(DistanceVector); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2IntersectLine +( + FXMVECTOR Line1Point1, + FXMVECTOR Line1Point2, + FXMVECTOR Line2Point1, + GXMVECTOR Line2Point2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) || defined(_XM_ARM_NEON_INTRINSICS_) + + XMVECTOR V1 = XMVectorSubtract(Line1Point2, Line1Point1); + XMVECTOR V2 = XMVectorSubtract(Line2Point2, Line2Point1); + XMVECTOR V3 = XMVectorSubtract(Line1Point1, Line2Point1); + + XMVECTOR C1 = XMVector2Cross(V1, V2); + XMVECTOR C2 = XMVector2Cross(V2, V3); + + XMVECTOR Result; + const XMVECTOR Zero = XMVectorZero(); + if (XMVector2NearEqual(C1, Zero, g_XMEpsilon.v)) + { + if (XMVector2NearEqual(C2, Zero, g_XMEpsilon.v)) + { + // Coincident + Result = g_XMInfinity.v; + } + else + { + // Parallel + Result = g_XMQNaN.v; + } + } + else + { + // Intersection point = Line1Point1 + V1 * (C2 / C1) + XMVECTOR Scale = XMVectorReciprocal(C1); + Scale = XMVectorMultiply(C2, Scale); + Result = XMVectorMultiplyAdd(V1, Scale, Line1Point1); + } + + return Result; + +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR V1 = _mm_sub_ps(Line1Point2, Line1Point1); + XMVECTOR V2 = _mm_sub_ps(Line2Point2, Line2Point1); + XMVECTOR V3 = _mm_sub_ps(Line1Point1, Line2Point1); + // Generate the cross products + XMVECTOR C1 = XMVector2Cross(V1, V2); + XMVECTOR C2 = XMVector2Cross(V2, V3); + // If C1 is not close to epsilon, use the calculated value + XMVECTOR vResultMask = _mm_setzero_ps(); + vResultMask = _mm_sub_ps(vResultMask, C1); + vResultMask = _mm_max_ps(vResultMask, C1); + // 0xFFFFFFFF if the calculated value is to be used + vResultMask = _mm_cmpgt_ps(vResultMask, g_XMEpsilon); + // If C1 is close to epsilon, which fail type is it? INFINITY or NAN? + XMVECTOR vFailMask = _mm_setzero_ps(); + vFailMask = _mm_sub_ps(vFailMask, C2); + vFailMask = _mm_max_ps(vFailMask, C2); + vFailMask = _mm_cmple_ps(vFailMask, g_XMEpsilon); + XMVECTOR vFail = _mm_and_ps(vFailMask, g_XMInfinity); + vFailMask = _mm_andnot_ps(vFailMask, g_XMQNaN); + // vFail is NAN or INF + vFail = _mm_or_ps(vFail, vFailMask); + // Intersection point = Line1Point1 + V1 * (C2 / C1) + XMVECTOR vResult = _mm_div_ps(C2, C1); + vResult = XM_FMADD_PS(vResult, V1, Line1Point1); + // Use result, or failure value + vResult = _mm_and_ps(vResult, vResultMask); + vResultMask = _mm_andnot_ps(vResultMask, vFail); + vResult = _mm_or_ps(vResult, vResultMask); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2Transform +( + FXMVECTOR V, + FXMMATRIX M +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Y = XMVectorSplatY(V); + XMVECTOR X = XMVectorSplatX(V); + + XMVECTOR Result = XMVectorMultiplyAdd(Y, M.r[1], M.r[3]); + Result = XMVectorMultiplyAdd(X, M.r[0], Result); + + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t VL = vget_low_f32(V); + float32x4_t Result = vmlaq_lane_f32(M.r[3], M.r[1], VL, 1); // Y + return vmlaq_lane_f32(Result, M.r[0], VL, 0); // X +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = XM_FMADD_PS(vResult, M.r[1], M.r[3]); + XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +_Use_decl_annotations_ +inline XMFLOAT4* XM_CALLCONV XMVector2TransformStream +( + XMFLOAT4* pOutputStream, + size_t OutputStride, + const XMFLOAT2* pInputStream, + size_t InputStride, + size_t VectorCount, + FXMMATRIX M +) noexcept +{ + assert(pOutputStream != nullptr); + assert(pInputStream != nullptr); + + assert(InputStride >= sizeof(XMFLOAT2)); + _Analysis_assume_(InputStride >= sizeof(XMFLOAT2)); + + assert(OutputStride >= sizeof(XMFLOAT4)); + _Analysis_assume_(OutputStride >= sizeof(XMFLOAT4)); + +#if defined(_XM_NO_INTRINSICS_) + + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row3 = M.r[3]; + + for (size_t i = 0; i < VectorCount; i++) + { + XMVECTOR V = XMLoadFloat2(reinterpret_cast(pInputVector)); + XMVECTOR Y = XMVectorSplatY(V); + XMVECTOR X = XMVectorSplatX(V); + + XMVECTOR Result = XMVectorMultiplyAdd(Y, row1, row3); + Result = XMVectorMultiplyAdd(X, row0, Result); + + #ifdef _PREFAST_ + #pragma prefast(push) + #pragma prefast(disable : 26015, "PREfast noise: Esp:1307" ) + #endif + + XMStoreFloat4(reinterpret_cast(pOutputVector), Result); + + #ifdef _PREFAST_ + #pragma prefast(pop) + #endif + + pInputVector += InputStride; + pOutputVector += OutputStride; + } + + return pOutputStream; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row3 = M.r[3]; + + size_t i = 0; + size_t four = VectorCount >> 2; + if (four > 0) + { + if ((InputStride == sizeof(XMFLOAT2)) && (OutputStride == sizeof(XMFLOAT4))) + { + for (size_t j = 0; j < four; ++j) + { + float32x4x2_t V = vld2q_f32(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 4; + + float32x2_t r3 = vget_low_f32(row3); + float32x2_t r = vget_low_f32(row0); + XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M + XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N + + XM_PREFETCH(pInputVector); + + r3 = vget_high_f32(row3); + r = vget_high_f32(row0); + XMVECTOR vResult2 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Cx+O + XMVECTOR vResult3 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Dx+P + + XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); + + r = vget_low_f32(row1); + vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey+M + vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy+N + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); + + r = vget_high_f32(row1); + vResult2 = vmlaq_lane_f32(vResult2, V.val[1], r, 0); // Cx+Gy+O + vResult3 = vmlaq_lane_f32(vResult3, V.val[1], r, 1); // Dx+Hy+P + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); + + float32x4x4_t R; + R.val[0] = vResult0; + R.val[1] = vResult1; + R.val[2] = vResult2; + R.val[3] = vResult3; + + vst4q_f32(reinterpret_cast(pOutputVector), R); + pOutputVector += sizeof(XMFLOAT4) * 4; + + i += 4; + } + } + } + + for (; i < VectorCount; i++) + { + float32x2_t V = vld1_f32(reinterpret_cast(pInputVector)); + pInputVector += InputStride; + + XMVECTOR vResult = vmlaq_lane_f32(row3, row0, V, 0); // X + vResult = vmlaq_lane_f32(vResult, row1, V, 1); // Y + + vst1q_f32(reinterpret_cast(pOutputVector), vResult); + pOutputVector += OutputStride; + } + + return pOutputStream; +#elif defined(_XM_AVX2_INTRINSICS_) + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + size_t i = 0; + size_t four = VectorCount >> 2; + if (four > 0) + { + __m256 row0 = _mm256_broadcast_ps(&M.r[0]); + __m256 row1 = _mm256_broadcast_ps(&M.r[1]); + __m256 row3 = _mm256_broadcast_ps(&M.r[3]); + + if (InputStride == sizeof(XMFLOAT2)) + { + if (OutputStride == sizeof(XMFLOAT4)) + { + if (!(reinterpret_cast(pOutputStream) & 0x1F)) + { + // Packed input, aligned & packed output + for (size_t j = 0; j < four; ++j) + { + __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 4; + + __m256 Y2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); + __m256 X2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); + __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); + __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); + + __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); + __m256 vTempB2 = _mm256_fmadd_ps(Y2, row1, row3); + __m256 vTempA = _mm256_mul_ps(X1, row0); + __m256 vTempA2 = _mm256_mul_ps(X2, row0); + vTempA = _mm256_add_ps(vTempA, vTempB); + vTempA2 = _mm256_add_ps(vTempA2, vTempB2); + + X1 = _mm256_insertf128_ps(vTempA, _mm256_castps256_ps128(vTempA2), 1); + XM256_STREAM_PS(reinterpret_cast(pOutputVector), X1); + pOutputVector += sizeof(XMFLOAT4) * 2; + + X2 = _mm256_insertf128_ps(vTempA2, _mm256_extractf128_ps(vTempA, 1), 0); + XM256_STREAM_PS(reinterpret_cast(pOutputVector), X2); + pOutputVector += sizeof(XMFLOAT4) * 2; + + i += 4; + } + } + else + { + // Packed input, packed output + for (size_t j = 0; j < four; ++j) + { + __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 4; + + __m256 Y2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); + __m256 X2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); + __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); + __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); + + __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); + __m256 vTempB2 = _mm256_fmadd_ps(Y2, row1, row3); + __m256 vTempA = _mm256_mul_ps(X1, row0); + __m256 vTempA2 = _mm256_mul_ps(X2, row0); + vTempA = _mm256_add_ps(vTempA, vTempB); + vTempA2 = _mm256_add_ps(vTempA2, vTempB2); + + X1 = _mm256_insertf128_ps(vTempA, _mm256_castps256_ps128(vTempA2), 1); + _mm256_storeu_ps(reinterpret_cast(pOutputVector), X1); + pOutputVector += sizeof(XMFLOAT4) * 2; + + X2 = _mm256_insertf128_ps(vTempA2, _mm256_extractf128_ps(vTempA, 1), 0); + _mm256_storeu_ps(reinterpret_cast(pOutputVector), X2); + pOutputVector += sizeof(XMFLOAT4) * 2; + + i += 4; + } + } + } + else + { + // Packed input, unpacked output + for (size_t j = 0; j < four; ++j) + { + __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 4; + + __m256 Y2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); + __m256 X2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); + __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); + __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); + + __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); + __m256 vTempB2 = _mm256_fmadd_ps(Y2, row1, row3); + __m256 vTempA = _mm256_mul_ps(X1, row0); + __m256 vTempA2 = _mm256_mul_ps(X2, row0); + vTempA = _mm256_add_ps(vTempA, vTempB); + vTempA2 = _mm256_add_ps(vTempA2, vTempB2); + + _mm_storeu_ps(reinterpret_cast(pOutputVector), _mm256_castps256_ps128(vTempA)); + pOutputVector += OutputStride; + + _mm_storeu_ps(reinterpret_cast(pOutputVector), _mm256_castps256_ps128(vTempA2)); + pOutputVector += OutputStride; + + _mm_storeu_ps(reinterpret_cast(pOutputVector), _mm256_extractf128_ps(vTempA, 1)); + pOutputVector += OutputStride; + + _mm_storeu_ps(reinterpret_cast(pOutputVector), _mm256_extractf128_ps(vTempA2, 1)); + pOutputVector += OutputStride; + + i += 4; + } + } + } + } + + if (i < VectorCount) + { + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row3 = M.r[3]; + + for (; i < VectorCount; i++) + { + __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pInputVector))); + pInputVector += InputStride; + + XMVECTOR Y = XM_PERMUTE_PS(xy, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(xy, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp2 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + + _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + } + } + + XM_SFENCE(); + + return pOutputStream; +#elif defined(_XM_SSE_INTRINSICS_) + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row3 = M.r[3]; + + size_t i = 0; + size_t two = VectorCount >> 1; + if (two > 0) + { + if (InputStride == sizeof(XMFLOAT2)) + { + if (!(reinterpret_cast(pOutputStream) & 0xF) && !(OutputStride & 0xF)) + { + // Packed input, aligned output + for (size_t j = 0; j < two; ++j) + { + XMVECTOR V = _mm_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 2; + + XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp2 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + + XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); + X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + + vTemp = XM_FMADD_PS(Y, row1, row3); + vTemp2 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + + XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + i += 2; + } + } + else + { + // Packed input, unaligned output + for (size_t j = 0; j < two; ++j) + { + XMVECTOR V = _mm_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 2; + + XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp2 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + + _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); + X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + + vTemp = XM_FMADD_PS(Y, row1, row3); + vTemp2 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + + _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + i += 2; + } + } + } + } + + if (!(reinterpret_cast(pInputVector) & 0xF) && !(InputStride & 0xF)) + { + if (!(reinterpret_cast(pOutputStream) & 0xF) && !(OutputStride & 0xF)) + { + // Aligned input, aligned output + for (; i < VectorCount; i++) + { + XMVECTOR V = _mm_castsi128_ps(_mm_loadl_epi64(reinterpret_cast(pInputVector))); + pInputVector += InputStride; + + XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp2 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + + XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + } + } + else + { + // Aligned input, unaligned output + for (; i < VectorCount; i++) + { + XMVECTOR V = _mm_castsi128_ps(_mm_loadl_epi64(reinterpret_cast(pInputVector))); + pInputVector += InputStride; + + XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp2 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + + _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + } + } + } + else + { + // Unaligned input + for (; i < VectorCount; i++) + { + __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pInputVector))); + pInputVector += InputStride; + + XMVECTOR Y = XM_PERMUTE_PS(xy, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(xy, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp2 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + + _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + } + } + + XM_SFENCE(); + + return pOutputStream; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2TransformCoord +( + FXMVECTOR V, + FXMMATRIX M +) noexcept +{ + XMVECTOR Y = XMVectorSplatY(V); + XMVECTOR X = XMVectorSplatX(V); + + XMVECTOR Result = XMVectorMultiplyAdd(Y, M.r[1], M.r[3]); + Result = XMVectorMultiplyAdd(X, M.r[0], Result); + + XMVECTOR W = XMVectorSplatW(Result); + return XMVectorDivide(Result, W); +} + +//------------------------------------------------------------------------------ + +_Use_decl_annotations_ +inline XMFLOAT2* XM_CALLCONV XMVector2TransformCoordStream +( + XMFLOAT2* pOutputStream, + size_t OutputStride, + const XMFLOAT2* pInputStream, + size_t InputStride, + size_t VectorCount, + FXMMATRIX M +) noexcept +{ + assert(pOutputStream != nullptr); + assert(pInputStream != nullptr); + + assert(InputStride >= sizeof(XMFLOAT2)); + _Analysis_assume_(InputStride >= sizeof(XMFLOAT2)); + + assert(OutputStride >= sizeof(XMFLOAT2)); + _Analysis_assume_(OutputStride >= sizeof(XMFLOAT2)); + +#if defined(_XM_NO_INTRINSICS_) + + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row3 = M.r[3]; + + for (size_t i = 0; i < VectorCount; i++) + { + XMVECTOR V = XMLoadFloat2(reinterpret_cast(pInputVector)); + XMVECTOR Y = XMVectorSplatY(V); + XMVECTOR X = XMVectorSplatX(V); + + XMVECTOR Result = XMVectorMultiplyAdd(Y, row1, row3); + Result = XMVectorMultiplyAdd(X, row0, Result); + + XMVECTOR W = XMVectorSplatW(Result); + + Result = XMVectorDivide(Result, W); + + #ifdef _PREFAST_ + #pragma prefast(push) + #pragma prefast(disable : 26015, "PREfast noise: Esp:1307" ) + #endif + + XMStoreFloat2(reinterpret_cast(pOutputVector), Result); + + #ifdef _PREFAST_ + #pragma prefast(pop) + #endif + + pInputVector += InputStride; + pOutputVector += OutputStride; + } + + return pOutputStream; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row3 = M.r[3]; + + size_t i = 0; + size_t four = VectorCount >> 2; + if (four > 0) + { + if ((InputStride == sizeof(XMFLOAT2)) && (OutputStride == sizeof(XMFLOAT2))) + { + for (size_t j = 0; j < four; ++j) + { + float32x4x2_t V = vld2q_f32(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 4; + + float32x2_t r3 = vget_low_f32(row3); + float32x2_t r = vget_low_f32(row0); + XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M + XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N + + XM_PREFETCH(pInputVector); + + r3 = vget_high_f32(row3); + r = vget_high_f32(row0); + XMVECTOR W = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Dx+P + + XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); + + r = vget_low_f32(row1); + vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey+M + vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy+N + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); + + r = vget_high_f32(row1); + W = vmlaq_lane_f32(W, V.val[1], r, 1); // Dx+Hy+P + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); + + #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ + V.val[0] = vdivq_f32(vResult0, W); + V.val[1] = vdivq_f32(vResult1, W); + #else + // 2 iterations of Newton-Raphson refinement of reciprocal + float32x4_t Reciprocal = vrecpeq_f32(W); + float32x4_t S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + + V.val[0] = vmulq_f32(vResult0, Reciprocal); + V.val[1] = vmulq_f32(vResult1, Reciprocal); + #endif + + vst2q_f32(reinterpret_cast(pOutputVector), V); + pOutputVector += sizeof(XMFLOAT2) * 4; + + i += 4; + } + } + } + + for (; i < VectorCount; i++) + { + float32x2_t V = vld1_f32(reinterpret_cast(pInputVector)); + pInputVector += InputStride; + + XMVECTOR vResult = vmlaq_lane_f32(row3, row0, V, 0); // X + vResult = vmlaq_lane_f32(vResult, row1, V, 1); // Y + + V = vget_high_f32(vResult); + float32x2_t W = vdup_lane_f32(V, 1); + + #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ + V = vget_low_f32(vResult); + V = vdiv_f32(V, W); + #else + // 2 iterations of Newton-Raphson refinement of reciprocal for W + float32x2_t Reciprocal = vrecpe_f32(W); + float32x2_t S = vrecps_f32(Reciprocal, W); + Reciprocal = vmul_f32(S, Reciprocal); + S = vrecps_f32(Reciprocal, W); + Reciprocal = vmul_f32(S, Reciprocal); + + V = vget_low_f32(vResult); + V = vmul_f32(V, Reciprocal); + #endif + + vst1_f32(reinterpret_cast(pOutputVector), V); + pOutputVector += OutputStride; + } + + return pOutputStream; +#elif defined(_XM_AVX2_INTRINSICS_) + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + size_t i = 0; + size_t four = VectorCount >> 2; + if (four > 0) + { + __m256 row0 = _mm256_broadcast_ps(&M.r[0]); + __m256 row1 = _mm256_broadcast_ps(&M.r[1]); + __m256 row3 = _mm256_broadcast_ps(&M.r[3]); + + if (InputStride == sizeof(XMFLOAT2)) + { + if (OutputStride == sizeof(XMFLOAT2)) + { + if (!(reinterpret_cast(pOutputStream) & 0x1F)) + { + // Packed input, aligned & packed output + for (size_t j = 0; j < four; ++j) + { + __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 4; + + __m256 Y2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); + __m256 X2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); + __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); + __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); + + __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); + __m256 vTempB2 = _mm256_fmadd_ps(Y2, row1, row3); + __m256 vTempA = _mm256_mul_ps(X1, row0); + __m256 vTempA2 = _mm256_mul_ps(X2, row0); + vTempA = _mm256_add_ps(vTempA, vTempB); + vTempA2 = _mm256_add_ps(vTempA2, vTempB2); + + __m256 W = _mm256_shuffle_ps(vTempA, vTempA, _MM_SHUFFLE(3, 3, 3, 3)); + vTempA = _mm256_div_ps(vTempA, W); + + W = _mm256_shuffle_ps(vTempA2, vTempA2, _MM_SHUFFLE(3, 3, 3, 3)); + vTempA2 = _mm256_div_ps(vTempA2, W); + + X1 = _mm256_shuffle_ps(vTempA, vTempA2, 0x44); + XM256_STREAM_PS(reinterpret_cast(pOutputVector), X1); + pOutputVector += sizeof(XMFLOAT2) * 4; + + i += 4; + } + } + else + { + // Packed input, packed output + for (size_t j = 0; j < four; ++j) + { + __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 4; + + __m256 Y2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); + __m256 X2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); + __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); + __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); + + __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); + __m256 vTempB2 = _mm256_fmadd_ps(Y2, row1, row3); + __m256 vTempA = _mm256_mul_ps(X1, row0); + __m256 vTempA2 = _mm256_mul_ps(X2, row0); + vTempA = _mm256_add_ps(vTempA, vTempB); + vTempA2 = _mm256_add_ps(vTempA2, vTempB2); + + __m256 W = _mm256_shuffle_ps(vTempA, vTempA, _MM_SHUFFLE(3, 3, 3, 3)); + vTempA = _mm256_div_ps(vTempA, W); + + W = _mm256_shuffle_ps(vTempA2, vTempA2, _MM_SHUFFLE(3, 3, 3, 3)); + vTempA2 = _mm256_div_ps(vTempA2, W); + + X1 = _mm256_shuffle_ps(vTempA, vTempA2, 0x44); + _mm256_storeu_ps(reinterpret_cast(pOutputVector), X1); + pOutputVector += sizeof(XMFLOAT2) * 4; + + i += 4; + } + } + } + else + { + // Packed input, unpacked output + for (size_t j = 0; j < four; ++j) + { + __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 4; + + __m256 Y2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); + __m256 X2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); + __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); + __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); + + __m256 vTempB = _mm256_fmadd_ps(Y1, row1, row3); + __m256 vTempB2 = _mm256_fmadd_ps(Y2, row1, row3); + __m256 vTempA = _mm256_mul_ps(X1, row0); + __m256 vTempA2 = _mm256_mul_ps(X2, row0); + vTempA = _mm256_add_ps(vTempA, vTempB); + vTempA2 = _mm256_add_ps(vTempA2, vTempB2); + + __m256 W = _mm256_shuffle_ps(vTempA, vTempA, _MM_SHUFFLE(3, 3, 3, 3)); + vTempA = _mm256_div_ps(vTempA, W); + + W = _mm256_shuffle_ps(vTempA2, vTempA2, _MM_SHUFFLE(3, 3, 3, 3)); + vTempA2 = _mm256_div_ps(vTempA2, W); + + _mm_store_sd(reinterpret_cast(pOutputVector), + _mm_castps_pd(_mm256_castps256_ps128(vTempA))); + pOutputVector += OutputStride; + + _mm_store_sd(reinterpret_cast(pOutputVector), + _mm_castps_pd(_mm256_castps256_ps128(vTempA2))); + pOutputVector += OutputStride; + + _mm_store_sd(reinterpret_cast(pOutputVector), + _mm_castps_pd(_mm256_extractf128_ps(vTempA, 1))); + pOutputVector += OutputStride; + + _mm_store_sd(reinterpret_cast(pOutputVector), + _mm_castps_pd(_mm256_extractf128_ps(vTempA2, 1))); + pOutputVector += OutputStride; + + i += 4; + } + } + } + } + + if (i < VectorCount) + { + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row3 = M.r[3]; + + for (; i < VectorCount; i++) + { + __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pInputVector))); + pInputVector += InputStride; + + XMVECTOR Y = XM_PERMUTE_PS(xy, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(xy, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp2 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + + XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + vTemp = _mm_div_ps(vTemp, W); + + _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); + pOutputVector += OutputStride; + } + } + + XM_SFENCE(); + + return pOutputStream; +#elif defined(_XM_SSE_INTRINSICS_) + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row3 = M.r[3]; + + size_t i = 0; + size_t two = VectorCount >> 1; + if (two > 0) + { + if (InputStride == sizeof(XMFLOAT2)) + { + if (OutputStride == sizeof(XMFLOAT2)) + { + if (!(reinterpret_cast(pOutputStream) & 0xF)) + { + // Packed input, aligned & packed output + for (size_t j = 0; j < two; ++j) + { + XMVECTOR V = _mm_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 2; + + // Result 1 + XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp2 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + + XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + XMVECTOR V1 = _mm_div_ps(vTemp, W); + + // Result 2 + Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); + X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + + vTemp = XM_FMADD_PS(Y, row1, row3); + vTemp2 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + XMVECTOR V2 = _mm_div_ps(vTemp, W); + + vTemp = _mm_movelh_ps(V1, V2); + + XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += sizeof(XMFLOAT2) * 2; + + i += 2; + } + } + else + { + // Packed input, unaligned & packed output + for (size_t j = 0; j < two; ++j) + { + XMVECTOR V = _mm_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 2; + + // Result 1 + XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp2 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + + XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + XMVECTOR V1 = _mm_div_ps(vTemp, W); + + // Result 2 + Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); + X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + + vTemp = XM_FMADD_PS(Y, row1, row3); + vTemp2 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + XMVECTOR V2 = _mm_div_ps(vTemp, W); + + vTemp = _mm_movelh_ps(V1, V2); + + _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += sizeof(XMFLOAT2) * 2; + + i += 2; + } + } + } + else + { + // Packed input, unpacked output + for (size_t j = 0; j < two; ++j) + { + XMVECTOR V = _mm_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 2; + + // Result 1 + XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp2 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + + XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + vTemp = _mm_div_ps(vTemp, W); + + _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); + pOutputVector += OutputStride; + + // Result 2 + Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); + X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + + vTemp = XM_FMADD_PS(Y, row1, row3); + vTemp2 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + vTemp = _mm_div_ps(vTemp, W); + + _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); + pOutputVector += OutputStride; + + i += 2; + } + } + } + } + + if (!(reinterpret_cast(pInputVector) & 0xF) && !(InputStride & 0xF)) + { + // Aligned input + for (; i < VectorCount; i++) + { + XMVECTOR V = _mm_castsi128_ps(_mm_loadl_epi64(reinterpret_cast(pInputVector))); + pInputVector += InputStride; + + XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp2 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + + XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + vTemp = _mm_div_ps(vTemp, W); + + _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); + pOutputVector += OutputStride; + } + } + else + { + // Unaligned input + for (; i < VectorCount; i++) + { + __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pInputVector))); + pInputVector += InputStride; + + XMVECTOR Y = XM_PERMUTE_PS(xy, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(xy, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Y, row1, row3); + XMVECTOR vTemp2 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + + XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + vTemp = _mm_div_ps(vTemp, W); + + _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); + pOutputVector += OutputStride; + } + } + + XM_SFENCE(); + + return pOutputStream; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector2TransformNormal +( + FXMVECTOR V, + FXMMATRIX M +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Y = XMVectorSplatY(V); + XMVECTOR X = XMVectorSplatX(V); + + XMVECTOR Result = XMVectorMultiply(Y, M.r[1]); + Result = XMVectorMultiplyAdd(X, M.r[0], Result); + + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t VL = vget_low_f32(V); + float32x4_t Result = vmulq_lane_f32(M.r[1], VL, 1); // Y + return vmlaq_lane_f32(Result, M.r[0], VL, 0); // X +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = _mm_mul_ps(vResult, M.r[1]); + XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +_Use_decl_annotations_ +inline XMFLOAT2* XM_CALLCONV XMVector2TransformNormalStream +( + XMFLOAT2* pOutputStream, + size_t OutputStride, + const XMFLOAT2* pInputStream, + size_t InputStride, + size_t VectorCount, + FXMMATRIX M +) noexcept +{ + assert(pOutputStream != nullptr); + assert(pInputStream != nullptr); + + assert(InputStride >= sizeof(XMFLOAT2)); + _Analysis_assume_(InputStride >= sizeof(XMFLOAT2)); + + assert(OutputStride >= sizeof(XMFLOAT2)); + _Analysis_assume_(OutputStride >= sizeof(XMFLOAT2)); + +#if defined(_XM_NO_INTRINSICS_) + + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + + for (size_t i = 0; i < VectorCount; i++) + { + XMVECTOR V = XMLoadFloat2(reinterpret_cast(pInputVector)); + XMVECTOR Y = XMVectorSplatY(V); + XMVECTOR X = XMVectorSplatX(V); + + XMVECTOR Result = XMVectorMultiply(Y, row1); + Result = XMVectorMultiplyAdd(X, row0, Result); + + #ifdef _PREFAST_ + #pragma prefast(push) + #pragma prefast(disable : 26015, "PREfast noise: Esp:1307" ) + #endif + + XMStoreFloat2(reinterpret_cast(pOutputVector), Result); + + #ifdef _PREFAST_ + #pragma prefast(pop) + #endif + + pInputVector += InputStride; + pOutputVector += OutputStride; + } + + return pOutputStream; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + + size_t i = 0; + size_t four = VectorCount >> 2; + if (four > 0) + { + if ((InputStride == sizeof(XMFLOAT2)) && (OutputStride == sizeof(XMFLOAT2))) + { + for (size_t j = 0; j < four; ++j) + { + float32x4x2_t V = vld2q_f32(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 4; + + float32x2_t r = vget_low_f32(row0); + XMVECTOR vResult0 = vmulq_lane_f32(V.val[0], r, 0); // Ax + XMVECTOR vResult1 = vmulq_lane_f32(V.val[0], r, 1); // Bx + + XM_PREFETCH(pInputVector); + XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); + + r = vget_low_f32(row1); + vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey + vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); + + V.val[0] = vResult0; + V.val[1] = vResult1; + + vst2q_f32(reinterpret_cast(pOutputVector), V); + pOutputVector += sizeof(XMFLOAT2) * 4; + + i += 4; + } + } + } + + for (; i < VectorCount; i++) + { + float32x2_t V = vld1_f32(reinterpret_cast(pInputVector)); + pInputVector += InputStride; + + XMVECTOR vResult = vmulq_lane_f32(row0, V, 0); // X + vResult = vmlaq_lane_f32(vResult, row1, V, 1); // Y + + V = vget_low_f32(vResult); + vst1_f32(reinterpret_cast(pOutputVector), V); + pOutputVector += OutputStride; + } + + return pOutputStream; +#elif defined(_XM_AVX2_INTRINSICS_) + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + size_t i = 0; + size_t four = VectorCount >> 2; + if (four > 0) + { + __m256 row0 = _mm256_broadcast_ps(&M.r[0]); + __m256 row1 = _mm256_broadcast_ps(&M.r[1]); + + if (InputStride == sizeof(XMFLOAT2)) + { + if (OutputStride == sizeof(XMFLOAT2)) + { + if (!(reinterpret_cast(pOutputStream) & 0x1F)) + { + // Packed input, aligned & packed output + for (size_t j = 0; j < four; ++j) + { + __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 4; + + __m256 Y2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); + __m256 X2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); + __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); + __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); + + __m256 vTempA = _mm256_mul_ps(Y1, row1); + __m256 vTempB = _mm256_mul_ps(Y2, row1); + vTempA = _mm256_fmadd_ps(X1, row0, vTempA); + vTempB = _mm256_fmadd_ps(X2, row0, vTempB); + + X1 = _mm256_shuffle_ps(vTempA, vTempB, 0x44); + XM256_STREAM_PS(reinterpret_cast(pOutputVector), X1); + pOutputVector += sizeof(XMFLOAT2) * 4; + + i += 4; + } + } + else + { + // Packed input, packed output + for (size_t j = 0; j < four; ++j) + { + __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 4; + + __m256 Y2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); + __m256 X2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); + __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); + __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); + + __m256 vTempA = _mm256_mul_ps(Y1, row1); + __m256 vTempB = _mm256_mul_ps(Y2, row1); + vTempA = _mm256_fmadd_ps(X1, row0, vTempA); + vTempB = _mm256_fmadd_ps(X2, row0, vTempB); + + X1 = _mm256_shuffle_ps(vTempA, vTempB, 0x44); + _mm256_storeu_ps(reinterpret_cast(pOutputVector), X1); + pOutputVector += sizeof(XMFLOAT2) * 4; + + i += 4; + } + } + } + else + { + // Packed input, unpacked output + for (size_t j = 0; j < four; ++j) + { + __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 4; + + __m256 Y2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); + __m256 X2 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); + __m256 Y1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); + __m256 X1 = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); + + __m256 vTempA = _mm256_mul_ps(Y1, row1); + __m256 vTempB = _mm256_mul_ps(Y2, row1); + vTempA = _mm256_fmadd_ps(X1, row0, vTempA); + vTempB = _mm256_fmadd_ps(X2, row0, vTempB); + + _mm_store_sd(reinterpret_cast(pOutputVector), + _mm_castps_pd(_mm256_castps256_ps128(vTempA))); + pOutputVector += OutputStride; + + _mm_store_sd(reinterpret_cast(pOutputVector), + _mm_castps_pd(_mm256_castps256_ps128(vTempB))); + pOutputVector += OutputStride; + + _mm_store_sd(reinterpret_cast(pOutputVector), + _mm_castps_pd(_mm256_extractf128_ps(vTempA, 1))); + pOutputVector += OutputStride; + + _mm_store_sd(reinterpret_cast(pOutputVector), + _mm_castps_pd(_mm256_extractf128_ps(vTempB, 1))); + pOutputVector += OutputStride; + + i += 4; + } + } + } + } + + if (i < VectorCount) + { + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + + for (; i < VectorCount; i++) + { + __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pInputVector))); + pInputVector += InputStride; + + XMVECTOR Y = XM_PERMUTE_PS(xy, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(xy, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = _mm_mul_ps(Y, row1); + vTemp = XM_FMADD_PS(X, row0, vTemp); + + _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); + pOutputVector += OutputStride; + } + } + + XM_SFENCE(); + + return pOutputStream; +#elif defined(_XM_SSE_INTRINSICS_) + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + + size_t i = 0; + size_t two = VectorCount >> 1; + if (two > 0) + { + if (InputStride == sizeof(XMFLOAT2)) + { + if (OutputStride == sizeof(XMFLOAT2)) + { + if (!(reinterpret_cast(pOutputStream) & 0xF)) + { + // Packed input, aligned & packed output + for (size_t j = 0; j < two; ++j) + { + XMVECTOR V = _mm_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 2; + + // Result 1 + XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = _mm_mul_ps(Y, row1); + XMVECTOR V1 = XM_FMADD_PS(X, row0, vTemp); + + // Result 2 + Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); + X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + + vTemp = _mm_mul_ps(Y, row1); + XMVECTOR V2 = XM_FMADD_PS(X, row0, vTemp); + + vTemp = _mm_movelh_ps(V1, V2); + + XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += sizeof(XMFLOAT2) * 2; + + i += 2; + } + } + else + { + // Packed input, unaligned & packed output + for (size_t j = 0; j < two; ++j) + { + XMVECTOR V = _mm_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 2; + + // Result 1 + XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = _mm_mul_ps(Y, row1); + XMVECTOR V1 = XM_FMADD_PS(X, row0, vTemp); + + // Result 2 + Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); + X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + + vTemp = _mm_mul_ps(Y, row1); + XMVECTOR V2 = XM_FMADD_PS(X, row0, vTemp); + + vTemp = _mm_movelh_ps(V1, V2); + + _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += sizeof(XMFLOAT2) * 2; + + i += 2; + } + } + } + else + { + // Packed input, unpacked output + for (size_t j = 0; j < two; ++j) + { + XMVECTOR V = _mm_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT2) * 2; + + // Result 1 + XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = _mm_mul_ps(Y, row1); + vTemp = XM_FMADD_PS(X, row0, vTemp); + + _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); + pOutputVector += OutputStride; + + // Result 2 + Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); + X = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + + vTemp = _mm_mul_ps(Y, row1); + vTemp = XM_FMADD_PS(X, row0, vTemp); + + _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); + pOutputVector += OutputStride; + + i += 2; + } + } + } + } + + if (!(reinterpret_cast(pInputVector) & 0xF) && !(InputStride & 0xF)) + { + // Aligned input + for (; i < VectorCount; i++) + { + XMVECTOR V = _mm_castsi128_ps(_mm_loadl_epi64(reinterpret_cast(pInputVector))); + pInputVector += InputStride; + + XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = _mm_mul_ps(Y, row1); + vTemp = XM_FMADD_PS(X, row0, vTemp); + + _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); + pOutputVector += OutputStride; + } + } + else + { + // Unaligned input + for (; i < VectorCount; i++) + { + __m128 xy = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(pInputVector))); + pInputVector += InputStride; + + XMVECTOR Y = XM_PERMUTE_PS(xy, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(xy, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = _mm_mul_ps(Y, row1); + vTemp = XM_FMADD_PS(X, row0, vTemp); + + _mm_store_sd(reinterpret_cast(pOutputVector), _mm_castps_pd(vTemp)); + pOutputVector += OutputStride; + } + } + + XM_SFENCE(); + + return pOutputStream; +#endif +} + +/**************************************************************************** + * + * 3D Vector + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ +// Comparison operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector3Equal +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_f32[0] == V2.vector4_f32[0]) && (V1.vector4_f32[1] == V2.vector4_f32[1]) && (V1.vector4_f32[2] == V2.vector4_f32[2])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vceqq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); + return (((_mm_movemask_ps(vTemp) & 7) == 7) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +inline uint32_t XM_CALLCONV XMVector3EqualR +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + uint32_t CR = 0; + if ((V1.vector4_f32[0] == V2.vector4_f32[0]) && + (V1.vector4_f32[1] == V2.vector4_f32[1]) && + (V1.vector4_f32[2] == V2.vector4_f32[2])) + { + CR = XM_CRMASK_CR6TRUE; + } + else if ((V1.vector4_f32[0] != V2.vector4_f32[0]) && + (V1.vector4_f32[1] != V2.vector4_f32[1]) && + (V1.vector4_f32[2] != V2.vector4_f32[2])) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vceqq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU; + + uint32_t CR = 0; + if (r == 0xFFFFFFU) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!r) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); + int iTest = _mm_movemask_ps(vTemp) & 7; + uint32_t CR = 0; + if (iTest == 7) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!iTest) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector3EqualInt +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_u32[0] == V2.vector4_u32[0]) && (V1.vector4_u32[1] == V2.vector4_u32[1]) && (V1.vector4_u32[2] == V2.vector4_u32[2])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); + return (((_mm_movemask_ps(_mm_castsi128_ps(vTemp)) & 7) == 7) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +inline uint32_t XM_CALLCONV XMVector3EqualIntR +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + uint32_t CR = 0; + if ((V1.vector4_u32[0] == V2.vector4_u32[0]) && + (V1.vector4_u32[1] == V2.vector4_u32[1]) && + (V1.vector4_u32[2] == V2.vector4_u32[2])) + { + CR = XM_CRMASK_CR6TRUE; + } + else if ((V1.vector4_u32[0] != V2.vector4_u32[0]) && + (V1.vector4_u32[1] != V2.vector4_u32[1]) && + (V1.vector4_u32[2] != V2.vector4_u32[2])) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU; + + uint32_t CR = 0; + if (r == 0xFFFFFFU) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!r) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#elif defined(_XM_SSE_INTRINSICS_) + __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); + int iTemp = _mm_movemask_ps(_mm_castsi128_ps(vTemp)) & 7; + uint32_t CR = 0; + if (iTemp == 7) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!iTemp) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector3NearEqual +( + FXMVECTOR V1, + FXMVECTOR V2, + FXMVECTOR Epsilon +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + float dx, dy, dz; + + dx = fabsf(V1.vector4_f32[0] - V2.vector4_f32[0]); + dy = fabsf(V1.vector4_f32[1] - V2.vector4_f32[1]); + dz = fabsf(V1.vector4_f32[2] - V2.vector4_f32[2]); + return (((dx <= Epsilon.vector4_f32[0]) && + (dy <= Epsilon.vector4_f32[1]) && + (dz <= Epsilon.vector4_f32[2])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t vDelta = vsubq_f32(V1, V2); +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + uint32x4_t vResult = vacleq_f32(vDelta, Epsilon); +#else + uint32x4_t vResult = vcleq_f32(vabsq_f32(vDelta), Epsilon); +#endif + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + // Get the difference + XMVECTOR vDelta = _mm_sub_ps(V1, V2); + // Get the absolute value of the difference + XMVECTOR vTemp = _mm_setzero_ps(); + vTemp = _mm_sub_ps(vTemp, vDelta); + vTemp = _mm_max_ps(vTemp, vDelta); + vTemp = _mm_cmple_ps(vTemp, Epsilon); + // w is don't care + return (((_mm_movemask_ps(vTemp) & 7) == 0x7) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector3NotEqual +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_f32[0] != V2.vector4_f32[0]) || (V1.vector4_f32[1] != V2.vector4_f32[1]) || (V1.vector4_f32[2] != V2.vector4_f32[2])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vceqq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) != 0xFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); + return (((_mm_movemask_ps(vTemp) & 7) != 7) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector3NotEqualInt +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_u32[0] != V2.vector4_u32[0]) || (V1.vector4_u32[1] != V2.vector4_u32[1]) || (V1.vector4_u32[2] != V2.vector4_u32[2])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) != 0xFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); + return (((_mm_movemask_ps(_mm_castsi128_ps(vTemp)) & 7) != 7) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector3Greater +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_f32[0] > V2.vector4_f32[0]) && (V1.vector4_f32[1] > V2.vector4_f32[1]) && (V1.vector4_f32[2] > V2.vector4_f32[2])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vcgtq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); + return (((_mm_movemask_ps(vTemp) & 7) == 7) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +inline uint32_t XM_CALLCONV XMVector3GreaterR +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + uint32_t CR = 0; + if ((V1.vector4_f32[0] > V2.vector4_f32[0]) && + (V1.vector4_f32[1] > V2.vector4_f32[1]) && + (V1.vector4_f32[2] > V2.vector4_f32[2])) + { + CR = XM_CRMASK_CR6TRUE; + } + else if ((V1.vector4_f32[0] <= V2.vector4_f32[0]) && + (V1.vector4_f32[1] <= V2.vector4_f32[1]) && + (V1.vector4_f32[2] <= V2.vector4_f32[2])) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vcgtq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU; + + uint32_t CR = 0; + if (r == 0xFFFFFFU) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!r) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); + uint32_t CR = 0; + int iTest = _mm_movemask_ps(vTemp) & 7; + if (iTest == 7) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!iTest) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector3GreaterOrEqual +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_f32[0] >= V2.vector4_f32[0]) && (V1.vector4_f32[1] >= V2.vector4_f32[1]) && (V1.vector4_f32[2] >= V2.vector4_f32[2])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vcgeq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); + return (((_mm_movemask_ps(vTemp) & 7) == 7) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +inline uint32_t XM_CALLCONV XMVector3GreaterOrEqualR +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + uint32_t CR = 0; + if ((V1.vector4_f32[0] >= V2.vector4_f32[0]) && + (V1.vector4_f32[1] >= V2.vector4_f32[1]) && + (V1.vector4_f32[2] >= V2.vector4_f32[2])) + { + CR = XM_CRMASK_CR6TRUE; + } + else if ((V1.vector4_f32[0] < V2.vector4_f32[0]) && + (V1.vector4_f32[1] < V2.vector4_f32[1]) && + (V1.vector4_f32[2] < V2.vector4_f32[2])) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vcgeq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU; + + uint32_t CR = 0; + if (r == 0xFFFFFFU) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!r) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); + uint32_t CR = 0; + int iTest = _mm_movemask_ps(vTemp) & 7; + if (iTest == 7) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!iTest) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector3Less +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_f32[0] < V2.vector4_f32[0]) && (V1.vector4_f32[1] < V2.vector4_f32[1]) && (V1.vector4_f32[2] < V2.vector4_f32[2])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vcltq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmplt_ps(V1, V2); + return (((_mm_movemask_ps(vTemp) & 7) == 7) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector3LessOrEqual +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_f32[0] <= V2.vector4_f32[0]) && (V1.vector4_f32[1] <= V2.vector4_f32[1]) && (V1.vector4_f32[2] <= V2.vector4_f32[2])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vcleq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmple_ps(V1, V2); + return (((_mm_movemask_ps(vTemp) & 7) == 7) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector3InBounds +( + FXMVECTOR V, + FXMVECTOR Bounds +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V.vector4_f32[0] <= Bounds.vector4_f32[0] && V.vector4_f32[0] >= -Bounds.vector4_f32[0]) && + (V.vector4_f32[1] <= Bounds.vector4_f32[1] && V.vector4_f32[1] >= -Bounds.vector4_f32[1]) && + (V.vector4_f32[2] <= Bounds.vector4_f32[2] && V.vector4_f32[2] >= -Bounds.vector4_f32[2])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Test if less than or equal + uint32x4_t ivTemp1 = vcleq_f32(V, Bounds); + // Negate the bounds + float32x4_t vTemp2 = vnegq_f32(Bounds); + // Test if greater or equal (Reversed) + uint32x4_t ivTemp2 = vcleq_f32(vTemp2, V); + // Blend answers + ivTemp1 = vandq_u32(ivTemp1, ivTemp2); + // in bounds? + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(ivTemp1)), vget_high_u8(vreinterpretq_u8_u32(ivTemp1))); + uint16x4x2_t vTemp3 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return ((vget_lane_u32(vreinterpret_u32_u16(vTemp3.val[1]), 1) & 0xFFFFFFU) == 0xFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + // Test if less than or equal + XMVECTOR vTemp1 = _mm_cmple_ps(V, Bounds); + // Negate the bounds + XMVECTOR vTemp2 = _mm_mul_ps(Bounds, g_XMNegativeOne); + // Test if greater or equal (Reversed) + vTemp2 = _mm_cmple_ps(vTemp2, V); + // Blend answers + vTemp1 = _mm_and_ps(vTemp1, vTemp2); + // x,y and z in bounds? (w is don't care) + return (((_mm_movemask_ps(vTemp1) & 0x7) == 0x7) != 0); +#else + return XMComparisonAllInBounds(XMVector3InBoundsR(V, Bounds)); +#endif +} + +//------------------------------------------------------------------------------ + +#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) +#pragma float_control(push) +#pragma float_control(precise, on) +#endif + +inline bool XM_CALLCONV XMVector3IsNaN(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + return (XMISNAN(V.vector4_f32[0]) || + XMISNAN(V.vector4_f32[1]) || + XMISNAN(V.vector4_f32[2])); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(__clang__) && defined(__FINITE_MATH_ONLY__) + return isnan(vgetq_lane_f32(V, 0)) || isnan(vgetq_lane_f32(V, 1)) || isnan(vgetq_lane_f32(V, 2)); +#else +// Test against itself. NaN is always not equal + uint32x4_t vTempNan = vceqq_f32(V, V); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTempNan)), vget_high_u8(vreinterpretq_u8_u32(vTempNan))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + // If x or y or z are NaN, the mask is zero + return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) != 0xFFFFFFU); +#endif +#elif defined(_XM_SSE_INTRINSICS_) +#if defined(__clang__) && defined(__FINITE_MATH_ONLY__) + XM_ALIGNED_DATA(16) float tmp[4]; + _mm_store_ps(tmp, V); + return isnan(tmp[0]) || isnan(tmp[1]) || isnan(tmp[2]); +#else +// Test against itself. NaN is always not equal + XMVECTOR vTempNan = _mm_cmpneq_ps(V, V); + // If x or y or z are NaN, the mask is non-zero + return ((_mm_movemask_ps(vTempNan) & 7) != 0); +#endif +#endif +} + +#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) +#pragma float_control(pop) +#endif + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector3IsInfinite(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (XMISINF(V.vector4_f32[0]) || + XMISINF(V.vector4_f32[1]) || + XMISINF(V.vector4_f32[2])); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Mask off the sign bit + uint32x4_t vTempInf = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); + // Compare to infinity + vTempInf = vceqq_f32(vreinterpretq_f32_u32(vTempInf), g_XMInfinity); + // If any are infinity, the signs are true. + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTempInf)), vget_high_u8(vreinterpretq_u8_u32(vTempInf))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return ((vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) & 0xFFFFFFU) != 0); +#elif defined(_XM_SSE_INTRINSICS_) + // Mask off the sign bit + __m128 vTemp = _mm_and_ps(V, g_XMAbsMask); + // Compare to infinity + vTemp = _mm_cmpeq_ps(vTemp, g_XMInfinity); + // If x,y or z are infinity, the signs are true. + return ((_mm_movemask_ps(vTemp) & 7) != 0); +#endif +} + +//------------------------------------------------------------------------------ +// Computation operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3Dot +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + float fValue = V1.vector4_f32[0] * V2.vector4_f32[0] + V1.vector4_f32[1] * V2.vector4_f32[1] + V1.vector4_f32[2] * V2.vector4_f32[2]; + XMVECTORF32 vResult; + vResult.f[0] = + vResult.f[1] = + vResult.f[2] = + vResult.f[3] = fValue; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t vTemp = vmulq_f32(V1, V2); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vpadd_f32(v1, v1); + v2 = vdup_lane_f32(v2, 0); + v1 = vadd_f32(v1, v2); + return vcombine_f32(v1, v1); +#elif defined(_XM_SSE4_INTRINSICS_) + return _mm_dp_ps(V1, V2, 0x7f); +#elif defined(_XM_SSE3_INTRINSICS_) + XMVECTOR vTemp = _mm_mul_ps(V1, V2); + vTemp = _mm_and_ps(vTemp, g_XMMask3); + vTemp = _mm_hadd_ps(vTemp, vTemp); + return _mm_hadd_ps(vTemp, vTemp); +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product + XMVECTOR vDot = _mm_mul_ps(V1, V2); + // x=Dot.vector4_f32[1], y=Dot.vector4_f32[2] + XMVECTOR vTemp = XM_PERMUTE_PS(vDot, _MM_SHUFFLE(2, 1, 2, 1)); + // Result.vector4_f32[0] = x+y + vDot = _mm_add_ss(vDot, vTemp); + // x=Dot.vector4_f32[2] + vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); + // Result.vector4_f32[0] = (x+y)+z + vDot = _mm_add_ss(vDot, vTemp); + // Splat x + return XM_PERMUTE_PS(vDot, _MM_SHUFFLE(0, 0, 0, 0)); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3Cross +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ + // [ V1.y*V2.z - V1.z*V2.y, V1.z*V2.x - V1.x*V2.z, V1.x*V2.y - V1.y*V2.x ] + +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + (V1.vector4_f32[1] * V2.vector4_f32[2]) - (V1.vector4_f32[2] * V2.vector4_f32[1]), + (V1.vector4_f32[2] * V2.vector4_f32[0]) - (V1.vector4_f32[0] * V2.vector4_f32[2]), + (V1.vector4_f32[0] * V2.vector4_f32[1]) - (V1.vector4_f32[1] * V2.vector4_f32[0]), + 0.0f + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t v1xy = vget_low_f32(V1); + float32x2_t v2xy = vget_low_f32(V2); + + float32x2_t v1yx = vrev64_f32(v1xy); + float32x2_t v2yx = vrev64_f32(v2xy); + + float32x2_t v1zz = vdup_lane_f32(vget_high_f32(V1), 0); + float32x2_t v2zz = vdup_lane_f32(vget_high_f32(V2), 0); + + XMVECTOR vResult = vmulq_f32(vcombine_f32(v1yx, v1xy), vcombine_f32(v2zz, v2yx)); + vResult = vmlsq_f32(vResult, vcombine_f32(v1zz, v1yx), vcombine_f32(v2yx, v2xy)); + vResult = vreinterpretq_f32_u32(veorq_u32(vreinterpretq_u32_f32(vResult), g_XMFlipY)); + return vreinterpretq_f32_u32(vandq_u32(vreinterpretq_u32_f32(vResult), g_XMMask3)); +#elif defined(_XM_SSE_INTRINSICS_) + // y1,z1,x1,w1 + XMVECTOR vTemp1 = XM_PERMUTE_PS(V1, _MM_SHUFFLE(3, 0, 2, 1)); + // z2,x2,y2,w2 + XMVECTOR vTemp2 = XM_PERMUTE_PS(V2, _MM_SHUFFLE(3, 1, 0, 2)); + // Perform the left operation + XMVECTOR vResult = _mm_mul_ps(vTemp1, vTemp2); + // z1,x1,y1,w1 + vTemp1 = XM_PERMUTE_PS(vTemp1, _MM_SHUFFLE(3, 0, 2, 1)); + // y2,z2,x2,w2 + vTemp2 = XM_PERMUTE_PS(vTemp2, _MM_SHUFFLE(3, 1, 0, 2)); + // Perform the right operation + vResult = XM_FNMADD_PS(vTemp1, vTemp2, vResult); + // Set w to zero + return _mm_and_ps(vResult, g_XMMask3); +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3LengthSq(FXMVECTOR V) noexcept +{ + return XMVector3Dot(V, V); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3ReciprocalLengthEst(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Result; + + Result = XMVector3LengthSq(V); + Result = XMVectorReciprocalSqrtEst(Result); + + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Dot3 + float32x4_t vTemp = vmulq_f32(V, V); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vpadd_f32(v1, v1); + v2 = vdup_lane_f32(v2, 0); + v1 = vadd_f32(v1, v2); + // Reciprocal sqrt (estimate) + v2 = vrsqrte_f32(v1); + return vcombine_f32(v2, v2); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); + return _mm_rsqrt_ps(vTemp); +#elif defined(_XM_SSE3_INTRINSICS_) + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + vLengthSq = _mm_and_ps(vLengthSq, g_XMMask3); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_rsqrt_ps(vLengthSq); + return vLengthSq; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product on x,y and z + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + // vTemp has z and y + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 2, 1, 2)); + // x+z, y + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + // y,y,y,y + vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); + // x+z+y,??,??,?? + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + // Splat the length squared + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + // Get the reciprocal + vLengthSq = _mm_rsqrt_ps(vLengthSq); + return vLengthSq; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3ReciprocalLength(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Result; + + Result = XMVector3LengthSq(V); + Result = XMVectorReciprocalSqrt(Result); + + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Dot3 + float32x4_t vTemp = vmulq_f32(V, V); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vpadd_f32(v1, v1); + v2 = vdup_lane_f32(v2, 0); + v1 = vadd_f32(v1, v2); + // Reciprocal sqrt + float32x2_t S0 = vrsqrte_f32(v1); + float32x2_t P0 = vmul_f32(v1, S0); + float32x2_t R0 = vrsqrts_f32(P0, S0); + float32x2_t S1 = vmul_f32(S0, R0); + float32x2_t P1 = vmul_f32(v1, S1); + float32x2_t R1 = vrsqrts_f32(P1, S1); + float32x2_t Result = vmul_f32(S1, R1); + return vcombine_f32(Result, Result); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); + XMVECTOR vLengthSq = _mm_sqrt_ps(vTemp); + return _mm_div_ps(g_XMOne, vLengthSq); +#elif defined(_XM_SSE3_INTRINSICS_) + XMVECTOR vDot = _mm_mul_ps(V, V); + vDot = _mm_and_ps(vDot, g_XMMask3); + vDot = _mm_hadd_ps(vDot, vDot); + vDot = _mm_hadd_ps(vDot, vDot); + vDot = _mm_sqrt_ps(vDot); + vDot = _mm_div_ps(g_XMOne, vDot); + return vDot; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product + XMVECTOR vDot = _mm_mul_ps(V, V); + // x=Dot.y, y=Dot.z + XMVECTOR vTemp = XM_PERMUTE_PS(vDot, _MM_SHUFFLE(2, 1, 2, 1)); + // Result.x = x+y + vDot = _mm_add_ss(vDot, vTemp); + // x=Dot.z + vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); + // Result.x = (x+y)+z + vDot = _mm_add_ss(vDot, vTemp); + // Splat x + vDot = XM_PERMUTE_PS(vDot, _MM_SHUFFLE(0, 0, 0, 0)); + // Get the reciprocal + vDot = _mm_sqrt_ps(vDot); + // Get the reciprocal + vDot = _mm_div_ps(g_XMOne, vDot); + return vDot; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3LengthEst(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Result; + + Result = XMVector3LengthSq(V); + Result = XMVectorSqrtEst(Result); + + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Dot3 + float32x4_t vTemp = vmulq_f32(V, V); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vpadd_f32(v1, v1); + v2 = vdup_lane_f32(v2, 0); + v1 = vadd_f32(v1, v2); + const float32x2_t zero = vdup_n_f32(0); + uint32x2_t VEqualsZero = vceq_f32(v1, zero); + // Sqrt (estimate) + float32x2_t Result = vrsqrte_f32(v1); + Result = vmul_f32(v1, Result); + Result = vbsl_f32(VEqualsZero, zero, Result); + return vcombine_f32(Result, Result); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); + return _mm_sqrt_ps(vTemp); +#elif defined(_XM_SSE3_INTRINSICS_) + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + vLengthSq = _mm_and_ps(vLengthSq, g_XMMask3); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_sqrt_ps(vLengthSq); + return vLengthSq; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product on x,y and z + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + // vTemp has z and y + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 2, 1, 2)); + // x+z, y + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + // y,y,y,y + vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); + // x+z+y,??,??,?? + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + // Splat the length squared + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + // Get the length + vLengthSq = _mm_sqrt_ps(vLengthSq); + return vLengthSq; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3Length(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Result; + + Result = XMVector3LengthSq(V); + Result = XMVectorSqrt(Result); + + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Dot3 + float32x4_t vTemp = vmulq_f32(V, V); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vpadd_f32(v1, v1); + v2 = vdup_lane_f32(v2, 0); + v1 = vadd_f32(v1, v2); + const float32x2_t zero = vdup_n_f32(0); + uint32x2_t VEqualsZero = vceq_f32(v1, zero); + // Sqrt + float32x2_t S0 = vrsqrte_f32(v1); + float32x2_t P0 = vmul_f32(v1, S0); + float32x2_t R0 = vrsqrts_f32(P0, S0); + float32x2_t S1 = vmul_f32(S0, R0); + float32x2_t P1 = vmul_f32(v1, S1); + float32x2_t R1 = vrsqrts_f32(P1, S1); + float32x2_t Result = vmul_f32(S1, R1); + Result = vmul_f32(v1, Result); + Result = vbsl_f32(VEqualsZero, zero, Result); + return vcombine_f32(Result, Result); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); + return _mm_sqrt_ps(vTemp); +#elif defined(_XM_SSE3_INTRINSICS_) + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + vLengthSq = _mm_and_ps(vLengthSq, g_XMMask3); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_sqrt_ps(vLengthSq); + return vLengthSq; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product on x,y and z + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + // vTemp has z and y + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 2, 1, 2)); + // x+z, y + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + // y,y,y,y + vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); + // x+z+y,??,??,?? + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + // Splat the length squared + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + // Get the length + vLengthSq = _mm_sqrt_ps(vLengthSq); + return vLengthSq; +#endif +} + +//------------------------------------------------------------------------------ +// XMVector3NormalizeEst uses a reciprocal estimate and +// returns QNaN on zero and infinite vectors. + +inline XMVECTOR XM_CALLCONV XMVector3NormalizeEst(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Result; + Result = XMVector3ReciprocalLength(V); + Result = XMVectorMultiply(V, Result); + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Dot3 + float32x4_t vTemp = vmulq_f32(V, V); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vpadd_f32(v1, v1); + v2 = vdup_lane_f32(v2, 0); + v1 = vadd_f32(v1, v2); + // Reciprocal sqrt (estimate) + v2 = vrsqrte_f32(v1); + // Normalize + return vmulq_f32(V, vcombine_f32(v2, v2)); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vTemp = _mm_dp_ps(V, V, 0x7f); + XMVECTOR vResult = _mm_rsqrt_ps(vTemp); + return _mm_mul_ps(vResult, V); +#elif defined(_XM_SSE3_INTRINSICS_) + XMVECTOR vDot = _mm_mul_ps(V, V); + vDot = _mm_and_ps(vDot, g_XMMask3); + vDot = _mm_hadd_ps(vDot, vDot); + vDot = _mm_hadd_ps(vDot, vDot); + vDot = _mm_rsqrt_ps(vDot); + vDot = _mm_mul_ps(vDot, V); + return vDot; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product + XMVECTOR vDot = _mm_mul_ps(V, V); + // x=Dot.y, y=Dot.z + XMVECTOR vTemp = XM_PERMUTE_PS(vDot, _MM_SHUFFLE(2, 1, 2, 1)); + // Result.x = x+y + vDot = _mm_add_ss(vDot, vTemp); + // x=Dot.z + vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); + // Result.x = (x+y)+z + vDot = _mm_add_ss(vDot, vTemp); + // Splat x + vDot = XM_PERMUTE_PS(vDot, _MM_SHUFFLE(0, 0, 0, 0)); + // Get the reciprocal + vDot = _mm_rsqrt_ps(vDot); + // Perform the normalization + vDot = _mm_mul_ps(vDot, V); + return vDot; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3Normalize(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + float fLength; + XMVECTOR vResult; + + vResult = XMVector3Length(V); + fLength = vResult.vector4_f32[0]; + + // Prevent divide by zero + if (fLength > 0) + { + fLength = 1.0f / fLength; + } + + vResult.vector4_f32[0] = V.vector4_f32[0] * fLength; + vResult.vector4_f32[1] = V.vector4_f32[1] * fLength; + vResult.vector4_f32[2] = V.vector4_f32[2] * fLength; + vResult.vector4_f32[3] = V.vector4_f32[3] * fLength; + return vResult; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Dot3 + float32x4_t vTemp = vmulq_f32(V, V); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vpadd_f32(v1, v1); + v2 = vdup_lane_f32(v2, 0); + v1 = vadd_f32(v1, v2); + uint32x2_t VEqualsZero = vceq_f32(v1, vdup_n_f32(0)); + uint32x2_t VEqualsInf = vceq_f32(v1, vget_low_f32(g_XMInfinity)); + // Reciprocal sqrt (2 iterations of Newton-Raphson) + float32x2_t S0 = vrsqrte_f32(v1); + float32x2_t P0 = vmul_f32(v1, S0); + float32x2_t R0 = vrsqrts_f32(P0, S0); + float32x2_t S1 = vmul_f32(S0, R0); + float32x2_t P1 = vmul_f32(v1, S1); + float32x2_t R1 = vrsqrts_f32(P1, S1); + v2 = vmul_f32(S1, R1); + // Normalize + XMVECTOR vResult = vmulq_f32(V, vcombine_f32(v2, v2)); + vResult = vbslq_f32(vcombine_u32(VEqualsZero, VEqualsZero), vdupq_n_f32(0), vResult); + return vbslq_f32(vcombine_u32(VEqualsInf, VEqualsInf), g_XMQNaN, vResult); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vLengthSq = _mm_dp_ps(V, V, 0x7f); + // Prepare for the division + XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); + // Create zero with a single instruction + XMVECTOR vZeroMask = _mm_setzero_ps(); + // Test for a divide by zero (Must be FP to detect -0.0) + vZeroMask = _mm_cmpneq_ps(vZeroMask, vResult); + // Failsafe on zero (Or epsilon) length planes + // If the length is infinity, set the elements to zero + vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); + // Divide to perform the normalization + vResult = _mm_div_ps(V, vResult); + // Any that are infinity, set to zero + vResult = _mm_and_ps(vResult, vZeroMask); + // Select qnan or result based on infinite length + XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); + XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); + vResult = _mm_or_ps(vTemp1, vTemp2); + return vResult; +#elif defined(_XM_SSE3_INTRINSICS_) + // Perform the dot product on x,y and z only + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + vLengthSq = _mm_and_ps(vLengthSq, g_XMMask3); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + // Prepare for the division + XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); + // Create zero with a single instruction + XMVECTOR vZeroMask = _mm_setzero_ps(); + // Test for a divide by zero (Must be FP to detect -0.0) + vZeroMask = _mm_cmpneq_ps(vZeroMask, vResult); + // Failsafe on zero (Or epsilon) length planes + // If the length is infinity, set the elements to zero + vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); + // Divide to perform the normalization + vResult = _mm_div_ps(V, vResult); + // Any that are infinity, set to zero + vResult = _mm_and_ps(vResult, vZeroMask); + // Select qnan or result based on infinite length + XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); + XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); + vResult = _mm_or_ps(vTemp1, vTemp2); + return vResult; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product on x,y and z only + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 1, 2, 1)); + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(1, 1, 1, 1)); + vLengthSq = _mm_add_ss(vLengthSq, vTemp); + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(0, 0, 0, 0)); + // Prepare for the division + XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); + // Create zero with a single instruction + XMVECTOR vZeroMask = _mm_setzero_ps(); + // Test for a divide by zero (Must be FP to detect -0.0) + vZeroMask = _mm_cmpneq_ps(vZeroMask, vResult); + // Failsafe on zero (Or epsilon) length planes + // If the length is infinity, set the elements to zero + vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); + // Divide to perform the normalization + vResult = _mm_div_ps(V, vResult); + // Any that are infinity, set to zero + vResult = _mm_and_ps(vResult, vZeroMask); + // Select qnan or result based on infinite length + XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); + XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); + vResult = _mm_or_ps(vTemp1, vTemp2); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3ClampLength +( + FXMVECTOR V, + float LengthMin, + float LengthMax +) noexcept +{ + XMVECTOR ClampMax = XMVectorReplicate(LengthMax); + XMVECTOR ClampMin = XMVectorReplicate(LengthMin); + + return XMVector3ClampLengthV(V, ClampMin, ClampMax); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3ClampLengthV +( + FXMVECTOR V, + FXMVECTOR LengthMin, + FXMVECTOR LengthMax +) noexcept +{ + assert((XMVectorGetY(LengthMin) == XMVectorGetX(LengthMin)) && (XMVectorGetZ(LengthMin) == XMVectorGetX(LengthMin))); + assert((XMVectorGetY(LengthMax) == XMVectorGetX(LengthMax)) && (XMVectorGetZ(LengthMax) == XMVectorGetX(LengthMax))); + assert(XMVector3GreaterOrEqual(LengthMin, XMVectorZero())); + assert(XMVector3GreaterOrEqual(LengthMax, XMVectorZero())); + assert(XMVector3GreaterOrEqual(LengthMax, LengthMin)); + + XMVECTOR LengthSq = XMVector3LengthSq(V); + + const XMVECTOR Zero = XMVectorZero(); + + XMVECTOR RcpLength = XMVectorReciprocalSqrt(LengthSq); + + XMVECTOR InfiniteLength = XMVectorEqualInt(LengthSq, g_XMInfinity.v); + XMVECTOR ZeroLength = XMVectorEqual(LengthSq, Zero); + + XMVECTOR Normal = XMVectorMultiply(V, RcpLength); + + XMVECTOR Length = XMVectorMultiply(LengthSq, RcpLength); + + XMVECTOR Select = XMVectorEqualInt(InfiniteLength, ZeroLength); + Length = XMVectorSelect(LengthSq, Length, Select); + Normal = XMVectorSelect(LengthSq, Normal, Select); + + XMVECTOR ControlMax = XMVectorGreater(Length, LengthMax); + XMVECTOR ControlMin = XMVectorLess(Length, LengthMin); + + XMVECTOR ClampLength = XMVectorSelect(Length, LengthMax, ControlMax); + ClampLength = XMVectorSelect(ClampLength, LengthMin, ControlMin); + + XMVECTOR Result = XMVectorMultiply(Normal, ClampLength); + + // Preserve the original vector (with no precision loss) if the length falls within the given range + XMVECTOR Control = XMVectorEqualInt(ControlMax, ControlMin); + Result = XMVectorSelect(Result, V, Control); + + return Result; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3Reflect +( + FXMVECTOR Incident, + FXMVECTOR Normal +) noexcept +{ + // Result = Incident - (2 * dot(Incident, Normal)) * Normal + + XMVECTOR Result = XMVector3Dot(Incident, Normal); + Result = XMVectorAdd(Result, Result); + Result = XMVectorNegativeMultiplySubtract(Result, Normal, Incident); + + return Result; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3Refract +( + FXMVECTOR Incident, + FXMVECTOR Normal, + float RefractionIndex +) noexcept +{ + XMVECTOR Index = XMVectorReplicate(RefractionIndex); + return XMVector3RefractV(Incident, Normal, Index); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3RefractV +( + FXMVECTOR Incident, + FXMVECTOR Normal, + FXMVECTOR RefractionIndex +) noexcept +{ + // Result = RefractionIndex * Incident - Normal * (RefractionIndex * dot(Incident, Normal) + + // sqrt(1 - RefractionIndex * RefractionIndex * (1 - dot(Incident, Normal) * dot(Incident, Normal)))) + +#if defined(_XM_NO_INTRINSICS_) + + const XMVECTOR Zero = XMVectorZero(); + + XMVECTOR IDotN = XMVector3Dot(Incident, Normal); + + // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) + XMVECTOR R = XMVectorNegativeMultiplySubtract(IDotN, IDotN, g_XMOne.v); + R = XMVectorMultiply(R, RefractionIndex); + R = XMVectorNegativeMultiplySubtract(R, RefractionIndex, g_XMOne.v); + + if (XMVector4LessOrEqual(R, Zero)) + { + // Total internal reflection + return Zero; + } + else + { + // R = RefractionIndex * IDotN + sqrt(R) + R = XMVectorSqrt(R); + R = XMVectorMultiplyAdd(RefractionIndex, IDotN, R); + + // Result = RefractionIndex * Incident - Normal * R + XMVECTOR Result = XMVectorMultiply(RefractionIndex, Incident); + Result = XMVectorNegativeMultiplySubtract(Normal, R, Result); + + return Result; + } + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + XMVECTOR IDotN = XMVector3Dot(Incident, Normal); + + // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) + float32x4_t R = vmlsq_f32(g_XMOne, IDotN, IDotN); + R = vmulq_f32(R, RefractionIndex); + R = vmlsq_f32(g_XMOne, R, RefractionIndex); + + uint32x4_t isrzero = vcleq_f32(R, g_XMZero); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(isrzero)), vget_high_u8(vreinterpretq_u8_u32(isrzero))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + + float32x4_t vResult; + if (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU) + { + // Total internal reflection + vResult = g_XMZero; + } + else + { + // Sqrt(R) + float32x4_t S0 = vrsqrteq_f32(R); + float32x4_t P0 = vmulq_f32(R, S0); + float32x4_t R0 = vrsqrtsq_f32(P0, S0); + float32x4_t S1 = vmulq_f32(S0, R0); + float32x4_t P1 = vmulq_f32(R, S1); + float32x4_t R1 = vrsqrtsq_f32(P1, S1); + float32x4_t S2 = vmulq_f32(S1, R1); + R = vmulq_f32(R, S2); + // R = RefractionIndex * IDotN + sqrt(R) + R = vmlaq_f32(R, RefractionIndex, IDotN); + // Result = RefractionIndex * Incident - Normal * R + vResult = vmulq_f32(RefractionIndex, Incident); + vResult = vmlsq_f32(vResult, R, Normal); + } + return vResult; +#elif defined(_XM_SSE_INTRINSICS_) + // Result = RefractionIndex * Incident - Normal * (RefractionIndex * dot(Incident, Normal) + + // sqrt(1 - RefractionIndex * RefractionIndex * (1 - dot(Incident, Normal) * dot(Incident, Normal)))) + XMVECTOR IDotN = XMVector3Dot(Incident, Normal); + // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) + XMVECTOR R = XM_FNMADD_PS(IDotN, IDotN, g_XMOne); + XMVECTOR R2 = _mm_mul_ps(RefractionIndex, RefractionIndex); + R = XM_FNMADD_PS(R, R2, g_XMOne); + + XMVECTOR vResult = _mm_cmple_ps(R, g_XMZero); + if (_mm_movemask_ps(vResult) == 0x0f) + { + // Total internal reflection + vResult = g_XMZero; + } + else + { + // R = RefractionIndex * IDotN + sqrt(R) + R = _mm_sqrt_ps(R); + R = XM_FMADD_PS(RefractionIndex, IDotN, R); + // Result = RefractionIndex * Incident - Normal * R + vResult = _mm_mul_ps(RefractionIndex, Incident); + vResult = XM_FNMADD_PS(R, Normal, vResult); + } + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3Orthogonal(FXMVECTOR V) noexcept +{ + XMVECTOR Zero = XMVectorZero(); + XMVECTOR Z = XMVectorSplatZ(V); + XMVECTOR YZYY = XMVectorSwizzle(V); + + XMVECTOR NegativeV = XMVectorSubtract(Zero, V); + + XMVECTOR ZIsNegative = XMVectorLess(Z, Zero); + XMVECTOR YZYYIsNegative = XMVectorLess(YZYY, Zero); + + XMVECTOR S = XMVectorAdd(YZYY, Z); + XMVECTOR D = XMVectorSubtract(YZYY, Z); + + XMVECTOR Select = XMVectorEqualInt(ZIsNegative, YZYYIsNegative); + + XMVECTOR R0 = XMVectorPermute(NegativeV, S); + XMVECTOR R1 = XMVectorPermute(V, D); + + return XMVectorSelect(R1, R0, Select); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3AngleBetweenNormalsEst +( + FXMVECTOR N1, + FXMVECTOR N2 +) noexcept +{ + XMVECTOR Result = XMVector3Dot(N1, N2); + Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); + Result = XMVectorACosEst(Result); + return Result; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3AngleBetweenNormals +( + FXMVECTOR N1, + FXMVECTOR N2 +) noexcept +{ + XMVECTOR Result = XMVector3Dot(N1, N2); + Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); + Result = XMVectorACos(Result); + return Result; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3AngleBetweenVectors +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ + XMVECTOR L1 = XMVector3ReciprocalLength(V1); + XMVECTOR L2 = XMVector3ReciprocalLength(V2); + + XMVECTOR Dot = XMVector3Dot(V1, V2); + + L1 = XMVectorMultiply(L1, L2); + + XMVECTOR CosAngle = XMVectorMultiply(Dot, L1); + CosAngle = XMVectorClamp(CosAngle, g_XMNegativeOne.v, g_XMOne.v); + + return XMVectorACos(CosAngle); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3LinePointDistance +( + FXMVECTOR LinePoint1, + FXMVECTOR LinePoint2, + FXMVECTOR Point +) noexcept +{ + // Given a vector PointVector from LinePoint1 to Point and a vector + // LineVector from LinePoint1 to LinePoint2, the scaled distance + // PointProjectionScale from LinePoint1 to the perpendicular projection + // of PointVector onto the line is defined as: + // + // PointProjectionScale = dot(PointVector, LineVector) / LengthSq(LineVector) + + XMVECTOR PointVector = XMVectorSubtract(Point, LinePoint1); + XMVECTOR LineVector = XMVectorSubtract(LinePoint2, LinePoint1); + + XMVECTOR LengthSq = XMVector3LengthSq(LineVector); + + XMVECTOR PointProjectionScale = XMVector3Dot(PointVector, LineVector); + PointProjectionScale = XMVectorDivide(PointProjectionScale, LengthSq); + + XMVECTOR DistanceVector = XMVectorMultiply(LineVector, PointProjectionScale); + DistanceVector = XMVectorSubtract(PointVector, DistanceVector); + + return XMVector3Length(DistanceVector); +} + +//------------------------------------------------------------------------------ + +_Use_decl_annotations_ +inline void XM_CALLCONV XMVector3ComponentsFromNormal +( + XMVECTOR* pParallel, + XMVECTOR* pPerpendicular, + FXMVECTOR V, + FXMVECTOR Normal +) noexcept +{ + assert(pParallel != nullptr); + assert(pPerpendicular != nullptr); + + XMVECTOR Scale = XMVector3Dot(V, Normal); + + XMVECTOR Parallel = XMVectorMultiply(Normal, Scale); + + *pParallel = Parallel; + *pPerpendicular = XMVectorSubtract(V, Parallel); +} + +//------------------------------------------------------------------------------ +// Transform a vector using a rotation expressed as a unit quaternion + +inline XMVECTOR XM_CALLCONV XMVector3Rotate +( + FXMVECTOR V, + FXMVECTOR RotationQuaternion +) noexcept +{ + XMVECTOR A = XMVectorSelect(g_XMSelect1110.v, V, g_XMSelect1110.v); + XMVECTOR Q = XMQuaternionConjugate(RotationQuaternion); + XMVECTOR Result = XMQuaternionMultiply(Q, A); + return XMQuaternionMultiply(Result, RotationQuaternion); +} + +//------------------------------------------------------------------------------ +// Transform a vector using the inverse of a rotation expressed as a unit quaternion + +inline XMVECTOR XM_CALLCONV XMVector3InverseRotate +( + FXMVECTOR V, + FXMVECTOR RotationQuaternion +) noexcept +{ + XMVECTOR A = XMVectorSelect(g_XMSelect1110.v, V, g_XMSelect1110.v); + XMVECTOR Result = XMQuaternionMultiply(RotationQuaternion, A); + XMVECTOR Q = XMQuaternionConjugate(RotationQuaternion); + return XMQuaternionMultiply(Result, Q); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3Transform +( + FXMVECTOR V, + FXMMATRIX M +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Z = XMVectorSplatZ(V); + XMVECTOR Y = XMVectorSplatY(V); + XMVECTOR X = XMVectorSplatX(V); + + XMVECTOR Result = XMVectorMultiplyAdd(Z, M.r[2], M.r[3]); + Result = XMVectorMultiplyAdd(Y, M.r[1], Result); + Result = XMVectorMultiplyAdd(X, M.r[0], Result); + + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t VL = vget_low_f32(V); + XMVECTOR vResult = vmlaq_lane_f32(M.r[3], M.r[0], VL, 0); // X + vResult = vmlaq_lane_f32(vResult, M.r[1], VL, 1); // Y + return vmlaq_lane_f32(vResult, M.r[2], vget_high_f32(V), 0); // Z +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z + vResult = XM_FMADD_PS(vResult, M.r[2], M.r[3]); + XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = XM_FMADD_PS(vTemp, M.r[1], vResult); + vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +#ifdef _PREFAST_ +#pragma prefast(push) +#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307" ) +#endif + +_Use_decl_annotations_ +inline XMFLOAT4* XM_CALLCONV XMVector3TransformStream +( + XMFLOAT4* pOutputStream, + size_t OutputStride, + const XMFLOAT3* pInputStream, + size_t InputStride, + size_t VectorCount, + FXMMATRIX M +) noexcept +{ + assert(pOutputStream != nullptr); + assert(pInputStream != nullptr); + + assert(InputStride >= sizeof(XMFLOAT3)); + _Analysis_assume_(InputStride >= sizeof(XMFLOAT3)); + + assert(OutputStride >= sizeof(XMFLOAT4)); + _Analysis_assume_(OutputStride >= sizeof(XMFLOAT4)); + +#if defined(_XM_NO_INTRINSICS_) + + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row2 = M.r[2]; + const XMVECTOR row3 = M.r[3]; + + for (size_t i = 0; i < VectorCount; i++) + { + XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); + XMVECTOR Z = XMVectorSplatZ(V); + XMVECTOR Y = XMVectorSplatY(V); + XMVECTOR X = XMVectorSplatX(V); + + XMVECTOR Result = XMVectorMultiplyAdd(Z, row2, row3); + Result = XMVectorMultiplyAdd(Y, row1, Result); + Result = XMVectorMultiplyAdd(X, row0, Result); + + XMStoreFloat4(reinterpret_cast(pOutputVector), Result); + + pInputVector += InputStride; + pOutputVector += OutputStride; + } + + return pOutputStream; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row2 = M.r[2]; + const XMVECTOR row3 = M.r[3]; + + size_t i = 0; + size_t four = VectorCount >> 2; + if (four > 0) + { + if ((InputStride == sizeof(XMFLOAT3)) && (OutputStride == sizeof(XMFLOAT4))) + { + for (size_t j = 0; j < four; ++j) + { + float32x4x3_t V = vld3q_f32(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT3) * 4; + + float32x2_t r3 = vget_low_f32(row3); + float32x2_t r = vget_low_f32(row0); + XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M + XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N + + XM_PREFETCH(pInputVector); + + r3 = vget_high_f32(row3); + r = vget_high_f32(row0); + XMVECTOR vResult2 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Cx+O + XMVECTOR vResult3 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Dx+P + + XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); + + r = vget_low_f32(row1); + vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey+M + vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy+N + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); + + r = vget_high_f32(row1); + vResult2 = vmlaq_lane_f32(vResult2, V.val[1], r, 0); // Cx+Gy+O + vResult3 = vmlaq_lane_f32(vResult3, V.val[1], r, 1); // Dx+Hy+P + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); + + r = vget_low_f32(row2); + vResult0 = vmlaq_lane_f32(vResult0, V.val[2], r, 0); // Ax+Ey+Iz+M + vResult1 = vmlaq_lane_f32(vResult1, V.val[2], r, 1); // Bx+Fy+Jz+N + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 4)); + + r = vget_high_f32(row2); + vResult2 = vmlaq_lane_f32(vResult2, V.val[2], r, 0); // Cx+Gy+Kz+O + vResult3 = vmlaq_lane_f32(vResult3, V.val[2], r, 1); // Dx+Hy+Lz+P + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 5)); + + float32x4x4_t R; + R.val[0] = vResult0; + R.val[1] = vResult1; + R.val[2] = vResult2; + R.val[3] = vResult3; + + vst4q_f32(reinterpret_cast(pOutputVector), R); + pOutputVector += sizeof(XMFLOAT4) * 4; + + i += 4; + } + } + } + + for (; i < VectorCount; i++) + { + float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); + float32x2_t zero = vdup_n_f32(0); + float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); + pInputVector += InputStride; + + XMVECTOR vResult = vmlaq_lane_f32(row3, row0, VL, 0); // X + vResult = vmlaq_lane_f32(vResult, row1, VL, 1); // Y + vResult = vmlaq_lane_f32(vResult, row2, VH, 0); // Z + + vst1q_f32(reinterpret_cast(pOutputVector), vResult); + pOutputVector += OutputStride; + } + + return pOutputStream; +#elif defined(_XM_SSE_INTRINSICS_) + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row2 = M.r[2]; + const XMVECTOR row3 = M.r[3]; + + size_t i = 0; + size_t four = VectorCount >> 2; + if (four > 0) + { + if (InputStride == sizeof(XMFLOAT3)) + { + if (!(reinterpret_cast(pOutputStream) & 0xF) && !(OutputStride & 0xF)) + { + // Packed input, aligned output + for (size_t j = 0; j < four; ++j) + { + __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); + __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); + __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); + pInputVector += sizeof(XMFLOAT3) * 4; + + // Unpack the 4 vectors (.w components are junk) + XM3UNPACK3INTO4(V1, L2, L3); + + // Result 1 + XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); + XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); + XMVECTOR vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + // Result 2 + Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + // Result 3 + Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + // Result 4 + Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + i += 4; + } + } + else + { + // Packed input, unaligned output + for (size_t j = 0; j < four; ++j) + { + __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); + __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); + __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); + pInputVector += sizeof(XMFLOAT3) * 4; + + // Unpack the 4 vectors (.w components are junk) + XM3UNPACK3INTO4(V1, L2, L3); + + // Result 1 + XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); + XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); + XMVECTOR vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + // Result 2 + Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + // Result 3 + Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + // Result 4 + Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + i += 4; + } + } + } + } + + if (!(reinterpret_cast(pOutputStream) & 0xF) && !(OutputStride & 0xF)) + { + // Aligned output + for (; i < VectorCount; ++i) + { + XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); + pInputVector += InputStride; + + XMVECTOR Z = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); + XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); + XMVECTOR vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + XM_STREAM_PS(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + } + } + else + { + // Unaligned output + for (; i < VectorCount; ++i) + { + XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); + pInputVector += InputStride; + + XMVECTOR Z = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); + XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); + XMVECTOR vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + _mm_storeu_ps(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + } + } + + XM_SFENCE(); + + return pOutputStream; +#endif +} + +#ifdef _PREFAST_ +#pragma prefast(pop) +#endif + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3TransformCoord +( + FXMVECTOR V, + FXMMATRIX M +) noexcept +{ + XMVECTOR Z = XMVectorSplatZ(V); + XMVECTOR Y = XMVectorSplatY(V); + XMVECTOR X = XMVectorSplatX(V); + + XMVECTOR Result = XMVectorMultiplyAdd(Z, M.r[2], M.r[3]); + Result = XMVectorMultiplyAdd(Y, M.r[1], Result); + Result = XMVectorMultiplyAdd(X, M.r[0], Result); + + XMVECTOR W = XMVectorSplatW(Result); + return XMVectorDivide(Result, W); +} + +//------------------------------------------------------------------------------ + +#ifdef _PREFAST_ +#pragma prefast(push) +#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307" ) +#endif + +_Use_decl_annotations_ +inline XMFLOAT3* XM_CALLCONV XMVector3TransformCoordStream +( + XMFLOAT3* pOutputStream, + size_t OutputStride, + const XMFLOAT3* pInputStream, + size_t InputStride, + size_t VectorCount, + FXMMATRIX M +) noexcept +{ + assert(pOutputStream != nullptr); + assert(pInputStream != nullptr); + + assert(InputStride >= sizeof(XMFLOAT3)); + _Analysis_assume_(InputStride >= sizeof(XMFLOAT3)); + + assert(OutputStride >= sizeof(XMFLOAT3)); + _Analysis_assume_(OutputStride >= sizeof(XMFLOAT3)); + +#if defined(_XM_NO_INTRINSICS_) + + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row2 = M.r[2]; + const XMVECTOR row3 = M.r[3]; + + for (size_t i = 0; i < VectorCount; i++) + { + XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); + XMVECTOR Z = XMVectorSplatZ(V); + XMVECTOR Y = XMVectorSplatY(V); + XMVECTOR X = XMVectorSplatX(V); + + XMVECTOR Result = XMVectorMultiplyAdd(Z, row2, row3); + Result = XMVectorMultiplyAdd(Y, row1, Result); + Result = XMVectorMultiplyAdd(X, row0, Result); + + XMVECTOR W = XMVectorSplatW(Result); + + Result = XMVectorDivide(Result, W); + + XMStoreFloat3(reinterpret_cast(pOutputVector), Result); + + pInputVector += InputStride; + pOutputVector += OutputStride; + } + + return pOutputStream; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row2 = M.r[2]; + const XMVECTOR row3 = M.r[3]; + + size_t i = 0; + size_t four = VectorCount >> 2; + if (four > 0) + { + if ((InputStride == sizeof(XMFLOAT3)) && (OutputStride == sizeof(XMFLOAT3))) + { + for (size_t j = 0; j < four; ++j) + { + float32x4x3_t V = vld3q_f32(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT3) * 4; + + float32x2_t r3 = vget_low_f32(row3); + float32x2_t r = vget_low_f32(row0); + XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M + XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N + + XM_PREFETCH(pInputVector); + + r3 = vget_high_f32(row3); + r = vget_high_f32(row0); + XMVECTOR vResult2 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Cx+O + XMVECTOR W = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Dx+P + + XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); + + r = vget_low_f32(row1); + vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey+M + vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy+N + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); + + r = vget_high_f32(row1); + vResult2 = vmlaq_lane_f32(vResult2, V.val[1], r, 0); // Cx+Gy+O + W = vmlaq_lane_f32(W, V.val[1], r, 1); // Dx+Hy+P + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); + + r = vget_low_f32(row2); + vResult0 = vmlaq_lane_f32(vResult0, V.val[2], r, 0); // Ax+Ey+Iz+M + vResult1 = vmlaq_lane_f32(vResult1, V.val[2], r, 1); // Bx+Fy+Jz+N + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 4)); + + r = vget_high_f32(row2); + vResult2 = vmlaq_lane_f32(vResult2, V.val[2], r, 0); // Cx+Gy+Kz+O + W = vmlaq_lane_f32(W, V.val[2], r, 1); // Dx+Hy+Lz+P + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 5)); + + #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ + V.val[0] = vdivq_f32(vResult0, W); + V.val[1] = vdivq_f32(vResult1, W); + V.val[2] = vdivq_f32(vResult2, W); + #else + // 2 iterations of Newton-Raphson refinement of reciprocal + float32x4_t Reciprocal = vrecpeq_f32(W); + float32x4_t S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + + V.val[0] = vmulq_f32(vResult0, Reciprocal); + V.val[1] = vmulq_f32(vResult1, Reciprocal); + V.val[2] = vmulq_f32(vResult2, Reciprocal); + #endif + + vst3q_f32(reinterpret_cast(pOutputVector), V); + pOutputVector += sizeof(XMFLOAT3) * 4; + + i += 4; + } + } + } + + for (; i < VectorCount; i++) + { + float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); + float32x2_t zero = vdup_n_f32(0); + float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); + pInputVector += InputStride; + + XMVECTOR vResult = vmlaq_lane_f32(row3, row0, VL, 0); // X + vResult = vmlaq_lane_f32(vResult, row1, VL, 1); // Y + vResult = vmlaq_lane_f32(vResult, row2, VH, 0); // Z + + VH = vget_high_f32(vResult); + XMVECTOR W = vdupq_lane_f32(VH, 1); + + #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ + vResult = vdivq_f32(vResult, W); + #else + // 2 iterations of Newton-Raphson refinement of reciprocal for W + float32x4_t Reciprocal = vrecpeq_f32(W); + float32x4_t S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + + vResult = vmulq_f32(vResult, Reciprocal); + #endif + + VL = vget_low_f32(vResult); + vst1_f32(reinterpret_cast(pOutputVector), VL); + vst1q_lane_f32(reinterpret_cast(pOutputVector) + 2, vResult, 2); + pOutputVector += OutputStride; + } + + return pOutputStream; +#elif defined(_XM_SSE_INTRINSICS_) + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row2 = M.r[2]; + const XMVECTOR row3 = M.r[3]; + + size_t i = 0; + size_t four = VectorCount >> 2; + if (four > 0) + { + if (InputStride == sizeof(XMFLOAT3)) + { + if (OutputStride == sizeof(XMFLOAT3)) + { + if (!(reinterpret_cast(pOutputStream) & 0xF)) + { + // Packed input, aligned & packed output + for (size_t j = 0; j < four; ++j) + { + __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); + __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); + __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); + pInputVector += sizeof(XMFLOAT3) * 4; + + // Unpack the 4 vectors (.w components are junk) + XM3UNPACK3INTO4(V1, L2, L3); + + // Result 1 + XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); + XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); + XMVECTOR vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + V1 = _mm_div_ps(vTemp, W); + + // Result 2 + Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + V2 = _mm_div_ps(vTemp, W); + + // Result 3 + Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + V3 = _mm_div_ps(vTemp, W); + + // Result 4 + Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + V4 = _mm_div_ps(vTemp, W); + + // Pack and store the vectors + XM3PACK4INTO3(vTemp); + XM_STREAM_PS(reinterpret_cast(pOutputVector), V1); + XM_STREAM_PS(reinterpret_cast(pOutputVector + 16), vTemp); + XM_STREAM_PS(reinterpret_cast(pOutputVector + 32), V3); + pOutputVector += sizeof(XMFLOAT3) * 4; + i += 4; + } + } + else + { + // Packed input, unaligned & packed output + for (size_t j = 0; j < four; ++j) + { + __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); + __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); + __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); + pInputVector += sizeof(XMFLOAT3) * 4; + + // Unpack the 4 vectors (.w components are junk) + XM3UNPACK3INTO4(V1, L2, L3); + + // Result 1 + XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); + XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); + XMVECTOR vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + V1 = _mm_div_ps(vTemp, W); + + // Result 2 + Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + V2 = _mm_div_ps(vTemp, W); + + // Result 3 + Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + V3 = _mm_div_ps(vTemp, W); + + // Result 4 + Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + V4 = _mm_div_ps(vTemp, W); + + // Pack and store the vectors + XM3PACK4INTO3(vTemp); + _mm_storeu_ps(reinterpret_cast(pOutputVector), V1); + _mm_storeu_ps(reinterpret_cast(pOutputVector + 16), vTemp); + _mm_storeu_ps(reinterpret_cast(pOutputVector + 32), V3); + pOutputVector += sizeof(XMFLOAT3) * 4; + i += 4; + } + } + } + else + { + // Packed input, unpacked output + for (size_t j = 0; j < four; ++j) + { + __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); + __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); + __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); + pInputVector += sizeof(XMFLOAT3) * 4; + + // Unpack the 4 vectors (.w components are junk) + XM3UNPACK3INTO4(V1, L2, L3); + + // Result 1 + XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); + XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); + XMVECTOR vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + vTemp = _mm_div_ps(vTemp, W); + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + // Result 2 + Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + vTemp = _mm_div_ps(vTemp, W); + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + // Result 3 + Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + vTemp = _mm_div_ps(vTemp, W); + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + // Result 4 + Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, row2, row3); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + vTemp = _mm_div_ps(vTemp, W); + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + i += 4; + } + } + } + } + + for (; i < VectorCount; i++) + { + XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); + pInputVector += InputStride; + + XMVECTOR Z = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Z, row2, row3); + XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); + XMVECTOR vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + + vTemp = _mm_div_ps(vTemp, W); + + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + } + + XM_SFENCE(); + + return pOutputStream; +#endif +} + +#ifdef _PREFAST_ +#pragma prefast(pop) +#endif + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3TransformNormal +( + FXMVECTOR V, + FXMMATRIX M +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Z = XMVectorSplatZ(V); + XMVECTOR Y = XMVectorSplatY(V); + XMVECTOR X = XMVectorSplatX(V); + + XMVECTOR Result = XMVectorMultiply(Z, M.r[2]); + Result = XMVectorMultiplyAdd(Y, M.r[1], Result); + Result = XMVectorMultiplyAdd(X, M.r[0], Result); + + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t VL = vget_low_f32(V); + XMVECTOR vResult = vmulq_lane_f32(M.r[0], VL, 0); // X + vResult = vmlaq_lane_f32(vResult, M.r[1], VL, 1); // Y + return vmlaq_lane_f32(vResult, M.r[2], vget_high_f32(V), 0); // Z +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z + vResult = _mm_mul_ps(vResult, M.r[2]); + XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = XM_FMADD_PS(vTemp, M.r[1], vResult); + vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +#ifdef _PREFAST_ +#pragma prefast(push) +#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307" ) +#endif + +_Use_decl_annotations_ +inline XMFLOAT3* XM_CALLCONV XMVector3TransformNormalStream +( + XMFLOAT3* pOutputStream, + size_t OutputStride, + const XMFLOAT3* pInputStream, + size_t InputStride, + size_t VectorCount, + FXMMATRIX M +) noexcept +{ + assert(pOutputStream != nullptr); + assert(pInputStream != nullptr); + + assert(InputStride >= sizeof(XMFLOAT3)); + _Analysis_assume_(InputStride >= sizeof(XMFLOAT3)); + + assert(OutputStride >= sizeof(XMFLOAT3)); + _Analysis_assume_(OutputStride >= sizeof(XMFLOAT3)); + +#if defined(_XM_NO_INTRINSICS_) + + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row2 = M.r[2]; + + for (size_t i = 0; i < VectorCount; i++) + { + XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); + XMVECTOR Z = XMVectorSplatZ(V); + XMVECTOR Y = XMVectorSplatY(V); + XMVECTOR X = XMVectorSplatX(V); + + XMVECTOR Result = XMVectorMultiply(Z, row2); + Result = XMVectorMultiplyAdd(Y, row1, Result); + Result = XMVectorMultiplyAdd(X, row0, Result); + + XMStoreFloat3(reinterpret_cast(pOutputVector), Result); + + pInputVector += InputStride; + pOutputVector += OutputStride; + } + + return pOutputStream; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row2 = M.r[2]; + + size_t i = 0; + size_t four = VectorCount >> 2; + if (four > 0) + { + if ((InputStride == sizeof(XMFLOAT3)) && (OutputStride == sizeof(XMFLOAT3))) + { + for (size_t j = 0; j < four; ++j) + { + float32x4x3_t V = vld3q_f32(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT3) * 4; + + float32x2_t r = vget_low_f32(row0); + XMVECTOR vResult0 = vmulq_lane_f32(V.val[0], r, 0); // Ax + XMVECTOR vResult1 = vmulq_lane_f32(V.val[0], r, 1); // Bx + + XM_PREFETCH(pInputVector); + + r = vget_high_f32(row0); + XMVECTOR vResult2 = vmulq_lane_f32(V.val[0], r, 0); // Cx + + XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); + + r = vget_low_f32(row1); + vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey + vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); + + r = vget_high_f32(row1); + vResult2 = vmlaq_lane_f32(vResult2, V.val[1], r, 0); // Cx+Gy + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); + + r = vget_low_f32(row2); + vResult0 = vmlaq_lane_f32(vResult0, V.val[2], r, 0); // Ax+Ey+Iz + vResult1 = vmlaq_lane_f32(vResult1, V.val[2], r, 1); // Bx+Fy+Jz + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 4)); + + r = vget_high_f32(row2); + vResult2 = vmlaq_lane_f32(vResult2, V.val[2], r, 0); // Cx+Gy+Kz + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 5)); + + V.val[0] = vResult0; + V.val[1] = vResult1; + V.val[2] = vResult2; + + vst3q_f32(reinterpret_cast(pOutputVector), V); + pOutputVector += sizeof(XMFLOAT3) * 4; + + i += 4; + } + } + } + + for (; i < VectorCount; i++) + { + float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); + float32x2_t zero = vdup_n_f32(0); + float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); + pInputVector += InputStride; + + XMVECTOR vResult = vmulq_lane_f32(row0, VL, 0); // X + vResult = vmlaq_lane_f32(vResult, row1, VL, 1); // Y + vResult = vmlaq_lane_f32(vResult, row2, VH, 0); // Z + + VL = vget_low_f32(vResult); + vst1_f32(reinterpret_cast(pOutputVector), VL); + vst1q_lane_f32(reinterpret_cast(pOutputVector) + 2, vResult, 2); + pOutputVector += OutputStride; + } + + return pOutputStream; +#elif defined(_XM_SSE_INTRINSICS_) + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row2 = M.r[2]; + + size_t i = 0; + size_t four = VectorCount >> 2; + if (four > 0) + { + if (InputStride == sizeof(XMFLOAT3)) + { + if (OutputStride == sizeof(XMFLOAT3)) + { + if (!(reinterpret_cast(pOutputStream) & 0xF)) + { + // Packed input, aligned & packed output + for (size_t j = 0; j < four; ++j) + { + __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); + __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); + __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); + pInputVector += sizeof(XMFLOAT3) * 4; + + // Unpack the 4 vectors (.w components are junk) + XM3UNPACK3INTO4(V1, L2, L3); + + // Result 1 + XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = _mm_mul_ps(Z, row2); + XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); + XMVECTOR vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + V1 = _mm_add_ps(vTemp, vTemp3); + + // Result 2 + Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = _mm_mul_ps(Z, row2); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + V2 = _mm_add_ps(vTemp, vTemp3); + + // Result 3 + Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = _mm_mul_ps(Z, row2); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + V3 = _mm_add_ps(vTemp, vTemp3); + + // Result 4 + Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = _mm_mul_ps(Z, row2); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + V4 = _mm_add_ps(vTemp, vTemp3); + + // Pack and store the vectors + XM3PACK4INTO3(vTemp); + XM_STREAM_PS(reinterpret_cast(pOutputVector), V1); + XM_STREAM_PS(reinterpret_cast(pOutputVector + 16), vTemp); + XM_STREAM_PS(reinterpret_cast(pOutputVector + 32), V3); + pOutputVector += sizeof(XMFLOAT3) * 4; + i += 4; + } + } + else + { + // Packed input, unaligned & packed output + for (size_t j = 0; j < four; ++j) + { + __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); + __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); + __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); + pInputVector += sizeof(XMFLOAT3) * 4; + + // Unpack the 4 vectors (.w components are junk) + XM3UNPACK3INTO4(V1, L2, L3); + + // Result 1 + XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = _mm_mul_ps(Z, row2); + XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); + XMVECTOR vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + V1 = _mm_add_ps(vTemp, vTemp3); + + // Result 2 + Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = _mm_mul_ps(Z, row2); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + V2 = _mm_add_ps(vTemp, vTemp3); + + // Result 3 + Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = _mm_mul_ps(Z, row2); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + V3 = _mm_add_ps(vTemp, vTemp3); + + // Result 4 + Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = _mm_mul_ps(Z, row2); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + V4 = _mm_add_ps(vTemp, vTemp3); + + // Pack and store the vectors + XM3PACK4INTO3(vTemp); + _mm_storeu_ps(reinterpret_cast(pOutputVector), V1); + _mm_storeu_ps(reinterpret_cast(pOutputVector + 16), vTemp); + _mm_storeu_ps(reinterpret_cast(pOutputVector + 32), V3); + pOutputVector += sizeof(XMFLOAT3) * 4; + i += 4; + } + } + } + else + { + // Packed input, unpacked output + for (size_t j = 0; j < four; ++j) + { + __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); + __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); + __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); + pInputVector += sizeof(XMFLOAT3) * 4; + + // Unpack the 4 vectors (.w components are junk) + XM3UNPACK3INTO4(V1, L2, L3); + + // Result 1 + XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = _mm_mul_ps(Z, row2); + XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); + XMVECTOR vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + // Result 2 + Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = _mm_mul_ps(Z, row2); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + // Result 3 + Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = _mm_mul_ps(Z, row2); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + // Result 4 + Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = _mm_mul_ps(Z, row2); + vTemp2 = _mm_mul_ps(Y, row1); + vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + i += 4; + } + } + } + } + + for (; i < VectorCount; i++) + { + XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); + pInputVector += InputStride; + + XMVECTOR Z = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = _mm_mul_ps(Z, row2); + XMVECTOR vTemp2 = _mm_mul_ps(Y, row1); + XMVECTOR vTemp3 = _mm_mul_ps(X, row0); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + } + + XM_SFENCE(); + + return pOutputStream; +#endif +} + +#ifdef _PREFAST_ +#pragma prefast(pop) +#endif + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3Project +( + FXMVECTOR V, + float ViewportX, + float ViewportY, + float ViewportWidth, + float ViewportHeight, + float ViewportMinZ, + float ViewportMaxZ, + FXMMATRIX Projection, + CXMMATRIX View, + CXMMATRIX World +) noexcept +{ + const float HalfViewportWidth = ViewportWidth * 0.5f; + const float HalfViewportHeight = ViewportHeight * 0.5f; + + XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 0.0f); + XMVECTOR Offset = XMVectorSet(ViewportX + HalfViewportWidth, ViewportY + HalfViewportHeight, ViewportMinZ, 0.0f); + + XMMATRIX Transform = XMMatrixMultiply(World, View); + Transform = XMMatrixMultiply(Transform, Projection); + + XMVECTOR Result = XMVector3TransformCoord(V, Transform); + + Result = XMVectorMultiplyAdd(Result, Scale, Offset); + + return Result; +} + +//------------------------------------------------------------------------------ + +#ifdef _PREFAST_ +#pragma prefast(push) +#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307" ) +#endif + +_Use_decl_annotations_ +inline XMFLOAT3* XM_CALLCONV XMVector3ProjectStream +( + XMFLOAT3* pOutputStream, + size_t OutputStride, + const XMFLOAT3* pInputStream, + size_t InputStride, + size_t VectorCount, + float ViewportX, + float ViewportY, + float ViewportWidth, + float ViewportHeight, + float ViewportMinZ, + float ViewportMaxZ, + FXMMATRIX Projection, + CXMMATRIX View, + CXMMATRIX World +) noexcept +{ + assert(pOutputStream != nullptr); + assert(pInputStream != nullptr); + + assert(InputStride >= sizeof(XMFLOAT3)); + _Analysis_assume_(InputStride >= sizeof(XMFLOAT3)); + + assert(OutputStride >= sizeof(XMFLOAT3)); + _Analysis_assume_(OutputStride >= sizeof(XMFLOAT3)); + +#if defined(_XM_NO_INTRINSICS_) + + const float HalfViewportWidth = ViewportWidth * 0.5f; + const float HalfViewportHeight = ViewportHeight * 0.5f; + + XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 1.0f); + XMVECTOR Offset = XMVectorSet(ViewportX + HalfViewportWidth, ViewportY + HalfViewportHeight, ViewportMinZ, 0.0f); + + XMMATRIX Transform = XMMatrixMultiply(World, View); + Transform = XMMatrixMultiply(Transform, Projection); + + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + for (size_t i = 0; i < VectorCount; i++) + { + XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); + + XMVECTOR Result = XMVector3TransformCoord(V, Transform); + Result = XMVectorMultiplyAdd(Result, Scale, Offset); + + XMStoreFloat3(reinterpret_cast(pOutputVector), Result); + + pInputVector += InputStride; + pOutputVector += OutputStride; + } + + return pOutputStream; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + const float HalfViewportWidth = ViewportWidth * 0.5f; + const float HalfViewportHeight = ViewportHeight * 0.5f; + + XMMATRIX Transform = XMMatrixMultiply(World, View); + Transform = XMMatrixMultiply(Transform, Projection); + + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + size_t i = 0; + size_t four = VectorCount >> 2; + if (four > 0) + { + if ((InputStride == sizeof(XMFLOAT3)) && (OutputStride == sizeof(XMFLOAT3))) + { + XMVECTOR ScaleX = vdupq_n_f32(HalfViewportWidth); + XMVECTOR ScaleY = vdupq_n_f32(-HalfViewportHeight); + XMVECTOR ScaleZ = vdupq_n_f32(ViewportMaxZ - ViewportMinZ); + + XMVECTOR OffsetX = vdupq_n_f32(ViewportX + HalfViewportWidth); + XMVECTOR OffsetY = vdupq_n_f32(ViewportY + HalfViewportHeight); + XMVECTOR OffsetZ = vdupq_n_f32(ViewportMinZ); + + for (size_t j = 0; j < four; ++j) + { + float32x4x3_t V = vld3q_f32(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT3) * 4; + + float32x2_t r3 = vget_low_f32(Transform.r[3]); + float32x2_t r = vget_low_f32(Transform.r[0]); + XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Ax+M + XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Bx+N + + XM_PREFETCH(pInputVector); + + r3 = vget_high_f32(Transform.r[3]); + r = vget_high_f32(Transform.r[0]); + XMVECTOR vResult2 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), V.val[0], r, 0); // Cx+O + XMVECTOR W = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), V.val[0], r, 1); // Dx+P + + XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); + + r = vget_low_f32(Transform.r[1]); + vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey+M + vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy+N + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); + + r = vget_high_f32(Transform.r[1]); + vResult2 = vmlaq_lane_f32(vResult2, V.val[1], r, 0); // Cx+Gy+O + W = vmlaq_lane_f32(W, V.val[1], r, 1); // Dx+Hy+P + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); + + r = vget_low_f32(Transform.r[2]); + vResult0 = vmlaq_lane_f32(vResult0, V.val[2], r, 0); // Ax+Ey+Iz+M + vResult1 = vmlaq_lane_f32(vResult1, V.val[2], r, 1); // Bx+Fy+Jz+N + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 4)); + + r = vget_high_f32(Transform.r[2]); + vResult2 = vmlaq_lane_f32(vResult2, V.val[2], r, 0); // Cx+Gy+Kz+O + W = vmlaq_lane_f32(W, V.val[2], r, 1); // Dx+Hy+Lz+P + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 5)); + + #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ + vResult0 = vdivq_f32(vResult0, W); + vResult1 = vdivq_f32(vResult1, W); + vResult2 = vdivq_f32(vResult2, W); + #else + // 2 iterations of Newton-Raphson refinement of reciprocal + float32x4_t Reciprocal = vrecpeq_f32(W); + float32x4_t S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + + vResult0 = vmulq_f32(vResult0, Reciprocal); + vResult1 = vmulq_f32(vResult1, Reciprocal); + vResult2 = vmulq_f32(vResult2, Reciprocal); + #endif + + V.val[0] = vmlaq_f32(OffsetX, vResult0, ScaleX); + V.val[1] = vmlaq_f32(OffsetY, vResult1, ScaleY); + V.val[2] = vmlaq_f32(OffsetZ, vResult2, ScaleZ); + + vst3q_f32(reinterpret_cast(pOutputVector), V); + pOutputVector += sizeof(XMFLOAT3) * 4; + + i += 4; + } + } + } + + if (i < VectorCount) + { + XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 1.0f); + XMVECTOR Offset = XMVectorSet(ViewportX + HalfViewportWidth, ViewportY + HalfViewportHeight, ViewportMinZ, 0.0f); + + for (; i < VectorCount; i++) + { + float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); + float32x2_t zero = vdup_n_f32(0); + float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); + pInputVector += InputStride; + + XMVECTOR vResult = vmlaq_lane_f32(Transform.r[3], Transform.r[0], VL, 0); // X + vResult = vmlaq_lane_f32(vResult, Transform.r[1], VL, 1); // Y + vResult = vmlaq_lane_f32(vResult, Transform.r[2], VH, 0); // Z + + VH = vget_high_f32(vResult); + XMVECTOR W = vdupq_lane_f32(VH, 1); + + #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ + vResult = vdivq_f32(vResult, W); + #else + // 2 iterations of Newton-Raphson refinement of reciprocal for W + float32x4_t Reciprocal = vrecpeq_f32(W); + float32x4_t S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + + vResult = vmulq_f32(vResult, Reciprocal); + #endif + + vResult = vmlaq_f32(Offset, vResult, Scale); + + VL = vget_low_f32(vResult); + vst1_f32(reinterpret_cast(pOutputVector), VL); + vst1q_lane_f32(reinterpret_cast(pOutputVector) + 2, vResult, 2); + pOutputVector += OutputStride; + } + } + + return pOutputStream; +#elif defined(_XM_SSE_INTRINSICS_) + const float HalfViewportWidth = ViewportWidth * 0.5f; + const float HalfViewportHeight = ViewportHeight * 0.5f; + + XMVECTOR Scale = XMVectorSet(HalfViewportWidth, -HalfViewportHeight, ViewportMaxZ - ViewportMinZ, 1.0f); + XMVECTOR Offset = XMVectorSet(ViewportX + HalfViewportWidth, ViewportY + HalfViewportHeight, ViewportMinZ, 0.0f); + + XMMATRIX Transform = XMMatrixMultiply(World, View); + Transform = XMMatrixMultiply(Transform, Projection); + + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + size_t i = 0; + size_t four = VectorCount >> 2; + if (four > 0) + { + if (InputStride == sizeof(XMFLOAT3)) + { + if (OutputStride == sizeof(XMFLOAT3)) + { + if (!(reinterpret_cast(pOutputStream) & 0xF)) + { + // Packed input, aligned & packed output + for (size_t j = 0; j < four; ++j) + { + __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); + __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); + __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); + pInputVector += sizeof(XMFLOAT3) * 4; + + // Unpack the 4 vectors (.w components are junk) + XM3UNPACK3INTO4(V1, L2, L3); + + // Result 1 + XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + vTemp = _mm_div_ps(vTemp, W); + V1 = XM_FMADD_PS(vTemp, Scale, Offset); + + // Result 2 + Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + vTemp = _mm_div_ps(vTemp, W); + V2 = XM_FMADD_PS(vTemp, Scale, Offset); + + // Result 3 + Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + vTemp = _mm_div_ps(vTemp, W); + V3 = XM_FMADD_PS(vTemp, Scale, Offset); + + // Result 4 + Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + vTemp = _mm_div_ps(vTemp, W); + V4 = XM_FMADD_PS(vTemp, Scale, Offset); + + // Pack and store the vectors + XM3PACK4INTO3(vTemp); + XM_STREAM_PS(reinterpret_cast(pOutputVector), V1); + XM_STREAM_PS(reinterpret_cast(pOutputVector + 16), vTemp); + XM_STREAM_PS(reinterpret_cast(pOutputVector + 32), V3); + pOutputVector += sizeof(XMFLOAT3) * 4; + i += 4; + } + } + else + { + // Packed input, unaligned & packed output + for (size_t j = 0; j < four; ++j) + { + __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); + __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); + __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); + pInputVector += sizeof(XMFLOAT3) * 4; + + // Unpack the 4 vectors (.w components are junk) + XM3UNPACK3INTO4(V1, L2, L3); + + // Result 1 + XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + vTemp = _mm_div_ps(vTemp, W); + V1 = XM_FMADD_PS(vTemp, Scale, Offset); + + // Result 2 + Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + vTemp = _mm_div_ps(vTemp, W); + V2 = XM_FMADD_PS(vTemp, Scale, Offset); + + // Result 3 + Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + vTemp = _mm_div_ps(vTemp, W); + V3 = XM_FMADD_PS(vTemp, Scale, Offset); + + // Result 4 + Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + vTemp = _mm_div_ps(vTemp, W); + V4 = XM_FMADD_PS(vTemp, Scale, Offset); + + // Pack and store the vectors + XM3PACK4INTO3(vTemp); + _mm_storeu_ps(reinterpret_cast(pOutputVector), V1); + _mm_storeu_ps(reinterpret_cast(pOutputVector + 16), vTemp); + _mm_storeu_ps(reinterpret_cast(pOutputVector + 32), V3); + pOutputVector += sizeof(XMFLOAT3) * 4; + i += 4; + } + } + } + else + { + // Packed input, unpacked output + for (size_t j = 0; j < four; ++j) + { + __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); + __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); + __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); + pInputVector += sizeof(XMFLOAT3) * 4; + + // Unpack the 4 vectors (.w components are junk) + XM3UNPACK3INTO4(V1, L2, L3); + + // Result 1 + XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + vTemp = _mm_div_ps(vTemp, W); + vTemp = XM_FMADD_PS(vTemp, Scale, Offset); + + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + // Result 2 + Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + vTemp = _mm_div_ps(vTemp, W); + vTemp = XM_FMADD_PS(vTemp, Scale, Offset); + + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + // Result 3 + Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + vTemp = _mm_div_ps(vTemp, W); + vTemp = XM_FMADD_PS(vTemp, Scale, Offset); + + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + // Result 4 + Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + vTemp = _mm_div_ps(vTemp, W); + vTemp = XM_FMADD_PS(vTemp, Scale, Offset); + + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + i += 4; + } + } + } + } + + for (; i < VectorCount; i++) + { + XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); + pInputVector += InputStride; + + XMVECTOR Z = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + vTemp = _mm_div_ps(vTemp, W); + vTemp = XM_FMADD_PS(vTemp, Scale, Offset); + + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + } + + XM_SFENCE(); + + return pOutputStream; +#endif +} + +#ifdef _PREFAST_ +#pragma prefast(pop) +#endif + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector3Unproject +( + FXMVECTOR V, + float ViewportX, + float ViewportY, + float ViewportWidth, + float ViewportHeight, + float ViewportMinZ, + float ViewportMaxZ, + FXMMATRIX Projection, + CXMMATRIX View, + CXMMATRIX World +) noexcept +{ + static const XMVECTORF32 D = { { { -1.0f, 1.0f, 0.0f, 0.0f } } }; + + XMVECTOR Scale = XMVectorSet(ViewportWidth * 0.5f, -ViewportHeight * 0.5f, ViewportMaxZ - ViewportMinZ, 1.0f); + Scale = XMVectorReciprocal(Scale); + + XMVECTOR Offset = XMVectorSet(-ViewportX, -ViewportY, -ViewportMinZ, 0.0f); + Offset = XMVectorMultiplyAdd(Scale, Offset, D.v); + + XMMATRIX Transform = XMMatrixMultiply(World, View); + Transform = XMMatrixMultiply(Transform, Projection); + Transform = XMMatrixInverse(nullptr, Transform); + + XMVECTOR Result = XMVectorMultiplyAdd(V, Scale, Offset); + + return XMVector3TransformCoord(Result, Transform); +} + +//------------------------------------------------------------------------------ + +#ifdef _PREFAST_ +#pragma prefast(push) +#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307" ) +#endif + +_Use_decl_annotations_ +inline XMFLOAT3* XM_CALLCONV XMVector3UnprojectStream +( + XMFLOAT3* pOutputStream, + size_t OutputStride, + const XMFLOAT3* pInputStream, + size_t InputStride, + size_t VectorCount, + float ViewportX, + float ViewportY, + float ViewportWidth, + float ViewportHeight, + float ViewportMinZ, + float ViewportMaxZ, + FXMMATRIX Projection, + CXMMATRIX View, + CXMMATRIX World +) noexcept +{ + assert(pOutputStream != nullptr); + assert(pInputStream != nullptr); + + assert(InputStride >= sizeof(XMFLOAT3)); + _Analysis_assume_(InputStride >= sizeof(XMFLOAT3)); + + assert(OutputStride >= sizeof(XMFLOAT3)); + _Analysis_assume_(OutputStride >= sizeof(XMFLOAT3)); + +#if defined(_XM_NO_INTRINSICS_) + + static const XMVECTORF32 D = { { { -1.0f, 1.0f, 0.0f, 0.0f } } }; + + XMVECTOR Scale = XMVectorSet(ViewportWidth * 0.5f, -ViewportHeight * 0.5f, ViewportMaxZ - ViewportMinZ, 1.0f); + Scale = XMVectorReciprocal(Scale); + + XMVECTOR Offset = XMVectorSet(-ViewportX, -ViewportY, -ViewportMinZ, 0.0f); + Offset = XMVectorMultiplyAdd(Scale, Offset, D.v); + + XMMATRIX Transform = XMMatrixMultiply(World, View); + Transform = XMMatrixMultiply(Transform, Projection); + Transform = XMMatrixInverse(nullptr, Transform); + + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + for (size_t i = 0; i < VectorCount; i++) + { + XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); + + XMVECTOR Result = XMVectorMultiplyAdd(V, Scale, Offset); + + Result = XMVector3TransformCoord(Result, Transform); + + XMStoreFloat3(reinterpret_cast(pOutputVector), Result); + + pInputVector += InputStride; + pOutputVector += OutputStride; + } + + return pOutputStream; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + XMMATRIX Transform = XMMatrixMultiply(World, View); + Transform = XMMatrixMultiply(Transform, Projection); + Transform = XMMatrixInverse(nullptr, Transform); + + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + float sx = 1.f / (ViewportWidth * 0.5f); + float sy = 1.f / (-ViewportHeight * 0.5f); + float sz = 1.f / (ViewportMaxZ - ViewportMinZ); + + float ox = (-ViewportX * sx) - 1.f; + float oy = (-ViewportY * sy) + 1.f; + float oz = (-ViewportMinZ * sz); + + size_t i = 0; + size_t four = VectorCount >> 2; + if (four > 0) + { + if ((InputStride == sizeof(XMFLOAT3)) && (OutputStride == sizeof(XMFLOAT3))) + { + for (size_t j = 0; j < four; ++j) + { + float32x4x3_t V = vld3q_f32(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT3) * 4; + + XMVECTOR ScaleX = vdupq_n_f32(sx); + XMVECTOR OffsetX = vdupq_n_f32(ox); + XMVECTOR VX = vmlaq_f32(OffsetX, ScaleX, V.val[0]); + + float32x2_t r3 = vget_low_f32(Transform.r[3]); + float32x2_t r = vget_low_f32(Transform.r[0]); + XMVECTOR vResult0 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), VX, r, 0); // Ax+M + XMVECTOR vResult1 = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), VX, r, 1); // Bx+N + + XM_PREFETCH(pInputVector); + + r3 = vget_high_f32(Transform.r[3]); + r = vget_high_f32(Transform.r[0]); + XMVECTOR vResult2 = vmlaq_lane_f32(vdupq_lane_f32(r3, 0), VX, r, 0); // Cx+O + XMVECTOR W = vmlaq_lane_f32(vdupq_lane_f32(r3, 1), VX, r, 1); // Dx+P + + XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); + + XMVECTOR ScaleY = vdupq_n_f32(sy); + XMVECTOR OffsetY = vdupq_n_f32(oy); + XMVECTOR VY = vmlaq_f32(OffsetY, ScaleY, V.val[1]); + + r = vget_low_f32(Transform.r[1]); + vResult0 = vmlaq_lane_f32(vResult0, VY, r, 0); // Ax+Ey+M + vResult1 = vmlaq_lane_f32(vResult1, VY, r, 1); // Bx+Fy+N + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); + + r = vget_high_f32(Transform.r[1]); + vResult2 = vmlaq_lane_f32(vResult2, VY, r, 0); // Cx+Gy+O + W = vmlaq_lane_f32(W, VY, r, 1); // Dx+Hy+P + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); + + XMVECTOR ScaleZ = vdupq_n_f32(sz); + XMVECTOR OffsetZ = vdupq_n_f32(oz); + XMVECTOR VZ = vmlaq_f32(OffsetZ, ScaleZ, V.val[2]); + + r = vget_low_f32(Transform.r[2]); + vResult0 = vmlaq_lane_f32(vResult0, VZ, r, 0); // Ax+Ey+Iz+M + vResult1 = vmlaq_lane_f32(vResult1, VZ, r, 1); // Bx+Fy+Jz+N + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 4)); + + r = vget_high_f32(Transform.r[2]); + vResult2 = vmlaq_lane_f32(vResult2, VZ, r, 0); // Cx+Gy+Kz+O + W = vmlaq_lane_f32(W, VZ, r, 1); // Dx+Hy+Lz+P + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 5)); + + #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ + V.val[0] = vdivq_f32(vResult0, W); + V.val[1] = vdivq_f32(vResult1, W); + V.val[2] = vdivq_f32(vResult2, W); + #else + // 2 iterations of Newton-Raphson refinement of reciprocal + float32x4_t Reciprocal = vrecpeq_f32(W); + float32x4_t S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + + V.val[0] = vmulq_f32(vResult0, Reciprocal); + V.val[1] = vmulq_f32(vResult1, Reciprocal); + V.val[2] = vmulq_f32(vResult2, Reciprocal); + #endif + + vst3q_f32(reinterpret_cast(pOutputVector), V); + pOutputVector += sizeof(XMFLOAT3) * 4; + + i += 4; + } + } + } + + if (i < VectorCount) + { + float32x2_t ScaleL = vcreate_f32( + static_cast(*reinterpret_cast(&sx)) + | (static_cast(*reinterpret_cast(&sy)) << 32)); + float32x2_t ScaleH = vcreate_f32(static_cast(*reinterpret_cast(&sz))); + + float32x2_t OffsetL = vcreate_f32( + static_cast(*reinterpret_cast(&ox)) + | (static_cast(*reinterpret_cast(&oy)) << 32)); + float32x2_t OffsetH = vcreate_f32(static_cast(*reinterpret_cast(&oz))); + + for (; i < VectorCount; i++) + { + float32x2_t VL = vld1_f32(reinterpret_cast(pInputVector)); + float32x2_t zero = vdup_n_f32(0); + float32x2_t VH = vld1_lane_f32(reinterpret_cast(pInputVector) + 2, zero, 0); + pInputVector += InputStride; + + VL = vmla_f32(OffsetL, VL, ScaleL); + VH = vmla_f32(OffsetH, VH, ScaleH); + + XMVECTOR vResult = vmlaq_lane_f32(Transform.r[3], Transform.r[0], VL, 0); // X + vResult = vmlaq_lane_f32(vResult, Transform.r[1], VL, 1); // Y + vResult = vmlaq_lane_f32(vResult, Transform.r[2], VH, 0); // Z + + VH = vget_high_f32(vResult); + XMVECTOR W = vdupq_lane_f32(VH, 1); + + #if defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__ + vResult = vdivq_f32(vResult, W); + #else + // 2 iterations of Newton-Raphson refinement of reciprocal for W + float32x4_t Reciprocal = vrecpeq_f32(W); + float32x4_t S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + S = vrecpsq_f32(Reciprocal, W); + Reciprocal = vmulq_f32(S, Reciprocal); + + vResult = vmulq_f32(vResult, Reciprocal); + #endif + + VL = vget_low_f32(vResult); + vst1_f32(reinterpret_cast(pOutputVector), VL); + vst1q_lane_f32(reinterpret_cast(pOutputVector) + 2, vResult, 2); + pOutputVector += OutputStride; + } + } + + return pOutputStream; +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 D = { { { -1.0f, 1.0f, 0.0f, 0.0f } } }; + + XMVECTOR Scale = XMVectorSet(ViewportWidth * 0.5f, -ViewportHeight * 0.5f, ViewportMaxZ - ViewportMinZ, 1.0f); + Scale = XMVectorReciprocal(Scale); + + XMVECTOR Offset = XMVectorSet(-ViewportX, -ViewportY, -ViewportMinZ, 0.0f); + Offset = _mm_mul_ps(Scale, Offset); + Offset = _mm_add_ps(Offset, D); + + XMMATRIX Transform = XMMatrixMultiply(World, View); + Transform = XMMatrixMultiply(Transform, Projection); + Transform = XMMatrixInverse(nullptr, Transform); + + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + size_t i = 0; + size_t four = VectorCount >> 2; + if (four > 0) + { + if (InputStride == sizeof(XMFLOAT3)) + { + if (OutputStride == sizeof(XMFLOAT3)) + { + if (!(reinterpret_cast(pOutputStream) & 0xF)) + { + // Packed input, aligned & packed output + for (size_t j = 0; j < four; ++j) + { + __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); + __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); + __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); + pInputVector += sizeof(XMFLOAT3) * 4; + + // Unpack the 4 vectors (.w components are junk) + XM3UNPACK3INTO4(V1, L2, L3); + + // Result 1 + V1 = XM_FMADD_PS(V1, Scale, Offset); + + XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + V1 = _mm_div_ps(vTemp, W); + + // Result 2 + V2 = XM_FMADD_PS(V2, Scale, Offset); + + Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + V2 = _mm_div_ps(vTemp, W); + + // Result 3 + V3 = XM_FMADD_PS(V3, Scale, Offset); + + Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + V3 = _mm_div_ps(vTemp, W); + + // Result 4 + V4 = XM_FMADD_PS(V4, Scale, Offset); + + Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + V4 = _mm_div_ps(vTemp, W); + + // Pack and store the vectors + XM3PACK4INTO3(vTemp); + XM_STREAM_PS(reinterpret_cast(pOutputVector), V1); + XM_STREAM_PS(reinterpret_cast(pOutputVector + 16), vTemp); + XM_STREAM_PS(reinterpret_cast(pOutputVector + 32), V3); + pOutputVector += sizeof(XMFLOAT3) * 4; + i += 4; + } + } + else + { + // Packed input, unaligned & packed output + for (size_t j = 0; j < four; ++j) + { + __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); + __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); + __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); + pInputVector += sizeof(XMFLOAT3) * 4; + + // Unpack the 4 vectors (.w components are junk) + XM3UNPACK3INTO4(V1, L2, L3); + + // Result 1 + V1 = XM_FMADD_PS(V1, Scale, Offset); + + XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + V1 = _mm_div_ps(vTemp, W); + + // Result 2 + V2 = XM_FMADD_PS(V2, Scale, Offset); + + Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + V2 = _mm_div_ps(vTemp, W); + + // Result 3 + V3 = XM_FMADD_PS(V3, Scale, Offset); + + Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + V3 = _mm_div_ps(vTemp, W); + + // Result 4 + V4 = XM_FMADD_PS(V4, Scale, Offset); + + Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + V4 = _mm_div_ps(vTemp, W); + + // Pack and store the vectors + XM3PACK4INTO3(vTemp); + _mm_storeu_ps(reinterpret_cast(pOutputVector), V1); + _mm_storeu_ps(reinterpret_cast(pOutputVector + 16), vTemp); + _mm_storeu_ps(reinterpret_cast(pOutputVector + 32), V3); + pOutputVector += sizeof(XMFLOAT3) * 4; + i += 4; + } + } + } + else + { + // Packed input, unpacked output + for (size_t j = 0; j < four; ++j) + { + __m128 V1 = _mm_loadu_ps(reinterpret_cast(pInputVector)); + __m128 L2 = _mm_loadu_ps(reinterpret_cast(pInputVector + 16)); + __m128 L3 = _mm_loadu_ps(reinterpret_cast(pInputVector + 32)); + pInputVector += sizeof(XMFLOAT3) * 4; + + // Unpack the 4 vectors (.w components are junk) + XM3UNPACK3INTO4(V1, L2, L3); + + // Result 1 + V1 = XM_FMADD_PS(V1, Scale, Offset); + + XMVECTOR Z = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + vTemp = _mm_div_ps(vTemp, W); + + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + // Result 2 + V2 = XM_FMADD_PS(V2, Scale, Offset); + + Z = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V2, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + vTemp = _mm_div_ps(vTemp, W); + + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + // Result 3 + V3 = XM_FMADD_PS(V3, Scale, Offset); + + Z = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + vTemp = _mm_div_ps(vTemp, W); + + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + // Result 4 + V4 = XM_FMADD_PS(V4, Scale, Offset); + + Z = XM_PERMUTE_PS(V4, _MM_SHUFFLE(2, 2, 2, 2)); + Y = XM_PERMUTE_PS(V4, _MM_SHUFFLE(1, 1, 1, 1)); + X = XM_PERMUTE_PS(V4, _MM_SHUFFLE(0, 0, 0, 0)); + + vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + vTemp = _mm_div_ps(vTemp, W); + + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + + i += 4; + } + } + } + } + + for (; i < VectorCount; i++) + { + XMVECTOR V = XMLoadFloat3(reinterpret_cast(pInputVector)); + pInputVector += InputStride; + + V = _mm_mul_ps(V, Scale); + V = _mm_add_ps(V, Offset); + + XMVECTOR Z = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR Y = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR X = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + + XMVECTOR vTemp = XM_FMADD_PS(Z, Transform.r[2], Transform.r[3]); + XMVECTOR vTemp2 = _mm_mul_ps(Y, Transform.r[1]); + XMVECTOR vTemp3 = _mm_mul_ps(X, Transform.r[0]); + vTemp = _mm_add_ps(vTemp, vTemp2); + vTemp = _mm_add_ps(vTemp, vTemp3); + + XMVECTOR W = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 3, 3, 3)); + vTemp = _mm_div_ps(vTemp, W); + + XMStoreFloat3(reinterpret_cast(pOutputVector), vTemp); + pOutputVector += OutputStride; + } + + XM_SFENCE(); + + return pOutputStream; +#endif +} + +#ifdef _PREFAST_ +#pragma prefast(pop) +#endif + +/**************************************************************************** + * + * 4D Vector + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ +// Comparison operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector4Equal +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_f32[0] == V2.vector4_f32[0]) && (V1.vector4_f32[1] == V2.vector4_f32[1]) && (V1.vector4_f32[2] == V2.vector4_f32[2]) && (V1.vector4_f32[3] == V2.vector4_f32[3])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vceqq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); + return ((_mm_movemask_ps(vTemp) == 0x0f) != 0); +#else + return XMComparisonAllTrue(XMVector4EqualR(V1, V2)); +#endif +} + +//------------------------------------------------------------------------------ + +inline uint32_t XM_CALLCONV XMVector4EqualR +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + uint32_t CR = 0; + + if ((V1.vector4_f32[0] == V2.vector4_f32[0]) && + (V1.vector4_f32[1] == V2.vector4_f32[1]) && + (V1.vector4_f32[2] == V2.vector4_f32[2]) && + (V1.vector4_f32[3] == V2.vector4_f32[3])) + { + CR = XM_CRMASK_CR6TRUE; + } + else if ((V1.vector4_f32[0] != V2.vector4_f32[0]) && + (V1.vector4_f32[1] != V2.vector4_f32[1]) && + (V1.vector4_f32[2] != V2.vector4_f32[2]) && + (V1.vector4_f32[3] != V2.vector4_f32[3])) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vceqq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + + uint32_t CR = 0; + if (r == 0xFFFFFFFFU) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!r) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpeq_ps(V1, V2); + int iTest = _mm_movemask_ps(vTemp); + uint32_t CR = 0; + if (iTest == 0xf) // All equal? + { + CR = XM_CRMASK_CR6TRUE; + } + else if (iTest == 0) // All not equal? + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector4EqualInt +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_u32[0] == V2.vector4_u32[0]) && (V1.vector4_u32[1] == V2.vector4_u32[1]) && (V1.vector4_u32[2] == V2.vector4_u32[2]) && (V1.vector4_u32[3] == V2.vector4_u32[3])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); + return ((_mm_movemask_ps(_mm_castsi128_ps(vTemp)) == 0xf) != 0); +#else + return XMComparisonAllTrue(XMVector4EqualIntR(V1, V2)); +#endif +} + +//------------------------------------------------------------------------------ + +inline uint32_t XM_CALLCONV XMVector4EqualIntR +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + uint32_t CR = 0; + if (V1.vector4_u32[0] == V2.vector4_u32[0] && + V1.vector4_u32[1] == V2.vector4_u32[1] && + V1.vector4_u32[2] == V2.vector4_u32[2] && + V1.vector4_u32[3] == V2.vector4_u32[3]) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (V1.vector4_u32[0] != V2.vector4_u32[0] && + V1.vector4_u32[1] != V2.vector4_u32[1] && + V1.vector4_u32[2] != V2.vector4_u32[2] && + V1.vector4_u32[3] != V2.vector4_u32[3]) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + + uint32_t CR = 0; + if (r == 0xFFFFFFFFU) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!r) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#elif defined(_XM_SSE_INTRINSICS_) + __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); + int iTest = _mm_movemask_ps(_mm_castsi128_ps(vTemp)); + uint32_t CR = 0; + if (iTest == 0xf) // All equal? + { + CR = XM_CRMASK_CR6TRUE; + } + else if (iTest == 0) // All not equal? + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#endif +} + +inline bool XM_CALLCONV XMVector4NearEqual +( + FXMVECTOR V1, + FXMVECTOR V2, + FXMVECTOR Epsilon +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + float dx, dy, dz, dw; + + dx = fabsf(V1.vector4_f32[0] - V2.vector4_f32[0]); + dy = fabsf(V1.vector4_f32[1] - V2.vector4_f32[1]); + dz = fabsf(V1.vector4_f32[2] - V2.vector4_f32[2]); + dw = fabsf(V1.vector4_f32[3] - V2.vector4_f32[3]); + return (((dx <= Epsilon.vector4_f32[0]) && + (dy <= Epsilon.vector4_f32[1]) && + (dz <= Epsilon.vector4_f32[2]) && + (dw <= Epsilon.vector4_f32[3])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t vDelta = vsubq_f32(V1, V2); +#if defined(_MSC_VER) && !defined(__clang__) && !defined(_ARM64_DISTINCT_NEON_TYPES) + uint32x4_t vResult = vacleq_f32(vDelta, Epsilon); +#else + uint32x4_t vResult = vcleq_f32(vabsq_f32(vDelta), Epsilon); +#endif + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + // Get the difference + XMVECTOR vDelta = _mm_sub_ps(V1, V2); + // Get the absolute value of the difference + XMVECTOR vTemp = _mm_setzero_ps(); + vTemp = _mm_sub_ps(vTemp, vDelta); + vTemp = _mm_max_ps(vTemp, vDelta); + vTemp = _mm_cmple_ps(vTemp, Epsilon); + return ((_mm_movemask_ps(vTemp) == 0xf) != 0); +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector4NotEqual +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_f32[0] != V2.vector4_f32[0]) || (V1.vector4_f32[1] != V2.vector4_f32[1]) || (V1.vector4_f32[2] != V2.vector4_f32[2]) || (V1.vector4_f32[3] != V2.vector4_f32[3])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vceqq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) != 0xFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpneq_ps(V1, V2); + return ((_mm_movemask_ps(vTemp)) != 0); +#else + return XMComparisonAnyFalse(XMVector4EqualR(V1, V2)); +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector4NotEqualInt +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_u32[0] != V2.vector4_u32[0]) || (V1.vector4_u32[1] != V2.vector4_u32[1]) || (V1.vector4_u32[2] != V2.vector4_u32[2]) || (V1.vector4_u32[3] != V2.vector4_u32[3])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vceqq_u32(vreinterpretq_u32_f32(V1), vreinterpretq_u32_f32(V2)); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) != 0xFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + __m128i vTemp = _mm_cmpeq_epi32(_mm_castps_si128(V1), _mm_castps_si128(V2)); + return ((_mm_movemask_ps(_mm_castsi128_ps(vTemp)) != 0xF) != 0); +#else + return XMComparisonAnyFalse(XMVector4EqualIntR(V1, V2)); +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector4Greater +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_f32[0] > V2.vector4_f32[0]) && (V1.vector4_f32[1] > V2.vector4_f32[1]) && (V1.vector4_f32[2] > V2.vector4_f32[2]) && (V1.vector4_f32[3] > V2.vector4_f32[3])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vcgtq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); + return ((_mm_movemask_ps(vTemp) == 0x0f) != 0); +#else + return XMComparisonAllTrue(XMVector4GreaterR(V1, V2)); +#endif +} + +//------------------------------------------------------------------------------ + +inline uint32_t XM_CALLCONV XMVector4GreaterR +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + uint32_t CR = 0; + if (V1.vector4_f32[0] > V2.vector4_f32[0] && + V1.vector4_f32[1] > V2.vector4_f32[1] && + V1.vector4_f32[2] > V2.vector4_f32[2] && + V1.vector4_f32[3] > V2.vector4_f32[3]) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (V1.vector4_f32[0] <= V2.vector4_f32[0] && + V1.vector4_f32[1] <= V2.vector4_f32[1] && + V1.vector4_f32[2] <= V2.vector4_f32[2] && + V1.vector4_f32[3] <= V2.vector4_f32[3]) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vcgtq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + + uint32_t CR = 0; + if (r == 0xFFFFFFFFU) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!r) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#elif defined(_XM_SSE_INTRINSICS_) + uint32_t CR = 0; + XMVECTOR vTemp = _mm_cmpgt_ps(V1, V2); + int iTest = _mm_movemask_ps(vTemp); + if (iTest == 0xf) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!iTest) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector4GreaterOrEqual +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_f32[0] >= V2.vector4_f32[0]) && (V1.vector4_f32[1] >= V2.vector4_f32[1]) && (V1.vector4_f32[2] >= V2.vector4_f32[2]) && (V1.vector4_f32[3] >= V2.vector4_f32[3])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vcgeq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); + return ((_mm_movemask_ps(vTemp) == 0x0f) != 0); +#else + return XMComparisonAllTrue(XMVector4GreaterOrEqualR(V1, V2)); +#endif +} + +//------------------------------------------------------------------------------ + +inline uint32_t XM_CALLCONV XMVector4GreaterOrEqualR +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + uint32_t CR = 0; + if ((V1.vector4_f32[0] >= V2.vector4_f32[0]) && + (V1.vector4_f32[1] >= V2.vector4_f32[1]) && + (V1.vector4_f32[2] >= V2.vector4_f32[2]) && + (V1.vector4_f32[3] >= V2.vector4_f32[3])) + { + CR = XM_CRMASK_CR6TRUE; + } + else if ((V1.vector4_f32[0] < V2.vector4_f32[0]) && + (V1.vector4_f32[1] < V2.vector4_f32[1]) && + (V1.vector4_f32[2] < V2.vector4_f32[2]) && + (V1.vector4_f32[3] < V2.vector4_f32[3])) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vcgeq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + uint32_t r = vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1); + + uint32_t CR = 0; + if (r == 0xFFFFFFFFU) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!r) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#elif defined(_XM_SSE_INTRINSICS_) + uint32_t CR = 0; + XMVECTOR vTemp = _mm_cmpge_ps(V1, V2); + int iTest = _mm_movemask_ps(vTemp); + if (iTest == 0x0f) + { + CR = XM_CRMASK_CR6TRUE; + } + else if (!iTest) + { + CR = XM_CRMASK_CR6FALSE; + } + return CR; +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector4Less +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_f32[0] < V2.vector4_f32[0]) && (V1.vector4_f32[1] < V2.vector4_f32[1]) && (V1.vector4_f32[2] < V2.vector4_f32[2]) && (V1.vector4_f32[3] < V2.vector4_f32[3])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vcltq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmplt_ps(V1, V2); + return ((_mm_movemask_ps(vTemp) == 0x0f) != 0); +#else + return XMComparisonAllTrue(XMVector4GreaterR(V2, V1)); +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector4LessOrEqual +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V1.vector4_f32[0] <= V2.vector4_f32[0]) && (V1.vector4_f32[1] <= V2.vector4_f32[1]) && (V1.vector4_f32[2] <= V2.vector4_f32[2]) && (V1.vector4_f32[3] <= V2.vector4_f32[3])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vResult = vcleq_f32(V1, V2); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vResult)), vget_high_u8(vreinterpretq_u8_u32(vResult))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp = _mm_cmple_ps(V1, V2); + return ((_mm_movemask_ps(vTemp) == 0x0f) != 0); +#else + return XMComparisonAllTrue(XMVector4GreaterOrEqualR(V2, V1)); +#endif +} + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector4InBounds +( + FXMVECTOR V, + FXMVECTOR Bounds +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (((V.vector4_f32[0] <= Bounds.vector4_f32[0] && V.vector4_f32[0] >= -Bounds.vector4_f32[0]) && + (V.vector4_f32[1] <= Bounds.vector4_f32[1] && V.vector4_f32[1] >= -Bounds.vector4_f32[1]) && + (V.vector4_f32[2] <= Bounds.vector4_f32[2] && V.vector4_f32[2] >= -Bounds.vector4_f32[2]) && + (V.vector4_f32[3] <= Bounds.vector4_f32[3] && V.vector4_f32[3] >= -Bounds.vector4_f32[3])) != 0); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Test if less than or equal + uint32x4_t ivTemp1 = vcleq_f32(V, Bounds); + // Negate the bounds + float32x4_t vTemp2 = vnegq_f32(Bounds); + // Test if greater or equal (Reversed) + uint32x4_t ivTemp2 = vcleq_f32(vTemp2, V); + // Blend answers + ivTemp1 = vandq_u32(ivTemp1, ivTemp2); + // in bounds? + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(ivTemp1)), vget_high_u8(vreinterpretq_u8_u32(ivTemp1))); + uint16x4x2_t vTemp3 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return (vget_lane_u32(vreinterpret_u32_u16(vTemp3.val[1]), 1) == 0xFFFFFFFFU); +#elif defined(_XM_SSE_INTRINSICS_) + // Test if less than or equal + XMVECTOR vTemp1 = _mm_cmple_ps(V, Bounds); + // Negate the bounds + XMVECTOR vTemp2 = _mm_mul_ps(Bounds, g_XMNegativeOne); + // Test if greater or equal (Reversed) + vTemp2 = _mm_cmple_ps(vTemp2, V); + // Blend answers + vTemp1 = _mm_and_ps(vTemp1, vTemp2); + // All in bounds? + return ((_mm_movemask_ps(vTemp1) == 0x0f) != 0); +#else + return XMComparisonAllInBounds(XMVector4InBoundsR(V, Bounds)); +#endif +} + +//------------------------------------------------------------------------------ + +#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) +#pragma float_control(push) +#pragma float_control(precise, on) +#endif + +inline bool XM_CALLCONV XMVector4IsNaN(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + return (XMISNAN(V.vector4_f32[0]) || + XMISNAN(V.vector4_f32[1]) || + XMISNAN(V.vector4_f32[2]) || + XMISNAN(V.vector4_f32[3])); +#elif defined(_XM_ARM_NEON_INTRINSICS_) +#if defined(__clang__) && defined(__FINITE_MATH_ONLY__) + return isnan(vgetq_lane_f32(V, 0)) || isnan(vgetq_lane_f32(V, 1)) || isnan(vgetq_lane_f32(V, 2)) || isnan(vgetq_lane_f32(V, 3)); +#else +// Test against itself. NaN is always not equal + uint32x4_t vTempNan = vceqq_f32(V, V); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTempNan)), vget_high_u8(vreinterpretq_u8_u32(vTempNan))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + // If any are NaN, the mask is zero + return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) != 0xFFFFFFFFU); +#endif +#elif defined(_XM_SSE_INTRINSICS_) +#if defined(__clang__) && defined(__FINITE_MATH_ONLY__) + XM_ALIGNED_DATA(16) float tmp[4]; + _mm_store_ps(tmp, V); + return isnan(tmp[0]) || isnan(tmp[1]) || isnan(tmp[2]) || isnan(tmp[3]); +#else +// Test against itself. NaN is always not equal + XMVECTOR vTempNan = _mm_cmpneq_ps(V, V); + // If any are NaN, the mask is non-zero + return (_mm_movemask_ps(vTempNan) != 0); +#endif +#endif +} + +#if !defined(_XM_NO_INTRINSICS_) && defined(_MSC_VER) && !defined(__INTEL_COMPILER) +#pragma float_control(pop) +#endif + +//------------------------------------------------------------------------------ + +inline bool XM_CALLCONV XMVector4IsInfinite(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + return (XMISINF(V.vector4_f32[0]) || + XMISINF(V.vector4_f32[1]) || + XMISINF(V.vector4_f32[2]) || + XMISINF(V.vector4_f32[3])); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Mask off the sign bit + uint32x4_t vTempInf = vandq_u32(vreinterpretq_u32_f32(V), g_XMAbsMask); + // Compare to infinity + vTempInf = vceqq_f32(vreinterpretq_f32_u32(vTempInf), g_XMInfinity); + // If any are infinity, the signs are true. + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(vTempInf)), vget_high_u8(vreinterpretq_u8_u32(vTempInf))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + return (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) != 0); +#elif defined(_XM_SSE_INTRINSICS_) + // Mask off the sign bit + XMVECTOR vTemp = _mm_and_ps(V, g_XMAbsMask); + // Compare to infinity + vTemp = _mm_cmpeq_ps(vTemp, g_XMInfinity); + // If any are infinity, the signs are true. + return (_mm_movemask_ps(vTemp) != 0); +#endif +} + +//------------------------------------------------------------------------------ +// Computation operations +//------------------------------------------------------------------------------ + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector4Dot +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORF32 Result; + Result.f[0] = + Result.f[1] = + Result.f[2] = + Result.f[3] = V1.vector4_f32[0] * V2.vector4_f32[0] + V1.vector4_f32[1] * V2.vector4_f32[1] + V1.vector4_f32[2] * V2.vector4_f32[2] + V1.vector4_f32[3] * V2.vector4_f32[3]; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t vTemp = vmulq_f32(V1, V2); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vadd_f32(v1, v2); + v1 = vpadd_f32(v1, v1); + return vcombine_f32(v1, v1); +#elif defined(_XM_SSE4_INTRINSICS_) + return _mm_dp_ps(V1, V2, 0xff); +#elif defined(_XM_SSE3_INTRINSICS_) + XMVECTOR vTemp = _mm_mul_ps(V1, V2); + vTemp = _mm_hadd_ps(vTemp, vTemp); + return _mm_hadd_ps(vTemp, vTemp); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vTemp2 = V2; + XMVECTOR vTemp = _mm_mul_ps(V1, vTemp2); + vTemp2 = _mm_shuffle_ps(vTemp2, vTemp, _MM_SHUFFLE(1, 0, 0, 0)); // Copy X to the Z position and Y to the W position + vTemp2 = _mm_add_ps(vTemp2, vTemp); // Add Z = X+Z; W = Y+W; + vTemp = _mm_shuffle_ps(vTemp, vTemp2, _MM_SHUFFLE(0, 3, 0, 0)); // Copy W to the Z position + vTemp = _mm_add_ps(vTemp, vTemp2); // Add Z and W together + return XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(2, 2, 2, 2)); // Splat Z and return +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector4Cross +( + FXMVECTOR V1, + FXMVECTOR V2, + FXMVECTOR V3 +) noexcept +{ + // [ ((v2.z*v3.w-v2.w*v3.z)*v1.y)-((v2.y*v3.w-v2.w*v3.y)*v1.z)+((v2.y*v3.z-v2.z*v3.y)*v1.w), + // ((v2.w*v3.z-v2.z*v3.w)*v1.x)-((v2.w*v3.x-v2.x*v3.w)*v1.z)+((v2.z*v3.x-v2.x*v3.z)*v1.w), + // ((v2.y*v3.w-v2.w*v3.y)*v1.x)-((v2.x*v3.w-v2.w*v3.x)*v1.y)+((v2.x*v3.y-v2.y*v3.x)*v1.w), + // ((v2.z*v3.y-v2.y*v3.z)*v1.x)-((v2.z*v3.x-v2.x*v3.z)*v1.y)+((v2.y*v3.x-v2.x*v3.y)*v1.z) ] + +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORF32 Result = { { { + (((V2.vector4_f32[2] * V3.vector4_f32[3]) - (V2.vector4_f32[3] * V3.vector4_f32[2])) * V1.vector4_f32[1]) - (((V2.vector4_f32[1] * V3.vector4_f32[3]) - (V2.vector4_f32[3] * V3.vector4_f32[1])) * V1.vector4_f32[2]) + (((V2.vector4_f32[1] * V3.vector4_f32[2]) - (V2.vector4_f32[2] * V3.vector4_f32[1])) * V1.vector4_f32[3]), + (((V2.vector4_f32[3] * V3.vector4_f32[2]) - (V2.vector4_f32[2] * V3.vector4_f32[3])) * V1.vector4_f32[0]) - (((V2.vector4_f32[3] * V3.vector4_f32[0]) - (V2.vector4_f32[0] * V3.vector4_f32[3])) * V1.vector4_f32[2]) + (((V2.vector4_f32[2] * V3.vector4_f32[0]) - (V2.vector4_f32[0] * V3.vector4_f32[2])) * V1.vector4_f32[3]), + (((V2.vector4_f32[1] * V3.vector4_f32[3]) - (V2.vector4_f32[3] * V3.vector4_f32[1])) * V1.vector4_f32[0]) - (((V2.vector4_f32[0] * V3.vector4_f32[3]) - (V2.vector4_f32[3] * V3.vector4_f32[0])) * V1.vector4_f32[1]) + (((V2.vector4_f32[0] * V3.vector4_f32[1]) - (V2.vector4_f32[1] * V3.vector4_f32[0])) * V1.vector4_f32[3]), + (((V2.vector4_f32[2] * V3.vector4_f32[1]) - (V2.vector4_f32[1] * V3.vector4_f32[2])) * V1.vector4_f32[0]) - (((V2.vector4_f32[2] * V3.vector4_f32[0]) - (V2.vector4_f32[0] * V3.vector4_f32[2])) * V1.vector4_f32[1]) + (((V2.vector4_f32[1] * V3.vector4_f32[0]) - (V2.vector4_f32[0] * V3.vector4_f32[1])) * V1.vector4_f32[2]), + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + const uint32x2_t select = vget_low_u32(g_XMMaskX); + + // Term1: V2zwyz * V3wzwy + const float32x2_t v2xy = vget_low_f32(V2); + const float32x2_t v2zw = vget_high_f32(V2); + const float32x2_t v2yx = vrev64_f32(v2xy); + const float32x2_t v2wz = vrev64_f32(v2zw); + const float32x2_t v2yz = vbsl_f32(select, v2yx, v2wz); + + const float32x2_t v3zw = vget_high_f32(V3); + const float32x2_t v3wz = vrev64_f32(v3zw); + const float32x2_t v3xy = vget_low_f32(V3); + const float32x2_t v3wy = vbsl_f32(select, v3wz, v3xy); + + float32x4_t vTemp1 = vcombine_f32(v2zw, v2yz); + float32x4_t vTemp2 = vcombine_f32(v3wz, v3wy); + XMVECTOR vResult = vmulq_f32(vTemp1, vTemp2); + + // - V2wzwy * V3zwyz + const float32x2_t v2wy = vbsl_f32(select, v2wz, v2xy); + + const float32x2_t v3yx = vrev64_f32(v3xy); + const float32x2_t v3yz = vbsl_f32(select, v3yx, v3wz); + + vTemp1 = vcombine_f32(v2wz, v2wy); + vTemp2 = vcombine_f32(v3zw, v3yz); + vResult = vmlsq_f32(vResult, vTemp1, vTemp2); + + // term1 * V1yxxx + const float32x2_t v1xy = vget_low_f32(V1); + const float32x2_t v1yx = vrev64_f32(v1xy); + + vTemp1 = vcombine_f32(v1yx, vdup_lane_f32(v1yx, 1)); + vResult = vmulq_f32(vResult, vTemp1); + + // Term2: V2ywxz * V3wxwx + const float32x2_t v2yw = vrev64_f32(v2wy); + const float32x2_t v2xz = vbsl_f32(select, v2xy, v2wz); + + const float32x2_t v3wx = vbsl_f32(select, v3wz, v3yx); + + vTemp1 = vcombine_f32(v2yw, v2xz); + vTemp2 = vcombine_f32(v3wx, v3wx); + float32x4_t vTerm = vmulq_f32(vTemp1, vTemp2); + + // - V2wxwx * V3ywxz + const float32x2_t v2wx = vbsl_f32(select, v2wz, v2yx); + + const float32x2_t v3yw = vrev64_f32(v3wy); + const float32x2_t v3xz = vbsl_f32(select, v3xy, v3wz); + + vTemp1 = vcombine_f32(v2wx, v2wx); + vTemp2 = vcombine_f32(v3yw, v3xz); + vTerm = vmlsq_f32(vTerm, vTemp1, vTemp2); + + // vResult - term2 * V1zzyy + const float32x2_t v1zw = vget_high_f32(V1); + + vTemp1 = vcombine_f32(vdup_lane_f32(v1zw, 0), vdup_lane_f32(v1yx, 0)); + vResult = vmlsq_f32(vResult, vTerm, vTemp1); + + // Term3: V2yzxy * V3zxyx + const float32x2_t v3zx = vrev64_f32(v3xz); + + vTemp1 = vcombine_f32(v2yz, v2xy); + vTemp2 = vcombine_f32(v3zx, v3yx); + vTerm = vmulq_f32(vTemp1, vTemp2); + + // - V2zxyx * V3yzxy + const float32x2_t v2zx = vrev64_f32(v2xz); + + vTemp1 = vcombine_f32(v2zx, v2yx); + vTemp2 = vcombine_f32(v3yz, v3xy); + vTerm = vmlsq_f32(vTerm, vTemp1, vTemp2); + + // vResult + term3 * V1wwwz + const float32x2_t v1wz = vrev64_f32(v1zw); + + vTemp1 = vcombine_f32(vdup_lane_f32(v1wz, 0), v1wz); + return vmlaq_f32(vResult, vTerm, vTemp1); +#elif defined(_XM_SSE_INTRINSICS_) + // V2zwyz * V3wzwy + XMVECTOR vResult = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 1, 3, 2)); + XMVECTOR vTemp3 = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 3, 2, 3)); + vResult = _mm_mul_ps(vResult, vTemp3); + // - V2wzwy * V3zwyz + XMVECTOR vTemp2 = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 3, 2, 3)); + vTemp3 = XM_PERMUTE_PS(vTemp3, _MM_SHUFFLE(1, 3, 0, 1)); + vResult = XM_FNMADD_PS(vTemp2, vTemp3, vResult); + // term1 * V1yxxx + XMVECTOR vTemp1 = XM_PERMUTE_PS(V1, _MM_SHUFFLE(0, 0, 0, 1)); + vResult = _mm_mul_ps(vResult, vTemp1); + + // V2ywxz * V3wxwx + vTemp2 = XM_PERMUTE_PS(V2, _MM_SHUFFLE(2, 0, 3, 1)); + vTemp3 = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 3, 0, 3)); + vTemp3 = _mm_mul_ps(vTemp3, vTemp2); + // - V2wxwx * V3ywxz + vTemp2 = XM_PERMUTE_PS(vTemp2, _MM_SHUFFLE(2, 1, 2, 1)); + vTemp1 = XM_PERMUTE_PS(V3, _MM_SHUFFLE(2, 0, 3, 1)); + vTemp3 = XM_FNMADD_PS(vTemp2, vTemp1, vTemp3); + // vResult - temp * V1zzyy + vTemp1 = XM_PERMUTE_PS(V1, _MM_SHUFFLE(1, 1, 2, 2)); + vResult = XM_FNMADD_PS(vTemp1, vTemp3, vResult); + + // V2yzxy * V3zxyx + vTemp2 = XM_PERMUTE_PS(V2, _MM_SHUFFLE(1, 0, 2, 1)); + vTemp3 = XM_PERMUTE_PS(V3, _MM_SHUFFLE(0, 1, 0, 2)); + vTemp3 = _mm_mul_ps(vTemp3, vTemp2); + // - V2zxyx * V3yzxy + vTemp2 = XM_PERMUTE_PS(vTemp2, _MM_SHUFFLE(2, 0, 2, 1)); + vTemp1 = XM_PERMUTE_PS(V3, _MM_SHUFFLE(1, 0, 2, 1)); + vTemp3 = XM_FNMADD_PS(vTemp1, vTemp2, vTemp3); + // vResult + term * V1wwwz + vTemp1 = XM_PERMUTE_PS(V1, _MM_SHUFFLE(2, 3, 3, 3)); + vResult = XM_FMADD_PS(vTemp3, vTemp1, vResult); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector4LengthSq(FXMVECTOR V) noexcept +{ + return XMVector4Dot(V, V); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector4ReciprocalLengthEst(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Result; + + Result = XMVector4LengthSq(V); + Result = XMVectorReciprocalSqrtEst(Result); + + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Dot4 + float32x4_t vTemp = vmulq_f32(V, V); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vadd_f32(v1, v2); + v1 = vpadd_f32(v1, v1); + // Reciprocal sqrt (estimate) + v2 = vrsqrte_f32(v1); + return vcombine_f32(v2, v2); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); + return _mm_rsqrt_ps(vTemp); +#elif defined(_XM_SSE3_INTRINSICS_) + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_rsqrt_ps(vLengthSq); + return vLengthSq; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product on x,y,z and w + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + // vTemp has z and w + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(3, 2, 3, 2)); + // x+z, y+w + vLengthSq = _mm_add_ps(vLengthSq, vTemp); + // x+z,x+z,x+z,y+w + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 0, 0, 0)); + // ??,??,y+w,y+w + vTemp = _mm_shuffle_ps(vTemp, vLengthSq, _MM_SHUFFLE(3, 3, 0, 0)); + // ??,??,x+z+y+w,?? + vLengthSq = _mm_add_ps(vLengthSq, vTemp); + // Splat the length + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 2, 2, 2)); + // Get the reciprocal + vLengthSq = _mm_rsqrt_ps(vLengthSq); + return vLengthSq; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector4ReciprocalLength(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Result; + + Result = XMVector4LengthSq(V); + Result = XMVectorReciprocalSqrt(Result); + + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Dot4 + float32x4_t vTemp = vmulq_f32(V, V); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vadd_f32(v1, v2); + v1 = vpadd_f32(v1, v1); + // Reciprocal sqrt + float32x2_t S0 = vrsqrte_f32(v1); + float32x2_t P0 = vmul_f32(v1, S0); + float32x2_t R0 = vrsqrts_f32(P0, S0); + float32x2_t S1 = vmul_f32(S0, R0); + float32x2_t P1 = vmul_f32(v1, S1); + float32x2_t R1 = vrsqrts_f32(P1, S1); + float32x2_t Result = vmul_f32(S1, R1); + return vcombine_f32(Result, Result); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); + XMVECTOR vLengthSq = _mm_sqrt_ps(vTemp); + return _mm_div_ps(g_XMOne, vLengthSq); +#elif defined(_XM_SSE3_INTRINSICS_) + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_sqrt_ps(vLengthSq); + vLengthSq = _mm_div_ps(g_XMOne, vLengthSq); + return vLengthSq; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product on x,y,z and w + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + // vTemp has z and w + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(3, 2, 3, 2)); + // x+z, y+w + vLengthSq = _mm_add_ps(vLengthSq, vTemp); + // x+z,x+z,x+z,y+w + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 0, 0, 0)); + // ??,??,y+w,y+w + vTemp = _mm_shuffle_ps(vTemp, vLengthSq, _MM_SHUFFLE(3, 3, 0, 0)); + // ??,??,x+z+y+w,?? + vLengthSq = _mm_add_ps(vLengthSq, vTemp); + // Splat the length + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 2, 2, 2)); + // Get the reciprocal + vLengthSq = _mm_sqrt_ps(vLengthSq); + // Accurate! + vLengthSq = _mm_div_ps(g_XMOne, vLengthSq); + return vLengthSq; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector4LengthEst(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Result; + + Result = XMVector4LengthSq(V); + Result = XMVectorSqrtEst(Result); + + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Dot4 + float32x4_t vTemp = vmulq_f32(V, V); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vadd_f32(v1, v2); + v1 = vpadd_f32(v1, v1); + const float32x2_t zero = vdup_n_f32(0); + uint32x2_t VEqualsZero = vceq_f32(v1, zero); + // Sqrt (estimate) + float32x2_t Result = vrsqrte_f32(v1); + Result = vmul_f32(v1, Result); + Result = vbsl_f32(VEqualsZero, zero, Result); + return vcombine_f32(Result, Result); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); + return _mm_sqrt_ps(vTemp); +#elif defined(_XM_SSE3_INTRINSICS_) + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_sqrt_ps(vLengthSq); + return vLengthSq; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product on x,y,z and w + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + // vTemp has z and w + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(3, 2, 3, 2)); + // x+z, y+w + vLengthSq = _mm_add_ps(vLengthSq, vTemp); + // x+z,x+z,x+z,y+w + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 0, 0, 0)); + // ??,??,y+w,y+w + vTemp = _mm_shuffle_ps(vTemp, vLengthSq, _MM_SHUFFLE(3, 3, 0, 0)); + // ??,??,x+z+y+w,?? + vLengthSq = _mm_add_ps(vLengthSq, vTemp); + // Splat the length + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 2, 2, 2)); + // Get the length + vLengthSq = _mm_sqrt_ps(vLengthSq); + return vLengthSq; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector4Length(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Result; + + Result = XMVector4LengthSq(V); + Result = XMVectorSqrt(Result); + + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Dot4 + float32x4_t vTemp = vmulq_f32(V, V); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vadd_f32(v1, v2); + v1 = vpadd_f32(v1, v1); + const float32x2_t zero = vdup_n_f32(0); + uint32x2_t VEqualsZero = vceq_f32(v1, zero); + // Sqrt + float32x2_t S0 = vrsqrte_f32(v1); + float32x2_t P0 = vmul_f32(v1, S0); + float32x2_t R0 = vrsqrts_f32(P0, S0); + float32x2_t S1 = vmul_f32(S0, R0); + float32x2_t P1 = vmul_f32(v1, S1); + float32x2_t R1 = vrsqrts_f32(P1, S1); + float32x2_t Result = vmul_f32(S1, R1); + Result = vmul_f32(v1, Result); + Result = vbsl_f32(VEqualsZero, zero, Result); + return vcombine_f32(Result, Result); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); + return _mm_sqrt_ps(vTemp); +#elif defined(_XM_SSE3_INTRINSICS_) + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_sqrt_ps(vLengthSq); + return vLengthSq; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product on x,y,z and w + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + // vTemp has z and w + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(3, 2, 3, 2)); + // x+z, y+w + vLengthSq = _mm_add_ps(vLengthSq, vTemp); + // x+z,x+z,x+z,y+w + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 0, 0, 0)); + // ??,??,y+w,y+w + vTemp = _mm_shuffle_ps(vTemp, vLengthSq, _MM_SHUFFLE(3, 3, 0, 0)); + // ??,??,x+z+y+w,?? + vLengthSq = _mm_add_ps(vLengthSq, vTemp); + // Splat the length + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 2, 2, 2)); + // Get the length + vLengthSq = _mm_sqrt_ps(vLengthSq); + return vLengthSq; +#endif +} + +//------------------------------------------------------------------------------ +// XMVector4NormalizeEst uses a reciprocal estimate and +// returns QNaN on zero and infinite vectors. + +inline XMVECTOR XM_CALLCONV XMVector4NormalizeEst(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR Result; + Result = XMVector4ReciprocalLength(V); + Result = XMVectorMultiply(V, Result); + return Result; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Dot4 + float32x4_t vTemp = vmulq_f32(V, V); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vadd_f32(v1, v2); + v1 = vpadd_f32(v1, v1); + // Reciprocal sqrt (estimate) + v2 = vrsqrte_f32(v1); + // Normalize + return vmulq_f32(V, vcombine_f32(v2, v2)); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vTemp = _mm_dp_ps(V, V, 0xff); + XMVECTOR vResult = _mm_rsqrt_ps(vTemp); + return _mm_mul_ps(vResult, V); +#elif defined(_XM_SSE3_INTRINSICS_) + XMVECTOR vDot = _mm_mul_ps(V, V); + vDot = _mm_hadd_ps(vDot, vDot); + vDot = _mm_hadd_ps(vDot, vDot); + vDot = _mm_rsqrt_ps(vDot); + vDot = _mm_mul_ps(vDot, V); + return vDot; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product on x,y,z and w + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + // vTemp has z and w + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(3, 2, 3, 2)); + // x+z, y+w + vLengthSq = _mm_add_ps(vLengthSq, vTemp); + // x+z,x+z,x+z,y+w + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 0, 0, 0)); + // ??,??,y+w,y+w + vTemp = _mm_shuffle_ps(vTemp, vLengthSq, _MM_SHUFFLE(3, 3, 0, 0)); + // ??,??,x+z+y+w,?? + vLengthSq = _mm_add_ps(vLengthSq, vTemp); + // Splat the length + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 2, 2, 2)); + // Get the reciprocal + XMVECTOR vResult = _mm_rsqrt_ps(vLengthSq); + // Reciprocal mul to perform the normalization + vResult = _mm_mul_ps(vResult, V); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector4Normalize(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + float fLength; + XMVECTOR vResult; + + vResult = XMVector4Length(V); + fLength = vResult.vector4_f32[0]; + + // Prevent divide by zero + if (fLength > 0) + { + fLength = 1.0f / fLength; + } + + vResult.vector4_f32[0] = V.vector4_f32[0] * fLength; + vResult.vector4_f32[1] = V.vector4_f32[1] * fLength; + vResult.vector4_f32[2] = V.vector4_f32[2] * fLength; + vResult.vector4_f32[3] = V.vector4_f32[3] * fLength; + return vResult; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + // Dot4 + float32x4_t vTemp = vmulq_f32(V, V); + float32x2_t v1 = vget_low_f32(vTemp); + float32x2_t v2 = vget_high_f32(vTemp); + v1 = vadd_f32(v1, v2); + v1 = vpadd_f32(v1, v1); + uint32x2_t VEqualsZero = vceq_f32(v1, vdup_n_f32(0)); + uint32x2_t VEqualsInf = vceq_f32(v1, vget_low_f32(g_XMInfinity)); + // Reciprocal sqrt (2 iterations of Newton-Raphson) + float32x2_t S0 = vrsqrte_f32(v1); + float32x2_t P0 = vmul_f32(v1, S0); + float32x2_t R0 = vrsqrts_f32(P0, S0); + float32x2_t S1 = vmul_f32(S0, R0); + float32x2_t P1 = vmul_f32(v1, S1); + float32x2_t R1 = vrsqrts_f32(P1, S1); + v2 = vmul_f32(S1, R1); + // Normalize + XMVECTOR vResult = vmulq_f32(V, vcombine_f32(v2, v2)); + vResult = vbslq_f32(vcombine_u32(VEqualsZero, VEqualsZero), vdupq_n_f32(0), vResult); + return vbslq_f32(vcombine_u32(VEqualsInf, VEqualsInf), g_XMQNaN, vResult); +#elif defined(_XM_SSE4_INTRINSICS_) + XMVECTOR vLengthSq = _mm_dp_ps(V, V, 0xff); + // Prepare for the division + XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); + // Create zero with a single instruction + XMVECTOR vZeroMask = _mm_setzero_ps(); + // Test for a divide by zero (Must be FP to detect -0.0) + vZeroMask = _mm_cmpneq_ps(vZeroMask, vResult); + // Failsafe on zero (Or epsilon) length planes + // If the length is infinity, set the elements to zero + vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); + // Divide to perform the normalization + vResult = _mm_div_ps(V, vResult); + // Any that are infinity, set to zero + vResult = _mm_and_ps(vResult, vZeroMask); + // Select qnan or result based on infinite length + XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); + XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); + vResult = _mm_or_ps(vTemp1, vTemp2); + return vResult; +#elif defined(_XM_SSE3_INTRINSICS_) + // Perform the dot product on x,y,z and w + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + vLengthSq = _mm_hadd_ps(vLengthSq, vLengthSq); + // Prepare for the division + XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); + // Create zero with a single instruction + XMVECTOR vZeroMask = _mm_setzero_ps(); + // Test for a divide by zero (Must be FP to detect -0.0) + vZeroMask = _mm_cmpneq_ps(vZeroMask, vResult); + // Failsafe on zero (Or epsilon) length planes + // If the length is infinity, set the elements to zero + vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); + // Divide to perform the normalization + vResult = _mm_div_ps(V, vResult); + // Any that are infinity, set to zero + vResult = _mm_and_ps(vResult, vZeroMask); + // Select qnan or result based on infinite length + XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); + XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); + vResult = _mm_or_ps(vTemp1, vTemp2); + return vResult; +#elif defined(_XM_SSE_INTRINSICS_) + // Perform the dot product on x,y,z and w + XMVECTOR vLengthSq = _mm_mul_ps(V, V); + // vTemp has z and w + XMVECTOR vTemp = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(3, 2, 3, 2)); + // x+z, y+w + vLengthSq = _mm_add_ps(vLengthSq, vTemp); + // x+z,x+z,x+z,y+w + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(1, 0, 0, 0)); + // ??,??,y+w,y+w + vTemp = _mm_shuffle_ps(vTemp, vLengthSq, _MM_SHUFFLE(3, 3, 0, 0)); + // ??,??,x+z+y+w,?? + vLengthSq = _mm_add_ps(vLengthSq, vTemp); + // Splat the length + vLengthSq = XM_PERMUTE_PS(vLengthSq, _MM_SHUFFLE(2, 2, 2, 2)); + // Prepare for the division + XMVECTOR vResult = _mm_sqrt_ps(vLengthSq); + // Create zero with a single instruction + XMVECTOR vZeroMask = _mm_setzero_ps(); + // Test for a divide by zero (Must be FP to detect -0.0) + vZeroMask = _mm_cmpneq_ps(vZeroMask, vResult); + // Failsafe on zero (Or epsilon) length planes + // If the length is infinity, set the elements to zero + vLengthSq = _mm_cmpneq_ps(vLengthSq, g_XMInfinity); + // Divide to perform the normalization + vResult = _mm_div_ps(V, vResult); + // Any that are infinity, set to zero + vResult = _mm_and_ps(vResult, vZeroMask); + // Select qnan or result based on infinite length + XMVECTOR vTemp1 = _mm_andnot_ps(vLengthSq, g_XMQNaN); + XMVECTOR vTemp2 = _mm_and_ps(vResult, vLengthSq); + vResult = _mm_or_ps(vTemp1, vTemp2); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector4ClampLength +( + FXMVECTOR V, + float LengthMin, + float LengthMax +) noexcept +{ + XMVECTOR ClampMax = XMVectorReplicate(LengthMax); + XMVECTOR ClampMin = XMVectorReplicate(LengthMin); + + return XMVector4ClampLengthV(V, ClampMin, ClampMax); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector4ClampLengthV +( + FXMVECTOR V, + FXMVECTOR LengthMin, + FXMVECTOR LengthMax +) noexcept +{ + assert((XMVectorGetY(LengthMin) == XMVectorGetX(LengthMin)) && (XMVectorGetZ(LengthMin) == XMVectorGetX(LengthMin)) && (XMVectorGetW(LengthMin) == XMVectorGetX(LengthMin))); + assert((XMVectorGetY(LengthMax) == XMVectorGetX(LengthMax)) && (XMVectorGetZ(LengthMax) == XMVectorGetX(LengthMax)) && (XMVectorGetW(LengthMax) == XMVectorGetX(LengthMax))); + assert(XMVector4GreaterOrEqual(LengthMin, XMVectorZero())); + assert(XMVector4GreaterOrEqual(LengthMax, XMVectorZero())); + assert(XMVector4GreaterOrEqual(LengthMax, LengthMin)); + + XMVECTOR LengthSq = XMVector4LengthSq(V); + + const XMVECTOR Zero = XMVectorZero(); + + XMVECTOR RcpLength = XMVectorReciprocalSqrt(LengthSq); + + XMVECTOR InfiniteLength = XMVectorEqualInt(LengthSq, g_XMInfinity.v); + XMVECTOR ZeroLength = XMVectorEqual(LengthSq, Zero); + + XMVECTOR Normal = XMVectorMultiply(V, RcpLength); + + XMVECTOR Length = XMVectorMultiply(LengthSq, RcpLength); + + XMVECTOR Select = XMVectorEqualInt(InfiniteLength, ZeroLength); + Length = XMVectorSelect(LengthSq, Length, Select); + Normal = XMVectorSelect(LengthSq, Normal, Select); + + XMVECTOR ControlMax = XMVectorGreater(Length, LengthMax); + XMVECTOR ControlMin = XMVectorLess(Length, LengthMin); + + XMVECTOR ClampLength = XMVectorSelect(Length, LengthMax, ControlMax); + ClampLength = XMVectorSelect(ClampLength, LengthMin, ControlMin); + + XMVECTOR Result = XMVectorMultiply(Normal, ClampLength); + + // Preserve the original vector (with no precision loss) if the length falls within the given range + XMVECTOR Control = XMVectorEqualInt(ControlMax, ControlMin); + Result = XMVectorSelect(Result, V, Control); + + return Result; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector4Reflect +( + FXMVECTOR Incident, + FXMVECTOR Normal +) noexcept +{ + // Result = Incident - (2 * dot(Incident, Normal)) * Normal + + XMVECTOR Result = XMVector4Dot(Incident, Normal); + Result = XMVectorAdd(Result, Result); + Result = XMVectorNegativeMultiplySubtract(Result, Normal, Incident); + + return Result; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector4Refract +( + FXMVECTOR Incident, + FXMVECTOR Normal, + float RefractionIndex +) noexcept +{ + XMVECTOR Index = XMVectorReplicate(RefractionIndex); + return XMVector4RefractV(Incident, Normal, Index); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector4RefractV +( + FXMVECTOR Incident, + FXMVECTOR Normal, + FXMVECTOR RefractionIndex +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR IDotN; + XMVECTOR R; + const XMVECTOR Zero = XMVectorZero(); + + // Result = RefractionIndex * Incident - Normal * (RefractionIndex * dot(Incident, Normal) + + // sqrt(1 - RefractionIndex * RefractionIndex * (1 - dot(Incident, Normal) * dot(Incident, Normal)))) + + IDotN = XMVector4Dot(Incident, Normal); + + // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) + R = XMVectorNegativeMultiplySubtract(IDotN, IDotN, g_XMOne.v); + R = XMVectorMultiply(R, RefractionIndex); + R = XMVectorNegativeMultiplySubtract(R, RefractionIndex, g_XMOne.v); + + if (XMVector4LessOrEqual(R, Zero)) + { + // Total internal reflection + return Zero; + } + else + { + XMVECTOR Result; + + // R = RefractionIndex * IDotN + sqrt(R) + R = XMVectorSqrt(R); + R = XMVectorMultiplyAdd(RefractionIndex, IDotN, R); + + // Result = RefractionIndex * Incident - Normal * R + Result = XMVectorMultiply(RefractionIndex, Incident); + Result = XMVectorNegativeMultiplySubtract(Normal, R, Result); + + return Result; + } + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + XMVECTOR IDotN = XMVector4Dot(Incident, Normal); + + // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) + float32x4_t R = vmlsq_f32(g_XMOne, IDotN, IDotN); + R = vmulq_f32(R, RefractionIndex); + R = vmlsq_f32(g_XMOne, R, RefractionIndex); + + uint32x4_t isrzero = vcleq_f32(R, g_XMZero); + uint8x8x2_t vTemp = vzip_u8(vget_low_u8(vreinterpretq_u8_u32(isrzero)), vget_high_u8(vreinterpretq_u8_u32(isrzero))); + uint16x4x2_t vTemp2 = vzip_u16(vreinterpret_u16_u8(vTemp.val[0]), vreinterpret_u16_u8(vTemp.val[1])); + + float32x4_t vResult; + if (vget_lane_u32(vreinterpret_u32_u16(vTemp2.val[1]), 1) == 0xFFFFFFFFU) + { + // Total internal reflection + vResult = g_XMZero; + } + else + { + // Sqrt(R) + float32x4_t S0 = vrsqrteq_f32(R); + float32x4_t P0 = vmulq_f32(R, S0); + float32x4_t R0 = vrsqrtsq_f32(P0, S0); + float32x4_t S1 = vmulq_f32(S0, R0); + float32x4_t P1 = vmulq_f32(R, S1); + float32x4_t R1 = vrsqrtsq_f32(P1, S1); + float32x4_t S2 = vmulq_f32(S1, R1); + R = vmulq_f32(R, S2); + // R = RefractionIndex * IDotN + sqrt(R) + R = vmlaq_f32(R, RefractionIndex, IDotN); + // Result = RefractionIndex * Incident - Normal * R + vResult = vmulq_f32(RefractionIndex, Incident); + vResult = vmlsq_f32(vResult, R, Normal); + } + return vResult; +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR IDotN = XMVector4Dot(Incident, Normal); + + // R = 1.0f - RefractionIndex * RefractionIndex * (1.0f - IDotN * IDotN) + XMVECTOR R = XM_FNMADD_PS(IDotN, IDotN, g_XMOne); + XMVECTOR R2 = _mm_mul_ps(RefractionIndex, RefractionIndex); + R = XM_FNMADD_PS(R, R2, g_XMOne); + + XMVECTOR vResult = _mm_cmple_ps(R, g_XMZero); + if (_mm_movemask_ps(vResult) == 0x0f) + { + // Total internal reflection + vResult = g_XMZero; + } + else + { + // R = RefractionIndex * IDotN + sqrt(R) + R = _mm_sqrt_ps(R); + R = XM_FMADD_PS(RefractionIndex, IDotN, R); + // Result = RefractionIndex * Incident - Normal * R + vResult = _mm_mul_ps(RefractionIndex, Incident); + vResult = XM_FNMADD_PS(R, Normal, vResult); + } + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector4Orthogonal(FXMVECTOR V) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + XMVECTORF32 Result = { { { + V.vector4_f32[2], + V.vector4_f32[3], + -V.vector4_f32[0], + -V.vector4_f32[1] + } } }; + return Result.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 Negate = { { { 1.f, 1.f, -1.f, -1.f } } }; + + float32x4_t Result = vcombine_f32(vget_high_f32(V), vget_low_f32(V)); + return vmulq_f32(Result, Negate); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 FlipZW = { { { 1.0f, 1.0f, -1.0f, -1.0f } } }; + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 0, 3, 2)); + vResult = _mm_mul_ps(vResult, FlipZW); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector4AngleBetweenNormalsEst +( + FXMVECTOR N1, + FXMVECTOR N2 +) noexcept +{ + XMVECTOR Result = XMVector4Dot(N1, N2); + Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); + Result = XMVectorACosEst(Result); + return Result; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector4AngleBetweenNormals +( + FXMVECTOR N1, + FXMVECTOR N2 +) noexcept +{ + XMVECTOR Result = XMVector4Dot(N1, N2); + Result = XMVectorClamp(Result, g_XMNegativeOne.v, g_XMOne.v); + Result = XMVectorACos(Result); + return Result; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector4AngleBetweenVectors +( + FXMVECTOR V1, + FXMVECTOR V2 +) noexcept +{ + XMVECTOR L1 = XMVector4ReciprocalLength(V1); + XMVECTOR L2 = XMVector4ReciprocalLength(V2); + + XMVECTOR Dot = XMVector4Dot(V1, V2); + + L1 = XMVectorMultiply(L1, L2); + + XMVECTOR CosAngle = XMVectorMultiply(Dot, L1); + CosAngle = XMVectorClamp(CosAngle, g_XMNegativeOne.v, g_XMOne.v); + + return XMVectorACos(CosAngle); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV XMVector4Transform +( + FXMVECTOR V, + FXMMATRIX M +) noexcept +{ +#if defined(_XM_NO_INTRINSICS_) + + float fX = (M.m[0][0] * V.vector4_f32[0]) + (M.m[1][0] * V.vector4_f32[1]) + (M.m[2][0] * V.vector4_f32[2]) + (M.m[3][0] * V.vector4_f32[3]); + float fY = (M.m[0][1] * V.vector4_f32[0]) + (M.m[1][1] * V.vector4_f32[1]) + (M.m[2][1] * V.vector4_f32[2]) + (M.m[3][1] * V.vector4_f32[3]); + float fZ = (M.m[0][2] * V.vector4_f32[0]) + (M.m[1][2] * V.vector4_f32[1]) + (M.m[2][2] * V.vector4_f32[2]) + (M.m[3][2] * V.vector4_f32[3]); + float fW = (M.m[0][3] * V.vector4_f32[0]) + (M.m[1][3] * V.vector4_f32[1]) + (M.m[2][3] * V.vector4_f32[2]) + (M.m[3][3] * V.vector4_f32[3]); + XMVECTORF32 vResult = { { { fX, fY, fZ, fW } } }; + return vResult.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x2_t VL = vget_low_f32(V); + XMVECTOR vResult = vmulq_lane_f32(M.r[0], VL, 0); // X + vResult = vmlaq_lane_f32(vResult, M.r[1], VL, 1); // Y + float32x2_t VH = vget_high_f32(V); + vResult = vmlaq_lane_f32(vResult, M.r[2], VH, 0); // Z + return vmlaq_lane_f32(vResult, M.r[3], VH, 1); // W +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); // W + vResult = _mm_mul_ps(vResult, M.r[3]); + XMVECTOR vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); // Z + vResult = XM_FMADD_PS(vTemp, M.r[2], vResult); + vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); // Y + vResult = XM_FMADD_PS(vTemp, M.r[1], vResult); + vTemp = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); // X + vResult = XM_FMADD_PS(vTemp, M.r[0], vResult); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMFLOAT4* XM_CALLCONV XMVector4TransformStream +( + XMFLOAT4* pOutputStream, + size_t OutputStride, + const XMFLOAT4* pInputStream, + size_t InputStride, + size_t VectorCount, + FXMMATRIX M +) noexcept +{ + assert(pOutputStream != nullptr); + assert(pInputStream != nullptr); + + assert(InputStride >= sizeof(XMFLOAT4)); + _Analysis_assume_(InputStride >= sizeof(XMFLOAT4)); + + assert(OutputStride >= sizeof(XMFLOAT4)); + _Analysis_assume_(OutputStride >= sizeof(XMFLOAT4)); + +#if defined(_XM_NO_INTRINSICS_) + + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row2 = M.r[2]; + const XMVECTOR row3 = M.r[3]; + + for (size_t i = 0; i < VectorCount; i++) + { + XMVECTOR V = XMLoadFloat4(reinterpret_cast(pInputVector)); + XMVECTOR W = XMVectorSplatW(V); + XMVECTOR Z = XMVectorSplatZ(V); + XMVECTOR Y = XMVectorSplatY(V); + XMVECTOR X = XMVectorSplatX(V); + + XMVECTOR Result = XMVectorMultiply(W, row3); + Result = XMVectorMultiplyAdd(Z, row2, Result); + Result = XMVectorMultiplyAdd(Y, row1, Result); + Result = XMVectorMultiplyAdd(X, row0, Result); + + #ifdef _PREFAST_ + #pragma prefast(push) + #pragma prefast(disable : 26015, "PREfast noise: Esp:1307" ) + #endif + + XMStoreFloat4(reinterpret_cast(pOutputVector), Result); + + #ifdef _PREFAST_ + #pragma prefast(pop) + #endif + + pInputVector += InputStride; + pOutputVector += OutputStride; + } + + return pOutputStream; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row2 = M.r[2]; + const XMVECTOR row3 = M.r[3]; + + size_t i = 0; + size_t four = VectorCount >> 2; + if (four > 0) + { + if ((InputStride == sizeof(XMFLOAT4)) && (OutputStride == sizeof(XMFLOAT4))) + { + for (size_t j = 0; j < four; ++j) + { + float32x4x4_t V = vld4q_f32(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT4) * 4; + + float32x2_t r = vget_low_f32(row0); + XMVECTOR vResult0 = vmulq_lane_f32(V.val[0], r, 0); // Ax + XMVECTOR vResult1 = vmulq_lane_f32(V.val[0], r, 1); // Bx + + XM_PREFETCH(pInputVector); + + r = vget_high_f32(row0); + XMVECTOR vResult2 = vmulq_lane_f32(V.val[0], r, 0); // Cx + XMVECTOR vResult3 = vmulq_lane_f32(V.val[0], r, 1); // Dx + + XM_PREFETCH(pInputVector + XM_CACHE_LINE_SIZE); + + r = vget_low_f32(row1); + vResult0 = vmlaq_lane_f32(vResult0, V.val[1], r, 0); // Ax+Ey + vResult1 = vmlaq_lane_f32(vResult1, V.val[1], r, 1); // Bx+Fy + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 2)); + + r = vget_high_f32(row1); + vResult2 = vmlaq_lane_f32(vResult2, V.val[1], r, 0); // Cx+Gy + vResult3 = vmlaq_lane_f32(vResult3, V.val[1], r, 1); // Dx+Hy + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 3)); + + r = vget_low_f32(row2); + vResult0 = vmlaq_lane_f32(vResult0, V.val[2], r, 0); // Ax+Ey+Iz + vResult1 = vmlaq_lane_f32(vResult1, V.val[2], r, 1); // Bx+Fy+Jz + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 4)); + + r = vget_high_f32(row2); + vResult2 = vmlaq_lane_f32(vResult2, V.val[2], r, 0); // Cx+Gy+Kz + vResult3 = vmlaq_lane_f32(vResult3, V.val[2], r, 1); // Dx+Hy+Lz + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 5)); + + r = vget_low_f32(row3); + vResult0 = vmlaq_lane_f32(vResult0, V.val[3], r, 0); // Ax+Ey+Iz+Mw + vResult1 = vmlaq_lane_f32(vResult1, V.val[3], r, 1); // Bx+Fy+Jz+Nw + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 6)); + + r = vget_high_f32(row3); + vResult2 = vmlaq_lane_f32(vResult2, V.val[3], r, 0); // Cx+Gy+Kz+Ow + vResult3 = vmlaq_lane_f32(vResult3, V.val[3], r, 1); // Dx+Hy+Lz+Pw + + XM_PREFETCH(pInputVector + (XM_CACHE_LINE_SIZE * 7)); + + V.val[0] = vResult0; + V.val[1] = vResult1; + V.val[2] = vResult2; + V.val[3] = vResult3; + + vst4q_f32(reinterpret_cast(pOutputVector), V); + pOutputVector += sizeof(XMFLOAT4) * 4; + + i += 4; + } + } + } + + for (; i < VectorCount; i++) + { + XMVECTOR V = vld1q_f32(reinterpret_cast(pInputVector)); + pInputVector += InputStride; + + float32x2_t VL = vget_low_f32(V); + XMVECTOR vResult = vmulq_lane_f32(row0, VL, 0); // X + vResult = vmlaq_lane_f32(vResult, row1, VL, 1); // Y + float32x2_t VH = vget_high_f32(V); + vResult = vmlaq_lane_f32(vResult, row2, VH, 0); // Z + vResult = vmlaq_lane_f32(vResult, row3, VH, 1); // W + + vst1q_f32(reinterpret_cast(pOutputVector), vResult); + pOutputVector += OutputStride; + } + + return pOutputStream; +#elif defined(_XM_AVX2_INTRINSICS_) + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + size_t i = 0; + size_t two = VectorCount >> 1; + if (two > 0) + { + __m256 row0 = _mm256_broadcast_ps(&M.r[0]); + __m256 row1 = _mm256_broadcast_ps(&M.r[1]); + __m256 row2 = _mm256_broadcast_ps(&M.r[2]); + __m256 row3 = _mm256_broadcast_ps(&M.r[3]); + + if (InputStride == sizeof(XMFLOAT4)) + { + if (OutputStride == sizeof(XMFLOAT4)) + { + if (!(reinterpret_cast(pOutputStream) & 0x1F)) + { + // Packed input, aligned & packed output + for (size_t j = 0; j < two; ++j) + { + __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT4) * 2; + + __m256 vTempX = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); + __m256 vTempY = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); + __m256 vTempZ = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); + __m256 vTempW = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); + + vTempX = _mm256_mul_ps(vTempX, row0); + vTempY = _mm256_mul_ps(vTempY, row1); + vTempZ = _mm256_fmadd_ps(vTempZ, row2, vTempX); + vTempW = _mm256_fmadd_ps(vTempW, row3, vTempY); + vTempX = _mm256_add_ps(vTempZ, vTempW); + + XM256_STREAM_PS(reinterpret_cast(pOutputVector), vTempX); + pOutputVector += sizeof(XMFLOAT4) * 2; + + i += 2; + } + } + else + { + // Packed input, packed output + for (size_t j = 0; j < two; ++j) + { + __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT4) * 2; + + __m256 vTempX = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); + __m256 vTempY = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); + __m256 vTempZ = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); + __m256 vTempW = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); + + vTempX = _mm256_mul_ps(vTempX, row0); + vTempY = _mm256_mul_ps(vTempY, row1); + vTempZ = _mm256_fmadd_ps(vTempZ, row2, vTempX); + vTempW = _mm256_fmadd_ps(vTempW, row3, vTempY); + vTempX = _mm256_add_ps(vTempZ, vTempW); + + _mm256_storeu_ps(reinterpret_cast(pOutputVector), vTempX); + pOutputVector += sizeof(XMFLOAT4) * 2; + + i += 2; + } + } + } + else + { + // Packed input, unpacked output + for (size_t j = 0; j < two; ++j) + { + __m256 VV = _mm256_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += sizeof(XMFLOAT4) * 2; + + __m256 vTempX = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(0, 0, 0, 0)); + __m256 vTempY = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(1, 1, 1, 1)); + __m256 vTempZ = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(2, 2, 2, 2)); + __m256 vTempW = _mm256_shuffle_ps(VV, VV, _MM_SHUFFLE(3, 3, 3, 3)); + + vTempX = _mm256_mul_ps(vTempX, row0); + vTempY = _mm256_mul_ps(vTempY, row1); + vTempZ = _mm256_fmadd_ps(vTempZ, row2, vTempX); + vTempW = _mm256_fmadd_ps(vTempW, row3, vTempY); + vTempX = _mm256_add_ps(vTempZ, vTempW); + + _mm_storeu_ps(reinterpret_cast(pOutputVector), _mm256_castps256_ps128(vTempX)); + pOutputVector += OutputStride; + + _mm_storeu_ps(reinterpret_cast(pOutputVector), _mm256_extractf128_ps(vTempX, 1)); + pOutputVector += OutputStride; + i += 2; + } + } + } + } + + if (i < VectorCount) + { + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row2 = M.r[2]; + const XMVECTOR row3 = M.r[3]; + + for (; i < VectorCount; i++) + { + __m128 V = _mm_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += InputStride; + + XMVECTOR vTempX = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + XMVECTOR vTempY = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR vTempZ = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR vTempW = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); + + vTempX = _mm_mul_ps(vTempX, row0); + vTempY = _mm_mul_ps(vTempY, row1); + vTempZ = XM_FMADD_PS(vTempZ, row2, vTempX); + vTempW = XM_FMADD_PS(vTempW, row3, vTempY); + vTempX = _mm_add_ps(vTempZ, vTempW); + + _mm_storeu_ps(reinterpret_cast(pOutputVector), vTempX); + pOutputVector += OutputStride; + } + } + + XM_SFENCE(); + + return pOutputStream; +#elif defined(_XM_SSE_INTRINSICS_) + auto pInputVector = reinterpret_cast(pInputStream); + auto pOutputVector = reinterpret_cast(pOutputStream); + + const XMVECTOR row0 = M.r[0]; + const XMVECTOR row1 = M.r[1]; + const XMVECTOR row2 = M.r[2]; + const XMVECTOR row3 = M.r[3]; + + if (!(reinterpret_cast(pOutputStream) & 0xF) && !(OutputStride & 0xF)) + { + if (!(reinterpret_cast(pInputStream) & 0xF) && !(InputStride & 0xF)) + { + // Aligned input, aligned output + for (size_t i = 0; i < VectorCount; i++) + { + __m128 V = _mm_load_ps(reinterpret_cast(pInputVector)); + pInputVector += InputStride; + + XMVECTOR vTempX = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + XMVECTOR vTempY = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR vTempZ = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR vTempW = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); + + vTempX = _mm_mul_ps(vTempX, row0); + vTempY = _mm_mul_ps(vTempY, row1); + vTempZ = XM_FMADD_PS(vTempZ, row2, vTempX); + vTempW = XM_FMADD_PS(vTempW, row3, vTempY); + vTempX = _mm_add_ps(vTempZ, vTempW); + + XM_STREAM_PS(reinterpret_cast(pOutputVector), vTempX); + pOutputVector += OutputStride; + } + } + else + { + // Unaligned input, aligned output + for (size_t i = 0; i < VectorCount; i++) + { + __m128 V = _mm_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += InputStride; + + XMVECTOR vTempX = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + XMVECTOR vTempY = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR vTempZ = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR vTempW = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); + + vTempX = _mm_mul_ps(vTempX, row0); + vTempY = _mm_mul_ps(vTempY, row1); + vTempZ = XM_FMADD_PS(vTempZ, row2, vTempX); + vTempW = XM_FMADD_PS(vTempW, row3, vTempY); + vTempX = _mm_add_ps(vTempZ, vTempW); + + XM_STREAM_PS(reinterpret_cast(pOutputVector), vTempX); + pOutputVector += OutputStride; + } + } + } + else + { + if (!(reinterpret_cast(pInputStream) & 0xF) && !(InputStride & 0xF)) + { + // Aligned input, unaligned output + for (size_t i = 0; i < VectorCount; i++) + { + __m128 V = _mm_load_ps(reinterpret_cast(pInputVector)); + pInputVector += InputStride; + + XMVECTOR vTempX = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + XMVECTOR vTempY = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR vTempZ = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR vTempW = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); + + vTempX = _mm_mul_ps(vTempX, row0); + vTempY = _mm_mul_ps(vTempY, row1); + vTempZ = XM_FMADD_PS(vTempZ, row2, vTempX); + vTempW = XM_FMADD_PS(vTempW, row3, vTempY); + vTempX = _mm_add_ps(vTempZ, vTempW); + + _mm_storeu_ps(reinterpret_cast(pOutputVector), vTempX); + pOutputVector += OutputStride; + } + } + else + { + // Unaligned input, unaligned output + for (size_t i = 0; i < VectorCount; i++) + { + __m128 V = _mm_loadu_ps(reinterpret_cast(pInputVector)); + pInputVector += InputStride; + + XMVECTOR vTempX = XM_PERMUTE_PS(V, _MM_SHUFFLE(0, 0, 0, 0)); + XMVECTOR vTempY = XM_PERMUTE_PS(V, _MM_SHUFFLE(1, 1, 1, 1)); + XMVECTOR vTempZ = XM_PERMUTE_PS(V, _MM_SHUFFLE(2, 2, 2, 2)); + XMVECTOR vTempW = XM_PERMUTE_PS(V, _MM_SHUFFLE(3, 3, 3, 3)); + + vTempX = _mm_mul_ps(vTempX, row0); + vTempY = _mm_mul_ps(vTempY, row1); + vTempZ = XM_FMADD_PS(vTempZ, row2, vTempX); + vTempW = XM_FMADD_PS(vTempW, row3, vTempY); + vTempX = _mm_add_ps(vTempZ, vTempW); + + _mm_storeu_ps(reinterpret_cast(pOutputVector), vTempX); + pOutputVector += OutputStride; + } + } + } + + XM_SFENCE(); + + return pOutputStream; +#endif +} + +/**************************************************************************** + * + * XMVECTOR operators + * + ****************************************************************************/ + +#ifndef _XM_NO_XMVECTOR_OVERLOADS_ + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV operator+ (FXMVECTOR V) noexcept +{ + return V; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV operator- (FXMVECTOR V) noexcept +{ + return XMVectorNegate(V); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR& XM_CALLCONV operator+= +( + XMVECTOR& V1, + FXMVECTOR V2 + ) noexcept +{ + V1 = XMVectorAdd(V1, V2); + return V1; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR& XM_CALLCONV operator-= +( + XMVECTOR& V1, + FXMVECTOR V2 + ) noexcept +{ + V1 = XMVectorSubtract(V1, V2); + return V1; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR& XM_CALLCONV operator*= +( + XMVECTOR& V1, + FXMVECTOR V2 + ) noexcept +{ + V1 = XMVectorMultiply(V1, V2); + return V1; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR& XM_CALLCONV operator/= +( + XMVECTOR& V1, + FXMVECTOR V2 + ) noexcept +{ + V1 = XMVectorDivide(V1, V2); + return V1; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR& operator*= +( + XMVECTOR& V, + const float S + ) noexcept +{ + V = XMVectorScale(V, S); + return V; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR& operator/= +( + XMVECTOR& V, + const float S + ) noexcept +{ + XMVECTOR vS = XMVectorReplicate(S); + V = XMVectorDivide(V, vS); + return V; +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV operator+ +( + FXMVECTOR V1, + FXMVECTOR V2 + ) noexcept +{ + return XMVectorAdd(V1, V2); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV operator- +( + FXMVECTOR V1, + FXMVECTOR V2 + ) noexcept +{ + return XMVectorSubtract(V1, V2); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV operator* +( + FXMVECTOR V1, + FXMVECTOR V2 + ) noexcept +{ + return XMVectorMultiply(V1, V2); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV operator/ +( + FXMVECTOR V1, + FXMVECTOR V2 + ) noexcept +{ + return XMVectorDivide(V1, V2); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV operator* +( + FXMVECTOR V, + const float S + ) noexcept +{ + return XMVectorScale(V, S); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV operator/ +( + FXMVECTOR V, + const float S + ) noexcept +{ + XMVECTOR vS = XMVectorReplicate(S); + return XMVectorDivide(V, vS); +} + +//------------------------------------------------------------------------------ + +inline XMVECTOR XM_CALLCONV operator* +( + float S, + FXMVECTOR V + ) noexcept +{ + return XMVectorScale(V, S); +} + +#endif /* !_XM_NO_XMVECTOR_OVERLOADS_ */ + +#if defined(_XM_NO_INTRINSICS_) +#undef XMISNAN +#undef XMISINF +#endif + +#if defined(_XM_SSE_INTRINSICS_) +#undef XM3UNPACK3INTO4 +#undef XM3PACK4INTO3 +#endif + diff --git a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXPackedVector.h b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXPackedVector.h similarity index 97% rename from Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXPackedVector.h rename to Minecraft.Client/Linux/Stubs/DirectXMath/DirectXPackedVector.h index 2487c67eb..4442fde21 100644 --- a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXPackedVector.h +++ b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXPackedVector.h @@ -1,1329 +1,1329 @@ -//------------------------------------------------------------------------------------- -// DirectXPackedVector.h -- SIMD C++ Math library -// -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. -// -// http://go.microsoft.com/fwlink/?LinkID=615560 -//------------------------------------------------------------------------------------- - -#pragma once - -#include "DirectXMath.h" - -namespace DirectX { - -namespace PackedVector { -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4201 4365 4324 4996) -// C4201: nonstandard extension used -// C4365: Off by default noise -// C4324: alignment padding warnings -// C4996: deprecation warnings -#endif - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wgnu-anonymous-struct" -#pragma clang diagnostic ignored "-Wnested-anon-types" -#endif - -//------------------------------------------------------------------------------ -// ARGB Color; 8-8-8-8 bit unsigned normalized integer components packed into -// a 32 bit integer. The normalized color is packed into 32 bits using 8 bit -// unsigned, normalized integers for the alpha, red, green, and blue components. -// The alpha component is stored in the most significant bits and the blue -// component in the least significant bits (A8R8G8B8): -// [32] aaaaaaaa rrrrrrrr gggggggg bbbbbbbb [0] -struct XMCOLOR { - union { - struct { - uint8_t b; // Blue: 0/255 to 255/255 - uint8_t g; // Green: 0/255 to 255/255 - uint8_t r; // Red: 0/255 to 255/255 - uint8_t a; // Alpha: 0/255 to 255/255 - }; - uint32_t c; - }; - - XMCOLOR() = default; - - XMCOLOR(const XMCOLOR&) = default; - XMCOLOR& operator=(const XMCOLOR&) = default; - - XMCOLOR(XMCOLOR&&) = default; - XMCOLOR& operator=(XMCOLOR&&) = default; - - constexpr XMCOLOR(uint32_t Color) noexcept : c(Color) {} - XMCOLOR(float _r, float _g, float _b, float _a) noexcept; - explicit XMCOLOR(_In_reads_(4) const float* pArray) noexcept; - - operator uint32_t() const noexcept { return c; } - - XMCOLOR& operator=(const uint32_t Color) noexcept { - c = Color; - return *this; - } -}; - -//------------------------------------------------------------------------------ -// 16 bit floating point number consisting of a sign bit, a 5 bit biased -// exponent, and a 10 bit mantissa -using HALF = uint16_t; - -//------------------------------------------------------------------------------ -// 2D Vector; 16 bit floating point components -struct XMHALF2 { - union { - struct { - HALF x; - HALF y; - }; - uint32_t v; - }; - - XMHALF2() = default; - - XMHALF2(const XMHALF2&) = default; - XMHALF2& operator=(const XMHALF2&) = default; - - XMHALF2(XMHALF2&&) = default; - XMHALF2& operator=(XMHALF2&&) = default; - - explicit constexpr XMHALF2(uint32_t Packed) noexcept : v(Packed) {} - constexpr XMHALF2(HALF _x, HALF _y) noexcept : x(_x), y(_y) {} - explicit XMHALF2(_In_reads_(2) const HALF* pArray) noexcept - : x(pArray[0]), y(pArray[1]) {} - XMHALF2(float _x, float _y) noexcept; - explicit XMHALF2(_In_reads_(2) const float* pArray) noexcept; - - XMHALF2& operator=(uint32_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -//------------------------------------------------------------------------------ -// 2D Vector; 16 bit signed normalized integer components -struct XMSHORTN2 { - union { - struct { - int16_t x; - int16_t y; - }; - uint32_t v; - }; - - XMSHORTN2() = default; - - XMSHORTN2(const XMSHORTN2&) = default; - XMSHORTN2& operator=(const XMSHORTN2&) = default; - - XMSHORTN2(XMSHORTN2&&) = default; - XMSHORTN2& operator=(XMSHORTN2&&) = default; - - explicit constexpr XMSHORTN2(uint32_t Packed) noexcept : v(Packed) {} - constexpr XMSHORTN2(int16_t _x, int16_t _y) noexcept : x(_x), y(_y) {} - explicit XMSHORTN2(_In_reads_(2) const int16_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]) {} - XMSHORTN2(float _x, float _y) noexcept; - explicit XMSHORTN2(_In_reads_(2) const float* pArray) noexcept; - - XMSHORTN2& operator=(uint32_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -// 2D Vector; 16 bit signed integer components -struct XMSHORT2 { - union { - struct { - int16_t x; - int16_t y; - }; - uint32_t v; - }; - - XMSHORT2() = default; - - XMSHORT2(const XMSHORT2&) = default; - XMSHORT2& operator=(const XMSHORT2&) = default; - - XMSHORT2(XMSHORT2&&) = default; - XMSHORT2& operator=(XMSHORT2&&) = default; - - explicit constexpr XMSHORT2(uint32_t Packed) noexcept : v(Packed) {} - constexpr XMSHORT2(int16_t _x, int16_t _y) noexcept : x(_x), y(_y) {} - explicit XMSHORT2(_In_reads_(2) const int16_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]) {} - XMSHORT2(float _x, float _y) noexcept; - explicit XMSHORT2(_In_reads_(2) const float* pArray) noexcept; - - XMSHORT2& operator=(uint32_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -// 2D Vector; 16 bit unsigned normalized integer components -struct XMUSHORTN2 { - union { - struct { - uint16_t x; - uint16_t y; - }; - uint32_t v; - }; - - XMUSHORTN2() = default; - - XMUSHORTN2(const XMUSHORTN2&) = default; - XMUSHORTN2& operator=(const XMUSHORTN2&) = default; - - XMUSHORTN2(XMUSHORTN2&&) = default; - XMUSHORTN2& operator=(XMUSHORTN2&&) = default; - - explicit constexpr XMUSHORTN2(uint32_t Packed) noexcept : v(Packed) {} - constexpr XMUSHORTN2(uint16_t _x, uint16_t _y) noexcept : x(_x), y(_y) {} - explicit XMUSHORTN2(_In_reads_(2) const uint16_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]) {} - XMUSHORTN2(float _x, float _y) noexcept; - explicit XMUSHORTN2(_In_reads_(2) const float* pArray) noexcept; - - XMUSHORTN2& operator=(uint32_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -// 2D Vector; 16 bit unsigned integer components -struct XMUSHORT2 { - union { - struct { - uint16_t x; - uint16_t y; - }; - uint32_t v; - }; - - XMUSHORT2() = default; - - XMUSHORT2(const XMUSHORT2&) = default; - XMUSHORT2& operator=(const XMUSHORT2&) = default; - - XMUSHORT2(XMUSHORT2&&) = default; - XMUSHORT2& operator=(XMUSHORT2&&) = default; - - explicit constexpr XMUSHORT2(uint32_t Packed) noexcept : v(Packed) {} - constexpr XMUSHORT2(uint16_t _x, uint16_t _y) noexcept : x(_x), y(_y) {} - explicit XMUSHORT2(_In_reads_(2) const uint16_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]) {} - XMUSHORT2(float _x, float _y) noexcept; - explicit XMUSHORT2(_In_reads_(2) const float* pArray) noexcept; - - XMUSHORT2& operator=(uint32_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -//------------------------------------------------------------------------------ -// 2D Vector; 8 bit signed normalized integer components -struct XMBYTEN2 { - union { - struct { - int8_t x; - int8_t y; - }; - uint16_t v; - }; - - XMBYTEN2() = default; - - XMBYTEN2(const XMBYTEN2&) = default; - XMBYTEN2& operator=(const XMBYTEN2&) = default; - - XMBYTEN2(XMBYTEN2&&) = default; - XMBYTEN2& operator=(XMBYTEN2&&) = default; - - explicit constexpr XMBYTEN2(uint16_t Packed) noexcept : v(Packed) {} - constexpr XMBYTEN2(int8_t _x, int8_t _y) noexcept : x(_x), y(_y) {} - explicit XMBYTEN2(_In_reads_(2) const int8_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]) {} - XMBYTEN2(float _x, float _y) noexcept; - explicit XMBYTEN2(_In_reads_(2) const float* pArray) noexcept; - - XMBYTEN2& operator=(uint16_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -// 2D Vector; 8 bit signed integer components -struct XMBYTE2 { - union { - struct { - int8_t x; - int8_t y; - }; - uint16_t v; - }; - - XMBYTE2() = default; - - XMBYTE2(const XMBYTE2&) = default; - XMBYTE2& operator=(const XMBYTE2&) = default; - - XMBYTE2(XMBYTE2&&) = default; - XMBYTE2& operator=(XMBYTE2&&) = default; - - explicit constexpr XMBYTE2(uint16_t Packed) noexcept : v(Packed) {} - constexpr XMBYTE2(int8_t _x, int8_t _y) noexcept : x(_x), y(_y) {} - explicit XMBYTE2(_In_reads_(2) const int8_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]) {} - XMBYTE2(float _x, float _y) noexcept; - explicit XMBYTE2(_In_reads_(2) const float* pArray) noexcept; - - XMBYTE2& operator=(uint16_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -// 2D Vector; 8 bit unsigned normalized integer components -struct XMUBYTEN2 { - union { - struct { - uint8_t x; - uint8_t y; - }; - uint16_t v; - }; - - XMUBYTEN2() = default; - - XMUBYTEN2(const XMUBYTEN2&) = default; - XMUBYTEN2& operator=(const XMUBYTEN2&) = default; - - XMUBYTEN2(XMUBYTEN2&&) = default; - XMUBYTEN2& operator=(XMUBYTEN2&&) = default; - - explicit constexpr XMUBYTEN2(uint16_t Packed) noexcept : v(Packed) {} - constexpr XMUBYTEN2(uint8_t _x, uint8_t _y) noexcept : x(_x), y(_y) {} - explicit XMUBYTEN2(_In_reads_(2) const uint8_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]) {} - XMUBYTEN2(float _x, float _y) noexcept; - explicit XMUBYTEN2(_In_reads_(2) const float* pArray) noexcept; - - XMUBYTEN2& operator=(uint16_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -// 2D Vector; 8 bit unsigned integer components -struct XMUBYTE2 { - union { - struct { - uint8_t x; - uint8_t y; - }; - uint16_t v; - }; - - XMUBYTE2() = default; - - XMUBYTE2(const XMUBYTE2&) = default; - XMUBYTE2& operator=(const XMUBYTE2&) = default; - - XMUBYTE2(XMUBYTE2&&) = default; - XMUBYTE2& operator=(XMUBYTE2&&) = default; - - explicit constexpr XMUBYTE2(uint16_t Packed) noexcept : v(Packed) {} - constexpr XMUBYTE2(uint8_t _x, uint8_t _y) noexcept : x(_x), y(_y) {} - explicit XMUBYTE2(_In_reads_(2) const uint8_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]) {} - XMUBYTE2(float _x, float _y) noexcept; - explicit XMUBYTE2(_In_reads_(2) const float* pArray) noexcept; - - XMUBYTE2& operator=(uint16_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -//------------------------------------------------------------------------------ -// 3D vector: 5/6/5 unsigned integer components -struct XMU565 { - union { - struct { - uint16_t x : 5; // 0 to 31 - uint16_t y : 6; // 0 to 63 - uint16_t z : 5; // 0 to 31 - }; - uint16_t v; - }; - - XMU565() = default; - - XMU565(const XMU565&) = default; - XMU565& operator=(const XMU565&) = default; - - XMU565(XMU565&&) = default; - XMU565& operator=(XMU565&&) = default; - - explicit constexpr XMU565(uint16_t Packed) noexcept : v(Packed) {} - constexpr XMU565(uint8_t _x, uint8_t _y, uint8_t _z) noexcept - : x(_x), y(_y), z(_z) {} - explicit XMU565(_In_reads_(3) const uint8_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]), z(pArray[2]) {} - XMU565(float _x, float _y, float _z) noexcept; - explicit XMU565(_In_reads_(3) const float* pArray) noexcept; - - operator uint16_t() const noexcept { return v; } - - XMU565& operator=(uint16_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -//------------------------------------------------------------------------------ -// 3D vector: 11/11/10 floating-point components -// The 3D vector is packed into 32 bits as follows: a 5-bit biased exponent -// and 6-bit mantissa for x component, a 5-bit biased exponent and -// 6-bit mantissa for y component, a 5-bit biased exponent and a 5-bit -// mantissa for z. The z component is stored in the most significant bits -// and the x component in the least significant bits. No sign bits so -// all partial-precision numbers are positive. -// (Z10Y11X11): [32] ZZZZZzzz zzzYYYYY yyyyyyXX XXXxxxxx [0] -struct XMFLOAT3PK { - union { - struct { - uint32_t xm : 6; // x-mantissa - uint32_t xe : 5; // x-exponent - uint32_t ym : 6; // y-mantissa - uint32_t ye : 5; // y-exponent - uint32_t zm : 5; // z-mantissa - uint32_t ze : 5; // z-exponent - }; - uint32_t v; - }; - - XMFLOAT3PK() = default; - - XMFLOAT3PK(const XMFLOAT3PK&) = default; - XMFLOAT3PK& operator=(const XMFLOAT3PK&) = default; - - XMFLOAT3PK(XMFLOAT3PK&&) = default; - XMFLOAT3PK& operator=(XMFLOAT3PK&&) = default; - - explicit constexpr XMFLOAT3PK(uint32_t Packed) noexcept : v(Packed) {} - XMFLOAT3PK(float _x, float _y, float _z) noexcept; - explicit XMFLOAT3PK(_In_reads_(3) const float* pArray) noexcept; - - operator uint32_t() const noexcept { return v; } - - XMFLOAT3PK& operator=(uint32_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -//------------------------------------------------------------------------------ -// 3D vector: 9/9/9 floating-point components with shared 5-bit exponent -// The 3D vector is packed into 32 bits as follows: a 5-bit biased exponent -// with 9-bit mantissa for the x, y, and z component. The shared exponent -// is stored in the most significant bits and the x component mantissa is in -// the least significant bits. No sign bits so all partial-precision numbers -// are positive. -// (E5Z9Y9X9): [32] EEEEEzzz zzzzzzyy yyyyyyyx xxxxxxxx [0] -struct XMFLOAT3SE { - union { - struct { - uint32_t xm : 9; // x-mantissa - uint32_t ym : 9; // y-mantissa - uint32_t zm : 9; // z-mantissa - uint32_t e : 5; // shared exponent - }; - uint32_t v; - }; - - XMFLOAT3SE() = default; - - XMFLOAT3SE(const XMFLOAT3SE&) = default; - XMFLOAT3SE& operator=(const XMFLOAT3SE&) = default; - - XMFLOAT3SE(XMFLOAT3SE&&) = default; - XMFLOAT3SE& operator=(XMFLOAT3SE&&) = default; - - explicit constexpr XMFLOAT3SE(uint32_t Packed) noexcept : v(Packed) {} - XMFLOAT3SE(float _x, float _y, float _z) noexcept; - explicit XMFLOAT3SE(_In_reads_(3) const float* pArray) noexcept; - - operator uint32_t() const noexcept { return v; } - - XMFLOAT3SE& operator=(uint32_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -//------------------------------------------------------------------------------ -// 4D Vector; 16 bit floating point components -struct XMHALF4 { - union { - struct { - HALF x; - HALF y; - HALF z; - HALF w; - }; - uint64_t v; - }; - - XMHALF4() = default; - - XMHALF4(const XMHALF4&) = default; - XMHALF4& operator=(const XMHALF4&) = default; - - XMHALF4(XMHALF4&&) = default; - XMHALF4& operator=(XMHALF4&&) = default; - - explicit constexpr XMHALF4(uint64_t Packed) noexcept : v(Packed) {} - constexpr XMHALF4(HALF _x, HALF _y, HALF _z, HALF _w) noexcept - : x(_x), y(_y), z(_z), w(_w) {} - explicit XMHALF4(_In_reads_(4) const HALF* pArray) noexcept - : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} - XMHALF4(float _x, float _y, float _z, float _w) noexcept; - explicit XMHALF4(_In_reads_(4) const float* pArray) noexcept; - - XMHALF4& operator=(uint64_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -//------------------------------------------------------------------------------ -// 4D Vector; 16 bit signed normalized integer components -struct XMSHORTN4 { - union { - struct { - int16_t x; - int16_t y; - int16_t z; - int16_t w; - }; - uint64_t v; - }; - - XMSHORTN4() = default; - - XMSHORTN4(const XMSHORTN4&) = default; - XMSHORTN4& operator=(const XMSHORTN4&) = default; - - XMSHORTN4(XMSHORTN4&&) = default; - XMSHORTN4& operator=(XMSHORTN4&&) = default; - - explicit constexpr XMSHORTN4(uint64_t Packed) noexcept : v(Packed) {} - constexpr XMSHORTN4(int16_t _x, int16_t _y, int16_t _z, int16_t _w) noexcept - : x(_x), y(_y), z(_z), w(_w) {} - explicit XMSHORTN4(_In_reads_(4) const int16_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} - XMSHORTN4(float _x, float _y, float _z, float _w) noexcept; - explicit XMSHORTN4(_In_reads_(4) const float* pArray) noexcept; - - XMSHORTN4& operator=(uint64_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -// 4D Vector; 16 bit signed integer components -struct XMSHORT4 { - union { - struct { - int16_t x; - int16_t y; - int16_t z; - int16_t w; - }; - uint64_t v; - }; - - XMSHORT4() = default; - - XMSHORT4(const XMSHORT4&) = default; - XMSHORT4& operator=(const XMSHORT4&) = default; - - XMSHORT4(XMSHORT4&&) = default; - XMSHORT4& operator=(XMSHORT4&&) = default; - - explicit constexpr XMSHORT4(uint64_t Packed) noexcept : v(Packed) {} - constexpr XMSHORT4(int16_t _x, int16_t _y, int16_t _z, int16_t _w) noexcept - : x(_x), y(_y), z(_z), w(_w) {} - explicit XMSHORT4(_In_reads_(4) const int16_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} - XMSHORT4(float _x, float _y, float _z, float _w) noexcept; - explicit XMSHORT4(_In_reads_(4) const float* pArray) noexcept; - - XMSHORT4& operator=(uint64_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -// 4D Vector; 16 bit unsigned normalized integer components -struct XMUSHORTN4 { - union { - struct { - uint16_t x; - uint16_t y; - uint16_t z; - uint16_t w; - }; - uint64_t v; - }; - - XMUSHORTN4() = default; - - XMUSHORTN4(const XMUSHORTN4&) = default; - XMUSHORTN4& operator=(const XMUSHORTN4&) = default; - - XMUSHORTN4(XMUSHORTN4&&) = default; - XMUSHORTN4& operator=(XMUSHORTN4&&) = default; - - explicit constexpr XMUSHORTN4(uint64_t Packed) noexcept : v(Packed) {} - constexpr XMUSHORTN4(uint16_t _x, uint16_t _y, uint16_t _z, - uint16_t _w) noexcept - : x(_x), y(_y), z(_z), w(_w) {} - explicit XMUSHORTN4(_In_reads_(4) const uint16_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} - XMUSHORTN4(float _x, float _y, float _z, float _w) noexcept; - explicit XMUSHORTN4(_In_reads_(4) const float* pArray) noexcept; - - XMUSHORTN4& operator=(uint64_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -// 4D Vector; 16 bit unsigned integer components -struct XMUSHORT4 { - union { - struct { - uint16_t x; - uint16_t y; - uint16_t z; - uint16_t w; - }; - uint64_t v; - }; - - XMUSHORT4() = default; - - XMUSHORT4(const XMUSHORT4&) = default; - XMUSHORT4& operator=(const XMUSHORT4&) = default; - - XMUSHORT4(XMUSHORT4&&) = default; - XMUSHORT4& operator=(XMUSHORT4&&) = default; - - explicit constexpr XMUSHORT4(uint64_t Packed) noexcept : v(Packed) {} - constexpr XMUSHORT4(uint16_t _x, uint16_t _y, uint16_t _z, - uint16_t _w) noexcept - : x(_x), y(_y), z(_z), w(_w) {} - explicit XMUSHORT4(_In_reads_(4) const uint16_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} - XMUSHORT4(float _x, float _y, float _z, float _w) noexcept; - explicit XMUSHORT4(_In_reads_(4) const float* pArray) noexcept; - - XMUSHORT4& operator=(uint32_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -//------------------------------------------------------------------------------ -// 4D Vector; 10-10-10-2 bit normalized components packed into a 32 bit integer -// The normalized 4D Vector is packed into 32 bits as follows: a 2 bit unsigned, -// normalized integer for the w component and 10 bit signed, normalized -// integers for the z, y, and x components. The w component is stored in the -// most significant bits and the x component in the least significant bits -// (W2Z10Y10X10): [32] wwzzzzzz zzzzyyyy yyyyyyxx xxxxxxxx [0] -struct XMXDECN4 { - union { - struct { - int32_t x : 10; // -511/511 to 511/511 - int32_t y : 10; // -511/511 to 511/511 - int32_t z : 10; // -511/511 to 511/511 - uint32_t w : 2; // 0/3 to 3/3 - }; - uint32_t v; - }; - - XMXDECN4() = default; - - XMXDECN4(const XMXDECN4&) = default; - XMXDECN4& operator=(const XMXDECN4&) = default; - - XMXDECN4(XMXDECN4&&) = default; - XMXDECN4& operator=(XMXDECN4&&) = default; - - explicit constexpr XMXDECN4(uint32_t Packed) : v(Packed) {} - XMXDECN4(float _x, float _y, float _z, float _w) noexcept; - explicit XMXDECN4(_In_reads_(4) const float* pArray) noexcept; - - operator uint32_t() const noexcept { return v; } - - XMXDECN4& operator=(uint32_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -// 4D Vector; 10-10-10-2 bit components packed into a 32 bit integer -// The normalized 4D Vector is packed into 32 bits as follows: a 2 bit unsigned -// integer for the w component and 10 bit signed integers for the -// z, y, and x components. The w component is stored in the -// most significant bits and the x component in the least significant bits -// (W2Z10Y10X10): [32] wwzzzzzz zzzzyyyy yyyyyyxx xxxxxxxx [0] -struct XM_DEPRECATED XMXDEC4 { - union { - struct { - int32_t x : 10; // -511 to 511 - int32_t y : 10; // -511 to 511 - int32_t z : 10; // -511 to 511 - uint32_t w : 2; // 0 to 3 - }; - uint32_t v; - }; - - XMXDEC4() = default; - - XMXDEC4(const XMXDEC4&) = default; - XMXDEC4& operator=(const XMXDEC4&) = default; - - XMXDEC4(XMXDEC4&&) = default; - XMXDEC4& operator=(XMXDEC4&&) = default; - - explicit constexpr XMXDEC4(uint32_t Packed) noexcept : v(Packed) {} - XMXDEC4(float _x, float _y, float _z, float _w) noexcept; - explicit XMXDEC4(_In_reads_(4) const float* pArray) noexcept; - - operator uint32_t() const noexcept { return v; } - - XMXDEC4& operator=(uint32_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -// 4D Vector; 10-10-10-2 bit normalized components packed into a 32 bit integer -// The normalized 4D Vector is packed into 32 bits as follows: a 2 bit signed, -// normalized integer for the w component and 10 bit signed, normalized -// integers for the z, y, and x components. The w component is stored in the -// most significant bits and the x component in the least significant bits -// (W2Z10Y10X10): [32] wwzzzzzz zzzzyyyy yyyyyyxx xxxxxxxx [0] -struct XM_DEPRECATED XMDECN4 { - union { - struct { - int32_t x : 10; // -511/511 to 511/511 - int32_t y : 10; // -511/511 to 511/511 - int32_t z : 10; // -511/511 to 511/511 - int32_t w : 2; // -1/1 to 1/1 - }; - uint32_t v; - }; - - XMDECN4() = default; - - XMDECN4(const XMDECN4&) = default; - XMDECN4& operator=(const XMDECN4&) = default; - - XMDECN4(XMDECN4&&) = default; - XMDECN4& operator=(XMDECN4&&) = default; - - explicit constexpr XMDECN4(uint32_t Packed) noexcept : v(Packed) {} - XMDECN4(float _x, float _y, float _z, float _w) noexcept; - explicit XMDECN4(_In_reads_(4) const float* pArray) noexcept; - - operator uint32_t() const noexcept { return v; } - - XMDECN4& operator=(uint32_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -// 4D Vector; 10-10-10-2 bit components packed into a 32 bit integer -// The 4D Vector is packed into 32 bits as follows: a 2 bit signed, -// integer for the w component and 10 bit signed integers for the -// z, y, and x components. The w component is stored in the -// most significant bits and the x component in the least significant bits -// (W2Z10Y10X10): [32] wwzzzzzz zzzzyyyy yyyyyyxx xxxxxxxx [0] -struct XM_DEPRECATED XMDEC4 { - union { - struct { - int32_t x : 10; // -511 to 511 - int32_t y : 10; // -511 to 511 - int32_t z : 10; // -511 to 511 - int32_t w : 2; // -1 to 1 - }; - uint32_t v; - }; - - XMDEC4() = default; - - XMDEC4(const XMDEC4&) = default; - XMDEC4& operator=(const XMDEC4&) = default; - - XMDEC4(XMDEC4&&) = default; - XMDEC4& operator=(XMDEC4&&) = default; - - explicit constexpr XMDEC4(uint32_t Packed) noexcept : v(Packed) {} - XMDEC4(float _x, float _y, float _z, float _w) noexcept; - explicit XMDEC4(_In_reads_(4) const float* pArray) noexcept; - - operator uint32_t() const noexcept { return v; } - - XMDEC4& operator=(uint32_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -// 4D Vector; 10-10-10-2 bit normalized components packed into a 32 bit integer -// The normalized 4D Vector is packed into 32 bits as follows: a 2 bit unsigned, -// normalized integer for the w component and 10 bit unsigned, normalized -// integers for the z, y, and x components. The w component is stored in the -// most significant bits and the x component in the least significant bits -// (W2Z10Y10X10): [32] wwzzzzzz zzzzyyyy yyyyyyxx xxxxxxxx [0] -struct XMUDECN4 { - union { - struct { - uint32_t x : 10; // 0/1023 to 1023/1023 - uint32_t y : 10; // 0/1023 to 1023/1023 - uint32_t z : 10; // 0/1023 to 1023/1023 - uint32_t w : 2; // 0/3 to 3/3 - }; - uint32_t v; - }; - - XMUDECN4() = default; - - XMUDECN4(const XMUDECN4&) = default; - XMUDECN4& operator=(const XMUDECN4&) = default; - - XMUDECN4(XMUDECN4&&) = default; - XMUDECN4& operator=(XMUDECN4&&) = default; - - explicit constexpr XMUDECN4(uint32_t Packed) noexcept : v(Packed) {} - XMUDECN4(float _x, float _y, float _z, float _w) noexcept; - explicit XMUDECN4(_In_reads_(4) const float* pArray) noexcept; - - operator uint32_t() const noexcept { return v; } - - XMUDECN4& operator=(uint32_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -// 4D Vector; 10-10-10-2 bit components packed into a 32 bit integer -// The 4D Vector is packed into 32 bits as follows: a 2 bit unsigned, -// integer for the w component and 10 bit unsigned integers -// for the z, y, and x components. The w component is stored in the -// most significant bits and the x component in the least significant bits -// (W2Z10Y10X10): [32] wwzzzzzz zzzzyyyy yyyyyyxx xxxxxxxx [0] -struct XMUDEC4 { - union { - struct { - uint32_t x : 10; // 0 to 1023 - uint32_t y : 10; // 0 to 1023 - uint32_t z : 10; // 0 to 1023 - uint32_t w : 2; // 0 to 3 - }; - uint32_t v; - }; - - XMUDEC4() = default; - - XMUDEC4(const XMUDEC4&) = default; - XMUDEC4& operator=(const XMUDEC4&) = default; - - XMUDEC4(XMUDEC4&&) = default; - XMUDEC4& operator=(XMUDEC4&&) = default; - - explicit constexpr XMUDEC4(uint32_t Packed) noexcept : v(Packed) {} - XMUDEC4(float _x, float _y, float _z, float _w) noexcept; - explicit XMUDEC4(_In_reads_(4) const float* pArray) noexcept; - - operator uint32_t() const noexcept { return v; } - - XMUDEC4& operator=(uint32_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -//------------------------------------------------------------------------------ -// 4D Vector; 8 bit signed normalized integer components -struct XMBYTEN4 { - union { - struct { - int8_t x; - int8_t y; - int8_t z; - int8_t w; - }; - uint32_t v; - }; - - XMBYTEN4() = default; - - XMBYTEN4(const XMBYTEN4&) = default; - XMBYTEN4& operator=(const XMBYTEN4&) = default; - - XMBYTEN4(XMBYTEN4&&) = default; - XMBYTEN4& operator=(XMBYTEN4&&) = default; - - constexpr XMBYTEN4(int8_t _x, int8_t _y, int8_t _z, int8_t _w) noexcept - : x(_x), y(_y), z(_z), w(_w) {} - explicit constexpr XMBYTEN4(uint32_t Packed) noexcept : v(Packed) {} - explicit XMBYTEN4(_In_reads_(4) const int8_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} - XMBYTEN4(float _x, float _y, float _z, float _w) noexcept; - explicit XMBYTEN4(_In_reads_(4) const float* pArray) noexcept; - - XMBYTEN4& operator=(uint32_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -// 4D Vector; 8 bit signed integer components -struct XMBYTE4 { - union { - struct { - int8_t x; - int8_t y; - int8_t z; - int8_t w; - }; - uint32_t v; - }; - - XMBYTE4() = default; - - XMBYTE4(const XMBYTE4&) = default; - XMBYTE4& operator=(const XMBYTE4&) = default; - - XMBYTE4(XMBYTE4&&) = default; - XMBYTE4& operator=(XMBYTE4&&) = default; - - constexpr XMBYTE4(int8_t _x, int8_t _y, int8_t _z, int8_t _w) noexcept - : x(_x), y(_y), z(_z), w(_w) {} - explicit constexpr XMBYTE4(uint32_t Packed) noexcept : v(Packed) {} - explicit XMBYTE4(_In_reads_(4) const int8_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} - XMBYTE4(float _x, float _y, float _z, float _w) noexcept; - explicit XMBYTE4(_In_reads_(4) const float* pArray) noexcept; - - XMBYTE4& operator=(uint32_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -// 4D Vector; 8 bit unsigned normalized integer components -struct XMUBYTEN4 { - union { - struct { - uint8_t x; - uint8_t y; - uint8_t z; - uint8_t w; - }; - uint32_t v; - }; - - XMUBYTEN4() = default; - - XMUBYTEN4(const XMUBYTEN4&) = default; - XMUBYTEN4& operator=(const XMUBYTEN4&) = default; - - XMUBYTEN4(XMUBYTEN4&&) = default; - XMUBYTEN4& operator=(XMUBYTEN4&&) = default; - - constexpr XMUBYTEN4(uint8_t _x, uint8_t _y, uint8_t _z, uint8_t _w) noexcept - : x(_x), y(_y), z(_z), w(_w) {} - explicit constexpr XMUBYTEN4(uint32_t Packed) noexcept : v(Packed) {} - explicit XMUBYTEN4(_In_reads_(4) const uint8_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} - XMUBYTEN4(float _x, float _y, float _z, float _w) noexcept; - explicit XMUBYTEN4(_In_reads_(4) const float* pArray) noexcept; - - XMUBYTEN4& operator=(uint32_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -// 4D Vector; 8 bit unsigned integer components -struct XMUBYTE4 { - union { - struct { - uint8_t x; - uint8_t y; - uint8_t z; - uint8_t w; - }; - uint32_t v; - }; - - XMUBYTE4() = default; - - XMUBYTE4(const XMUBYTE4&) = default; - XMUBYTE4& operator=(const XMUBYTE4&) = default; - - XMUBYTE4(XMUBYTE4&&) = default; - XMUBYTE4& operator=(XMUBYTE4&&) = default; - - constexpr XMUBYTE4(uint8_t _x, uint8_t _y, uint8_t _z, uint8_t _w) noexcept - : x(_x), y(_y), z(_z), w(_w) {} - explicit constexpr XMUBYTE4(uint32_t Packed) noexcept : v(Packed) {} - explicit XMUBYTE4(_In_reads_(4) const uint8_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} - XMUBYTE4(float _x, float _y, float _z, float _w) noexcept; - explicit XMUBYTE4(_In_reads_(4) const float* pArray) noexcept; - - XMUBYTE4& operator=(uint32_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -//------------------------------------------------------------------------------ -// 4D vector; 4 bit unsigned integer components -struct XMUNIBBLE4 { - union { - struct { - uint16_t x : 4; // 0 to 15 - uint16_t y : 4; // 0 to 15 - uint16_t z : 4; // 0 to 15 - uint16_t w : 4; // 0 to 15 - }; - uint16_t v; - }; - - XMUNIBBLE4() = default; - - XMUNIBBLE4(const XMUNIBBLE4&) = default; - XMUNIBBLE4& operator=(const XMUNIBBLE4&) = default; - - XMUNIBBLE4(XMUNIBBLE4&&) = default; - XMUNIBBLE4& operator=(XMUNIBBLE4&&) = default; - - explicit constexpr XMUNIBBLE4(uint16_t Packed) noexcept : v(Packed) {} - constexpr XMUNIBBLE4(uint8_t _x, uint8_t _y, uint8_t _z, - uint8_t _w) noexcept - : x(_x), y(_y), z(_z), w(_w) {} - explicit XMUNIBBLE4(_In_reads_(4) const uint8_t* pArray) noexcept - : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} - XMUNIBBLE4(float _x, float _y, float _z, float _w) noexcept; - explicit XMUNIBBLE4(_In_reads_(4) const float* pArray) noexcept; - - operator uint16_t() const noexcept { return v; } - - XMUNIBBLE4& operator=(uint16_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -//------------------------------------------------------------------------------ -// 4D vector: 5/5/5/1 unsigned integer components -struct XMU555 { - union { - struct { - uint16_t x : 5; // 0 to 31 - uint16_t y : 5; // 0 to 31 - uint16_t z : 5; // 0 to 31 - uint16_t w : 1; // 0 or 1 - }; - uint16_t v; - }; - - XMU555() = default; - - XMU555(const XMU555&) = default; - XMU555& operator=(const XMU555&) = default; - - XMU555(XMU555&&) = default; - XMU555& operator=(XMU555&&) = default; - - explicit constexpr XMU555(uint16_t Packed) noexcept : v(Packed) {} - constexpr XMU555(uint8_t _x, uint8_t _y, uint8_t _z, bool _w) noexcept - : x(_x), y(_y), z(_z), w(_w ? 0x1 : 0) {} - XMU555(_In_reads_(3) const uint8_t* pArray, _In_ bool _w) noexcept - : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(_w ? 0x1 : 0) {} - XMU555(float _x, float _y, float _z, bool _w) noexcept; - XMU555(_In_reads_(3) const float* pArray, _In_ bool _w) noexcept; - - operator uint16_t() const noexcept { return v; } - - XMU555& operator=(uint16_t Packed) noexcept { - v = Packed; - return *this; - } -}; - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -/**************************************************************************** - * - * Data conversion operations - * - ****************************************************************************/ - -float XMConvertHalfToFloat(HALF Value) noexcept; -float* XMConvertHalfToFloatStream( - _Out_writes_bytes_(sizeof(float) + - OutputStride * (HalfCount - 1)) float* pOutputStream, - _In_ size_t OutputStride, - _In_reads_bytes_(sizeof(HALF) + InputStride * (HalfCount - 1)) - const HALF* pInputStream, - _In_ size_t InputStride, _In_ size_t HalfCount) noexcept; -HALF XMConvertFloatToHalf(float Value) noexcept; -HALF* XMConvertFloatToHalfStream( - _Out_writes_bytes_(sizeof(HALF) + OutputStride * (FloatCount - 1)) - HALF* pOutputStream, - _In_ size_t OutputStride, - _In_reads_bytes_(sizeof(float) + InputStride * (FloatCount - 1)) - const float* pInputStream, - _In_ size_t InputStride, _In_ size_t FloatCount) noexcept; - -/**************************************************************************** - * - * Load operations - * - ****************************************************************************/ - -XMVECTOR XM_CALLCONV XMLoadColor(_In_ const XMCOLOR* pSource) noexcept; - -XMVECTOR XM_CALLCONV XMLoadHalf2(_In_ const XMHALF2* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadShortN2(_In_ const XMSHORTN2* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadShort2(_In_ const XMSHORT2* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadUShortN2(_In_ const XMUSHORTN2* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadUShort2(_In_ const XMUSHORT2* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadByteN2(_In_ const XMBYTEN2* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadByte2(_In_ const XMBYTE2* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadUByteN2(_In_ const XMUBYTEN2* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadUByte2(_In_ const XMUBYTE2* pSource) noexcept; - -XMVECTOR XM_CALLCONV XMLoadU565(_In_ const XMU565* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadFloat3PK(_In_ const XMFLOAT3PK* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadFloat3SE(_In_ const XMFLOAT3SE* pSource) noexcept; - -XMVECTOR XM_CALLCONV XMLoadHalf4(_In_ const XMHALF4* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadShortN4(_In_ const XMSHORTN4* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadShort4(_In_ const XMSHORT4* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadUShortN4(_In_ const XMUSHORTN4* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadUShort4(_In_ const XMUSHORT4* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadXDecN4(_In_ const XMXDECN4* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadUDecN4(_In_ const XMUDECN4* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadUDecN4_XR(_In_ const XMUDECN4* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadUDec4(_In_ const XMUDEC4* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadByteN4(_In_ const XMBYTEN4* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadByte4(_In_ const XMBYTE4* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadUByteN4(_In_ const XMUBYTEN4* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadUByte4(_In_ const XMUBYTE4* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadUNibble4(_In_ const XMUNIBBLE4* pSource) noexcept; -XMVECTOR XM_CALLCONV XMLoadU555(_In_ const XMU555* pSource) noexcept; - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4996) -// C4996: ignore deprecation warning -#endif - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -#endif - -#ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif - -XM_DEPRECATED -XMVECTOR XM_CALLCONV XMLoadDecN4(_In_ const XMDECN4* pSource) noexcept; - -XM_DEPRECATED -XMVECTOR XM_CALLCONV XMLoadDec4(_In_ const XMDEC4* pSource) noexcept; - -XM_DEPRECATED -XMVECTOR XM_CALLCONV XMLoadXDec4(_In_ const XMXDEC4* pSource) noexcept; - -#ifdef __GNUC__ -#pragma GCC diagnostic pop -#endif -#ifdef __clang__ -#pragma clang diagnostic pop -#endif -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -/**************************************************************************** - * - * Store operations - * - ****************************************************************************/ - -void XM_CALLCONV XMStoreColor(_Out_ XMCOLOR* pDestination, - _In_ FXMVECTOR V) noexcept; - -void XM_CALLCONV XMStoreHalf2(_Out_ XMHALF2* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreShortN2(_Out_ XMSHORTN2* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreShort2(_Out_ XMSHORT2* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreUShortN2(_Out_ XMUSHORTN2* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreUShort2(_Out_ XMUSHORT2* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreByteN2(_Out_ XMBYTEN2* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreByte2(_Out_ XMBYTE2* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreUByteN2(_Out_ XMUBYTEN2* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreUByte2(_Out_ XMUBYTE2* pDestination, - _In_ FXMVECTOR V) noexcept; - -void XM_CALLCONV XMStoreU565(_Out_ XMU565* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreFloat3PK(_Out_ XMFLOAT3PK* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreFloat3SE(_Out_ XMFLOAT3SE* pDestination, - _In_ FXMVECTOR V) noexcept; - -void XM_CALLCONV XMStoreHalf4(_Out_ XMHALF4* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreShortN4(_Out_ XMSHORTN4* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreShort4(_Out_ XMSHORT4* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreUShortN4(_Out_ XMUSHORTN4* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreUShort4(_Out_ XMUSHORT4* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreXDecN4(_Out_ XMXDECN4* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreUDecN4(_Out_ XMUDECN4* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreUDecN4_XR(_Out_ XMUDECN4* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreUDec4(_Out_ XMUDEC4* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreByteN4(_Out_ XMBYTEN4* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreByte4(_Out_ XMBYTE4* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreUByteN4(_Out_ XMUBYTEN4* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreUByte4(_Out_ XMUBYTE4* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreUNibble4(_Out_ XMUNIBBLE4* pDestination, - _In_ FXMVECTOR V) noexcept; -void XM_CALLCONV XMStoreU555(_Out_ XMU555* pDestination, - _In_ FXMVECTOR V) noexcept; - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4996) -// C4996: ignore deprecation warning -#endif - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -#endif - -#ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif - -XM_DEPRECATED -void XM_CALLCONV XMStoreDecN4(_Out_ XMDECN4* pDestination, - _In_ FXMVECTOR V) noexcept; - -XM_DEPRECATED -void XM_CALLCONV XMStoreDec4(_Out_ XMDEC4* pDestination, - _In_ FXMVECTOR V) noexcept; - -XM_DEPRECATED -void XM_CALLCONV XMStoreXDec4(_Out_ XMXDEC4* pDestination, - _In_ FXMVECTOR V) noexcept; - -#ifdef __GNUC__ -#pragma GCC diagnostic pop -#endif -#ifdef __clang__ -#pragma clang diagnostic pop -#endif -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -/**************************************************************************** - * - * Implementation - * - ****************************************************************************/ -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4068 4214 4204 4365 4616 6001 6101) -// C4068/4616: ignore unknown pragmas -// C4214/4204: nonstandard extension used -// C4365: Off by default noise -// C6001/6101: False positives -#endif - -#ifdef _PREFAST_ -#pragma prefast(push) -#pragma prefast(disable : 25000, "FXMVECTOR is 16 bytes") -#pragma prefast(disable : 26495, "Union initialization confuses /analyze") -#endif - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wunknown-warning-option" -#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" -#endif - -#include "DirectXPackedVector.inl" - -#ifdef __clang__ -#pragma clang diagnostic pop -#endif -#ifdef _PREFAST_ -#pragma prefast(pop) -#endif -#ifdef _MSC_VER -#pragma warning(pop) -#endif -} // namespace PackedVector - -} // namespace DirectX +//------------------------------------------------------------------------------------- +// DirectXPackedVector.h -- SIMD C++ Math library +// +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +// +// http://go.microsoft.com/fwlink/?LinkID=615560 +//------------------------------------------------------------------------------------- + +#pragma once + +#include "DirectXMath.h" + +namespace DirectX { + +namespace PackedVector { +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4201 4365 4324 4996) +// C4201: nonstandard extension used +// C4365: Off by default noise +// C4324: alignment padding warnings +// C4996: deprecation warnings +#endif + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wgnu-anonymous-struct" +#pragma clang diagnostic ignored "-Wnested-anon-types" +#endif + +//------------------------------------------------------------------------------ +// ARGB Color; 8-8-8-8 bit unsigned normalized integer components packed into +// a 32 bit integer. The normalized color is packed into 32 bits using 8 bit +// unsigned, normalized integers for the alpha, red, green, and blue components. +// The alpha component is stored in the most significant bits and the blue +// component in the least significant bits (A8R8G8B8): +// [32] aaaaaaaa rrrrrrrr gggggggg bbbbbbbb [0] +struct XMCOLOR { + union { + struct { + uint8_t b; // Blue: 0/255 to 255/255 + uint8_t g; // Green: 0/255 to 255/255 + uint8_t r; // Red: 0/255 to 255/255 + uint8_t a; // Alpha: 0/255 to 255/255 + }; + uint32_t c; + }; + + XMCOLOR() = default; + + XMCOLOR(const XMCOLOR&) = default; + XMCOLOR& operator=(const XMCOLOR&) = default; + + XMCOLOR(XMCOLOR&&) = default; + XMCOLOR& operator=(XMCOLOR&&) = default; + + constexpr XMCOLOR(uint32_t Color) noexcept : c(Color) {} + XMCOLOR(float _r, float _g, float _b, float _a) noexcept; + explicit XMCOLOR(_In_reads_(4) const float* pArray) noexcept; + + operator uint32_t() const noexcept { return c; } + + XMCOLOR& operator=(const uint32_t Color) noexcept { + c = Color; + return *this; + } +}; + +//------------------------------------------------------------------------------ +// 16 bit floating point number consisting of a sign bit, a 5 bit biased +// exponent, and a 10 bit mantissa +using HALF = uint16_t; + +//------------------------------------------------------------------------------ +// 2D Vector; 16 bit floating point components +struct XMHALF2 { + union { + struct { + HALF x; + HALF y; + }; + uint32_t v; + }; + + XMHALF2() = default; + + XMHALF2(const XMHALF2&) = default; + XMHALF2& operator=(const XMHALF2&) = default; + + XMHALF2(XMHALF2&&) = default; + XMHALF2& operator=(XMHALF2&&) = default; + + explicit constexpr XMHALF2(uint32_t Packed) noexcept : v(Packed) {} + constexpr XMHALF2(HALF _x, HALF _y) noexcept : x(_x), y(_y) {} + explicit XMHALF2(_In_reads_(2) const HALF* pArray) noexcept + : x(pArray[0]), y(pArray[1]) {} + XMHALF2(float _x, float _y) noexcept; + explicit XMHALF2(_In_reads_(2) const float* pArray) noexcept; + + XMHALF2& operator=(uint32_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +//------------------------------------------------------------------------------ +// 2D Vector; 16 bit signed normalized integer components +struct XMSHORTN2 { + union { + struct { + int16_t x; + int16_t y; + }; + uint32_t v; + }; + + XMSHORTN2() = default; + + XMSHORTN2(const XMSHORTN2&) = default; + XMSHORTN2& operator=(const XMSHORTN2&) = default; + + XMSHORTN2(XMSHORTN2&&) = default; + XMSHORTN2& operator=(XMSHORTN2&&) = default; + + explicit constexpr XMSHORTN2(uint32_t Packed) noexcept : v(Packed) {} + constexpr XMSHORTN2(int16_t _x, int16_t _y) noexcept : x(_x), y(_y) {} + explicit XMSHORTN2(_In_reads_(2) const int16_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]) {} + XMSHORTN2(float _x, float _y) noexcept; + explicit XMSHORTN2(_In_reads_(2) const float* pArray) noexcept; + + XMSHORTN2& operator=(uint32_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +// 2D Vector; 16 bit signed integer components +struct XMSHORT2 { + union { + struct { + int16_t x; + int16_t y; + }; + uint32_t v; + }; + + XMSHORT2() = default; + + XMSHORT2(const XMSHORT2&) = default; + XMSHORT2& operator=(const XMSHORT2&) = default; + + XMSHORT2(XMSHORT2&&) = default; + XMSHORT2& operator=(XMSHORT2&&) = default; + + explicit constexpr XMSHORT2(uint32_t Packed) noexcept : v(Packed) {} + constexpr XMSHORT2(int16_t _x, int16_t _y) noexcept : x(_x), y(_y) {} + explicit XMSHORT2(_In_reads_(2) const int16_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]) {} + XMSHORT2(float _x, float _y) noexcept; + explicit XMSHORT2(_In_reads_(2) const float* pArray) noexcept; + + XMSHORT2& operator=(uint32_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +// 2D Vector; 16 bit unsigned normalized integer components +struct XMUSHORTN2 { + union { + struct { + uint16_t x; + uint16_t y; + }; + uint32_t v; + }; + + XMUSHORTN2() = default; + + XMUSHORTN2(const XMUSHORTN2&) = default; + XMUSHORTN2& operator=(const XMUSHORTN2&) = default; + + XMUSHORTN2(XMUSHORTN2&&) = default; + XMUSHORTN2& operator=(XMUSHORTN2&&) = default; + + explicit constexpr XMUSHORTN2(uint32_t Packed) noexcept : v(Packed) {} + constexpr XMUSHORTN2(uint16_t _x, uint16_t _y) noexcept : x(_x), y(_y) {} + explicit XMUSHORTN2(_In_reads_(2) const uint16_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]) {} + XMUSHORTN2(float _x, float _y) noexcept; + explicit XMUSHORTN2(_In_reads_(2) const float* pArray) noexcept; + + XMUSHORTN2& operator=(uint32_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +// 2D Vector; 16 bit unsigned integer components +struct XMUSHORT2 { + union { + struct { + uint16_t x; + uint16_t y; + }; + uint32_t v; + }; + + XMUSHORT2() = default; + + XMUSHORT2(const XMUSHORT2&) = default; + XMUSHORT2& operator=(const XMUSHORT2&) = default; + + XMUSHORT2(XMUSHORT2&&) = default; + XMUSHORT2& operator=(XMUSHORT2&&) = default; + + explicit constexpr XMUSHORT2(uint32_t Packed) noexcept : v(Packed) {} + constexpr XMUSHORT2(uint16_t _x, uint16_t _y) noexcept : x(_x), y(_y) {} + explicit XMUSHORT2(_In_reads_(2) const uint16_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]) {} + XMUSHORT2(float _x, float _y) noexcept; + explicit XMUSHORT2(_In_reads_(2) const float* pArray) noexcept; + + XMUSHORT2& operator=(uint32_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +//------------------------------------------------------------------------------ +// 2D Vector; 8 bit signed normalized integer components +struct XMBYTEN2 { + union { + struct { + int8_t x; + int8_t y; + }; + uint16_t v; + }; + + XMBYTEN2() = default; + + XMBYTEN2(const XMBYTEN2&) = default; + XMBYTEN2& operator=(const XMBYTEN2&) = default; + + XMBYTEN2(XMBYTEN2&&) = default; + XMBYTEN2& operator=(XMBYTEN2&&) = default; + + explicit constexpr XMBYTEN2(uint16_t Packed) noexcept : v(Packed) {} + constexpr XMBYTEN2(int8_t _x, int8_t _y) noexcept : x(_x), y(_y) {} + explicit XMBYTEN2(_In_reads_(2) const int8_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]) {} + XMBYTEN2(float _x, float _y) noexcept; + explicit XMBYTEN2(_In_reads_(2) const float* pArray) noexcept; + + XMBYTEN2& operator=(uint16_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +// 2D Vector; 8 bit signed integer components +struct XMBYTE2 { + union { + struct { + int8_t x; + int8_t y; + }; + uint16_t v; + }; + + XMBYTE2() = default; + + XMBYTE2(const XMBYTE2&) = default; + XMBYTE2& operator=(const XMBYTE2&) = default; + + XMBYTE2(XMBYTE2&&) = default; + XMBYTE2& operator=(XMBYTE2&&) = default; + + explicit constexpr XMBYTE2(uint16_t Packed) noexcept : v(Packed) {} + constexpr XMBYTE2(int8_t _x, int8_t _y) noexcept : x(_x), y(_y) {} + explicit XMBYTE2(_In_reads_(2) const int8_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]) {} + XMBYTE2(float _x, float _y) noexcept; + explicit XMBYTE2(_In_reads_(2) const float* pArray) noexcept; + + XMBYTE2& operator=(uint16_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +// 2D Vector; 8 bit unsigned normalized integer components +struct XMUBYTEN2 { + union { + struct { + uint8_t x; + uint8_t y; + }; + uint16_t v; + }; + + XMUBYTEN2() = default; + + XMUBYTEN2(const XMUBYTEN2&) = default; + XMUBYTEN2& operator=(const XMUBYTEN2&) = default; + + XMUBYTEN2(XMUBYTEN2&&) = default; + XMUBYTEN2& operator=(XMUBYTEN2&&) = default; + + explicit constexpr XMUBYTEN2(uint16_t Packed) noexcept : v(Packed) {} + constexpr XMUBYTEN2(uint8_t _x, uint8_t _y) noexcept : x(_x), y(_y) {} + explicit XMUBYTEN2(_In_reads_(2) const uint8_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]) {} + XMUBYTEN2(float _x, float _y) noexcept; + explicit XMUBYTEN2(_In_reads_(2) const float* pArray) noexcept; + + XMUBYTEN2& operator=(uint16_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +// 2D Vector; 8 bit unsigned integer components +struct XMUBYTE2 { + union { + struct { + uint8_t x; + uint8_t y; + }; + uint16_t v; + }; + + XMUBYTE2() = default; + + XMUBYTE2(const XMUBYTE2&) = default; + XMUBYTE2& operator=(const XMUBYTE2&) = default; + + XMUBYTE2(XMUBYTE2&&) = default; + XMUBYTE2& operator=(XMUBYTE2&&) = default; + + explicit constexpr XMUBYTE2(uint16_t Packed) noexcept : v(Packed) {} + constexpr XMUBYTE2(uint8_t _x, uint8_t _y) noexcept : x(_x), y(_y) {} + explicit XMUBYTE2(_In_reads_(2) const uint8_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]) {} + XMUBYTE2(float _x, float _y) noexcept; + explicit XMUBYTE2(_In_reads_(2) const float* pArray) noexcept; + + XMUBYTE2& operator=(uint16_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +//------------------------------------------------------------------------------ +// 3D vector: 5/6/5 unsigned integer components +struct XMU565 { + union { + struct { + uint16_t x : 5; // 0 to 31 + uint16_t y : 6; // 0 to 63 + uint16_t z : 5; // 0 to 31 + }; + uint16_t v; + }; + + XMU565() = default; + + XMU565(const XMU565&) = default; + XMU565& operator=(const XMU565&) = default; + + XMU565(XMU565&&) = default; + XMU565& operator=(XMU565&&) = default; + + explicit constexpr XMU565(uint16_t Packed) noexcept : v(Packed) {} + constexpr XMU565(uint8_t _x, uint8_t _y, uint8_t _z) noexcept + : x(_x), y(_y), z(_z) {} + explicit XMU565(_In_reads_(3) const uint8_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]), z(pArray[2]) {} + XMU565(float _x, float _y, float _z) noexcept; + explicit XMU565(_In_reads_(3) const float* pArray) noexcept; + + operator uint16_t() const noexcept { return v; } + + XMU565& operator=(uint16_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +//------------------------------------------------------------------------------ +// 3D vector: 11/11/10 floating-point components +// The 3D vector is packed into 32 bits as follows: a 5-bit biased exponent +// and 6-bit mantissa for x component, a 5-bit biased exponent and +// 6-bit mantissa for y component, a 5-bit biased exponent and a 5-bit +// mantissa for z. The z component is stored in the most significant bits +// and the x component in the least significant bits. No sign bits so +// all partial-precision numbers are positive. +// (Z10Y11X11): [32] ZZZZZzzz zzzYYYYY yyyyyyXX XXXxxxxx [0] +struct XMFLOAT3PK { + union { + struct { + uint32_t xm : 6; // x-mantissa + uint32_t xe : 5; // x-exponent + uint32_t ym : 6; // y-mantissa + uint32_t ye : 5; // y-exponent + uint32_t zm : 5; // z-mantissa + uint32_t ze : 5; // z-exponent + }; + uint32_t v; + }; + + XMFLOAT3PK() = default; + + XMFLOAT3PK(const XMFLOAT3PK&) = default; + XMFLOAT3PK& operator=(const XMFLOAT3PK&) = default; + + XMFLOAT3PK(XMFLOAT3PK&&) = default; + XMFLOAT3PK& operator=(XMFLOAT3PK&&) = default; + + explicit constexpr XMFLOAT3PK(uint32_t Packed) noexcept : v(Packed) {} + XMFLOAT3PK(float _x, float _y, float _z) noexcept; + explicit XMFLOAT3PK(_In_reads_(3) const float* pArray) noexcept; + + operator uint32_t() const noexcept { return v; } + + XMFLOAT3PK& operator=(uint32_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +//------------------------------------------------------------------------------ +// 3D vector: 9/9/9 floating-point components with shared 5-bit exponent +// The 3D vector is packed into 32 bits as follows: a 5-bit biased exponent +// with 9-bit mantissa for the x, y, and z component. The shared exponent +// is stored in the most significant bits and the x component mantissa is in +// the least significant bits. No sign bits so all partial-precision numbers +// are positive. +// (E5Z9Y9X9): [32] EEEEEzzz zzzzzzyy yyyyyyyx xxxxxxxx [0] +struct XMFLOAT3SE { + union { + struct { + uint32_t xm : 9; // x-mantissa + uint32_t ym : 9; // y-mantissa + uint32_t zm : 9; // z-mantissa + uint32_t e : 5; // shared exponent + }; + uint32_t v; + }; + + XMFLOAT3SE() = default; + + XMFLOAT3SE(const XMFLOAT3SE&) = default; + XMFLOAT3SE& operator=(const XMFLOAT3SE&) = default; + + XMFLOAT3SE(XMFLOAT3SE&&) = default; + XMFLOAT3SE& operator=(XMFLOAT3SE&&) = default; + + explicit constexpr XMFLOAT3SE(uint32_t Packed) noexcept : v(Packed) {} + XMFLOAT3SE(float _x, float _y, float _z) noexcept; + explicit XMFLOAT3SE(_In_reads_(3) const float* pArray) noexcept; + + operator uint32_t() const noexcept { return v; } + + XMFLOAT3SE& operator=(uint32_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +//------------------------------------------------------------------------------ +// 4D Vector; 16 bit floating point components +struct XMHALF4 { + union { + struct { + HALF x; + HALF y; + HALF z; + HALF w; + }; + uint64_t v; + }; + + XMHALF4() = default; + + XMHALF4(const XMHALF4&) = default; + XMHALF4& operator=(const XMHALF4&) = default; + + XMHALF4(XMHALF4&&) = default; + XMHALF4& operator=(XMHALF4&&) = default; + + explicit constexpr XMHALF4(uint64_t Packed) noexcept : v(Packed) {} + constexpr XMHALF4(HALF _x, HALF _y, HALF _z, HALF _w) noexcept + : x(_x), y(_y), z(_z), w(_w) {} + explicit XMHALF4(_In_reads_(4) const HALF* pArray) noexcept + : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + XMHALF4(float _x, float _y, float _z, float _w) noexcept; + explicit XMHALF4(_In_reads_(4) const float* pArray) noexcept; + + XMHALF4& operator=(uint64_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +//------------------------------------------------------------------------------ +// 4D Vector; 16 bit signed normalized integer components +struct XMSHORTN4 { + union { + struct { + int16_t x; + int16_t y; + int16_t z; + int16_t w; + }; + uint64_t v; + }; + + XMSHORTN4() = default; + + XMSHORTN4(const XMSHORTN4&) = default; + XMSHORTN4& operator=(const XMSHORTN4&) = default; + + XMSHORTN4(XMSHORTN4&&) = default; + XMSHORTN4& operator=(XMSHORTN4&&) = default; + + explicit constexpr XMSHORTN4(uint64_t Packed) noexcept : v(Packed) {} + constexpr XMSHORTN4(int16_t _x, int16_t _y, int16_t _z, int16_t _w) noexcept + : x(_x), y(_y), z(_z), w(_w) {} + explicit XMSHORTN4(_In_reads_(4) const int16_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + XMSHORTN4(float _x, float _y, float _z, float _w) noexcept; + explicit XMSHORTN4(_In_reads_(4) const float* pArray) noexcept; + + XMSHORTN4& operator=(uint64_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +// 4D Vector; 16 bit signed integer components +struct XMSHORT4 { + union { + struct { + int16_t x; + int16_t y; + int16_t z; + int16_t w; + }; + uint64_t v; + }; + + XMSHORT4() = default; + + XMSHORT4(const XMSHORT4&) = default; + XMSHORT4& operator=(const XMSHORT4&) = default; + + XMSHORT4(XMSHORT4&&) = default; + XMSHORT4& operator=(XMSHORT4&&) = default; + + explicit constexpr XMSHORT4(uint64_t Packed) noexcept : v(Packed) {} + constexpr XMSHORT4(int16_t _x, int16_t _y, int16_t _z, int16_t _w) noexcept + : x(_x), y(_y), z(_z), w(_w) {} + explicit XMSHORT4(_In_reads_(4) const int16_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + XMSHORT4(float _x, float _y, float _z, float _w) noexcept; + explicit XMSHORT4(_In_reads_(4) const float* pArray) noexcept; + + XMSHORT4& operator=(uint64_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +// 4D Vector; 16 bit unsigned normalized integer components +struct XMUSHORTN4 { + union { + struct { + uint16_t x; + uint16_t y; + uint16_t z; + uint16_t w; + }; + uint64_t v; + }; + + XMUSHORTN4() = default; + + XMUSHORTN4(const XMUSHORTN4&) = default; + XMUSHORTN4& operator=(const XMUSHORTN4&) = default; + + XMUSHORTN4(XMUSHORTN4&&) = default; + XMUSHORTN4& operator=(XMUSHORTN4&&) = default; + + explicit constexpr XMUSHORTN4(uint64_t Packed) noexcept : v(Packed) {} + constexpr XMUSHORTN4(uint16_t _x, uint16_t _y, uint16_t _z, + uint16_t _w) noexcept + : x(_x), y(_y), z(_z), w(_w) {} + explicit XMUSHORTN4(_In_reads_(4) const uint16_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + XMUSHORTN4(float _x, float _y, float _z, float _w) noexcept; + explicit XMUSHORTN4(_In_reads_(4) const float* pArray) noexcept; + + XMUSHORTN4& operator=(uint64_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +// 4D Vector; 16 bit unsigned integer components +struct XMUSHORT4 { + union { + struct { + uint16_t x; + uint16_t y; + uint16_t z; + uint16_t w; + }; + uint64_t v; + }; + + XMUSHORT4() = default; + + XMUSHORT4(const XMUSHORT4&) = default; + XMUSHORT4& operator=(const XMUSHORT4&) = default; + + XMUSHORT4(XMUSHORT4&&) = default; + XMUSHORT4& operator=(XMUSHORT4&&) = default; + + explicit constexpr XMUSHORT4(uint64_t Packed) noexcept : v(Packed) {} + constexpr XMUSHORT4(uint16_t _x, uint16_t _y, uint16_t _z, + uint16_t _w) noexcept + : x(_x), y(_y), z(_z), w(_w) {} + explicit XMUSHORT4(_In_reads_(4) const uint16_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + XMUSHORT4(float _x, float _y, float _z, float _w) noexcept; + explicit XMUSHORT4(_In_reads_(4) const float* pArray) noexcept; + + XMUSHORT4& operator=(uint32_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +//------------------------------------------------------------------------------ +// 4D Vector; 10-10-10-2 bit normalized components packed into a 32 bit integer +// The normalized 4D Vector is packed into 32 bits as follows: a 2 bit unsigned, +// normalized integer for the w component and 10 bit signed, normalized +// integers for the z, y, and x components. The w component is stored in the +// most significant bits and the x component in the least significant bits +// (W2Z10Y10X10): [32] wwzzzzzz zzzzyyyy yyyyyyxx xxxxxxxx [0] +struct XMXDECN4 { + union { + struct { + int32_t x : 10; // -511/511 to 511/511 + int32_t y : 10; // -511/511 to 511/511 + int32_t z : 10; // -511/511 to 511/511 + uint32_t w : 2; // 0/3 to 3/3 + }; + uint32_t v; + }; + + XMXDECN4() = default; + + XMXDECN4(const XMXDECN4&) = default; + XMXDECN4& operator=(const XMXDECN4&) = default; + + XMXDECN4(XMXDECN4&&) = default; + XMXDECN4& operator=(XMXDECN4&&) = default; + + explicit constexpr XMXDECN4(uint32_t Packed) : v(Packed) {} + XMXDECN4(float _x, float _y, float _z, float _w) noexcept; + explicit XMXDECN4(_In_reads_(4) const float* pArray) noexcept; + + operator uint32_t() const noexcept { return v; } + + XMXDECN4& operator=(uint32_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +// 4D Vector; 10-10-10-2 bit components packed into a 32 bit integer +// The normalized 4D Vector is packed into 32 bits as follows: a 2 bit unsigned +// integer for the w component and 10 bit signed integers for the +// z, y, and x components. The w component is stored in the +// most significant bits and the x component in the least significant bits +// (W2Z10Y10X10): [32] wwzzzzzz zzzzyyyy yyyyyyxx xxxxxxxx [0] +struct XM_DEPRECATED XMXDEC4 { + union { + struct { + int32_t x : 10; // -511 to 511 + int32_t y : 10; // -511 to 511 + int32_t z : 10; // -511 to 511 + uint32_t w : 2; // 0 to 3 + }; + uint32_t v; + }; + + XMXDEC4() = default; + + XMXDEC4(const XMXDEC4&) = default; + XMXDEC4& operator=(const XMXDEC4&) = default; + + XMXDEC4(XMXDEC4&&) = default; + XMXDEC4& operator=(XMXDEC4&&) = default; + + explicit constexpr XMXDEC4(uint32_t Packed) noexcept : v(Packed) {} + XMXDEC4(float _x, float _y, float _z, float _w) noexcept; + explicit XMXDEC4(_In_reads_(4) const float* pArray) noexcept; + + operator uint32_t() const noexcept { return v; } + + XMXDEC4& operator=(uint32_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +// 4D Vector; 10-10-10-2 bit normalized components packed into a 32 bit integer +// The normalized 4D Vector is packed into 32 bits as follows: a 2 bit signed, +// normalized integer for the w component and 10 bit signed, normalized +// integers for the z, y, and x components. The w component is stored in the +// most significant bits and the x component in the least significant bits +// (W2Z10Y10X10): [32] wwzzzzzz zzzzyyyy yyyyyyxx xxxxxxxx [0] +struct XM_DEPRECATED XMDECN4 { + union { + struct { + int32_t x : 10; // -511/511 to 511/511 + int32_t y : 10; // -511/511 to 511/511 + int32_t z : 10; // -511/511 to 511/511 + int32_t w : 2; // -1/1 to 1/1 + }; + uint32_t v; + }; + + XMDECN4() = default; + + XMDECN4(const XMDECN4&) = default; + XMDECN4& operator=(const XMDECN4&) = default; + + XMDECN4(XMDECN4&&) = default; + XMDECN4& operator=(XMDECN4&&) = default; + + explicit constexpr XMDECN4(uint32_t Packed) noexcept : v(Packed) {} + XMDECN4(float _x, float _y, float _z, float _w) noexcept; + explicit XMDECN4(_In_reads_(4) const float* pArray) noexcept; + + operator uint32_t() const noexcept { return v; } + + XMDECN4& operator=(uint32_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +// 4D Vector; 10-10-10-2 bit components packed into a 32 bit integer +// The 4D Vector is packed into 32 bits as follows: a 2 bit signed, +// integer for the w component and 10 bit signed integers for the +// z, y, and x components. The w component is stored in the +// most significant bits and the x component in the least significant bits +// (W2Z10Y10X10): [32] wwzzzzzz zzzzyyyy yyyyyyxx xxxxxxxx [0] +struct XM_DEPRECATED XMDEC4 { + union { + struct { + int32_t x : 10; // -511 to 511 + int32_t y : 10; // -511 to 511 + int32_t z : 10; // -511 to 511 + int32_t w : 2; // -1 to 1 + }; + uint32_t v; + }; + + XMDEC4() = default; + + XMDEC4(const XMDEC4&) = default; + XMDEC4& operator=(const XMDEC4&) = default; + + XMDEC4(XMDEC4&&) = default; + XMDEC4& operator=(XMDEC4&&) = default; + + explicit constexpr XMDEC4(uint32_t Packed) noexcept : v(Packed) {} + XMDEC4(float _x, float _y, float _z, float _w) noexcept; + explicit XMDEC4(_In_reads_(4) const float* pArray) noexcept; + + operator uint32_t() const noexcept { return v; } + + XMDEC4& operator=(uint32_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +// 4D Vector; 10-10-10-2 bit normalized components packed into a 32 bit integer +// The normalized 4D Vector is packed into 32 bits as follows: a 2 bit unsigned, +// normalized integer for the w component and 10 bit unsigned, normalized +// integers for the z, y, and x components. The w component is stored in the +// most significant bits and the x component in the least significant bits +// (W2Z10Y10X10): [32] wwzzzzzz zzzzyyyy yyyyyyxx xxxxxxxx [0] +struct XMUDECN4 { + union { + struct { + uint32_t x : 10; // 0/1023 to 1023/1023 + uint32_t y : 10; // 0/1023 to 1023/1023 + uint32_t z : 10; // 0/1023 to 1023/1023 + uint32_t w : 2; // 0/3 to 3/3 + }; + uint32_t v; + }; + + XMUDECN4() = default; + + XMUDECN4(const XMUDECN4&) = default; + XMUDECN4& operator=(const XMUDECN4&) = default; + + XMUDECN4(XMUDECN4&&) = default; + XMUDECN4& operator=(XMUDECN4&&) = default; + + explicit constexpr XMUDECN4(uint32_t Packed) noexcept : v(Packed) {} + XMUDECN4(float _x, float _y, float _z, float _w) noexcept; + explicit XMUDECN4(_In_reads_(4) const float* pArray) noexcept; + + operator uint32_t() const noexcept { return v; } + + XMUDECN4& operator=(uint32_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +// 4D Vector; 10-10-10-2 bit components packed into a 32 bit integer +// The 4D Vector is packed into 32 bits as follows: a 2 bit unsigned, +// integer for the w component and 10 bit unsigned integers +// for the z, y, and x components. The w component is stored in the +// most significant bits and the x component in the least significant bits +// (W2Z10Y10X10): [32] wwzzzzzz zzzzyyyy yyyyyyxx xxxxxxxx [0] +struct XMUDEC4 { + union { + struct { + uint32_t x : 10; // 0 to 1023 + uint32_t y : 10; // 0 to 1023 + uint32_t z : 10; // 0 to 1023 + uint32_t w : 2; // 0 to 3 + }; + uint32_t v; + }; + + XMUDEC4() = default; + + XMUDEC4(const XMUDEC4&) = default; + XMUDEC4& operator=(const XMUDEC4&) = default; + + XMUDEC4(XMUDEC4&&) = default; + XMUDEC4& operator=(XMUDEC4&&) = default; + + explicit constexpr XMUDEC4(uint32_t Packed) noexcept : v(Packed) {} + XMUDEC4(float _x, float _y, float _z, float _w) noexcept; + explicit XMUDEC4(_In_reads_(4) const float* pArray) noexcept; + + operator uint32_t() const noexcept { return v; } + + XMUDEC4& operator=(uint32_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +//------------------------------------------------------------------------------ +// 4D Vector; 8 bit signed normalized integer components +struct XMBYTEN4 { + union { + struct { + int8_t x; + int8_t y; + int8_t z; + int8_t w; + }; + uint32_t v; + }; + + XMBYTEN4() = default; + + XMBYTEN4(const XMBYTEN4&) = default; + XMBYTEN4& operator=(const XMBYTEN4&) = default; + + XMBYTEN4(XMBYTEN4&&) = default; + XMBYTEN4& operator=(XMBYTEN4&&) = default; + + constexpr XMBYTEN4(int8_t _x, int8_t _y, int8_t _z, int8_t _w) noexcept + : x(_x), y(_y), z(_z), w(_w) {} + explicit constexpr XMBYTEN4(uint32_t Packed) noexcept : v(Packed) {} + explicit XMBYTEN4(_In_reads_(4) const int8_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + XMBYTEN4(float _x, float _y, float _z, float _w) noexcept; + explicit XMBYTEN4(_In_reads_(4) const float* pArray) noexcept; + + XMBYTEN4& operator=(uint32_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +// 4D Vector; 8 bit signed integer components +struct XMBYTE4 { + union { + struct { + int8_t x; + int8_t y; + int8_t z; + int8_t w; + }; + uint32_t v; + }; + + XMBYTE4() = default; + + XMBYTE4(const XMBYTE4&) = default; + XMBYTE4& operator=(const XMBYTE4&) = default; + + XMBYTE4(XMBYTE4&&) = default; + XMBYTE4& operator=(XMBYTE4&&) = default; + + constexpr XMBYTE4(int8_t _x, int8_t _y, int8_t _z, int8_t _w) noexcept + : x(_x), y(_y), z(_z), w(_w) {} + explicit constexpr XMBYTE4(uint32_t Packed) noexcept : v(Packed) {} + explicit XMBYTE4(_In_reads_(4) const int8_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + XMBYTE4(float _x, float _y, float _z, float _w) noexcept; + explicit XMBYTE4(_In_reads_(4) const float* pArray) noexcept; + + XMBYTE4& operator=(uint32_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +// 4D Vector; 8 bit unsigned normalized integer components +struct XMUBYTEN4 { + union { + struct { + uint8_t x; + uint8_t y; + uint8_t z; + uint8_t w; + }; + uint32_t v; + }; + + XMUBYTEN4() = default; + + XMUBYTEN4(const XMUBYTEN4&) = default; + XMUBYTEN4& operator=(const XMUBYTEN4&) = default; + + XMUBYTEN4(XMUBYTEN4&&) = default; + XMUBYTEN4& operator=(XMUBYTEN4&&) = default; + + constexpr XMUBYTEN4(uint8_t _x, uint8_t _y, uint8_t _z, uint8_t _w) noexcept + : x(_x), y(_y), z(_z), w(_w) {} + explicit constexpr XMUBYTEN4(uint32_t Packed) noexcept : v(Packed) {} + explicit XMUBYTEN4(_In_reads_(4) const uint8_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + XMUBYTEN4(float _x, float _y, float _z, float _w) noexcept; + explicit XMUBYTEN4(_In_reads_(4) const float* pArray) noexcept; + + XMUBYTEN4& operator=(uint32_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +// 4D Vector; 8 bit unsigned integer components +struct XMUBYTE4 { + union { + struct { + uint8_t x; + uint8_t y; + uint8_t z; + uint8_t w; + }; + uint32_t v; + }; + + XMUBYTE4() = default; + + XMUBYTE4(const XMUBYTE4&) = default; + XMUBYTE4& operator=(const XMUBYTE4&) = default; + + XMUBYTE4(XMUBYTE4&&) = default; + XMUBYTE4& operator=(XMUBYTE4&&) = default; + + constexpr XMUBYTE4(uint8_t _x, uint8_t _y, uint8_t _z, uint8_t _w) noexcept + : x(_x), y(_y), z(_z), w(_w) {} + explicit constexpr XMUBYTE4(uint32_t Packed) noexcept : v(Packed) {} + explicit XMUBYTE4(_In_reads_(4) const uint8_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + XMUBYTE4(float _x, float _y, float _z, float _w) noexcept; + explicit XMUBYTE4(_In_reads_(4) const float* pArray) noexcept; + + XMUBYTE4& operator=(uint32_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +//------------------------------------------------------------------------------ +// 4D vector; 4 bit unsigned integer components +struct XMUNIBBLE4 { + union { + struct { + uint16_t x : 4; // 0 to 15 + uint16_t y : 4; // 0 to 15 + uint16_t z : 4; // 0 to 15 + uint16_t w : 4; // 0 to 15 + }; + uint16_t v; + }; + + XMUNIBBLE4() = default; + + XMUNIBBLE4(const XMUNIBBLE4&) = default; + XMUNIBBLE4& operator=(const XMUNIBBLE4&) = default; + + XMUNIBBLE4(XMUNIBBLE4&&) = default; + XMUNIBBLE4& operator=(XMUNIBBLE4&&) = default; + + explicit constexpr XMUNIBBLE4(uint16_t Packed) noexcept : v(Packed) {} + constexpr XMUNIBBLE4(uint8_t _x, uint8_t _y, uint8_t _z, + uint8_t _w) noexcept + : x(_x), y(_y), z(_z), w(_w) {} + explicit XMUNIBBLE4(_In_reads_(4) const uint8_t* pArray) noexcept + : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(pArray[3]) {} + XMUNIBBLE4(float _x, float _y, float _z, float _w) noexcept; + explicit XMUNIBBLE4(_In_reads_(4) const float* pArray) noexcept; + + operator uint16_t() const noexcept { return v; } + + XMUNIBBLE4& operator=(uint16_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +//------------------------------------------------------------------------------ +// 4D vector: 5/5/5/1 unsigned integer components +struct XMU555 { + union { + struct { + uint16_t x : 5; // 0 to 31 + uint16_t y : 5; // 0 to 31 + uint16_t z : 5; // 0 to 31 + uint16_t w : 1; // 0 or 1 + }; + uint16_t v; + }; + + XMU555() = default; + + XMU555(const XMU555&) = default; + XMU555& operator=(const XMU555&) = default; + + XMU555(XMU555&&) = default; + XMU555& operator=(XMU555&&) = default; + + explicit constexpr XMU555(uint16_t Packed) noexcept : v(Packed) {} + constexpr XMU555(uint8_t _x, uint8_t _y, uint8_t _z, bool _w) noexcept + : x(_x), y(_y), z(_z), w(_w ? 0x1 : 0) {} + XMU555(_In_reads_(3) const uint8_t* pArray, _In_ bool _w) noexcept + : x(pArray[0]), y(pArray[1]), z(pArray[2]), w(_w ? 0x1 : 0) {} + XMU555(float _x, float _y, float _z, bool _w) noexcept; + XMU555(_In_reads_(3) const float* pArray, _In_ bool _w) noexcept; + + operator uint16_t() const noexcept { return v; } + + XMU555& operator=(uint16_t Packed) noexcept { + v = Packed; + return *this; + } +}; + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +/**************************************************************************** + * + * Data conversion operations + * + ****************************************************************************/ + +float XMConvertHalfToFloat(HALF Value) noexcept; +float* XMConvertHalfToFloatStream( + _Out_writes_bytes_(sizeof(float) + + OutputStride * (HalfCount - 1)) float* pOutputStream, + _In_ size_t OutputStride, + _In_reads_bytes_(sizeof(HALF) + InputStride * (HalfCount - 1)) + const HALF* pInputStream, + _In_ size_t InputStride, _In_ size_t HalfCount) noexcept; +HALF XMConvertFloatToHalf(float Value) noexcept; +HALF* XMConvertFloatToHalfStream( + _Out_writes_bytes_(sizeof(HALF) + OutputStride * (FloatCount - 1)) + HALF* pOutputStream, + _In_ size_t OutputStride, + _In_reads_bytes_(sizeof(float) + InputStride * (FloatCount - 1)) + const float* pInputStream, + _In_ size_t InputStride, _In_ size_t FloatCount) noexcept; + +/**************************************************************************** + * + * Load operations + * + ****************************************************************************/ + +XMVECTOR XM_CALLCONV XMLoadColor(_In_ const XMCOLOR* pSource) noexcept; + +XMVECTOR XM_CALLCONV XMLoadHalf2(_In_ const XMHALF2* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadShortN2(_In_ const XMSHORTN2* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadShort2(_In_ const XMSHORT2* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadUShortN2(_In_ const XMUSHORTN2* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadUShort2(_In_ const XMUSHORT2* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadByteN2(_In_ const XMBYTEN2* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadByte2(_In_ const XMBYTE2* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadUByteN2(_In_ const XMUBYTEN2* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadUByte2(_In_ const XMUBYTE2* pSource) noexcept; + +XMVECTOR XM_CALLCONV XMLoadU565(_In_ const XMU565* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadFloat3PK(_In_ const XMFLOAT3PK* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadFloat3SE(_In_ const XMFLOAT3SE* pSource) noexcept; + +XMVECTOR XM_CALLCONV XMLoadHalf4(_In_ const XMHALF4* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadShortN4(_In_ const XMSHORTN4* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadShort4(_In_ const XMSHORT4* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadUShortN4(_In_ const XMUSHORTN4* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadUShort4(_In_ const XMUSHORT4* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadXDecN4(_In_ const XMXDECN4* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadUDecN4(_In_ const XMUDECN4* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadUDecN4_XR(_In_ const XMUDECN4* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadUDec4(_In_ const XMUDEC4* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadByteN4(_In_ const XMBYTEN4* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadByte4(_In_ const XMBYTE4* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadUByteN4(_In_ const XMUBYTEN4* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadUByte4(_In_ const XMUBYTE4* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadUNibble4(_In_ const XMUNIBBLE4* pSource) noexcept; +XMVECTOR XM_CALLCONV XMLoadU555(_In_ const XMU555* pSource) noexcept; + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +// C4996: ignore deprecation warning +#endif + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + +XM_DEPRECATED +XMVECTOR XM_CALLCONV XMLoadDecN4(_In_ const XMDECN4* pSource) noexcept; + +XM_DEPRECATED +XMVECTOR XM_CALLCONV XMLoadDec4(_In_ const XMDEC4* pSource) noexcept; + +XM_DEPRECATED +XMVECTOR XM_CALLCONV XMLoadXDec4(_In_ const XMXDEC4* pSource) noexcept; + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +/**************************************************************************** + * + * Store operations + * + ****************************************************************************/ + +void XM_CALLCONV XMStoreColor(_Out_ XMCOLOR* pDestination, + _In_ FXMVECTOR V) noexcept; + +void XM_CALLCONV XMStoreHalf2(_Out_ XMHALF2* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreShortN2(_Out_ XMSHORTN2* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreShort2(_Out_ XMSHORT2* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreUShortN2(_Out_ XMUSHORTN2* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreUShort2(_Out_ XMUSHORT2* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreByteN2(_Out_ XMBYTEN2* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreByte2(_Out_ XMBYTE2* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreUByteN2(_Out_ XMUBYTEN2* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreUByte2(_Out_ XMUBYTE2* pDestination, + _In_ FXMVECTOR V) noexcept; + +void XM_CALLCONV XMStoreU565(_Out_ XMU565* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreFloat3PK(_Out_ XMFLOAT3PK* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreFloat3SE(_Out_ XMFLOAT3SE* pDestination, + _In_ FXMVECTOR V) noexcept; + +void XM_CALLCONV XMStoreHalf4(_Out_ XMHALF4* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreShortN4(_Out_ XMSHORTN4* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreShort4(_Out_ XMSHORT4* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreUShortN4(_Out_ XMUSHORTN4* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreUShort4(_Out_ XMUSHORT4* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreXDecN4(_Out_ XMXDECN4* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreUDecN4(_Out_ XMUDECN4* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreUDecN4_XR(_Out_ XMUDECN4* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreUDec4(_Out_ XMUDEC4* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreByteN4(_Out_ XMBYTEN4* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreByte4(_Out_ XMBYTE4* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreUByteN4(_Out_ XMUBYTEN4* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreUByte4(_Out_ XMUBYTE4* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreUNibble4(_Out_ XMUNIBBLE4* pDestination, + _In_ FXMVECTOR V) noexcept; +void XM_CALLCONV XMStoreU555(_Out_ XMU555* pDestination, + _In_ FXMVECTOR V) noexcept; + +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +// C4996: ignore deprecation warning +#endif + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + +XM_DEPRECATED +void XM_CALLCONV XMStoreDecN4(_Out_ XMDECN4* pDestination, + _In_ FXMVECTOR V) noexcept; + +XM_DEPRECATED +void XM_CALLCONV XMStoreDec4(_Out_ XMDEC4* pDestination, + _In_ FXMVECTOR V) noexcept; + +XM_DEPRECATED +void XM_CALLCONV XMStoreXDec4(_Out_ XMXDEC4* pDestination, + _In_ FXMVECTOR V) noexcept; + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +/**************************************************************************** + * + * Implementation + * + ****************************************************************************/ +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4068 4214 4204 4365 4616 6001 6101) +// C4068/4616: ignore unknown pragmas +// C4214/4204: nonstandard extension used +// C4365: Off by default noise +// C6001/6101: False positives +#endif + +#ifdef _PREFAST_ +#pragma prefast(push) +#pragma prefast(disable : 25000, "FXMVECTOR is 16 bytes") +#pragma prefast(disable : 26495, "Union initialization confuses /analyze") +#endif + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunknown-warning-option" +#pragma clang diagnostic ignored "-Wunsafe-buffer-usage" +#endif + +#include "DirectXPackedVector.inl" + +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +#ifdef _PREFAST_ +#pragma prefast(pop) +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif +} // namespace PackedVector + +} // namespace DirectX diff --git a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXPackedVector.inl b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXPackedVector.inl similarity index 97% rename from Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXPackedVector.inl rename to Minecraft.Client/Linux/Stubs/DirectXMath/DirectXPackedVector.inl index 59386d1fa..ccb07dd6c 100644 --- a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/DirectXPackedVector.inl +++ b/Minecraft.Client/Linux/Stubs/DirectXMath/DirectXPackedVector.inl @@ -1,4503 +1,4503 @@ -//------------------------------------------------------------------------------------- -// DirectXPackedVector.inl -- SIMD C++ Math library -// -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. -// -// http://go.microsoft.com/fwlink/?LinkID=615560 -//------------------------------------------------------------------------------------- - -#pragma once - -/**************************************************************************** - * - * Data conversion - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline float XMConvertHalfToFloat(HALF Value) noexcept -{ -#if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - __m128i V1 = _mm_cvtsi32_si128(static_cast(Value)); - __m128 V2 = _mm_cvtph_ps(V1); - return _mm_cvtss_f32(V2); -#elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__) && !defined(_XM_NO_INTRINSICS_) && (!defined(__GNUC__) || (__ARM_FP & 2)) - uint16x4_t vHalf = vdup_n_u16(Value); - float32x4_t vFloat = vcvt_f32_f16(vreinterpret_f16_u16(vHalf)); - return vgetq_lane_f32(vFloat, 0); -#else - auto Mantissa = static_cast(Value & 0x03FF); - - uint32_t Exponent = (Value & 0x7C00); - if (Exponent == 0x7C00) // INF/NAN - { - Exponent = 0x8f; - } - else if (Exponent != 0) // The value is normalized - { - Exponent = static_cast((static_cast(Value) >> 10) & 0x1F); - } - else if (Mantissa != 0) // The value is denormalized - { - // Normalize the value in the resulting float - Exponent = 1; - - do - { - Exponent--; - Mantissa <<= 1; - } - while ((Mantissa & 0x0400) == 0); - - Mantissa &= 0x03FF; - } - else // The value is zero - { - Exponent = static_cast(-112); - } - - uint32_t Result = - ((static_cast(Value) & 0x8000) << 16) // Sign - | ((Exponent + 112) << 23) // Exponent - | (Mantissa << 13); // Mantissa - - return reinterpret_cast(&Result)[0]; -#endif // !_XM_F16C_INTRINSICS_ -} - -//------------------------------------------------------------------------------ -#ifdef _PREFAST_ -#pragma prefast(push) -#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307" ) -#endif - -_Use_decl_annotations_ -inline float* XMConvertHalfToFloatStream -( - float* pOutputStream, - size_t OutputStride, - const HALF* pInputStream, - size_t InputStride, - size_t HalfCount -) noexcept -{ - assert(pOutputStream); - assert(pInputStream); - - assert(InputStride >= sizeof(HALF)); - _Analysis_assume_(InputStride >= sizeof(HALF)); - - assert(OutputStride >= sizeof(float)); - _Analysis_assume_(OutputStride >= sizeof(float)); - -#if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - auto pHalf = reinterpret_cast(pInputStream); - auto pFloat = reinterpret_cast(pOutputStream); - - size_t i = 0; - size_t four = HalfCount >> 2; - if (four > 0) - { - if (InputStride == sizeof(HALF)) - { - if (OutputStride == sizeof(float)) - { - if ((reinterpret_cast(pFloat) & 0xF) == 0) - { - // Packed input, aligned & packed output - for (size_t j = 0; j < four; ++j) - { - __m128i HV = _mm_loadl_epi64(reinterpret_cast(pHalf)); - pHalf += InputStride * 4; - - __m128 FV = _mm_cvtph_ps(HV); - - XM_STREAM_PS(reinterpret_cast(pFloat), FV); - pFloat += OutputStride * 4; - i += 4; - } - } - else - { - // Packed input, packed output - for (size_t j = 0; j < four; ++j) - { - __m128i HV = _mm_loadl_epi64(reinterpret_cast(pHalf)); - pHalf += InputStride * 4; - - __m128 FV = _mm_cvtph_ps(HV); - - _mm_storeu_ps(reinterpret_cast(pFloat), FV); - pFloat += OutputStride * 4; - i += 4; - } - } - } - else - { - // Packed input, scattered output - for (size_t j = 0; j < four; ++j) - { - __m128i HV = _mm_loadl_epi64(reinterpret_cast(pHalf)); - pHalf += InputStride * 4; - - __m128 FV = _mm_cvtph_ps(HV); - - _mm_store_ss(reinterpret_cast(pFloat), FV); - pFloat += OutputStride; - *reinterpret_cast(pFloat) = _mm_extract_ps(FV, 1); - pFloat += OutputStride; - *reinterpret_cast(pFloat) = _mm_extract_ps(FV, 2); - pFloat += OutputStride; - *reinterpret_cast(pFloat) = _mm_extract_ps(FV, 3); - pFloat += OutputStride; - i += 4; - } - } - } - else if (OutputStride == sizeof(float)) - { - if ((reinterpret_cast(pFloat) & 0xF) == 0) - { - // Scattered input, aligned & packed output - for (size_t j = 0; j < four; ++j) - { - uint16_t H1 = *reinterpret_cast(pHalf); - pHalf += InputStride; - uint16_t H2 = *reinterpret_cast(pHalf); - pHalf += InputStride; - uint16_t H3 = *reinterpret_cast(pHalf); - pHalf += InputStride; - uint16_t H4 = *reinterpret_cast(pHalf); - pHalf += InputStride; - - __m128i HV = _mm_setzero_si128(); - HV = _mm_insert_epi16(HV, H1, 0); - HV = _mm_insert_epi16(HV, H2, 1); - HV = _mm_insert_epi16(HV, H3, 2); - HV = _mm_insert_epi16(HV, H4, 3); - __m128 FV = _mm_cvtph_ps(HV); - - XM_STREAM_PS(reinterpret_cast(pFloat), FV); - pFloat += OutputStride * 4; - i += 4; - } - } - else - { - // Scattered input, packed output - for (size_t j = 0; j < four; ++j) - { - uint16_t H1 = *reinterpret_cast(pHalf); - pHalf += InputStride; - uint16_t H2 = *reinterpret_cast(pHalf); - pHalf += InputStride; - uint16_t H3 = *reinterpret_cast(pHalf); - pHalf += InputStride; - uint16_t H4 = *reinterpret_cast(pHalf); - pHalf += InputStride; - - __m128i HV = _mm_setzero_si128(); - HV = _mm_insert_epi16(HV, H1, 0); - HV = _mm_insert_epi16(HV, H2, 1); - HV = _mm_insert_epi16(HV, H3, 2); - HV = _mm_insert_epi16(HV, H4, 3); - __m128 FV = _mm_cvtph_ps(HV); - - _mm_storeu_ps(reinterpret_cast(pFloat), FV); - pFloat += OutputStride * 4; - i += 4; - } - } - } - else - { - // Scattered input, scattered output - for (size_t j = 0; j < four; ++j) - { - uint16_t H1 = *reinterpret_cast(pHalf); - pHalf += InputStride; - uint16_t H2 = *reinterpret_cast(pHalf); - pHalf += InputStride; - uint16_t H3 = *reinterpret_cast(pHalf); - pHalf += InputStride; - uint16_t H4 = *reinterpret_cast(pHalf); - pHalf += InputStride; - - __m128i HV = _mm_setzero_si128(); - HV = _mm_insert_epi16(HV, H1, 0); - HV = _mm_insert_epi16(HV, H2, 1); - HV = _mm_insert_epi16(HV, H3, 2); - HV = _mm_insert_epi16(HV, H4, 3); - __m128 FV = _mm_cvtph_ps(HV); - - _mm_store_ss(reinterpret_cast(pFloat), FV); - pFloat += OutputStride; - *reinterpret_cast(pFloat) = _mm_extract_ps(FV, 1); - pFloat += OutputStride; - *reinterpret_cast(pFloat) = _mm_extract_ps(FV, 2); - pFloat += OutputStride; - *reinterpret_cast(pFloat) = _mm_extract_ps(FV, 3); - pFloat += OutputStride; - i += 4; - } - } - } - - for (; i < HalfCount; ++i) - { - *reinterpret_cast(pFloat) = XMConvertHalfToFloat(reinterpret_cast(pHalf)[0]); - pHalf += InputStride; - pFloat += OutputStride; - } - - XM_SFENCE(); - - return pOutputStream; -#elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) ||__aarch64__) && !defined(_XM_NO_INTRINSICS_) && (!defined(__GNUC__) || (__ARM_FP & 2)) - auto pHalf = reinterpret_cast(pInputStream); - auto pFloat = reinterpret_cast(pOutputStream); - - size_t i = 0; - size_t four = HalfCount >> 2; - if (four > 0) - { - if (InputStride == sizeof(HALF)) - { - if (OutputStride == sizeof(float)) - { - // Packed input, packed output - for (size_t j = 0; j < four; ++j) - { - uint16x4_t vHalf = vld1_u16(reinterpret_cast(pHalf)); - pHalf += InputStride * 4; - - float32x4_t vFloat = vcvt_f32_f16(vreinterpret_f16_u16(vHalf)); - - vst1q_f32(reinterpret_cast(pFloat), vFloat); - pFloat += OutputStride * 4; - i += 4; - } - } - else - { - // Packed input, scattered output - for (size_t j = 0; j < four; ++j) - { - uint16x4_t vHalf = vld1_u16(reinterpret_cast(pHalf)); - pHalf += InputStride * 4; - - float32x4_t vFloat = vcvt_f32_f16(vreinterpret_f16_u16(vHalf)); - - vst1q_lane_f32(reinterpret_cast(pFloat), vFloat, 0); - pFloat += OutputStride; - vst1q_lane_f32(reinterpret_cast(pFloat), vFloat, 1); - pFloat += OutputStride; - vst1q_lane_f32(reinterpret_cast(pFloat), vFloat, 2); - pFloat += OutputStride; - vst1q_lane_f32(reinterpret_cast(pFloat), vFloat, 3); - pFloat += OutputStride; - i += 4; - } - } - } - else if (OutputStride == sizeof(float)) - { - // Scattered input, packed output - for (size_t j = 0; j < four; ++j) - { - uint16_t H1 = *reinterpret_cast(pHalf); - pHalf += InputStride; - uint16_t H2 = *reinterpret_cast(pHalf); - pHalf += InputStride; - uint16_t H3 = *reinterpret_cast(pHalf); - pHalf += InputStride; - uint16_t H4 = *reinterpret_cast(pHalf); - pHalf += InputStride; - - uint64_t iHalf = uint64_t(H1) | (uint64_t(H2) << 16) | (uint64_t(H3) << 32) | (uint64_t(H4) << 48); - uint16x4_t vHalf = vcreate_u16(iHalf); - - float32x4_t vFloat = vcvt_f32_f16(vreinterpret_f16_u16(vHalf)); - - vst1q_f32(reinterpret_cast(pFloat), vFloat); - pFloat += OutputStride * 4; - i += 4; - } - } - else - { - // Scattered input, scattered output - for (size_t j = 0; j < four; ++j) - { - uint16_t H1 = *reinterpret_cast(pHalf); - pHalf += InputStride; - uint16_t H2 = *reinterpret_cast(pHalf); - pHalf += InputStride; - uint16_t H3 = *reinterpret_cast(pHalf); - pHalf += InputStride; - uint16_t H4 = *reinterpret_cast(pHalf); - pHalf += InputStride; - - uint64_t iHalf = uint64_t(H1) | (uint64_t(H2) << 16) | (uint64_t(H3) << 32) | (uint64_t(H4) << 48); - uint16x4_t vHalf = vcreate_u16(iHalf); - - float32x4_t vFloat = vcvt_f32_f16(vreinterpret_f16_u16(vHalf)); - - vst1q_lane_f32(reinterpret_cast(pFloat), vFloat, 0); - pFloat += OutputStride; - vst1q_lane_f32(reinterpret_cast(pFloat), vFloat, 1); - pFloat += OutputStride; - vst1q_lane_f32(reinterpret_cast(pFloat), vFloat, 2); - pFloat += OutputStride; - vst1q_lane_f32(reinterpret_cast(pFloat), vFloat, 3); - pFloat += OutputStride; - i += 4; - } - } - } - - for (; i < HalfCount; ++i) - { - *reinterpret_cast(pFloat) = XMConvertHalfToFloat(reinterpret_cast(pHalf)[0]); - pHalf += InputStride; - pFloat += OutputStride; - } - - return pOutputStream; -#else - auto pHalf = reinterpret_cast(pInputStream); - auto pFloat = reinterpret_cast(pOutputStream); - - for (size_t i = 0; i < HalfCount; i++) - { - *reinterpret_cast(pFloat) = XMConvertHalfToFloat(reinterpret_cast(pHalf)[0]); - pHalf += InputStride; - pFloat += OutputStride; - } - - return pOutputStream; -#endif // !_XM_F16C_INTRINSICS_ -} - -//------------------------------------------------------------------------------ - -inline HALF XMConvertFloatToHalf(float Value) noexcept -{ -#if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - __m128 V1 = _mm_set_ss(Value); - __m128i V2 = _mm_cvtps_ph(V1, _MM_FROUND_TO_NEAREST_INT); - return static_cast(_mm_extract_epi16(V2, 0)); -#elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__) && !defined(_XM_NO_INTRINSICS_) && (!defined(__GNUC__) || (__ARM_FP & 2)) - float32x4_t vFloat = vdupq_n_f32(Value); - float16x4_t vHalf = vcvt_f16_f32(vFloat); - return vget_lane_u16(vreinterpret_u16_f16(vHalf), 0); -#else - uint32_t Result; - - auto IValue = reinterpret_cast(&Value)[0]; - uint32_t Sign = (IValue & 0x80000000U) >> 16U; - IValue = IValue & 0x7FFFFFFFU; // Hack off the sign - if (IValue >= 0x47800000 /*e+16*/) - { - // The number is too large to be represented as a half. Return infinity or NaN - Result = 0x7C00U | ((IValue > 0x7F800000) ? (0x200 | ((IValue >> 13U) & 0x3FFU)) : 0U); - } - else if (IValue <= 0x33000000U /*e-25*/) - { - Result = 0; - } - else if (IValue < 0x38800000U /*e-14*/) - { - // The number is too small to be represented as a normalized half. - // Convert it to a denormalized value. - uint32_t Shift = 125U - (IValue >> 23U); - IValue = 0x800000U | (IValue & 0x7FFFFFU); - Result = IValue >> (Shift + 1); - uint32_t s = (IValue & ((1U << Shift) - 1)) != 0; - Result += (Result | s) & ((IValue >> Shift) & 1U); - } - else - { - // Rebias the exponent to represent the value as a normalized half. - IValue += 0xC8000000U; - Result = ((IValue + 0x0FFFU + ((IValue >> 13U) & 1U)) >> 13U) & 0x7FFFU; - } - return static_cast(Result | Sign); -#endif // !_XM_F16C_INTRINSICS_ -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline HALF* XMConvertFloatToHalfStream -( - HALF* pOutputStream, - size_t OutputStride, - const float* pInputStream, - size_t InputStride, - size_t FloatCount -) noexcept -{ - assert(pOutputStream); - assert(pInputStream); - - assert(InputStride >= sizeof(float)); - _Analysis_assume_(InputStride >= sizeof(float)); - - assert(OutputStride >= sizeof(HALF)); - _Analysis_assume_(OutputStride >= sizeof(HALF)); - -#if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - auto pFloat = reinterpret_cast(pInputStream); - auto pHalf = reinterpret_cast(pOutputStream); - - size_t i = 0; - size_t four = FloatCount >> 2; - if (four > 0) - { - if (InputStride == sizeof(float)) - { - if (OutputStride == sizeof(HALF)) - { - if ((reinterpret_cast(pFloat) & 0xF) == 0) - { - // Aligned and packed input, packed output - for (size_t j = 0; j < four; ++j) - { - __m128 FV = _mm_load_ps(reinterpret_cast(pFloat)); - pFloat += InputStride * 4; - - __m128i HV = _mm_cvtps_ph(FV, _MM_FROUND_TO_NEAREST_INT); - - _mm_storel_epi64(reinterpret_cast<__m128i*>(pHalf), HV); - pHalf += OutputStride * 4; - i += 4; - } - } - else - { - // Packed input, packed output - for (size_t j = 0; j < four; ++j) - { - __m128 FV = _mm_loadu_ps(reinterpret_cast(pFloat)); - pFloat += InputStride * 4; - - __m128i HV = _mm_cvtps_ph(FV, _MM_FROUND_TO_NEAREST_INT); - - _mm_storel_epi64(reinterpret_cast<__m128i*>(pHalf), HV); - pHalf += OutputStride * 4; - i += 4; - } - } - } - else - { - if ((reinterpret_cast(pFloat) & 0xF) == 0) - { - // Aligned & packed input, scattered output - for (size_t j = 0; j < four; ++j) - { - __m128 FV = _mm_load_ps(reinterpret_cast(pFloat)); - pFloat += InputStride * 4; - - __m128i HV = _mm_cvtps_ph(FV, _MM_FROUND_TO_NEAREST_INT); - - *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 0)); - pHalf += OutputStride; - *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 1)); - pHalf += OutputStride; - *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 2)); - pHalf += OutputStride; - *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 3)); - pHalf += OutputStride; - i += 4; - } - } - else - { - // Packed input, scattered output - for (size_t j = 0; j < four; ++j) - { - __m128 FV = _mm_loadu_ps(reinterpret_cast(pFloat)); - pFloat += InputStride * 4; - - __m128i HV = _mm_cvtps_ph(FV, _MM_FROUND_TO_NEAREST_INT); - - *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 0)); - pHalf += OutputStride; - *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 1)); - pHalf += OutputStride; - *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 2)); - pHalf += OutputStride; - *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 3)); - pHalf += OutputStride; - i += 4; - } - } - } - } - else if (OutputStride == sizeof(HALF)) - { - // Scattered input, packed output - for (size_t j = 0; j < four; ++j) - { - __m128 FV1 = _mm_load_ss(reinterpret_cast(pFloat)); - pFloat += InputStride; - - __m128 FV2 = _mm_broadcast_ss(reinterpret_cast(pFloat)); - pFloat += InputStride; - - __m128 FV3 = _mm_broadcast_ss(reinterpret_cast(pFloat)); - pFloat += InputStride; - - __m128 FV4 = _mm_broadcast_ss(reinterpret_cast(pFloat)); - pFloat += InputStride; - - __m128 FV = _mm_blend_ps(FV1, FV2, 0x2); - __m128 FT = _mm_blend_ps(FV3, FV4, 0x8); - FV = _mm_blend_ps(FV, FT, 0xC); - - __m128i HV = _mm_cvtps_ph(FV, _MM_FROUND_TO_NEAREST_INT); - - _mm_storel_epi64(reinterpret_cast<__m128i*>(pHalf), HV); - pHalf += OutputStride * 4; - i += 4; - } - } - else - { - // Scattered input, scattered output - for (size_t j = 0; j < four; ++j) - { - __m128 FV1 = _mm_load_ss(reinterpret_cast(pFloat)); - pFloat += InputStride; - - __m128 FV2 = _mm_broadcast_ss(reinterpret_cast(pFloat)); - pFloat += InputStride; - - __m128 FV3 = _mm_broadcast_ss(reinterpret_cast(pFloat)); - pFloat += InputStride; - - __m128 FV4 = _mm_broadcast_ss(reinterpret_cast(pFloat)); - pFloat += InputStride; - - __m128 FV = _mm_blend_ps(FV1, FV2, 0x2); - __m128 FT = _mm_blend_ps(FV3, FV4, 0x8); - FV = _mm_blend_ps(FV, FT, 0xC); - - __m128i HV = _mm_cvtps_ph(FV, _MM_FROUND_TO_NEAREST_INT); - - *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 0)); - pHalf += OutputStride; - *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 1)); - pHalf += OutputStride; - *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 2)); - pHalf += OutputStride; - *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 3)); - pHalf += OutputStride; - i += 4; - } - } - } - - for (; i < FloatCount; ++i) - { - *reinterpret_cast(pHalf) = XMConvertFloatToHalf(reinterpret_cast(pFloat)[0]); - pFloat += InputStride; - pHalf += OutputStride; - } - - return pOutputStream; -#elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__) && !defined(_XM_NO_INTRINSICS_) && (!defined(__GNUC__) || (__ARM_FP & 2)) - auto pFloat = reinterpret_cast(pInputStream); - auto pHalf = reinterpret_cast(pOutputStream); - - size_t i = 0; - size_t four = FloatCount >> 2; - if (four > 0) - { - if (InputStride == sizeof(float)) - { - if (OutputStride == sizeof(HALF)) - { - // Packed input, packed output - for (size_t j = 0; j < four; ++j) - { - float32x4_t vFloat = vld1q_f32(reinterpret_cast(pFloat)); - pFloat += InputStride * 4; - - uint16x4_t vHalf = vreinterpret_u16_f16(vcvt_f16_f32(vFloat)); - - vst1_u16(reinterpret_cast(pHalf), vHalf); - pHalf += OutputStride * 4; - i += 4; - } - } - else - { - // Packed input, scattered output - for (size_t j = 0; j < four; ++j) - { - float32x4_t vFloat = vld1q_f32(reinterpret_cast(pFloat)); - pFloat += InputStride * 4; - - uint16x4_t vHalf = vreinterpret_u16_f16(vcvt_f16_f32(vFloat)); - - vst1_lane_u16(reinterpret_cast(pHalf), vHalf, 0); - pHalf += OutputStride; - vst1_lane_u16(reinterpret_cast(pHalf), vHalf, 1); - pHalf += OutputStride; - vst1_lane_u16(reinterpret_cast(pHalf), vHalf, 2); - pHalf += OutputStride; - vst1_lane_u16(reinterpret_cast(pHalf), vHalf, 3); - pHalf += OutputStride; - i += 4; - } - } - } - else if (OutputStride == sizeof(HALF)) - { - // Scattered input, packed output - for (size_t j = 0; j < four; ++j) - { - float32x4_t vFloat = vdupq_n_f32(0); - vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 0); - pFloat += InputStride; - - vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 1); - pFloat += InputStride; - - vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 2); - pFloat += InputStride; - - vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 3); - pFloat += InputStride; - - uint16x4_t vHalf = vreinterpret_u16_f16(vcvt_f16_f32(vFloat)); - - vst1_u16(reinterpret_cast(pHalf), vHalf); - pHalf += OutputStride * 4; - i += 4; - } - } - else - { - // Scattered input, scattered output - for (size_t j = 0; j < four; ++j) - { - float32x4_t vFloat = vdupq_n_f32(0); - vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 0); - pFloat += InputStride; - - vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 1); - pFloat += InputStride; - - vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 2); - pFloat += InputStride; - - vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 3); - pFloat += InputStride; - - uint16x4_t vHalf = vreinterpret_u16_f16(vcvt_f16_f32(vFloat)); - - vst1_lane_u16(reinterpret_cast(pHalf), vHalf, 0); - pHalf += OutputStride; - vst1_lane_u16(reinterpret_cast(pHalf), vHalf, 1); - pHalf += OutputStride; - vst1_lane_u16(reinterpret_cast(pHalf), vHalf, 2); - pHalf += OutputStride; - vst1_lane_u16(reinterpret_cast(pHalf), vHalf, 3); - pHalf += OutputStride; - i += 4; - } - } - } - - for (; i < FloatCount; ++i) - { - *reinterpret_cast(pHalf) = XMConvertFloatToHalf(reinterpret_cast(pFloat)[0]); - pFloat += InputStride; - pHalf += OutputStride; - } - - return pOutputStream; -#else - auto pFloat = reinterpret_cast(pInputStream); - auto pHalf = reinterpret_cast(pOutputStream); - - for (size_t i = 0; i < FloatCount; i++) - { - *reinterpret_cast(pHalf) = XMConvertFloatToHalf(reinterpret_cast(pFloat)[0]); - pFloat += InputStride; - pHalf += OutputStride; - } - return pOutputStream; -#endif // !_XM_F16C_INTRINSICS_ -} - -#ifdef _PREFAST_ -#pragma prefast(pop) -#endif - -/**************************************************************************** - * - * Vector and matrix load operations - * - ****************************************************************************/ - -#ifdef _PREFAST_ -#pragma prefast(push) -#pragma prefast(disable:28931, "PREfast noise: Esp:1266") -#endif - -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadColor(const XMCOLOR* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - // int32_t -> Float conversions are done in one instruction. - // uint32_t -> Float calls a runtime function. Keep in int32_t - auto iColor = static_cast(pSource->c); - XMVECTORF32 vColor = { { { - static_cast((iColor >> 16) & 0xFF)* (1.0f / 255.0f), - static_cast((iColor >> 8) & 0xFF)* (1.0f / 255.0f), - static_cast(iColor & 0xFF)* (1.0f / 255.0f), - static_cast((iColor >> 24) & 0xFF)* (1.0f / 255.0f) - } } }; - return vColor.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32_t bgra = pSource->c; - uint32_t rgba = (bgra & 0xFF00FF00) | ((bgra >> 16) & 0xFF) | ((bgra << 16) & 0xFF0000); - uint32x2_t vInt8 = vdup_n_u32(rgba); - uint16x8_t vInt16 = vmovl_u8(vreinterpret_u8_u32(vInt8)); - uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); - float32x4_t R = vcvtq_f32_u32(vInt); - return vmulq_n_f32(R, 1.0f / 255.0f); -#elif defined(_XM_SSE_INTRINSICS_) - // Splat the color in all four entries - __m128i vInt = _mm_set1_epi32(static_cast(pSource->c)); - // Shift R&0xFF0000, G&0xFF00, B&0xFF, A&0xFF000000 - vInt = _mm_and_si128(vInt, g_XMMaskA8R8G8B8); - // a is unsigned! Flip the bit to convert the order to signed - vInt = _mm_xor_si128(vInt, g_XMFlipA8R8G8B8); - // Convert to floating point numbers - XMVECTOR vTemp = _mm_cvtepi32_ps(vInt); - // RGB + 0, A + 0x80000000.f to undo the signed order. - vTemp = _mm_add_ps(vTemp, g_XMFixAA8R8G8B8); - // Convert 0-255 to 0.0f-1.0f - return _mm_mul_ps(vTemp, g_XMNormalizeA8R8G8B8); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadHalf2(const XMHALF2* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - __m128 V = _mm_load_ss(reinterpret_cast(pSource)); - return _mm_cvtph_ps(_mm_castps_si128(V)); -#else - XMVECTORF32 vResult = { { { - XMConvertHalfToFloat(pSource->x), - XMConvertHalfToFloat(pSource->y), - 0.0f, - 0.0f - } } }; - return vResult.v; -#endif // !_XM_F16C_INTRINSICS_ -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadShortN2(const XMSHORTN2* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - (pSource->x == -32768) ? -1.f : (static_cast(pSource->x)* (1.0f / 32767.0f)), - (pSource->y == -32768) ? -1.f : (static_cast(pSource->y)* (1.0f / 32767.0f)), - 0.0f, - 0.0f - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vInt16 = vld1_dup_u32(reinterpret_cast(pSource)); - int32x4_t vInt = vmovl_s16(vreinterpret_s16_u32(vInt16)); - vInt = vandq_s32(vInt, g_XMMaskXY); - float32x4_t R = vcvtq_f32_s32(vInt); - R = vmulq_n_f32(R, 1.0f / 32767.0f); - return vmaxq_f32(R, vdupq_n_f32(-1.f)); -#elif defined(_XM_SSE_INTRINSICS_) - // Splat the two shorts in all four entries (WORD alignment okay, - // DWORD alignment preferred) - __m128 vTemp = _mm_load_ps1(reinterpret_cast(&pSource->x)); - // Mask x&0xFFFF, y&0xFFFF0000,z&0,w&0 - vTemp = _mm_and_ps(vTemp, g_XMMaskX16Y16); - // x needs to be sign extended - vTemp = _mm_xor_ps(vTemp, g_XMFlipX16Y16); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // x - 0x8000 to undo the signed order. - vTemp = _mm_add_ps(vTemp, g_XMFixX16Y16); - // Convert -1.0f - 1.0f - vTemp = _mm_mul_ps(vTemp, g_XMNormalizeX16Y16); - // Clamp result (for case of -32768) - return _mm_max_ps(vTemp, g_XMNegativeOne); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadShort2(const XMSHORT2* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x), - static_cast(pSource->y), - 0.f, - 0.f - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vInt16 = vld1_dup_u32(reinterpret_cast(pSource)); - int32x4_t vInt = vmovl_s16(vreinterpret_s16_u32(vInt16)); - vInt = vandq_s32(vInt, g_XMMaskXY); - return vcvtq_f32_s32(vInt); -#elif defined(_XM_SSE_INTRINSICS_) - // Splat the two shorts in all four entries (WORD alignment okay, - // DWORD alignment preferred) - __m128 vTemp = _mm_load_ps1(reinterpret_cast(&pSource->x)); - // Mask x&0xFFFF, y&0xFFFF0000,z&0,w&0 - vTemp = _mm_and_ps(vTemp, g_XMMaskX16Y16); - // x needs to be sign extended - vTemp = _mm_xor_ps(vTemp, g_XMFlipX16Y16); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // x - 0x8000 to undo the signed order. - vTemp = _mm_add_ps(vTemp, g_XMFixX16Y16); - // Y is 65536 too large - return _mm_mul_ps(vTemp, g_XMFixupY16); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUShortN2(const XMUSHORTN2* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x) / 65535.0f, - static_cast(pSource->y) / 65535.0f, - 0.f, - 0.f - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vInt16 = vld1_dup_u32(reinterpret_cast(pSource)); - uint32x4_t vInt = vmovl_u16(vreinterpret_u16_u32(vInt16)); - vInt = vandq_u32(vInt, g_XMMaskXY); - float32x4_t R = vcvtq_f32_u32(vInt); - R = vmulq_n_f32(R, 1.0f / 65535.0f); - return vmaxq_f32(R, vdupq_n_f32(-1.f)); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 FixupY16 = { { { 1.0f / 65535.0f, 1.0f / (65535.0f * 65536.0f), 0.0f, 0.0f } } }; - static const XMVECTORF32 FixaddY16 = { { { 0, 32768.0f * 65536.0f, 0, 0 } } }; - // Splat the two shorts in all four entries (WORD alignment okay, - // DWORD alignment preferred) - __m128 vTemp = _mm_load_ps1(reinterpret_cast(&pSource->x)); - // Mask x&0xFFFF, y&0xFFFF0000,z&0,w&0 - vTemp = _mm_and_ps(vTemp, g_XMMaskX16Y16); - // y needs to be sign flipped - vTemp = _mm_xor_ps(vTemp, g_XMFlipY); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // y + 0x8000 to undo the signed order. - vTemp = _mm_add_ps(vTemp, FixaddY16); - // Y is 65536 times too large - vTemp = _mm_mul_ps(vTemp, FixupY16); - return vTemp; -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUShort2(const XMUSHORT2* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x), - static_cast(pSource->y), - 0.f, - 0.f - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vInt16 = vld1_dup_u32(reinterpret_cast(pSource)); - uint32x4_t vInt = vmovl_u16(vreinterpret_u16_u32(vInt16)); - vInt = vandq_u32(vInt, g_XMMaskXY); - return vcvtq_f32_u32(vInt); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 FixaddY16 = { { { 0, 32768.0f, 0, 0 } } }; - // Splat the two shorts in all four entries (WORD alignment okay, - // DWORD alignment preferred) - __m128 vTemp = _mm_load_ps1(reinterpret_cast(&pSource->x)); - // Mask x&0xFFFF, y&0xFFFF0000,z&0,w&0 - vTemp = _mm_and_ps(vTemp, g_XMMaskX16Y16); - // y needs to be sign flipped - vTemp = _mm_xor_ps(vTemp, g_XMFlipY); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // Y is 65536 times too large - vTemp = _mm_mul_ps(vTemp, g_XMFixupY16); - // y + 0x8000 to undo the signed order. - vTemp = _mm_add_ps(vTemp, FixaddY16); - return vTemp; -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadByteN2(const XMBYTEN2* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - (pSource->x == -128) ? -1.f : (static_cast(pSource->x)* (1.0f / 127.0f)), - (pSource->y == -128) ? -1.f : (static_cast(pSource->y)* (1.0f / 127.0f)), - 0.0f, - 0.0f - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint16x4_t vInt8 = vld1_dup_u16(reinterpret_cast(pSource)); - int16x8_t vInt16 = vmovl_s8(vreinterpret_s8_u16(vInt8)); - int32x4_t vInt = vmovl_s16(vget_low_s16(vInt16)); - vInt = vandq_s32(vInt, g_XMMaskXY); - float32x4_t R = vcvtq_f32_s32(vInt); - R = vmulq_n_f32(R, 1.0f / 127.0f); - return vmaxq_f32(R, vdupq_n_f32(-1.f)); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 1.0f / 127.0f, 1.0f / (127.0f * 256.0f), 0, 0 } } }; - static const XMVECTORU32 Mask = { { { 0xFF, 0xFF00, 0, 0 } } }; - // Splat the color in all four entries (x,z,y,w) - __m128i vInt = XM_LOADU_SI16(&pSource->v); - XMVECTOR vTemp = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); - // Mask - vTemp = _mm_and_ps(vTemp, Mask); - // x,y and z are unsigned! Flip the bits to convert the order to signed - vTemp = _mm_xor_ps(vTemp, g_XMXorByte4); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // x, y and z - 0x80 to complete the conversion - vTemp = _mm_add_ps(vTemp, g_XMAddByte4); - // Fix y, z and w because they are too large - vTemp = _mm_mul_ps(vTemp, Scale); - // Clamp result (for case of -128) - return _mm_max_ps(vTemp, g_XMNegativeOne); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadByte2(const XMBYTE2* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x), - static_cast(pSource->y), - 0.0f, - 0.0f - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint16x4_t vInt8 = vld1_dup_u16(reinterpret_cast(pSource)); - int16x8_t vInt16 = vmovl_s8(vreinterpret_s8_u16(vInt8)); - int32x4_t vInt = vmovl_s16(vget_low_s16(vInt16)); - vInt = vandq_s32(vInt, g_XMMaskXY); - return vcvtq_f32_s32(vInt); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 1.0f, 1.0f / 256.0f, 1.0f / 65536.0f, 1.0f / (65536.0f * 256.0f) } } }; - static const XMVECTORU32 Mask = { { { 0xFF, 0xFF00, 0, 0 } } }; - // Splat the color in all four entries (x,z,y,w) - __m128i vInt = XM_LOADU_SI16(&pSource->v); - XMVECTOR vTemp = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); - // Mask - vTemp = _mm_and_ps(vTemp, Mask); - // x,y and z are unsigned! Flip the bits to convert the order to signed - vTemp = _mm_xor_ps(vTemp, g_XMXorByte4); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // x, y and z - 0x80 to complete the conversion - vTemp = _mm_add_ps(vTemp, g_XMAddByte4); - // Fix y, z and w because they are too large - return _mm_mul_ps(vTemp, Scale); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUByteN2(const XMUBYTEN2* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x)* (1.0f / 255.0f), - static_cast(pSource->y)* (1.0f / 255.0f), - 0.0f, - 0.0f - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint16x4_t vInt8 = vld1_dup_u16(reinterpret_cast(pSource)); - uint16x8_t vInt16 = vmovl_u8(vreinterpret_u8_u16(vInt8)); - uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); - vInt = vandq_u32(vInt, g_XMMaskXY); - float32x4_t R = vcvtq_f32_u32(vInt); - return vmulq_n_f32(R, 1.0f / 255.0f); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 1.0f / 255.0f, 1.0f / (255.0f * 256.0f), 0, 0 } } }; - static const XMVECTORU32 Mask = { { { 0xFF, 0xFF00, 0, 0 } } }; - // Splat the color in all four entries (x,z,y,w) - __m128i vInt = XM_LOADU_SI16(&pSource->v); - XMVECTOR vTemp = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); - // Mask - vTemp = _mm_and_ps(vTemp, Mask); - // w is signed! Flip the bits to convert the order to unsigned - vTemp = _mm_xor_ps(vTemp, g_XMFlipW); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // w + 0x80 to complete the conversion - vTemp = _mm_add_ps(vTemp, g_XMAddUDec4); - // Fix y, z and w because they are too large - return _mm_mul_ps(vTemp, Scale); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUByte2(const XMUBYTE2* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x), - static_cast(pSource->y), - 0.0f, - 0.0f - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint16x4_t vInt8 = vld1_dup_u16(reinterpret_cast(pSource)); - uint16x8_t vInt16 = vmovl_u8(vreinterpret_u8_u16(vInt8)); - uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); - vInt = vandq_u32(vInt, g_XMMaskXY); - return vcvtq_f32_u32(vInt); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 1.0f, 1.0f / 256.0f, 0, 0 } } }; - static const XMVECTORU32 Mask = { { { 0xFF, 0xFF00, 0, 0 } } }; - // Splat the color in all four entries (x,z,y,w) - __m128i vInt = XM_LOADU_SI16(&pSource->v); - XMVECTOR vTemp = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); - // Mask - vTemp = _mm_and_ps(vTemp, Mask); - // w is signed! Flip the bits to convert the order to unsigned - vTemp = _mm_xor_ps(vTemp, g_XMFlipW); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // w + 0x80 to complete the conversion - vTemp = _mm_add_ps(vTemp, g_XMAddUDec4); - // Fix y, z and w because they are too large - return _mm_mul_ps(vTemp, Scale); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadU565(const XMU565* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - float(pSource->v & 0x1F), - float((pSource->v >> 5) & 0x3F), - float((pSource->v >> 11) & 0x1F), - 0.f, - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORI32 U565And = { { { 0x1F, 0x3F << 5, 0x1F << 11, 0 } } }; - static const XMVECTORF32 U565Mul = { { { 1.0f, 1.0f / 32.0f, 1.0f / 2048.f, 0 } } }; - uint16x4_t vInt16 = vld1_dup_u16(reinterpret_cast(pSource)); - uint32x4_t vInt = vmovl_u16(vInt16); - vInt = vandq_u32(vInt, U565And); - float32x4_t R = vcvtq_f32_u32(vInt); - return vmulq_f32(R, U565Mul); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORI32 U565And = { { { 0x1F, 0x3F << 5, 0x1F << 11, 0 } } }; - static const XMVECTORF32 U565Mul = { { { 1.0f, 1.0f / 32.0f, 1.0f / 2048.f, 0 } } }; - // Get the 16 bit value and splat it - __m128i vInt = XM_LOADU_SI16(&pSource->v); - XMVECTOR vResult = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); - // Mask off x, y and z - vResult = _mm_and_ps(vResult, U565And); - // Convert to float - vResult = _mm_cvtepi32_ps(_mm_castps_si128(vResult)); - // Normalize x, y, and z - vResult = _mm_mul_ps(vResult, U565Mul); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadFloat3PK(const XMFLOAT3PK* pSource) noexcept -{ - assert(pSource); - - XM_ALIGNED_DATA(16) uint32_t Result[4]; - uint32_t Mantissa; - uint32_t Exponent; - - // X Channel (6-bit mantissa) - Mantissa = pSource->xm; - - if (pSource->xe == 0x1f) // INF or NAN - { - Result[0] = static_cast(0x7f800000 | (static_cast(pSource->xm) << 17)); - } - else - { - if (pSource->xe != 0) // The value is normalized - { - Exponent = pSource->xe; - } - else if (Mantissa != 0) // The value is denormalized - { - // Normalize the value in the resulting float - Exponent = 1; - - do - { - Exponent--; - Mantissa <<= 1; - } - while ((Mantissa & 0x40) == 0); - - Mantissa &= 0x3F; - } - else // The value is zero - { - Exponent = static_cast(-112); - } - - Result[0] = ((Exponent + 112) << 23) | (Mantissa << 17); - } - - // Y Channel (6-bit mantissa) - Mantissa = pSource->ym; - - if (pSource->ye == 0x1f) // INF or NAN - { - Result[1] = static_cast(0x7f800000 | (static_cast(pSource->ym) << 17)); - } - else - { - if (pSource->ye != 0) // The value is normalized - { - Exponent = pSource->ye; - } - else if (Mantissa != 0) // The value is denormalized - { - // Normalize the value in the resulting float - Exponent = 1; - - do - { - Exponent--; - Mantissa <<= 1; - } - while ((Mantissa & 0x40) == 0); - - Mantissa &= 0x3F; - } - else // The value is zero - { - Exponent = static_cast(-112); - } - - Result[1] = ((Exponent + 112) << 23) | (Mantissa << 17); - } - - // Z Channel (5-bit mantissa) - Mantissa = pSource->zm; - - if (pSource->ze == 0x1f) // INF or NAN - { - Result[2] = static_cast(0x7f800000 | (static_cast(pSource->zm) << 17)); - } - else - { - if (pSource->ze != 0) // The value is normalized - { - Exponent = pSource->ze; - } - else if (Mantissa != 0) // The value is denormalized - { - // Normalize the value in the resulting float - Exponent = 1; - - do - { - Exponent--; - Mantissa <<= 1; - } - while ((Mantissa & 0x20) == 0); - - Mantissa &= 0x1F; - } - else // The value is zero - { - Exponent = static_cast(-112); - } - - Result[2] = ((Exponent + 112) << 23) | (Mantissa << 18); - } - - return XMLoadFloat3A(reinterpret_cast(&Result)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadFloat3SE(const XMFLOAT3SE* pSource) noexcept -{ - assert(pSource); - - union { float f; int32_t i; } fi; - fi.i = 0x33800000 + (pSource->e << 23); - float Scale = fi.f; - - XMVECTORF32 v = { { { - Scale * float(pSource->xm), - Scale * float(pSource->ym), - Scale * float(pSource->zm), - 1.0f } } }; - return v; -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadHalf4(const XMHALF4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - __m128i V = _mm_loadl_epi64(reinterpret_cast(pSource)); - return _mm_cvtph_ps(V); -#else - XMVECTORF32 vResult = { { { - XMConvertHalfToFloat(pSource->x), - XMConvertHalfToFloat(pSource->y), - XMConvertHalfToFloat(pSource->z), - XMConvertHalfToFloat(pSource->w) - } } }; - return vResult.v; -#endif // !_XM_F16C_INTRINSICS_ -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadShortN4(const XMSHORTN4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - (pSource->x == -32768) ? -1.f : (static_cast(pSource->x)* (1.0f / 32767.0f)), - (pSource->y == -32768) ? -1.f : (static_cast(pSource->y)* (1.0f / 32767.0f)), - (pSource->z == -32768) ? -1.f : (static_cast(pSource->z)* (1.0f / 32767.0f)), - (pSource->w == -32768) ? -1.f : (static_cast(pSource->w)* (1.0f / 32767.0f)) - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - int16x4_t vInt = vld1_s16(reinterpret_cast(pSource)); - int32x4_t V = vmovl_s16(vInt); - float32x4_t vResult = vcvtq_f32_s32(V); - vResult = vmulq_n_f32(vResult, 1.0f / 32767.0f); - return vmaxq_f32(vResult, vdupq_n_f32(-1.f)); -#elif defined(_XM_SSE_INTRINSICS_) - // Splat the color in all four entries (x,z,y,w) - __m128d vIntd = _mm_load1_pd(reinterpret_cast(&pSource->x)); - // Shift x&0ffff,z&0xffff,y&0xffff0000,w&0xffff0000 - __m128 vTemp = _mm_and_ps(_mm_castpd_ps(vIntd), g_XMMaskX16Y16Z16W16); - // x and z are unsigned! Flip the bits to convert the order to signed - vTemp = _mm_xor_ps(vTemp, g_XMFlipX16Y16Z16W16); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // x and z - 0x8000 to complete the conversion - vTemp = _mm_add_ps(vTemp, g_XMFixX16Y16Z16W16); - // Convert to -1.0f - 1.0f - vTemp = _mm_mul_ps(vTemp, g_XMNormalizeX16Y16Z16W16); - // Very important! The entries are x,z,y,w, flip it to x,y,z,w - vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 1, 2, 0)); - // Clamp result (for case of -32768) - return _mm_max_ps(vTemp, g_XMNegativeOne); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadShort4(const XMSHORT4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x), - static_cast(pSource->y), - static_cast(pSource->z), - static_cast(pSource->w) - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - int16x4_t vInt = vld1_s16(reinterpret_cast(pSource)); - int32x4_t V = vmovl_s16(vInt); - return vcvtq_f32_s32(V); -#elif defined(_XM_SSE_INTRINSICS_) - // Splat the color in all four entries (x,z,y,w) - __m128d vIntd = _mm_load1_pd(reinterpret_cast(&pSource->x)); - // Shift x&0ffff,z&0xffff,y&0xffff0000,w&0xffff0000 - __m128 vTemp = _mm_and_ps(_mm_castpd_ps(vIntd), g_XMMaskX16Y16Z16W16); - // x and z are unsigned! Flip the bits to convert the order to signed - vTemp = _mm_xor_ps(vTemp, g_XMFlipX16Y16Z16W16); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // x and z - 0x8000 to complete the conversion - vTemp = _mm_add_ps(vTemp, g_XMFixX16Y16Z16W16); - // Fix y and w because they are 65536 too large - vTemp = _mm_mul_ps(vTemp, g_XMFixupY16W16); - // Very important! The entries are x,z,y,w, flip it to x,y,z,w - return XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 1, 2, 0)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUShortN4(const XMUSHORTN4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x) / 65535.0f, - static_cast(pSource->y) / 65535.0f, - static_cast(pSource->z) / 65535.0f, - static_cast(pSource->w) / 65535.0f - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint16x4_t vInt = vld1_u16(reinterpret_cast(pSource)); - uint32x4_t V = vmovl_u16(vInt); - float32x4_t vResult = vcvtq_f32_u32(V); - return vmulq_n_f32(vResult, 1.0f / 65535.0f); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 FixupY16W16 = { { { 1.0f / 65535.0f, 1.0f / 65535.0f, 1.0f / (65535.0f * 65536.0f), 1.0f / (65535.0f * 65536.0f) } } }; - static const XMVECTORF32 FixaddY16W16 = { { { 0, 0, 32768.0f * 65536.0f, 32768.0f * 65536.0f } } }; - // Splat the color in all four entries (x,z,y,w) - __m128d vIntd = _mm_load1_pd(reinterpret_cast(&pSource->x)); - // Shift x&0ffff,z&0xffff,y&0xffff0000,w&0xffff0000 - __m128 vTemp = _mm_and_ps(_mm_castpd_ps(vIntd), g_XMMaskX16Y16Z16W16); - // y and w are signed! Flip the bits to convert the order to unsigned - vTemp = _mm_xor_ps(vTemp, g_XMFlipZW); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // y and w + 0x8000 to complete the conversion - vTemp = _mm_add_ps(vTemp, FixaddY16W16); - // Fix y and w because they are 65536 too large - vTemp = _mm_mul_ps(vTemp, FixupY16W16); - // Very important! The entries are x,z,y,w, flip it to x,y,z,w - return XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 1, 2, 0)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUShort4(const XMUSHORT4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x), - static_cast(pSource->y), - static_cast(pSource->z), - static_cast(pSource->w) - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint16x4_t vInt = vld1_u16(reinterpret_cast(pSource)); - uint32x4_t V = vmovl_u16(vInt); - return vcvtq_f32_u32(V); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 FixaddY16W16 = { { { 0, 0, 32768.0f, 32768.0f } } }; - // Splat the color in all four entries (x,z,y,w) - __m128d vIntd = _mm_load1_pd(reinterpret_cast(&pSource->x)); - // Shift x&0ffff,z&0xffff,y&0xffff0000,w&0xffff0000 - __m128 vTemp = _mm_and_ps(_mm_castpd_ps(vIntd), g_XMMaskX16Y16Z16W16); - // y and w are signed! Flip the bits to convert the order to unsigned - vTemp = _mm_xor_ps(vTemp, g_XMFlipZW); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // Fix y and w because they are 65536 too large - vTemp = _mm_mul_ps(vTemp, g_XMFixupY16W16); - // y and w + 0x8000 to complete the conversion - vTemp = _mm_add_ps(vTemp, FixaddY16W16); - // Very important! The entries are x,z,y,w, flip it to x,y,z,w - return XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 1, 2, 0)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadXDecN4(const XMXDECN4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - static const uint32_t SignExtend[] = { 0x00000000, 0xFFFFFC00 }; - - uint32_t ElementX = pSource->v & 0x3FF; - uint32_t ElementY = (pSource->v >> 10) & 0x3FF; - uint32_t ElementZ = (pSource->v >> 20) & 0x3FF; - - XMVECTORF32 vResult = { { { - (ElementX == 0x200) ? -1.f : (static_cast(static_cast(ElementX | SignExtend[ElementX >> 9])) / 511.0f), - (ElementY == 0x200) ? -1.f : (static_cast(static_cast(ElementY | SignExtend[ElementY >> 9])) / 511.0f), - (ElementZ == 0x200) ? -1.f : (static_cast(static_cast(ElementZ | SignExtend[ElementZ >> 9])) / 511.0f), - static_cast(pSource->v >> 30) / 3.0f - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); - vInt = vandq_u32(vInt, g_XMMaskA2B10G10R10); - vInt = veorq_u32(vInt, g_XMFlipA2B10G10R10); - float32x4_t R = vcvtq_f32_s32(vreinterpretq_s32_u32(vInt)); - R = vaddq_f32(R, g_XMFixAA2B10G10R10); - R = vmulq_f32(R, g_XMNormalizeA2B10G10R10); - return vmaxq_f32(R, vdupq_n_f32(-1.0f)); -#elif defined(_XM_SSE_INTRINSICS_) - // Splat the color in all four entries - __m128 vTemp = _mm_load_ps1(reinterpret_cast(&pSource->v)); - // Shift R&0xFF0000, G&0xFF00, B&0xFF, A&0xFF000000 - vTemp = _mm_and_ps(vTemp, g_XMMaskA2B10G10R10); - // a is unsigned! Flip the bit to convert the order to signed - vTemp = _mm_xor_ps(vTemp, g_XMFlipA2B10G10R10); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // RGB + 0, A + 0x80000000.f to undo the signed order. - vTemp = _mm_add_ps(vTemp, g_XMFixAA2B10G10R10); - // Convert 0-255 to 0.0f-1.0f - vTemp = _mm_mul_ps(vTemp, g_XMNormalizeA2B10G10R10); - // Clamp result (for case of -512) - return _mm_max_ps(vTemp, g_XMNegativeOne); -#endif -} - -//------------------------------------------------------------------------------ -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4996) -// C4996: ignore deprecation warning -#endif - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -#endif - -#ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif - -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadXDec4(const XMXDEC4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - static const uint32_t SignExtend[] = { 0x00000000, 0xFFFFFC00 }; - - uint32_t ElementX = pSource->v & 0x3FF; - uint32_t ElementY = (pSource->v >> 10) & 0x3FF; - uint32_t ElementZ = (pSource->v >> 20) & 0x3FF; - - XMVECTORF32 vResult = { { { - static_cast(static_cast(ElementX | SignExtend[ElementX >> 9])), - static_cast(static_cast(ElementY | SignExtend[ElementY >> 9])), - static_cast(static_cast(ElementZ | SignExtend[ElementZ >> 9])), - static_cast(pSource->v >> 30) - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORU32 XDec4Xor = { { { 0x200, 0x200 << 10, 0x200 << 20, 0x80000000 } } }; - static const XMVECTORF32 XDec4Add = { { { -512.0f, -512.0f * 1024.0f, -512.0f * 1024.0f * 1024.0f, 32768 * 65536.0f } } }; - uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); - vInt = vandq_u32(vInt, g_XMMaskDec4); - vInt = veorq_u32(vInt, XDec4Xor); - float32x4_t R = vcvtq_f32_s32(vreinterpretq_s32_u32(vInt)); - R = vaddq_f32(R, XDec4Add); - return vmulq_f32(R, g_XMMulDec4); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORU32 XDec4Xor = { { { 0x200, 0x200 << 10, 0x200 << 20, 0x80000000 } } }; - static const XMVECTORF32 XDec4Add = { { { -512.0f, -512.0f * 1024.0f, -512.0f * 1024.0f * 1024.0f, 32768 * 65536.0f } } }; - // Splat the color in all four entries - XMVECTOR vTemp = _mm_load_ps1(reinterpret_cast(&pSource->v)); - // Shift R&0xFF0000, G&0xFF00, B&0xFF, A&0xFF000000 - vTemp = _mm_and_ps(vTemp, g_XMMaskDec4); - // a is unsigned! Flip the bit to convert the order to signed - vTemp = _mm_xor_ps(vTemp, XDec4Xor); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // RGB + 0, A + 0x80000000.f to undo the signed order. - vTemp = _mm_add_ps(vTemp, XDec4Add); - // Convert 0-255 to 0.0f-1.0f - vTemp = _mm_mul_ps(vTemp, g_XMMulDec4); - return vTemp; -#endif -} - -#ifdef __GNUC__ -#pragma GCC diagnostic pop -#endif -#ifdef __clang__ -#pragma clang diagnostic pop -#endif -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUDecN4(const XMUDECN4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - - uint32_t ElementX = pSource->v & 0x3FF; - uint32_t ElementY = (pSource->v >> 10) & 0x3FF; - uint32_t ElementZ = (pSource->v >> 20) & 0x3FF; - - XMVECTORF32 vResult = { { { - static_cast(ElementX) / 1023.0f, - static_cast(ElementY) / 1023.0f, - static_cast(ElementZ) / 1023.0f, - static_cast(pSource->v >> 30) / 3.0f - } } }; - return vResult.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 UDecN4Mul = { { { 1.0f / 1023.0f, 1.0f / (1023.0f * 1024.0f), 1.0f / (1023.0f * 1024.0f * 1024.0f), 1.0f / (3.0f * 1024.0f * 1024.0f * 1024.0f) } } }; - uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); - vInt = vandq_u32(vInt, g_XMMaskDec4); - float32x4_t R = vcvtq_f32_u32(vInt); - return vmulq_f32(R, UDecN4Mul); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 UDecN4Mul = { { { 1.0f / 1023.0f, 1.0f / (1023.0f * 1024.0f), 1.0f / (1023.0f * 1024.0f * 1024.0f), 1.0f / (3.0f * 1024.0f * 1024.0f * 1024.0f) } } }; - // Splat the color in all four entries - XMVECTOR vTemp = _mm_load_ps1(reinterpret_cast(&pSource->v)); - // Shift R&0xFF0000, G&0xFF00, B&0xFF, A&0xFF000000 - vTemp = _mm_and_ps(vTemp, g_XMMaskDec4); - // a is unsigned! Flip the bit to convert the order to signed - vTemp = _mm_xor_ps(vTemp, g_XMFlipW); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // RGB + 0, A + 0x80000000.f to undo the signed order. - vTemp = _mm_add_ps(vTemp, g_XMAddUDec4); - // Convert 0-255 to 0.0f-1.0f - vTemp = _mm_mul_ps(vTemp, UDecN4Mul); - return vTemp; -#endif -} - - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUDecN4_XR(const XMUDECN4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - - int32_t ElementX = pSource->v & 0x3FF; - int32_t ElementY = (pSource->v >> 10) & 0x3FF; - int32_t ElementZ = (pSource->v >> 20) & 0x3FF; - - XMVECTORF32 vResult = { { { - static_cast(ElementX - 0x180) / 510.0f, - static_cast(ElementY - 0x180) / 510.0f, - static_cast(ElementZ - 0x180) / 510.0f, - static_cast(pSource->v >> 30) / 3.0f - } } }; - - return vResult.v; - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 XRMul = { { { 1.0f / 510.0f, 1.0f / (510.0f * 1024.0f), 1.0f / (510.0f * 1024.0f * 1024.0f), 1.0f / (3.0f * 1024.0f * 1024.0f * 1024.0f) } } }; - static const XMVECTORI32 XRBias = { { { 0x180, 0x180 * 1024, 0x180 * 1024 * 1024, 0 } } }; - uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); - vInt = vandq_u32(vInt, g_XMMaskDec4); - int32x4_t vTemp = vsubq_s32(vreinterpretq_s32_u32(vInt), XRBias); - vTemp = veorq_s32(vTemp, g_XMFlipW); - float32x4_t R = vcvtq_f32_s32(vTemp); - R = vaddq_f32(R, g_XMAddUDec4); - return vmulq_f32(R, XRMul); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 XRMul = { { { 1.0f / 510.0f, 1.0f / (510.0f * 1024.0f), 1.0f / (510.0f * 1024.0f * 1024.0f), 1.0f / (3.0f * 1024.0f * 1024.0f * 1024.0f) } } }; - static const XMVECTORI32 XRBias = { { { 0x180, 0x180 * 1024, 0x180 * 1024 * 1024, 0 } } }; - // Splat the color in all four entries - XMVECTOR vTemp = _mm_load_ps1(reinterpret_cast(&pSource->v)); - // Mask channels - vTemp = _mm_and_ps(vTemp, g_XMMaskDec4); - // Subtract bias - vTemp = _mm_castsi128_ps(_mm_sub_epi32(_mm_castps_si128(vTemp), XRBias)); - // a is unsigned! Flip the bit to convert the order to signed - vTemp = _mm_xor_ps(vTemp, g_XMFlipW); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // RGB + 0, A + 0x80000000.f to undo the signed order. - vTemp = _mm_add_ps(vTemp, g_XMAddUDec4); - // Convert to 0.0f-1.0f - return _mm_mul_ps(vTemp, XRMul); -#endif -} - - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUDec4(const XMUDEC4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - uint32_t ElementX = pSource->v & 0x3FF; - uint32_t ElementY = (pSource->v >> 10) & 0x3FF; - uint32_t ElementZ = (pSource->v >> 20) & 0x3FF; - - XMVECTORF32 vResult = { { { - static_cast(ElementX), - static_cast(ElementY), - static_cast(ElementZ), - static_cast(pSource->v >> 30) - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); - vInt = vandq_u32(vInt, g_XMMaskDec4); - float32x4_t R = vcvtq_f32_u32(vInt); - return vmulq_f32(R, g_XMMulDec4); -#elif defined(_XM_SSE_INTRINSICS_) - // Splat the color in all four entries - XMVECTOR vTemp = _mm_load_ps1(reinterpret_cast(&pSource->v)); - // Shift R&0xFF0000, G&0xFF00, B&0xFF, A&0xFF000000 - vTemp = _mm_and_ps(vTemp, g_XMMaskDec4); - // a is unsigned! Flip the bit to convert the order to signed - vTemp = _mm_xor_ps(vTemp, g_XMFlipW); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // RGB + 0, A + 0x80000000.f to undo the signed order. - vTemp = _mm_add_ps(vTemp, g_XMAddUDec4); - // Convert 0-255 to 0.0f-1.0f - vTemp = _mm_mul_ps(vTemp, g_XMMulDec4); - return vTemp; -#endif -} - -//------------------------------------------------------------------------------ -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4996) -// C4996: ignore deprecation warning -#endif - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -#endif - -#ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif - -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadDecN4(const XMDECN4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - static const uint32_t SignExtend[] = { 0x00000000, 0xFFFFFC00 }; - static const uint32_t SignExtendW[] = { 0x00000000, 0xFFFFFFFC }; - - uint32_t ElementX = pSource->v & 0x3FF; - uint32_t ElementY = (pSource->v >> 10) & 0x3FF; - uint32_t ElementZ = (pSource->v >> 20) & 0x3FF; - uint32_t ElementW = pSource->v >> 30; - - XMVECTORF32 vResult = { { { - (ElementX == 0x200) ? -1.f : (static_cast(static_cast(ElementX | SignExtend[ElementX >> 9])) / 511.0f), - (ElementY == 0x200) ? -1.f : (static_cast(static_cast(ElementY | SignExtend[ElementY >> 9])) / 511.0f), - (ElementZ == 0x200) ? -1.f : (static_cast(static_cast(ElementZ | SignExtend[ElementZ >> 9])) / 511.0f), - (ElementW == 0x2) ? -1.f : static_cast(static_cast(ElementW | SignExtendW[(ElementW >> 1) & 1])) - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 DecN4Mul = { { { 1.0f / 511.0f, 1.0f / (511.0f * 1024.0f), 1.0f / (511.0f * 1024.0f * 1024.0f), 1.0f / (1024.0f * 1024.0f * 1024.0f) } } }; - uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); - vInt = vandq_u32(vInt, g_XMMaskDec4); - vInt = veorq_u32(vInt, g_XMXorDec4); - float32x4_t R = vcvtq_f32_s32(vreinterpretq_s32_u32(vInt)); - R = vaddq_f32(R, g_XMAddDec4); - R = vmulq_f32(R, DecN4Mul); - return vmaxq_f32(R, vdupq_n_f32(-1.0f)); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 DecN4Mul = { { { 1.0f / 511.0f, 1.0f / (511.0f * 1024.0f), 1.0f / (511.0f * 1024.0f * 1024.0f), 1.0f / (1024.0f * 1024.0f * 1024.0f) } } }; - // Splat the color in all four entries - XMVECTOR vTemp = _mm_load_ps1(reinterpret_cast(&pSource->v)); - // Shift R&0xFF0000, G&0xFF00, B&0xFF, A&0xFF000000 - vTemp = _mm_and_ps(vTemp, g_XMMaskDec4); - // a is unsigned! Flip the bit to convert the order to signed - vTemp = _mm_xor_ps(vTemp, g_XMXorDec4); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // RGB + 0, A + 0x80000000.f to undo the signed order. - vTemp = _mm_add_ps(vTemp, g_XMAddDec4); - // Convert 0-255 to 0.0f-1.0f - vTemp = _mm_mul_ps(vTemp, DecN4Mul); - // Clamp result (for case of -512/-1) - return _mm_max_ps(vTemp, g_XMNegativeOne); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadDec4(const XMDEC4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - static const uint32_t SignExtend[] = { 0x00000000, 0xFFFFFC00 }; - static const uint32_t SignExtendW[] = { 0x00000000, 0xFFFFFFFC }; - - uint32_t ElementX = pSource->v & 0x3FF; - uint32_t ElementY = (pSource->v >> 10) & 0x3FF; - uint32_t ElementZ = (pSource->v >> 20) & 0x3FF; - uint32_t ElementW = pSource->v >> 30; - - XMVECTORF32 vResult = { { { - static_cast(static_cast(ElementX | SignExtend[ElementX >> 9])), - static_cast(static_cast(ElementY | SignExtend[ElementY >> 9])), - static_cast(static_cast(ElementZ | SignExtend[ElementZ >> 9])), - static_cast(static_cast(ElementW | SignExtendW[ElementW >> 1])) - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); - vInt = vandq_u32(vInt, g_XMMaskDec4); - vInt = veorq_u32(vInt, g_XMXorDec4); - float32x4_t R = vcvtq_f32_s32(vreinterpretq_s32_u32(vInt)); - R = vaddq_f32(R, g_XMAddDec4); - return vmulq_f32(R, g_XMMulDec4); -#elif defined(_XM_SSE_INTRINSICS_) - // Splat the color in all four entries - XMVECTOR vTemp = _mm_load_ps1(reinterpret_cast(&pSource->v)); - // Shift R&0xFF0000, G&0xFF00, B&0xFF, A&0xFF000000 - vTemp = _mm_and_ps(vTemp, g_XMMaskDec4); - // a is unsigned! Flip the bit to convert the order to signed - vTemp = _mm_xor_ps(vTemp, g_XMXorDec4); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // RGB + 0, A + 0x80000000.f to undo the signed order. - vTemp = _mm_add_ps(vTemp, g_XMAddDec4); - // Convert 0-255 to 0.0f-1.0f - vTemp = _mm_mul_ps(vTemp, g_XMMulDec4); - return vTemp; -#endif -} - -#ifdef __GNUC__ -#pragma GCC diagnostic pop -#endif -#ifdef __clang__ -#pragma clang diagnostic pop -#endif -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUByteN4(const XMUBYTEN4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x) / 255.0f, - static_cast(pSource->y) / 255.0f, - static_cast(pSource->z) / 255.0f, - static_cast(pSource->w) / 255.0f - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vInt8 = vld1_dup_u32(reinterpret_cast(pSource)); - uint16x8_t vInt16 = vmovl_u8(vreinterpret_u8_u32(vInt8)); - uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); - float32x4_t R = vcvtq_f32_u32(vInt); - return vmulq_n_f32(R, 1.0f / 255.0f); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 LoadUByteN4Mul = { { { 1.0f / 255.0f, 1.0f / (255.0f * 256.0f), 1.0f / (255.0f * 65536.0f), 1.0f / (255.0f * 65536.0f * 256.0f) } } }; - // Splat the color in all four entries (x,z,y,w) - XMVECTOR vTemp = _mm_load1_ps(reinterpret_cast(&pSource->x)); - // Mask x&0ff,y&0xff00,z&0xff0000,w&0xff000000 - vTemp = _mm_and_ps(vTemp, g_XMMaskByte4); - // w is signed! Flip the bits to convert the order to unsigned - vTemp = _mm_xor_ps(vTemp, g_XMFlipW); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // w + 0x80 to complete the conversion - vTemp = _mm_add_ps(vTemp, g_XMAddUDec4); - // Fix y, z and w because they are too large - vTemp = _mm_mul_ps(vTemp, LoadUByteN4Mul); - return vTemp; -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUByte4(const XMUBYTE4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x), - static_cast(pSource->y), - static_cast(pSource->z), - static_cast(pSource->w) - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vInt8 = vld1_dup_u32(reinterpret_cast(pSource)); - uint16x8_t vInt16 = vmovl_u8(vreinterpret_u8_u32(vInt8)); - uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); - return vcvtq_f32_u32(vInt); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 LoadUByte4Mul = { { { 1.0f, 1.0f / 256.0f, 1.0f / 65536.0f, 1.0f / (65536.0f * 256.0f) } } }; - // Splat the color in all four entries (x,z,y,w) - XMVECTOR vTemp = _mm_load1_ps(reinterpret_cast(&pSource->x)); - // Mask x&0ff,y&0xff00,z&0xff0000,w&0xff000000 - vTemp = _mm_and_ps(vTemp, g_XMMaskByte4); - // w is signed! Flip the bits to convert the order to unsigned - vTemp = _mm_xor_ps(vTemp, g_XMFlipW); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // w + 0x80 to complete the conversion - vTemp = _mm_add_ps(vTemp, g_XMAddUDec4); - // Fix y, z and w because they are too large - vTemp = _mm_mul_ps(vTemp, LoadUByte4Mul); - return vTemp; -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadByteN4(const XMBYTEN4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - (pSource->x == -128) ? -1.f : (static_cast(pSource->x) / 127.0f), - (pSource->y == -128) ? -1.f : (static_cast(pSource->y) / 127.0f), - (pSource->z == -128) ? -1.f : (static_cast(pSource->z) / 127.0f), - (pSource->w == -128) ? -1.f : (static_cast(pSource->w) / 127.0f) - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vInt8 = vld1_dup_u32(reinterpret_cast(pSource)); - int16x8_t vInt16 = vmovl_s8(vreinterpret_s8_u32(vInt8)); - int32x4_t vInt = vmovl_s16(vget_low_s16(vInt16)); - float32x4_t R = vcvtq_f32_s32(vInt); - R = vmulq_n_f32(R, 1.0f / 127.0f); - return vmaxq_f32(R, vdupq_n_f32(-1.f)); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 LoadByteN4Mul = { { { 1.0f / 127.0f, 1.0f / (127.0f * 256.0f), 1.0f / (127.0f * 65536.0f), 1.0f / (127.0f * 65536.0f * 256.0f) } } }; - // Splat the color in all four entries (x,z,y,w) - XMVECTOR vTemp = _mm_load1_ps(reinterpret_cast(&pSource->x)); - // Mask x&0ff,y&0xff00,z&0xff0000,w&0xff000000 - vTemp = _mm_and_ps(vTemp, g_XMMaskByte4); - // x,y and z are unsigned! Flip the bits to convert the order to signed - vTemp = _mm_xor_ps(vTemp, g_XMXorByte4); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // x, y and z - 0x80 to complete the conversion - vTemp = _mm_add_ps(vTemp, g_XMAddByte4); - // Fix y, z and w because they are too large - vTemp = _mm_mul_ps(vTemp, LoadByteN4Mul); - // Clamp result (for case of -128) - return _mm_max_ps(vTemp, g_XMNegativeOne); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadByte4(const XMBYTE4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - static_cast(pSource->x), - static_cast(pSource->y), - static_cast(pSource->z), - static_cast(pSource->w) - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - uint32x2_t vInt8 = vld1_dup_u32(reinterpret_cast(pSource)); - int16x8_t vInt16 = vmovl_s8(vreinterpret_s8_u32(vInt8)); - int32x4_t vInt = vmovl_s16(vget_low_s16(vInt16)); - return vcvtq_f32_s32(vInt); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 LoadByte4Mul = { { { 1.0f, 1.0f / 256.0f, 1.0f / 65536.0f, 1.0f / (65536.0f * 256.0f) } } }; - // Splat the color in all four entries (x,z,y,w) - XMVECTOR vTemp = _mm_load1_ps(reinterpret_cast(&pSource->x)); - // Mask x&0ff,y&0xff00,z&0xff0000,w&0xff000000 - vTemp = _mm_and_ps(vTemp, g_XMMaskByte4); - // x,y and z are unsigned! Flip the bits to convert the order to signed - vTemp = _mm_xor_ps(vTemp, g_XMXorByte4); - // Convert to floating point numbers - vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); - // x, y and z - 0x80 to complete the conversion - vTemp = _mm_add_ps(vTemp, g_XMAddByte4); - // Fix y, z and w because they are too large - vTemp = _mm_mul_ps(vTemp, LoadByte4Mul); - return vTemp; -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadUNibble4(const XMUNIBBLE4* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - float(pSource->v & 0xF), - float((pSource->v >> 4) & 0xF), - float((pSource->v >> 8) & 0xF), - float((pSource->v >> 12) & 0xF) - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORI32 UNibble4And = { { { 0xF, 0xF0, 0xF00, 0xF000 } } }; - static const XMVECTORF32 UNibble4Mul = { { { 1.0f, 1.0f / 16.f, 1.0f / 256.f, 1.0f / 4096.f } } }; - uint16x4_t vInt16 = vld1_dup_u16(reinterpret_cast(pSource)); - uint32x4_t vInt = vmovl_u16(vInt16); - vInt = vandq_u32(vInt, UNibble4And); - float32x4_t R = vcvtq_f32_u32(vInt); - return vmulq_f32(R, UNibble4Mul); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORI32 UNibble4And = { { { 0xF, 0xF0, 0xF00, 0xF000 } } }; - static const XMVECTORF32 UNibble4Mul = { { { 1.0f, 1.0f / 16.f, 1.0f / 256.f, 1.0f / 4096.f } } }; - // Get the 16 bit value and splat it - __m128i vInt = XM_LOADU_SI16(&pSource->v); - XMVECTOR vResult = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); - // Mask off x, y and z - vResult = _mm_and_ps(vResult, UNibble4And); - // Convert to float - vResult = _mm_cvtepi32_ps(_mm_castps_si128(vResult)); - // Normalize x, y, and z - vResult = _mm_mul_ps(vResult, UNibble4Mul); - return vResult; -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMVECTOR XM_CALLCONV XMLoadU555(const XMU555* pSource) noexcept -{ - assert(pSource); -#if defined(_XM_NO_INTRINSICS_) - XMVECTORF32 vResult = { { { - float(pSource->v & 0x1F), - float((pSource->v >> 5) & 0x1F), - float((pSource->v >> 10) & 0x1F), - float((pSource->v >> 15) & 0x1) - } } }; - return vResult.v; -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORI32 U555And = { { { 0x1F, 0x1F << 5, 0x1F << 10, 0x8000 } } }; - static const XMVECTORF32 U555Mul = { { { 1.0f, 1.0f / 32.f, 1.0f / 1024.f, 1.0f / 32768.f } } }; - uint16x4_t vInt16 = vld1_dup_u16(reinterpret_cast(pSource)); - uint32x4_t vInt = vmovl_u16(vInt16); - vInt = vandq_u32(vInt, U555And); - float32x4_t R = vcvtq_f32_u32(vInt); - return vmulq_f32(R, U555Mul); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORI32 U555And = { { { 0x1F, 0x1F << 5, 0x1F << 10, 0x8000 } } }; - static const XMVECTORF32 U555Mul = { { { 1.0f, 1.0f / 32.f, 1.0f / 1024.f, 1.0f / 32768.f } } }; - // Get the 16bit value and splat it - __m128i vInt = XM_LOADU_SI16(&pSource->v); - XMVECTOR vResult = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); - // Mask off x, y and z - vResult = _mm_and_ps(vResult, U555And); - // Convert to float - vResult = _mm_cvtepi32_ps(_mm_castps_si128(vResult)); - // Normalize x, y, and z - vResult = _mm_mul_ps(vResult, U555Mul); - return vResult; -#endif -} - -#ifdef _PREFAST_ -#pragma prefast(pop) -#endif - -/**************************************************************************** - * - * Vector and matrix store operations - * - ****************************************************************************/ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreColor -( - XMCOLOR* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorSaturate(V); - N = XMVectorMultiply(N, g_UByteMax); - N = XMVectorRound(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->c = (static_cast(tmp.w) << 24) | - (static_cast(tmp.x) << 16) | - (static_cast(tmp.y) << 8) | - static_cast(tmp.z); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0)); - R = vminq_f32(R, vdupq_n_f32(1.0f)); - R = vmulq_n_f32(R, 255.0f); - R = XMVectorRound(R); - uint32x4_t vInt32 = vcvtq_u32_f32(R); - uint16x4_t vInt16 = vqmovn_u32(vInt32); - uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); - uint32_t rgba = vget_lane_u32(vreinterpret_u32_u8(vInt8), 0); - pDestination->c = (rgba & 0xFF00FF00) | ((rgba >> 16) & 0xFF) | ((rgba << 16) & 0xFF0000); -#elif defined(_XM_SSE_INTRINSICS_) - // Set <0 to 0 - XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - // Set>1 to 1 - vResult = _mm_min_ps(vResult, g_XMOne); - // Convert to 0-255 - vResult = _mm_mul_ps(vResult, g_UByteMax); - // Shuffle RGBA to ARGB - vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 0, 1, 2)); - // Convert to int - __m128i vInt = _mm_cvtps_epi32(vResult); - // Mash to shorts - vInt = _mm_packs_epi32(vInt, vInt); - // Mash to bytes - vInt = _mm_packus_epi16(vInt, vInt); - // Store the color - _mm_store_ss(reinterpret_cast(&pDestination->c), _mm_castsi128_ps(vInt)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreHalf2 -( - XMHALF2* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - __m128i V1 = _mm_cvtps_ph(V, _MM_FROUND_TO_NEAREST_INT); - _mm_store_ss(reinterpret_cast(pDestination), _mm_castsi128_ps(V1)); -#else - pDestination->x = XMConvertFloatToHalf(XMVectorGetX(V)); - pDestination->y = XMConvertFloatToHalf(XMVectorGetY(V)); -#endif // !_XM_F16C_INTRINSICS_ -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreShortN2 -( - XMSHORTN2* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorClamp(V, g_XMNegativeOne.v, g_XMOne.v); - N = XMVectorMultiply(N, g_ShortMax); - N = XMVectorRound(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->x = static_cast(tmp.x); - pDestination->y = static_cast(tmp.y); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-1.f)); - R = vminq_f32(R, vdupq_n_f32(1.0f)); - R = vmulq_n_f32(R, 32767.0f); - int32x4_t vInt32 = vcvtq_s32_f32(R); - int16x4_t vInt16 = vqmovn_s32(vInt32); - vst1_lane_u32(&pDestination->v, vreinterpret_u32_s16(vInt16), 0); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = _mm_max_ps(V, g_XMNegativeOne); - vResult = _mm_min_ps(vResult, g_XMOne); - vResult = _mm_mul_ps(vResult, g_ShortMax); - __m128i vResulti = _mm_cvtps_epi32(vResult); - vResulti = _mm_packs_epi32(vResulti, vResulti); - _mm_store_ss(reinterpret_cast(&pDestination->x), _mm_castsi128_ps(vResulti)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreShort2 -( - XMSHORT2* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorClamp(V, g_ShortMin, g_ShortMax); - N = XMVectorRound(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->x = static_cast(tmp.x); - pDestination->y = static_cast(tmp.y); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-32767.f)); - R = vminq_f32(R, vdupq_n_f32(32767.0f)); - int32x4_t vInt32 = vcvtq_s32_f32(R); - int16x4_t vInt16 = vqmovn_s32(vInt32); - vst1_lane_u32(&pDestination->v, vreinterpret_u32_s16(vInt16), 0); -#elif defined(_XM_SSE_INTRINSICS_) - // Bounds check - XMVECTOR vResult = _mm_max_ps(V, g_ShortMin); - vResult = _mm_min_ps(vResult, g_ShortMax); - // Convert to int with rounding - __m128i vInt = _mm_cvtps_epi32(vResult); - // Pack the ints into shorts - vInt = _mm_packs_epi32(vInt, vInt); - _mm_store_ss(reinterpret_cast(&pDestination->x), _mm_castsi128_ps(vInt)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUShortN2 -( - XMUSHORTN2* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorSaturate(V); - N = XMVectorMultiplyAdd(N, g_UShortMax, g_XMOneHalf.v); - N = XMVectorTruncate(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->x = static_cast(tmp.x); - pDestination->y = static_cast(tmp.y); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0.f)); - R = vminq_f32(R, vdupq_n_f32(1.0f)); - R = vmulq_n_f32(R, 65535.0f); - R = vaddq_f32(R, g_XMOneHalf); - uint32x4_t vInt32 = vcvtq_u32_f32(R); - uint16x4_t vInt16 = vqmovn_u32(vInt32); - vst1_lane_u32(&pDestination->v, vreinterpret_u32_u16(vInt16), 0); -#elif defined(_XM_SSE_INTRINSICS_) - // Bounds check - XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, g_XMOne); - vResult = _mm_mul_ps(vResult, g_UShortMax); - vResult = _mm_add_ps(vResult, g_XMOneHalf); - // Convert to int - __m128i vInt = _mm_cvttps_epi32(vResult); - // Since the SSE pack instruction clamps using signed rules, - // manually extract the values to store them to memory - pDestination->x = static_cast(_mm_extract_epi16(vInt, 0)); - pDestination->y = static_cast(_mm_extract_epi16(vInt, 2)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUShort2 -( - XMUSHORT2* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorClamp(V, XMVectorZero(), g_UShortMax); - N = XMVectorRound(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->x = static_cast(tmp.x); - pDestination->y = static_cast(tmp.y); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0.f)); - R = vminq_f32(R, vdupq_n_f32(65535.0f)); - uint32x4_t vInt32 = vcvtq_u32_f32(R); - uint16x4_t vInt16 = vqmovn_u32(vInt32); - vst1_lane_u32(&pDestination->v, vreinterpret_u32_u16(vInt16), 0); -#elif defined(_XM_SSE_INTRINSICS_) - // Bounds check - XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, g_UShortMax); - // Convert to int with rounding - __m128i vInt = _mm_cvtps_epi32(vResult); - // Since the SSE pack instruction clamps using signed rules, - // manually extract the values to store them to memory - pDestination->x = static_cast(_mm_extract_epi16(vInt, 0)); - pDestination->y = static_cast(_mm_extract_epi16(vInt, 2)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreByteN2 -( - XMBYTEN2* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorClamp(V, g_XMNegativeOne.v, g_XMOne.v); - N = XMVectorMultiply(N, g_ByteMax); - N = XMVectorRound(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->x = static_cast(tmp.x); - pDestination->y = static_cast(tmp.y); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-1.f)); - R = vminq_f32(R, vdupq_n_f32(1.0f)); - R = vmulq_n_f32(R, 127.0f); - int32x4_t vInt32 = vcvtq_s32_f32(R); - int16x4_t vInt16 = vqmovn_s32(vInt32); - int8x8_t vInt8 = vqmovn_s16(vcombine_s16(vInt16, vInt16)); - vst1_lane_u16(reinterpret_cast(pDestination), vreinterpret_u16_s8(vInt8), 0); -#elif defined(_XM_SSE_INTRINSICS_) - // Clamp to bounds - XMVECTOR vResult = _mm_max_ps(V, g_XMNegativeOne); - vResult = _mm_min_ps(vResult, g_XMOne); - // Scale by multiplication - vResult = _mm_mul_ps(vResult, g_ByteMax); - // Convert to int by rounding - __m128i vInt = _mm_cvtps_epi32(vResult); - // No SSE operations will write to 16-bit values, so we have to extract them manually - auto x = static_cast(_mm_extract_epi16(vInt, 0)); - auto y = static_cast(_mm_extract_epi16(vInt, 2)); - pDestination->v = static_cast(((static_cast(y) & 0xFF) << 8) | (static_cast(x) & 0xFF)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreByte2 -( - XMBYTE2* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorClamp(V, g_ByteMin, g_ByteMax); - N = XMVectorRound(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->x = static_cast(tmp.x); - pDestination->y = static_cast(tmp.y); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-127.f)); - R = vminq_f32(R, vdupq_n_f32(127.0f)); - int32x4_t vInt32 = vcvtq_s32_f32(R); - int16x4_t vInt16 = vqmovn_s32(vInt32); - int8x8_t vInt8 = vqmovn_s16(vcombine_s16(vInt16, vInt16)); - vst1_lane_u16(reinterpret_cast(pDestination), vreinterpret_u16_s8(vInt8), 0); -#elif defined(_XM_SSE_INTRINSICS_) - // Clamp to bounds - XMVECTOR vResult = _mm_max_ps(V, g_ByteMin); - vResult = _mm_min_ps(vResult, g_ByteMax); - // Convert to int by rounding - __m128i vInt = _mm_cvtps_epi32(vResult); - // No SSE operations will write to 16-bit values, so we have to extract them manually - auto x = static_cast(_mm_extract_epi16(vInt, 0)); - auto y = static_cast(_mm_extract_epi16(vInt, 2)); - pDestination->v = static_cast(((static_cast(y) & 0xFF) << 8) | (static_cast(x) & 0xFF)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUByteN2 -( - XMUBYTEN2* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorSaturate(V); - N = XMVectorMultiplyAdd(N, g_UByteMax, g_XMOneHalf.v); - N = XMVectorTruncate(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->x = static_cast(tmp.x); - pDestination->y = static_cast(tmp.y); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0.f)); - R = vminq_f32(R, vdupq_n_f32(1.0f)); - R = vmulq_n_f32(R, 255.0f); - R = vaddq_f32(R, g_XMOneHalf); - uint32x4_t vInt32 = vcvtq_u32_f32(R); - uint16x4_t vInt16 = vqmovn_u32(vInt32); - uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); - vst1_lane_u16(reinterpret_cast(pDestination), vreinterpret_u16_u8(vInt8), 0); -#elif defined(_XM_SSE_INTRINSICS_) - // Clamp to bounds - XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, g_XMOne); - // Scale by multiplication - vResult = _mm_mul_ps(vResult, g_UByteMax); - vResult = _mm_add_ps(vResult, g_XMOneHalf); - // Convert to int - __m128i vInt = _mm_cvttps_epi32(vResult); - // No SSE operations will write to 16-bit values, so we have to extract them manually - auto x = static_cast(_mm_extract_epi16(vInt, 0)); - auto y = static_cast(_mm_extract_epi16(vInt, 2)); - pDestination->v = static_cast(((static_cast(y) & 0xFF) << 8) | (static_cast(x) & 0xFF)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUByte2 -( - XMUBYTE2* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorClamp(V, XMVectorZero(), g_UByteMax); - N = XMVectorRound(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->x = static_cast(tmp.x); - pDestination->y = static_cast(tmp.y); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0.f)); - R = vminq_f32(R, vdupq_n_f32(255.0f)); - uint32x4_t vInt32 = vcvtq_u32_f32(R); - uint16x4_t vInt16 = vqmovn_u32(vInt32); - uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); - vst1_lane_u16(reinterpret_cast(pDestination), vreinterpret_u16_u8(vInt8), 0); -#elif defined(_XM_SSE_INTRINSICS_) - // Clamp to bounds - XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, g_UByteMax); - // Convert to int by rounding - __m128i vInt = _mm_cvtps_epi32(vResult); - // No SSE operations will write to 16-bit values, so we have to extract them manually - auto x = static_cast(_mm_extract_epi16(vInt, 0)); - auto y = static_cast(_mm_extract_epi16(vInt, 2)); - pDestination->v = static_cast(((static_cast(y) & 0xFF) << 8) | (static_cast(x) & 0xFF)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreU565 -( - XMU565* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); - static const XMVECTORF32 Max = { { { 31.0f, 63.0f, 31.0f, 0.0f } } }; - -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR N = XMVectorClamp(V, XMVectorZero(), Max.v); - N = XMVectorRound(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->v = static_cast( - ((static_cast(tmp.z) & 0x1F) << 11) - | ((static_cast(tmp.y) & 0x3F) << 5) - | ((static_cast(tmp.x) & 0x1F))); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 1.0f, 32.f, 32.f * 64.f, 0.f } } }; - static const XMVECTORU32 Mask = { { { 0x1F, 0x3F << 5, 0x1F << 11, 0 } } }; - float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); - vResult = vminq_f32(vResult, Max); - vResult = vmulq_f32(vResult, Scale); - uint32x4_t vResulti = vcvtq_u32_f32(vResult); - vResulti = vandq_u32(vResulti, Mask); - // Do a horizontal or of 4 entries - uint32x2_t vTemp = vget_low_u32(vResulti); - uint32x2_t vhi = vget_high_u32(vResulti); - vTemp = vorr_u32(vTemp, vhi); - vTemp = vpadd_u32(vTemp, vTemp); - vst1_lane_u16(&pDestination->v, vreinterpret_u16_u32(vTemp), 0); -#elif defined(_XM_SSE_INTRINSICS_) - // Bounds check - XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, Max); - // Convert to int with rounding - __m128i vInt = _mm_cvtps_epi32(vResult); - // No SSE operations will write to 16-bit values, so we have to extract them manually - auto x = static_cast(_mm_extract_epi16(vInt, 0)); - auto y = static_cast(_mm_extract_epi16(vInt, 2)); - auto z = static_cast(_mm_extract_epi16(vInt, 4)); - pDestination->v = static_cast( - ((static_cast(z) & 0x1F) << 11) - | ((static_cast(y) & 0x3F) << 5) - | ((static_cast(x) & 0x1F))); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat3PK -( - XMFLOAT3PK* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); - - XM_ALIGNED_DATA(16) uint32_t IValue[4]; - XMStoreFloat3A(reinterpret_cast(&IValue), V); - - uint32_t Result[3]; - - // X & Y Channels (5-bit exponent, 6-bit mantissa) - for (uint32_t j = 0; j < 2; ++j) - { - uint32_t Sign = IValue[j] & 0x80000000; - uint32_t I = IValue[j] & 0x7FFFFFFF; - - if ((I & 0x7F800000) == 0x7F800000) - { - // INF or NAN - Result[j] = 0x7C0U; - if ((I & 0x7FFFFF) != 0) - { - Result[j] = 0x7FFU; - } - else if (Sign) - { - // -INF is clamped to 0 since 3PK is positive only - Result[j] = 0; - } - } - else if (Sign || I < 0x35800000) - { - // 3PK is positive only, so clamp to zero - Result[j] = 0; - } - else if (I > 0x477E0000U) - { - // The number is too large to be represented as a float11, set to max - Result[j] = 0x7BFU; - } - else - { - if (I < 0x38800000U) - { - // The number is too small to be represented as a normalized float11 - // Convert it to a denormalized value. - uint32_t Shift = 113U - (I >> 23U); - I = (0x800000U | (I & 0x7FFFFFU)) >> Shift; - } - else - { - // Rebias the exponent to represent the value as a normalized float11 - I += 0xC8000000U; - } - - Result[j] = ((I + 0xFFFFU + ((I >> 17U) & 1U)) >> 17U) & 0x7ffU; - } - } - - // Z Channel (5-bit exponent, 5-bit mantissa) - uint32_t Sign = IValue[2] & 0x80000000; - uint32_t I = IValue[2] & 0x7FFFFFFF; - - if ((I & 0x7F800000) == 0x7F800000) - { - // INF or NAN - Result[2] = 0x3E0U; - if (I & 0x7FFFFF) - { - Result[2] = 0x3FFU; - } - else if (Sign || I < 0x36000000) - { - // -INF is clamped to 0 since 3PK is positive only - Result[2] = 0; - } - } - else if (Sign) - { - // 3PK is positive only, so clamp to zero - Result[2] = 0; - } - else if (I > 0x477C0000U) - { - // The number is too large to be represented as a float10, set to max - Result[2] = 0x3DFU; - } - else - { - if (I < 0x38800000U) - { - // The number is too small to be represented as a normalized float10 - // Convert it to a denormalized value. - uint32_t Shift = 113U - (I >> 23U); - I = (0x800000U | (I & 0x7FFFFFU)) >> Shift; - } - else - { - // Rebias the exponent to represent the value as a normalized float10 - I += 0xC8000000U; - } - - Result[2] = ((I + 0x1FFFFU + ((I >> 18U) & 1U)) >> 18U) & 0x3ffU; - } - - // Pack Result into memory - pDestination->v = (Result[0] & 0x7ff) - | ((Result[1] & 0x7ff) << 11) - | ((Result[2] & 0x3ff) << 22); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreFloat3SE -( - XMFLOAT3SE* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); - - XMFLOAT3A tmp; - XMStoreFloat3A(&tmp, V); - - static constexpr float maxf9 = float(0x1FF << 7); - static constexpr float minf9 = float(1.f / (1 << 16)); - - float x = (tmp.x >= 0.f) ? ((tmp.x > maxf9) ? maxf9 : tmp.x) : 0.f; - float y = (tmp.y >= 0.f) ? ((tmp.y > maxf9) ? maxf9 : tmp.y) : 0.f; - float z = (tmp.z >= 0.f) ? ((tmp.z > maxf9) ? maxf9 : tmp.z) : 0.f; - - const float max_xy = (x > y) ? x : y; - const float max_xyz = (max_xy > z) ? max_xy : z; - - const float maxColor = (max_xyz > minf9) ? max_xyz : minf9; - - union { float f; int32_t i; } fi; - fi.f = maxColor; - fi.i += 0x00004000; // round up leaving 9 bits in fraction (including assumed 1) - - auto exp = static_cast(fi.i) >> 23; - pDestination->e = exp - 0x6f; - - fi.i = static_cast(0x83000000 - (exp << 23)); - float ScaleR = fi.f; - - pDestination->xm = static_cast(MathInternal::round_to_nearest(x * ScaleR)); - pDestination->ym = static_cast(MathInternal::round_to_nearest(y * ScaleR)); - pDestination->zm = static_cast(MathInternal::round_to_nearest(z * ScaleR)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreHalf4 -( - XMHALF4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) - __m128i V1 = _mm_cvtps_ph(V, _MM_FROUND_TO_NEAREST_INT); - _mm_storel_epi64(reinterpret_cast<__m128i*>(pDestination), V1); -#else - XMFLOAT4A t; - XMStoreFloat4A(&t, V); - - pDestination->x = XMConvertFloatToHalf(t.x); - pDestination->y = XMConvertFloatToHalf(t.y); - pDestination->z = XMConvertFloatToHalf(t.z); - pDestination->w = XMConvertFloatToHalf(t.w); -#endif // !_XM_F16C_INTRINSICS_ -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreShortN4 -( - XMSHORTN4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorClamp(V, g_XMNegativeOne.v, g_XMOne.v); - N = XMVectorMultiply(N, g_ShortMax); - N = XMVectorRound(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->x = static_cast(tmp.x); - pDestination->y = static_cast(tmp.y); - pDestination->z = static_cast(tmp.z); - pDestination->w = static_cast(tmp.w); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(-1.f)); - vResult = vminq_f32(vResult, vdupq_n_f32(1.0f)); - vResult = vmulq_n_f32(vResult, 32767.0f); - int16x4_t vInt = vmovn_s32(vcvtq_s32_f32(vResult)); - vst1_s16(reinterpret_cast(pDestination), vInt); -#elif defined(_XM_SSE_INTRINSICS_) - XMVECTOR vResult = _mm_max_ps(V, g_XMNegativeOne); - vResult = _mm_min_ps(vResult, g_XMOne); - vResult = _mm_mul_ps(vResult, g_ShortMax); - __m128i vResulti = _mm_cvtps_epi32(vResult); - vResulti = _mm_packs_epi32(vResulti, vResulti); - _mm_store_sd(reinterpret_cast(&pDestination->x), _mm_castsi128_pd(vResulti)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreShort4 -( - XMSHORT4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorClamp(V, g_ShortMin, g_ShortMax); - N = XMVectorRound(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->x = static_cast(tmp.x); - pDestination->y = static_cast(tmp.y); - pDestination->z = static_cast(tmp.z); - pDestination->w = static_cast(tmp.w); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t vResult = vmaxq_f32(V, g_ShortMin); - vResult = vminq_f32(vResult, g_ShortMax); - int16x4_t vInt = vmovn_s32(vcvtq_s32_f32(vResult)); - vst1_s16(reinterpret_cast(pDestination), vInt); -#elif defined(_XM_SSE_INTRINSICS_) - // Bounds check - XMVECTOR vResult = _mm_max_ps(V, g_ShortMin); - vResult = _mm_min_ps(vResult, g_ShortMax); - // Convert to int with rounding - __m128i vInt = _mm_cvtps_epi32(vResult); - // Pack the ints into shorts - vInt = _mm_packs_epi32(vInt, vInt); - _mm_store_sd(reinterpret_cast(&pDestination->x), _mm_castsi128_pd(vInt)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUShortN4 -( - XMUSHORTN4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorSaturate(V); - N = XMVectorMultiplyAdd(N, g_UShortMax, g_XMOneHalf.v); - N = XMVectorTruncate(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->x = static_cast(tmp.x); - pDestination->y = static_cast(tmp.y); - pDestination->z = static_cast(tmp.z); - pDestination->w = static_cast(tmp.w); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); - vResult = vminq_f32(vResult, vdupq_n_f32(1.0f)); - vResult = vmulq_n_f32(vResult, 65535.0f); - vResult = vaddq_f32(vResult, g_XMOneHalf); - uint16x4_t vInt = vmovn_u32(vcvtq_u32_f32(vResult)); - vst1_u16(reinterpret_cast(pDestination), vInt); -#elif defined(_XM_SSE_INTRINSICS_) - // Bounds check - XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, g_XMOne); - vResult = _mm_mul_ps(vResult, g_UShortMax); - vResult = _mm_add_ps(vResult, g_XMOneHalf); - // Convert to int - __m128i vInt = _mm_cvttps_epi32(vResult); - // Since the SSE pack instruction clamps using signed rules, - // manually extract the values to store them to memory - pDestination->x = static_cast(_mm_extract_epi16(vInt, 0)); - pDestination->y = static_cast(_mm_extract_epi16(vInt, 2)); - pDestination->z = static_cast(_mm_extract_epi16(vInt, 4)); - pDestination->w = static_cast(_mm_extract_epi16(vInt, 6)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUShort4 -( - XMUSHORT4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorClamp(V, XMVectorZero(), g_UShortMax); - N = XMVectorRound(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->x = static_cast(tmp.x); - pDestination->y = static_cast(tmp.y); - pDestination->z = static_cast(tmp.z); - pDestination->w = static_cast(tmp.w); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); - vResult = vminq_f32(vResult, g_UShortMax); - uint16x4_t vInt = vmovn_u32(vcvtq_u32_f32(vResult)); - vst1_u16(reinterpret_cast(pDestination), vInt); -#elif defined(_XM_SSE_INTRINSICS_) - // Bounds check - XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, g_UShortMax); - // Convert to int with rounding - __m128i vInt = _mm_cvtps_epi32(vResult); - // Since the SSE pack instruction clamps using signed rules, - // manually extract the values to store them to memory - pDestination->x = static_cast(_mm_extract_epi16(vInt, 0)); - pDestination->y = static_cast(_mm_extract_epi16(vInt, 2)); - pDestination->z = static_cast(_mm_extract_epi16(vInt, 4)); - pDestination->w = static_cast(_mm_extract_epi16(vInt, 6)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreXDecN4 -( - XMXDECN4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); - static const XMVECTORF32 Min = { { { -1.0f, -1.0f, -1.0f, 0.0f } } }; - -#if defined(_XM_NO_INTRINSICS_) - - static const XMVECTORF32 Scale = { { { 511.0f, 511.0f, 511.0f, 3.0f } } }; - - XMVECTOR N = XMVectorClamp(V, Min.v, g_XMOne.v); - N = XMVectorMultiply(N, Scale.v); - N = XMVectorRound(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->v = static_cast( - (static_cast(tmp.w) << 30) - | ((static_cast(tmp.z) & 0x3FF) << 20) - | ((static_cast(tmp.y) & 0x3FF) << 10) - | (static_cast(tmp.x) & 0x3FF)); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 511.0f, 511.0f * 1024.0f, 511.0f * 1048576.0f, 3.0f * 536870912.0f } } }; - static const XMVECTORI32 ScaleMask = { { { 0x3FF, 0x3FF << 10, 0x3FF << 20, 0x3 << 29 } } }; - float32x4_t vResult = vmaxq_f32(V, Min); - vResult = vminq_f32(vResult, vdupq_n_f32(1.0f)); - vResult = vmulq_f32(vResult, Scale); - int32x4_t vResulti = vcvtq_s32_f32(vResult); - vResulti = vandq_s32(vResulti, ScaleMask); - int32x4_t vResultw = vandq_s32(vResulti, g_XMMaskW); - vResulti = vaddq_s32(vResulti, vResultw); - // Do a horizontal or of all 4 entries - uint32x2_t vTemp = vget_low_u32(vreinterpretq_u32_s32(vResulti)); - uint32x2_t vhi = vget_high_u32(vreinterpretq_u32_s32(vResulti)); - vTemp = vorr_u32(vTemp, vhi); - vTemp = vpadd_u32(vTemp, vTemp); - vst1_lane_u32(&pDestination->v, vTemp, 0); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 511.0f, 511.0f * 1024.0f, 511.0f * 1048576.0f, 3.0f * 536870912.0f } } }; - static const XMVECTORI32 ScaleMask = { { { 0x3FF, 0x3FF << 10, 0x3FF << 20, 0x3 << 29 } } }; - XMVECTOR vResult = _mm_max_ps(V, Min); - vResult = _mm_min_ps(vResult, g_XMOne); - // Scale by multiplication - vResult = _mm_mul_ps(vResult, Scale); - // Convert to int (W is unsigned) - __m128i vResulti = _mm_cvtps_epi32(vResult); - // Mask off any fraction - vResulti = _mm_and_si128(vResulti, ScaleMask); - // To fix W, add itself to shift it up to <<30 instead of <<29 - __m128i vResultw = _mm_and_si128(vResulti, g_XMMaskW); - vResulti = _mm_add_epi32(vResulti, vResultw); - // Do a horizontal or of all 4 entries - vResult = XM_PERMUTE_PS(_mm_castsi128_ps(vResulti), _MM_SHUFFLE(0, 3, 2, 1)); - vResulti = _mm_or_si128(vResulti, _mm_castps_si128(vResult)); - vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(0, 3, 2, 1)); - vResulti = _mm_or_si128(vResulti, _mm_castps_si128(vResult)); - vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(0, 3, 2, 1)); - vResulti = _mm_or_si128(vResulti, _mm_castps_si128(vResult)); - _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); -#endif -} - -//------------------------------------------------------------------------------ -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4996) -// C4996: ignore deprecation warning -#endif - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -#endif - -#ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif - -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreXDec4 -( - XMXDEC4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); - static const XMVECTORF32 MinXDec4 = { { { -511.0f, -511.0f, -511.0f, 0.0f } } }; - static const XMVECTORF32 MaxXDec4 = { { { 511.0f, 511.0f, 511.0f, 3.0f } } }; - -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorClamp(V, MinXDec4, MaxXDec4); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->v = static_cast( - (static_cast(tmp.w) << 30) - | ((static_cast(tmp.z) & 0x3FF) << 20) - | ((static_cast(tmp.y) & 0x3FF) << 10) - | ((static_cast(tmp.x) & 0x3FF))); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 ScaleXDec4 = { { { 1.0f, 1024.0f / 2.0f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f / 2.0f } } }; - static const XMVECTORI32 MaskXDec4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; - float32x4_t vResult = vmaxq_f32(V, MinXDec4); - vResult = vminq_f32(vResult, MaxXDec4); - vResult = vmulq_f32(vResult, ScaleXDec4); - int32x4_t vResulti = vcvtq_s32_f32(vResult); - vResulti = vandq_s32(vResulti, MaskXDec4); - // Do a horizontal or of 4 entries - uint32x2_t vTemp = vget_low_u32(vreinterpretq_u32_s32(vResulti)); - uint32x2_t vTemp2 = vget_high_u32(vreinterpretq_u32_s32(vResulti)); - vTemp = vorr_u32(vTemp, vTemp2); - // Perform a single bit left shift on y|w - vTemp2 = vdup_lane_u32(vTemp, 1); - vTemp2 = vadd_u32(vTemp2, vTemp2); - vTemp = vorr_u32(vTemp, vTemp2); - vst1_lane_u32(&pDestination->v, vTemp, 0); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 ScaleXDec4 = { { { 1.0f, 1024.0f / 2.0f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f / 2.0f } } }; - static const XMVECTORI32 MaskXDec4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; - // Clamp to bounds - XMVECTOR vResult = _mm_max_ps(V, MinXDec4); - vResult = _mm_min_ps(vResult, MaxXDec4); - // Scale by multiplication - vResult = _mm_mul_ps(vResult, ScaleXDec4); - // Convert to int - __m128i vResulti = _mm_cvttps_epi32(vResult); - // Mask off any fraction - vResulti = _mm_and_si128(vResulti, MaskXDec4); - // Do a horizontal or of 4 entries - __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); - // x = x|z, y = y|w - vResulti = _mm_or_si128(vResulti, vResulti2); - // Move Z to the x position - vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); - // Perform a single bit left shift on y|w - vResulti2 = _mm_add_epi32(vResulti2, vResulti2); - // i = x|y|z|w - vResulti = _mm_or_si128(vResulti, vResulti2); - _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); -#endif -} - -#ifdef __GNUC__ -#pragma GCC diagnostic pop -#endif -#ifdef __clang__ -#pragma clang diagnostic pop -#endif -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUDecN4 -( - XMUDECN4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - static const XMVECTORF32 Scale = { { { 1023.0f, 1023.0f, 1023.0f, 3.0f } } }; - - XMVECTOR N = XMVectorSaturate(V); - N = XMVectorMultiply(N, Scale.v); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->v = static_cast( - (static_cast(tmp.w) << 30) - | ((static_cast(tmp.z) & 0x3FF) << 20) - | ((static_cast(tmp.y) & 0x3FF) << 10) - | ((static_cast(tmp.x) & 0x3FF))); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 ScaleUDecN4 = { { { 1023.0f, 1023.0f * 1024.0f * 0.5f, 1023.0f * 1024.0f * 1024.0f, 3.0f * 1024.0f * 1024.0f * 1024.0f * 0.5f } } }; - static const XMVECTORI32 MaskUDecN4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; - float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0.f)); - vResult = vminq_f32(vResult, vdupq_n_f32(1.f)); - vResult = vmulq_f32(vResult, ScaleUDecN4); - uint32x4_t vResulti = vcvtq_u32_f32(vResult); - vResulti = vandq_u32(vResulti, MaskUDecN4); - // Do a horizontal or of 4 entries - uint32x2_t vTemp = vget_low_u32(vResulti); - uint32x2_t vTemp2 = vget_high_u32(vResulti); - vTemp = vorr_u32(vTemp, vTemp2); - // Perform a single bit left shift on y|w - vTemp2 = vdup_lane_u32(vTemp, 1); - vTemp2 = vadd_u32(vTemp2, vTemp2); - vTemp = vorr_u32(vTemp, vTemp2); - vst1_lane_u32(&pDestination->v, vTemp, 0); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 ScaleUDecN4 = { { { 1023.0f, 1023.0f * 1024.0f * 0.5f, 1023.0f * 1024.0f * 1024.0f, 3.0f * 1024.0f * 1024.0f * 1024.0f * 0.5f } } }; - static const XMVECTORI32 MaskUDecN4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; - // Clamp to bounds - XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, g_XMOne); - // Scale by multiplication - vResult = _mm_mul_ps(vResult, ScaleUDecN4); - // Convert to int - __m128i vResulti = _mm_cvttps_epi32(vResult); - // Mask off any fraction - vResulti = _mm_and_si128(vResulti, MaskUDecN4); - // Do a horizontal or of 4 entries - __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); - // x = x|z, y = y|w - vResulti = _mm_or_si128(vResulti, vResulti2); - // Move Z to the x position - vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); - // Perform a left shift by one bit on y|w - vResulti2 = _mm_add_epi32(vResulti2, vResulti2); - // i = x|y|z|w - vResulti = _mm_or_si128(vResulti, vResulti2); - _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUDecN4_XR -( - XMUDECN4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); - static const XMVECTORF32 Scale = { { { 510.0f, 510.0f, 510.0f, 3.0f } } }; - static const XMVECTORF32 Bias = { { { 384.0f, 384.0f, 384.0f, 0.0f } } }; - static const XMVECTORF32 C = { { { 1023.f, 1023.f, 1023.f, 3.f } } }; - -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorMultiplyAdd(V, Scale, Bias); - N = XMVectorClamp(N, g_XMZero, C); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->v = static_cast( - (static_cast(tmp.w) << 30) - | ((static_cast(tmp.z) & 0x3FF) << 20) - | ((static_cast(tmp.y) & 0x3FF) << 10) - | ((static_cast(tmp.x) & 0x3FF))); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Shift = { { { 1.0f, 1024.0f * 0.5f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f * 0.5f } } }; - static const XMVECTORU32 MaskUDecN4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; - float32x4_t vResult = vmlaq_f32(Bias, V, Scale); - vResult = vmaxq_f32(vResult, vdupq_n_f32(0.f)); - vResult = vminq_f32(vResult, C); - vResult = vmulq_f32(vResult, Shift); - uint32x4_t vResulti = vcvtq_u32_f32(vResult); - vResulti = vandq_u32(vResulti, MaskUDecN4); - // Do a horizontal or of 4 entries - uint32x2_t vTemp = vget_low_u32(vResulti); - uint32x2_t vTemp2 = vget_high_u32(vResulti); - vTemp = vorr_u32(vTemp, vTemp2); - // Perform a single bit left shift on y|w - vTemp2 = vdup_lane_u32(vTemp, 1); - vTemp2 = vadd_u32(vTemp2, vTemp2); - vTemp = vorr_u32(vTemp, vTemp2); - vst1_lane_u32(&pDestination->v, vTemp, 0); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 Shift = { { { 1.0f, 1024.0f * 0.5f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f * 0.5f } } }; - static const XMVECTORU32 MaskUDecN4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; - // Scale & bias - XMVECTOR vResult = XM_FMADD_PS(V, Scale, Bias); - // Clamp to bounds - vResult = _mm_max_ps(vResult, g_XMZero); - vResult = _mm_min_ps(vResult, C); - // Scale by shift values - vResult = _mm_mul_ps(vResult, Shift); - // Convert to int - __m128i vResulti = _mm_cvttps_epi32(vResult); - // Mask off any fraction - vResulti = _mm_and_si128(vResulti, MaskUDecN4); - // Do a horizontal or of 4 entries - __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); - // x = x|z, y = y|w - vResulti = _mm_or_si128(vResulti, vResulti2); - // Move Z to the x position - vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); - // Perform a left shift by one bit on y|w - vResulti2 = _mm_add_epi32(vResulti2, vResulti2); - // i = x|y|z|w - vResulti = _mm_or_si128(vResulti, vResulti2); - _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUDec4 -( - XMUDEC4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); - static const XMVECTORF32 MaxUDec4 = { { { 1023.0f, 1023.0f, 1023.0f, 3.0f } } }; - -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorClamp(V, XMVectorZero(), MaxUDec4); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->v = static_cast( - (static_cast(tmp.w) << 30) - | ((static_cast(tmp.z) & 0x3FF) << 20) - | ((static_cast(tmp.y) & 0x3FF) << 10) - | ((static_cast(tmp.x) & 0x3FF))); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 ScaleUDec4 = { { { 1.0f, 1024.0f / 2.0f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f / 2.0f } } }; - static const XMVECTORI32 MaskUDec4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; - float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0.f)); - vResult = vminq_f32(vResult, MaxUDec4); - vResult = vmulq_f32(vResult, ScaleUDec4); - uint32x4_t vResulti = vcvtq_u32_f32(vResult); - vResulti = vandq_u32(vResulti, MaskUDec4); - // Do a horizontal or of 4 entries - uint32x2_t vTemp = vget_low_u32(vResulti); - uint32x2_t vTemp2 = vget_high_u32(vResulti); - vTemp = vorr_u32(vTemp, vTemp2); - // Perform a single bit left shift on y|w - vTemp2 = vdup_lane_u32(vTemp, 1); - vTemp2 = vadd_u32(vTemp2, vTemp2); - vTemp = vorr_u32(vTemp, vTemp2); - vst1_lane_u32(&pDestination->v, vTemp, 0); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 ScaleUDec4 = { { { 1.0f, 1024.0f / 2.0f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f / 2.0f } } }; - static const XMVECTORI32 MaskUDec4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; - // Clamp to bounds - XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, MaxUDec4); - // Scale by multiplication - vResult = _mm_mul_ps(vResult, ScaleUDec4); - // Convert to int - __m128i vResulti = _mm_cvttps_epi32(vResult); - // Mask off any fraction - vResulti = _mm_and_si128(vResulti, MaskUDec4); - // Do a horizontal or of 4 entries - __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); - // x = x|z, y = y|w - vResulti = _mm_or_si128(vResulti, vResulti2); - // Move Z to the x position - vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); - // Perform a left shift by one bit on y|w - vResulti2 = _mm_add_epi32(vResulti2, vResulti2); - // i = x|y|z|w - vResulti = _mm_or_si128(vResulti, vResulti2); - _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); -#endif -} - -//------------------------------------------------------------------------------ -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4996) -// C4996: ignore deprecation warning -#endif - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -#endif - -#ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif - -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreDecN4 -( - XMDECN4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - static const XMVECTORF32 Scale = { { { 511.0f, 511.0f, 511.0f, 1.0f } } }; - - XMVECTOR N = XMVectorClamp(V, g_XMNegativeOne.v, g_XMOne.v); - N = XMVectorMultiply(N, Scale.v); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->v = static_cast( - (static_cast(tmp.w) << 30) - | ((static_cast(tmp.z) & 0x3FF) << 20) - | ((static_cast(tmp.y) & 0x3FF) << 10) - | ((static_cast(tmp.x) & 0x3FF))); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 ScaleDecN4 = { { { 511.0f, 511.0f * 1024.0f, 511.0f * 1024.0f * 1024.0f, 1.0f * 1024.0f * 1024.0f * 1024.0f } } }; - float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(-1.f)); - vResult = vminq_f32(vResult, vdupq_n_f32(1.f)); - vResult = vmulq_f32(vResult, ScaleDecN4); - int32x4_t vResulti = vcvtq_s32_f32(vResult); - vResulti = vandq_s32(vResulti, g_XMMaskDec4); - // Do a horizontal or of 4 entries - uint32x2_t vTemp = vget_low_u32(vreinterpretq_u32_s32(vResulti)); - uint32x2_t vhi = vget_high_u32(vreinterpretq_u32_s32(vResulti)); - vTemp = vorr_u32(vTemp, vhi); - vTemp = vpadd_u32(vTemp, vTemp); - vst1_lane_u32(&pDestination->v, vTemp, 0); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 ScaleDecN4 = { { { 511.0f, 511.0f * 1024.0f, 511.0f * 1024.0f * 1024.0f, 1.0f * 1024.0f * 1024.0f * 1024.0f } } }; - // Clamp to bounds - XMVECTOR vResult = _mm_max_ps(V, g_XMNegativeOne); - vResult = _mm_min_ps(vResult, g_XMOne); - // Scale by multiplication - vResult = _mm_mul_ps(vResult, ScaleDecN4); - // Convert to int - __m128i vResulti = _mm_cvttps_epi32(vResult); - // Mask off any fraction - vResulti = _mm_and_si128(vResulti, g_XMMaskDec4); - // Do a horizontal or of 4 entries - __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); - // x = x|z, y = y|w - vResulti = _mm_or_si128(vResulti, vResulti2); - // Move Z to the x position - vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); - // i = x|y|z|w - vResulti = _mm_or_si128(vResulti, vResulti2); - _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreDec4 -( - XMDEC4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); - static const XMVECTORF32 MinDec4 = { { { -511.0f, -511.0f, -511.0f, -1.0f } } }; - static const XMVECTORF32 MaxDec4 = { { { 511.0f, 511.0f, 511.0f, 1.0f } } }; - -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorClamp(V, MinDec4, MaxDec4); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->v = static_cast( - (static_cast(tmp.w) << 30) - | ((static_cast(tmp.z) & 0x3FF) << 20) - | ((static_cast(tmp.y) & 0x3FF) << 10) - | ((static_cast(tmp.x) & 0x3FF))); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 ScaleDec4 = { { { 1.0f, 1024.0f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f } } }; - float32x4_t vResult = vmaxq_f32(V, MinDec4); - vResult = vminq_f32(vResult, MaxDec4); - vResult = vmulq_f32(vResult, ScaleDec4); - int32x4_t vResulti = vcvtq_s32_f32(vResult); - vResulti = vandq_s32(vResulti, g_XMMaskDec4); - // Do a horizontal or of all 4 entries - uint32x2_t vTemp = vget_low_u32(vreinterpretq_u32_s32(vResulti)); - uint32x2_t vhi = vget_high_u32(vreinterpretq_u32_s32(vResulti)); - vTemp = vorr_u32(vTemp, vhi); - vTemp = vpadd_u32(vTemp, vTemp); - vst1_lane_u32(&pDestination->v, vTemp, 0); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 ScaleDec4 = { { { 1.0f, 1024.0f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f } } }; - // Clamp to bounds - XMVECTOR vResult = _mm_max_ps(V, MinDec4); - vResult = _mm_min_ps(vResult, MaxDec4); - // Scale by multiplication - vResult = _mm_mul_ps(vResult, ScaleDec4); - // Convert to int - __m128i vResulti = _mm_cvttps_epi32(vResult); - // Mask off any fraction - vResulti = _mm_and_si128(vResulti, g_XMMaskDec4); - // Do a horizontal or of 4 entries - __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); - // x = x|z, y = y|w - vResulti = _mm_or_si128(vResulti, vResulti2); - // Move Z to the x position - vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); - // i = x|y|z|w - vResulti = _mm_or_si128(vResulti, vResulti2); - _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); -#endif -} - -#ifdef __GNUC__ -#pragma GCC diagnostic pop -#endif -#ifdef __clang__ -#pragma clang diagnostic pop -#endif -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUByteN4 -( - XMUBYTEN4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorSaturate(V); - N = XMVectorMultiply(N, g_UByteMax); - N = XMVectorTruncate(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->x = static_cast(tmp.x); - pDestination->y = static_cast(tmp.y); - pDestination->z = static_cast(tmp.z); - pDestination->w = static_cast(tmp.w); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0)); - R = vminq_f32(R, vdupq_n_f32(1.0f)); - R = vmulq_n_f32(R, 255.0f); - uint32x4_t vInt32 = vcvtq_u32_f32(R); - uint16x4_t vInt16 = vqmovn_u32(vInt32); - uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); - vst1_lane_u32(&pDestination->v, vreinterpret_u32_u8(vInt8), 0); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 ScaleUByteN4 = { { { 255.0f, 255.0f * 256.0f * 0.5f, 255.0f * 256.0f * 256.0f, 255.0f * 256.0f * 256.0f * 256.0f * 0.5f } } }; - static const XMVECTORI32 MaskUByteN4 = { { { 0xFF, 0xFF << (8 - 1), 0xFF << 16, 0xFF << (24 - 1) } } }; - // Clamp to bounds - XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, g_XMOne); - // Scale by multiplication - vResult = _mm_mul_ps(vResult, ScaleUByteN4); - // Convert to int - __m128i vResulti = _mm_cvttps_epi32(vResult); - // Mask off any fraction - vResulti = _mm_and_si128(vResulti, MaskUByteN4); - // Do a horizontal or of 4 entries - __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); - // x = x|z, y = y|w - vResulti = _mm_or_si128(vResulti, vResulti2); - // Move Z to the x position - vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); - // Perform a single bit left shift to fix y|w - vResulti2 = _mm_add_epi32(vResulti2, vResulti2); - // i = x|y|z|w - vResulti = _mm_or_si128(vResulti, vResulti2); - _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUByte4 -( - XMUBYTE4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorClamp(V, XMVectorZero(), g_UByteMax); - N = XMVectorRound(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->x = static_cast(tmp.x); - pDestination->y = static_cast(tmp.y); - pDestination->z = static_cast(tmp.z); - pDestination->w = static_cast(tmp.w); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0)); - R = vminq_f32(R, vdupq_n_f32(255.0f)); - uint32x4_t vInt32 = vcvtq_u32_f32(R); - uint16x4_t vInt16 = vqmovn_u32(vInt32); - uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); - vst1_lane_u32(&pDestination->v, vreinterpret_u32_u8(vInt8), 0); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 ScaleUByte4 = { { { 1.0f, 256.0f * 0.5f, 256.0f * 256.0f, 256.0f * 256.0f * 256.0f * 0.5f } } }; - static const XMVECTORI32 MaskUByte4 = { { { 0xFF, 0xFF << (8 - 1), 0xFF << 16, 0xFF << (24 - 1) } } }; - // Clamp to bounds - XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, g_UByteMax); - // Scale by multiplication - vResult = _mm_mul_ps(vResult, ScaleUByte4); - // Convert to int by rounding - __m128i vResulti = _mm_cvtps_epi32(vResult); - // Mask off any fraction - vResulti = _mm_and_si128(vResulti, MaskUByte4); - // Do a horizontal or of 4 entries - __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); - // x = x|z, y = y|w - vResulti = _mm_or_si128(vResulti, vResulti2); - // Move Z to the x position - vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); - // Perform a single bit left shift to fix y|w - vResulti2 = _mm_add_epi32(vResulti2, vResulti2); - // i = x|y|z|w - vResulti = _mm_or_si128(vResulti, vResulti2); - _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreByteN4 -( - XMBYTEN4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorClamp(V, g_XMNegativeOne.v, g_XMOne.v); - N = XMVectorMultiply(N, g_ByteMax); - N = XMVectorTruncate(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->x = static_cast(tmp.x); - pDestination->y = static_cast(tmp.y); - pDestination->z = static_cast(tmp.z); - pDestination->w = static_cast(tmp.w); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-1.f)); - R = vminq_f32(R, vdupq_n_f32(1.0f)); - R = vmulq_n_f32(R, 127.0f); - int32x4_t vInt32 = vcvtq_s32_f32(R); - int16x4_t vInt16 = vqmovn_s32(vInt32); - int8x8_t vInt8 = vqmovn_s16(vcombine_s16(vInt16, vInt16)); - vst1_lane_u32(&pDestination->v, vreinterpret_u32_s8(vInt8), 0); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 ScaleByteN4 = { { { 127.0f, 127.0f * 256.0f, 127.0f * 256.0f * 256.0f, 127.0f * 256.0f * 256.0f * 256.0f } } }; - static const XMVECTORI32 MaskByteN4 = { { { 0xFF, 0xFF << 8, 0xFF << 16, static_cast(0xFF000000) } } }; - // Clamp to bounds - XMVECTOR vResult = _mm_max_ps(V, g_XMNegativeOne); - vResult = _mm_min_ps(vResult, g_XMOne); - // Scale by multiplication - vResult = _mm_mul_ps(vResult, ScaleByteN4); - // Convert to int - __m128i vResulti = _mm_cvttps_epi32(vResult); - // Mask off any fraction - vResulti = _mm_and_si128(vResulti, MaskByteN4); - // Do a horizontal or of 4 entries - __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); - // x = x|z, y = y|w - vResulti = _mm_or_si128(vResulti, vResulti2); - // Move Z to the x position - vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); - // i = x|y|z|w - vResulti = _mm_or_si128(vResulti, vResulti2); - _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreByte4 -( - XMBYTE4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorClamp(V, g_ByteMin, g_ByteMax); - N = XMVectorRound(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->x = static_cast(tmp.x); - pDestination->y = static_cast(tmp.y); - pDestination->z = static_cast(tmp.z); - pDestination->w = static_cast(tmp.w); - -#elif defined(_XM_ARM_NEON_INTRINSICS_) - float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-127.f)); - R = vminq_f32(R, vdupq_n_f32(127.f)); - int32x4_t vInt32 = vcvtq_s32_f32(R); - int16x4_t vInt16 = vqmovn_s32(vInt32); - int8x8_t vInt8 = vqmovn_s16(vcombine_s16(vInt16, vInt16)); - vst1_lane_u32(&pDestination->v, vreinterpret_u32_s8(vInt8), 0); -#elif defined(_XM_SSE_INTRINSICS_) - static const XMVECTORF32 ScaleByte4 = { { { 1.0f, 256.0f, 256.0f * 256.0f, 256.0f * 256.0f * 256.0f } } }; - static const XMVECTORI32 MaskByte4 = { { { 0xFF, 0xFF << 8, 0xFF << 16, static_cast(0xFF000000) } } }; - // Clamp to bounds - XMVECTOR vResult = _mm_max_ps(V, g_ByteMin); - vResult = _mm_min_ps(vResult, g_ByteMax); - // Scale by multiplication - vResult = _mm_mul_ps(vResult, ScaleByte4); - // Convert to int by rounding - __m128i vResulti = _mm_cvtps_epi32(vResult); - // Mask off any fraction - vResulti = _mm_and_si128(vResulti, MaskByte4); - // Do a horizontal or of 4 entries - __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); - // x = x|z, y = y|w - vResulti = _mm_or_si128(vResulti, vResulti2); - // Move Z to the x position - vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); - // i = x|y|z|w - vResulti = _mm_or_si128(vResulti, vResulti2); - _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreUNibble4 -( - XMUNIBBLE4* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); - static const XMVECTORF32 Max = { { { 15.0f, 15.0f, 15.0f, 15.0f } } }; -#if defined(_XM_NO_INTRINSICS_) - - XMVECTOR N = XMVectorClamp(V, XMVectorZero(), Max.v); - N = XMVectorRound(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->v = static_cast( - ((static_cast(tmp.w) & 0xF) << 12) - | ((static_cast(tmp.z) & 0xF) << 8) - | ((static_cast(tmp.y) & 0xF) << 4) - | (static_cast(tmp.x) & 0xF)); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 1.0f, 16.f, 16.f * 16.f, 16.f * 16.f * 16.f } } }; - static const XMVECTORU32 Mask = { { { 0xF, 0xF << 4, 0xF << 8, 0xF << 12 } } }; - float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); - vResult = vminq_f32(vResult, Max); - vResult = vmulq_f32(vResult, Scale); - uint32x4_t vResulti = vcvtq_u32_f32(vResult); - vResulti = vandq_u32(vResulti, Mask); - // Do a horizontal or of 4 entries - uint32x2_t vTemp = vget_low_u32(vResulti); - uint32x2_t vhi = vget_high_u32(vResulti); - vTemp = vorr_u32(vTemp, vhi); - vTemp = vpadd_u32(vTemp, vTemp); - vst1_lane_u16(&pDestination->v, vreinterpret_u16_u32(vTemp), 0); -#elif defined(_XM_SSE_INTRINSICS_) - // Bounds check - XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, Max); - // Convert to int with rounding - __m128i vInt = _mm_cvtps_epi32(vResult); - // No SSE operations will write to 16-bit values, so we have to extract them manually - auto x = static_cast(_mm_extract_epi16(vInt, 0)); - auto y = static_cast(_mm_extract_epi16(vInt, 2)); - auto z = static_cast(_mm_extract_epi16(vInt, 4)); - auto w = static_cast(_mm_extract_epi16(vInt, 6)); - pDestination->v = static_cast( - ((static_cast(w) & 0xF) << 12) - | ((static_cast(z) & 0xF) << 8) - | ((static_cast(y) & 0xF) << 4) - | ((static_cast(x) & 0xF))); -#endif -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline void XM_CALLCONV XMStoreU555 -( - XMU555* pDestination, - FXMVECTOR V -) noexcept -{ - assert(pDestination); - static const XMVECTORF32 Max = { { { 31.0f, 31.0f, 31.0f, 1.0f } } }; - -#if defined(_XM_NO_INTRINSICS_) - XMVECTOR N = XMVectorClamp(V, XMVectorZero(), Max.v); - N = XMVectorRound(N); - - XMFLOAT4A tmp; - XMStoreFloat4A(&tmp, N); - - pDestination->v = static_cast( - ((tmp.w > 0.f) ? 0x8000 : 0) - | ((static_cast(tmp.z) & 0x1F) << 10) - | ((static_cast(tmp.y) & 0x1F) << 5) - | (static_cast(tmp.x) & 0x1F)); -#elif defined(_XM_ARM_NEON_INTRINSICS_) - static const XMVECTORF32 Scale = { { { 1.0f, 32.f / 2.f, 32.f * 32.f, 32.f * 32.f * 32.f / 2.f } } }; - static const XMVECTORU32 Mask = { { { 0x1F, 0x1F << (5 - 1), 0x1F << 10, 0x1 << (15 - 1) } } }; - float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); - vResult = vminq_f32(vResult, Max); - vResult = vmulq_f32(vResult, Scale); - uint32x4_t vResulti = vcvtq_u32_f32(vResult); - vResulti = vandq_u32(vResulti, Mask); - // Do a horizontal or of 4 entries - uint32x2_t vTemp = vget_low_u32(vResulti); - uint32x2_t vTemp2 = vget_high_u32(vResulti); - vTemp = vorr_u32(vTemp, vTemp2); - // Perform a single bit left shift on y|w - vTemp2 = vdup_lane_u32(vTemp, 1); - vTemp2 = vadd_u32(vTemp2, vTemp2); - vTemp = vorr_u32(vTemp, vTemp2); - vst1_lane_u16(&pDestination->v, vreinterpret_u16_u32(vTemp), 0); -#elif defined(_XM_SSE_INTRINSICS_) - // Bounds check - XMVECTOR vResult = _mm_max_ps(V, g_XMZero); - vResult = _mm_min_ps(vResult, Max); - // Convert to int with rounding - __m128i vInt = _mm_cvtps_epi32(vResult); - // No SSE operations will write to 16-bit values, so we have to extract them manually - auto x = static_cast(_mm_extract_epi16(vInt, 0)); - auto y = static_cast(_mm_extract_epi16(vInt, 2)); - auto z = static_cast(_mm_extract_epi16(vInt, 4)); - auto w = static_cast(_mm_extract_epi16(vInt, 6)); - pDestination->v = static_cast( - (static_cast(w) ? 0x8000 : 0) - | ((static_cast(z) & 0x1F) << 10) - | ((static_cast(y) & 0x1F) << 5) - | ((static_cast(x) & 0x1F))); -#endif -} - - -/**************************************************************************** - * - * XMCOLOR operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMCOLOR::XMCOLOR -( - float _r, - float _g, - float _b, - float _a -) noexcept -{ - XMStoreColor(this, XMVectorSet(_r, _g, _b, _a)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMCOLOR::XMCOLOR(const float* pArray) noexcept -{ - XMStoreColor(this, XMLoadFloat4(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMHALF2 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMHALF2::XMHALF2 -( - float _x, - float _y -) noexcept -{ - x = XMConvertFloatToHalf(_x); - y = XMConvertFloatToHalf(_y); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMHALF2::XMHALF2(const float* pArray) noexcept -{ - assert(pArray != nullptr); - x = XMConvertFloatToHalf(pArray[0]); - y = XMConvertFloatToHalf(pArray[1]); -} - -/**************************************************************************** - * - * XMSHORTN2 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMSHORTN2::XMSHORTN2 -( - float _x, - float _y -) noexcept -{ - XMStoreShortN2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMSHORTN2::XMSHORTN2(const float* pArray) noexcept -{ - XMStoreShortN2(this, XMLoadFloat2(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMSHORT2 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMSHORT2::XMSHORT2 -( - float _x, - float _y -) noexcept -{ - XMStoreShort2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMSHORT2::XMSHORT2(const float* pArray) noexcept -{ - XMStoreShort2(this, XMLoadFloat2(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMUSHORTN2 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMUSHORTN2::XMUSHORTN2 -( - float _x, - float _y -) noexcept -{ - XMStoreUShortN2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUSHORTN2::XMUSHORTN2(const float* pArray) noexcept -{ - XMStoreUShortN2(this, XMLoadFloat2(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMUSHORT2 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMUSHORT2::XMUSHORT2 -( - float _x, - float _y -) noexcept -{ - XMStoreUShort2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUSHORT2::XMUSHORT2(const float* pArray) noexcept -{ - XMStoreUShort2(this, XMLoadFloat2(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMBYTEN2 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMBYTEN2::XMBYTEN2 -( - float _x, - float _y -) noexcept -{ - XMStoreByteN2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMBYTEN2::XMBYTEN2(const float* pArray) noexcept -{ - XMStoreByteN2(this, XMLoadFloat2(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMBYTE2 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMBYTE2::XMBYTE2 -( - float _x, - float _y -) noexcept -{ - XMStoreByte2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMBYTE2::XMBYTE2(const float* pArray) noexcept -{ - XMStoreByte2(this, XMLoadFloat2(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMUBYTEN2 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMUBYTEN2::XMUBYTEN2 -( - float _x, - float _y -) noexcept -{ - XMStoreUByteN2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUBYTEN2::XMUBYTEN2(const float* pArray) noexcept -{ - XMStoreUByteN2(this, XMLoadFloat2(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMUBYTE2 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMUBYTE2::XMUBYTE2 -( - float _x, - float _y -) noexcept -{ - XMStoreUByte2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUBYTE2::XMUBYTE2(const float* pArray) noexcept -{ - XMStoreUByte2(this, XMLoadFloat2(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMU565 operators - * - ****************************************************************************/ - -inline XMU565::XMU565 -( - float _x, - float _y, - float _z -) noexcept -{ - XMStoreU565(this, XMVectorSet(_x, _y, _z, 0.0f)); -} - -_Use_decl_annotations_ -inline XMU565::XMU565(const float* pArray) noexcept -{ - XMStoreU565(this, XMLoadFloat3(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMFLOAT3PK operators - * - ****************************************************************************/ - -inline XMFLOAT3PK::XMFLOAT3PK -( - float _x, - float _y, - float _z -) noexcept -{ - XMStoreFloat3PK(this, XMVectorSet(_x, _y, _z, 0.0f)); -} - -_Use_decl_annotations_ -inline XMFLOAT3PK::XMFLOAT3PK(const float* pArray) noexcept -{ - XMStoreFloat3PK(this, XMLoadFloat3(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMFLOAT3SE operators - * - ****************************************************************************/ - -inline XMFLOAT3SE::XMFLOAT3SE -( - float _x, - float _y, - float _z -) noexcept -{ - XMStoreFloat3SE(this, XMVectorSet(_x, _y, _z, 0.0f)); -} - -_Use_decl_annotations_ -inline XMFLOAT3SE::XMFLOAT3SE(const float* pArray) noexcept -{ - XMStoreFloat3SE(this, XMLoadFloat3(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMHALF4 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMHALF4::XMHALF4 -( - float _x, - float _y, - float _z, - float _w -) noexcept -{ - x = XMConvertFloatToHalf(_x); - y = XMConvertFloatToHalf(_y); - z = XMConvertFloatToHalf(_z); - w = XMConvertFloatToHalf(_w); -} - -//------------------------------------------------------------------------------ - -_Use_decl_annotations_ -inline XMHALF4::XMHALF4(const float* pArray) noexcept -{ - XMConvertFloatToHalfStream(&x, sizeof(HALF), pArray, sizeof(float), 4); -} - -/**************************************************************************** - * - * XMSHORTN4 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMSHORTN4::XMSHORTN4 -( - float _x, - float _y, - float _z, - float _w -) noexcept -{ - XMStoreShortN4(this, XMVectorSet(_x, _y, _z, _w)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMSHORTN4::XMSHORTN4(const float* pArray) noexcept -{ - XMStoreShortN4(this, XMLoadFloat4(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMSHORT4 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMSHORT4::XMSHORT4 -( - float _x, - float _y, - float _z, - float _w -) noexcept -{ - XMStoreShort4(this, XMVectorSet(_x, _y, _z, _w)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMSHORT4::XMSHORT4(const float* pArray) noexcept -{ - XMStoreShort4(this, XMLoadFloat4(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMUSHORTN4 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMUSHORTN4::XMUSHORTN4 -( - float _x, - float _y, - float _z, - float _w -) noexcept -{ - XMStoreUShortN4(this, XMVectorSet(_x, _y, _z, _w)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUSHORTN4::XMUSHORTN4(const float* pArray) noexcept -{ - XMStoreUShortN4(this, XMLoadFloat4(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMUSHORT4 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMUSHORT4::XMUSHORT4 -( - float _x, - float _y, - float _z, - float _w -) noexcept -{ - XMStoreUShort4(this, XMVectorSet(_x, _y, _z, _w)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUSHORT4::XMUSHORT4(const float* pArray) noexcept -{ - XMStoreUShort4(this, XMLoadFloat4(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMXDECN4 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMXDECN4::XMXDECN4 -( - float _x, - float _y, - float _z, - float _w -) noexcept -{ - XMStoreXDecN4(this, XMVectorSet(_x, _y, _z, _w)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMXDECN4::XMXDECN4(const float* pArray) noexcept -{ - XMStoreXDecN4(this, XMLoadFloat4(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMXDEC4 operators - * - ****************************************************************************/ -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4996) -// C4996: ignore deprecation warning -#endif - -#ifdef __clang__ -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -#endif - -#ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wdeprecated-declarations" -#endif - -//------------------------------------------------------------------------------ - -inline XMXDEC4::XMXDEC4 -( - float _x, - float _y, - float _z, - float _w -) noexcept -{ - XMStoreXDec4(this, XMVectorSet(_x, _y, _z, _w)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMXDEC4::XMXDEC4(const float* pArray) noexcept -{ - XMStoreXDec4(this, XMLoadFloat4(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMDECN4 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMDECN4::XMDECN4 -( - float _x, - float _y, - float _z, - float _w -) noexcept -{ - XMStoreDecN4(this, XMVectorSet(_x, _y, _z, _w)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMDECN4::XMDECN4(const float* pArray) noexcept -{ - XMStoreDecN4(this, XMLoadFloat4(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMDEC4 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMDEC4::XMDEC4 -( - float _x, - float _y, - float _z, - float _w -) noexcept -{ - XMStoreDec4(this, XMVectorSet(_x, _y, _z, _w)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMDEC4::XMDEC4(const float* pArray) noexcept -{ - XMStoreDec4(this, XMLoadFloat4(reinterpret_cast(pArray))); -} - -#ifdef __GNUC__ -#pragma GCC diagnostic pop -#endif -#ifdef __clang__ -#pragma clang diagnostic pop -#endif -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -/**************************************************************************** - * - * XMUDECN4 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMUDECN4::XMUDECN4 -( - float _x, - float _y, - float _z, - float _w -) noexcept -{ - XMStoreUDecN4(this, XMVectorSet(_x, _y, _z, _w)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUDECN4::XMUDECN4(const float* pArray) noexcept -{ - XMStoreUDecN4(this, XMLoadFloat4(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMUDEC4 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMUDEC4::XMUDEC4 -( - float _x, - float _y, - float _z, - float _w -) noexcept -{ - XMStoreUDec4(this, XMVectorSet(_x, _y, _z, _w)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUDEC4::XMUDEC4(const float* pArray) noexcept -{ - XMStoreUDec4(this, XMLoadFloat4(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMBYTEN4 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMBYTEN4::XMBYTEN4 -( - float _x, - float _y, - float _z, - float _w -) noexcept -{ - XMStoreByteN4(this, XMVectorSet(_x, _y, _z, _w)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMBYTEN4::XMBYTEN4(const float* pArray) noexcept -{ - XMStoreByteN4(this, XMLoadFloat4(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMBYTE4 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMBYTE4::XMBYTE4 -( - float _x, - float _y, - float _z, - float _w -) noexcept -{ - XMStoreByte4(this, XMVectorSet(_x, _y, _z, _w)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMBYTE4::XMBYTE4(const float* pArray) noexcept -{ - XMStoreByte4(this, XMLoadFloat4(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMUBYTEN4 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMUBYTEN4::XMUBYTEN4 -( - float _x, - float _y, - float _z, - float _w -) noexcept -{ - XMStoreUByteN4(this, XMVectorSet(_x, _y, _z, _w)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUBYTEN4::XMUBYTEN4(const float* pArray) noexcept -{ - XMStoreUByteN4(this, XMLoadFloat4(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMUBYTE4 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMUBYTE4::XMUBYTE4 -( - float _x, - float _y, - float _z, - float _w -) noexcept -{ - XMStoreUByte4(this, XMVectorSet(_x, _y, _z, _w)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUBYTE4::XMUBYTE4(const float* pArray) noexcept -{ - XMStoreUByte4(this, XMLoadFloat4(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMUNIBBLE4 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMUNIBBLE4::XMUNIBBLE4 -( - float _x, - float _y, - float _z, - float _w -) noexcept -{ - XMStoreUNibble4(this, XMVectorSet(_x, _y, _z, _w)); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMUNIBBLE4::XMUNIBBLE4(const float* pArray) noexcept -{ - XMStoreUNibble4(this, XMLoadFloat4(reinterpret_cast(pArray))); -} - -/**************************************************************************** - * - * XMU555 operators - * - ****************************************************************************/ - -//------------------------------------------------------------------------------ - -inline XMU555::XMU555 -( - float _x, - float _y, - float _z, - bool _w -) noexcept -{ - XMStoreU555(this, XMVectorSet(_x, _y, _z, ((_w) ? 1.0f : 0.0f))); -} - -//------------------------------------------------------------------------------ -_Use_decl_annotations_ -inline XMU555::XMU555 -( - const float* pArray, - bool _w -) noexcept -{ - XMVECTOR V = XMLoadFloat3(reinterpret_cast(pArray)); - XMStoreU555(this, XMVectorSetW(V, ((_w) ? 1.0f : 0.0f))); -} - +//------------------------------------------------------------------------------------- +// DirectXPackedVector.inl -- SIMD C++ Math library +// +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. +// +// http://go.microsoft.com/fwlink/?LinkID=615560 +//------------------------------------------------------------------------------------- + +#pragma once + +/**************************************************************************** + * + * Data conversion + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline float XMConvertHalfToFloat(HALF Value) noexcept +{ +#if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + __m128i V1 = _mm_cvtsi32_si128(static_cast(Value)); + __m128 V2 = _mm_cvtph_ps(V1); + return _mm_cvtss_f32(V2); +#elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__) && !defined(_XM_NO_INTRINSICS_) && (!defined(__GNUC__) || (__ARM_FP & 2)) + uint16x4_t vHalf = vdup_n_u16(Value); + float32x4_t vFloat = vcvt_f32_f16(vreinterpret_f16_u16(vHalf)); + return vgetq_lane_f32(vFloat, 0); +#else + auto Mantissa = static_cast(Value & 0x03FF); + + uint32_t Exponent = (Value & 0x7C00); + if (Exponent == 0x7C00) // INF/NAN + { + Exponent = 0x8f; + } + else if (Exponent != 0) // The value is normalized + { + Exponent = static_cast((static_cast(Value) >> 10) & 0x1F); + } + else if (Mantissa != 0) // The value is denormalized + { + // Normalize the value in the resulting float + Exponent = 1; + + do + { + Exponent--; + Mantissa <<= 1; + } + while ((Mantissa & 0x0400) == 0); + + Mantissa &= 0x03FF; + } + else // The value is zero + { + Exponent = static_cast(-112); + } + + uint32_t Result = + ((static_cast(Value) & 0x8000) << 16) // Sign + | ((Exponent + 112) << 23) // Exponent + | (Mantissa << 13); // Mantissa + + return reinterpret_cast(&Result)[0]; +#endif // !_XM_F16C_INTRINSICS_ +} + +//------------------------------------------------------------------------------ +#ifdef _PREFAST_ +#pragma prefast(push) +#pragma prefast(disable : 26015 26019, "PREfast noise: Esp:1307" ) +#endif + +_Use_decl_annotations_ +inline float* XMConvertHalfToFloatStream +( + float* pOutputStream, + size_t OutputStride, + const HALF* pInputStream, + size_t InputStride, + size_t HalfCount +) noexcept +{ + assert(pOutputStream); + assert(pInputStream); + + assert(InputStride >= sizeof(HALF)); + _Analysis_assume_(InputStride >= sizeof(HALF)); + + assert(OutputStride >= sizeof(float)); + _Analysis_assume_(OutputStride >= sizeof(float)); + +#if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + auto pHalf = reinterpret_cast(pInputStream); + auto pFloat = reinterpret_cast(pOutputStream); + + size_t i = 0; + size_t four = HalfCount >> 2; + if (four > 0) + { + if (InputStride == sizeof(HALF)) + { + if (OutputStride == sizeof(float)) + { + if ((reinterpret_cast(pFloat) & 0xF) == 0) + { + // Packed input, aligned & packed output + for (size_t j = 0; j < four; ++j) + { + __m128i HV = _mm_loadl_epi64(reinterpret_cast(pHalf)); + pHalf += InputStride * 4; + + __m128 FV = _mm_cvtph_ps(HV); + + XM_STREAM_PS(reinterpret_cast(pFloat), FV); + pFloat += OutputStride * 4; + i += 4; + } + } + else + { + // Packed input, packed output + for (size_t j = 0; j < four; ++j) + { + __m128i HV = _mm_loadl_epi64(reinterpret_cast(pHalf)); + pHalf += InputStride * 4; + + __m128 FV = _mm_cvtph_ps(HV); + + _mm_storeu_ps(reinterpret_cast(pFloat), FV); + pFloat += OutputStride * 4; + i += 4; + } + } + } + else + { + // Packed input, scattered output + for (size_t j = 0; j < four; ++j) + { + __m128i HV = _mm_loadl_epi64(reinterpret_cast(pHalf)); + pHalf += InputStride * 4; + + __m128 FV = _mm_cvtph_ps(HV); + + _mm_store_ss(reinterpret_cast(pFloat), FV); + pFloat += OutputStride; + *reinterpret_cast(pFloat) = _mm_extract_ps(FV, 1); + pFloat += OutputStride; + *reinterpret_cast(pFloat) = _mm_extract_ps(FV, 2); + pFloat += OutputStride; + *reinterpret_cast(pFloat) = _mm_extract_ps(FV, 3); + pFloat += OutputStride; + i += 4; + } + } + } + else if (OutputStride == sizeof(float)) + { + if ((reinterpret_cast(pFloat) & 0xF) == 0) + { + // Scattered input, aligned & packed output + for (size_t j = 0; j < four; ++j) + { + uint16_t H1 = *reinterpret_cast(pHalf); + pHalf += InputStride; + uint16_t H2 = *reinterpret_cast(pHalf); + pHalf += InputStride; + uint16_t H3 = *reinterpret_cast(pHalf); + pHalf += InputStride; + uint16_t H4 = *reinterpret_cast(pHalf); + pHalf += InputStride; + + __m128i HV = _mm_setzero_si128(); + HV = _mm_insert_epi16(HV, H1, 0); + HV = _mm_insert_epi16(HV, H2, 1); + HV = _mm_insert_epi16(HV, H3, 2); + HV = _mm_insert_epi16(HV, H4, 3); + __m128 FV = _mm_cvtph_ps(HV); + + XM_STREAM_PS(reinterpret_cast(pFloat), FV); + pFloat += OutputStride * 4; + i += 4; + } + } + else + { + // Scattered input, packed output + for (size_t j = 0; j < four; ++j) + { + uint16_t H1 = *reinterpret_cast(pHalf); + pHalf += InputStride; + uint16_t H2 = *reinterpret_cast(pHalf); + pHalf += InputStride; + uint16_t H3 = *reinterpret_cast(pHalf); + pHalf += InputStride; + uint16_t H4 = *reinterpret_cast(pHalf); + pHalf += InputStride; + + __m128i HV = _mm_setzero_si128(); + HV = _mm_insert_epi16(HV, H1, 0); + HV = _mm_insert_epi16(HV, H2, 1); + HV = _mm_insert_epi16(HV, H3, 2); + HV = _mm_insert_epi16(HV, H4, 3); + __m128 FV = _mm_cvtph_ps(HV); + + _mm_storeu_ps(reinterpret_cast(pFloat), FV); + pFloat += OutputStride * 4; + i += 4; + } + } + } + else + { + // Scattered input, scattered output + for (size_t j = 0; j < four; ++j) + { + uint16_t H1 = *reinterpret_cast(pHalf); + pHalf += InputStride; + uint16_t H2 = *reinterpret_cast(pHalf); + pHalf += InputStride; + uint16_t H3 = *reinterpret_cast(pHalf); + pHalf += InputStride; + uint16_t H4 = *reinterpret_cast(pHalf); + pHalf += InputStride; + + __m128i HV = _mm_setzero_si128(); + HV = _mm_insert_epi16(HV, H1, 0); + HV = _mm_insert_epi16(HV, H2, 1); + HV = _mm_insert_epi16(HV, H3, 2); + HV = _mm_insert_epi16(HV, H4, 3); + __m128 FV = _mm_cvtph_ps(HV); + + _mm_store_ss(reinterpret_cast(pFloat), FV); + pFloat += OutputStride; + *reinterpret_cast(pFloat) = _mm_extract_ps(FV, 1); + pFloat += OutputStride; + *reinterpret_cast(pFloat) = _mm_extract_ps(FV, 2); + pFloat += OutputStride; + *reinterpret_cast(pFloat) = _mm_extract_ps(FV, 3); + pFloat += OutputStride; + i += 4; + } + } + } + + for (; i < HalfCount; ++i) + { + *reinterpret_cast(pFloat) = XMConvertHalfToFloat(reinterpret_cast(pHalf)[0]); + pHalf += InputStride; + pFloat += OutputStride; + } + + XM_SFENCE(); + + return pOutputStream; +#elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) ||__aarch64__) && !defined(_XM_NO_INTRINSICS_) && (!defined(__GNUC__) || (__ARM_FP & 2)) + auto pHalf = reinterpret_cast(pInputStream); + auto pFloat = reinterpret_cast(pOutputStream); + + size_t i = 0; + size_t four = HalfCount >> 2; + if (four > 0) + { + if (InputStride == sizeof(HALF)) + { + if (OutputStride == sizeof(float)) + { + // Packed input, packed output + for (size_t j = 0; j < four; ++j) + { + uint16x4_t vHalf = vld1_u16(reinterpret_cast(pHalf)); + pHalf += InputStride * 4; + + float32x4_t vFloat = vcvt_f32_f16(vreinterpret_f16_u16(vHalf)); + + vst1q_f32(reinterpret_cast(pFloat), vFloat); + pFloat += OutputStride * 4; + i += 4; + } + } + else + { + // Packed input, scattered output + for (size_t j = 0; j < four; ++j) + { + uint16x4_t vHalf = vld1_u16(reinterpret_cast(pHalf)); + pHalf += InputStride * 4; + + float32x4_t vFloat = vcvt_f32_f16(vreinterpret_f16_u16(vHalf)); + + vst1q_lane_f32(reinterpret_cast(pFloat), vFloat, 0); + pFloat += OutputStride; + vst1q_lane_f32(reinterpret_cast(pFloat), vFloat, 1); + pFloat += OutputStride; + vst1q_lane_f32(reinterpret_cast(pFloat), vFloat, 2); + pFloat += OutputStride; + vst1q_lane_f32(reinterpret_cast(pFloat), vFloat, 3); + pFloat += OutputStride; + i += 4; + } + } + } + else if (OutputStride == sizeof(float)) + { + // Scattered input, packed output + for (size_t j = 0; j < four; ++j) + { + uint16_t H1 = *reinterpret_cast(pHalf); + pHalf += InputStride; + uint16_t H2 = *reinterpret_cast(pHalf); + pHalf += InputStride; + uint16_t H3 = *reinterpret_cast(pHalf); + pHalf += InputStride; + uint16_t H4 = *reinterpret_cast(pHalf); + pHalf += InputStride; + + uint64_t iHalf = uint64_t(H1) | (uint64_t(H2) << 16) | (uint64_t(H3) << 32) | (uint64_t(H4) << 48); + uint16x4_t vHalf = vcreate_u16(iHalf); + + float32x4_t vFloat = vcvt_f32_f16(vreinterpret_f16_u16(vHalf)); + + vst1q_f32(reinterpret_cast(pFloat), vFloat); + pFloat += OutputStride * 4; + i += 4; + } + } + else + { + // Scattered input, scattered output + for (size_t j = 0; j < four; ++j) + { + uint16_t H1 = *reinterpret_cast(pHalf); + pHalf += InputStride; + uint16_t H2 = *reinterpret_cast(pHalf); + pHalf += InputStride; + uint16_t H3 = *reinterpret_cast(pHalf); + pHalf += InputStride; + uint16_t H4 = *reinterpret_cast(pHalf); + pHalf += InputStride; + + uint64_t iHalf = uint64_t(H1) | (uint64_t(H2) << 16) | (uint64_t(H3) << 32) | (uint64_t(H4) << 48); + uint16x4_t vHalf = vcreate_u16(iHalf); + + float32x4_t vFloat = vcvt_f32_f16(vreinterpret_f16_u16(vHalf)); + + vst1q_lane_f32(reinterpret_cast(pFloat), vFloat, 0); + pFloat += OutputStride; + vst1q_lane_f32(reinterpret_cast(pFloat), vFloat, 1); + pFloat += OutputStride; + vst1q_lane_f32(reinterpret_cast(pFloat), vFloat, 2); + pFloat += OutputStride; + vst1q_lane_f32(reinterpret_cast(pFloat), vFloat, 3); + pFloat += OutputStride; + i += 4; + } + } + } + + for (; i < HalfCount; ++i) + { + *reinterpret_cast(pFloat) = XMConvertHalfToFloat(reinterpret_cast(pHalf)[0]); + pHalf += InputStride; + pFloat += OutputStride; + } + + return pOutputStream; +#else + auto pHalf = reinterpret_cast(pInputStream); + auto pFloat = reinterpret_cast(pOutputStream); + + for (size_t i = 0; i < HalfCount; i++) + { + *reinterpret_cast(pFloat) = XMConvertHalfToFloat(reinterpret_cast(pHalf)[0]); + pHalf += InputStride; + pFloat += OutputStride; + } + + return pOutputStream; +#endif // !_XM_F16C_INTRINSICS_ +} + +//------------------------------------------------------------------------------ + +inline HALF XMConvertFloatToHalf(float Value) noexcept +{ +#if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + __m128 V1 = _mm_set_ss(Value); + __m128i V2 = _mm_cvtps_ph(V1, _MM_FROUND_TO_NEAREST_INT); + return static_cast(_mm_extract_epi16(V2, 0)); +#elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__) && !defined(_XM_NO_INTRINSICS_) && (!defined(__GNUC__) || (__ARM_FP & 2)) + float32x4_t vFloat = vdupq_n_f32(Value); + float16x4_t vHalf = vcvt_f16_f32(vFloat); + return vget_lane_u16(vreinterpret_u16_f16(vHalf), 0); +#else + uint32_t Result; + + auto IValue = reinterpret_cast(&Value)[0]; + uint32_t Sign = (IValue & 0x80000000U) >> 16U; + IValue = IValue & 0x7FFFFFFFU; // Hack off the sign + if (IValue >= 0x47800000 /*e+16*/) + { + // The number is too large to be represented as a half. Return infinity or NaN + Result = 0x7C00U | ((IValue > 0x7F800000) ? (0x200 | ((IValue >> 13U) & 0x3FFU)) : 0U); + } + else if (IValue <= 0x33000000U /*e-25*/) + { + Result = 0; + } + else if (IValue < 0x38800000U /*e-14*/) + { + // The number is too small to be represented as a normalized half. + // Convert it to a denormalized value. + uint32_t Shift = 125U - (IValue >> 23U); + IValue = 0x800000U | (IValue & 0x7FFFFFU); + Result = IValue >> (Shift + 1); + uint32_t s = (IValue & ((1U << Shift) - 1)) != 0; + Result += (Result | s) & ((IValue >> Shift) & 1U); + } + else + { + // Rebias the exponent to represent the value as a normalized half. + IValue += 0xC8000000U; + Result = ((IValue + 0x0FFFU + ((IValue >> 13U) & 1U)) >> 13U) & 0x7FFFU; + } + return static_cast(Result | Sign); +#endif // !_XM_F16C_INTRINSICS_ +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline HALF* XMConvertFloatToHalfStream +( + HALF* pOutputStream, + size_t OutputStride, + const float* pInputStream, + size_t InputStride, + size_t FloatCount +) noexcept +{ + assert(pOutputStream); + assert(pInputStream); + + assert(InputStride >= sizeof(float)); + _Analysis_assume_(InputStride >= sizeof(float)); + + assert(OutputStride >= sizeof(HALF)); + _Analysis_assume_(OutputStride >= sizeof(HALF)); + +#if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + auto pFloat = reinterpret_cast(pInputStream); + auto pHalf = reinterpret_cast(pOutputStream); + + size_t i = 0; + size_t four = FloatCount >> 2; + if (four > 0) + { + if (InputStride == sizeof(float)) + { + if (OutputStride == sizeof(HALF)) + { + if ((reinterpret_cast(pFloat) & 0xF) == 0) + { + // Aligned and packed input, packed output + for (size_t j = 0; j < four; ++j) + { + __m128 FV = _mm_load_ps(reinterpret_cast(pFloat)); + pFloat += InputStride * 4; + + __m128i HV = _mm_cvtps_ph(FV, _MM_FROUND_TO_NEAREST_INT); + + _mm_storel_epi64(reinterpret_cast<__m128i*>(pHalf), HV); + pHalf += OutputStride * 4; + i += 4; + } + } + else + { + // Packed input, packed output + for (size_t j = 0; j < four; ++j) + { + __m128 FV = _mm_loadu_ps(reinterpret_cast(pFloat)); + pFloat += InputStride * 4; + + __m128i HV = _mm_cvtps_ph(FV, _MM_FROUND_TO_NEAREST_INT); + + _mm_storel_epi64(reinterpret_cast<__m128i*>(pHalf), HV); + pHalf += OutputStride * 4; + i += 4; + } + } + } + else + { + if ((reinterpret_cast(pFloat) & 0xF) == 0) + { + // Aligned & packed input, scattered output + for (size_t j = 0; j < four; ++j) + { + __m128 FV = _mm_load_ps(reinterpret_cast(pFloat)); + pFloat += InputStride * 4; + + __m128i HV = _mm_cvtps_ph(FV, _MM_FROUND_TO_NEAREST_INT); + + *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 0)); + pHalf += OutputStride; + *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 1)); + pHalf += OutputStride; + *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 2)); + pHalf += OutputStride; + *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 3)); + pHalf += OutputStride; + i += 4; + } + } + else + { + // Packed input, scattered output + for (size_t j = 0; j < four; ++j) + { + __m128 FV = _mm_loadu_ps(reinterpret_cast(pFloat)); + pFloat += InputStride * 4; + + __m128i HV = _mm_cvtps_ph(FV, _MM_FROUND_TO_NEAREST_INT); + + *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 0)); + pHalf += OutputStride; + *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 1)); + pHalf += OutputStride; + *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 2)); + pHalf += OutputStride; + *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 3)); + pHalf += OutputStride; + i += 4; + } + } + } + } + else if (OutputStride == sizeof(HALF)) + { + // Scattered input, packed output + for (size_t j = 0; j < four; ++j) + { + __m128 FV1 = _mm_load_ss(reinterpret_cast(pFloat)); + pFloat += InputStride; + + __m128 FV2 = _mm_broadcast_ss(reinterpret_cast(pFloat)); + pFloat += InputStride; + + __m128 FV3 = _mm_broadcast_ss(reinterpret_cast(pFloat)); + pFloat += InputStride; + + __m128 FV4 = _mm_broadcast_ss(reinterpret_cast(pFloat)); + pFloat += InputStride; + + __m128 FV = _mm_blend_ps(FV1, FV2, 0x2); + __m128 FT = _mm_blend_ps(FV3, FV4, 0x8); + FV = _mm_blend_ps(FV, FT, 0xC); + + __m128i HV = _mm_cvtps_ph(FV, _MM_FROUND_TO_NEAREST_INT); + + _mm_storel_epi64(reinterpret_cast<__m128i*>(pHalf), HV); + pHalf += OutputStride * 4; + i += 4; + } + } + else + { + // Scattered input, scattered output + for (size_t j = 0; j < four; ++j) + { + __m128 FV1 = _mm_load_ss(reinterpret_cast(pFloat)); + pFloat += InputStride; + + __m128 FV2 = _mm_broadcast_ss(reinterpret_cast(pFloat)); + pFloat += InputStride; + + __m128 FV3 = _mm_broadcast_ss(reinterpret_cast(pFloat)); + pFloat += InputStride; + + __m128 FV4 = _mm_broadcast_ss(reinterpret_cast(pFloat)); + pFloat += InputStride; + + __m128 FV = _mm_blend_ps(FV1, FV2, 0x2); + __m128 FT = _mm_blend_ps(FV3, FV4, 0x8); + FV = _mm_blend_ps(FV, FT, 0xC); + + __m128i HV = _mm_cvtps_ph(FV, _MM_FROUND_TO_NEAREST_INT); + + *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 0)); + pHalf += OutputStride; + *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 1)); + pHalf += OutputStride; + *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 2)); + pHalf += OutputStride; + *reinterpret_cast(pHalf) = static_cast(_mm_extract_epi16(HV, 3)); + pHalf += OutputStride; + i += 4; + } + } + } + + for (; i < FloatCount; ++i) + { + *reinterpret_cast(pHalf) = XMConvertFloatToHalf(reinterpret_cast(pFloat)[0]); + pFloat += InputStride; + pHalf += OutputStride; + } + + return pOutputStream; +#elif defined(_XM_ARM_NEON_INTRINSICS_) && (defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __aarch64__) && !defined(_XM_NO_INTRINSICS_) && (!defined(__GNUC__) || (__ARM_FP & 2)) + auto pFloat = reinterpret_cast(pInputStream); + auto pHalf = reinterpret_cast(pOutputStream); + + size_t i = 0; + size_t four = FloatCount >> 2; + if (four > 0) + { + if (InputStride == sizeof(float)) + { + if (OutputStride == sizeof(HALF)) + { + // Packed input, packed output + for (size_t j = 0; j < four; ++j) + { + float32x4_t vFloat = vld1q_f32(reinterpret_cast(pFloat)); + pFloat += InputStride * 4; + + uint16x4_t vHalf = vreinterpret_u16_f16(vcvt_f16_f32(vFloat)); + + vst1_u16(reinterpret_cast(pHalf), vHalf); + pHalf += OutputStride * 4; + i += 4; + } + } + else + { + // Packed input, scattered output + for (size_t j = 0; j < four; ++j) + { + float32x4_t vFloat = vld1q_f32(reinterpret_cast(pFloat)); + pFloat += InputStride * 4; + + uint16x4_t vHalf = vreinterpret_u16_f16(vcvt_f16_f32(vFloat)); + + vst1_lane_u16(reinterpret_cast(pHalf), vHalf, 0); + pHalf += OutputStride; + vst1_lane_u16(reinterpret_cast(pHalf), vHalf, 1); + pHalf += OutputStride; + vst1_lane_u16(reinterpret_cast(pHalf), vHalf, 2); + pHalf += OutputStride; + vst1_lane_u16(reinterpret_cast(pHalf), vHalf, 3); + pHalf += OutputStride; + i += 4; + } + } + } + else if (OutputStride == sizeof(HALF)) + { + // Scattered input, packed output + for (size_t j = 0; j < four; ++j) + { + float32x4_t vFloat = vdupq_n_f32(0); + vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 0); + pFloat += InputStride; + + vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 1); + pFloat += InputStride; + + vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 2); + pFloat += InputStride; + + vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 3); + pFloat += InputStride; + + uint16x4_t vHalf = vreinterpret_u16_f16(vcvt_f16_f32(vFloat)); + + vst1_u16(reinterpret_cast(pHalf), vHalf); + pHalf += OutputStride * 4; + i += 4; + } + } + else + { + // Scattered input, scattered output + for (size_t j = 0; j < four; ++j) + { + float32x4_t vFloat = vdupq_n_f32(0); + vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 0); + pFloat += InputStride; + + vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 1); + pFloat += InputStride; + + vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 2); + pFloat += InputStride; + + vFloat = vld1q_lane_f32(reinterpret_cast(pFloat), vFloat, 3); + pFloat += InputStride; + + uint16x4_t vHalf = vreinterpret_u16_f16(vcvt_f16_f32(vFloat)); + + vst1_lane_u16(reinterpret_cast(pHalf), vHalf, 0); + pHalf += OutputStride; + vst1_lane_u16(reinterpret_cast(pHalf), vHalf, 1); + pHalf += OutputStride; + vst1_lane_u16(reinterpret_cast(pHalf), vHalf, 2); + pHalf += OutputStride; + vst1_lane_u16(reinterpret_cast(pHalf), vHalf, 3); + pHalf += OutputStride; + i += 4; + } + } + } + + for (; i < FloatCount; ++i) + { + *reinterpret_cast(pHalf) = XMConvertFloatToHalf(reinterpret_cast(pFloat)[0]); + pFloat += InputStride; + pHalf += OutputStride; + } + + return pOutputStream; +#else + auto pFloat = reinterpret_cast(pInputStream); + auto pHalf = reinterpret_cast(pOutputStream); + + for (size_t i = 0; i < FloatCount; i++) + { + *reinterpret_cast(pHalf) = XMConvertFloatToHalf(reinterpret_cast(pFloat)[0]); + pFloat += InputStride; + pHalf += OutputStride; + } + return pOutputStream; +#endif // !_XM_F16C_INTRINSICS_ +} + +#ifdef _PREFAST_ +#pragma prefast(pop) +#endif + +/**************************************************************************** + * + * Vector and matrix load operations + * + ****************************************************************************/ + +#ifdef _PREFAST_ +#pragma prefast(push) +#pragma prefast(disable:28931, "PREfast noise: Esp:1266") +#endif + +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadColor(const XMCOLOR* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + // int32_t -> Float conversions are done in one instruction. + // uint32_t -> Float calls a runtime function. Keep in int32_t + auto iColor = static_cast(pSource->c); + XMVECTORF32 vColor = { { { + static_cast((iColor >> 16) & 0xFF)* (1.0f / 255.0f), + static_cast((iColor >> 8) & 0xFF)* (1.0f / 255.0f), + static_cast(iColor & 0xFF)* (1.0f / 255.0f), + static_cast((iColor >> 24) & 0xFF)* (1.0f / 255.0f) + } } }; + return vColor.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32_t bgra = pSource->c; + uint32_t rgba = (bgra & 0xFF00FF00) | ((bgra >> 16) & 0xFF) | ((bgra << 16) & 0xFF0000); + uint32x2_t vInt8 = vdup_n_u32(rgba); + uint16x8_t vInt16 = vmovl_u8(vreinterpret_u8_u32(vInt8)); + uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); + float32x4_t R = vcvtq_f32_u32(vInt); + return vmulq_n_f32(R, 1.0f / 255.0f); +#elif defined(_XM_SSE_INTRINSICS_) + // Splat the color in all four entries + __m128i vInt = _mm_set1_epi32(static_cast(pSource->c)); + // Shift R&0xFF0000, G&0xFF00, B&0xFF, A&0xFF000000 + vInt = _mm_and_si128(vInt, g_XMMaskA8R8G8B8); + // a is unsigned! Flip the bit to convert the order to signed + vInt = _mm_xor_si128(vInt, g_XMFlipA8R8G8B8); + // Convert to floating point numbers + XMVECTOR vTemp = _mm_cvtepi32_ps(vInt); + // RGB + 0, A + 0x80000000.f to undo the signed order. + vTemp = _mm_add_ps(vTemp, g_XMFixAA8R8G8B8); + // Convert 0-255 to 0.0f-1.0f + return _mm_mul_ps(vTemp, g_XMNormalizeA8R8G8B8); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadHalf2(const XMHALF2* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + __m128 V = _mm_load_ss(reinterpret_cast(pSource)); + return _mm_cvtph_ps(_mm_castps_si128(V)); +#else + XMVECTORF32 vResult = { { { + XMConvertHalfToFloat(pSource->x), + XMConvertHalfToFloat(pSource->y), + 0.0f, + 0.0f + } } }; + return vResult.v; +#endif // !_XM_F16C_INTRINSICS_ +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadShortN2(const XMSHORTN2* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + (pSource->x == -32768) ? -1.f : (static_cast(pSource->x)* (1.0f / 32767.0f)), + (pSource->y == -32768) ? -1.f : (static_cast(pSource->y)* (1.0f / 32767.0f)), + 0.0f, + 0.0f + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vInt16 = vld1_dup_u32(reinterpret_cast(pSource)); + int32x4_t vInt = vmovl_s16(vreinterpret_s16_u32(vInt16)); + vInt = vandq_s32(vInt, g_XMMaskXY); + float32x4_t R = vcvtq_f32_s32(vInt); + R = vmulq_n_f32(R, 1.0f / 32767.0f); + return vmaxq_f32(R, vdupq_n_f32(-1.f)); +#elif defined(_XM_SSE_INTRINSICS_) + // Splat the two shorts in all four entries (WORD alignment okay, + // DWORD alignment preferred) + __m128 vTemp = _mm_load_ps1(reinterpret_cast(&pSource->x)); + // Mask x&0xFFFF, y&0xFFFF0000,z&0,w&0 + vTemp = _mm_and_ps(vTemp, g_XMMaskX16Y16); + // x needs to be sign extended + vTemp = _mm_xor_ps(vTemp, g_XMFlipX16Y16); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // x - 0x8000 to undo the signed order. + vTemp = _mm_add_ps(vTemp, g_XMFixX16Y16); + // Convert -1.0f - 1.0f + vTemp = _mm_mul_ps(vTemp, g_XMNormalizeX16Y16); + // Clamp result (for case of -32768) + return _mm_max_ps(vTemp, g_XMNegativeOne); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadShort2(const XMSHORT2* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + static_cast(pSource->x), + static_cast(pSource->y), + 0.f, + 0.f + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vInt16 = vld1_dup_u32(reinterpret_cast(pSource)); + int32x4_t vInt = vmovl_s16(vreinterpret_s16_u32(vInt16)); + vInt = vandq_s32(vInt, g_XMMaskXY); + return vcvtq_f32_s32(vInt); +#elif defined(_XM_SSE_INTRINSICS_) + // Splat the two shorts in all four entries (WORD alignment okay, + // DWORD alignment preferred) + __m128 vTemp = _mm_load_ps1(reinterpret_cast(&pSource->x)); + // Mask x&0xFFFF, y&0xFFFF0000,z&0,w&0 + vTemp = _mm_and_ps(vTemp, g_XMMaskX16Y16); + // x needs to be sign extended + vTemp = _mm_xor_ps(vTemp, g_XMFlipX16Y16); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // x - 0x8000 to undo the signed order. + vTemp = _mm_add_ps(vTemp, g_XMFixX16Y16); + // Y is 65536 too large + return _mm_mul_ps(vTemp, g_XMFixupY16); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadUShortN2(const XMUSHORTN2* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + static_cast(pSource->x) / 65535.0f, + static_cast(pSource->y) / 65535.0f, + 0.f, + 0.f + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vInt16 = vld1_dup_u32(reinterpret_cast(pSource)); + uint32x4_t vInt = vmovl_u16(vreinterpret_u16_u32(vInt16)); + vInt = vandq_u32(vInt, g_XMMaskXY); + float32x4_t R = vcvtq_f32_u32(vInt); + R = vmulq_n_f32(R, 1.0f / 65535.0f); + return vmaxq_f32(R, vdupq_n_f32(-1.f)); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 FixupY16 = { { { 1.0f / 65535.0f, 1.0f / (65535.0f * 65536.0f), 0.0f, 0.0f } } }; + static const XMVECTORF32 FixaddY16 = { { { 0, 32768.0f * 65536.0f, 0, 0 } } }; + // Splat the two shorts in all four entries (WORD alignment okay, + // DWORD alignment preferred) + __m128 vTemp = _mm_load_ps1(reinterpret_cast(&pSource->x)); + // Mask x&0xFFFF, y&0xFFFF0000,z&0,w&0 + vTemp = _mm_and_ps(vTemp, g_XMMaskX16Y16); + // y needs to be sign flipped + vTemp = _mm_xor_ps(vTemp, g_XMFlipY); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // y + 0x8000 to undo the signed order. + vTemp = _mm_add_ps(vTemp, FixaddY16); + // Y is 65536 times too large + vTemp = _mm_mul_ps(vTemp, FixupY16); + return vTemp; +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadUShort2(const XMUSHORT2* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + static_cast(pSource->x), + static_cast(pSource->y), + 0.f, + 0.f + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vInt16 = vld1_dup_u32(reinterpret_cast(pSource)); + uint32x4_t vInt = vmovl_u16(vreinterpret_u16_u32(vInt16)); + vInt = vandq_u32(vInt, g_XMMaskXY); + return vcvtq_f32_u32(vInt); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 FixaddY16 = { { { 0, 32768.0f, 0, 0 } } }; + // Splat the two shorts in all four entries (WORD alignment okay, + // DWORD alignment preferred) + __m128 vTemp = _mm_load_ps1(reinterpret_cast(&pSource->x)); + // Mask x&0xFFFF, y&0xFFFF0000,z&0,w&0 + vTemp = _mm_and_ps(vTemp, g_XMMaskX16Y16); + // y needs to be sign flipped + vTemp = _mm_xor_ps(vTemp, g_XMFlipY); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // Y is 65536 times too large + vTemp = _mm_mul_ps(vTemp, g_XMFixupY16); + // y + 0x8000 to undo the signed order. + vTemp = _mm_add_ps(vTemp, FixaddY16); + return vTemp; +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadByteN2(const XMBYTEN2* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + (pSource->x == -128) ? -1.f : (static_cast(pSource->x)* (1.0f / 127.0f)), + (pSource->y == -128) ? -1.f : (static_cast(pSource->y)* (1.0f / 127.0f)), + 0.0f, + 0.0f + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint16x4_t vInt8 = vld1_dup_u16(reinterpret_cast(pSource)); + int16x8_t vInt16 = vmovl_s8(vreinterpret_s8_u16(vInt8)); + int32x4_t vInt = vmovl_s16(vget_low_s16(vInt16)); + vInt = vandq_s32(vInt, g_XMMaskXY); + float32x4_t R = vcvtq_f32_s32(vInt); + R = vmulq_n_f32(R, 1.0f / 127.0f); + return vmaxq_f32(R, vdupq_n_f32(-1.f)); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 Scale = { { { 1.0f / 127.0f, 1.0f / (127.0f * 256.0f), 0, 0 } } }; + static const XMVECTORU32 Mask = { { { 0xFF, 0xFF00, 0, 0 } } }; + // Splat the color in all four entries (x,z,y,w) + __m128i vInt = XM_LOADU_SI16(&pSource->v); + XMVECTOR vTemp = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); + // Mask + vTemp = _mm_and_ps(vTemp, Mask); + // x,y and z are unsigned! Flip the bits to convert the order to signed + vTemp = _mm_xor_ps(vTemp, g_XMXorByte4); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // x, y and z - 0x80 to complete the conversion + vTemp = _mm_add_ps(vTemp, g_XMAddByte4); + // Fix y, z and w because they are too large + vTemp = _mm_mul_ps(vTemp, Scale); + // Clamp result (for case of -128) + return _mm_max_ps(vTemp, g_XMNegativeOne); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadByte2(const XMBYTE2* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + static_cast(pSource->x), + static_cast(pSource->y), + 0.0f, + 0.0f + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint16x4_t vInt8 = vld1_dup_u16(reinterpret_cast(pSource)); + int16x8_t vInt16 = vmovl_s8(vreinterpret_s8_u16(vInt8)); + int32x4_t vInt = vmovl_s16(vget_low_s16(vInt16)); + vInt = vandq_s32(vInt, g_XMMaskXY); + return vcvtq_f32_s32(vInt); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 Scale = { { { 1.0f, 1.0f / 256.0f, 1.0f / 65536.0f, 1.0f / (65536.0f * 256.0f) } } }; + static const XMVECTORU32 Mask = { { { 0xFF, 0xFF00, 0, 0 } } }; + // Splat the color in all four entries (x,z,y,w) + __m128i vInt = XM_LOADU_SI16(&pSource->v); + XMVECTOR vTemp = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); + // Mask + vTemp = _mm_and_ps(vTemp, Mask); + // x,y and z are unsigned! Flip the bits to convert the order to signed + vTemp = _mm_xor_ps(vTemp, g_XMXorByte4); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // x, y and z - 0x80 to complete the conversion + vTemp = _mm_add_ps(vTemp, g_XMAddByte4); + // Fix y, z and w because they are too large + return _mm_mul_ps(vTemp, Scale); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadUByteN2(const XMUBYTEN2* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + static_cast(pSource->x)* (1.0f / 255.0f), + static_cast(pSource->y)* (1.0f / 255.0f), + 0.0f, + 0.0f + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint16x4_t vInt8 = vld1_dup_u16(reinterpret_cast(pSource)); + uint16x8_t vInt16 = vmovl_u8(vreinterpret_u8_u16(vInt8)); + uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); + vInt = vandq_u32(vInt, g_XMMaskXY); + float32x4_t R = vcvtq_f32_u32(vInt); + return vmulq_n_f32(R, 1.0f / 255.0f); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 Scale = { { { 1.0f / 255.0f, 1.0f / (255.0f * 256.0f), 0, 0 } } }; + static const XMVECTORU32 Mask = { { { 0xFF, 0xFF00, 0, 0 } } }; + // Splat the color in all four entries (x,z,y,w) + __m128i vInt = XM_LOADU_SI16(&pSource->v); + XMVECTOR vTemp = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); + // Mask + vTemp = _mm_and_ps(vTemp, Mask); + // w is signed! Flip the bits to convert the order to unsigned + vTemp = _mm_xor_ps(vTemp, g_XMFlipW); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // w + 0x80 to complete the conversion + vTemp = _mm_add_ps(vTemp, g_XMAddUDec4); + // Fix y, z and w because they are too large + return _mm_mul_ps(vTemp, Scale); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadUByte2(const XMUBYTE2* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + static_cast(pSource->x), + static_cast(pSource->y), + 0.0f, + 0.0f + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint16x4_t vInt8 = vld1_dup_u16(reinterpret_cast(pSource)); + uint16x8_t vInt16 = vmovl_u8(vreinterpret_u8_u16(vInt8)); + uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); + vInt = vandq_u32(vInt, g_XMMaskXY); + return vcvtq_f32_u32(vInt); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 Scale = { { { 1.0f, 1.0f / 256.0f, 0, 0 } } }; + static const XMVECTORU32 Mask = { { { 0xFF, 0xFF00, 0, 0 } } }; + // Splat the color in all four entries (x,z,y,w) + __m128i vInt = XM_LOADU_SI16(&pSource->v); + XMVECTOR vTemp = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); + // Mask + vTemp = _mm_and_ps(vTemp, Mask); + // w is signed! Flip the bits to convert the order to unsigned + vTemp = _mm_xor_ps(vTemp, g_XMFlipW); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // w + 0x80 to complete the conversion + vTemp = _mm_add_ps(vTemp, g_XMAddUDec4); + // Fix y, z and w because they are too large + return _mm_mul_ps(vTemp, Scale); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadU565(const XMU565* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + float(pSource->v & 0x1F), + float((pSource->v >> 5) & 0x3F), + float((pSource->v >> 11) & 0x1F), + 0.f, + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORI32 U565And = { { { 0x1F, 0x3F << 5, 0x1F << 11, 0 } } }; + static const XMVECTORF32 U565Mul = { { { 1.0f, 1.0f / 32.0f, 1.0f / 2048.f, 0 } } }; + uint16x4_t vInt16 = vld1_dup_u16(reinterpret_cast(pSource)); + uint32x4_t vInt = vmovl_u16(vInt16); + vInt = vandq_u32(vInt, U565And); + float32x4_t R = vcvtq_f32_u32(vInt); + return vmulq_f32(R, U565Mul); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORI32 U565And = { { { 0x1F, 0x3F << 5, 0x1F << 11, 0 } } }; + static const XMVECTORF32 U565Mul = { { { 1.0f, 1.0f / 32.0f, 1.0f / 2048.f, 0 } } }; + // Get the 16 bit value and splat it + __m128i vInt = XM_LOADU_SI16(&pSource->v); + XMVECTOR vResult = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); + // Mask off x, y and z + vResult = _mm_and_ps(vResult, U565And); + // Convert to float + vResult = _mm_cvtepi32_ps(_mm_castps_si128(vResult)); + // Normalize x, y, and z + vResult = _mm_mul_ps(vResult, U565Mul); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadFloat3PK(const XMFLOAT3PK* pSource) noexcept +{ + assert(pSource); + + XM_ALIGNED_DATA(16) uint32_t Result[4]; + uint32_t Mantissa; + uint32_t Exponent; + + // X Channel (6-bit mantissa) + Mantissa = pSource->xm; + + if (pSource->xe == 0x1f) // INF or NAN + { + Result[0] = static_cast(0x7f800000 | (static_cast(pSource->xm) << 17)); + } + else + { + if (pSource->xe != 0) // The value is normalized + { + Exponent = pSource->xe; + } + else if (Mantissa != 0) // The value is denormalized + { + // Normalize the value in the resulting float + Exponent = 1; + + do + { + Exponent--; + Mantissa <<= 1; + } + while ((Mantissa & 0x40) == 0); + + Mantissa &= 0x3F; + } + else // The value is zero + { + Exponent = static_cast(-112); + } + + Result[0] = ((Exponent + 112) << 23) | (Mantissa << 17); + } + + // Y Channel (6-bit mantissa) + Mantissa = pSource->ym; + + if (pSource->ye == 0x1f) // INF or NAN + { + Result[1] = static_cast(0x7f800000 | (static_cast(pSource->ym) << 17)); + } + else + { + if (pSource->ye != 0) // The value is normalized + { + Exponent = pSource->ye; + } + else if (Mantissa != 0) // The value is denormalized + { + // Normalize the value in the resulting float + Exponent = 1; + + do + { + Exponent--; + Mantissa <<= 1; + } + while ((Mantissa & 0x40) == 0); + + Mantissa &= 0x3F; + } + else // The value is zero + { + Exponent = static_cast(-112); + } + + Result[1] = ((Exponent + 112) << 23) | (Mantissa << 17); + } + + // Z Channel (5-bit mantissa) + Mantissa = pSource->zm; + + if (pSource->ze == 0x1f) // INF or NAN + { + Result[2] = static_cast(0x7f800000 | (static_cast(pSource->zm) << 17)); + } + else + { + if (pSource->ze != 0) // The value is normalized + { + Exponent = pSource->ze; + } + else if (Mantissa != 0) // The value is denormalized + { + // Normalize the value in the resulting float + Exponent = 1; + + do + { + Exponent--; + Mantissa <<= 1; + } + while ((Mantissa & 0x20) == 0); + + Mantissa &= 0x1F; + } + else // The value is zero + { + Exponent = static_cast(-112); + } + + Result[2] = ((Exponent + 112) << 23) | (Mantissa << 18); + } + + return XMLoadFloat3A(reinterpret_cast(&Result)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadFloat3SE(const XMFLOAT3SE* pSource) noexcept +{ + assert(pSource); + + union { float f; int32_t i; } fi; + fi.i = 0x33800000 + (pSource->e << 23); + float Scale = fi.f; + + XMVECTORF32 v = { { { + Scale * float(pSource->xm), + Scale * float(pSource->ym), + Scale * float(pSource->zm), + 1.0f } } }; + return v; +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadHalf4(const XMHALF4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + __m128i V = _mm_loadl_epi64(reinterpret_cast(pSource)); + return _mm_cvtph_ps(V); +#else + XMVECTORF32 vResult = { { { + XMConvertHalfToFloat(pSource->x), + XMConvertHalfToFloat(pSource->y), + XMConvertHalfToFloat(pSource->z), + XMConvertHalfToFloat(pSource->w) + } } }; + return vResult.v; +#endif // !_XM_F16C_INTRINSICS_ +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadShortN4(const XMSHORTN4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + (pSource->x == -32768) ? -1.f : (static_cast(pSource->x)* (1.0f / 32767.0f)), + (pSource->y == -32768) ? -1.f : (static_cast(pSource->y)* (1.0f / 32767.0f)), + (pSource->z == -32768) ? -1.f : (static_cast(pSource->z)* (1.0f / 32767.0f)), + (pSource->w == -32768) ? -1.f : (static_cast(pSource->w)* (1.0f / 32767.0f)) + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + int16x4_t vInt = vld1_s16(reinterpret_cast(pSource)); + int32x4_t V = vmovl_s16(vInt); + float32x4_t vResult = vcvtq_f32_s32(V); + vResult = vmulq_n_f32(vResult, 1.0f / 32767.0f); + return vmaxq_f32(vResult, vdupq_n_f32(-1.f)); +#elif defined(_XM_SSE_INTRINSICS_) + // Splat the color in all four entries (x,z,y,w) + __m128d vIntd = _mm_load1_pd(reinterpret_cast(&pSource->x)); + // Shift x&0ffff,z&0xffff,y&0xffff0000,w&0xffff0000 + __m128 vTemp = _mm_and_ps(_mm_castpd_ps(vIntd), g_XMMaskX16Y16Z16W16); + // x and z are unsigned! Flip the bits to convert the order to signed + vTemp = _mm_xor_ps(vTemp, g_XMFlipX16Y16Z16W16); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // x and z - 0x8000 to complete the conversion + vTemp = _mm_add_ps(vTemp, g_XMFixX16Y16Z16W16); + // Convert to -1.0f - 1.0f + vTemp = _mm_mul_ps(vTemp, g_XMNormalizeX16Y16Z16W16); + // Very important! The entries are x,z,y,w, flip it to x,y,z,w + vTemp = XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 1, 2, 0)); + // Clamp result (for case of -32768) + return _mm_max_ps(vTemp, g_XMNegativeOne); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadShort4(const XMSHORT4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + static_cast(pSource->x), + static_cast(pSource->y), + static_cast(pSource->z), + static_cast(pSource->w) + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + int16x4_t vInt = vld1_s16(reinterpret_cast(pSource)); + int32x4_t V = vmovl_s16(vInt); + return vcvtq_f32_s32(V); +#elif defined(_XM_SSE_INTRINSICS_) + // Splat the color in all four entries (x,z,y,w) + __m128d vIntd = _mm_load1_pd(reinterpret_cast(&pSource->x)); + // Shift x&0ffff,z&0xffff,y&0xffff0000,w&0xffff0000 + __m128 vTemp = _mm_and_ps(_mm_castpd_ps(vIntd), g_XMMaskX16Y16Z16W16); + // x and z are unsigned! Flip the bits to convert the order to signed + vTemp = _mm_xor_ps(vTemp, g_XMFlipX16Y16Z16W16); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // x and z - 0x8000 to complete the conversion + vTemp = _mm_add_ps(vTemp, g_XMFixX16Y16Z16W16); + // Fix y and w because they are 65536 too large + vTemp = _mm_mul_ps(vTemp, g_XMFixupY16W16); + // Very important! The entries are x,z,y,w, flip it to x,y,z,w + return XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 1, 2, 0)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadUShortN4(const XMUSHORTN4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + static_cast(pSource->x) / 65535.0f, + static_cast(pSource->y) / 65535.0f, + static_cast(pSource->z) / 65535.0f, + static_cast(pSource->w) / 65535.0f + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint16x4_t vInt = vld1_u16(reinterpret_cast(pSource)); + uint32x4_t V = vmovl_u16(vInt); + float32x4_t vResult = vcvtq_f32_u32(V); + return vmulq_n_f32(vResult, 1.0f / 65535.0f); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 FixupY16W16 = { { { 1.0f / 65535.0f, 1.0f / 65535.0f, 1.0f / (65535.0f * 65536.0f), 1.0f / (65535.0f * 65536.0f) } } }; + static const XMVECTORF32 FixaddY16W16 = { { { 0, 0, 32768.0f * 65536.0f, 32768.0f * 65536.0f } } }; + // Splat the color in all four entries (x,z,y,w) + __m128d vIntd = _mm_load1_pd(reinterpret_cast(&pSource->x)); + // Shift x&0ffff,z&0xffff,y&0xffff0000,w&0xffff0000 + __m128 vTemp = _mm_and_ps(_mm_castpd_ps(vIntd), g_XMMaskX16Y16Z16W16); + // y and w are signed! Flip the bits to convert the order to unsigned + vTemp = _mm_xor_ps(vTemp, g_XMFlipZW); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // y and w + 0x8000 to complete the conversion + vTemp = _mm_add_ps(vTemp, FixaddY16W16); + // Fix y and w because they are 65536 too large + vTemp = _mm_mul_ps(vTemp, FixupY16W16); + // Very important! The entries are x,z,y,w, flip it to x,y,z,w + return XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 1, 2, 0)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadUShort4(const XMUSHORT4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + static_cast(pSource->x), + static_cast(pSource->y), + static_cast(pSource->z), + static_cast(pSource->w) + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint16x4_t vInt = vld1_u16(reinterpret_cast(pSource)); + uint32x4_t V = vmovl_u16(vInt); + return vcvtq_f32_u32(V); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 FixaddY16W16 = { { { 0, 0, 32768.0f, 32768.0f } } }; + // Splat the color in all four entries (x,z,y,w) + __m128d vIntd = _mm_load1_pd(reinterpret_cast(&pSource->x)); + // Shift x&0ffff,z&0xffff,y&0xffff0000,w&0xffff0000 + __m128 vTemp = _mm_and_ps(_mm_castpd_ps(vIntd), g_XMMaskX16Y16Z16W16); + // y and w are signed! Flip the bits to convert the order to unsigned + vTemp = _mm_xor_ps(vTemp, g_XMFlipZW); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // Fix y and w because they are 65536 too large + vTemp = _mm_mul_ps(vTemp, g_XMFixupY16W16); + // y and w + 0x8000 to complete the conversion + vTemp = _mm_add_ps(vTemp, FixaddY16W16); + // Very important! The entries are x,z,y,w, flip it to x,y,z,w + return XM_PERMUTE_PS(vTemp, _MM_SHUFFLE(3, 1, 2, 0)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadXDecN4(const XMXDECN4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + static const uint32_t SignExtend[] = { 0x00000000, 0xFFFFFC00 }; + + uint32_t ElementX = pSource->v & 0x3FF; + uint32_t ElementY = (pSource->v >> 10) & 0x3FF; + uint32_t ElementZ = (pSource->v >> 20) & 0x3FF; + + XMVECTORF32 vResult = { { { + (ElementX == 0x200) ? -1.f : (static_cast(static_cast(ElementX | SignExtend[ElementX >> 9])) / 511.0f), + (ElementY == 0x200) ? -1.f : (static_cast(static_cast(ElementY | SignExtend[ElementY >> 9])) / 511.0f), + (ElementZ == 0x200) ? -1.f : (static_cast(static_cast(ElementZ | SignExtend[ElementZ >> 9])) / 511.0f), + static_cast(pSource->v >> 30) / 3.0f + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); + vInt = vandq_u32(vInt, g_XMMaskA2B10G10R10); + vInt = veorq_u32(vInt, g_XMFlipA2B10G10R10); + float32x4_t R = vcvtq_f32_s32(vreinterpretq_s32_u32(vInt)); + R = vaddq_f32(R, g_XMFixAA2B10G10R10); + R = vmulq_f32(R, g_XMNormalizeA2B10G10R10); + return vmaxq_f32(R, vdupq_n_f32(-1.0f)); +#elif defined(_XM_SSE_INTRINSICS_) + // Splat the color in all four entries + __m128 vTemp = _mm_load_ps1(reinterpret_cast(&pSource->v)); + // Shift R&0xFF0000, G&0xFF00, B&0xFF, A&0xFF000000 + vTemp = _mm_and_ps(vTemp, g_XMMaskA2B10G10R10); + // a is unsigned! Flip the bit to convert the order to signed + vTemp = _mm_xor_ps(vTemp, g_XMFlipA2B10G10R10); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // RGB + 0, A + 0x80000000.f to undo the signed order. + vTemp = _mm_add_ps(vTemp, g_XMFixAA2B10G10R10); + // Convert 0-255 to 0.0f-1.0f + vTemp = _mm_mul_ps(vTemp, g_XMNormalizeA2B10G10R10); + // Clamp result (for case of -512) + return _mm_max_ps(vTemp, g_XMNegativeOne); +#endif +} + +//------------------------------------------------------------------------------ +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +// C4996: ignore deprecation warning +#endif + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadXDec4(const XMXDEC4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + static const uint32_t SignExtend[] = { 0x00000000, 0xFFFFFC00 }; + + uint32_t ElementX = pSource->v & 0x3FF; + uint32_t ElementY = (pSource->v >> 10) & 0x3FF; + uint32_t ElementZ = (pSource->v >> 20) & 0x3FF; + + XMVECTORF32 vResult = { { { + static_cast(static_cast(ElementX | SignExtend[ElementX >> 9])), + static_cast(static_cast(ElementY | SignExtend[ElementY >> 9])), + static_cast(static_cast(ElementZ | SignExtend[ElementZ >> 9])), + static_cast(pSource->v >> 30) + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORU32 XDec4Xor = { { { 0x200, 0x200 << 10, 0x200 << 20, 0x80000000 } } }; + static const XMVECTORF32 XDec4Add = { { { -512.0f, -512.0f * 1024.0f, -512.0f * 1024.0f * 1024.0f, 32768 * 65536.0f } } }; + uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); + vInt = vandq_u32(vInt, g_XMMaskDec4); + vInt = veorq_u32(vInt, XDec4Xor); + float32x4_t R = vcvtq_f32_s32(vreinterpretq_s32_u32(vInt)); + R = vaddq_f32(R, XDec4Add); + return vmulq_f32(R, g_XMMulDec4); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORU32 XDec4Xor = { { { 0x200, 0x200 << 10, 0x200 << 20, 0x80000000 } } }; + static const XMVECTORF32 XDec4Add = { { { -512.0f, -512.0f * 1024.0f, -512.0f * 1024.0f * 1024.0f, 32768 * 65536.0f } } }; + // Splat the color in all four entries + XMVECTOR vTemp = _mm_load_ps1(reinterpret_cast(&pSource->v)); + // Shift R&0xFF0000, G&0xFF00, B&0xFF, A&0xFF000000 + vTemp = _mm_and_ps(vTemp, g_XMMaskDec4); + // a is unsigned! Flip the bit to convert the order to signed + vTemp = _mm_xor_ps(vTemp, XDec4Xor); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // RGB + 0, A + 0x80000000.f to undo the signed order. + vTemp = _mm_add_ps(vTemp, XDec4Add); + // Convert 0-255 to 0.0f-1.0f + vTemp = _mm_mul_ps(vTemp, g_XMMulDec4); + return vTemp; +#endif +} + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadUDecN4(const XMUDECN4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + + uint32_t ElementX = pSource->v & 0x3FF; + uint32_t ElementY = (pSource->v >> 10) & 0x3FF; + uint32_t ElementZ = (pSource->v >> 20) & 0x3FF; + + XMVECTORF32 vResult = { { { + static_cast(ElementX) / 1023.0f, + static_cast(ElementY) / 1023.0f, + static_cast(ElementZ) / 1023.0f, + static_cast(pSource->v >> 30) / 3.0f + } } }; + return vResult.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 UDecN4Mul = { { { 1.0f / 1023.0f, 1.0f / (1023.0f * 1024.0f), 1.0f / (1023.0f * 1024.0f * 1024.0f), 1.0f / (3.0f * 1024.0f * 1024.0f * 1024.0f) } } }; + uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); + vInt = vandq_u32(vInt, g_XMMaskDec4); + float32x4_t R = vcvtq_f32_u32(vInt); + return vmulq_f32(R, UDecN4Mul); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 UDecN4Mul = { { { 1.0f / 1023.0f, 1.0f / (1023.0f * 1024.0f), 1.0f / (1023.0f * 1024.0f * 1024.0f), 1.0f / (3.0f * 1024.0f * 1024.0f * 1024.0f) } } }; + // Splat the color in all four entries + XMVECTOR vTemp = _mm_load_ps1(reinterpret_cast(&pSource->v)); + // Shift R&0xFF0000, G&0xFF00, B&0xFF, A&0xFF000000 + vTemp = _mm_and_ps(vTemp, g_XMMaskDec4); + // a is unsigned! Flip the bit to convert the order to signed + vTemp = _mm_xor_ps(vTemp, g_XMFlipW); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // RGB + 0, A + 0x80000000.f to undo the signed order. + vTemp = _mm_add_ps(vTemp, g_XMAddUDec4); + // Convert 0-255 to 0.0f-1.0f + vTemp = _mm_mul_ps(vTemp, UDecN4Mul); + return vTemp; +#endif +} + + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadUDecN4_XR(const XMUDECN4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + + int32_t ElementX = pSource->v & 0x3FF; + int32_t ElementY = (pSource->v >> 10) & 0x3FF; + int32_t ElementZ = (pSource->v >> 20) & 0x3FF; + + XMVECTORF32 vResult = { { { + static_cast(ElementX - 0x180) / 510.0f, + static_cast(ElementY - 0x180) / 510.0f, + static_cast(ElementZ - 0x180) / 510.0f, + static_cast(pSource->v >> 30) / 3.0f + } } }; + + return vResult.v; + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 XRMul = { { { 1.0f / 510.0f, 1.0f / (510.0f * 1024.0f), 1.0f / (510.0f * 1024.0f * 1024.0f), 1.0f / (3.0f * 1024.0f * 1024.0f * 1024.0f) } } }; + static const XMVECTORI32 XRBias = { { { 0x180, 0x180 * 1024, 0x180 * 1024 * 1024, 0 } } }; + uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); + vInt = vandq_u32(vInt, g_XMMaskDec4); + int32x4_t vTemp = vsubq_s32(vreinterpretq_s32_u32(vInt), XRBias); + vTemp = veorq_s32(vTemp, g_XMFlipW); + float32x4_t R = vcvtq_f32_s32(vTemp); + R = vaddq_f32(R, g_XMAddUDec4); + return vmulq_f32(R, XRMul); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 XRMul = { { { 1.0f / 510.0f, 1.0f / (510.0f * 1024.0f), 1.0f / (510.0f * 1024.0f * 1024.0f), 1.0f / (3.0f * 1024.0f * 1024.0f * 1024.0f) } } }; + static const XMVECTORI32 XRBias = { { { 0x180, 0x180 * 1024, 0x180 * 1024 * 1024, 0 } } }; + // Splat the color in all four entries + XMVECTOR vTemp = _mm_load_ps1(reinterpret_cast(&pSource->v)); + // Mask channels + vTemp = _mm_and_ps(vTemp, g_XMMaskDec4); + // Subtract bias + vTemp = _mm_castsi128_ps(_mm_sub_epi32(_mm_castps_si128(vTemp), XRBias)); + // a is unsigned! Flip the bit to convert the order to signed + vTemp = _mm_xor_ps(vTemp, g_XMFlipW); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // RGB + 0, A + 0x80000000.f to undo the signed order. + vTemp = _mm_add_ps(vTemp, g_XMAddUDec4); + // Convert to 0.0f-1.0f + return _mm_mul_ps(vTemp, XRMul); +#endif +} + + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadUDec4(const XMUDEC4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + uint32_t ElementX = pSource->v & 0x3FF; + uint32_t ElementY = (pSource->v >> 10) & 0x3FF; + uint32_t ElementZ = (pSource->v >> 20) & 0x3FF; + + XMVECTORF32 vResult = { { { + static_cast(ElementX), + static_cast(ElementY), + static_cast(ElementZ), + static_cast(pSource->v >> 30) + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); + vInt = vandq_u32(vInt, g_XMMaskDec4); + float32x4_t R = vcvtq_f32_u32(vInt); + return vmulq_f32(R, g_XMMulDec4); +#elif defined(_XM_SSE_INTRINSICS_) + // Splat the color in all four entries + XMVECTOR vTemp = _mm_load_ps1(reinterpret_cast(&pSource->v)); + // Shift R&0xFF0000, G&0xFF00, B&0xFF, A&0xFF000000 + vTemp = _mm_and_ps(vTemp, g_XMMaskDec4); + // a is unsigned! Flip the bit to convert the order to signed + vTemp = _mm_xor_ps(vTemp, g_XMFlipW); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // RGB + 0, A + 0x80000000.f to undo the signed order. + vTemp = _mm_add_ps(vTemp, g_XMAddUDec4); + // Convert 0-255 to 0.0f-1.0f + vTemp = _mm_mul_ps(vTemp, g_XMMulDec4); + return vTemp; +#endif +} + +//------------------------------------------------------------------------------ +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +// C4996: ignore deprecation warning +#endif + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadDecN4(const XMDECN4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + static const uint32_t SignExtend[] = { 0x00000000, 0xFFFFFC00 }; + static const uint32_t SignExtendW[] = { 0x00000000, 0xFFFFFFFC }; + + uint32_t ElementX = pSource->v & 0x3FF; + uint32_t ElementY = (pSource->v >> 10) & 0x3FF; + uint32_t ElementZ = (pSource->v >> 20) & 0x3FF; + uint32_t ElementW = pSource->v >> 30; + + XMVECTORF32 vResult = { { { + (ElementX == 0x200) ? -1.f : (static_cast(static_cast(ElementX | SignExtend[ElementX >> 9])) / 511.0f), + (ElementY == 0x200) ? -1.f : (static_cast(static_cast(ElementY | SignExtend[ElementY >> 9])) / 511.0f), + (ElementZ == 0x200) ? -1.f : (static_cast(static_cast(ElementZ | SignExtend[ElementZ >> 9])) / 511.0f), + (ElementW == 0x2) ? -1.f : static_cast(static_cast(ElementW | SignExtendW[(ElementW >> 1) & 1])) + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 DecN4Mul = { { { 1.0f / 511.0f, 1.0f / (511.0f * 1024.0f), 1.0f / (511.0f * 1024.0f * 1024.0f), 1.0f / (1024.0f * 1024.0f * 1024.0f) } } }; + uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); + vInt = vandq_u32(vInt, g_XMMaskDec4); + vInt = veorq_u32(vInt, g_XMXorDec4); + float32x4_t R = vcvtq_f32_s32(vreinterpretq_s32_u32(vInt)); + R = vaddq_f32(R, g_XMAddDec4); + R = vmulq_f32(R, DecN4Mul); + return vmaxq_f32(R, vdupq_n_f32(-1.0f)); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 DecN4Mul = { { { 1.0f / 511.0f, 1.0f / (511.0f * 1024.0f), 1.0f / (511.0f * 1024.0f * 1024.0f), 1.0f / (1024.0f * 1024.0f * 1024.0f) } } }; + // Splat the color in all four entries + XMVECTOR vTemp = _mm_load_ps1(reinterpret_cast(&pSource->v)); + // Shift R&0xFF0000, G&0xFF00, B&0xFF, A&0xFF000000 + vTemp = _mm_and_ps(vTemp, g_XMMaskDec4); + // a is unsigned! Flip the bit to convert the order to signed + vTemp = _mm_xor_ps(vTemp, g_XMXorDec4); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // RGB + 0, A + 0x80000000.f to undo the signed order. + vTemp = _mm_add_ps(vTemp, g_XMAddDec4); + // Convert 0-255 to 0.0f-1.0f + vTemp = _mm_mul_ps(vTemp, DecN4Mul); + // Clamp result (for case of -512/-1) + return _mm_max_ps(vTemp, g_XMNegativeOne); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadDec4(const XMDEC4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + static const uint32_t SignExtend[] = { 0x00000000, 0xFFFFFC00 }; + static const uint32_t SignExtendW[] = { 0x00000000, 0xFFFFFFFC }; + + uint32_t ElementX = pSource->v & 0x3FF; + uint32_t ElementY = (pSource->v >> 10) & 0x3FF; + uint32_t ElementZ = (pSource->v >> 20) & 0x3FF; + uint32_t ElementW = pSource->v >> 30; + + XMVECTORF32 vResult = { { { + static_cast(static_cast(ElementX | SignExtend[ElementX >> 9])), + static_cast(static_cast(ElementY | SignExtend[ElementY >> 9])), + static_cast(static_cast(ElementZ | SignExtend[ElementZ >> 9])), + static_cast(static_cast(ElementW | SignExtendW[ElementW >> 1])) + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x4_t vInt = vld1q_dup_u32(reinterpret_cast(pSource)); + vInt = vandq_u32(vInt, g_XMMaskDec4); + vInt = veorq_u32(vInt, g_XMXorDec4); + float32x4_t R = vcvtq_f32_s32(vreinterpretq_s32_u32(vInt)); + R = vaddq_f32(R, g_XMAddDec4); + return vmulq_f32(R, g_XMMulDec4); +#elif defined(_XM_SSE_INTRINSICS_) + // Splat the color in all four entries + XMVECTOR vTemp = _mm_load_ps1(reinterpret_cast(&pSource->v)); + // Shift R&0xFF0000, G&0xFF00, B&0xFF, A&0xFF000000 + vTemp = _mm_and_ps(vTemp, g_XMMaskDec4); + // a is unsigned! Flip the bit to convert the order to signed + vTemp = _mm_xor_ps(vTemp, g_XMXorDec4); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // RGB + 0, A + 0x80000000.f to undo the signed order. + vTemp = _mm_add_ps(vTemp, g_XMAddDec4); + // Convert 0-255 to 0.0f-1.0f + vTemp = _mm_mul_ps(vTemp, g_XMMulDec4); + return vTemp; +#endif +} + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadUByteN4(const XMUBYTEN4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + static_cast(pSource->x) / 255.0f, + static_cast(pSource->y) / 255.0f, + static_cast(pSource->z) / 255.0f, + static_cast(pSource->w) / 255.0f + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vInt8 = vld1_dup_u32(reinterpret_cast(pSource)); + uint16x8_t vInt16 = vmovl_u8(vreinterpret_u8_u32(vInt8)); + uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); + float32x4_t R = vcvtq_f32_u32(vInt); + return vmulq_n_f32(R, 1.0f / 255.0f); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 LoadUByteN4Mul = { { { 1.0f / 255.0f, 1.0f / (255.0f * 256.0f), 1.0f / (255.0f * 65536.0f), 1.0f / (255.0f * 65536.0f * 256.0f) } } }; + // Splat the color in all four entries (x,z,y,w) + XMVECTOR vTemp = _mm_load1_ps(reinterpret_cast(&pSource->x)); + // Mask x&0ff,y&0xff00,z&0xff0000,w&0xff000000 + vTemp = _mm_and_ps(vTemp, g_XMMaskByte4); + // w is signed! Flip the bits to convert the order to unsigned + vTemp = _mm_xor_ps(vTemp, g_XMFlipW); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // w + 0x80 to complete the conversion + vTemp = _mm_add_ps(vTemp, g_XMAddUDec4); + // Fix y, z and w because they are too large + vTemp = _mm_mul_ps(vTemp, LoadUByteN4Mul); + return vTemp; +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadUByte4(const XMUBYTE4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + static_cast(pSource->x), + static_cast(pSource->y), + static_cast(pSource->z), + static_cast(pSource->w) + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vInt8 = vld1_dup_u32(reinterpret_cast(pSource)); + uint16x8_t vInt16 = vmovl_u8(vreinterpret_u8_u32(vInt8)); + uint32x4_t vInt = vmovl_u16(vget_low_u16(vInt16)); + return vcvtq_f32_u32(vInt); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 LoadUByte4Mul = { { { 1.0f, 1.0f / 256.0f, 1.0f / 65536.0f, 1.0f / (65536.0f * 256.0f) } } }; + // Splat the color in all four entries (x,z,y,w) + XMVECTOR vTemp = _mm_load1_ps(reinterpret_cast(&pSource->x)); + // Mask x&0ff,y&0xff00,z&0xff0000,w&0xff000000 + vTemp = _mm_and_ps(vTemp, g_XMMaskByte4); + // w is signed! Flip the bits to convert the order to unsigned + vTemp = _mm_xor_ps(vTemp, g_XMFlipW); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // w + 0x80 to complete the conversion + vTemp = _mm_add_ps(vTemp, g_XMAddUDec4); + // Fix y, z and w because they are too large + vTemp = _mm_mul_ps(vTemp, LoadUByte4Mul); + return vTemp; +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadByteN4(const XMBYTEN4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + (pSource->x == -128) ? -1.f : (static_cast(pSource->x) / 127.0f), + (pSource->y == -128) ? -1.f : (static_cast(pSource->y) / 127.0f), + (pSource->z == -128) ? -1.f : (static_cast(pSource->z) / 127.0f), + (pSource->w == -128) ? -1.f : (static_cast(pSource->w) / 127.0f) + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vInt8 = vld1_dup_u32(reinterpret_cast(pSource)); + int16x8_t vInt16 = vmovl_s8(vreinterpret_s8_u32(vInt8)); + int32x4_t vInt = vmovl_s16(vget_low_s16(vInt16)); + float32x4_t R = vcvtq_f32_s32(vInt); + R = vmulq_n_f32(R, 1.0f / 127.0f); + return vmaxq_f32(R, vdupq_n_f32(-1.f)); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 LoadByteN4Mul = { { { 1.0f / 127.0f, 1.0f / (127.0f * 256.0f), 1.0f / (127.0f * 65536.0f), 1.0f / (127.0f * 65536.0f * 256.0f) } } }; + // Splat the color in all four entries (x,z,y,w) + XMVECTOR vTemp = _mm_load1_ps(reinterpret_cast(&pSource->x)); + // Mask x&0ff,y&0xff00,z&0xff0000,w&0xff000000 + vTemp = _mm_and_ps(vTemp, g_XMMaskByte4); + // x,y and z are unsigned! Flip the bits to convert the order to signed + vTemp = _mm_xor_ps(vTemp, g_XMXorByte4); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // x, y and z - 0x80 to complete the conversion + vTemp = _mm_add_ps(vTemp, g_XMAddByte4); + // Fix y, z and w because they are too large + vTemp = _mm_mul_ps(vTemp, LoadByteN4Mul); + // Clamp result (for case of -128) + return _mm_max_ps(vTemp, g_XMNegativeOne); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadByte4(const XMBYTE4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + static_cast(pSource->x), + static_cast(pSource->y), + static_cast(pSource->z), + static_cast(pSource->w) + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + uint32x2_t vInt8 = vld1_dup_u32(reinterpret_cast(pSource)); + int16x8_t vInt16 = vmovl_s8(vreinterpret_s8_u32(vInt8)); + int32x4_t vInt = vmovl_s16(vget_low_s16(vInt16)); + return vcvtq_f32_s32(vInt); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 LoadByte4Mul = { { { 1.0f, 1.0f / 256.0f, 1.0f / 65536.0f, 1.0f / (65536.0f * 256.0f) } } }; + // Splat the color in all four entries (x,z,y,w) + XMVECTOR vTemp = _mm_load1_ps(reinterpret_cast(&pSource->x)); + // Mask x&0ff,y&0xff00,z&0xff0000,w&0xff000000 + vTemp = _mm_and_ps(vTemp, g_XMMaskByte4); + // x,y and z are unsigned! Flip the bits to convert the order to signed + vTemp = _mm_xor_ps(vTemp, g_XMXorByte4); + // Convert to floating point numbers + vTemp = _mm_cvtepi32_ps(_mm_castps_si128(vTemp)); + // x, y and z - 0x80 to complete the conversion + vTemp = _mm_add_ps(vTemp, g_XMAddByte4); + // Fix y, z and w because they are too large + vTemp = _mm_mul_ps(vTemp, LoadByte4Mul); + return vTemp; +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadUNibble4(const XMUNIBBLE4* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + float(pSource->v & 0xF), + float((pSource->v >> 4) & 0xF), + float((pSource->v >> 8) & 0xF), + float((pSource->v >> 12) & 0xF) + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORI32 UNibble4And = { { { 0xF, 0xF0, 0xF00, 0xF000 } } }; + static const XMVECTORF32 UNibble4Mul = { { { 1.0f, 1.0f / 16.f, 1.0f / 256.f, 1.0f / 4096.f } } }; + uint16x4_t vInt16 = vld1_dup_u16(reinterpret_cast(pSource)); + uint32x4_t vInt = vmovl_u16(vInt16); + vInt = vandq_u32(vInt, UNibble4And); + float32x4_t R = vcvtq_f32_u32(vInt); + return vmulq_f32(R, UNibble4Mul); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORI32 UNibble4And = { { { 0xF, 0xF0, 0xF00, 0xF000 } } }; + static const XMVECTORF32 UNibble4Mul = { { { 1.0f, 1.0f / 16.f, 1.0f / 256.f, 1.0f / 4096.f } } }; + // Get the 16 bit value and splat it + __m128i vInt = XM_LOADU_SI16(&pSource->v); + XMVECTOR vResult = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); + // Mask off x, y and z + vResult = _mm_and_ps(vResult, UNibble4And); + // Convert to float + vResult = _mm_cvtepi32_ps(_mm_castps_si128(vResult)); + // Normalize x, y, and z + vResult = _mm_mul_ps(vResult, UNibble4Mul); + return vResult; +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMVECTOR XM_CALLCONV XMLoadU555(const XMU555* pSource) noexcept +{ + assert(pSource); +#if defined(_XM_NO_INTRINSICS_) + XMVECTORF32 vResult = { { { + float(pSource->v & 0x1F), + float((pSource->v >> 5) & 0x1F), + float((pSource->v >> 10) & 0x1F), + float((pSource->v >> 15) & 0x1) + } } }; + return vResult.v; +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORI32 U555And = { { { 0x1F, 0x1F << 5, 0x1F << 10, 0x8000 } } }; + static const XMVECTORF32 U555Mul = { { { 1.0f, 1.0f / 32.f, 1.0f / 1024.f, 1.0f / 32768.f } } }; + uint16x4_t vInt16 = vld1_dup_u16(reinterpret_cast(pSource)); + uint32x4_t vInt = vmovl_u16(vInt16); + vInt = vandq_u32(vInt, U555And); + float32x4_t R = vcvtq_f32_u32(vInt); + return vmulq_f32(R, U555Mul); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORI32 U555And = { { { 0x1F, 0x1F << 5, 0x1F << 10, 0x8000 } } }; + static const XMVECTORF32 U555Mul = { { { 1.0f, 1.0f / 32.f, 1.0f / 1024.f, 1.0f / 32768.f } } }; + // Get the 16bit value and splat it + __m128i vInt = XM_LOADU_SI16(&pSource->v); + XMVECTOR vResult = XM_PERMUTE_PS(_mm_castsi128_ps(vInt), _MM_SHUFFLE(0, 0, 0, 0)); + // Mask off x, y and z + vResult = _mm_and_ps(vResult, U555And); + // Convert to float + vResult = _mm_cvtepi32_ps(_mm_castps_si128(vResult)); + // Normalize x, y, and z + vResult = _mm_mul_ps(vResult, U555Mul); + return vResult; +#endif +} + +#ifdef _PREFAST_ +#pragma prefast(pop) +#endif + +/**************************************************************************** + * + * Vector and matrix store operations + * + ****************************************************************************/ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreColor +( + XMCOLOR* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorSaturate(V); + N = XMVectorMultiply(N, g_UByteMax); + N = XMVectorRound(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->c = (static_cast(tmp.w) << 24) | + (static_cast(tmp.x) << 16) | + (static_cast(tmp.y) << 8) | + static_cast(tmp.z); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0)); + R = vminq_f32(R, vdupq_n_f32(1.0f)); + R = vmulq_n_f32(R, 255.0f); + R = XMVectorRound(R); + uint32x4_t vInt32 = vcvtq_u32_f32(R); + uint16x4_t vInt16 = vqmovn_u32(vInt32); + uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); + uint32_t rgba = vget_lane_u32(vreinterpret_u32_u8(vInt8), 0); + pDestination->c = (rgba & 0xFF00FF00) | ((rgba >> 16) & 0xFF) | ((rgba << 16) & 0xFF0000); +#elif defined(_XM_SSE_INTRINSICS_) + // Set <0 to 0 + XMVECTOR vResult = _mm_max_ps(V, g_XMZero); + // Set>1 to 1 + vResult = _mm_min_ps(vResult, g_XMOne); + // Convert to 0-255 + vResult = _mm_mul_ps(vResult, g_UByteMax); + // Shuffle RGBA to ARGB + vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(3, 0, 1, 2)); + // Convert to int + __m128i vInt = _mm_cvtps_epi32(vResult); + // Mash to shorts + vInt = _mm_packs_epi32(vInt, vInt); + // Mash to bytes + vInt = _mm_packus_epi16(vInt, vInt); + // Store the color + _mm_store_ss(reinterpret_cast(&pDestination->c), _mm_castsi128_ps(vInt)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreHalf2 +( + XMHALF2* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + __m128i V1 = _mm_cvtps_ph(V, _MM_FROUND_TO_NEAREST_INT); + _mm_store_ss(reinterpret_cast(pDestination), _mm_castsi128_ps(V1)); +#else + pDestination->x = XMConvertFloatToHalf(XMVectorGetX(V)); + pDestination->y = XMConvertFloatToHalf(XMVectorGetY(V)); +#endif // !_XM_F16C_INTRINSICS_ +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreShortN2 +( + XMSHORTN2* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorClamp(V, g_XMNegativeOne.v, g_XMOne.v); + N = XMVectorMultiply(N, g_ShortMax); + N = XMVectorRound(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->x = static_cast(tmp.x); + pDestination->y = static_cast(tmp.y); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-1.f)); + R = vminq_f32(R, vdupq_n_f32(1.0f)); + R = vmulq_n_f32(R, 32767.0f); + int32x4_t vInt32 = vcvtq_s32_f32(R); + int16x4_t vInt16 = vqmovn_s32(vInt32); + vst1_lane_u32(&pDestination->v, vreinterpret_u32_s16(vInt16), 0); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = _mm_max_ps(V, g_XMNegativeOne); + vResult = _mm_min_ps(vResult, g_XMOne); + vResult = _mm_mul_ps(vResult, g_ShortMax); + __m128i vResulti = _mm_cvtps_epi32(vResult); + vResulti = _mm_packs_epi32(vResulti, vResulti); + _mm_store_ss(reinterpret_cast(&pDestination->x), _mm_castsi128_ps(vResulti)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreShort2 +( + XMSHORT2* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorClamp(V, g_ShortMin, g_ShortMax); + N = XMVectorRound(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->x = static_cast(tmp.x); + pDestination->y = static_cast(tmp.y); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-32767.f)); + R = vminq_f32(R, vdupq_n_f32(32767.0f)); + int32x4_t vInt32 = vcvtq_s32_f32(R); + int16x4_t vInt16 = vqmovn_s32(vInt32); + vst1_lane_u32(&pDestination->v, vreinterpret_u32_s16(vInt16), 0); +#elif defined(_XM_SSE_INTRINSICS_) + // Bounds check + XMVECTOR vResult = _mm_max_ps(V, g_ShortMin); + vResult = _mm_min_ps(vResult, g_ShortMax); + // Convert to int with rounding + __m128i vInt = _mm_cvtps_epi32(vResult); + // Pack the ints into shorts + vInt = _mm_packs_epi32(vInt, vInt); + _mm_store_ss(reinterpret_cast(&pDestination->x), _mm_castsi128_ps(vInt)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreUShortN2 +( + XMUSHORTN2* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorSaturate(V); + N = XMVectorMultiplyAdd(N, g_UShortMax, g_XMOneHalf.v); + N = XMVectorTruncate(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->x = static_cast(tmp.x); + pDestination->y = static_cast(tmp.y); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0.f)); + R = vminq_f32(R, vdupq_n_f32(1.0f)); + R = vmulq_n_f32(R, 65535.0f); + R = vaddq_f32(R, g_XMOneHalf); + uint32x4_t vInt32 = vcvtq_u32_f32(R); + uint16x4_t vInt16 = vqmovn_u32(vInt32); + vst1_lane_u32(&pDestination->v, vreinterpret_u32_u16(vInt16), 0); +#elif defined(_XM_SSE_INTRINSICS_) + // Bounds check + XMVECTOR vResult = _mm_max_ps(V, g_XMZero); + vResult = _mm_min_ps(vResult, g_XMOne); + vResult = _mm_mul_ps(vResult, g_UShortMax); + vResult = _mm_add_ps(vResult, g_XMOneHalf); + // Convert to int + __m128i vInt = _mm_cvttps_epi32(vResult); + // Since the SSE pack instruction clamps using signed rules, + // manually extract the values to store them to memory + pDestination->x = static_cast(_mm_extract_epi16(vInt, 0)); + pDestination->y = static_cast(_mm_extract_epi16(vInt, 2)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreUShort2 +( + XMUSHORT2* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorClamp(V, XMVectorZero(), g_UShortMax); + N = XMVectorRound(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->x = static_cast(tmp.x); + pDestination->y = static_cast(tmp.y); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0.f)); + R = vminq_f32(R, vdupq_n_f32(65535.0f)); + uint32x4_t vInt32 = vcvtq_u32_f32(R); + uint16x4_t vInt16 = vqmovn_u32(vInt32); + vst1_lane_u32(&pDestination->v, vreinterpret_u32_u16(vInt16), 0); +#elif defined(_XM_SSE_INTRINSICS_) + // Bounds check + XMVECTOR vResult = _mm_max_ps(V, g_XMZero); + vResult = _mm_min_ps(vResult, g_UShortMax); + // Convert to int with rounding + __m128i vInt = _mm_cvtps_epi32(vResult); + // Since the SSE pack instruction clamps using signed rules, + // manually extract the values to store them to memory + pDestination->x = static_cast(_mm_extract_epi16(vInt, 0)); + pDestination->y = static_cast(_mm_extract_epi16(vInt, 2)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreByteN2 +( + XMBYTEN2* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorClamp(V, g_XMNegativeOne.v, g_XMOne.v); + N = XMVectorMultiply(N, g_ByteMax); + N = XMVectorRound(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->x = static_cast(tmp.x); + pDestination->y = static_cast(tmp.y); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-1.f)); + R = vminq_f32(R, vdupq_n_f32(1.0f)); + R = vmulq_n_f32(R, 127.0f); + int32x4_t vInt32 = vcvtq_s32_f32(R); + int16x4_t vInt16 = vqmovn_s32(vInt32); + int8x8_t vInt8 = vqmovn_s16(vcombine_s16(vInt16, vInt16)); + vst1_lane_u16(reinterpret_cast(pDestination), vreinterpret_u16_s8(vInt8), 0); +#elif defined(_XM_SSE_INTRINSICS_) + // Clamp to bounds + XMVECTOR vResult = _mm_max_ps(V, g_XMNegativeOne); + vResult = _mm_min_ps(vResult, g_XMOne); + // Scale by multiplication + vResult = _mm_mul_ps(vResult, g_ByteMax); + // Convert to int by rounding + __m128i vInt = _mm_cvtps_epi32(vResult); + // No SSE operations will write to 16-bit values, so we have to extract them manually + auto x = static_cast(_mm_extract_epi16(vInt, 0)); + auto y = static_cast(_mm_extract_epi16(vInt, 2)); + pDestination->v = static_cast(((static_cast(y) & 0xFF) << 8) | (static_cast(x) & 0xFF)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreByte2 +( + XMBYTE2* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorClamp(V, g_ByteMin, g_ByteMax); + N = XMVectorRound(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->x = static_cast(tmp.x); + pDestination->y = static_cast(tmp.y); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-127.f)); + R = vminq_f32(R, vdupq_n_f32(127.0f)); + int32x4_t vInt32 = vcvtq_s32_f32(R); + int16x4_t vInt16 = vqmovn_s32(vInt32); + int8x8_t vInt8 = vqmovn_s16(vcombine_s16(vInt16, vInt16)); + vst1_lane_u16(reinterpret_cast(pDestination), vreinterpret_u16_s8(vInt8), 0); +#elif defined(_XM_SSE_INTRINSICS_) + // Clamp to bounds + XMVECTOR vResult = _mm_max_ps(V, g_ByteMin); + vResult = _mm_min_ps(vResult, g_ByteMax); + // Convert to int by rounding + __m128i vInt = _mm_cvtps_epi32(vResult); + // No SSE operations will write to 16-bit values, so we have to extract them manually + auto x = static_cast(_mm_extract_epi16(vInt, 0)); + auto y = static_cast(_mm_extract_epi16(vInt, 2)); + pDestination->v = static_cast(((static_cast(y) & 0xFF) << 8) | (static_cast(x) & 0xFF)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreUByteN2 +( + XMUBYTEN2* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorSaturate(V); + N = XMVectorMultiplyAdd(N, g_UByteMax, g_XMOneHalf.v); + N = XMVectorTruncate(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->x = static_cast(tmp.x); + pDestination->y = static_cast(tmp.y); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0.f)); + R = vminq_f32(R, vdupq_n_f32(1.0f)); + R = vmulq_n_f32(R, 255.0f); + R = vaddq_f32(R, g_XMOneHalf); + uint32x4_t vInt32 = vcvtq_u32_f32(R); + uint16x4_t vInt16 = vqmovn_u32(vInt32); + uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); + vst1_lane_u16(reinterpret_cast(pDestination), vreinterpret_u16_u8(vInt8), 0); +#elif defined(_XM_SSE_INTRINSICS_) + // Clamp to bounds + XMVECTOR vResult = _mm_max_ps(V, g_XMZero); + vResult = _mm_min_ps(vResult, g_XMOne); + // Scale by multiplication + vResult = _mm_mul_ps(vResult, g_UByteMax); + vResult = _mm_add_ps(vResult, g_XMOneHalf); + // Convert to int + __m128i vInt = _mm_cvttps_epi32(vResult); + // No SSE operations will write to 16-bit values, so we have to extract them manually + auto x = static_cast(_mm_extract_epi16(vInt, 0)); + auto y = static_cast(_mm_extract_epi16(vInt, 2)); + pDestination->v = static_cast(((static_cast(y) & 0xFF) << 8) | (static_cast(x) & 0xFF)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreUByte2 +( + XMUBYTE2* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorClamp(V, XMVectorZero(), g_UByteMax); + N = XMVectorRound(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->x = static_cast(tmp.x); + pDestination->y = static_cast(tmp.y); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0.f)); + R = vminq_f32(R, vdupq_n_f32(255.0f)); + uint32x4_t vInt32 = vcvtq_u32_f32(R); + uint16x4_t vInt16 = vqmovn_u32(vInt32); + uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); + vst1_lane_u16(reinterpret_cast(pDestination), vreinterpret_u16_u8(vInt8), 0); +#elif defined(_XM_SSE_INTRINSICS_) + // Clamp to bounds + XMVECTOR vResult = _mm_max_ps(V, g_XMZero); + vResult = _mm_min_ps(vResult, g_UByteMax); + // Convert to int by rounding + __m128i vInt = _mm_cvtps_epi32(vResult); + // No SSE operations will write to 16-bit values, so we have to extract them manually + auto x = static_cast(_mm_extract_epi16(vInt, 0)); + auto y = static_cast(_mm_extract_epi16(vInt, 2)); + pDestination->v = static_cast(((static_cast(y) & 0xFF) << 8) | (static_cast(x) & 0xFF)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreU565 +( + XMU565* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); + static const XMVECTORF32 Max = { { { 31.0f, 63.0f, 31.0f, 0.0f } } }; + +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR N = XMVectorClamp(V, XMVectorZero(), Max.v); + N = XMVectorRound(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->v = static_cast( + ((static_cast(tmp.z) & 0x1F) << 11) + | ((static_cast(tmp.y) & 0x3F) << 5) + | ((static_cast(tmp.x) & 0x1F))); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 Scale = { { { 1.0f, 32.f, 32.f * 64.f, 0.f } } }; + static const XMVECTORU32 Mask = { { { 0x1F, 0x3F << 5, 0x1F << 11, 0 } } }; + float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); + vResult = vminq_f32(vResult, Max); + vResult = vmulq_f32(vResult, Scale); + uint32x4_t vResulti = vcvtq_u32_f32(vResult); + vResulti = vandq_u32(vResulti, Mask); + // Do a horizontal or of 4 entries + uint32x2_t vTemp = vget_low_u32(vResulti); + uint32x2_t vhi = vget_high_u32(vResulti); + vTemp = vorr_u32(vTemp, vhi); + vTemp = vpadd_u32(vTemp, vTemp); + vst1_lane_u16(&pDestination->v, vreinterpret_u16_u32(vTemp), 0); +#elif defined(_XM_SSE_INTRINSICS_) + // Bounds check + XMVECTOR vResult = _mm_max_ps(V, g_XMZero); + vResult = _mm_min_ps(vResult, Max); + // Convert to int with rounding + __m128i vInt = _mm_cvtps_epi32(vResult); + // No SSE operations will write to 16-bit values, so we have to extract them manually + auto x = static_cast(_mm_extract_epi16(vInt, 0)); + auto y = static_cast(_mm_extract_epi16(vInt, 2)); + auto z = static_cast(_mm_extract_epi16(vInt, 4)); + pDestination->v = static_cast( + ((static_cast(z) & 0x1F) << 11) + | ((static_cast(y) & 0x3F) << 5) + | ((static_cast(x) & 0x1F))); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreFloat3PK +( + XMFLOAT3PK* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); + + XM_ALIGNED_DATA(16) uint32_t IValue[4]; + XMStoreFloat3A(reinterpret_cast(&IValue), V); + + uint32_t Result[3]; + + // X & Y Channels (5-bit exponent, 6-bit mantissa) + for (uint32_t j = 0; j < 2; ++j) + { + uint32_t Sign = IValue[j] & 0x80000000; + uint32_t I = IValue[j] & 0x7FFFFFFF; + + if ((I & 0x7F800000) == 0x7F800000) + { + // INF or NAN + Result[j] = 0x7C0U; + if ((I & 0x7FFFFF) != 0) + { + Result[j] = 0x7FFU; + } + else if (Sign) + { + // -INF is clamped to 0 since 3PK is positive only + Result[j] = 0; + } + } + else if (Sign || I < 0x35800000) + { + // 3PK is positive only, so clamp to zero + Result[j] = 0; + } + else if (I > 0x477E0000U) + { + // The number is too large to be represented as a float11, set to max + Result[j] = 0x7BFU; + } + else + { + if (I < 0x38800000U) + { + // The number is too small to be represented as a normalized float11 + // Convert it to a denormalized value. + uint32_t Shift = 113U - (I >> 23U); + I = (0x800000U | (I & 0x7FFFFFU)) >> Shift; + } + else + { + // Rebias the exponent to represent the value as a normalized float11 + I += 0xC8000000U; + } + + Result[j] = ((I + 0xFFFFU + ((I >> 17U) & 1U)) >> 17U) & 0x7ffU; + } + } + + // Z Channel (5-bit exponent, 5-bit mantissa) + uint32_t Sign = IValue[2] & 0x80000000; + uint32_t I = IValue[2] & 0x7FFFFFFF; + + if ((I & 0x7F800000) == 0x7F800000) + { + // INF or NAN + Result[2] = 0x3E0U; + if (I & 0x7FFFFF) + { + Result[2] = 0x3FFU; + } + else if (Sign || I < 0x36000000) + { + // -INF is clamped to 0 since 3PK is positive only + Result[2] = 0; + } + } + else if (Sign) + { + // 3PK is positive only, so clamp to zero + Result[2] = 0; + } + else if (I > 0x477C0000U) + { + // The number is too large to be represented as a float10, set to max + Result[2] = 0x3DFU; + } + else + { + if (I < 0x38800000U) + { + // The number is too small to be represented as a normalized float10 + // Convert it to a denormalized value. + uint32_t Shift = 113U - (I >> 23U); + I = (0x800000U | (I & 0x7FFFFFU)) >> Shift; + } + else + { + // Rebias the exponent to represent the value as a normalized float10 + I += 0xC8000000U; + } + + Result[2] = ((I + 0x1FFFFU + ((I >> 18U) & 1U)) >> 18U) & 0x3ffU; + } + + // Pack Result into memory + pDestination->v = (Result[0] & 0x7ff) + | ((Result[1] & 0x7ff) << 11) + | ((Result[2] & 0x3ff) << 22); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreFloat3SE +( + XMFLOAT3SE* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); + + XMFLOAT3A tmp; + XMStoreFloat3A(&tmp, V); + + static constexpr float maxf9 = float(0x1FF << 7); + static constexpr float minf9 = float(1.f / (1 << 16)); + + float x = (tmp.x >= 0.f) ? ((tmp.x > maxf9) ? maxf9 : tmp.x) : 0.f; + float y = (tmp.y >= 0.f) ? ((tmp.y > maxf9) ? maxf9 : tmp.y) : 0.f; + float z = (tmp.z >= 0.f) ? ((tmp.z > maxf9) ? maxf9 : tmp.z) : 0.f; + + const float max_xy = (x > y) ? x : y; + const float max_xyz = (max_xy > z) ? max_xy : z; + + const float maxColor = (max_xyz > minf9) ? max_xyz : minf9; + + union { float f; int32_t i; } fi; + fi.f = maxColor; + fi.i += 0x00004000; // round up leaving 9 bits in fraction (including assumed 1) + + auto exp = static_cast(fi.i) >> 23; + pDestination->e = exp - 0x6f; + + fi.i = static_cast(0x83000000 - (exp << 23)); + float ScaleR = fi.f; + + pDestination->xm = static_cast(MathInternal::round_to_nearest(x * ScaleR)); + pDestination->ym = static_cast(MathInternal::round_to_nearest(y * ScaleR)); + pDestination->zm = static_cast(MathInternal::round_to_nearest(z * ScaleR)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreHalf4 +( + XMHALF4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_F16C_INTRINSICS_) && !defined(_XM_NO_INTRINSICS_) + __m128i V1 = _mm_cvtps_ph(V, _MM_FROUND_TO_NEAREST_INT); + _mm_storel_epi64(reinterpret_cast<__m128i*>(pDestination), V1); +#else + XMFLOAT4A t; + XMStoreFloat4A(&t, V); + + pDestination->x = XMConvertFloatToHalf(t.x); + pDestination->y = XMConvertFloatToHalf(t.y); + pDestination->z = XMConvertFloatToHalf(t.z); + pDestination->w = XMConvertFloatToHalf(t.w); +#endif // !_XM_F16C_INTRINSICS_ +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreShortN4 +( + XMSHORTN4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorClamp(V, g_XMNegativeOne.v, g_XMOne.v); + N = XMVectorMultiply(N, g_ShortMax); + N = XMVectorRound(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->x = static_cast(tmp.x); + pDestination->y = static_cast(tmp.y); + pDestination->z = static_cast(tmp.z); + pDestination->w = static_cast(tmp.w); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(-1.f)); + vResult = vminq_f32(vResult, vdupq_n_f32(1.0f)); + vResult = vmulq_n_f32(vResult, 32767.0f); + int16x4_t vInt = vmovn_s32(vcvtq_s32_f32(vResult)); + vst1_s16(reinterpret_cast(pDestination), vInt); +#elif defined(_XM_SSE_INTRINSICS_) + XMVECTOR vResult = _mm_max_ps(V, g_XMNegativeOne); + vResult = _mm_min_ps(vResult, g_XMOne); + vResult = _mm_mul_ps(vResult, g_ShortMax); + __m128i vResulti = _mm_cvtps_epi32(vResult); + vResulti = _mm_packs_epi32(vResulti, vResulti); + _mm_store_sd(reinterpret_cast(&pDestination->x), _mm_castsi128_pd(vResulti)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreShort4 +( + XMSHORT4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorClamp(V, g_ShortMin, g_ShortMax); + N = XMVectorRound(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->x = static_cast(tmp.x); + pDestination->y = static_cast(tmp.y); + pDestination->z = static_cast(tmp.z); + pDestination->w = static_cast(tmp.w); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t vResult = vmaxq_f32(V, g_ShortMin); + vResult = vminq_f32(vResult, g_ShortMax); + int16x4_t vInt = vmovn_s32(vcvtq_s32_f32(vResult)); + vst1_s16(reinterpret_cast(pDestination), vInt); +#elif defined(_XM_SSE_INTRINSICS_) + // Bounds check + XMVECTOR vResult = _mm_max_ps(V, g_ShortMin); + vResult = _mm_min_ps(vResult, g_ShortMax); + // Convert to int with rounding + __m128i vInt = _mm_cvtps_epi32(vResult); + // Pack the ints into shorts + vInt = _mm_packs_epi32(vInt, vInt); + _mm_store_sd(reinterpret_cast(&pDestination->x), _mm_castsi128_pd(vInt)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreUShortN4 +( + XMUSHORTN4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorSaturate(V); + N = XMVectorMultiplyAdd(N, g_UShortMax, g_XMOneHalf.v); + N = XMVectorTruncate(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->x = static_cast(tmp.x); + pDestination->y = static_cast(tmp.y); + pDestination->z = static_cast(tmp.z); + pDestination->w = static_cast(tmp.w); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); + vResult = vminq_f32(vResult, vdupq_n_f32(1.0f)); + vResult = vmulq_n_f32(vResult, 65535.0f); + vResult = vaddq_f32(vResult, g_XMOneHalf); + uint16x4_t vInt = vmovn_u32(vcvtq_u32_f32(vResult)); + vst1_u16(reinterpret_cast(pDestination), vInt); +#elif defined(_XM_SSE_INTRINSICS_) + // Bounds check + XMVECTOR vResult = _mm_max_ps(V, g_XMZero); + vResult = _mm_min_ps(vResult, g_XMOne); + vResult = _mm_mul_ps(vResult, g_UShortMax); + vResult = _mm_add_ps(vResult, g_XMOneHalf); + // Convert to int + __m128i vInt = _mm_cvttps_epi32(vResult); + // Since the SSE pack instruction clamps using signed rules, + // manually extract the values to store them to memory + pDestination->x = static_cast(_mm_extract_epi16(vInt, 0)); + pDestination->y = static_cast(_mm_extract_epi16(vInt, 2)); + pDestination->z = static_cast(_mm_extract_epi16(vInt, 4)); + pDestination->w = static_cast(_mm_extract_epi16(vInt, 6)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreUShort4 +( + XMUSHORT4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorClamp(V, XMVectorZero(), g_UShortMax); + N = XMVectorRound(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->x = static_cast(tmp.x); + pDestination->y = static_cast(tmp.y); + pDestination->z = static_cast(tmp.z); + pDestination->w = static_cast(tmp.w); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); + vResult = vminq_f32(vResult, g_UShortMax); + uint16x4_t vInt = vmovn_u32(vcvtq_u32_f32(vResult)); + vst1_u16(reinterpret_cast(pDestination), vInt); +#elif defined(_XM_SSE_INTRINSICS_) + // Bounds check + XMVECTOR vResult = _mm_max_ps(V, g_XMZero); + vResult = _mm_min_ps(vResult, g_UShortMax); + // Convert to int with rounding + __m128i vInt = _mm_cvtps_epi32(vResult); + // Since the SSE pack instruction clamps using signed rules, + // manually extract the values to store them to memory + pDestination->x = static_cast(_mm_extract_epi16(vInt, 0)); + pDestination->y = static_cast(_mm_extract_epi16(vInt, 2)); + pDestination->z = static_cast(_mm_extract_epi16(vInt, 4)); + pDestination->w = static_cast(_mm_extract_epi16(vInt, 6)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreXDecN4 +( + XMXDECN4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); + static const XMVECTORF32 Min = { { { -1.0f, -1.0f, -1.0f, 0.0f } } }; + +#if defined(_XM_NO_INTRINSICS_) + + static const XMVECTORF32 Scale = { { { 511.0f, 511.0f, 511.0f, 3.0f } } }; + + XMVECTOR N = XMVectorClamp(V, Min.v, g_XMOne.v); + N = XMVectorMultiply(N, Scale.v); + N = XMVectorRound(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->v = static_cast( + (static_cast(tmp.w) << 30) + | ((static_cast(tmp.z) & 0x3FF) << 20) + | ((static_cast(tmp.y) & 0x3FF) << 10) + | (static_cast(tmp.x) & 0x3FF)); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 Scale = { { { 511.0f, 511.0f * 1024.0f, 511.0f * 1048576.0f, 3.0f * 536870912.0f } } }; + static const XMVECTORI32 ScaleMask = { { { 0x3FF, 0x3FF << 10, 0x3FF << 20, 0x3 << 29 } } }; + float32x4_t vResult = vmaxq_f32(V, Min); + vResult = vminq_f32(vResult, vdupq_n_f32(1.0f)); + vResult = vmulq_f32(vResult, Scale); + int32x4_t vResulti = vcvtq_s32_f32(vResult); + vResulti = vandq_s32(vResulti, ScaleMask); + int32x4_t vResultw = vandq_s32(vResulti, g_XMMaskW); + vResulti = vaddq_s32(vResulti, vResultw); + // Do a horizontal or of all 4 entries + uint32x2_t vTemp = vget_low_u32(vreinterpretq_u32_s32(vResulti)); + uint32x2_t vhi = vget_high_u32(vreinterpretq_u32_s32(vResulti)); + vTemp = vorr_u32(vTemp, vhi); + vTemp = vpadd_u32(vTemp, vTemp); + vst1_lane_u32(&pDestination->v, vTemp, 0); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 Scale = { { { 511.0f, 511.0f * 1024.0f, 511.0f * 1048576.0f, 3.0f * 536870912.0f } } }; + static const XMVECTORI32 ScaleMask = { { { 0x3FF, 0x3FF << 10, 0x3FF << 20, 0x3 << 29 } } }; + XMVECTOR vResult = _mm_max_ps(V, Min); + vResult = _mm_min_ps(vResult, g_XMOne); + // Scale by multiplication + vResult = _mm_mul_ps(vResult, Scale); + // Convert to int (W is unsigned) + __m128i vResulti = _mm_cvtps_epi32(vResult); + // Mask off any fraction + vResulti = _mm_and_si128(vResulti, ScaleMask); + // To fix W, add itself to shift it up to <<30 instead of <<29 + __m128i vResultw = _mm_and_si128(vResulti, g_XMMaskW); + vResulti = _mm_add_epi32(vResulti, vResultw); + // Do a horizontal or of all 4 entries + vResult = XM_PERMUTE_PS(_mm_castsi128_ps(vResulti), _MM_SHUFFLE(0, 3, 2, 1)); + vResulti = _mm_or_si128(vResulti, _mm_castps_si128(vResult)); + vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(0, 3, 2, 1)); + vResulti = _mm_or_si128(vResulti, _mm_castps_si128(vResult)); + vResult = XM_PERMUTE_PS(vResult, _MM_SHUFFLE(0, 3, 2, 1)); + vResulti = _mm_or_si128(vResulti, _mm_castps_si128(vResult)); + _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); +#endif +} + +//------------------------------------------------------------------------------ +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +// C4996: ignore deprecation warning +#endif + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreXDec4 +( + XMXDEC4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); + static const XMVECTORF32 MinXDec4 = { { { -511.0f, -511.0f, -511.0f, 0.0f } } }; + static const XMVECTORF32 MaxXDec4 = { { { 511.0f, 511.0f, 511.0f, 3.0f } } }; + +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorClamp(V, MinXDec4, MaxXDec4); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->v = static_cast( + (static_cast(tmp.w) << 30) + | ((static_cast(tmp.z) & 0x3FF) << 20) + | ((static_cast(tmp.y) & 0x3FF) << 10) + | ((static_cast(tmp.x) & 0x3FF))); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 ScaleXDec4 = { { { 1.0f, 1024.0f / 2.0f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f / 2.0f } } }; + static const XMVECTORI32 MaskXDec4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; + float32x4_t vResult = vmaxq_f32(V, MinXDec4); + vResult = vminq_f32(vResult, MaxXDec4); + vResult = vmulq_f32(vResult, ScaleXDec4); + int32x4_t vResulti = vcvtq_s32_f32(vResult); + vResulti = vandq_s32(vResulti, MaskXDec4); + // Do a horizontal or of 4 entries + uint32x2_t vTemp = vget_low_u32(vreinterpretq_u32_s32(vResulti)); + uint32x2_t vTemp2 = vget_high_u32(vreinterpretq_u32_s32(vResulti)); + vTemp = vorr_u32(vTemp, vTemp2); + // Perform a single bit left shift on y|w + vTemp2 = vdup_lane_u32(vTemp, 1); + vTemp2 = vadd_u32(vTemp2, vTemp2); + vTemp = vorr_u32(vTemp, vTemp2); + vst1_lane_u32(&pDestination->v, vTemp, 0); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 ScaleXDec4 = { { { 1.0f, 1024.0f / 2.0f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f / 2.0f } } }; + static const XMVECTORI32 MaskXDec4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; + // Clamp to bounds + XMVECTOR vResult = _mm_max_ps(V, MinXDec4); + vResult = _mm_min_ps(vResult, MaxXDec4); + // Scale by multiplication + vResult = _mm_mul_ps(vResult, ScaleXDec4); + // Convert to int + __m128i vResulti = _mm_cvttps_epi32(vResult); + // Mask off any fraction + vResulti = _mm_and_si128(vResulti, MaskXDec4); + // Do a horizontal or of 4 entries + __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); + // x = x|z, y = y|w + vResulti = _mm_or_si128(vResulti, vResulti2); + // Move Z to the x position + vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); + // Perform a single bit left shift on y|w + vResulti2 = _mm_add_epi32(vResulti2, vResulti2); + // i = x|y|z|w + vResulti = _mm_or_si128(vResulti, vResulti2); + _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); +#endif +} + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreUDecN4 +( + XMUDECN4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + static const XMVECTORF32 Scale = { { { 1023.0f, 1023.0f, 1023.0f, 3.0f } } }; + + XMVECTOR N = XMVectorSaturate(V); + N = XMVectorMultiply(N, Scale.v); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->v = static_cast( + (static_cast(tmp.w) << 30) + | ((static_cast(tmp.z) & 0x3FF) << 20) + | ((static_cast(tmp.y) & 0x3FF) << 10) + | ((static_cast(tmp.x) & 0x3FF))); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 ScaleUDecN4 = { { { 1023.0f, 1023.0f * 1024.0f * 0.5f, 1023.0f * 1024.0f * 1024.0f, 3.0f * 1024.0f * 1024.0f * 1024.0f * 0.5f } } }; + static const XMVECTORI32 MaskUDecN4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; + float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0.f)); + vResult = vminq_f32(vResult, vdupq_n_f32(1.f)); + vResult = vmulq_f32(vResult, ScaleUDecN4); + uint32x4_t vResulti = vcvtq_u32_f32(vResult); + vResulti = vandq_u32(vResulti, MaskUDecN4); + // Do a horizontal or of 4 entries + uint32x2_t vTemp = vget_low_u32(vResulti); + uint32x2_t vTemp2 = vget_high_u32(vResulti); + vTemp = vorr_u32(vTemp, vTemp2); + // Perform a single bit left shift on y|w + vTemp2 = vdup_lane_u32(vTemp, 1); + vTemp2 = vadd_u32(vTemp2, vTemp2); + vTemp = vorr_u32(vTemp, vTemp2); + vst1_lane_u32(&pDestination->v, vTemp, 0); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 ScaleUDecN4 = { { { 1023.0f, 1023.0f * 1024.0f * 0.5f, 1023.0f * 1024.0f * 1024.0f, 3.0f * 1024.0f * 1024.0f * 1024.0f * 0.5f } } }; + static const XMVECTORI32 MaskUDecN4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; + // Clamp to bounds + XMVECTOR vResult = _mm_max_ps(V, g_XMZero); + vResult = _mm_min_ps(vResult, g_XMOne); + // Scale by multiplication + vResult = _mm_mul_ps(vResult, ScaleUDecN4); + // Convert to int + __m128i vResulti = _mm_cvttps_epi32(vResult); + // Mask off any fraction + vResulti = _mm_and_si128(vResulti, MaskUDecN4); + // Do a horizontal or of 4 entries + __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); + // x = x|z, y = y|w + vResulti = _mm_or_si128(vResulti, vResulti2); + // Move Z to the x position + vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); + // Perform a left shift by one bit on y|w + vResulti2 = _mm_add_epi32(vResulti2, vResulti2); + // i = x|y|z|w + vResulti = _mm_or_si128(vResulti, vResulti2); + _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreUDecN4_XR +( + XMUDECN4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); + static const XMVECTORF32 Scale = { { { 510.0f, 510.0f, 510.0f, 3.0f } } }; + static const XMVECTORF32 Bias = { { { 384.0f, 384.0f, 384.0f, 0.0f } } }; + static const XMVECTORF32 C = { { { 1023.f, 1023.f, 1023.f, 3.f } } }; + +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorMultiplyAdd(V, Scale, Bias); + N = XMVectorClamp(N, g_XMZero, C); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->v = static_cast( + (static_cast(tmp.w) << 30) + | ((static_cast(tmp.z) & 0x3FF) << 20) + | ((static_cast(tmp.y) & 0x3FF) << 10) + | ((static_cast(tmp.x) & 0x3FF))); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 Shift = { { { 1.0f, 1024.0f * 0.5f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f * 0.5f } } }; + static const XMVECTORU32 MaskUDecN4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; + float32x4_t vResult = vmlaq_f32(Bias, V, Scale); + vResult = vmaxq_f32(vResult, vdupq_n_f32(0.f)); + vResult = vminq_f32(vResult, C); + vResult = vmulq_f32(vResult, Shift); + uint32x4_t vResulti = vcvtq_u32_f32(vResult); + vResulti = vandq_u32(vResulti, MaskUDecN4); + // Do a horizontal or of 4 entries + uint32x2_t vTemp = vget_low_u32(vResulti); + uint32x2_t vTemp2 = vget_high_u32(vResulti); + vTemp = vorr_u32(vTemp, vTemp2); + // Perform a single bit left shift on y|w + vTemp2 = vdup_lane_u32(vTemp, 1); + vTemp2 = vadd_u32(vTemp2, vTemp2); + vTemp = vorr_u32(vTemp, vTemp2); + vst1_lane_u32(&pDestination->v, vTemp, 0); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 Shift = { { { 1.0f, 1024.0f * 0.5f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f * 0.5f } } }; + static const XMVECTORU32 MaskUDecN4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; + // Scale & bias + XMVECTOR vResult = XM_FMADD_PS(V, Scale, Bias); + // Clamp to bounds + vResult = _mm_max_ps(vResult, g_XMZero); + vResult = _mm_min_ps(vResult, C); + // Scale by shift values + vResult = _mm_mul_ps(vResult, Shift); + // Convert to int + __m128i vResulti = _mm_cvttps_epi32(vResult); + // Mask off any fraction + vResulti = _mm_and_si128(vResulti, MaskUDecN4); + // Do a horizontal or of 4 entries + __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); + // x = x|z, y = y|w + vResulti = _mm_or_si128(vResulti, vResulti2); + // Move Z to the x position + vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); + // Perform a left shift by one bit on y|w + vResulti2 = _mm_add_epi32(vResulti2, vResulti2); + // i = x|y|z|w + vResulti = _mm_or_si128(vResulti, vResulti2); + _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreUDec4 +( + XMUDEC4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); + static const XMVECTORF32 MaxUDec4 = { { { 1023.0f, 1023.0f, 1023.0f, 3.0f } } }; + +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorClamp(V, XMVectorZero(), MaxUDec4); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->v = static_cast( + (static_cast(tmp.w) << 30) + | ((static_cast(tmp.z) & 0x3FF) << 20) + | ((static_cast(tmp.y) & 0x3FF) << 10) + | ((static_cast(tmp.x) & 0x3FF))); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 ScaleUDec4 = { { { 1.0f, 1024.0f / 2.0f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f / 2.0f } } }; + static const XMVECTORI32 MaskUDec4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; + float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0.f)); + vResult = vminq_f32(vResult, MaxUDec4); + vResult = vmulq_f32(vResult, ScaleUDec4); + uint32x4_t vResulti = vcvtq_u32_f32(vResult); + vResulti = vandq_u32(vResulti, MaskUDec4); + // Do a horizontal or of 4 entries + uint32x2_t vTemp = vget_low_u32(vResulti); + uint32x2_t vTemp2 = vget_high_u32(vResulti); + vTemp = vorr_u32(vTemp, vTemp2); + // Perform a single bit left shift on y|w + vTemp2 = vdup_lane_u32(vTemp, 1); + vTemp2 = vadd_u32(vTemp2, vTemp2); + vTemp = vorr_u32(vTemp, vTemp2); + vst1_lane_u32(&pDestination->v, vTemp, 0); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 ScaleUDec4 = { { { 1.0f, 1024.0f / 2.0f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f / 2.0f } } }; + static const XMVECTORI32 MaskUDec4 = { { { 0x3FF, 0x3FF << (10 - 1), 0x3FF << 20, 0x3 << (30 - 1) } } }; + // Clamp to bounds + XMVECTOR vResult = _mm_max_ps(V, g_XMZero); + vResult = _mm_min_ps(vResult, MaxUDec4); + // Scale by multiplication + vResult = _mm_mul_ps(vResult, ScaleUDec4); + // Convert to int + __m128i vResulti = _mm_cvttps_epi32(vResult); + // Mask off any fraction + vResulti = _mm_and_si128(vResulti, MaskUDec4); + // Do a horizontal or of 4 entries + __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); + // x = x|z, y = y|w + vResulti = _mm_or_si128(vResulti, vResulti2); + // Move Z to the x position + vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); + // Perform a left shift by one bit on y|w + vResulti2 = _mm_add_epi32(vResulti2, vResulti2); + // i = x|y|z|w + vResulti = _mm_or_si128(vResulti, vResulti2); + _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); +#endif +} + +//------------------------------------------------------------------------------ +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +// C4996: ignore deprecation warning +#endif + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreDecN4 +( + XMDECN4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + static const XMVECTORF32 Scale = { { { 511.0f, 511.0f, 511.0f, 1.0f } } }; + + XMVECTOR N = XMVectorClamp(V, g_XMNegativeOne.v, g_XMOne.v); + N = XMVectorMultiply(N, Scale.v); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->v = static_cast( + (static_cast(tmp.w) << 30) + | ((static_cast(tmp.z) & 0x3FF) << 20) + | ((static_cast(tmp.y) & 0x3FF) << 10) + | ((static_cast(tmp.x) & 0x3FF))); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 ScaleDecN4 = { { { 511.0f, 511.0f * 1024.0f, 511.0f * 1024.0f * 1024.0f, 1.0f * 1024.0f * 1024.0f * 1024.0f } } }; + float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(-1.f)); + vResult = vminq_f32(vResult, vdupq_n_f32(1.f)); + vResult = vmulq_f32(vResult, ScaleDecN4); + int32x4_t vResulti = vcvtq_s32_f32(vResult); + vResulti = vandq_s32(vResulti, g_XMMaskDec4); + // Do a horizontal or of 4 entries + uint32x2_t vTemp = vget_low_u32(vreinterpretq_u32_s32(vResulti)); + uint32x2_t vhi = vget_high_u32(vreinterpretq_u32_s32(vResulti)); + vTemp = vorr_u32(vTemp, vhi); + vTemp = vpadd_u32(vTemp, vTemp); + vst1_lane_u32(&pDestination->v, vTemp, 0); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 ScaleDecN4 = { { { 511.0f, 511.0f * 1024.0f, 511.0f * 1024.0f * 1024.0f, 1.0f * 1024.0f * 1024.0f * 1024.0f } } }; + // Clamp to bounds + XMVECTOR vResult = _mm_max_ps(V, g_XMNegativeOne); + vResult = _mm_min_ps(vResult, g_XMOne); + // Scale by multiplication + vResult = _mm_mul_ps(vResult, ScaleDecN4); + // Convert to int + __m128i vResulti = _mm_cvttps_epi32(vResult); + // Mask off any fraction + vResulti = _mm_and_si128(vResulti, g_XMMaskDec4); + // Do a horizontal or of 4 entries + __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); + // x = x|z, y = y|w + vResulti = _mm_or_si128(vResulti, vResulti2); + // Move Z to the x position + vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); + // i = x|y|z|w + vResulti = _mm_or_si128(vResulti, vResulti2); + _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreDec4 +( + XMDEC4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); + static const XMVECTORF32 MinDec4 = { { { -511.0f, -511.0f, -511.0f, -1.0f } } }; + static const XMVECTORF32 MaxDec4 = { { { 511.0f, 511.0f, 511.0f, 1.0f } } }; + +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorClamp(V, MinDec4, MaxDec4); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->v = static_cast( + (static_cast(tmp.w) << 30) + | ((static_cast(tmp.z) & 0x3FF) << 20) + | ((static_cast(tmp.y) & 0x3FF) << 10) + | ((static_cast(tmp.x) & 0x3FF))); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 ScaleDec4 = { { { 1.0f, 1024.0f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f } } }; + float32x4_t vResult = vmaxq_f32(V, MinDec4); + vResult = vminq_f32(vResult, MaxDec4); + vResult = vmulq_f32(vResult, ScaleDec4); + int32x4_t vResulti = vcvtq_s32_f32(vResult); + vResulti = vandq_s32(vResulti, g_XMMaskDec4); + // Do a horizontal or of all 4 entries + uint32x2_t vTemp = vget_low_u32(vreinterpretq_u32_s32(vResulti)); + uint32x2_t vhi = vget_high_u32(vreinterpretq_u32_s32(vResulti)); + vTemp = vorr_u32(vTemp, vhi); + vTemp = vpadd_u32(vTemp, vTemp); + vst1_lane_u32(&pDestination->v, vTemp, 0); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 ScaleDec4 = { { { 1.0f, 1024.0f, 1024.0f * 1024.0f, 1024.0f * 1024.0f * 1024.0f } } }; + // Clamp to bounds + XMVECTOR vResult = _mm_max_ps(V, MinDec4); + vResult = _mm_min_ps(vResult, MaxDec4); + // Scale by multiplication + vResult = _mm_mul_ps(vResult, ScaleDec4); + // Convert to int + __m128i vResulti = _mm_cvttps_epi32(vResult); + // Mask off any fraction + vResulti = _mm_and_si128(vResulti, g_XMMaskDec4); + // Do a horizontal or of 4 entries + __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); + // x = x|z, y = y|w + vResulti = _mm_or_si128(vResulti, vResulti2); + // Move Z to the x position + vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); + // i = x|y|z|w + vResulti = _mm_or_si128(vResulti, vResulti2); + _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); +#endif +} + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreUByteN4 +( + XMUBYTEN4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorSaturate(V); + N = XMVectorMultiply(N, g_UByteMax); + N = XMVectorTruncate(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->x = static_cast(tmp.x); + pDestination->y = static_cast(tmp.y); + pDestination->z = static_cast(tmp.z); + pDestination->w = static_cast(tmp.w); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0)); + R = vminq_f32(R, vdupq_n_f32(1.0f)); + R = vmulq_n_f32(R, 255.0f); + uint32x4_t vInt32 = vcvtq_u32_f32(R); + uint16x4_t vInt16 = vqmovn_u32(vInt32); + uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); + vst1_lane_u32(&pDestination->v, vreinterpret_u32_u8(vInt8), 0); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 ScaleUByteN4 = { { { 255.0f, 255.0f * 256.0f * 0.5f, 255.0f * 256.0f * 256.0f, 255.0f * 256.0f * 256.0f * 256.0f * 0.5f } } }; + static const XMVECTORI32 MaskUByteN4 = { { { 0xFF, 0xFF << (8 - 1), 0xFF << 16, 0xFF << (24 - 1) } } }; + // Clamp to bounds + XMVECTOR vResult = _mm_max_ps(V, g_XMZero); + vResult = _mm_min_ps(vResult, g_XMOne); + // Scale by multiplication + vResult = _mm_mul_ps(vResult, ScaleUByteN4); + // Convert to int + __m128i vResulti = _mm_cvttps_epi32(vResult); + // Mask off any fraction + vResulti = _mm_and_si128(vResulti, MaskUByteN4); + // Do a horizontal or of 4 entries + __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); + // x = x|z, y = y|w + vResulti = _mm_or_si128(vResulti, vResulti2); + // Move Z to the x position + vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); + // Perform a single bit left shift to fix y|w + vResulti2 = _mm_add_epi32(vResulti2, vResulti2); + // i = x|y|z|w + vResulti = _mm_or_si128(vResulti, vResulti2); + _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreUByte4 +( + XMUBYTE4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorClamp(V, XMVectorZero(), g_UByteMax); + N = XMVectorRound(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->x = static_cast(tmp.x); + pDestination->y = static_cast(tmp.y); + pDestination->z = static_cast(tmp.z); + pDestination->w = static_cast(tmp.w); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(0)); + R = vminq_f32(R, vdupq_n_f32(255.0f)); + uint32x4_t vInt32 = vcvtq_u32_f32(R); + uint16x4_t vInt16 = vqmovn_u32(vInt32); + uint8x8_t vInt8 = vqmovn_u16(vcombine_u16(vInt16, vInt16)); + vst1_lane_u32(&pDestination->v, vreinterpret_u32_u8(vInt8), 0); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 ScaleUByte4 = { { { 1.0f, 256.0f * 0.5f, 256.0f * 256.0f, 256.0f * 256.0f * 256.0f * 0.5f } } }; + static const XMVECTORI32 MaskUByte4 = { { { 0xFF, 0xFF << (8 - 1), 0xFF << 16, 0xFF << (24 - 1) } } }; + // Clamp to bounds + XMVECTOR vResult = _mm_max_ps(V, g_XMZero); + vResult = _mm_min_ps(vResult, g_UByteMax); + // Scale by multiplication + vResult = _mm_mul_ps(vResult, ScaleUByte4); + // Convert to int by rounding + __m128i vResulti = _mm_cvtps_epi32(vResult); + // Mask off any fraction + vResulti = _mm_and_si128(vResulti, MaskUByte4); + // Do a horizontal or of 4 entries + __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); + // x = x|z, y = y|w + vResulti = _mm_or_si128(vResulti, vResulti2); + // Move Z to the x position + vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); + // Perform a single bit left shift to fix y|w + vResulti2 = _mm_add_epi32(vResulti2, vResulti2); + // i = x|y|z|w + vResulti = _mm_or_si128(vResulti, vResulti2); + _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreByteN4 +( + XMBYTEN4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorClamp(V, g_XMNegativeOne.v, g_XMOne.v); + N = XMVectorMultiply(N, g_ByteMax); + N = XMVectorTruncate(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->x = static_cast(tmp.x); + pDestination->y = static_cast(tmp.y); + pDestination->z = static_cast(tmp.z); + pDestination->w = static_cast(tmp.w); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-1.f)); + R = vminq_f32(R, vdupq_n_f32(1.0f)); + R = vmulq_n_f32(R, 127.0f); + int32x4_t vInt32 = vcvtq_s32_f32(R); + int16x4_t vInt16 = vqmovn_s32(vInt32); + int8x8_t vInt8 = vqmovn_s16(vcombine_s16(vInt16, vInt16)); + vst1_lane_u32(&pDestination->v, vreinterpret_u32_s8(vInt8), 0); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 ScaleByteN4 = { { { 127.0f, 127.0f * 256.0f, 127.0f * 256.0f * 256.0f, 127.0f * 256.0f * 256.0f * 256.0f } } }; + static const XMVECTORI32 MaskByteN4 = { { { 0xFF, 0xFF << 8, 0xFF << 16, static_cast(0xFF000000) } } }; + // Clamp to bounds + XMVECTOR vResult = _mm_max_ps(V, g_XMNegativeOne); + vResult = _mm_min_ps(vResult, g_XMOne); + // Scale by multiplication + vResult = _mm_mul_ps(vResult, ScaleByteN4); + // Convert to int + __m128i vResulti = _mm_cvttps_epi32(vResult); + // Mask off any fraction + vResulti = _mm_and_si128(vResulti, MaskByteN4); + // Do a horizontal or of 4 entries + __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); + // x = x|z, y = y|w + vResulti = _mm_or_si128(vResulti, vResulti2); + // Move Z to the x position + vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); + // i = x|y|z|w + vResulti = _mm_or_si128(vResulti, vResulti2); + _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreByte4 +( + XMBYTE4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorClamp(V, g_ByteMin, g_ByteMax); + N = XMVectorRound(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->x = static_cast(tmp.x); + pDestination->y = static_cast(tmp.y); + pDestination->z = static_cast(tmp.z); + pDestination->w = static_cast(tmp.w); + +#elif defined(_XM_ARM_NEON_INTRINSICS_) + float32x4_t R = vmaxq_f32(V, vdupq_n_f32(-127.f)); + R = vminq_f32(R, vdupq_n_f32(127.f)); + int32x4_t vInt32 = vcvtq_s32_f32(R); + int16x4_t vInt16 = vqmovn_s32(vInt32); + int8x8_t vInt8 = vqmovn_s16(vcombine_s16(vInt16, vInt16)); + vst1_lane_u32(&pDestination->v, vreinterpret_u32_s8(vInt8), 0); +#elif defined(_XM_SSE_INTRINSICS_) + static const XMVECTORF32 ScaleByte4 = { { { 1.0f, 256.0f, 256.0f * 256.0f, 256.0f * 256.0f * 256.0f } } }; + static const XMVECTORI32 MaskByte4 = { { { 0xFF, 0xFF << 8, 0xFF << 16, static_cast(0xFF000000) } } }; + // Clamp to bounds + XMVECTOR vResult = _mm_max_ps(V, g_ByteMin); + vResult = _mm_min_ps(vResult, g_ByteMax); + // Scale by multiplication + vResult = _mm_mul_ps(vResult, ScaleByte4); + // Convert to int by rounding + __m128i vResulti = _mm_cvtps_epi32(vResult); + // Mask off any fraction + vResulti = _mm_and_si128(vResulti, MaskByte4); + // Do a horizontal or of 4 entries + __m128i vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(3, 2, 3, 2)); + // x = x|z, y = y|w + vResulti = _mm_or_si128(vResulti, vResulti2); + // Move Z to the x position + vResulti2 = _mm_shuffle_epi32(vResulti, _MM_SHUFFLE(1, 1, 1, 1)); + // i = x|y|z|w + vResulti = _mm_or_si128(vResulti, vResulti2); + _mm_store_ss(reinterpret_cast(&pDestination->v), _mm_castsi128_ps(vResulti)); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreUNibble4 +( + XMUNIBBLE4* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); + static const XMVECTORF32 Max = { { { 15.0f, 15.0f, 15.0f, 15.0f } } }; +#if defined(_XM_NO_INTRINSICS_) + + XMVECTOR N = XMVectorClamp(V, XMVectorZero(), Max.v); + N = XMVectorRound(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->v = static_cast( + ((static_cast(tmp.w) & 0xF) << 12) + | ((static_cast(tmp.z) & 0xF) << 8) + | ((static_cast(tmp.y) & 0xF) << 4) + | (static_cast(tmp.x) & 0xF)); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 Scale = { { { 1.0f, 16.f, 16.f * 16.f, 16.f * 16.f * 16.f } } }; + static const XMVECTORU32 Mask = { { { 0xF, 0xF << 4, 0xF << 8, 0xF << 12 } } }; + float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); + vResult = vminq_f32(vResult, Max); + vResult = vmulq_f32(vResult, Scale); + uint32x4_t vResulti = vcvtq_u32_f32(vResult); + vResulti = vandq_u32(vResulti, Mask); + // Do a horizontal or of 4 entries + uint32x2_t vTemp = vget_low_u32(vResulti); + uint32x2_t vhi = vget_high_u32(vResulti); + vTemp = vorr_u32(vTemp, vhi); + vTemp = vpadd_u32(vTemp, vTemp); + vst1_lane_u16(&pDestination->v, vreinterpret_u16_u32(vTemp), 0); +#elif defined(_XM_SSE_INTRINSICS_) + // Bounds check + XMVECTOR vResult = _mm_max_ps(V, g_XMZero); + vResult = _mm_min_ps(vResult, Max); + // Convert to int with rounding + __m128i vInt = _mm_cvtps_epi32(vResult); + // No SSE operations will write to 16-bit values, so we have to extract them manually + auto x = static_cast(_mm_extract_epi16(vInt, 0)); + auto y = static_cast(_mm_extract_epi16(vInt, 2)); + auto z = static_cast(_mm_extract_epi16(vInt, 4)); + auto w = static_cast(_mm_extract_epi16(vInt, 6)); + pDestination->v = static_cast( + ((static_cast(w) & 0xF) << 12) + | ((static_cast(z) & 0xF) << 8) + | ((static_cast(y) & 0xF) << 4) + | ((static_cast(x) & 0xF))); +#endif +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline void XM_CALLCONV XMStoreU555 +( + XMU555* pDestination, + FXMVECTOR V +) noexcept +{ + assert(pDestination); + static const XMVECTORF32 Max = { { { 31.0f, 31.0f, 31.0f, 1.0f } } }; + +#if defined(_XM_NO_INTRINSICS_) + XMVECTOR N = XMVectorClamp(V, XMVectorZero(), Max.v); + N = XMVectorRound(N); + + XMFLOAT4A tmp; + XMStoreFloat4A(&tmp, N); + + pDestination->v = static_cast( + ((tmp.w > 0.f) ? 0x8000 : 0) + | ((static_cast(tmp.z) & 0x1F) << 10) + | ((static_cast(tmp.y) & 0x1F) << 5) + | (static_cast(tmp.x) & 0x1F)); +#elif defined(_XM_ARM_NEON_INTRINSICS_) + static const XMVECTORF32 Scale = { { { 1.0f, 32.f / 2.f, 32.f * 32.f, 32.f * 32.f * 32.f / 2.f } } }; + static const XMVECTORU32 Mask = { { { 0x1F, 0x1F << (5 - 1), 0x1F << 10, 0x1 << (15 - 1) } } }; + float32x4_t vResult = vmaxq_f32(V, vdupq_n_f32(0)); + vResult = vminq_f32(vResult, Max); + vResult = vmulq_f32(vResult, Scale); + uint32x4_t vResulti = vcvtq_u32_f32(vResult); + vResulti = vandq_u32(vResulti, Mask); + // Do a horizontal or of 4 entries + uint32x2_t vTemp = vget_low_u32(vResulti); + uint32x2_t vTemp2 = vget_high_u32(vResulti); + vTemp = vorr_u32(vTemp, vTemp2); + // Perform a single bit left shift on y|w + vTemp2 = vdup_lane_u32(vTemp, 1); + vTemp2 = vadd_u32(vTemp2, vTemp2); + vTemp = vorr_u32(vTemp, vTemp2); + vst1_lane_u16(&pDestination->v, vreinterpret_u16_u32(vTemp), 0); +#elif defined(_XM_SSE_INTRINSICS_) + // Bounds check + XMVECTOR vResult = _mm_max_ps(V, g_XMZero); + vResult = _mm_min_ps(vResult, Max); + // Convert to int with rounding + __m128i vInt = _mm_cvtps_epi32(vResult); + // No SSE operations will write to 16-bit values, so we have to extract them manually + auto x = static_cast(_mm_extract_epi16(vInt, 0)); + auto y = static_cast(_mm_extract_epi16(vInt, 2)); + auto z = static_cast(_mm_extract_epi16(vInt, 4)); + auto w = static_cast(_mm_extract_epi16(vInt, 6)); + pDestination->v = static_cast( + (static_cast(w) ? 0x8000 : 0) + | ((static_cast(z) & 0x1F) << 10) + | ((static_cast(y) & 0x1F) << 5) + | ((static_cast(x) & 0x1F))); +#endif +} + + +/**************************************************************************** + * + * XMCOLOR operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMCOLOR::XMCOLOR +( + float _r, + float _g, + float _b, + float _a +) noexcept +{ + XMStoreColor(this, XMVectorSet(_r, _g, _b, _a)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMCOLOR::XMCOLOR(const float* pArray) noexcept +{ + XMStoreColor(this, XMLoadFloat4(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMHALF2 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMHALF2::XMHALF2 +( + float _x, + float _y +) noexcept +{ + x = XMConvertFloatToHalf(_x); + y = XMConvertFloatToHalf(_y); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMHALF2::XMHALF2(const float* pArray) noexcept +{ + assert(pArray != nullptr); + x = XMConvertFloatToHalf(pArray[0]); + y = XMConvertFloatToHalf(pArray[1]); +} + +/**************************************************************************** + * + * XMSHORTN2 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMSHORTN2::XMSHORTN2 +( + float _x, + float _y +) noexcept +{ + XMStoreShortN2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMSHORTN2::XMSHORTN2(const float* pArray) noexcept +{ + XMStoreShortN2(this, XMLoadFloat2(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMSHORT2 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMSHORT2::XMSHORT2 +( + float _x, + float _y +) noexcept +{ + XMStoreShort2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMSHORT2::XMSHORT2(const float* pArray) noexcept +{ + XMStoreShort2(this, XMLoadFloat2(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMUSHORTN2 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMUSHORTN2::XMUSHORTN2 +( + float _x, + float _y +) noexcept +{ + XMStoreUShortN2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMUSHORTN2::XMUSHORTN2(const float* pArray) noexcept +{ + XMStoreUShortN2(this, XMLoadFloat2(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMUSHORT2 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMUSHORT2::XMUSHORT2 +( + float _x, + float _y +) noexcept +{ + XMStoreUShort2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMUSHORT2::XMUSHORT2(const float* pArray) noexcept +{ + XMStoreUShort2(this, XMLoadFloat2(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMBYTEN2 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMBYTEN2::XMBYTEN2 +( + float _x, + float _y +) noexcept +{ + XMStoreByteN2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMBYTEN2::XMBYTEN2(const float* pArray) noexcept +{ + XMStoreByteN2(this, XMLoadFloat2(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMBYTE2 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMBYTE2::XMBYTE2 +( + float _x, + float _y +) noexcept +{ + XMStoreByte2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMBYTE2::XMBYTE2(const float* pArray) noexcept +{ + XMStoreByte2(this, XMLoadFloat2(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMUBYTEN2 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMUBYTEN2::XMUBYTEN2 +( + float _x, + float _y +) noexcept +{ + XMStoreUByteN2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMUBYTEN2::XMUBYTEN2(const float* pArray) noexcept +{ + XMStoreUByteN2(this, XMLoadFloat2(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMUBYTE2 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMUBYTE2::XMUBYTE2 +( + float _x, + float _y +) noexcept +{ + XMStoreUByte2(this, XMVectorSet(_x, _y, 0.0f, 0.0f)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMUBYTE2::XMUBYTE2(const float* pArray) noexcept +{ + XMStoreUByte2(this, XMLoadFloat2(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMU565 operators + * + ****************************************************************************/ + +inline XMU565::XMU565 +( + float _x, + float _y, + float _z +) noexcept +{ + XMStoreU565(this, XMVectorSet(_x, _y, _z, 0.0f)); +} + +_Use_decl_annotations_ +inline XMU565::XMU565(const float* pArray) noexcept +{ + XMStoreU565(this, XMLoadFloat3(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMFLOAT3PK operators + * + ****************************************************************************/ + +inline XMFLOAT3PK::XMFLOAT3PK +( + float _x, + float _y, + float _z +) noexcept +{ + XMStoreFloat3PK(this, XMVectorSet(_x, _y, _z, 0.0f)); +} + +_Use_decl_annotations_ +inline XMFLOAT3PK::XMFLOAT3PK(const float* pArray) noexcept +{ + XMStoreFloat3PK(this, XMLoadFloat3(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMFLOAT3SE operators + * + ****************************************************************************/ + +inline XMFLOAT3SE::XMFLOAT3SE +( + float _x, + float _y, + float _z +) noexcept +{ + XMStoreFloat3SE(this, XMVectorSet(_x, _y, _z, 0.0f)); +} + +_Use_decl_annotations_ +inline XMFLOAT3SE::XMFLOAT3SE(const float* pArray) noexcept +{ + XMStoreFloat3SE(this, XMLoadFloat3(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMHALF4 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMHALF4::XMHALF4 +( + float _x, + float _y, + float _z, + float _w +) noexcept +{ + x = XMConvertFloatToHalf(_x); + y = XMConvertFloatToHalf(_y); + z = XMConvertFloatToHalf(_z); + w = XMConvertFloatToHalf(_w); +} + +//------------------------------------------------------------------------------ + +_Use_decl_annotations_ +inline XMHALF4::XMHALF4(const float* pArray) noexcept +{ + XMConvertFloatToHalfStream(&x, sizeof(HALF), pArray, sizeof(float), 4); +} + +/**************************************************************************** + * + * XMSHORTN4 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMSHORTN4::XMSHORTN4 +( + float _x, + float _y, + float _z, + float _w +) noexcept +{ + XMStoreShortN4(this, XMVectorSet(_x, _y, _z, _w)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMSHORTN4::XMSHORTN4(const float* pArray) noexcept +{ + XMStoreShortN4(this, XMLoadFloat4(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMSHORT4 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMSHORT4::XMSHORT4 +( + float _x, + float _y, + float _z, + float _w +) noexcept +{ + XMStoreShort4(this, XMVectorSet(_x, _y, _z, _w)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMSHORT4::XMSHORT4(const float* pArray) noexcept +{ + XMStoreShort4(this, XMLoadFloat4(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMUSHORTN4 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMUSHORTN4::XMUSHORTN4 +( + float _x, + float _y, + float _z, + float _w +) noexcept +{ + XMStoreUShortN4(this, XMVectorSet(_x, _y, _z, _w)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMUSHORTN4::XMUSHORTN4(const float* pArray) noexcept +{ + XMStoreUShortN4(this, XMLoadFloat4(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMUSHORT4 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMUSHORT4::XMUSHORT4 +( + float _x, + float _y, + float _z, + float _w +) noexcept +{ + XMStoreUShort4(this, XMVectorSet(_x, _y, _z, _w)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMUSHORT4::XMUSHORT4(const float* pArray) noexcept +{ + XMStoreUShort4(this, XMLoadFloat4(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMXDECN4 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMXDECN4::XMXDECN4 +( + float _x, + float _y, + float _z, + float _w +) noexcept +{ + XMStoreXDecN4(this, XMVectorSet(_x, _y, _z, _w)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMXDECN4::XMXDECN4(const float* pArray) noexcept +{ + XMStoreXDecN4(this, XMLoadFloat4(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMXDEC4 operators + * + ****************************************************************************/ +#ifdef _MSC_VER +#pragma warning(push) +#pragma warning(disable : 4996) +// C4996: ignore deprecation warning +#endif + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#endif + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + +//------------------------------------------------------------------------------ + +inline XMXDEC4::XMXDEC4 +( + float _x, + float _y, + float _z, + float _w +) noexcept +{ + XMStoreXDec4(this, XMVectorSet(_x, _y, _z, _w)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMXDEC4::XMXDEC4(const float* pArray) noexcept +{ + XMStoreXDec4(this, XMLoadFloat4(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMDECN4 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMDECN4::XMDECN4 +( + float _x, + float _y, + float _z, + float _w +) noexcept +{ + XMStoreDecN4(this, XMVectorSet(_x, _y, _z, _w)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMDECN4::XMDECN4(const float* pArray) noexcept +{ + XMStoreDecN4(this, XMLoadFloat4(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMDEC4 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMDEC4::XMDEC4 +( + float _x, + float _y, + float _z, + float _w +) noexcept +{ + XMStoreDec4(this, XMVectorSet(_x, _y, _z, _w)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMDEC4::XMDEC4(const float* pArray) noexcept +{ + XMStoreDec4(this, XMLoadFloat4(reinterpret_cast(pArray))); +} + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +#ifdef _MSC_VER +#pragma warning(pop) +#endif + +/**************************************************************************** + * + * XMUDECN4 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMUDECN4::XMUDECN4 +( + float _x, + float _y, + float _z, + float _w +) noexcept +{ + XMStoreUDecN4(this, XMVectorSet(_x, _y, _z, _w)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMUDECN4::XMUDECN4(const float* pArray) noexcept +{ + XMStoreUDecN4(this, XMLoadFloat4(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMUDEC4 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMUDEC4::XMUDEC4 +( + float _x, + float _y, + float _z, + float _w +) noexcept +{ + XMStoreUDec4(this, XMVectorSet(_x, _y, _z, _w)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMUDEC4::XMUDEC4(const float* pArray) noexcept +{ + XMStoreUDec4(this, XMLoadFloat4(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMBYTEN4 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMBYTEN4::XMBYTEN4 +( + float _x, + float _y, + float _z, + float _w +) noexcept +{ + XMStoreByteN4(this, XMVectorSet(_x, _y, _z, _w)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMBYTEN4::XMBYTEN4(const float* pArray) noexcept +{ + XMStoreByteN4(this, XMLoadFloat4(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMBYTE4 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMBYTE4::XMBYTE4 +( + float _x, + float _y, + float _z, + float _w +) noexcept +{ + XMStoreByte4(this, XMVectorSet(_x, _y, _z, _w)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMBYTE4::XMBYTE4(const float* pArray) noexcept +{ + XMStoreByte4(this, XMLoadFloat4(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMUBYTEN4 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMUBYTEN4::XMUBYTEN4 +( + float _x, + float _y, + float _z, + float _w +) noexcept +{ + XMStoreUByteN4(this, XMVectorSet(_x, _y, _z, _w)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMUBYTEN4::XMUBYTEN4(const float* pArray) noexcept +{ + XMStoreUByteN4(this, XMLoadFloat4(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMUBYTE4 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMUBYTE4::XMUBYTE4 +( + float _x, + float _y, + float _z, + float _w +) noexcept +{ + XMStoreUByte4(this, XMVectorSet(_x, _y, _z, _w)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMUBYTE4::XMUBYTE4(const float* pArray) noexcept +{ + XMStoreUByte4(this, XMLoadFloat4(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMUNIBBLE4 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMUNIBBLE4::XMUNIBBLE4 +( + float _x, + float _y, + float _z, + float _w +) noexcept +{ + XMStoreUNibble4(this, XMVectorSet(_x, _y, _z, _w)); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMUNIBBLE4::XMUNIBBLE4(const float* pArray) noexcept +{ + XMStoreUNibble4(this, XMLoadFloat4(reinterpret_cast(pArray))); +} + +/**************************************************************************** + * + * XMU555 operators + * + ****************************************************************************/ + +//------------------------------------------------------------------------------ + +inline XMU555::XMU555 +( + float _x, + float _y, + float _z, + bool _w +) noexcept +{ + XMStoreU555(this, XMVectorSet(_x, _y, _z, ((_w) ? 1.0f : 0.0f))); +} + +//------------------------------------------------------------------------------ +_Use_decl_annotations_ +inline XMU555::XMU555 +( + const float* pArray, + bool _w +) noexcept +{ + XMVECTOR V = XMLoadFloat3(reinterpret_cast(pArray)); + XMStoreU555(this, XMVectorSetW(V, ((_w) ? 1.0f : 0.0f))); +} + diff --git a/Minecraft.Client/Platform/Linux/Stubs/DirectXMath/sal.h b/Minecraft.Client/Linux/Stubs/DirectXMath/sal.h similarity index 100% rename from Minecraft.Client/Platform/Linux/Stubs/DirectXMath/sal.h rename to Minecraft.Client/Linux/Stubs/DirectXMath/sal.h diff --git a/Minecraft.Client/Platform/Linux/Stubs/LinuxStubs.h b/Minecraft.Client/Linux/Stubs/LinuxStubs.h similarity index 100% rename from Minecraft.Client/Platform/Linux/Stubs/LinuxStubs.h rename to Minecraft.Client/Linux/Stubs/LinuxStubs.h diff --git a/Minecraft.Client/Platform/Linux/Stubs/d3d11_stubs.h b/Minecraft.Client/Linux/Stubs/d3d11_stubs.h similarity index 100% rename from Minecraft.Client/Platform/Linux/Stubs/d3d11_stubs.h rename to Minecraft.Client/Linux/Stubs/d3d11_stubs.h diff --git a/Minecraft.Client/Platform/Linux/Stubs/iggy_stubs.h b/Minecraft.Client/Linux/Stubs/iggy_stubs.h similarity index 99% rename from Minecraft.Client/Platform/Linux/Stubs/iggy_stubs.h rename to Minecraft.Client/Linux/Stubs/iggy_stubs.h index fdd493302..6ba9dc3f0 100644 --- a/Minecraft.Client/Platform/Linux/Stubs/iggy_stubs.h +++ b/Minecraft.Client/Linux/Stubs/iggy_stubs.h @@ -3,7 +3,7 @@ #pragma once -#include "../Iggy/include/iggy.h" +#include "../../../Windows64/Iggy/include/iggy.h" #define STUBBED \ { \ diff --git a/Minecraft.Client/Platform/Linux/Stubs/winapi_stubs.h b/Minecraft.Client/Linux/Stubs/winapi_stubs.h similarity index 100% rename from Minecraft.Client/Platform/Linux/Stubs/winapi_stubs.h rename to Minecraft.Client/Linux/Stubs/winapi_stubs.h diff --git a/Minecraft.Client/Platform/Linux/Stubs/xbox_stubs.h b/Minecraft.Client/Linux/Stubs/xbox_stubs.h similarity index 100% rename from Minecraft.Client/Platform/Linux/Stubs/xbox_stubs.h rename to Minecraft.Client/Linux/Stubs/xbox_stubs.h diff --git a/Minecraft.Client/Platform/Linux/linux_game_stubs.cpp b/Minecraft.Client/Linux/linux_game_stubs.cpp similarity index 74% rename from Minecraft.Client/Platform/Linux/linux_game_stubs.cpp rename to Minecraft.Client/Linux/linux_game_stubs.cpp index 2c52c1f1d..cb0a1c947 100644 --- a/Minecraft.Client/Platform/Linux/linux_game_stubs.cpp +++ b/Minecraft.Client/Linux/linux_game_stubs.cpp @@ -6,13 +6,13 @@ #include #include "Stubs/LinuxStubs.h" -#include "../Common/Consoles_App.h" +#include "../../Common/Consoles_App.h" void Display::update() {} int CMinecraftApp::GetTPConfigVal(wchar_t* pwchDataFile) { return 0; } -#include "../../Minecraft.World/Platform/x64headers/extraX64.h" +#include "../../../Minecraft.World/x64headers/extraX64.h" void PIXSetMarkerDeprecated(int a, const char* b, ...) {} diff --git a/Minecraft.Client/Platform/Common/GameRules/ConsoleGameRules.h b/Minecraft.Client/Platform/Common/GameRules/ConsoleGameRules.h deleted file mode 100644 index 41c5e5572..000000000 --- a/Minecraft.Client/Platform/Common/GameRules/ConsoleGameRules.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once -#include "ConsoleGameRulesConstants.h" - -#include "GameRuleManager.h" - -#include "GameRule.h" - -#include "GameRuleDefinition.h" - -#include "LevelRuleset.h" -#include "NamedAreaRuleDefinition.h" - -#include "CollectItemRuleDefinition.h" -#include "CompleteAllRuleDefinition.h" -#include "CompoundGameRuleDefinition.h" -#include "UseTileRuleDefinition.h" -#include "UpdatePlayerRuleDefinition.h" -#include "AddItemRuleDefinition.h" -#include "AddEnchantmentRuleDefinition.h" - -#include "LevelGenerationOptions.h" -#include "ApplySchematicRuleDefinition.h" -#include "ConsoleGenerateStructure.h" -#include "ConsoleGenerateStructureAction.h" -#include "XboxStructureActionGenerateBox.h" -#include "XboxStructureActionPlaceBlock.h" -#include "XboxStructureActionPlaceContainer.h" -#include "XboxStructureActionPlaceSpawner.h" -#include "BiomeOverride.h" -#include "StartFeature.h" - -#include "GameRulesInstance.h" diff --git a/Minecraft.Client/Platform/Common/Minecraft_Macros.h b/Minecraft.Client/Platform/Common/Minecraft_Macros.h deleted file mode 100644 index 4642d9781..000000000 --- a/Minecraft.Client/Platform/Common/Minecraft_Macros.h +++ /dev/null @@ -1,62 +0,0 @@ - -#pragma once - -#include - -// 3 bit user index -// 5 bits alpha -// 1 bit decoration -// 3 bits poptime -// 8 bits unused // was 11 bits aux val but needed 15 bits for potions so moved -// to item bitmask 6 bits count 6 bits scale - -// uiCount is up to 64, but can't ever be 0, so to make it 6 bits, subtract one -// from the packing, and add one on the unpacking -#define MAKE_SLOTDISPLAY_DATA_BITMASK(uiUserIndex, uiAlpha, bDecorations, \ - uiCount, uiScale, uiPopTime) \ - ((((uiUserIndex & 0x7) << 29) | (uiAlpha & 0x1F) << 24) | \ - (bDecorations ? 0x800000 : 0) | ((uiPopTime & 0x7) << 20) | \ - ((uiCount - 1) << 6) | (uiScale & 0x3F)) - -#define GET_SLOTDISPLAY_USERINDEX_FROM_DATA_BITMASK(uiBitmask) \ - ((((unsigned int)uiBitmask) >> 29) & 0x7) -#define GET_SLOTDISPLAY_ALPHA_FROM_DATA_BITMASK(uiBitmask) \ - ((((unsigned int)uiBitmask) >> 24) & 0x1F) -#define GET_SLOTDISPLAY_DECORATIONS_FROM_DATA_BITMASK(uiBitmask) \ - ((((unsigned int)uiBitmask) & 0x800000) ? true : false) -// #define GET_SLOTDISPLAY_AUXVAL_FROM_DATA_BITMASK(uiBitmask) -// ((((unsigned long)uiBitmask)>>12)&0x7FF) -#define GET_SLOTDISPLAY_COUNT_FROM_DATA_BITMASK(uiBitmask) \ - (((((unsigned int)uiBitmask) >> 6) & 0x3F) + 1) -#define GET_SLOTDISPLAY_SCALE_FROM_DATA_BITMASK(uiBitmask) \ - (((unsigned int)uiBitmask) & 0x3F) -#define GET_SLOTDISPLAY_POPTIME_FROM_DATA_BITMASK(uiBitmask) \ - ((((unsigned int)uiBitmask) >> 20) & 0x7) - -// 16 bits for id (either item id or xzp icon id) -// 15 bits for aux value -// 1 bit for foil -#define MAKE_SLOTDISPLAY_ITEM_BITMASK(uiId, uiAuxValue, bFoil) \ - ((uiId & 0xFFFF) | ((uiAuxValue & 0x7FFF) << 16) | (bFoil ? 0x80000000 : 0)) - -#define GET_SLOTDISPLAY_ID_FROM_ITEM_BITMASK(uiBitmask) \ - (((unsigned int)uiBitmask) & 0xFFFF) -#define GET_SLOTDISPLAY_AUXVAL_FROM_ITEM_BITMASK(uiBitmask) \ - ((((unsigned int)uiBitmask) >> 16) & 0x7FFF) -#define GET_SLOTDISPLAY_FOIL_FROM_ITEM_BITMASK(uiBitmask) \ - ((((unsigned int)uiBitmask) & 0x80000000) ? true : false) - -// For encoding the players skin selection in their profile -// bDlcSkin = false is a players skin, bDlcSkin = true is a DLC skin -#define MAKE_SKIN_BITMASK(bDlcSkin, dwSkinId) \ - ((bDlcSkin ? 0x80000000 : 0) | (dwSkinId & 0x7FFFFFFF)) -#define IS_SKIN_ID_IN_RANGE(dwSkinId) (dwSkinId <= 0x7FFFFFFF) - -#define GET_DLC_SKIN_ID_FROM_BITMASK(uiBitmask) \ - (static_cast(uiBitmask) & 0x7FFFFFFF) -#define GET_UGC_SKIN_ID_FROM_BITMASK(uiBitmask) \ - (static_cast(uiBitmask) & 0x7FFFFFE0) -#define GET_DEFAULT_SKIN_ID_FROM_BITMASK(uiBitmask) \ - (static_cast(uiBitmask) & 0x0000001F) -#define GET_IS_DLC_SKIN_FROM_BITMASK(uiBitmask) \ - ((static_cast(uiBitmask) & 0x80000000) ? true : false) diff --git a/Minecraft.Client/Platform/Common/Network/NetworkPlayerQNet.cpp b/Minecraft.Client/Platform/Common/Network/NetworkPlayerQNet.cpp deleted file mode 100644 index 735ef40ca..000000000 --- a/Minecraft.Client/Platform/Common/Network/NetworkPlayerQNet.cpp +++ /dev/null @@ -1,109 +0,0 @@ -#include "../../../../Minecraft.World/Platform/stdafx.h" -#include "NetworkPlayerQNet.h" - -NetworkPlayerQNet::NetworkPlayerQNet(IQNetPlayer* qnetPlayer) { - m_qnetPlayer = qnetPlayer; - m_pSocket = nullptr; -} - -unsigned char NetworkPlayerQNet::GetSmallId() { - return m_qnetPlayer->GetSmallId(); -} - -void NetworkPlayerQNet::SendData(INetworkPlayer* player, const void* pvData, - int dataSize, bool lowPriority, bool ack) { - uint32_t flags; - flags = QNET_SENDDATA_RELIABLE | QNET_SENDDATA_SEQUENTIAL; - if (lowPriority) - flags |= QNET_SENDDATA_LOW_PRIORITY | QNET_SENDDATA_SECONDARY; - m_qnetPlayer->SendData( - static_cast(player)->m_qnetPlayer, pvData, dataSize, - flags); -} - -int NetworkPlayerQNet::GetOutstandingAckCount() { return 0; } - -bool NetworkPlayerQNet::IsSameSystem(INetworkPlayer* player) { - return (m_qnetPlayer->IsSameSystem( - static_cast(player)->m_qnetPlayer) == true); -} - -int NetworkPlayerQNet::GetSendQueueSizeBytes(INetworkPlayer* player, - bool lowPriority) { - uint32_t flags = QNET_GETSENDQUEUESIZE_BYTES; - if (lowPriority) flags |= QNET_GETSENDQUEUESIZE_SECONDARY_TYPE; - return m_qnetPlayer->GetSendQueueSize( - player ? static_cast(player)->m_qnetPlayer - : nullptr, - flags); -} - -int NetworkPlayerQNet::GetSendQueueSizeMessages(INetworkPlayer* player, - bool lowPriority) { - uint32_t flags = QNET_GETSENDQUEUESIZE_MESSAGES; - if (lowPriority) flags |= QNET_GETSENDQUEUESIZE_SECONDARY_TYPE; - return m_qnetPlayer->GetSendQueueSize( - player ? static_cast(player)->m_qnetPlayer - : nullptr, - flags); -} - -int NetworkPlayerQNet::GetCurrentRtt() { return m_qnetPlayer->GetCurrentRtt(); } - -bool NetworkPlayerQNet::IsHost() { return (m_qnetPlayer->IsHost() == true); } - -bool NetworkPlayerQNet::IsGuest() { return (m_qnetPlayer->IsGuest() == true); } - -bool NetworkPlayerQNet::IsLocal() { return (m_qnetPlayer->IsLocal() == true); } - -int NetworkPlayerQNet::GetSessionIndex() { - return m_qnetPlayer->GetSessionIndex(); -} - -bool NetworkPlayerQNet::IsTalking() { - return (m_qnetPlayer->IsTalking() == true); -} - -bool NetworkPlayerQNet::IsMutedByLocalUser(int userIndex) { - return (m_qnetPlayer->IsMutedByLocalUser(userIndex) == true); -} - -bool NetworkPlayerQNet::HasVoice() { - return (m_qnetPlayer->HasVoice() == true); -} - -bool NetworkPlayerQNet::HasCamera() { - return (m_qnetPlayer->HasCamera() == true); -} - -int NetworkPlayerQNet::GetUserIndex() { return m_qnetPlayer->GetUserIndex(); } - -void NetworkPlayerQNet::SetSocket(Socket* pSocket) { m_pSocket = pSocket; } - -Socket* NetworkPlayerQNet::GetSocket() { return m_pSocket; } - -PlayerUID NetworkPlayerQNet::GetUID() { return m_qnetPlayer->GetXuid(); } - -const wchar_t* NetworkPlayerQNet::GetOnlineName() { - return m_qnetPlayer->GetGamertag(); -} - -std::wstring NetworkPlayerQNet::GetDisplayName() { - return m_qnetPlayer->GetGamertag(); -} - -IQNetPlayer* NetworkPlayerQNet::GetQNetPlayer() { return m_qnetPlayer; } - -void NetworkPlayerQNet::SentChunkPacket() { - m_lastChunkPacketTime = System::currentTimeMillis(); -} - -int NetworkPlayerQNet::GetTimeSinceLastChunkPacket_ms() { - // If we haven't ever sent a packet, return maximum - if (m_lastChunkPacketTime == 0) { - return INT_MAX; - } - - const int64_t currentTime = System::currentTimeMillis(); - return static_cast(currentTime - m_lastChunkPacketTime); -} diff --git a/Minecraft.Client/Platform/Common/Network/NetworkPlayerQNet.h b/Minecraft.Client/Platform/Common/Network/NetworkPlayerQNet.h deleted file mode 100644 index 62dbd59d0..000000000 --- a/Minecraft.Client/Platform/Common/Network/NetworkPlayerQNet.h +++ /dev/null @@ -1,46 +0,0 @@ -#pragma once - -#include "NetworkPlayerInterface.h" - -// This is an implementation of the INetworkPlayer interface for the supported -// QNet-backed path. It -// effectively wraps the IQNetPlayer class in a non-platform-specific way. It is -// managed by PlatformNetworkManagerStub. - -class NetworkPlayerQNet : public INetworkPlayer { -public: - // Common player interface - NetworkPlayerQNet(IQNetPlayer* qnetPlayer); - virtual unsigned char GetSmallId(); - virtual void SendData(INetworkPlayer* player, const void* pvData, - int dataSize, bool lowPriority, bool ack); - virtual bool IsSameSystem(INetworkPlayer* player); - virtual int GetOutstandingAckCount(); - virtual int GetSendQueueSizeBytes(INetworkPlayer* player, bool lowPriority); - virtual int GetSendQueueSizeMessages(INetworkPlayer* player, - bool lowPriority); - virtual int GetCurrentRtt(); - virtual bool IsHost(); - virtual bool IsGuest(); - virtual bool IsLocal(); - virtual int GetSessionIndex(); - virtual bool IsTalking(); - virtual bool IsMutedByLocalUser(int userIndex); - virtual bool HasVoice(); - virtual bool HasCamera(); - virtual int GetUserIndex(); - virtual void SetSocket(Socket* pSocket); - virtual Socket* GetSocket(); - virtual const wchar_t* GetOnlineName(); - virtual std::wstring GetDisplayName(); - virtual PlayerUID GetUID(); - virtual void SentChunkPacket(); - virtual int GetTimeSinceLastChunkPacket_ms(); - - IQNetPlayer* GetQNetPlayer(); - -private: - IQNetPlayer* m_qnetPlayer; - Socket* m_pSocket; - int64_t m_lastChunkPacketTime; -}; diff --git a/Minecraft.Client/Platform/Common/UI/UI.h b/Minecraft.Client/Platform/Common/UI/UI.h deleted file mode 100644 index 80adb1f43..000000000 --- a/Minecraft.Client/Platform/Common/UI/UI.h +++ /dev/null @@ -1,119 +0,0 @@ -#pragma once - -#include "UIEnums.h" -#include "UIStructs.h" - -#include "UIBitmapFont.h" -#include "UITTFFont.h" - -#include "UIScene.h" -#include "UILayer.h" -#include "UIGroup.h" -#include "UIController.h" - -#include "UIControl.h" -#include "UIControl_Base.h" -#include "UIControl_Button.h" -#include "UIControl_CheckBox.h" -#include "UIControl_Slider.h" -#include "UIControl_Label.h" -#include "UIControl_TextInput.h" -#include "UIControl_SlotList.h" -#include "UIControl_Cursor.h" -#include "UIControl_ButtonList.h" -#include "UIControl_Progress.h" -#include "UIControl_TexturePackList.h" -#include "UIControl_LeaderboardList.h" -#include "UIControl_SaveList.h" -#include "UIControl_PlayerList.h" -#include "UIControl_BitmapIcon.h" -#include "UIControl_DLCList.h" -#include "UIControl_HTMLLabel.h" -#include "UIControl_DynamicLabel.h" -#include "UIControl_MinecraftPlayer.h" -#include "UIControl_MinecraftHorse.h" -#include "UIControl_PlayerSkinPreview.h" -#include "UIControl_EnchantmentButton.h" -#include "UIControl_EnchantmentBook.h" -#include "UIControl_SpaceIndicatorBar.h" -#include "UIControl_BeaconEffectButton.h" - -#include "UIScene_HUD.h" -#include "UIComponent_Panorama.h" -#include "UIComponent_Logo.h" -#include "UIComponent_Tooltips.h" -#include "UIComponent_TutorialPopup.h" -#include "UIComponent_Chat.h" -#include "UIComponent_PressStartToPlay.h" -#include "UIComponent_MenuBackground.h" - -#include "UIScene_QuadrantSignin.h" -#include "UIScene_MessageBox.h" -#include "UIScene_Timer.h" -#include "UIScene_Keyboard.h" - -#include "UIScene_DebugOverlay.h" -#include "UIScene_DebugOptions.h" -#include "UIComponent_DebugUIConsole.h" -#include "UIComponent_DebugUIMarketingGuide.h" -#include "UIScene_DebugSetCamera.h" -#include "UIScene_DebugCreateSchematic.h" - -#include "UIScene_TrialExitUpsell.h" -#include "UIScene_Intro.h" -#include "UIScene_SaveMessage.h" -#include "UIScene_MainMenu.h" -#include "UIScene_LoadMenu.h" -#include "UIScene_JoinMenu.h" -#include "UIScene_LoadOrJoinMenu.h" -#include "UIScene_CreateWorldMenu.h" -#include "UIScene_LaunchMoreOptionsMenu.h" -#include "UIScene_FullscreenProgress.h" -#include "UIScene_LeaderboardsMenu.h" -#include "UIScene_DLCMainMenu.h" -#include "UIScene_DLCOffersMenu.h" -#include "UIScene_ReinstallMenu.h" - -#include "UIScene_HelpAndOptionsMenu.h" -#include "UIScene_SettingsMenu.h" -#include "UIScene_SettingsOptionsMenu.h" -#include "UIScene_SettingsAudioMenu.h" -#include "UIScene_SettingsControlMenu.h" -#include "UIScene_SettingsGraphicsMenu.h" -#include "UIScene_SettingsUIMenu.h" -#include "UIScene_SkinSelectMenu.h" -#include "UIScene_HowToPlayMenu.h" -#include "UIScene_LanguageSelector.h" -#include "UIScene_HowToPlay.h" -#include "UIScene_ControlsMenu.h" -#include "UIScene_Credits.h" - -#include "UIScene_PauseMenu.h" - -#include "UIScene_AbstractContainerMenu.h" -#include "UIScene_BrewingStandMenu.h" -#include "UIScene_ContainerMenu.h" -#include "UIScene_DispenserMenu.h" -#include "UIScene_EnchantingMenu.h" -#include "UIScene_InventoryMenu.h" -#include "UIScene_FurnaceMenu.h" -#include "UIScene_CreativeMenu.h" -#include "UIScene_TradingMenu.h" -#include "UIScene_AnvilMenu.h" -#include "UIScene_HorseInventoryMenu.h" -#include "UIScene_HopperMenu.h" -#include "UIScene_BeaconMenu.h" -#include "UIScene_FireworksMenu.h" - -#include "UIScene_CraftingMenu.h" -#include "UIScene_SignEntryMenu.h" - -#include "UIScene_ConnectingProgress.h" -#include "UIScene_DeathMenu.h" -#include "UIScene_InGameInfoMenu.h" -#include "UIScene_InGameHostOptionsMenu.h" -#include "UIScene_InGamePlayerOptionsMenu.h" -#include "UIScene_TeleportMenu.h" -#include "UIScene_EndPoem.h" -#include "UIScene_EULA.h" -#include "UIScene_NewUpdateMessage.h" \ No newline at end of file diff --git a/Minecraft.Client/Platform/Windows64/GameConfig/Minecraft.gameconfig b/Minecraft.Client/Platform/Windows64/GameConfig/Minecraft.gameconfig deleted file mode 100644 index 14885d535b615902aab99ca7e3b2b05450e2ddcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 578964 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 F{R4A5{fm$IaQA!9IrrRi&$;K`$%6+C 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

SIv89jvUKBIT0g-FXDY+NX2HREZ;3sr z0WPK3uXk@T3LuHX>@M9Et;QF*Bk?ELxKx(nL4HI5?s|XW3Ytl=K(YNG$eX)0U;FdrzT+H5pwR zH{P}`opAK8Xz3VhY1@4nR*(-h&Y?-G+!LU{e>X5l-Byz)99tRvXrp zSS%>&=r9$;Aks?;btL~p zsdYR-${>7Mck~(NkKD1PyMPUwQbZ4?n(?Pay6uV6$=#pOt02CF>b1&fbmD%{e~3DS z#0%sME!{=1dV{s-+r# zFbxPpT&juDM3-)Z^b#peKTxc`bgwEz*Kz zn9E=Y(!~9QA6X-k^-zcK6LT4=(N5=oUt`UX9o*t3%J`Wz9ij`-V}ektm@FVq)c6bY z8Vxbn6c?q8QR3ux>(P*gDUVha6RVcQwJ?&;l$hJsnGaANuEEqKtVmge-|CFL!FoLf zDzjvsR=Q2CBWX4S0wDMT1V3JhrKz3@C+2PoXPgRm?LS5nD?X)Dg$}@O+H*8Swpa+P zLrXV?s3R5bvUF@>Y;t?bLSC|vw=C2|7V?pWn#w}WWFcQ!sJSfELKgCqg<8r&tz@Cr zvQQgYsI4q?j};nYumw{_Dnwa&ds(Q1EYwjJ>Ld$wmW8^=LS1E{ZnDt5%-f8e!RoNm zU4)Tx?dK0Ko;sF3-x792Ju~zP7GFtl^q4HvUlw{?78)Q64U~lfWT8M=Xpk%vBnu6eg@(vNLuH|1ve0l@ zXoM{Ege){t78)fBjh2PR$UpAkV+N`lZ7Iz{V`2#wJd$QEHpzFij;+- zWT9wT2(rHoyNr>AUXX=!P_mdNl4WYg%5vysp_#JKELmu_EHpG`tIURh|LEVN%1 zIv@)jl!Xq-LIu_ymlZC!Ew{IeYZ)B-uvd{%t$S4by%R&{h zP^Bz%Q5LFUp3?X&L~u!#{;e$Zoh-Wnn-^wIF6vtfb`9a&qm{Mi%AKuG71(U|8PuG8oGD9f5toy&`38<&l@m z;_}PlR>3&nTe){lSzKDhwj%VoYSY@XxI^XH@njj0sw`i!v3$vDvJBi?7LO`1$W>+W z`2-Upft0#On#g=@V6(g`3$UO*!)WlJ1RmqkZ9M9gGD952#O*Fi$SOedL9NE* zMSziUQ4#t{C6icxDPQ@zV`5+6L6*CGT}F9UHo$}G0NwJv8K&8dEmO3Z$~GH({FES$PCxz~T0a z(XiYEK-d+k)`3#xlnKbBv#_f5>Ac!w99XY#n%Hrn5SU(!F;wkX&2a@Rttg96mw>@( zWq(yR3N9{-GZm@KD7jFOT9#laOW4SVS3uPkfUYqCHo&~Vu^+b^IIJ5735f)`1fbzC z?~oaLONsoF(NyLB?VuG?kLt^vQ3v_)S+wj<$Zs9ZzvXvKegv>2+@|nn$WJP>@)qPL z<;eVRk)Kpu*6ov@RAAL@ksk-(YUWo5`ALj1o2eUu0;R^*+yN0vqg{KOL@4FXW37pb zY1IU~1X0Tt64*8xUnpKyp0w>k!7dm#y!ed4)Y*)AV@z5I^M=i$>sV{ig=u5J!(v%n z9%jRZf`W<-`)|P!X~xDKEsLYs&(|JKlDlb@SW65yA({VMNq@)hfyLv_tCpB;KI>ey zYYkc}PsiehmNES~r_ai+$VeiF#Bo8!5HDkLQDxDNvba5EahTexU6) zin7~yHK@qcKQ&~bb%??NbSz8FS z(kcwZW+aku7PrEpQdjI5){7(>>;njGTu6)CZZ&s^byV~f8&JLq6u(QF9T0Ijy&WWJnyR9aa@z`W zRb{QPa!50OfN`a{#S(%ZzET#CZ3y^P9IPw#rJQF|Y|20cClL}79At`Ah_;nmF?6g* zyE$JvT4umZ#6Pee0A@F&_NrI1IQbvo(;alQxGW*FEFOePjFN0Eetd_32?I&b#MCX8 zmd53on<{o?VbHLx*aR*!cR)xIsVMOZ@h0#D6N5oQ<&njdaFr-Ihf{Jg#U>Y0><`Qx zOtESaq(7ePNAS(Vn?e8h2Vs}8{KUMf($^Z34qZ5sd7&tkqOLJ73)z$}dAU3^uqlWWf+U2S?g72j9{Y@(8Hb7b;kVX>dq9qj>38)yB z7k~#FPZ{)U*Oz@?o*LdX zwEwZDc4l={hfRBZ1+0cAKcTkaiTjyIjwY}?dBV>`C5EdtA<9^dR`q|(@Z=%+n5g*x zG_W}}T3&DwvgQ$|Fu0f|GEP^GOi?hSLpjKy^pK)kdp^amjbI2IqTYtqJ-N>Ike% zHzz37%1AY=Ol~9K`k;=+Ic6M2On_ewPBur+Rpaz2x&zM>pTHQcTC^QAIi5Tk1jiGc z3{=zcKV{@JIw2W`qrDNO+i)y1TGYhG;yf--h2uyFdEKBAf)RP2^fh^(kOM_D9SB8< z7vOVZaymhm)s&x5VlIa>){B@wxkm6<6;3+hY%E&9;Y=JZ#8~Fe1#I|f)w#-;818P; zdIG#>$m>W+kPgTBMLGk^K~DZA4+Y~?A{{NHBd!1?9cI+=Gmbo~zc`mePmA-z@Lr+= z+M-@F6JT0=yFIaZoU{v+u!kyeoH9C09Ujhs!x4wErLpE9fDoK^jm3~bV*m}g5s}Zy zvlgEdQ#^T&%v44aEfDyl2$d=vQ`LaTlo&yHB-MdmWi$YU!_XnhP@FsEzDy_r^RrYw zLQVcAy>1VvIJq050gTD#q zI4jvL2`BT;2`B4zdtxG-Rm>jYtge@Evj1AbS@Y)!XYK6}4$f;?7%m-?2*+^=m}*?d zfJa~wN{%QlV?f^EP;VBh!y+*9xa$T(o_eh;%+ErrUPFP#6)6h z>}E~Jt7G-bxoRBk5OEwi5-gFtQSP`#IHgD~DLD78x4NY0Lcr5uhoLm`DgiGehZOQh zsW&_MqiCYRB*6eAe-!fhP>VSBFZrXmkH)$DNX+#xJ*px{lv`wnu_Xxbr8C@c!2z2= zUEmkevcM0(htMe)aC!h;BYC5!u;LIm)kk;LN7J$XP_>8+&PBqEDg|RA!|ESiH=9X$p@<%Uupn(a?Fd=#{kPX_!gv$fp-i!Lc*Y8 zCwnm)FQX@-Nep`~2fij8{MPJwVr7eR_mi$lESqr51g&yPAFIfN|^_oPsURm zTpZzo@anDepJrV~!zUTw;a(?LWgyOA4e-Y8?W;8~E7WyQ%G zrS63DtbY(m)sbB_=7P}>J5d3|CQI}F=qI0)7%>QgyhdX*k>s`p*AuB*n2b?$)HNnj zIY*_n7(|+lM;|pf>?TQ@5J#i9-$~u^a5@Q+qzhs#641%%1c&w@vnWOCnwd$E(+R{! zayn7MK;p!?6+BKHNxp+Q#2M};C<7~qC*)?4(}qL`KQr$@2ttu0a#?*$nvB(f0%uCt zhm#5SG7+DGq$@GH5Uol@@?HpdRisJ`gX3EWKz^My#}p=ciJavq(UcJukorHlYm;w&f!hH(_w{Bi$j%gWKjLh?Hf(3@Q@Ces_wdBqp7t^ zICBcu4#Lvi_BZjsF?lX>jKe(uv;Q$+{A0p^+ge?|CY(r2tmSSSE4<7^Yo6M7+b%&~ zTO2^viG8>25I)e1ke)}9gr(Wt@aBi6vR;_Tr{Qf5&1Bs$Q%%EL8k)=cVI`J^H!^rg za+F4tD5K#m3*>zPK~7^9R~p`!KrT4E2WEO`cmqNca~G_n(D0T63npU88>O}vN)yQo z1vd;q=EeS7SK9}rrHyDRYQn-G0IMuEf~L~002_Ik1B&lhDIaYntO-^lK+E{rMgYfg z*p)&3?*a8ceDcNV8of&Yf9-}TH@bQX!o4_MrHAgnIoI)HBQ;YMBI*BCr1OUM-+MGJ zH6V|BnxnCh?V|*uUO~mSv z4lBS@bn}RwN`_#AhRBn-+zK!rN@r~N^~%l^Rf!!Hw6VC=!@%4IBdRnPt*Et7`g;Y@B`eXmZAyd7 zrebwa_qz^4Cs7830&Ty~Xthc|+g}Xn3Vj125rE3S!$gfoW@o~U9_7&hls)`< zEsU8=07I;~aIaAedPZA0rIzj)nXcEppzlf@p*xVEAELXYLa4LTG-_0hot;*x#t6t7 zU|W&0bPM`tstWfkKnEfrh|B}1n5yAdKwvvYCKer`iRvWtz({M4^tg{etwTMb$YRYK z%fr(EUxG>ufKJ=RFx;O4EJvd)Jzx_7;-<^0x>&2j%9rSF)&SF$#+j!9Ha_1sL=nQTO`M9Wei|07z? zVgql#$8}TiD%JrSQo4L^t_|Jlq|R9=cQx}FC()}kCW&6NS?G9Zhoro2T_#_ljXg*dowyk6=Wq;-eY@&n#UZ;rxZq#M$%nfxFUdg z4hC+~Hyt;V&|O{98t!=08ZH?~_~nII+c-JXS|qWo2x1IYmP>bC(N%z$D_DleK;k)G zKOIbDnzr-^EijU8!8R(aQh$L%EM%f) z4pw|nBy^6rKoYhi>)Jd;aJ=d-IW^AsDUEf>~%61LKRUHt#BAo zG_3^0naOk_-QER^5H7K3M$+wF4bpBQYY`X&hmzmVbVuHVE&PspMm0b|YXql20Xl^rc z8%y=*#L;5|$H7wa7qxSYwZQ-+gSSLDFqS|RoQ8qxC3^{M_o3==Y2|>uCt-cF&@tOJ=(&`E$6!p2NBPBRb@f~vG3G?QqF z{et<8Qi&6K=pxh*?Se`VU~M*Kf#Ib7v@`56n{qaWi7>kHLy`}oG_h)s1tdP;*0yG{ zp4|5YB&)e1NFNe7up5m73bEvVaxyn$P6*LA_7&P*(dZ`GQ6M!-tQE7u(i+Stb;qA) z!yzowiWR9Ql2Xlv_{|3fKoEnrtp)dqhALw)$5kXPTP9vOuHGZj>mqAOU8Pyg4Jzms zFl{lY_yXNw043ooMmYxuE;wiU9><32Ot_580Zl>@Kd>RKK*AN~#hElD2ovuRuA2BZ zqHqR?_5eRHXNfHeKjQW-x>OZ|gK5QyOe-p~te6NP>-b$>(q*?)7oCF%lCs0RQg{3f z_88$VL}@O73UOXX)nghg(xQo606y9n;2Jc*kMjblR;$TH0(&i!i~9r+8!qaAq}+8&i@04kt-)*xCIeuEFm36w`ZQBdKV2XC}mYLr0mKT1} z7xm$;8C@(rFi}gxn_KveYXk!;X*9g0#TVN|X#PUDR@X`q4R3L2D(i@eEE?YIBJYNY zHX7da(p&}&D}gk;{iT_#C*8OerncjTk7R{`A{)DL$kli`qL%wc8*YY?#8s$|p&g3E zM&D|Q@#4D)tFgtQGxH^tO|86ED@==3wXHB-RxgFpEv1_@bQ2i&$G}a!PiX!xKKkJ< zIb`4|4^24vV>Atxt}LhhstB9Y40?=2A&)kV6gHV=qo8@_Z!e7CmI*w8!C(IH7&{F| zlAix)YFmcCAAu5Ni9xM&cQ@@|M)PgGhAc6z6H%9tZvcVL~F`22fj_4`rF_4+$8bWF;uBp_)M?lm^aX}d860xtAfJ63|0g^VNbUzLgqe*%Zgli`&mS;dPMl!r~lh>e%o^7tcoS$Zo9y`foezacFIxA@y(i0$2 zVhlh|J{i4-DzPI)M`?Oc7r4PB0vERv2+U7_(B>OZFg*ZrbMyT0JTH86^Qo+j^z;X9 zIHALl#%wZtNNyPPYD^?_O?dhP-3U=mQ{gl-nLI{tHw*ws2df}414*qwFMpu>gjIAY z484~ChYsQm6PP}vM?azgKP5R{ko{x{yH^e|x)xn4U9cX7Ytkhcn_;$;wW}w0lqwS3 zhD;UplEtz+B#Y($FA5UA7fM=GAwn_MdX(>n86t3ddYp%+j) zY38cwFPfGr^=z|m1^yBTn;-jt!QfT}_On)|*FK_bU;D5)S9k|uLBV@X;&41rG7D1| zc7j`#IK-aBiIeF#Jq@L-`H2sxx9P1O;tbOB9!SKwe>&z36MG0>tVAsBcyxe#JHYQq znG41f3-vSfxQCg$^r}Y?;HxIHz+ccvA!|2*9A2(Atfv-E#JmghX`%TLdFkc$C|v%=1i~% z)R%IG-4_Tiiqeg6(}Wv^*`NUQSxQ^=_N4#6m$(rY{pk?)pgV{48AL^X6rpM`3F*&h za1c^C)1w|ybO5JxKOI)H)&JL%aGnKB0Fc0iG-yL>E{X0)?b%d9z7%+g4Qo4`RkHZOS88GRW~W?<&p$Oq8)`*1d(wdDg) z`Zpc}S~fr3;mo}#w9xlE1>p@Lt;vr9ZzDn5FGKs!%o8UR@J<{`hnk=17@~uoUux9$ znGT-Gq_^jsnx1WuRQqGapa><7@8Eor##XgoXZ#IzFYq#r-a(;>N?LvCp^hj31VRj^ zucZ>3S2`p()>7qrjHZ(z|2)!xv)}hHGcf*Fl=&vyV2fV*Kk-C|`yd?t!eSW&FT{Ud z=deC@^UtMEX8Xl+IEg9I$p6UW9Omx)kLc~W{|07|WlG;|g*{hQ)1?@uN!{@3dM~s3 z$NW%K!#hb>yKr|E_8bou(r9>vJ%1O&LJAG9rzh78NLgk=Xm}01xdV4iH_snO0R${W z(C|um59w(Rj*3uCt!tEgX`@v7GJl#Qn0rOk`8G!@Tj^aiIXqY#BmB%V{s@a!#FU2T zIjnK=ayF{@FKesjU5DT-U#vb%&)p>4#>e37pbFb&JbvBC{9yL~iD$T7c-L_r588Nd zXyD;ukL_Y~4<0S~M#So*(e)UQQ{O7+;h|3=#{hURz!hS+CUS0AX&z4QX;o_I-m&wg zvuHS#CgS<+8PL8reMW_2rD3JTTBx^YsI=3RdeXhS4btNDBdR<6FB#h6|q?$)*p3K4{^{fOr$oVF>-VrfBNI{ z3+!}JfaH`JA_0q@9EEP2!wl!%l31_t*q`I2ahxrtx3ZD7^bi3>%1srDlT_Ln(9_SL zvZR2&&sv06iPt{G@v)|2yaXOdpMjH;lpW7-OW8TVshLSC^<31?Q*kZQAfDHn;18%1 zqWl4uNPvK9AA+9YcrG8^NTLJa1J@$i>4yY%oI2!9rLqpgKqMSUlI;YeRnm7m_%uG>>Q@6gbmCw}2{e02dX&76QEMwHVt_oKQnxuAa2?z3mJ~C1P5{&c)$W zGi;Z#4pJEobct4K=fdk4bra9B|B!f=|9RqB@#lyKuW{dkcyKk+oe~eOMzRBKIq|?B z;5LY7buHq_ZW!WOa|gt;_O^&856^I`qvxt3O>Ee7?tccHj_HZ+5ujucFbtQa#r%nG zWHzr%j?8vtf-3(3E65)fgTrtm3YaN=)zLjHT!$z*8fzi`!$!;Or@x=kwlTNFCP9s|dK+8r*`)D&^+ET=A+up4kAyrp6P_5;!F!|l z!b5N)QV_e{Z^Qrmal_>J7#v#0B6q(SIGc{@hvF~3@bu(L`DTMmfWp#((<%p(=8e!#y%;oZ7!tUfgqJsmXNG8YW*-%JVrvk8ESH z2h3>hNeA}@+;w!TGN)Ph5jsg2z*1cdX&_uhv`_j_kO`Mg@R~Bs3p%sknk1W>;(JW! zF`f?bLrH(j0A)KCY~vpbYOZ26mU&9?#5~ zL2D%mccifQ8A2p)(bV^NDng6X`gO&gXAcciMZ*tZ7Gy26ycMEVhQ(4LnEFX{;{qZV zu7<;lAsq5_^bG#?1Mf;KW?F>S!~!k)`R1rrtt#CB2O88Is3*%rL@YhBU0=#&IE;}X zz=a1hdSmO~?xjI;IssphOm%p_Jce@+n&75ddkj-?&{+@T zgAw3TsahI*?~(8Z(-D|ZTNudVZ+`!gmjxdGBWipfONVHtLuyxt-}TFnnwf+PBAcOb zvkRpK{-0C%|J;F8#~nyMHnd`9F?ahOBwRbh_tr$e|0Ak>+bLz8=yzMc?-NLR11NZG zrg_8b_`NN?FcZ*SQ1V;)aMzUlR%BQSq~W#v-h3Bj%l8{z)9-2OgP9!ef~w!tgS)2c zH>1Hy3JtI8H}?Swig1-q85LVg-S0h&w8%QB`o_b57rdm_(fih1(=Q39VmH$jNZl=} zeq29`EtKUberFt%l_GA=YgO;JnqOPJ?_86dQfB_Et|se%DH=+C@0z5v znk|M)%ag@R*_k!#3P{;sy?tBF`ki7;){%<^`B3&Zty#aUX4S&#Gy@8zRjeS@w)I3t} zkEo7cUA+^KDOg#(aUH-U)+DUESWqBVXQo{&Bp8WOj_S?m?55)Ct%Wr?#nl^gC_{B_ zflXye>~T|Nm(nt7)@PXN6#HJx&!GYqXi`-YK;^wz#D+*EYqAOADF8fgHGXH!nr#?T z&8nT^#RI#DQc(jU&|IArCA0R``3By}!h`$N1ChyJtVztfl#q$8-B;KmGxXnl+2FiDF|G|s<%!37iRKK#bW`CXy zl+#!TiA?yowl5L^U7{E{DAU=@n#|;y^_wXdXv_*g6Cth25NlTN1Z7=H0C<+?`HPnl z3>Ww30!zu&i&ui)vQdGV>{ex9qJa>y0d$ejvZnx)!I86m;ic6pZTh!_1=@$n{*6{V z)`gp;tZPj|+{JeA$0U;DElhvgPd2KS|&@Hl;I?e+O|AyH?ohw+C*(z#VUIgUAWo?FstjM=$vAkT-gmt z(d(0KT3*8j*at{0GPQ-rTGpvva<;p$*s(H(2A=&+0Qso9uclUY)|6jPY9dGTQrOTLs1uAgIJZ?=8e z&0H^K?hr2}Md(c z+(#-w_aN0*Hp_My+mCf_U+%>N%W4v_gn^$eETjeBTKNI2nfr2Sy}h(1y?VtuSVwA? zSZ%OjV~5yy)W=uocz{rQYS#_Lw&G$D+0j5;RMFR3nP1Z7MN@^IE82z8?FIQN6Q((>qD0R#=ip zMN=ss$v{}u+w=cm!|7UY@tayY&F+&V1z;{2Vy63h}HE*00TTWvMHn1m2>M=UkhtY2uBW4~fO z;dz0A$jjvxX8S3a0SGLVP$#VUkfgtWTNfMHqtD%NaCyp)wf z+}&ag^1HaN1bZ5efmbph-ka70vIo_lc9}Jk5MyFsrb4g@wU#lWo06|$oypI?De?#G zbmG?lOw=#fhFoiMb0F07&`-c}nt=pPk~y(F@vRe2y2hGGR7Wr~Gk8?+GbFclX@q@} zQP=MT(9EzzD(prCKg@gDE$lyF?)a~)+of#Nej?-2(p_S8`ZjEacpa;fYBFygR^r2(8s0bKua;rS2m3ls;mNDJ zVL7i^YxuiA9c~K|p!ZVJ!R~kc#wTA}EM*<2&duY9y6g8onWQ#p+use_FtGlA9t!`* zXGB$pg~?Y=EM{hNw~b6Ub;~^C@AlnKem6nOI_dAWvB^`?GFoPP!yB5+Jus6{!<(7R zJup+tUAX(ngas&%&8tDf8<{+%ouq{n?t+QQ)B`gqG`xw)0t1t%(C}A1H8I1$N(v2c zWHN&R=7gGk2WsE%aP;`0s449u>hbhSuVGRENKW2DpOg$Ir2@V*Y+-W$fP+ZXz8xjGV zlY1~fT_%Oe*fc>&S3jBDDm2971cBNd)l5RM-p*3?j_-#B)AG{ zmWb=A@b(IvMm#3L!$AyIhr_!hat>LP%yrQImM(4bF?SCR3{S=20qIZ`tVzwr;>4*q zhi+7tUeCZ-$cWT4SdY%bWgcctx|5f#!^XwW{C=hxc*#Yag+b!xj~E@@m2G-68|NcY zVwMKJA2f8Fo{Wv)FNa9QkX0&&7GV&Lo&o2HMXb|PII}DTaVR)c#C_x;Gjs%}C<2cX zcaY&Ok!03c|_(z@ z{J?EGn@nxsGA3ncC~n|Kf8hv55i#m;e*z^=tK$U|4pcHjjl)5(tRaTaz;G_ zuwoFN(wW~msa)(Y%fu&JMSU(G~Ozi zi38}<=8(e$PAp?4W6oo`^XC%4v%ng_C16sBqEmTb3=-J+RZ8@_k2LYYxX>W@G58=I zssl4#<7EOcv}I+g}<<+LgqV26^8S!V0K|@Fef->fVYvOhR-N4TX2rCVdPXJ z27@QUoKR2pVm8J~6@+&Fd;$>!&R+v8nn;{(L9~et`Qzd!TtpXx2Bbg1xj0TK8r+{- z16=711rQ9L6owt(zg_<^kcSPMv^Zk)6prIL50hJlIEmJ?2@$x;>O{TyPns`Uk{GV! zYC)GO!WV!xTZAc{Za1Ibok`b;^lkP&INR1dR&29cH0y$SS z!CjO@_~axZPNHcEwR;_r=h=`a^q2^d5NvqmvFMStBpkbVYazra;Ef7KLcX|ayupMi z!sV1%xJwK!6Lzy@@4k zp34I6Kmt3&0;*AxH$@|2Drg!ibC)0*GX4D%qUk+p{CSQ0xlzj|EdR`!j^d8W)L+gR zLg6?AmALmPAeJIImT@Bzo;_$yN8$kto7ui3i-k3>WHT`TGa z-F?L`KZ3s~B%>Hf7^5DUOTrm~u52Tb!rmj&uF@I(Axhnxzq$K_y99~<5#I?DUg(m) zyY4eVcdip1bH{O9BMV-y3e!ja<2CV**F+sUZ9ME~OD&wU+--$+GkKr>M;s?^f)tC7n~9r zUXkr>?ZI7hm+-Xqfm1`n>#@D8J>XX))$*0FK2#v(j8uiz(q^|bzx`ZGq<83qTlP)z zeqbbah9=c^XV%nQ#wOZES*@?Ftah&0l~QqF4b;`{6-%}mcONotSz*jb|39X%cCU(C zT%NqIYU6t2`c%?cOQWhZSd7F{TcugKW|-L;Q#QBnDd#j+v`n0vWlI~uM?KX{?22!0Wbt9EX# zNLg##v;(^9#+7?_8qtMKYoWLHsme+%U$RkFK7qMcZrx>!&o-tn0^Xpurd-C%4VJN# z8RDU|?o+XHYk5j4HJ`Ggd}|@b^<8mV#o7btx-`b}tU}|)#pO#<(8~))lc-n{yBEd8 zz9J>$Y%O1ROacOO;C2Y3A=MOInoqf*uck(LKI8H<`eRc%Y68@%47pXQc>pBkOJ;uM zix(U7msS;RuG|egWk?XCv=rV^DXq*9SCJcEu|JFc06;b$Lami+Q&D9_!fNA&Li}B^ zKa&8zn6<5{x}6KD>m$xcmb$e>Pbb?%8KL+BFEj#r_7L6k+iqWkY1H#sNA-< zYGWF-)PJUqeAc>Z(I)Vns$FZONm!9kSg~+-MM^Hs<-O?O(Iv)Z`$6c)0rm7Pv+rlV z)V+nowyH7?R;A^FSy5LHfU_Px0;p7M+*!3_B@V&YlkpJiccE~#aa~45-YbWe9uy>O~%8U zjSCNp-E7!JT-DMI#$7;VTzS?O@MAP9P1Ek8F(c7JcNjg$L8Qh@n3q(~g@SZr9>>tp z|7rurur6{ASCL(8%uh6CZ>46TTSg~9YvrkcLHdQFwDQASpUmCnMS7w! zet(rA4%A8Ylwy6{o^M>Z*~rsyD7^l>rDHY9eX^-ezG_0BY+_cn6A%hzFDVz~fXd`T^apBXbHPQM zh$;MN4oeaU^vmY-^tD(lp=35!!O;$I;{diPsxq#`xN>hr$|9(kO;Ht?YdQJGoGfUV z{Xm2jyLXlEE-K%3q;k>risU2+41~bz5cF<7;+5(R9?A>6$cmF80 zr9;NG`BiH-b-(KxXJ6A+fy?w*0hXs33-|wXi29#H)O8-BmJ^Ga$J}k5^G!5tp6hq} z5cN&nGSB$Ct#|g4^byv%-tcN?OBc)()bN^TOBc-4((s3Y^76^cDWPwVm4X`i_Y0xqE=c;@R(s9uB}`d!wHb#gU8_;K))`|_vEA>rsY1XpJaBX%V|$mn{ibw6xN*$zr*({ZmeQ~AhGuIhV?G~`7#uiZ z_P-83tB%R}B(rm$>}`!Rw`cn=xYBXt<_G%q>3u5CB{5*RYx@jUxBhYQ?Ec=K&aFd2 zB3C``*!$4;@t1x4BTtRI;QPp-iLFna9C~(dk5fnX_Ly;S=C(=O4(boj{OXa47jJz0 z{NbZ#KOXedy~-a(oO`ii-HYEAUK{Y$#OI&ym7bpd(U~*;Gmnh_;>#m>J9dnnceF{% zHqBbL^?iHki4!NDJKXt~7pgzq^}1V&p2J6sNLiVc_10^tEsXo$AF$%e745cd+mep|?$dNl9Zqu`PXX^;B;m_amP)lD!^{L{YfBmug`LDa{%EI4Y-|y(Zj?Q~} z_j5Ni1Z8@T~d)uJ-TliSPljAn9jK+@axE~YyrzI#SYe)aFKmA73qrX4}Z% zOs{ViJUsokrc4~@{?l*&9{l{0j2FLuJ-u~%Hl_ij&iz;EZri>CQ54+;wM8XM~o!ZLoJ`B+H$^e?;KxUuQsuiw19=a@tL z;>KV9x+uk;eRCvZnSC3KY5dV^2sNIUMN5D@VZddg`msVZ=75I=JhvTO6nW3 z{e_2J0#*qD&!3B!;x2k8pLn|I)2!RkCF=Lx4P)X0*)vVD+75sFrH=P4yvNn^_@d79 zUg+?hmk`j$@XMhiYkRd$S)+LO%<&F6?Uq(-X!@MvgN2K>j1l_2$aJm~ieAm1uxOeP zFfO~Bzhlk!>=}n?sktp3U;X+>ih^w(IL7!H`@muK_}m8qXIA=nZ9WGu-xrv?;wmc} zk`Wuy+%Mj9@HIi{|9yhfxhEVQb7F@SH2R=>M!VdNfpb`^KEL|xenVl%Oey~Nm8aJ^ zfB8jZT;I=U6!d((P5Q9@)BL`7Qhl)e%d)4v*Z-mT`0S>~4G#uB>f}7yd)FK{ zmtz%WbDsY=e0aYei4&%*@q9feOt=)&Hz+hr;rK$Yhg!^da^b>-hjshInuY=fO$Ud+ z<!zYsec(V7m)x3tjZQLC)8|MuD;zR%38=*CwPb&N) z9lx!qis+TZ&JOcB{_YGG>+0SwFf{KoANIjHU!Cr9|9}Gt%BihG0w=9{e`{l(PvQ-u zf4V;JXz~w^Z0WxpVy=b?|K7M;Q64Xl(dP~Jg8n!{!U8=7Js7IaIf6a!87g~ayn$SxIt5Vzr%+! zUq3UYzt{H**EoHw2y=M7-M_t_f3Npcb zj~*4;s~fR(lY{$P^7U+*#EllOOWS?2EJsA>Js zZlU+86JIzSIQYo%!4HN{&~)hE^y^szo4+r-F)!)hLxCjv4%R#N!1A$utvQE6^(D!TaoN+I0a!iZd*Eg`Fq~wp599Um8act{)Z;yQe z`&xJS_`|^Gy+4j0Jg!4vfM0)~qn^oU`>j(n27No`?#v5#VAgxf-&K!&;`LX$@B3!m zJ#RLuUeNWm4Lbw7#kP8SRf)^I?3i91LLc`Z*jVv=w5QYd{Aqy|er~`0-dG*@uZP*^ z2d;m7s!V&~&A{$G-&@u3wMVX;`r1qN-M7CiFZ!u{_s<7D_ftiQIB8Gb$k9(7%IP(F z*>5%5#yvmFdE@c4-V<89|MlxXx(gqOmBGPh4drjHaZ34FQPA(P7Ry)s^wz3b;iF!h ze(k*$KOMbM-t6@L>LI62t?%B*^POc&UCZA(k#IHi-HX?apD&y9d2B1skkkni%13^E zqJQ?0*-Il&mjr!u=xCRgE%%=?l)ezvbN!-%IWv_%XZpJ&DV(0%Z+PbXqUP=iNhy2T zFGWe!56_xrtZDk%$UJdDod23XTA%v-x1AS4OFArgd)|mE+KSd@zbmO4;QSz-(hO=!TSQ# zaSqR%k83`Aqf^4rp~GKo!3G_# zzNg+>(|Kg`bL~IdvpY`QGBQf<%-&q_LsTQ~VaNuR8a+Pmbs*5~i;Yf?PYoP6x%YB!w}8(!O(|Xc+W48i zg5ja&H=gMu;?5D7*W0b> zacutOq<5YvdbVBm(dYm5?DF=%IK6%0)xC!!jhjavYc*rR{l~@%7s{Vrclo|Q+Kx(f zPk1n|Q;T_lE#}2}`THr{wtjp06Bj0KNS%E6o4wyG_3~eSy3c|xfBbl3&xp64y*4uX zryct`md!c!+xH7pKW=|9zbai|hrXGSG^MEc*?m_Ydh65q&*p8qx^~>mU!vzs8=4gP z)xjrrKR5cdXO`r>c4q3%Mg_{~^%GY8U-I1e z`IiMrUK0mC{gSu)>~FJ=Tv&hPXwUo3!3Z48YR+7C|LANG6QA0?{j;D&<1QDr9W*;& z_qj8MYx7%=`Qh!4&Rp?$y5P57`?}7`%v9*QqO?u?{ zm{`Y?xnAGKJRIGe8Lkx`|KZ2+kGX1FyqVVG+Z9fGejj%z??&LhYwu?5s(N3M*dp|^ zC0jBY|4YHX8>#mgFvIKA87DW@bH7e69QQk8KQHfl_@(h#JDgp?hBsK5v#vW|%5ncM(e(n2Xx4gNs;(^d_uk<(k z-bzit1n@LF-@Oy5i02A*=<7tpff#Kk#n#y2|S zlF$fZ@9hoJJTbF;)QANOwugSVe&HWUUY}oGe&P41 zqzjkUbvN6%nyDyGNXJ9?W#oArkVHJaj*Fs9P**_+OfKi;vu zfAWNmqT@v0c|TWtH-B!#-j!{i?Xvlei6g60V!JreT1D?o&J8+ zBI6I+4j(rhdn^4)pDS+_&oX{kwaB<^mFBHITh?VQ+VX8?S=UK#75(`B6PGtOd*Ms3 zqXW9Tf57tZ?dToq8299*?q~0bi1U0n!}IYZ&)NOwyCf(b*go-@%`VP0r5%pNe0|}q z*GF#otmXKrp9)1TMYDh3x-#cXmm!62C(<6da`vt3o%;PK6h6K8xiRyKMz`B=bjnLV z#;)1<)yj_Q$7Y_2OX$9D{`J^x-OhE6{_?|?8{AlV@2$I3*=O7bP95fVpkv#a9o>I( zNoe2E{hjU~PG9ZpQE+@n*19P_uG4J@D-L%ye5c%+d9I+_u+&fAtokNXTU@C>z3y__ zh3}ph!=HHYlyS$F%Re?fz2cFv1A0#B^yMGFrsWLWJLuxQ50x3T8-6>(f|bES+XAPy z5%Hd%dpkeT=!-8gxWL2{TTdu12IPI&i5=hd*lVBv_T6OXYGt?Vu;}=Gjy>Oeu1jII zuCxBDUaHH_&N{VLGw|Nl4<7Aw{o1>kH%?#m9`xPt(=W_xH(K5Q#d)WX&3}(Yw2esg zJOGQ^mzRe4xr^?D^v9sH4X z%xJ%J`^!C|4W0)EHOfiyESOT_lJHXEiQXs0o^5|_a&F;@1<#&qG_Cchb57${Og&^g zy)4Wj?DMHlJ)Fz>gp7MI>i5nQS;WBH#Ei#F=T-)|HLo&w#xg@Y_Q9gweuMmm_kZ;J z3C!^BuLHcDR(&_INB&f=jHkAIwxhhs*V#^AABg!#$aT5=YN2>T?VP)Bc~Uamdm7ca zB+Sg2@KEe=O=ZBW!ygG>J$&$qMZdOkd+_|6 zM5vRzuk^g<%I|F-b%^mk={~i2z@cv*X;f47q{rvqpY7OajLWG7IkC=@g@EP}!`}R^ zkMF0S^b2%pY;a?-9o*->Fztp*!q?tylUYEY2XCzTWl*O}hmN{$D_`C$;Jr>AUC&=g zJ9)B6-x-E5LrbPgX&lgzMI?9^dGA@z*!;;qct_k9^3w6`Gu)lsmA~rVnRicyV#gcj zYXWqhO-8d5hP>UzA)#aXvXz~?u!CpAgIpeaomE!)y?S!k z8?ndVYBG1@^552dAv{p*_sqq6bBc1+&5yhIw_5+^b9t+CKU}@lDO%mZXbVkSZw-me&tX1voF4E6fpk{xYu<8`MW=wDreae<8m$`#kcwhac&+wY6(N!9x9`>yi$i zFK;~PVRqoS=ddHo6r1K4jt{Sy{faTHhRt4aIb)KE}yi@WiHbLI<@dC(4Ajb`R>Qb1-+s1TsG)m z;|FKdxW$Cdbj!|doPFH6eQco1V=rh+o)mK5YC7s_dB6R!ZN1wZYhoDib7Osr_CD>rTvYrpLa+t7cb(zj1;Mpnc{F00hr*t;9RP>)yGUux~6DNH$r+v`5AtL)UGk3S! z54oz30;YCX-va#4cExFv5--+O*&-XKLlpFAPAt><)B_2s#N zQy+eO{i7|Xo-K|(Q2C`em%V*GAm@?6+nwIYY`^>K8!;cT^COxt*A>2OyMMWpt4F|n zW8O`f;MbD{Qlsvxc#DoubS86})t!CeAoC>y9vhTkQ z@OU6jo6w3KS@&Z=H-}$;9h&yQs;Nnuv;F6N(zNpY5chuZODA})ZOPhp%jwI0UgT5M zqj|Ov$X2#|xpiLKc3y19qZgA7eH=DWIpD^5m!lv0ozVUC=0>;g#KF1*Vc_|_Mf3W# z4?YupIB>*QejcB(PekMK19RW;c<@1IA*QgI0~`)N-g^1nEqm79H}}fUMtfY@du^Jr z;)L8+-Y-sUa@uo77xC>geKvY5`XhMQuti^g`p!C~ZpNtWjhCUR=;pjyIA3z~`+q;= zklQQd{=t1&`RR^Z#uod+f_ux5pCOQv~hQLg1bxO?k>SK5Zr<`PH=)d1eXMt5Zr>hB{+m2 zL4#|5-uiF;M}JZ^sG8in*1cz+z4ti>U0M(#s*1!6kdhi=H_)QP^~T{F%U+in!B=vc zMMMGLRh`>d0U@vLm4tAEDRS%QJ(fNQ@e{oxVbQ2XbGe`NAMX1*_YXF}3T;JyZp%R6 zW-l8Q9po+fZK*x11aRO5w(j!bi8}g(Kz_WAK%hj=Z1yY>gQC&ppKxm)LfITpEjS## zDAtLIB>3TBe^O9e2DH`LhYsCr55S(p{HqDYBv&GY!jSdEzqphATo!vJy#OUSb=j}d z7GeJ{^cmIG|I%ke0m!SV>|&SALUT!v$W&#p!p2^M}86yDiIRyM>!WKd4}cnVhf)QQuRZt?yq<+Fr&b z4{<_ZNk;Ym4z=PkPe-x@>p$53INl?AM;4G`vJ{@zSdnZZL4~LXpQYJ@@2#URv))C4 zX3!nRK26@o>RK?=Fi&)`9A{8}wwS8$XwXgh{3y9Dc|c*{5;$eE{fXjw@@TP+Xc=>D zjO9emUkgk7pB*iC4SaRH&tRefoyZsXl&XBN+NrGK9C}3ggtXs-sjTgdOuAr9Gm4X@ zW*Z{jYT;0Ph1pASg=^1%iebTo-%9W{V_ZS{>!t$#50ItBPq_Cd7S)> zkIbZG1#3~s5&8&Bs@rGp!D`2{$<-9W4e!r&s&KG3KlVmsgO!iu4c~EEH4@QOxe3pW zFBLaiiW=LA`IdA&-oHIMB^q12G~?UVfn8h_KKc4Z6R`RmdQTZ&8mStSiAgi{v)j;$ z^)vSIcH(T{sGTRcgoaGu-^pr3`KIOR-wmrq3nm%-#xJNkPjuPU8W3&83wGzlNuEj2 z48zX;mh5a8oAzmuIj0??MaQ?q@}Vh9Z1)4-bl}T0``c*^-I_(%Utg}>*^MyJ(WaeG zokZoBLwJcfVy&36#i;d(9+GIGve4aP{~I@2QyJ2S(f(!(qavPK z6j@gjCt@c@zHUUU<*?ff>!O%f-8baSzPT^ZVf*n$s{7=d+EJk@*B zXl}-anKoq_$UQ3B#9C~$y6}WpwZ*Ac2|3!dKO7e_gLjMms=P9UFL7CQ5bNl$ zz1au8zkhrr0wf!69(os+fDj7czt;u8%7L*YrN|fG!kOQ%5pp*=1;!gJ3Qpx567YbA z`8H+}o7*U{D71s)KQwyC=T>u#(UX=W(2a!obw~*qLCS^pFK6DG-Zi=GiKUAza@|-I zp*!{2T))c-;O7dqvEu3h%sGt1&J5~?Q$iWsygx=8m{P%|648m+V|X0-;m}w5m#BPW1aml&ztV9XPl!i_a$E27 zp>=AFq##aD#f3=hg&5&33WOA-IGnoMe^IIhmM25}glLH#6^|(3NbHo^hn@mY*Vvcr z-q%}|)ss0e(~?tk-oBKK1J_TV6(G>xOG`TJvuk-Gh+eJf+F|tj}H3OfBNct;{Iiw1uNe_A`l(Z{i=ifu0q)V>RdSr31RgH{bY@i_&6A zd6EaqcrENJHmd{1(FyEB1nM|d>HzY8A5bm-m?<&prhpbFFjKd1e@SaCUO`Y)K?F<#NodXgAH42m@Wp*z_;utQsJ>4(EAvKR&PNVEBq&Z~2N zk%$N5l$G+8blX16oK#rjyPCO##DA#Xx%FoZogvvr4w}~_HXM2b5dTVw_Vq)=n3j8I zMuy62U*i6Yc5GX}U6X#X1>MTxkVEz47xeejy6b^{YFVPVzq7x&{XWo1>c6PyXM8-*7`ZGr1f6Y4i?DdtKa zNFS1T@L&}ePlE7&>9c;xTjbet#ebo*bSSZkRka!(>5n&hR-DQX%PIesrMVnF`aVv} zSmkGKH6x%>?{=tON-!zopiQLA$YHJNJp4)TvACcKZ~d9m(&9eXu=@qONc5A-H?`%|903>kPaTUe@mhYY$FTBpm&}RIQMYr#S($+kt0I4J;dzR! z27luJsJ~CGyf8JiNbfqYYt(9-` zCwYeg@!g!)w4IjHeQ@UUb&l|KAVbPH87OU?JRtEysS%{m2CyIM*1XUiBcIXRQvws| zC3HBBpBQ=hIb=T!B+gjHt{zE)DJ# zOYo1dm_#&2=~cS?gpSS^O3h!bXNd%G!s#G2xGh?;^p&9k)~cyl?>*ksl46So1L+v6 z2~qq9mS)tmJL`4*Qo9jqHBaXBrlNt8A7s4EoR+H0Lxy{*&`@i{_&f&I1s*ysh7Q5r2~Qrjpb8#r zpT6u+F6IxQr&PiwmbK`o91K4zQv`1XTF^*ndH}{}Fl6-idMlRo>*jpwOwf zBVVJU%|)ysd?ZCyjEXeCp=$mo;k(NP%m;+t-ml3IMc@Z9>k~vM4;;k(x2X*F(MXum z0-{>|xl3dM%u7Fkcbifmw?&F-rwSbR&KI)DQvh(yV;iDndSC!wM4zdKyOFzFE2|zu zDr^^m&PYrF&uCrkgf`B(<+Lgd5Oo~XW;Tm_<%1rzSTUmT2k&##kxn#du{VnmH398g zdoZ*CK^2%WNCc=)A(3~!E*3tLKpz6NDPY*^(1VJ&xLT!zivr=>6iq*U1F*>&U7kj4 zVnEkE|M?u#?y(YJXPu|UbEt82IY57wWQ9IMcYRF)Ri!}N-Z77hxHuUZuZz~OAbd+r zD!+6wfdB_x>#S!)>>#v(C*fKWC~TlMhlg8-05ct-DZIPTn!!-{@&Q7YexDmmyT*?^ zWZmwUIJsT8AM{o~{B=~OUT9G)N6Tm|TZ;bN!9E`>2x#*jnO$RYgndgTPFCD?MDT_& zH+hLUatvuw=2FSkUspzOu3C^p@@|fD<{@labVSg_(ZE?iXy~6qxe1kWw6l-2KHnIw zioqo#2d#z$xNK3oLw1pHk(&X-`^HOru{iWBnTv(+k=nguMCZtS1p#?(>_l#r&$MjX zu_Y68Evvyq0Ha31`@%f#i^NncG?H9;?SdgpS2w;Ozh*GCe6Y+$L75YYDf|&O;bw4& z<-fIsu+K<$(KZ9Wgg@3=MwDaEwczjK-4&t4T97*B545L@(@}%bnq7K@w)`Xkj96-1 zfIQ5O8MqsslCl}5ZX7F&YSJi%>t&ut=+Fh3IOQvjnE0Iff{IG)-%Bg&?@|QZdcje* zQEC7Ou=pKo;%5buId*boi?g@zJtKC1?x(yj|6Gd_rt{HK^C2&Bj1t?ATg5nPF4LwA z*Z47~qih+Lv%lT@{Ru=WI5Qa97;re#g2|{F`KMq~nWY))$Y$|}KXofv$|3v+^J*<{ zUW$Xpl`15Mt77m*ENIIo)jxB?I^6A5NgT(>^&Mc1?{+Nyyvf9M{gIU`bKdXm-@u#a zv2DVYn3%z-)nl0G)zm44fk-h*=r%s%S5n~W%kTXi5}}{WmZP;lV%P!2KiJs#g6(L% zn$%vn;t(K8yEqc7roZ=4HC#L%q(MXL4Sj#9=61tAj3;mD*Pn$!oU7`Sb%c}M3V44J z#iJsF;xVc7jUKxUu@EwU)5&f#y3f{L;W{B%A^dlvVtHbOX5QMq%iG~Qip*hH@1bk- zfj5lqGE3kvv(;l4p;xs-R?Io)z{r-%2Mk5{)Tar|kfBBxOO?*T_aOA1asZb?z6S~q z5#9(zx|UE(&L1O*g@-!PE47hrOg`kA;sU@~*X_n?z|CIRHE6ANMiu2f zm-mRp@9C%#4UB%=g^`g$GFB?)lYe6@n2^tC7H56Km2eR9NF8(%2vL!XfftalTqzCL zD?}aYR+}I5`4KUNPem483oRMc3VO#=luKca0qm+63?w8NQ3zO|Gk>G#j1`tNOu7u| zdZJtWyE}=lULbZKvJw1vV)B|JcB1ueba7h1UIZ^DzCIha2XY#V3T(uTA9p0{&v-IO znm?Zz4>~zjtb-HYM1(7#zNMyoI7V>*sNu7|mWEc_rz-)!H3?O?bb%RE+Ap;Dz|l|k zcb`d}i;3UaW2b%V3!LkuA}OmeeCtD7QbfXj6zsh61lRraFTl3r;rVtm$)630T-;xm zA$4{AyD#hhPy50>=11Gkha)L+kt>Opr+wCTk3FBBKrj;@%pVrLxYQCvMrneMtO0_u zB&<`sZE}FaR{1&cCx$k*67>+Z11fq zlloCRDdqTSvI4EDvk*li{xxwO2-*VmNUPSg>cxhC;Xra2vqF;giB406aNA4{$9ys8 z%?qz+a1}~DxnS@LZy`2qKt>~E)7eRpBN@a{qA?z_|e!xj)+BkL7 zhrFL`ceYaW+z?{w z?4lgNfhUyU5l*0cG9F%MyN?9o=D~@Jrf;>;Pt@Rbs2z#;>O9jCnC^bkE*-R~UwKrm^31wP2STY7w!=2*}mBlU8 z-_+vE%Agma9W>;Ys)ds>RGy%(!$WqU*$VKB7Q7WdOzXi}{Yxuecb=*Aj81Qi?T?4% zH6*_bf7>5$F?XH_UGqu zaSt@IZK|B1U?`t#Gcbc#O8tubxrpIQrK%MzG2l-@n#xEH3q@SLD|&dyY@PJj9?`vp zfBB0~)&z4RW11tGYlBFqd+taH*^NtW!YM?3xF{%hc{kJIuiZkEn?sCft4jN(Cu$k_1~7a8L&T1^W3*%ZrBhqR?8dTH&lgR*n%`9mL0x0xxYeS>oAzInM|}+*=-# z_SG1mM?CVBFRDV4LwOMZc=%g&;b@jU!xq+ftVMo@A^fn+`hM{Kc%#VxCCXUv?rOd+ z0#t}~JK+n1T^-KDlmM4Fv=}5I&p*50Uo;*z@9*~u)uIEMhKIAuln(Wr*f6x< zdhKGrE`Y|0S?lRD5^y6y$H)!mBU%JRu4TnkIxG2y`z-% z)G00Z7Q8tYkGCDqctfoyknF|mZXwjx`w(r!+N5emeaO;t%P>> zU`)EI;~zDu!g5_1Cys6T7#A(bNgxcBT|p^*$8VHT@c|pio01JrrL-d%*O&j}F}S2>xrN2+rc@(`fA7 z9ynt`Js(RqG1gn;#|2Q888u>+YKu_Gv2@^y;(rhTzi*-s>Hun7!>5oKkk2hKwa(}7 z+z?Pv6tI8;^*8iL82%M4WBii_TtXfD*OJB=xb7YoGokz=M3pjN?mv4K*7z$$M6y;Bce)s2KNq8e}7 zIN6ea{U_Yv-xN@eHlYE3Ti%>6RPic5;62R4BttZ>ePOxwdwizgj~rH_s{SB2KvY^c z)PDj_nbAV2b|6gAc-NnY)5co2aNRUWbP8nz4nANQg#2|{=o4Zdd6H*U#Apy;=%>Qy zzzEE@oARep?0f?&8TCq`80?J+T3%-~W&Z5`P9q+sSEK*N<^1(jZ(4>}+@%PA?>$pQ zN~U_a+toO$fQ_Y48)|VcQnS~bCWaVNIx4f|?Dcbmv3RSNg?@VCct zaZ|(hbnQNAdnOfT;Cu6aY{W6*yW|fm^<%JSj*Z3SHz)uh9C=dbE@-O*ioi5)BG0H2 zpHKm1DSD5rcgar)X>NkSIEQ85yaWnH0p7&+w)6e;Bi!2%@>x*veQ98#wAO-;*4nO~|M( ziZo9Kp~UICNP2DeM>;EQYhyWlm))O+>Ai^`flJzK-WyA2<)95N1&et8p{wp8`?X_# zqzFo0o;)sC&i*8h(t3J~{A=7QA_D{mz3ZMa7m?CN)dICevWQh8DFf^&oz>qeE1jgy!fZDSBttf2y2I)H&Zp8LmCg0@4SZj+&-h|7@c|Fy5WeAws%)i}c&_R1_zr6`j9*LS@feA#K|Yi%>(2 zrfF1?$2J5jiK-?&1AANyV@0wch*r32sB>I`wUYA$gK`1_;Xtm%nE}@AmOqEKx2Jh~ zW?^d5K`C6CzMzHK*$!0_mE;SRZgZRAlJ(`ENmQ`a@?wo7I5#BVUEnK-lD;6agf{na znA_d|FvrJfQb2`-xGH#gUn4}w%l6H4MzHc*2QCO8%=gVo5w?2K!cFSCu$aiX5<7nI7iS)FfP}qDD!R&FuFPMvkR>IvO zF!V}_VQ8UzV6MuGsQAPAWLA(4Ru?`}}{Vw{9!B_OhQl9QD3rC~yV znP#r7b&qczQ-Q{;e=2se9ZECpp4}f}(^wthhA7U+Y`{R%s z1`}p5jZ#ePw4D18{ngbCD=-5~YO0emkf^#sqQ@i`f1rH-ZJ_(lW?=9lC8?wVS}!tH zo-J|~#w!k>dq8#a^$qZJcbB03eCKBNQt$2&oy`uy-aUicQU(0j`0Q&V;fIYyK4BmX zP2uTt@XfK3`?yGz2GSZ~_m6Q#g{ad8^ly)>`ktfOIirMs*WeRFfx0TvzJ&l5=m&pc z^7yP6FMkpQH>@Ogv*uRPQMLY%X%j!&Da7@;o|k2sk&eOj02Z29=0_5)Xcl~?Tl)vzsTmA>Ul!G^DRMlN|HmXyMTYI*b^TVp?Zl(3Pf zCO<^_`s6D}nFJ;7fY4gudf+2nu@gVVdiTCu{}rrHeco$&x+Et#8K)uk`g;~R`xvrF zsclm;A}@7(cYzn!zzD{Lc5DL&hgyRAx@pwP4CY5HfDM8Il5C2Xg&dh zjkj3{dL9LEy`LGzUE&aePg(^1LYJ)^RmL;eP15`!Ipu}H57{f1vvt2@?%P#>WFhL= z%Q1pU{D>HK3QQxZ*bl5fj7_1#tNtuV z9Ul<;21LOdHYrIxRC%UvE%txQ3J5p#9buRlgbX2)gTrc)7_pHem}JsFCG~s2)q8!L zBYOIsiuOY`btZ!Y1abZpA{n4Rig4_@dn%{_qY4h|7?+U?2>O4w5>U$h*Ggc5?3b|r z=u*>Q@Lt*~!mwC={#P1t3PV6%YS*n9t;zyA&ZiZVT2gk$cSsF_Wm50U;y%ab+`@vp zQ|I5o7OE1>zy9q~ANK9O6u%2oVebTN*7{kHD&XnPefJd$SS?oT8Fu;ezh+%goZUhRWP-1xtXS}q-&DvYJ?x_5 zIG0r4(pJi~jd(R*k^G6Sh5mBD$2;DKWWW6M81r*$<6P(>_jLm!R)&*7bsd^FqFa zz(!vpHGmDjCi-C6`I8hGc0pt;^6PBh%`dFvYE+X=Tv7!_CaMRvG0k5wQq~$UwbhPj z|E~LIEp*Y82hAWfJ(61dY!CG;i+{)o++P%|Cyu`)2?yoQxxurMT0qO-F&aD+RRZ5R z#>;efxpBJ?bNtB73=)4Qd)y{0fdPBjeF^u)o@Tp!=8~N5gy-qtmyI12RXo%rYZ&HF zS*xOCoL_kY$!7`I6a1O0xtxgS3V^6g9Bq>GI-Zk%jfBs&z9=Fzlqe<8$K>y?wv;!t z-XJYBZW&^HR2QP0A+qmB-jTk-Hch0s*;1X@I=1GvTYQn?HG}D+i9b%}om)E5d-)-A zf2pAxt7M@y(UUWb8w0;H!l;TrbDk5)Y!DBRnr4t8M0ZJuM6jmmGZd?2$e2ARh~55@ z-ZI>8$lX0sE-oPKC0%9WOMdb9Bd5&6u4ySr;@$1AnZ|r$s#b=49qc!(S2QykorGtx zk@u6xvP^`QHv*Zyv<0uY?Y-bDQTLFJZE1>@U9QH}PywpiBuBh@Iu2#$DvTn+_M z7AMCeM7SPu(esrPmF0}BUCrODe4vUL_*Y~pV2#uwm*xKcj!Zw&bw2jo@t;5^+21~$ zc-K2ZXHxx$idoT^lMP)EO^b=Ojh7=-mB-GRs9KV@@9LJ!%5GXdYqjQ=ca?yQV9P$5NEKebG5qVv?S;Y-}g==XW#3zmSW_mAM~ zfc66CQMP%Yc#_rHbYJ9du<oX)+WUi$e%NSs|laJ8R_{6 ze2IYCrQ_J?l5Hcj zhX7~!Gc7JyUd$ZNL|CenHM1$PO@ z>8+}z7K}YIG@Gq^$%q6NBe>zG}`{NKnkU_y6N;1+ZftY!#=wO03KC$|lex-BPDW~jlRlQJx;+x|BOEV2Dnln->sdm9` z=82wq)~V{K(~QnP=?aPD!t~+j7ccgO1lIdg&q5x*S@Xmn;ZHY$ys{Cs{>izM_x4kHj%}~vfxXoeQ(<73T5hYwbV1403qj!X z^)%1u{adL|e{EZtKVXCW3b)wt)d!7feUEf)?Cq^bKa~mjoeTYNn0AA`1j($keVD9Cq!bq^Z*Moe z=#FnxR#sMm>5$t8C9Sqm1qHokhGWy4{u!|3wBJ$`U(~_H&f%P-6e|z7b&Y5sRI>&bu$$l&p=WmTmE6%>M8=>f$ z(vUaVa`0E!3%ajDcQZL~5zLmL;b25UXJQ~Fzj~B4IOj|F7=3+nw$o1^GIXw#%4qq@ zZmo29BfG43Xdp=_2e&ZPeHg0JsX!XL((mNlY4dhMxj7Y&N@c2Z%X>Z_euZ4sFBeNH zB^3S@Sbx!}2&Jdk-whNy>Iv~zAsCbq`W3wJ6#x!hbsvL3MY!7WW1s_FWZo6UFHHh{ z_iX(7wT7XisZ4Z|l7-gS33q>TO>o0%%;!4|dQP_b!s8?#k9loBv0B!9?wgT|=tf=c zhYV^+iWgjc7G;ZXJj|3wy368=P`S);V+1%5AZ7T{1nJVuF;~l^R8`=j0&V0$Jm5_j zJ`i7HNeg1$Ds{X*_Yul1x@9v+?aay1!LU)tV~cuAB=M&yP!1@N`0lx{ zzP`+LF}>NpuwRnD8+Yq_yrOm%^0BV_A++JP^v?Ed32tk>f#$VLRuHa;5!eZ$B0b|Q z<61ONll;VLe9=v51p^==AmV8rp`?NNJ-aV%S#*suWRl`M_EY2x=%{FD>8j`F+d5)? z=N9LZn81*0=8U;j$fcc9P_+Bg9pWpSN+k(I1C$8+#Fj~w;{2U8y z`{ns@mFreAy_t#HdDBd}S%c>~C@xo!s?h#IYuh%4lMcxKlTQGw;RDRUdw}AT%EKca zz-gTjk#MwZNk`1l-pZ;3?j~VL()K3!5L}Y zaL~@vpPtx167vUMS(*7qjUCwWK*o?T2D$Z5f{i_({SA8Zo&9_%?4}MenTtA>RerAU zl_~9$1h_Kh3#;C~vzDR?a&|wB|Em)y|Em36G=Pg8q_niS;~J=J%rAB%k)XeWV>fLt zI&0srw$4AA7u6nog6;7OJ_t$@A%{Ot!%6s+Rr(__Om6b95`}dFQ{V%@Sx8D=@?g)6c4x3)H z$U}`n6?^Ex^Y*95xY$_3yTB>6i69~WD>e?Z&V+#50uH~$1j1-zgo*~TD`yj;uXz-e z_&|X@lo19S2H?(}z`7BHP(DH#s+PLMHwYH`N%Dr{Z~kR+hpS}g?4vz^;$(Ev9Pwtu>mQkl)!za{CHlwhhM@$tt z7R&Sgj^BFIkKcRdAJ>_KmDl1f0&d8u`|aJg`_(=^*ZEzriq`#^APx2gwaI$d31CVM)0 z{?zSGc$LDa%L_mb<(4fVJ9ei6g6N<+ffV1rB{6z$gy~z`r)!AZ^d`c|5SI#*v_4KG zneBp8nz^p5?EBB0O+3Ph!1sWIpZ8ZLQJ>?Yqe6@CHD%o%P^F4X(May8v!s?IRG2!3 z5u*01tYrhJ;n5Fhp3=M{fzaS1IUs+YLmP=O%qdR!Qq4@7Y-^exfH;AW@1z6%YmInI zbo=4DJ>=%q6~Z=MsKk=T??fouTxa&I9&x_l1P}Rjo3TRlP$>2x2XUCaVDm$i{dC%; zsCvhmUvO57NRXn!U9&yGNDv&qZ_-*7s9*uu^uPe?H}na{^L|#zoSmC=e-&A1P?0tgIVvdg*cU zIoqJ%0Ju8c9J-_p`n&N~BKg8mlRyMCngM1bsLG#E zI7k{H^q(=c6pr)}V6wvpmpr5^6sk6R<>FmmauS`EGx=pLVCUmvYk^lOOzY1E&*qd#rU^H-AKTj@N^L< zYrP{PrtB!(33+`W58EY>jXVa?Etghu{wRkmuY+vkY4a}Am#acShHYEv)A~ygWr0b- zyjEjqM5tE`1H@v3eBwgMsu8v~<9UA+(WUAnAK4ux@ooRm#c9U!&|H=+}OUMLW z76KP9Urx{Ro^q5C+h0R1ss%~+^UYU*7uSaS4(V(YrjBX8H*SbAi^f9JvpyWBpJcc~bsF$34 zOOlv~R8Z_K0bt{)`zOq`iTX1p-!d0=L&EvK{i?T+dexnFpN!2v!I|1RP@q{jxC}A~b!XagB9tm21b|(yGU1<7j6S zDx{)hA7gp6+jg(iE)FEH%o83XCn^yuX8K(nxX*_EXmj2CS~A|$(?=W<_wFIp0Sew~ zacU!$iM^dZ^ny2Q=2@WSZuE6(kGsWi@}PoDA)HsDCrwv=E5)8Gg}6j9zv`6_Fk>|4 zXDC-uV9ORXf`+;ndpa#^=2Hu(Nt!m2y8&a|+9m6^+mA{v@zbfVjg6#UX0-z7KF2Gg z!rSn(p!K6rR)ep^4Pb4ASJ`$x9v1NH%HUNM{#k97PbcAkV$j-~I9Z(u-+KwahL+p~ znI3lakUVD(JI`pOqbDmNB^()cK;+pv@py0=-fgrZLE=8fuyP0#3jLUdp<@@(?9;*> z%cO}*mzvD$N|#vp(w8IiX_zgRQiZtIyeE`4SZ1!xr9$DWS=T$JLk);fzzwa!MiTym zj^eQwBIK)zJGqw<3q&EY@1!01fGwJ7@X=HP9Z^`GiLL=4l+MY9>LZsjCBL;)vu8$3 zxk9FSdW&r?Ga4pDIsVaA2d`lr9sA57uC(?Wv5sbhFe}#9@5t{T{@t(jFlYEfhWB1` zGCZV^;`vKYPhOdwkj?IA@_@JYx3{`8^WstT2>M@Z(^GP;2H&p$LV|Te!qkY#o)Dt2 ztubEl>ZpY{pLvIw4=5(h7@zd12m&fI>QoCuE* z)NI03+}WNfBDVaE`!0Q9{Lu}U=jj7`(gpm!r>3^XY_=Bz(Mg3z3;l(nzApLtK+nrV z`KOnd4T=02)}9!OY`KRlcQ@_Fe*bm?w#~nAxl0LY;!=}h^|(5g45Vfsky%*>l2U0y z!dduQS;B-xu(lh%bCHs7loLw->V}6+O>Qk#u!>RWo}*J>^xTmnFznONz9+p4sYloz(8qt5m&AXoW2ISd6W0l)&Qq-6v&Qv#w+l@vTo;gL=?)H{S_|qqgX#>$Sgcbjx zfhi^wfm3b-7Idm#cfG?Kc!|M|=ka;q{a#g}cEo;GD>1QwAN`^pxPexUIG-bW1L+f3 z2iu=Cv@{K4(}#XstYh7Vjg5`r(`1Gzj_sfk{oXBR^e}8y^hMG+KX8kX2T5Y~ryCjtnnD}k7ZHq5xS|BsC`hb~7mgw60^CbT z;H)#Lz2~&!3tExpi88mI7EMUl_S4n%k;-!Xx3XF@mHgiTvimY5P%!Wbbh^m|yZ1iZ z=yK`cp%(N#3TrRr^NSwro0LqXOo|LA%Jd~CNk%~S|24&n*=l;T@v*+*c5iVsgx-kf zlXHxWq?7r|$~PH;e<^TbCFZE6;<8u&um#>BeV*TEsS8z_uSA^3PM5%YgO_2^A8&=v zw*Jw&qDRA;88#TEE-XXMAG&h2)hB~8?FN9k_R!Oqc!(3r+H%#$FgsA&4%{X?*8 z(zb*S_Nd0$>g*3EP|3|`^xy--YVCa3VHtc<#z@#ugBqr@j=)2>+ayNSFau4#V{uxG z63pmy6J}>!nk#?4uEHX}UwTmRsEt?>4RvYA6@s5aLUe!w;qhp4DBaWc)-fWh0u`c| z>&rT;huA>qZDLO4U{A=JE`l54kcO1a7akl!roMC)F$Sf$E z(7c0w)oyNa3zl!A1u4E&Km};SK7)*by8^zq(iTf=*#TCcw2RB{gy$}ADB)z|tvbKh zqc?@xB~VYE1TiOGb*93YE5mq4Blv;~`>_>YOBMS1hLC0QX}9npJ_zNh{MK8nQB1#k zIW1Y9teFOqpd+Y%rnyO)QiQz;{t^CLo9jcnJQ&322WI(j`XbSYc$$KWF&yWKehp9* zsj>s+!5{t@0K|fIY~co+g{vQ=eQtP*dzyUltEl8=<09Clh>K&F2D_kA@I&LDUvh@x zw?sb`4GxTnlM=e55L+A~k|A@VdnXoIln?M)v5B<@mN2oXp2rja@V7u8U`E?`>XHnh zN|k_j{27@gaK@WS{}fCJWOu)0B-L75Yb6!_Y0BcwnoQ#HgP@BY+7hGh~IeD%nwMM>0zU z!YK5>?ZhSKEVgTDw;S2FbjsxkW`HQUVU9srjdsQi1iP!l6m$f62!KG^AN`y@w6yYj zym zRR|#*TTsoudTt<-m;i~3#I~Eo16eU_|>N${%ad=TsU zz!gxtkaCR|M8vQQWjE^>ykmYo;A zh>p$4H9aeomkn_85l)#|*6VSfeV;XK!!{IZ!gSl4u0>$aM~U(zjuOQ~*Iu7vkG+;^ zZlu3az=m3KY;(2wNSU*Sp!=ZHv1(U>_{6x>X5kD-PjPNic7l9oBP+SV$`f|r-*oTi za88qDW{f%8Z`ZL~C=%x?D7-_+km~-Mf|^ z(&S^ug0B7Ia+X?Ksz@L+ln?|}wkph)3D!>qN#GdOVtHT}YC%=uxIPS%2DUmiv0hfS5v=!rv}5nK4nW|hhJa+Z4QZs z2LNbzARs4?7ywW;9A#uQH62{NTs{9Y1y)H$hT6@;)$Vm@H~{$l%Ga^i)j1>-zumZ! zR*8Y8skmwrfT^{mY&Ep^`hnS5zkme{Yo%x{`T?ggV~DDrCYL(!|GDRH*Ke+&+9|K@;% zqSCto*x)7`8qa4s5O5bPCdNwJi`)%>{N~ZXK(AVEFBf?<4C_cb+Y|(i0QGvM2&sUf z_yEK|QMw#}$b+EyS&TYB5dvT_Zf&&-XtDzqOd)^f0cieRb^r)4NuwbE6{P^wc(yUJ zfP*MdJFOop2N-ez_;xCT!oUhUz@=nhrwG)y0lib$XpI0E9pKW6iF^Yf1OOHzbaZ|| zL^gmg|Ia||g7qu*KFjM)WjBg_qZgJ7H374`BO4fSP%=*`5wYS6Si)K6Ksfq8WRviO z@?mXVP5?kr3c>4YFQ5IUFuzVs2_&{+nzJAEAi-#@{)fGDijE|D`*nvC+qP}nwrzWo ziEZ1M*tTuknb^t1PEP*k`|i)VJ6O{82e{cJz;Nv}XH^q}*8K1G_9rk^T6c8YO7J<7nZeQ2@AL4nW06#Oy1V;csPlSX{WxRoZ1me2{^Zco5 z1+nk@Flc(gar(eE`=H+q*n)&e2K$8&grL4dm6HKwWq=Sx$W$#Zl>z;t04__fqD4re z0~}qyYAYPC1N^HYL{1+?r#~d9;3x#LA>n!$kWqvNaSQ}{dhj!0p9CmUBniP-7>Xj1 zbUdpBqf&$lfvN=VEw2+WXQ+-?dp!3jfGOZTq*I(R$-iEacM+yZxUG~OD@ZIKde+2+ zF(Vc&FLTzZ5sNp9?f3C)g$4Y2ET8ZQL+=U359UD|2D;$^p*jv4$VB6bI-*LLieao; zwMvkV@CW0WIyX=xf6-n@Hc&Sq0z*7O2@M$yxmAf$0vr++#C1q^NRS}KesZG3Qt3vr zcEp!K3?nASPz?zh;$@^*WO@Y8FyTRV5~OfpCi1p8V9B~dm3gFjv3WZs;!~QkOcn_& z;>59a6YKgPoJlkU)T6-%*#`p$%m>&9gtyvI*+v46h0n@+6iVY(QkaJbhb)KSrfE!q zss$NJTcy8M5LsijgsOfwE7d55mLjwK%;1~~M3a;*s>)AZz_LKMc(SZHacM`~O2(5* zomHQoI2AuhJps9QgMke}4IBwGr@+j__<>=L>4s60CR2>L5Q#aW!obdWo_3rLpKhFTP6r^W+`U%2Bo_sGyWg@X^ziXE^?5^6eX#5J`vj}*OYsd*u^X| zZH%Tm*5xUwDH;_L6^a$&=Ur^omnGT7U7{VDZ~kzCBU0o# zrZISiSRL(oaOp=jZWM)e2LyzR43iC0cZ1^F=6DL0#G=LEqb!GY_DS|_hi!)o$iT@6 z$)sh^WUn%mWZQ}#PG?zBFno8Cm zXccQ-HFw$tYjJ88X{c)HHi%VaSCKAvRCSafmbA$w%2nhnn-A39G>J==Lg7;5+Rm8Hy5jd9x=%T! zH`ka!m|11sZ$_S=9JI_<&Rh^TM>lVC4!jGC43`d=piAYW%fueu8tpoea(Qsn-SwD% z$j)rY?7uACsJUXhvb+l2%$;P(rOeS}cAgy=75<}mIL8m2o6KOnQ|TiwEbnjLbWBWd zOdqdawNl$s`VM*^1X*^ z4p8Dp3SL9)0|PB zvxZiRm5Q&N&WdN9y`80Qvdj5n&3dN7$2n6f za;T>+CmY5$;@GpUbH6T;`jK`Mnu|iD)oF1xj=CzXIO};F-8Z22QNgG~)W9owS|ggN zY?tIKF4a@3eY(gzWUc-6`o;tLnt-g&p;e&{gT2o;S1xtsHRv^Wnhak07ZzeUCRSdS7%$UuaogQt|=4ivEl&2o0!r8&DtvAB%s5M?b zJc@46r%q99bObgFw-xm8w04@7j7?8*^Q#o9+^f8*uwBh>H5slv+s$2Jdv-puTr6#9 zcRqdajdgFR0;$R_nJt;VNxn5a@mGhJpFXF&+3Hrw**ad1fXst@{2+#FUTIrg!ky<; zQHourJ{N}@!SDXezILO9WrJ0X&Klk$b`WttIDLZLdBTI`T6c}|tla&vfbWWHj!SPP zlyRFOmZ_ZarfsC%EfZ}o3a$xng)Z@He{QZ`Z~9vGy5-%?ZHhmE2M5l4#y`Zu3xma`$4-R6 zhMebc@NshP@jHE-zLyBkn9Pvnpnv9nPE@0#(fd3vov%#KrOo|Ly-iK*vGpqYIO{#f ztl1duAI9q*`^C(tcdzz#+2^+DhI?JG122EzMc_;EW${w?pgddhmWY{{_yr1*cK2?~ zOuO-)mrr8}C0PK#gA@Sp3j_dOzP^v&((<1S0Kl060Kk>@E$_BZ&>#AKkp%%L$f$^> zZM-MX?)tQjNSIh9W#`u2y{jZ;@b>gn_qJZ0te=k83`7~9*9J6Na!9e$2Y7mZ-{ars z-w6DFGXl1)+791>e}n%?39oxCY$OCRK!AR4mPPu_{q@!IhLAlmeeoEm z)G5+E7`M+qE1B>423;D@!VLWZzPJ@-W@ff+m)F&_tfE@9W-SDdh zS|cLLKW^t&243X_z-VH(0s%H1O#@NtV2RNDHcQA)h>je8{DtuR_N*B-bBhFd@&Ju4 zg@)1GLF~{F^{YQ_YcDLTiiphfOy=a3m4}t{feUVYzS-R{QkGx;F;4RV;q-xj`}$)J z2*bsr;f?Cr{!iijFWqs#-zSkmABBG({yRX^5d#2p#6Z7__+9@6=zjtFUx5A>p#KHv ze*yYmfc_Vt{{`rO0s8+)fJWs0uh3AaC0j!>rpkLPW@6Ump})1De`gqCSj#8|0h-_o zWHbgvvJ3(F_zp>;Rx3=SNepB((w{)8?MJ#H5j8owjKQ;y+0xv^G1jqjg%B~JkOdybu z36m6%7M1X89vE{P*SW^tY^Uf=IY@IF@Ccxy#1YDO9hGK?eu`#!A_*u20)z@kV{5Mn z1o;=tacQ~+xyHPH5FbX%=FasC6l!$1-6nyvx>ly zQo!K|8u>Hh%9BocKnh`?1OzJRUNH{cNNeXo3Y_HQc|T$oosf3we`K-@E$goZ%G zxl897cNIQ!UePmBNy-`CPJCbMYb?;-=l##Q`r9#N>&EUj!+UH5wvHzRy5)~*ya4MN zG6_(H;TS(no{df*qm3<$_C$==#9g*AS+{0fJA_S_62c&hfnt7cOuLUwyIb%Fm_|RG~~a-!7(-VT8}>dQH8aUC6}ft3s1uef0I{ON3Sq; zM0zv=U{trAc;H0NT_vBB=3Rp&bclfD5Q!0XKwuD`8vA(tu?1gES8btFpZRyrzT5eZ z{qr4{n~`+tJi_E)-=5$1IeP?VasvYQEwc+V$zh+GyhNYpaqLcAj;+OfX9Zz=+4DAO z6Im5!ZaCH|d(6{d3*OJ4fw0b~AZ|EmScP4|$Lp4*NK4u($6R<)&&%ay-}fv0XLDf$ zw}|ZPEq;&Z<2iX6Tp|(nL5#%c;hIMgi96rQOW{!>A7H`@i_h1})$Ikyh7Gw<9W6fr z00WV&Y3|$%02fq@T1$uSl!BgaGq}n@23#ow2+)o#iF`q^Hwm<3$yXTS>U>L6Lk__* z5t5};cQ3+T+e!XZghdk&azd$6z0V>m`2bYU!!mIGbl!x7RmV5-S@AX7#GU0d`c1-+ zSsBKk?>YSy;=;XJOrxP|tWV&EqNp&^y780J&D_$I3C&n9FPdfZ(Z&U#+NeH)K4;bi zD%EP#wUUOxhM??&1W+C#JJ5$Nw>D^KPN(W@Bv?m+9EZe&(v-YLo#zF>McC;D({9KoD8bDSORgJtEwFJodlGMzkXE53JhaI5iD%iIC)c8bf3{TMk%n*VKOCX|BxVv zyT$Yyv`r((c*?6wO7=bP`O@z#W6<8K(U4W`yTlhyjEQOY62%3?-X7Sph@FFdH)V3Z zMu7wumLg@I8c%V0niKL-)^e_|Wwzsf)#&qCoXg&I``n}c1Ke(Tye|sH%l|P`a{Y1n z1m+@6h%>}FnC#+WeV6I`Xnh;7#BzZr<8z20x6MZv3=eSN*_5q5U=R?H3KRR)lsGu& zkVz|Awp&=7)zn8*6)9}ObDZF(#1RW(%mFpS@5Ol~mOjk;*Tvryzp0D+eg3*FTy?hFm~HYN+nT#>lW$L5^=u>bOK`Gt)sUO?{{+Bha?Wju6^U8W1?qXOM?3 zqOo}fD2bdSuhIg}ug@!rkfjT7kj+@55bOiil}Si$XKGnZ<}WZUINYGi26b7;O00Mc z7Fh+wA`ObxJW$$;jIDid7eL!+;43vsK+t67ptz1)gn@l)?LWRzHbrqpsJRYj3>(_A@1^9xv*!0 zanTGBMbs2s{uyH|#r<_~4qu~pVF93p5z}tTAOekid=4bvd6~E#l07!&`buul{~TCh zb>E1eny`DlOOi5@lQglTj6Q-E)hCIG;-QLGvXlwRk26ryf(w({bs^Yul)%GmrK;%X z^7&KX`&eKO@N$V9&WI14NLWzWywH=QOc+dPTmb`BIah}}eh(J%ahWo_9~+q{Gi;M|>e#C{`yzWnbBSKq~>-Pi+ITSwzv)ml>H#N1wk25KyFOyaqnGbUj^=JaTOky@sg4jQj0sdQ&-Lrt!;|ks%Csp@l%G@a9AR;+09m$T zk6G876aaZ9_R)zz|3w7Q_9_=Cg1u_EY*s3$9kyS_b;&-U$rN4DY(LLKn)n=A%9y33 z_rr|b`OBs9b>j%57wZPF-u|7G%5cz)$RVI$QWr~{4=8CU%n+3}eZ&6Eft<%AMo8b(Q}B-$0x1XWfVHEx8y++YWp&c-^r;b!}4qXX!%b;jg-_-BViVp&9U?7 z7>=Yrk$GgrFFv>A2SD(U8eIYt)^9J^Kh=%W5GQuYpq7~f2?tk(1N86PU7KtOX|9rz zKc1B>5^%xJo#<1la-HCUdOPbib4Zd_@6hb&5UeAanr<+Vta>yS-a32MP6hA06dv4ZTL?n(J34$dvZ?$ppJ zgSKMWoYUBJ4h%h-(D`(QL~cnoF?X%2(noBtF5n@P1`rsWk#36w=kzVPJbZN{KCgps z#ty_0#{5^!#3{0Oc}qI>eoGA%gjWIOS_(_6l0>roN#nItXy>r^^Q({!$dnnP(2n+4 z@nSt*kGCh~=X7s3k{+*rUlQM9ea?2Z(S{}YfDxI}1_EPskrwS=*?k|NrRqngtU+K% zF0xK=rnkoI_+sZ@Nt`g=>L%{O@HPH}H2j7n1rB+8ZQ*fLy_4A5RKO=-IhN?PBbM!!W?Y#Eaw5C-}1>wQe{zc0o5JnJG6iUINgZHxFn?Z2+h zf5$pp(&A?Bcz8bFi?OI@0e`6S5{?Gi`Q%@3ZAk-OWCVV-d!J8i<-!fXo*VhPV6kTh z_X!1N)najyio}C!jK1>8O3)=Biil*OQ6gLo zNcuh=NiMt701SudFR32sLnP$O#!VU?G9n-Q(pgAL%zkxVyrO&KaLw00xF5rr$ig|a z9kLQhVhLc%xQtS;&k`vaId2KV4H9N`x${7)O3hbx3Fo8SUSz5O77Sxub$zVpG%4iK zWw(oP00blxi(=rpQo`3|CZ-t(lC!Oi@o*qj##nbSwyamlf65xU&TG?3z!5}CEudbpff30#l~1QZJ(8ha&}w1^ zwe$uv_C5?;!P?Z^9tT4FclU8$f3UW9Ait&)BX6cfjw8d zby6@{>Bg_4Fn>u7GRdT#^kR>LZaYG zH8@V`-8o#T%P!L4+!D94oa}R@L|L7WQVMngbG1b!q#Pl&C^!kyha=APTN_xSi!2lM zTX?gCj4EEoa_Y&qdj!CBN7gC zS=pJY%gLD`$zTv9MpD+GL z?58Bn+zegrR>wL>``?P|*dr9M3I>xn=yul`>fFGAvrUl%-3;3)(FG>hQLWf|`SNB1 zhJzUlN$YZRxojxL#fP!AO2&kI2u@oj>?stXLbWypyB;D3$=G-O?q}<&KT;9yQu}%V zE6Uw_RU~ZcD43R{7?n^t&TW-#HBN-Jil?myWWh|#4dC#b$Jk1ynIzsdrwuN$D|Ey~ z4mjV9eLFs!xbS|yG6@>W=_n;6I;nmWk#dt7-aSf{-=+a>4OTbkXoGm-iQbtZ=lmbl z0IYW7yRJa8)Yu|wj9mHs2DTEbJ8C9_w`xs!M0tH*@BvG=qa#P#E>CGG6>yxn<+~gw za(l(0Mj5)yOkN#bHbjKm5!|TF&ZRM+f&27pAEy3{HArc(~lQp78A)7zn7>dQsKiS0Clw7QwabXC*x1X^g}{~ z*nC~l1Qq}|`_RTSDZBczy=+y2q4;5u8G#9iRAuHxCvY(^e)7)-qDc9De@}%NmUJ6` z0B;shE)*;QgsO;WNTv$LHJb^;n>OpO#|Op>fPQa2kxUL#n*{*{req|{U9_=T3=l0J zFO(5LU?>Ac$o?FADtOXwwYM%hX9P~nwZ+TI-Od=B+bMk^N_h1<^Iewag>?^N^OM&F0q zTd4pqa)IahF+Sh7&A|H{8-GND{AvDBC^-!jSkw|S<_ZyninDSEAqle}c%aHJFZp`x zApf4H0agO?>j=#s2`%X32>Ps&)_++sM_*t(eizX9Kk0tJW=o>>GlTCU^-yiOPXrO0(Y@PhV4p^D$A+&Eoj;Pv1w4ZWj+1``ZvMH@g~D zOV+10%pbCQjYz!0LYq==pSJ|Lb;8nef-otp0C>xGothke?|@3-42z9kRHn{MVs$Q8 zlwrTHD9DJL26XV^>Yax_pVr(hUp29@yj`Zx@l)EZAUYvTr7=O4h=r8kHf`MMM$FAC+e^Uw1?)63%9?$WJDIp(osiPUn&uV#JGtB zNvr54KhEBEvhjHvk`_NsG_6=jV}y4+P$r6-A>VbVNE< zb(}YqQ9|2PyR^uw6rrMx#~k&65$H0)1NTaaKr!LQR9ubJJeGbS$rCENhHusZ7O-Fh*N*S;3hQC9*4Ao8RFUivqvx)~RwvpOmvz=PcY- zDV5EaSMFzJ_XFS;Onpq>`8bfagf>yVX`3&kQno5IHdxfE#He^Nt~<<$tl7-S*fA;r zfy5((6`-$|#_jfMi~*fE1ASNl3MH5yAO?mch$f{{pI925b9hRRtGA!q@4WGl34QOF``NP_|x&BMvT<%9+=~Q=^$nVkcZ#`XDT6lDL z1Q}hcQ97~te!e54cs#YL42nAX5rg{@W4NP~%&;G9m_g;Lgl!6*qst+V$~-Kw5iwHF zc#h@Jht7dn3br%9?|wB%r0_=UL9EVh?*(I5o+?Z26> zuiM`RIZBnQ;+F?yt+9rinbvrX-*)%;2EJ?$0bD^vMMM<>tQpnQF5l4l{|$>`?TaUhz_2Vx?4u zYy3!urGEpCYo1|OOXP|xnON2mrcfn!yZYFCF?DwL>KEcF0R;tXOt-nZF2nWuqX4mV zXU^B*Sb>@w@@J;=*<9S`!-`loJ#1sKAfvbp4ffE@k0N2w&5!J?c2Uiz-KeV~T@lFW zsx>XToQega`Kf&-T7(zzx1-U<=kc_S##7&q5z0b#+JJx=e7b8@qsrE#i^qezy3M7{BXb z`J(Amsg1{JMYm8I!c+w{L)LjixoN*Xb3xBG z8V{7jl0pPdz;yqpI$B!=_)rl{4*~Q2v+K|w_(A@|>B2((W1GH~nX27q;_q?yX9s(= zZ1qNC(dLf14U0uqgPcD?ub)6NAK@;VXhMh?R)(boNq72dCZ=yPyze@-ryny}7#rGA z3*YP7mhW{%hW(!4thKa{*EaL+R%8>q{xi36RNb^#ougu%&RYHXqmw>;10n-52m~-7 zMFm8QF=F|`t#Yf*vR5-AJGxSLMcJ&~z4rCAwTXB^5%-Mx$t`spT!iJ&zF!%S_6&<|p25x>*=dHPaVho(m_lmC5X$M#U7PywOc$k}x{ za&H<0zO|HsD19F>o{2h&kjx07g$=j1&;UfgCP1y<^ao^ofJmT4w~2Lp)20FH>vR?k zcY-&T@VSRnGeY9;2e)g?+zgHIO$F6WUW?FU=E^!G$y+HGaX^F?96o)vl>!{nbMa()Ha6wW5V3N{O z_<0)^D#YuzVgB~J7yC7#I$r!H71#TWu5(!?$Ey?HPxi=E`n1vbCKH-?Mw`_Pf^-Y9 z?Ut6LEZhKitgyF8i;@hF;(GmK`4?)krv*&i$U%h^%}h~w)~0kPLB0f#n_#mc^enlkI!P; z?;ecQ+D38k>Ej7tL;{8lB!S@pCl0z4(Wg@qks5!v-V8-XN|!F$vu5ztt|UpOA(Yy+cEL$xQsYZTpxlD-~Ml2bFCN*IMVODwun)Yi87X=E^y2$h&2ciljyh# zPvPNZUi#3mss`I3X+s*Yw03r!NiSG`oGe1*cQn%R z5Nmwua7I1z=O3vCw$86eUR{s{^0%7YQ+G5g90N<{z+ zFu~Bb{OyhvU$epZ@A8KT>wkbg%Y+cbt*W5)b$^O#Kr#4nxc3~c9Ds_S7k3~0px;4! zYq^THa#j$T4~%?z>s4$hl2DEW(UhM4`mVzrN|cu|dcHrlb~?=OU4CA6$1ihStZG=9 z-NDz@$)N6YM}HLZ)Pf?cK|~S2l7hMZ_Y5pVLil<4lFkf!D2`wfoFEQzWjeT`fI!L* zR_4or9)w|8kI(yPFMMIRYSe`A`9T}&#}iz*1jIUrJJXCSvpIkW$tYkX9NlNOl1|YY z|981A7#`Kl{*#++HYXE*hFS<)xsa$C`7luH&A{BrMzn4&Ara!=h&@RadzP-50aR;? z;@_BDNy!&CYyplYS#h?%rnm8yIm|1Wm$9s)e=cjVDiWue{ZWBkgBb4PP@wD8mJAn| z^z6R3dHQ33M%ut}7RXmWw6$z6+;FpA!`JHJO&FnL>(k7|JunQQ=(*z!2+4ywOyLt@ zi$INwvv1{UPF$DrRT~N(%`m!%sG}8GX0rT?By@h+^)%h4#7HMnjna_`87-Lr{-V(C zCrThF3Y>UT*3i6`U+X12;c|5QP_|ZXNQY*$F?-ebV8FKAq{5Rf z{k#M}9PlK<;jmI`id00?V8B)sjvQF?(aPbQEQyV$c`}oLIgwT!tgri6Qj8sYxz^s@ zV{PbaXZVVhiHcl>^QvcjObpx%}ghwJ=X!jLj_}7cJCi zlnQvAXdS!q7_ePXVPqDLedXl5O^ji$Bs7|E5M_w*SasmrF7sB|IB<8pJhxf<-tG%` z6YsK3E;y^21@wo`%6OMp#Fd$)zg2Ct)872<>1cJYH|%@GZv_AlS43i zm0_y>yj&(rq-dRUv?5hgV-?(+E!|=7}jH=duQ}0w|&ikMxLCUDI4T)-iAx6Ky`?s07acE+81l~qY=6|dzuD&CkbJQy@fv?^OGu%VV7I) zQ=a4exYj!QaGF5;uvUkxy@_Tmnhc4SeVvTPs=$XzVR{+IZ)Q50~9@nuHyL-*T&OWylYhx`6hE)W9K{1rMjrSKUU_Rto)_Pgf3 z@H%Fjbs4EhH(yQF%P;rykHDvGM>qS!?DUsR79FcE5-JQ2%k9sD!$=hx_UMk>l3YBU z>Zp5ETvSaXsAU9XO)7?a`NSOT`TeN+Te^0YIkQCBWm(5WtXUs8WHap7E0K9Bt9W2i zY4wysgmm#YYsoH?Y-l3Q`9+*n#T|zlDs6-ww}S(J^Bk}9*LPZ%p{z&Mu2fm<3C~BR zCbKa+*WJESHT9Y{$oL44updUbE<3!Nn?3?KFJ*1}_PX1sGe3WQR+*BJO|qGkliB*? zK`||A{~>P?^Hywiajz#c^9I69{dRo1!;34#WbwLK*?inO>0dM!ROhi*g@mC+jv>RB z#PT2D^K&@PfJC!coUwvxmU+b`{}GzUkHkMolp1nDrFZyB5bHGRW{)QH4MK-;yHU5N z9!wE+_9uR5ua@uzt1f;$E1K=GOiKqsRnOYFVS#{Z8veW3KY!nLv(aqJ>t#%M)SOi> zR;vUF^5Nq^P@7)*Q(pfw*&nc}+7-X+(1*YFGW)i1l}QUPGR2if5o0F%lHjssYe!-| zm=@D_VCQfh2Z{A%(wKu9oOZJwEXJw`h&JOg!G3UZGd zUK#aVY%kgtvQs8Ph=*7E$fy2#n)!6Lzi5Ab=l4A95gn^Xz=pgl$|=x(Ovzv+76ii* zM-ne7_jXIiZXvmyjsf@u7*!MI*UF?*Ne7LU(~#ay#TE`6@_>;kE#_dmY$z9(mM&^vsV}(fDo!t)I<&%A)!T65&!bWZrd9kq zzGUWnd*5aYf5Dqv2&1bTp!jo|hE6mz_GT5#{iv)m$v`DfBHGh)g&5g;z1h=@INEri zbO%55d0y6-k86qM^XikP`E*nc{W{7ULBrS%q?im-zl2D#atb`K6QJ_%KQB7CPYQP{2K9X z^%?;or{+DQ8s=iEG^&p_`CI$;{7QMoJS?-FhMm)@wO!9?OSU*)Joa|7%IJAt7(w79 z!CR&2eT*#r;u^H*wvRT zv`Kmp0`T04r>^<5STNSFxbPGrf{uW}Hd11(;`)B{asM(Trj?hHgj|`)!d|U^fiehR z)Z*sd=X(w#D_PXiSTJmB9DlN-tTPuEX>D;^7?oID;+^X-FVm43Kll309o9MEC?a}>u6^fK-FiVT}#Q;InNnjl>NLlL(?|dh69lulE_gIFNxNF@qFgqX(nl zxHeW+^Gokqi82k0>$)AqN4RHPGAqboE1x2{ESP6xl3w<6r&Yhlb|zg=Ur~WNQL_vy zWeb1Z2SyA}7;AO_MFmGp3-}>J#u3;cqO&TNZX}lvYDxt98^+t>H+o#ThIMurLZb?$ zbs2=}K)_YCYF#BrhHj;n&~tQAUCg>z_To_8kwY3rA2N+U0&o-vV&uVHjSxf9PpWVe zE{5PrLa8|Ng$>xzkr zd1QSW(MPM~XxY+hP`XbRdtYiGk#Bc4X!P3U{xqK zvK0{*7b@0BD7?xp?Z&XhmD`t7F*O5$zNFG5nbDB_UfL#7SjrPw6qD~e_7o(-rr5km6cT#7*6ifv^IzBi*+j?vAW(dx|1GWv{QInOOUM66 z3I2Ho{)zhjiTeJD`u>Uf{)zhjiTeJD`u>Uf{)zhjFA?>@8vYkobdkAHQ)R9??7PqF z70P*>;as)UwNec#r7b}c=djuwjfg5;NBhUOHyWKyCl7LSPGmoKmYS}UQLL_xR)P`l zO5!wz(nvv)Bw5PFjor@GZN)ODd%+V!Z&J2_(MVgT2>G=2mC5|J%bD*QV;^%L^P1Z4 zmPlf-}^rKSl;_g+1|ZZ8?edn zwBP;fDBXN|Fj@c7+Z>gtrg=J1p6{jM5Qq>I&-23Z>LdEcORp#Y(^p*7uUI{ntGZhxG*K-J-Jo z@r3>-)m`e3m=u0MP!@9$zG7=cD!MwQjHs&I>0W@yOiTAm4bMFSe+Qs2>G_ELGnoJF zj{orGm|hv38>Kp*&Pqw`HIG1Ofj)ha`K(<)_DJU^IaPc<)ifEXU3Hs%b%FhKzxnAS zC29BPgY^57`d7@kdMeE_{cnhJj{+iRiz`XWKjWAZ`IWf)H=y5scMVr-otv}ZdE!`} z+wnVOd7c~oN6f2|(=&N~@9+`)FQ$@}AIl$W;E4iCUU(eC@cPIP$2cBP__$bw8I@1ozOx3O@A>fD;<-9}M zGcNX0Mg~1TKcvWxCB{K?H5jY5hx2=e%lS>!rkk+=s)uDIbT>ux-oXRb*6ltqR3@rQ zF$bNFZwNom>if~b_K*rZgv@$1C(5;LTi1V8{#qVj6oZn|H=6wJu@V(7ol19;s_&j) zt&S#Owv9uG5e3oUk!$KE1;JZjHEz-=t?6F8uWNLL5R{cnHeI#}0T!~D05QnJK=}v| zmiTZ5LNGqS&v{{s<-g&W;eFDre3%?QKJ8C9wTNxjE+DFWBc&9#Ydhr81Rq`kgAp19 z(InQ@V5-;=!B+JcN@1hY6;Hv;-I{Olc_FpaayaJ0*5% z!Z?9znYW1x1*CwiaTc<5J6oc}iQ_VofQK>KXa7VENK58o8DWhM%I+#hY2JtC#UNm3 z(Uxw)ReYw!Wn2R1{ly~&A64<`&*ub2H0yZN=y{n;PoS%w%~FuPc!uUc)^G{sP$m@n zTWm5K&sRgap^bsREzIm4Gd4L7Q*!SpX-EyTkpc>4bahh=NJ=77RaIVL-PWon6SA^D zkq5VzUT^I+z)1BpiH2$Wp(ys^_wm?u!E(LVc&ZVbTLf!O)gg_aYN8s~=uM-5&KyFeprfEJw0j`Fl+mz@^v?C8UL}W;Gl)PFh-* zywfUCS2ldbNF3*96cNQ-L;Z8yznBt@;7JSGP4WKNi0)Fo&L*(#Ld7N{k+U*B!IT*) zZ41r&^EHcjxE|o*B=z*Keh@La4jP14S~yE%Bg^VAJ}_e;CPg6{N?5aC!?}jPf9kc(a_CiK_N#Ua<$vCw2t|1m> z*J2$tZXwy@wp{3NU<0PhK~$EoakKNOP`ZH=%QiumWOB8a2Pid>ehhiGPHj%`Oj}Nb z5J4&LMuwea7pGY#j?&25aB(cct;3U3h?a@a9n^4& zca)qZN$W?*Myil8#0g|End0Cnv7LzXcwJ?p^#xMZcye}v(+2kw;AX*K)Yw-{^3g!N z%g8d++8#&X&M*u=kZE#xHi%QA>|8s5s}UGh+>?<^>1Co-tmD|%ykEI#E~ayBuEBL} z22c9gBcM1u6qScdgh#qC!aA)MW`Y1h@q08(Xp(^~g-|R5XN}&jPjjG^s@2OQ8X{;j zu|a7SYLH>jwSz~1m5AsdtJcUe6txssXcX65r$PCu01Fc7#1%=AkfasQGlgU{08FZC z6f)~3iyFT4A}K!CXsGT??z_!HJk7=-kR~!Exk%7_v;0V;4}ag3=9XJ(jqel{^Rob0jDQWi_iMK>}zpdLptW&iTlFN-~0YjAdml@WF@ zNiZml$aVukD6e`Lr8xx6s!4-dB)1lE{6wSRzWDbN=k%|vse57J6?#ln;>Y6SFfN8c zTI*1-QBES@rrcQ=X_{Ice18*Hu{Vx$%}`6PQsMJ441DO};JS;MhG+}R-G*F~H0BU|gxt_sIygE<^v@bCzvurWi5u(pA) zIG9RtL|dj3kRU4NFs6tY0|Pgf!`|!KD{Z;{-C|ob>3P31Gqqo4EWgwe35heyr#g_# zdAAouY`>p)iY7d^8bm~4ejcJ(O7P&a;}kTEcEeOqm+j(1POG_pYy~Z;z||^4jLC-h zq{xm8JII8Ge?h6whx#nEb46;zCZ2)AvQ3tQth)r18*vHOVutQD#EBWFa3ZV0p8wvZ zsJ1j3s48ed%p#2FGdSr7Hs)!F+(cFaBuTOo4*~@yNMfKSO$C{U@pAsWNDA>I z$D9y2aB-X*+r5)O)_@;zu{1b(Y_&Cy?Z#jp1tuk^e;G@mRSt5R#$XIXHNx?eQTqMJ z>;wn%5s-MrH7qDNmh%gZ(V??@x|93p{x209G=|_(gSA__Y6y3UayRef>105^?Y9NQ zZ7}ZQan9hBD#K8+Ii(V_AjQ;80tRT2q3m(2nV3?Cvs-LK=lJaX?bi*;o~0#5I%4p$ z$(Rni`g4YNj4GFr7Tzq3xJ$cYT1x_WreTa5YBK)9y>yo20fefeqPnsW4n&>#cK4uL zjZdW8g&x64?_dl9NX0fF=I00R>KBk%=RpQmk_0mi#>-vfZV(|WiVY#G+?jJJRpb$b zHPj%)Pt|=}!G#&eVgsG&uxQf*-emTJILsB}jK<;nv zKi#Ab#Y}?JxCJ!e#A{~%v}@X;1Gb|XhUa0Z>&eK5=nx}WNi~UWH5A$*_fX;!Op*Tw zduJKdR@c7y6A13^?yjY{I~1otfg%NpyK9i*4n+zScPZ}fE~SOy6ev*KT_(@`-*?uU zH6Lcpe42L_$%3rxB>SA4os;bQy7qnltXd+M@2EKro^WP((-`Yl5*56@in3XSy&BYw zm)4MxMl9`Fh-^E$n}$vYG`p~5T=Gun3=KXw&`M2+2ryXu1nql9e^12tTDa0NUP3CKQg~_zt)hJ5gV~tP*OBfydFqLFU(trwe>g!&7l> zFRh zc&+!`PudQx=@K8PF!{>-VW?<@Tg9i1A;e-9qwnv=Bdob7Z9o0pP`}lsHY&qcBul;_-3`Dri}=X5PkHlsj`NN?J3o%!t=@g{_VYRVc_=(|-})T3-)h18Ns{Vm z3u}Nvbex+fy%&A=>B})D*TiM6*LDx)s;Ye#-k?3+JhspnUR`h9TJk&xfNO##_PDt@r2)!yzRAw=3S8Y?+DJeqEbiM$)YYj|njF^fv23la6ZaDn6Swrdyu3D8 z{kxvST6Na&fVu@%3{?e%1cJD@I0gX$A_xKoIj4XCll%PI8b{{a`J$qtTFV*g8i_wJ z7Io>+G5y^XR9|Ej9TNjmd;gw&ZqHTlkLZ`8PXeDL0_7Gqfr5Pc=%uKUOWIa z@9VQcM|*o_RTVqX{{CC|%51S}Aq*=MQ^Gk950A`&FnL^f)`BhmXoY@LEcCMl;uI8A zR98-ECJV`?P+h zXg4(XH&to5-=Yp_;J{sojEoFO{`^@X-oM_*PHo*srSV;5;?7Wi|1i4Ua&rO-0lPeL z1vW|C5Dg|72?=mttuZ&(xpxSPUPj7d6I-ap{ z_HQzQPD7Al{11VenwmT`=pi=g2zl+W3RIhoU?a)O%7*HeL&u4V5*N9~VuE<2kA#?* z)=K>cBQtX%l$cklP$t)4quBoA7CkI@d|X+;qDHrXT@B_-LIPE(HK zw#v)PV=}0t{fvk}x~-xjL>+Aqg9!+R5!--Kbd}7FrFMP?c$3sG*lN%~&$kiMj`tk<^WQM`d6_)aP<}2I{Iq_|O-YjoJnj&W zNd9S!CMEsm4H|HNb-20Q;-Z0Ozt(9uoo_(%>XmlCjkou^?ZU#sAi|^(UWOl!{$2dT zw!Gt?hO>zwB_)idaGf$?EzW0Ozmhw}TwPspc0#|H@gYG$Fg2YEzHb+KL`2@$+E#$2 z=#<C`DeqqC@|_y2^f7lkwVN zRDeMx^QIJ$lkud^;l`un_w~KG$0c>y;tBvgn?K)9LGCzEy4P}L-P{_~CLVm4}A>zzp_{A#QU&Oe`4KIfu3*b|=utJ#~Pl<1~v^9zS3jtBJ3j&ED1~d*7`s zO%16V8BH13@M0Q+*Tv$~_6aiT2D|Pk7$yRG*#q{6aNyyhpUI#5hM-E;q2jeMwn5jx zi<0%CWW6X^FG|*nlJ%lwy(n2PO4f^#^`d0`hbmdH^#4|}RONBiNr%KVCHLs~m_(8@ zFgUUx%eIRreG{MukiXlZ(R%~D(@0~LNDY-OjRVwa7+@c3k2$R%ePwC zdomT23+S8rR~_!|vKb8vSJy%l*(Ti`%g_Kd*D*&HNb~21cU$mpB4|V$=nDQeT7wfrXt1-CWw~1?;Yh09q8t zO9h!72Jzs+haW$Z-Tf>qWZRx!(;|ZWQMn(jkswu?_n)p2S0MZtw2AOJQMTAfx9N^+pcIU`pQt zbjZ^YACSmSTVlED?Mnf4G?816zJC207Bgy~03A^al{5cw3w9}N%A>#jU|lw-l|saN zC_ZZE9mun(davzFvfKRvCLbP2JuEF}vJdT*`<&;4!hHZ!G6Bp3t@t0mZ?tJ#61VN8 z?b(Lem}-hJS~^WX(>NcUTXN1uy}hv)Z`aq;FfkEfvByszz%_EpdY>c-SQKOS%~q^=MJxq zZ4x9&$hXMr>m>vw4q=_mk{N^VRA}Lgej))6VyiG~L2dr)K8_zs6 zz9zqB5oP!j=KU2^-I_r5P=fji5Q9$-un8!Q;F|h|x5ez0TQtaVDF)PEFJs0(!9RkW^4kJtig2Ki749 zu*;IdSybM`<<%d{+X0MPb6JBNOOEx6jA!pnGi|yO1Ka)VX2=2gH^+MsAa6{X>clLR z;U)BY3H@F|zn9SOCG>j<{a!-9m(cGe^m_^Y{zF4QRHc81em>C#mu^F1J028uLPB+Q zs$JFd8E&ZWmwMr)Ld4aTqE-@_%PgZxGz7{teu9Re#7TL5Vn?O;L_R!i8OhD$Mr@5> z(|6^J>XP!rYA}PiKBqo4WLd^78W~hJ5T;yPfj0)Y<%p<{lgv=$~!!^Mg4ak zCa--uca~dBEC1vR<5Hado@S$S*NY><$M#N3ScO>Vr{ zx$ZnD#Mb>`*&=v2Y$L6l0)(C%j2$e+U}cvDCqIE-IC)WX{4>yOc*n)^gQH=pbZy|E z7Hm{fR{Pyv91#&QjgWd#JO@@XOy|vR=vWF7djzb(AB`D2=N9Fkpq)@()hQCjKb(TX z%2ShB1sY6(1nh$wYH5rK6DpjZwQ)VUu7}HWDf9<=n5`D1)&7rnvjk4mrekKZkb#DG z`J&|cr2-?W@4bk6KDg5M?dqlv_LHJh2rIZBU>!lv{!;yN__}L>|JG0|rz5ARbb; zw8Jbf*Df7E=GX3YBpvwTBQ}81_3Q_b-=8H3UtWGQSYhRK`VI!U zeT6TP9En=Xx5tF&iOy)_2u@Bc3sh-1RPMY+EqUngj6jj}6 z20RiZD`WXp#Qh?1poAG{dd7H6CuL3$m&QyO_O!vmGSJCoNl~-eIOYFC88!C>x&VXA zb3-=-CbtY;>OptKYX=+L^E0q}vB5^~yFipAQ``)(#nj-9D0Z^?yQD*}jKMb12uj96 z&N<^s8EF$P+#uw+cgTgTT{Yfs*mzLC^25&=+x>Lf=G|QLUefTt2+scg<41IPW;sgW zPIdr!K1)Ng8QeioY*~EG76!Sr4OwMtzBsN$WaG@@kLZ+AQ#o*SOb$(uO!H-9;WD%b zfLODVu)J)#b(EG-QN2>%(U723a3;(f3!FqALHlj<$5zEF_~hUn=6I&@fJRwIL-?yF zQcWgRs!w%sb@LEdTJGg{Cn5+-mt4%+nM;A9iXVs`^eVBIbiBmD!m7E_oSM;Xo0E76 zDa{VA*xr;fT{})Te|)a-IJFh`-t9Lp$6DoSq<1*`mGmqE2#niDCmQ5Z0c2jk&5B7R>VDK_P z{AxD?mE1c@u`2udc85W)+3~l}93qD3&HA5N(5Sjvx|vsXR#vqS!CMO$&lbPBd($?3Dla8&zgSXp{Z;}>U3 zcvw1Q$jB_(FCBM6rT$3hazgr5~ zZsdM``rNg-HI4b&ovrsR$8Omy!O>qYJWRy}b(l&o-_5>@Bcbl=&TFZwxl*d4)X{RPoHU>*)l@WiE~POAKk^ecAM0DZ z{5-p-H@XQU>n3l{ZB1+VYdqoB&Owa0`NJm$1W|wFo-bK9@uHCE9Uu7J&_o+?rHO{z znvXkw+Af?ScXV{H>eX(2=NFgO{^`>X*O(70lsQ-fA4^eaF!y7?pn%!0FR~}ZoW3@H zW-+3dIV>{Jo7Or@FRF%E?pBwY$Sz{5VW*WA2Tk3n;FTb%1b8h>+J}Y72GLEtkZ^qv z_bZCcQD;U*D%+nxF<->>_Q8OhcgBfoPggcm>-SuyUomtqf<9>pV7WYS-rDAddL_sU z-9VQoz(?rfWEHbftC!)Dj2MS38kM-!m*S%Aa2QW~dlWQ!c<|oabON938MNz)ES$oO zS{d(5!XB)6#7A11c5)_67)_rU9*nIKbn#rF?y7t>`dwau$Hx3TRa9-$iza2YVjib^}O zo}{`8;>q)K&Dk$w4vqVW1NdI?%@G&lbD9j#d|>$1`hg|=fIlJ>+(*;LD2J5{D=Sxv zS{!C&W!+N$W=4U~*K6~&rQ)mExjB{bYo|8RP|YmkgDt1fup#T;$KG6{g)qgVe4XDe*aZ*tQZ zP+7Ll7D|}8QVjT%=relMgPbn@1Onps6${D1+zaFUMRhp$QAPl!5=O!ih3V=6Eev=zpxdP^zjiQ zL$Rp)a9?GOz$6_8S_D5FWc9VL)@4gmN317g4gVbG3<^~v_?9p5v%hoI4{&vLb$qyS zYIIohM>oj!zxz8jkAEyS6NcU=KhA0pF5*c!iVf=*9YbJw<||xjbI5APhc&VH5Q$aizOIbAg=fNxOHlM#3U)ZZ4I|hYvh4Z;;-5|1DI~ zz^7*A)6z*s6&) zrpXb)Uq4t2lXR3RX%-D|*yAW+n!LXK>@CQeM3!DE#^l%4g_D`N^}*=Q_s30UTF#Ns z^B~SyPjqMI2Wx!jQpt1Nr&{M3EY1-))yK`I;^z9NG7>)-D$c(l`y;zbW1#u;9s+ID zN9I@}gmM0L8quP}oXk1C;#WOC)|QOoK3E@p-2R+SglM3KoZYn7v1*suncS4Bf@rwE zDf#VbLfm-!@HFn`<{1Q(19=KW{J{4AMjxkyJ`VlOhW?i>h#Z98{Hrt|3Jw6E;DCTH znS=mEKAIASFfV=T*jPw3o;oXPB=RqWEvh`|Pjz_Y z=>2b>e4DxU>+OlBhI!GQiu0_xDTHoB)D(Fh^;ZzoQb}^G_28lY!QWf#;(^GtjsPZN zof(zOBMk_+@fQ|mq3%ZL1VEm%D2PD!n~ZKw(y(WYJ;`)~7k&IiAAixuU-a=8ef&iq zf6>QZ^zj#c{6AD5hXvG>wPcci-j?j%wcI_s*H^~;oCumPz@jI#4RWMbW{`}PQfX4+ zw|lMKrLJ6{V3MgFQKJBz)4p6@j==vnN8o+CodE!V(ErOT%AD zUb_Nl7wA{q%TN$jQG@uI43pw)SyETt*<@KP+2^D76@=vBl*|E6Q7LVtfZVclAiNusHPzKeG zRzW8E^hcn3Wrbk4H08UN_Ri5wEta|>S<+W$_Odd_lGm^`|DbOWqL|Mhqay%>yQ{d@ zPf_L>J~wjT8H(Fn!CPFTgv()~ck6^97&Dx}H69}Go)->#_0I#KJyPe7ZNifO46}la zigcBvaZrSsiX0j;F*39XO+j8-19~g|&mZFdS_vP$901VEL9qw@4=>>^U?~JtOudbi z0dzS5TnnXs0pJ%Kz^R~PArDkH0o{|BD7640D!{28{)q_y`vAtnG&G(-NIHNkd!{3N z%2I{7!weM$(rblVXa!^f^%2>e5Oj3d$r&dV2v~6WOkhmDh_m;4r4w-n@?xx?j{`tX z0v$ zFgE&fk{sP1T#kQfb4-_urQmdToiAmDlk%QSp&~uJMi{0^8bORZpNduo@*zs^a~!Kx zgt^HmMG26wyIQ+&R`p98(^UyGOd04mPGI7@b36l`D`g(ezL1FteH6w#K{`HkO(Q5- zsdYC+aq_WPlCe1=b~od+DhH?FcP_gCdVUoH4jvA-9U+;> zG(h+L*=%Et^&VDq?G;dMEei5UU@I~F0DGmxfT`=+y>SfyXKfBWKNt~VA(p|vr#zmI z#UABy=m3a?LZTA@yqBhB*BY%88$yJd(K&(4)eYsLpSppoa206IOC9ZVL=ZEs2vgRg{MCH z1;%cwWtlH%lVXAh0a#-|Hjs%KF=*~;#U261xOyYH=N35H7&9I>^xq3Jgf2? z!|8xU#2s3x$&z}0P zPC+!3QLu;*5GMfN4M~rMsm}@#W7zN z2i)U044_5aA}$JVEuKVe0O;k#y6JXJ;8#L~-~!^_v64lAxGV^gl}4`#&Eq+p89SwDqoL^ZYeZys<67}t_(vp+DVS78GDhvu2 z2N;e%Y9;?MLTq{q4Njyf!9HWP$(<5?obnk(w{-u6FqBRL-zp1~257!ZJ(58u^|Vwl zm(o%Wod_UK$||h&r03sNl7iX#SBKddUjY!O_-8}|Jf(sq*Q|?}O;6RG#)C>DG4IF2 zEa*#1utBkc9I<}WcQOl65IeFP>-T?WBrpM3vv6?{9RH62aTmW%MN-CQQFFzp_b!_Fk1^>c5&xibRfgGP0BEG{0~D(`_Br-BJC{BkBF^0Ng*lMRm`$ z92)X^)zalzJrn#21_&`{y1K0`QZB{^BY(`2L&FiHaA4@G&YURiil^S`;jQX{1b})Y z0d`NFllMTo2)!B$5`=~)STe>!Z7PByuZW&Lp+fK1tRSB9Ljb}YfAB6pl9)yBT9ZzV z^6Za?BP?j29<*gcA3`uCL~2C&(-nI)tK2Ryu)6=AhRiPk9cX2VLcXFOUV@gF^s1Nj zW-q47i>dNrs=SygFQ&?isq$i~{D+z<2tWQEv?wTR9uf=&eA3vK?dQgg&g0g?3?k+t zjEUeH1nZ!iMAo+@;?dM-NU^3~;N022|cJ4zExCmPMoLm1?4`Sk7plWV+5oho32 zM!dM&!x1|T?Xyf&Krqz_jo>csG}DQg@iP<%CiD0YxGLF8Tl*)eAmMZWo6ny=gQ{)j z*%#jG=nUPS@3&LCt-37D7gu+U1`NDo<-_DT4@t-*+vDRD632npQ|nc z$n8ys%Z|!|7!QvWv|Qchu^%mox>MgTM|y^)p%1AG}V zk&(#2my8SoTAN+mnqKZZ0m6xT-3~SPB~ow%Dsi+XZSD zne3t>`h}E~6#Da-8FdM9O--EF_RENV0PYVzQ3@zi?jLF#lt~7cVy#>Gw$tyPZ^sjI zbYze8HRy48IJ{sWEsaoCPL2)}2?+^k_q%^vm5`9o1Etf^omfi%>;}y_nv}GNj%_Qo zc~Bx7aP#O-O+y2RMn^{nw0oYyL=8}f%BfQe3Vwn11Ki!;D<~?$P%<+sPFLHn2=?~% z6|&bX9dgG-Mq>B--kg9S!^83q{$jxUZ?7+ip(Hd*8=E9!US8hePStEtQ2duK%&*A_ z2pC+e-&HzSKmlPbLz^bIXMX_Srw2XWb!efvvuPlXTqM!U)wLc>!@wXn`Lj;E1e24G z559YSo$~MBzmh1aV|1=1rKJg*+ObVbhqh4M(+~X^DB&!fg&2fOKyZHYTMB@3^gQn_ zN)LE4CW5{;*v!LB&(9BykB@V>Rr@mok*QEPQ?m_sdU#9>T(@b>$=**Er+_^R1bFx@ zgX}2=Jt;#e0qLX>+G?GLqobn~+`UszXt9sF^QfCDB9WCp`xOK(;2jhm@#HnR@hjwGBT8ObW+1> z%V==%B(VWF88{C}Xej*N{{BFB2|!CvAGwKwf|6A6`_enuSdgEepP?JNw-+=_ObQo0 zrZw`iySux_n}abDiv{yAxkZq&QFsJ|U|%m))wuD`$WRcg@OW%^QPP@o4CaYvd2rGj;tH!Z=LP@zGb_34uoA_)uUtf7Tu#(z6~{Kx<$xM8E3 z$7_wC#Aj!7ENqRXa`-;nU_mY}Tw977KW)1T(%C>iYk#@_>aBYu_d$o+@)9??fx7gq zvwNuxUxv94B_<}wg`bo>A?YzfUv&dbl!fU>P9yNx+R*a5{`L-th1i|#;J z+r@e$2ox`egOATQbZVt<0;P%d_e(2$R{RMY2tZM8E|Zt{j~YA|S67M_Rt^pXBAmoA zc?ydu87hHl>NzDPh#3>`;%;uQe*XLkWb!*nCf`CiU_tOrOB0QDOW-}`j2mCkzz%L{ zv_ziajTcWTbLl)j{-qzw{i{d8V+ZXO;wp^MAQiG6j+ zFL3ozBK?o|*M%e%exKa7hOvHMA1*aPIgW*D;`(hYJe!x^bRvtke5F`dM=LDz2YY+i zb-Y3{Wx$iIl5%nP6ln#nzqPfZbXiM_Ue4;`qT)Z?Mm#(`$(dkA(lHy zMo37>!GQtk?Ul?Ow=F4e?cTqfjDlwqArJ=kil8Sy-C_UG5JE#EF$sxzRS*>3#j%p% zcYmeuJMYgv^zDQwu4%gF&oE-f#l&R2CKQB|Q~>?CZ1~oJjg8&^Yy7>)C-`skV_!vl zqXOPzG!Zy+7{@ zrG0(d$F=7;2~p4d#O>{?7`xtrX{f1bQ*F+L9?ly-T3Cca0cwbg{%$`BXn{p1D8Wsj zM~%p|k^Eq->$$B+M!nmT_v~mzXoNqGLM-Kj{c3wl4&pRZ^)$hcyx&lC+Xe+LaXp2S zC7yoy9x#2MNOQx;W7-2Jp=IJ9H7sX=~%1i{!@wB0zwYWoBQ@ha~BrBL-!2k2$>uj%r3oZLeb z%JT!+%j(}elxZ_pt}k);IT_Q=^~564e7QT*<(3$WaiUT~oZY*G2t56^oa}>rk~RFS zNJ$^YYN(-b%R%Dmw-vB$5tkpPYCOQ$fim4ld|(erN)vJkd0k~)m0$8Dl%%x0Sc^!n zkzhmAdl{&cN|fs9Td{8Y2~D}V!gS?XY38uwa5yl1!ln9O(_%+RaWk~U!zk1gXnn{2 zF8keHgXS-5X$G%6F*K)P(afe6K_Hoxl4bbQR@PSE7S9&R7S)+Pa+az1i%|6E&Z-# z_qoVwzu?k@!*6uyedG0ELsG56SbZwA`LNKiL93FRtwZ*WlBBMrqoh2dN3fl(EvIpN z*xIw4z(+o=`H(p|$+_G62ae3+9S@=B4-DB;bqf(B2q**zUs2lg}nksa=Ppnxq7d85Fn4 zKbb-!j`w`IBo+ZIzga<8U+|j(IE92z#HVyA0JhvLAbN5TL`ab`)z$8A-WPEqY&t+8 zfVD3PVSd_lImCjDmLUVo%*@eF3$}B+6jqBE;@^cnkm^X*la(boiHSW9w&MKu8pmC8 zrG6^|VfMdzh{A$|a9H`S5!-`}X-QzA;Ri6iyo@SNiw!b<_E&dzbgZW2YJ(Mu?tJec z$Q1H$^fStazV|$hrSrFRvNUwFi?_2_5V&JfpvM>!A}zV$4HcLG1os2b`e>F)#5q*T zadB~e@3S-uTnv%}@grt{XU!uV0HuP{5^p8KOO$FML(0mSfeoh!dOiifG0Z)XOa@h8Z_`Ge)MZ#lkM^;Ab@BhsKPk56vIMrd}0Ad2WLdc zmroF<_t1*YGdhKb`_`J&^)YdAO7-bq5Y{V=mc1FFomSm^i8x`?en@rbBn934Zpk;@ ze6?hjVqx}uZ*Q;PXTFJ;&(G(f(`0PKtTsm{ZlFIZPFha7M@_!{@n}VIv=V)@-QhqC zy?f%fkfMde#t#DD`~GuylQ0g_8X0O$GBYqF~VZqos`H&r!qMJzQ*0LaRV!I$? z6Hx^5-Q@nIqH0Dl0TDEDBgu^`9PKvL0Vs+cKn&{x44Qq_5zmH~RmN2S$Gej{U^xau zo_7~-X|+YuI_T3UIKUoth0hu;hWpEF=@06gov?qoMre7?9-i+G34pEh?7v`Agh2>a z)5F(GzX`-&u%3Z}#=cA-K_u=?v^?7)IopT2aS`>0EqAG0^7(D;)6!C=O?z*HrTQeE zGVuwFWXuT)cEe{}NQcjLWRSqA#B=8z7SPbpFnHXas+5%?7kw1L+ zu>Dv}*LrasIe&c9CXF_<-^vn~@gu!kUDL`Uek68;8$^eNDX-`@cllAX=5Ve2^@beDm6@7+e(34&oN8i}gv=;(~tYP@B& z2yNu#O5)~IzVoVY(-u=Mjzv9DtFY}H?&qg}Ho^HdvFunkL(50V#(Y}{YXIk18Mj@Y znd5!aXu{qk#Yv00l=DTPioo-abOsrLe)qU0QM%QKBn%LLz>}ZU=@;XY^~ZM6S%$)I z3b-R8Nj_#aK}KjW2YmRc(!_g8&VyPi9lj^cH()<~O!S)- z)EVD^YENI&X@2sP`%!SRba#5b1}wNq!Jx}amAeiqKD8CljLI^gEE(?wc|MlC)l)}S zR>UKE)E%5M*(RX+_RE`?%6L7gCun}cRfPz7X+qS07wOzj^4T&^S=`D?Tr$~uh0g6c zp(C+2re(C;K`lFn_Lr#XVrztK+|g4B*VEvRdY{cybK{a0N4lY#+8nJ9c{D-2m$tX1 zLEg*}S#4S7xY?Lj_m@1#Vy7%fh}rTvV`wS*RB^m;l4JumQW~R8+bkqx(VM4OhwgJY zQ`0v^jyv*HR5CGbdgB=IFGT{IvUV~&TW;I6+=Bk^*m$7~%O3t!6E-YG1&i&m4z!t()2vi)Pd}X*>4NiGBF{+kA)xX&_wT&BrlO zW9+&J+r&E!Y=h?)j#x4uV^F7K(cQ^8UuU!6s9}R@w(5nF zOr)5!r|Bi^^!7BuZt>CQ8qm0o!!o$C zXsyC@E?1fWAEHiAUPdLTNw_Y2rm~}{(ON*jwNVkx9&#e(Py_M8AOs%6uzl-u)j=k5jjV!<)TJLZF$~At>@XuQDE%9LTZLeAAs2a!i)@hWw9?<=GG zYGXUK@sGc}f;)dRZ4Vrh8r{DWDXX-}JZ`0Ez*A*c_xq6r3As-P7x@9VzM{wcvDi6v ze37<{Uw~fmM|>^c-baeN@P?n7g@vx z+VA;1vbrEKVp>iW6y|uWp^cbWEN_=rnf3SVPqnd3?!j#xK7ZVM_9pF-UcbADQK`~9 z#bXN>4wbIZI}P&cj!X)}j_@pf9MJ(D@K%FnayBO&C5~6;7#-5ry1YGB@Qm<4aq;19 zI=+U8y5(^tt{t9c^6u$$8nflGn-!Ip1Q7Qhe=8Hb^A9 ziNg`8+L|_xnt#Z$bTWY}AmQuSSlcTRi)sUhS6v_=>($>LuUN!||5J?*_%XlZeFF;nrQpZx_jfmhFPZ#M;x{Sw;s+P*^hHU4OfCYt3Hz+osaidPsfjBe%tA#T}&{V;37n2tTbv) z8RN)q+`#|20g{Gj7H2M&efBoxPYREoQ|U*SI&LxMl94;Jk8*Pi1KL8OY}c&Kx?D=i zad-1X^e&X=U5T=q^R(nDRxzabeiYLLC~;rqZ_o#+*Nv$k!m!s@NYI+*I6Wzpn@K!{ zZ?z6umT70wgXpNkpDw;_j(iv|cyR4h`tCTo6KJUJXonhV_nBi{aoI#`3nti1$npzE z;1zUTCQ+Gb`jaG~+`HaJ7Sy9KY%G6fG%UTRY`byfaW=78{zoqI=L>r)J3Bx2YtOeT zl5!g&O@;!Id@GI&|i%CcXtw|WsJrA=ymQR*+2Y1D2-P75oA zvE#Y5LNY6fas4iGh#dmq-1p+OKMztHnx_d8b=OT(aAlDolyPW1|0(6a@*)4S%n^xP zg4FXx7~_|Db1&y0GQ0x1ZelZb6gF!PwgY;hCl6~l&nK94-%KQ2?7!zlcxtPraG$kE zSe2Xl@>mhtiOt~^;E;w(XNuG!sXx-Be(*2gf)br*Vkk*u@ZYQr;KWa`+H6?kW$0^%?p8?-T|0)E zC0p2uT|8ZU)7SwC`gr|s80nYZ@#u5GxC_FKn6+wre)3%5jG@NxUO|)u_R&@@MuTIC z93Sr5b-;+{+6A99tjuaq$yd1KiCIKbMdr>Pa9qxs$onT0HI4_%{k8W^vJa8#a1nL~ z^(94mafyGk}c zy9g_U2)T}`G9N(Px++*E?U0^%D=^MNPGco<4Dtknc{Zx)s+l{s8qd}-?`}H-|&W^%Jf7f&YmRp z^A5{>ku+~3t5;g7sbz=qul5{SFXj5vGus4=e%OdQ-<~-*NTsy6lZ!@@k(tPu&zbb?(dsO_Fc?;t2sf}VR zEA*e39~j{=fdCqL0rtQOj-NhLg=vQkxOMF#z9}oOgSethz?g`k;$Jx9n88wM``@C7 z=p)nitB~NVzwq*88f&VG$f}|mwB}B7}4XqQEo-N-zy34^l5{EW9E@ z1gGD4p?v&8H7PSv%5;InX#Fs3d70mDajf<4YRW;YXQ$Pt%h+*d|#E&V{hfa<}G!41RJ7Zpu8Zj4BZ2A2446h=(t z!iuFQ^`RWim4~cGIDm{*No2ix41@hm&k4Ppuh8r6HW3(6*NeZ=1;>1p%|hrihD^He zcai?^3hnN+^wum>thPz68@7<|M?U_JKaP3TkbBL|{!?ESS#omNU0q&^e-8Q26wzRY zUG4x3p*_qWO4#B1J@G+J9F+D8N|StKD^ee)&`0E4|bnrbHea;2bL#ym#l z203FX@W$dM)&l9L_*O@-7JOfMNEO>js9zNVwQQqb#N*o&1y`#0cu^nROxrj-+ z>}3GXd;kh7`Uem#ASxJtH67Ak%wBNtgK|GNIGufqf5DaDl`;e7ED|_d$!A|YLb2F6 znhBrooj8pbo~z}#S@Iz`N>b<7XP-W+RI$tvJ<+PFvtX%D7^I_q>*{#Oao-(FG{KXF z>@G5~EE^-IH++$yDTKC`(bDpE{6S@s>-zYJanxdq<(@soe9;>8hR-#i0t^SDi*N5S z81^1@ioOqiOlp`0-he5kfbCXm@t#lLjnN{=VRhvuQ5p%c*)K>6qfA4%v`oiyWG6Y4 zYD38@bDZ!6RF^E5uvL51@3|d*C7ga7(lBaHfuFSw6}L%(rBx8#k^9nJPK}r$h?8&w zh}+tr<}tzW@!E^?%Sdn*N&<#B8We%ink^ra77gr(ltp)x@Ql$ui$~d&f5N^QLtMvA z+iAo-BX5nbeuqfp5eeh$A9`*&>}hEt5srmhy3JAW7({HBmJ;z+!l9fjnrF^i4k5a*53&2Wqy}RCSRiCf-iJsrhv3E|+F5 z(D!9saOb{9AdFNM10oSEvVBi%{NctJ1eY>ja zH!fjPtqca=A5B`E$asTv5ZB-9RYqE&qtq}ClftcNH=jMuH+$_^kaPuNM`^}!%dbSV z6KLGYoG|CtO6K)3b!Sj!@iPb0S}^zEF8)9mzn;Snaa@HZQ#1d7q9uy^_Q85-a6Mbw2V8L`zT zuIJXZpffQcO7IoCo}aIkHu{{g-u=AZ6RHwDWkXSitfV{wD_D&(58!!EV7`2Z^5OZ$ zD2`ybe=X@_Z7-h!bVf#DwA@yb{Eb&iFC8d#Tt8Qj$EPNT2EEH*D=mS#zk0Y$l~&bK zMrCa5x3#yYRvre=aV2z zqzg>xlFxr%kXM;b&A}n3qJkL}9j$F(5OIC&yE9XT($v)Sd3cy?I6C@~mSGdNpdhY| zjg7*iN33&m-lI!P(Xp|9kmnfP-K+;=N~YhJ+QJE)eoZ};{Hxpg?%_mx=OJfl zML~s(U;b^Ib9UAmxgYCL5piNalyOT+OSQGN4_ko5#Khc^lJ|SB6m@mQJ@%J^r>3~T zV+#EaAVt$}t+%E%BIF{$EAe&o>0DQE=$+s99?b6H;bA&)F|mUo;pJ~3PyfXH zxfDb_u047Jc_NsdZ;!02rJ#V!=WLHO{e=Z!zrMcy!>rh8$PvWG!BKeiYhZS<>!qjr zDfa5}!b0HXCD~CIRXW@>EII;+ zp!%nxtpQ$>{erNO!7uDuPv@2K8n8=8M3)yO>ESDED_i8$5Bx7aa$0(B>MnpP7#h@I@_jf=Llh?Oj3CPjpRs|4I zNSCQ-*F;byrMQ*z(NXQ^y%*^nrA0-|7gS*ZeSda)idlF!aY=f-0XBSK^-i& zgc;`{X+=N;9LCl*2XUfS=#R_FSKRWa)PlJEc}gwGAKo@rRq+}XFLp)M&gO)MXPZ5o>Vuc%XmkAgjpI!pzdn2HvA`C ztE8j^^D+PAodbI?3JK;-KIWqArBh3KW+oSGrD`PWE<_i~{Fs$Rdwo^ZpyeEmuSb;hb|@LbuMJ##c|KDnutHoN^!bu?3DF`}F7W$)#c z(qm7zeoSjLi3jSEmn5&iYOPMErAAd(Zy7KOJ^uF1B}j`oaezt5q&tSHLF76v(y<_5 zMR~vNY^kFzW)j>4E`3L1Y?3N<2peO z`ik1xlxE0dV%sCnmhW(;%NJJjE&>*=gZ*wN4-f&z*Z40}z6~Sd$vhb$u@Elz zwfT+1GUrE+&?7gcw$brc>!z1-&H|s-9YbQZfdt)?U9$8c69Fp53^2Mdw;i%jg66W1wXr; z5jmqk6BY``&!T@z)oq<+jH-_l#K+ufVdJ=;i{%vW-y**cb_np2^W)SHIhf4d>j0!w3WPt za^i`D8%7%3A7RZ#kw%VAZcX7yUXh|!KrtRo(XYoN%=;^4GZjD8QQv^Qp52%9?H8;h z)g+cADt2zY;*x@rr4nrYWBozBxMCAszj8%=e%-ZV%!&7<`Xw1!zjUc|t&7Er!b_}+ z9QCC0{S9v-(G0uQx;5qUwX>^C*IN7Nu`MWSyf_)`a7)A70|k3ns)lBLJ=j}PZfIJf zB}C;hm~rni~{E za*lRY&Dkc^$vK!mWfU+5LdAdqHbKF$xoq`PLL;si^Z*?xPnG7l-gZeze)+FCZ+r4E z4?h#Sj|*A*s%?!%G61Nt05;opWrF%$q<(63Fkxb_W%Drz(XoM5){m9Hx3_9yV8F^} zG9^pJ&*>ZhK~|!{epSM(qJwF6#hN2eY2GncnON0d?8CrpE5Pr8u}t@Ot}V?Cxeglf z^e{j|C%b0e(+nR3;Q^ywdR%4UxK3h#G2k+&VSB%|N&em+PO!K{ZH!&k(dHM17-V(f zmV2Kv55N+c+GT(N)KB0^Nz@qhumBynFN-w@1c3q;+o0-_B1%5<8ICfy9n~D|USP2RqtSQDjI$J!OLwaT#QSl7f;#>2p6um{}*hoEK<^dHj}w zX=c|4K0tlAvv@{ODnJ&*7G!5pZjm18;O6||tYvaw1nu_^anJqRH>%?T?5_H`@1E!< z>SRgrn1segRJVyTcbq^7KAv^$z zO;FR+>g`g`d}g|dEPxh54kEtVd#rSF(;dClzxm`>J-;sLul-so!Ldi!?qh9vQV=tk zBOyPZ5>ciZU_IB=!^cB3eu@lR*qh6!>W- zO>Ve%2zs*D*SfV^_x_ZPf1nA4kRD8H)={%mk0)wq5R-yLcmdlWXPE(hsV9wPM*g{>|`yO00U931S8pC+c43Redn+ ziPh#*Z4?&pdf}TiBYgYt9U|{znt#x{Hjg0%B!D0R1PLHW06_u>5sGfFJ?n zUkV^#$Ugv5^{9u3q>s2bIy*Y5IYNX(BgpMtw{bePn3#y_-MjB}D>gD>GXpX`Rqn){ zhCS;L;}ga3W@W#ZvS~|pTqYfkSZ&XiPZ#%nROS@17_gqRJoqrcrlCy|@Ll=A?3!9c zZ0Rv(JV|P9Q9&U~7<>MZKe=nVNbH~o0fZjFJbzbsML*(7mRLI6Z+ISYwZhk1Axp-G2^k9@%?Fi zpO@$vg5KX-?gkb)FvvduVw;ZMOh+A&CNp9pyzIG`mwI7$6K1@q7Z zZobbB`OPjZ8(B02YfQ)Or=Zh=xC~$#vX{a0)ij?*s%HXom*{*Gcca6FIm4d^Y8yhs z(;bYnYfySk!o^61e|Y+$_j^DqBZ+|% zrfr6isFv@eCAuwA32;K?8{Yr?J#*dMF!jN{HxQMF(8c%IE%;tTT1g2{uTuL4pkuY>;4s1REsSAi)L+Hb}7fmx2u_^B=I`)#>ITP znvw&9^Y^?yrV*M=Oynf;qFDzT;^RybrK=mPJzuke#Dk)xWCohc}n|%^O_} z;u!$g)C?w5XTe8w!j1$m;K5U*ML=D6xBnN=yOTZ7_Y$JL`8qoh38X0v5A@~Z6c;!DvtxbL}$12Nb+IQ*kb6yj_ zbYL3w&lH~@5x*nma}EL^pWQ^MyHydL`Hko;kMeGOI9P@FWREP=q7d4VQ&2Wjz9(Ab zy+AY=51D=S=Ka;SrfrSexIp`>va%ljYC}p8UI|QEgK?MsY<`oR=qied-ypjI%SM#d z&&fr*t75_P1RvYUyY*lO45_fkX}@a{OD7 zqw^o+s8U4~{ta`z?_oQ^@(?eVREF@G`)D|i@tf##fb7}A8$9-i=EjIa%xA6m-#oY2 zf)Z%-+}=b>ijLKq*Qz`01r&C?3ftH}GuCNT3VCj`)vAayl&qo>F@wI7v>g$VFWmCO zP7@&6>Qp%=CAGS^$GB67LIMLzn=QYrL)7~nIc9tGpyMZinhi5AMI$8um3UU)?S z14os>=eCK~8_txzv<%UFIm54@2T)1$1BZ3RFT2+HtopgM+wu0;Dq7MI=ZnhW-(^oG zIqkxZ#ts#}pLTT8Lb74$?C>hjbTO;DmFtnBV1OiE7ggl9$HTeZo14z(_+Tw)A6AdY z)f{#Ats5JnST9L@AowsmeO9ds9mHm)jODb$FX9PA}xz z&$D1aL1Ju`t3qtY{Gzt_tT2E?E54(<A?_meb}P0Y zgTdQa7x4gf!%dr(x9CXVCyg7wEC4MTv*1_^b^#=nAgKgNB}ghkQVEhukW_-C5+s!% zspQ{ECH4PM34m26_I0Ip!{z`!63 z7+r`21@+afN!s@8b;5RdG6e<{aM#Jk`2A~0AK_@&&W9TAglq2Wu_otPWiZnNpz~Z9 z2Z9~I2g-r$mFOT0cp$h?3BB(kI!*i#0UVGOuX{806%>;zV#-~#2TVk7y0cS*s4Tt{*Zr*G8lY;Mecs!9@D4bSJ6V)Rgpe@ ziHjE zlTbkcLiIU20wp#U_J&lO6H)DX2K@&^ZftN~MAVn7Ri8Y&sn)ZNq1(D?sm)Kv88sv5 za15OH%KX}bFq~ppTEdm!{+_2L*^LPoz-0| z#403HmlQiK=PI%LNR`tf@7du{xR;XIZUW0xb1YnX-L`p2?ZU-6f z$AZSf!173aTYc|?j(StUg933iakc)TuS2;*Q>lV!lDyM=n`xVA(`m~MW=38{ob^TZ zjaDkvKa2_t_v%|6LXAWXKN{#88P_P5Wt82YYAI_eBt+s55`U2RgT$YIDgJ=I{DVK5 zst8X^_~yV&Xi$Kbc5*WjZhBEi}E^1bhN)ATy(o1F)=1L*<_ria$A|k^GM8-O_Bi{!w zN~)r>0jPaurthsL@C`^pZ8<*PZXp80perI`Go`-!&Sww^J%|?()3rRC&bzxZ|Cgtd#htx z^4VK+_vdroHyejEh#_-GoH{eZ^$wf_pSdBnsY9`?LHFD~28EY)UZopL7+#q!;X(l- z0#%UI(eYfn#@n@^Hoa>zQ5;lCEhxK}NV9uX`utVr%-9n8pN;YdJlM(#(G`sSXEylY zcv#pJxIHR;eCfCc;Q&&G0;sYiqKH;0+2GdtWdG95c>{(hYQ#=?ug5T^FUftr$sT^i z<6p)Q-XKt>HAn?L*?4XgK|##$W20A|?oTybrps%A-)JQ&~+QUrAC`uj2lS(iAH0Lr4E774btv zD&n@ksfdMwdS_FdCl=G`&#WCgidhDP&IZraxtuJHBs9&-KQbR}D_ehUz@I1`CFCs^ z-u$7Y31E4N3Se?zyqpth2tghqFnWExhO--y3wemeg1(LaZ zSf9U}NaF4KY1@IXp;$J6rDs5Cv0MS~)G)owYjfYc=rnqASr$Y3v;UqhqRxnxLx``g zabCIm=*@UwJMt;QZ%A z;wR{M;hz(jSRn#`ik_%y(dXMDil%4id~0;y^&&GoRyTU6f@cWFR2}2^mPpKtcu*GLVpg zgbXBPAR*&l3K7uc*;V@Rrda(YpAl7^Zj8P~RjvU=gz~qdDgh3}ws>;0yh=LG zM|X`^nSRruZWCNd2TK7WKFgl_dy;1oBd>>7jdhij(A!?8{9I?!=1h379ki#fiBG6& zonZ9i>=J{AepDgdZGoI!Qs`E_Aa*1u7z9EA-`(GNq^jzDg0?x7#`?S5xW#ADY^uoDtlxYT`o-cm6~L>tETya1%k;vk>1^z9wzjSg6rcGmJkHY*Fgtvo+bFjd zunlXfu?7x~awF}1yxDp~Lyb zzkCPBnBapF-XEX7JAB~=BipXvPUCdFw{U8nEaau4rWGjEVMg#YE;GTdeF`?Sd^JZ7 z)MvS^Ioj%r`nr@q+fT43y?T*d_4@cl8{X)X;DV=Nu==0rYK4{FkDglcE8HuOdR6t* z_VkLB`dZ3>(IjnR9q(P1K0gOC5c9;r&RoQWMoCgUDe2k>ij=$m z=FUJbayJMarp4Byt9t}A(jJUEHK|mV#~5Cq@TBQ`SAHP&YSTIldDx5R;C}b1%1~t2 z1IV0z+L`c+B$Gx6n_D6;y=vngIxa?!F}kJ5xR^R!DqT52!vy!yR> zNkSW8?|t2v1K2;jW&J3=tZzO*MX-8OlQfPQO2Yc-YG}Er*bxoxpw1|`^Lf&gcBtKg zPLaOy`gs+8mIU|j#A}99SLRblWGp_}@7b9a8Q3``ie^}U;2W2*FiLaM_c24M*}PfojkhL>b- zR(GF*V5=TuG{L0r-p1OgBtE>jrtZ=q`tv#mw9`*io6v1d#P>+zY`OG{$rG!h@e$nm z2JBU<(_h`CKB^!CsRsIQuC1svPUCo^F|C*~N>JX;9Z zZ&u!!UFM*>I{7>}gCy&523@qEN<_s!f9}T`|>uLujBY*T}ZQ+a@onVGWoA>B1<+63?7pPpbL0?$kWLoTQbItYe;%i ziE=_PY8^OW!E`JrDEKy)LpY=RK6~B$c}{IC?NV&^(liGSVse7UBqL}rJVZMx#GPOIrS(#8z(R_oWIU=Lu!L@hKbod*tD0ZKs7SR}f77JN5mtLuclQwSdsc$% zh-8Y@2|l9J7bHPg~XWuR71RUu`~{ech=Sl56hcLDdgpHw`#w zMnuK=H>H=)ZjxtL1=PD893(tm6BqY8zXy#6h|@4Gc%b9{*!PCakep+r+dR#wwm2Md zo{QNs(}fqn`{B0>O|IhJf#~?O`M0V3)^l5COe>E~4}SJ{U;-kSTM(Kw-$R;Krz8A^ z3Q(-1D>>lwW7WrYwdqJKhR)9oY_}PJ3V5CF2;ljhCD&u@c|lTg{1Gicz~Ha@PTrpv z>9EEZ)=!B(46y(!zf9+pY#K=?8jI0H{H`&Ldd}#s_yDtyIt7P0Hr!sBf#tLIU8_z2 zfaa4cV9n5hW%z!;YtT9l1-SK)nk0NVL(*ud6|nvG>TuK^(6U=8?TEYd`IONVpfe56o%uvUFcRvE{wrRqj0?XIJFK8nE5(I#OjyoV*~-f z=joF9sEnLTV8x}$#-5==l_cu&nn2+#WWskSq9MA-dHVv9x+ShZ*irIz7g=X4{Yuw5 z^_pqiy@X^k061G1)9iXuI;o6qz9=)-R5YUbO!(NVu_5mAxXDUZ4Za#OxNa`Y8bu=f z)hd|)KMVk#$K8__KNSL2;0AOr)k85IIvQNj;+ZjlY&I-!St$TMzyI;GH3}T%ECv9! zPsP6Il;Zx@)?MUndza^5Ar19wn14msUKIB_-is&X$%w}IOyC&#dgZJvF2M8NX4VujOTnt@9P5So4U-r3#xkO_KTBp0VSGWr8_#s?E^?I{_4dq6%YO@`dd6U-k z)pND>^WlPbaj#x>9RS#l;pPl{U+wmX8H%ak*RZHHk!CszF5pwrD=fERAgTnaO?nd6 zTu-x{fbrBrar{kOn0{495U`#lg+{;>KPbOrTWm|J=CLwCf_ z(q8#OXp8@AFNW$8!OQCkjYO#8`Z=8P?973L!oUarcsJ2g_AR_6kV#Xb7h!8>4V-KPx_kbNy+oPkMU<9o3@PAnMXa&n z6V)n>*Bwp0Oj3{DO-zv9?j8E)zc(=SW6vlQ1C6*Qs=acL7D5$!Okk_B+i!_U-EZF* zUrJA5Ei2SwPz$;5gU-a_*cGo`GBvhqedycTAI@R>n3Oi+@~uhv_G!O_n!a5LllKB` z^uF+SOxLKzD$63_AEANn$Ba+Q$e0bk8E2zVJuDbz$clI=XOI0R9gmeHL-jC|fa}?C zB~?^-1WWNpK1Fmxik+9uFv|eT`5#|X?m8gyLa0)Q^5|(FzLbw^q?I`;%CYOp=W@$4 z)D~E~B!x{{Q!P){s#^-Asr#NvJ%+ws-@(BwLXG*LI&p6Hf?_$vY_d?g%^4G)dan{q zxmrG&U(Uh80>u*tzoz1F-nxzQz3pj zjs?vujUSlWmEn=tx}5d+vEC8m8=^6aC_!*`g{ybkpPPR#r0#T1EJW>TP@NCQY0d^} z^*=CkSiW6#ERuemIN%`gqw}jf*;h4RmcUsxU2aQ~2MU=Qn`7T{xS|+yLPqm9!HNUo zBqys;?c@0VT#*x4;{Kv_Q3-{2M?Wdx3$YsQ@;CkX(h#6Av-Dec>{uYd#`~0`INY!* zJ)3xRUN7qXpSkqbb^_L3A+z=rn%7$mStdd@x+}!B3EVfSm)sIpGG8-tmw74ew@q+-BgHLmlE1P&dgc!T zMBKzF;S2r;$K!Vm7%OU`;=L6c%k%p^FK%tAcb>ekC$zWQFpct`NT0v#RdE*HIf^m4 zsd-@5A=y4SAAkm2^o*?rk%!PD?QTfB8`AEEw7VhgZb-Wu((Z<|yCLmvNW0s=)b0kx z`X?xjK@*Xetl!fz76(k1O>9Hf4sbGbX1~}bAi(jE8G^#Il^=$|QpAI0-^EAy0Rqgg z2p}k!sWV{FiE_uCrMbbmnDV>AC5LG)zpEPuPdiPvkE#l>p*o#;pZFQVmgp;vVk3A2 z@ji1)fV5z%@;3_i8?Lc)`u>z^f#Uqm&|saux7A!e{4tT~Plhs{wHeO_i>rk%=!mK% zKa4?mryF4zW`>q0c25tTQZMGONRPnjHwU#D zx-fA~%D?%}2nEqBxI|hLw#=wXleTmyTTYb|GSCn?xvEnz{Cxd>`F_-?|MvXdivI%* z$>L*=ma=324n*}87$=E{y+Vqy>5kz~9?Wg@p+_0wv3bWlIEdV0@uA?XMLG+gIwN(3 zaOOO*-n8!9KJlrG!Ke7d3~cc{Ju4bKe(|stakb5vr*-!;vP>_;@Ppt*-M@TBu-qw0 zu4)SGcI2w)jOvL|^WR84dJx*u%?2w23)s7_1W~QN((Y&p5UBUbL`OUyGCNQd_2lXg zoAILH{j0v?QOvK*e+tl;eZiX9hO37Zgo+__;nSm!#8bKaa~_Z6T+<8j0j>dR%Lw6$ z`FZ^NHBK{x>-iuK2|4Cv9Kp18xv<9j=!1uG^N6&|l|HR2hvEP{^}DXZMRUjhE#81! zb(Ca*@?q+qh@KE@8Fd)|sEWhBevXQeF`bkRT>${E`_BRDcPz3503w~gi_WAi?X^>q z{)axFm+#9z?8ea++7)bM6@Mu9pe~@Po7khssG8fRDA3P;VDE0E1?{9y!)A{WD2=FQ zqX)ku_)H51-DlW=fDH|aJ`c4!3J(r>)a;M6j(F}3+_<^Z#Ox_`{I zdE>8TXc#j$hbACUo88oef~O=rH+MO>)MMXe z4#o=rjGmN~#03n!2R<`=t-HKd>Da`DD)j?m;^AY9l40#q>|TW$5uV zHYGWEimf|na&pqO(a=GPmDQREFhYL_MX|AS{UU=y`FQIWfzi{acf;GqZ9tK%x_Vm< z2n*T($}Y9*;kgS0nOXJ-``yZ`IVDY^Mg(+dCTwoh)YP zve8*l`Uxf6<1-}_3kn*Vm|85T(3ygRLwVK3r%#;SMCYEn;95j>@M3K)g3n+Gv})4Y z=SGs9D-X7~6!iW*-fOeCl)LPdyP}-i!0TlzknkriSv{%ruKuAk5W?=>KMI%vHjzsR zb6-}~rF|BF_%cH4!J|u3gs_SOYmcba)m4X!D>@^?h=^x=q1^oZYk&XFhXebqF4@_L zjG|)L;cCD*>K-Yq5gz_H^VhNGm%%~fNTuNCsCeO?90&K%j0Zl0Ij{+V$&WJ=2J5H;-N~ien;@LjW^GC=$(>2=A(ofrrunBYfx`iR9L= z!0N+}L;?}TWqe3>{S=Pb=Tfvck%nK6Z`s*^uN{IRUsM$#8<3$~^j$>_sN~ijZB-&+ zGo!4btLyQy*V9Cd6=@#y?0wTV@5u^OCz>zd<`}sHmZ0x^W~dJyB3dVMb;&v7OIbhWHISa%gal(k&;{1=f=dO2H;<2Iqlmc$z!g zSQNQ9wqDuVUOYVp_kziedYUe3Yim`=Ry0BkaE%b*$L)X?Va`C(JuP&!H(#}$ggrh2 zKe1VGFv-qu$>M>$1SY_)i~@uJ6VdTI+A-L3ru%2tM7Rb-0zlNe;qK_@Xk*;S?Zf!b zHfCh99Ai*!J+hg_nVEBoHf86A3UZLw<#h^3jWfLT$3={Js7GxiK@HC_8nk3|a}OI( zL!Y; ziEe8#>B*@yoH_cLr>x?QZa6KpqP$Z&Q+28$uke*_x!qt|Sx&Ay3k?^h4ckxxBtT%T zx7ouH5HSwRP#dndWk!K)r$xiqeEj3znDBPxeZLCz$d}2foxGG+@{1@cIwSBuP`AIk zwxy1IO^SLkZ$;zNOJkvsSg~UMGTi`fve0}>p^>%3Q0^Qq8Sx=oxS~5-82E~{>*2|) zB?o6%@hsi&+BC>pFl2%UyA1 zY|OE!YL93+hKgi^rnf0^QiQUB#Ify=q~5_FFV28H(($>5zOLKbvT8PC0+hT7;F80j83t^$;3 zs{)S~SDt+nVx}{VbkC9q4|u%=;xrV%RmzpKTw{n3J0bhMb4$wDWu4n<-;r|Tua_7` z0cd14MWWMX#@<_Mj<_?l>8^3*TA965@3EeLymJ1wcbW;W{d_Q+!RsYVBTSEL)FwYq zEz*!iEJH2~Z_6Y{Us&Y8Jp#0{_;F;V@a`Ir@;%e0jxlCTGmS`zP?%{yrC?_Hs?e0~ zpL&Q%N`4seCc39vbGYkG=&YBWIu@Cq3oyQ{+!a`4j1gxPOeN}L^zxOsKM4uM6!+v-aPw&W-JK;6pOAnSkDzCEYY&6PYj`ENZ^KO%L_tecG!O@rrsL}*R(+ky{64u3o zDZDMmp}=&j(esQhMtQuL-BLvfuxWx?Psy_qXdJ)IxO5ywO!2 zLjw7Qes8{2XB^Ewbf|nJ^_&P4JGgA2ZGDITCRTzzi;hw7hN87qge^`GN{n;A_X7kJ&nxtW3HFcgsoh0W(pV@L&6i zj2u2O%qnp?bq_9Fw8+fR;Lo11%B`>O5KU4Ff?Qp~^B%cnYc9aVvdh2LQk`Rmf9!3D zCvPEPjV*_>mS*;kZG9B+wxsy}!$+Gj=+Jqep4VA)>XX0Lhx}gaAh`$=&YmgnKh%0`T21i`Hfr!&<*O~LYs%-MdUUVMpR zrl100|AKuu!EMrAVRB2&&BX=ZXcKonx_*>G^Ue(TJTf0q_B0ckw&r`D2$*R?t%K)q z6A9)d0XBx(5|rNhnsbe>cP)+g8xw0ODK>@akGm8tO%~pKn&5UmT__ZB{cgc5|FCnq zB~w8=@CT?j$2?L<;_^6|*TRAP1t(Y6akLAs->v>N3-dF+?h!)52iiXlB#hus?&1J% z1$49+pKgaH%+b}+EWBF5d-PY|SbpU1DqSW)2F~J`c8_c=U*uB>cMq`EuNs`Vq>I%P ztzKELsctK|JiY$d*!3VkT{7GdTbB1`$X=p@2fG7LrMs0hYt3lm9tQ5y5dOmY>?SVT zn?&%aSoWNS8>j}A0M;xr34njXx3&lztbIcl()VMI&W_dx6?uEAQ-C9v8mCho5%cbQ zOnhz(Q`dW}Vd67Uc=XF;q3)*kT?6}ass!hrpI*+Fo}S{=k%rrP==8qpAEWT~%Es;`CpM5?Slrmk21KY!G zregX6#>j3;1ttzcC}2sxP^@Ho(Ot{mU_rnm?Brw72b|{|UpYMh()AKq|#P)I$+s#J3!KR9L)|T3wzPGHhe5)ygGCG^>2;fbhtHtq3jgNI6 zrfLt0!M~^*nNm;!Pt9Kdkm1U~7xwDlRIQ5=n*l zm-Z$C&nyV4{;m-#q zCIpm)W;kCy0*p;SHZ%vQ&^hz89`L0g&7dGvjm!P;N|ETXOS{E&_5I*vwdImSUyj+Db&=ClH5h*4vE|-epbo>J3 zHiE_n-lAomKM3yAPv3M3Gk_OAm~SlBm&Am%XR~ovBqkISFEhg)AC71^2h%#E;OXEE z%J$>XU_jujPU&OQ&mo=T!f72x0S!R)sp8$4+k+~YR4PBtp3qD}wlKEV071nNX7=NW z)MS!OAPfR8x(~RB>c|2Dek{1@2?0sR!9A8}PNK#1hB^o$8nlTAS zKZ0N?>a|c*fS5dnc#l$x0{W#qdYEMu7QinXu;%8`;`iB=7B(`5qJ7Dp-k@dQp{slS zW~1Jx<#oID^g%7)ssH)WI~R}^6R-o$R#<=m&CdWdRComE3=Njw!w;?<5`G(ZbJw<3 zmtrQx0WD*mJA1T3W|zNsmGx5nN2q>VgNTV4P2MFwVlH~GJW4O63hd^h7@L>0<)Tc1 zcvf@v`LFUWYW7BFvz}gy8Fw36fUJpoafLKQ0as?H5$r^jD5HmBTHIozoc?nx4l8aT z@_1rhGPqU|>laDlx4;%78v#%S z45G~W%h+O%KF+R#s@s!98ze>JO+?_$C}2F5$8i6npeI1x@p0g|JE8FMnBsDm;C>J> zI`3C90vkm`PI?Q~hwyP+z34amArQFoC=XtC)!Q5=bG{xogXrw^*eb*0jnfvH=F<&a z*c1@3&z9QfNDZcMq>yAgrYtWtDsg<(_%Lkr?!G0s?D-sfPK2Z0ziW z8Kb29&N@DtM7u6amVjQNLe)Q(C`M2Y;#z{r4SS~d_<>>EBvt03cgk9<*beVd`R_TQ z*f@GVg|Don@LI^%Odkh$bdeu>?MYrXYftigO^c|Ss4^Fo$uUKoSe)6i`<62R$+Guy*bGW znvMF#_%!PKi}paS+-EQ{xI+RM{$fiKupuSy43*`I#XdD5c1moQ4=I%;QwPMT(lKDk z%&jwKpQhU@x{EgtLaBg3dsJvggKqhuYGjP@1q7?;b;#fv zTr%69fkTrYJ%Js8s`Wiwz;s+&B`Jyfr^p>An{c*BDuSV+Z9$YUjc^(lbDD4D&dELY zS-Q%Sn#(nl!vsZ~*+#&LQj(_Egvkj|QP7Ytmo*DA zP|=e`h#&v}`y$?H5r-|}pwP2*v$vA*eC}e&XR2swYvJhdP)LBw$-x?N(dK_P;5AkM zUkzUT?*{*K1Q39OXh6r$XDTQnz{|_4D9ppd!-qI{|2h8N2n^ukYq=z#K9`mYWE_^t(MA8!0bxf4cH7X+s8!zIXW@SJ#V0`ZRCRjA zEe8W;M$9}D4<*>?j2PN@w?kvA#Ppz)J@AXwV=LnqWYDj>8LekaKKpI|`O_?pu&kdg z-$_4vVF|MTJ*+x6kjVfm`AjG6?@K4mNQ)rA{))rBX@hIZ^@_K*l*t{6w{{a9ipO>& z9g3%RoB=T-{xNa>F^i@a*LFLjBZ=*Xx0Jeq59U z8DkCnmkpNWq76^K?bB&XD|PfaUfVHu^sSk$o!ttuoD8&>u8DTaW>sK*3vpt@2>N+* z|GCZ$<^M<8mxsmlhi~(>gd|&1(b(ggN-~9(gAkGsEmEVRX*EcNYL2Cak|;!rk)=?X z7?o6WO4_tciyE!dKJ7Ep%rx6s-qZK@Uhnn(`CixikL%-1oz8rg=eh6uxt|%phI3+} zkK7l&sG4tH;eR}g2Wu)s*c>z@(eTMKy^rSS>K7hR_-0XK@jJT6dC{1bomT0aGutc7 znDcT=$Qp4&8_V~+$ME+{dPhv^@VcmMD_N zXmx!4XE;o=3LYP>BEXuG@lc|uBBkA6L3=}pl05IuZHfNP$wjZqo_Cw38+ty}8om=; zDdO-H+Ss(!s$`yy$Z5YhYdGPrDFpOxH+p2)ZTB$PYg+Q5xc41-@kYXJ!=W$RrA8+A zR*TP&*Zl2i-WJ#0I2N1ApnIKI?EkaP>@BM?C`!t;Xbht5r~p}Bt_|1rZ`@vhM28d( zIhAVZA?GDM#c8W_2OovNE{7+c=f&A+BVl*Z$MPFTuHV=PNJbKxZ&MvwMr)muX{x`BBwf^gA&aq7iQt(Gz^Lv>N zBEsROYb=ZLr^Gj$75u*_@zs={*lJ3AA@VP1w?pghO?m83vy7mQU)gl#{uhsv{gXbL zaMsn*(mDBHEN`hKEMNzxiPHg9@Wio?!pc2BS?nW3=^~I<-5M6M@lV~<(6>_aR$E&9 z+}W*r@@M7O57&*AEJwTFjgjnVbT56<<2v(=8Zu;rQac{dSEhb3fq8#;cT}@ht2D>) zP2s_}e$PwZ-Y>rWIl4^V@G5K%;wBk?CyVM}7zlyRS7CMhvWYe}VP>c&oEaX%hnBJ8 zw6M1mo)gn)a=wLPoPcPOtO(2vdeXZ?lH}IA84tIGB1E@b&n!-q504%EL5UH3{&W~BCx79c#Ht-ZV{a`Vb0d538xRr}b&Cge%PyIM{q-zYO4?^dD*A-PrNM1u zx_>SkenJzW3h)>Y9(QYKxkiSh!P3pV<_=XWdRGPqdgQ7&UtH(__)@!llPr6}Da&k? z5A!TbC1d7)u5O7sV`ps{ORHmsg-QC@`>4JLct1HxXCI3d-c3_gF||~cgY$uq@8NRW zE3;SmR;2YUu9B10?w#DYX#VS8^B}{)VBPe3miCe~PuMvKjZ4LDqnH*XYa28C^9bxD zvC#x2P<8MnS`Ccz(6%w7Kk<*6dcHh8OhQiX{+ziD8y(_FyCJ!vh>#8LZl79@pl^x<16Z43+(uBIk45*2)+iyqwE$+eEOV4mv(=EfrtWkRu-GxWqim z0Gw86w>}3HVX9-lX$UilILM-M%5F`OA)d{-sWA~+*7$@rGyPWD31`gTa%j!ilQgsU zENVP899vjVtV0#2 zgvgEsVjfFnK64T&C|UQX5KvzozE{Hi=iW&Udj7)F(RP~h;sfT2fIIsgDyc@h;VYss zOF5Fg(3fXgeqMBgaV5%H_?H`i;c(Fw6Ooiiq)O(NZ_>L_oEOx?r|l7 zinLYsY(eCVxY9bgc&vwC)<7>5@$dx6ZlrIC;WGwvndvv@9o}3#yF+C0Gz6md7u={-A zi=skOr}x(!tf*Yu_GFj}wh|Owk`Y1F+hx3&L$r~(Ar_CbA`#hb0#kzmN6oTnq?mE^?a2g`Z3_8uDV;~bSnL9q&?Sos zrcU2d2^=9|!DttD8h?H=DB&Rn@VNM|c(>)NaM$dSj3;W1MnK5l>%_4(19UC5S{QY(qM; zoa1gThA{dU%Ot4;b8;2{Z;cZl?zg_xPY!TB&?Spx8s-_R{c~zVXS4fG!AV2*xizfwGD!N z^_5}(9%A2AScIYDzAPn?Ft0s;M?MuoO=jvX>=2Ur0gr8Ww5vzDBx$V*F{h3?^d~QO zms~&h^MXoR9U3;V&_K0~soe59hBRl|oa_jM><&*7R?`KUEj)Sw5`XR=8m$<`lT18{ zp6&cMgW9NIxw6viJAX*+f~fTBj#O9&{hkW=aNAUEjL;U4MY58yAPIpZ)515#VsRgy zro+*otE+BgT{r@StiB%D3kl>b7|GYq!?N&wOeU?+ZeVrz{0sqNlK3O^^#!@{oZ=o1 zjnCudM^96Chqv<=Vk$1P%+Fv;ukA@QekwRX_(4odDjH4suKuzZUv@cjAYN{c5qmnK zNmyBPlul>zLF$1xT35>P4=cb#9%@SmIR@AZLXtk5fK`Jq0VATVBDR!^PGaK}Mej)2 z3VBeP?xQxkfP`vdBXmKTXc2aYCIhe!9KR`5=q61YoF?{K%5OT`NPEbqR-h|8(w|?I z0SgWsLyq56N%u6*L5Wm0t-N6La9hOZNBLRLUKv(yr#?622lkPUzqNJJ+3+bsf7W~; z8HxJA*S&mCZAwgc`!@BIYLM*;$58FREDY=i4(a_%ZO(deZ|7zx?z^fK_H$n``WqUw zg|o5OgY`U-0^Y&}1eVQ-Ak2Z;h$a4{zHqZG{;0*;mM$_|yBHH_eyapl6RjAWZ7HGI zd+4mBngu!L~=&9rRotQs>rv~K1v(jKH8uI&3E53eA4T9<0~N9 zcYzDAvtQe;Vh*!b)!@xx3;Yu}A_b{4Cp~w-xAmBpitKi}S%xh&NLZTY8E)1Wa^WPb z>G);YBA9Ph3BGKFu&1e&(6Ct5Fy0lLgFmG;DkpsAELeNet|k$Rc>pP0crWKyVyWXan!lVLHhbV#{?Do=Se~3ylZ+MLWb7IC`}4t-8~7%G-sGX zSUsR9?1yN@RLg8h1H?eAp zyvtt!27MVm+{};VAD;GwH`ME)e$(2cCmK6+ z^T{s$odk_v3xVX&hL#MDd`|SOF4)}Qzo~WkVT->DYaX_Jv?&9c|8CWoP6MG~9i~+7 z_lE8H&{^&qdUR#BhP5Q@gIs~+O0R-WW+$PW7%x`2()urqizE5@X%2FbDnDDu~MhbZ|iUtFZyBOT^_LMmC}_DEALH{&%Wxm1wEnpp=Yk( ztmAMR3V#G9W%a65e#SUl2(}K^CkSc9u9kXob;QON6VPO))sWN~O9SO(R50_3jeNyy z$|3{iz@8VQB;Y8Jc8EH?V|0`~g*(?KAqBbE76cS>v7P*;De^2NM7!YtjFNH z7}_Q>FeV?g!GL6^*Hq(OXKmHTT5by%$q|c)+!dEM+xrU`CyJxJFz-!#_> zUg)8ez*7E>M>L!B2MFK#f_uWOL${Cd@3+t9k()WnfjU|9uD#|_V;kwS4W#`f%TS=v zdkTj)`f2(R8O>8!>nR&kbbUp5Y6_Q&4BBK?!DwA7f3HhcnTllIe z_@|zcN;6+`Kt&OU^6m3PVD$!q6CIO}nF!)!%1pOqdiyIVuqHP=;)aDZ zy(hSSm}C8Htz(sd)fXDEciMXTpT*RRQ9B9Oc!phF)0u zkMGWx6PLD?E{`%35U`~~X*>)?NoxNamiQL4&ERq0fhat_Yu?0x$wuo}YLpVC$anOG zy2FGEdOrjU!5=xapTeXDN-Q$h{~awKnr}b;B;j7(zR7Px`C517G(^*J%p0`Ft#CYp zkKFfiK40~qgIkJp&BQ!+5xR1xW#y+IaqZ3Ay-H{khEn6+fb=cnD-Y)k znXI#3fv(vViFHloL-&Ox+Yl8mb@-*@a*bq}Yu{<M-;) zJKVSpsH4nM#05TELi^2WYOhVz(E4EKWpF$Bs;YGEsan>Mmt|pi)j~$pD?D0_Cuq3H zeAj*Yb<4a$b=yBQci1{&aYr<@qzDyg=os5JxIUO# zmzo_jh+Dse9J^gpCZ|_UjX`pcAXGw=PO3IeBTis5%1K5wp%#E27H!!?>gQllOVCIW z`v#g1U|MJzxOb389pa_e;>*M5-GpsXCaBKbBQ2!pN&R`P)7`93xe?^Kx?7*yx7KY^)ioA@mlPX=*lnls7s*{NE1rL! zU0inhK`hdif;6PR;yZJp`7n4z$M4;R@E~_zx}$QR$pCxv=WDHJvp!Hrmx^>NJgW7m zL6s|p^45X%d5bQE?eW#nx4^v7>z}SMi_2N@;ykJ zb2n$4ge0Ixzd$9E!Sb;Sm#_hFihxz(`A+S*gr+FO7|=u%;Ym^oaY&pfNO`$E?a7rR zuY2b@I##w>5UTd(JsHAYSXgB;H(}=;-FhQf1kSFrGTgrvEziQktEoWU3sLD)wD>cVYJXtR=I#k-e*R zJ9g^avz+H}MUi5mXp6mlK(Q!v^YrAopJOD;T{|s&MUteBR{pMNvPgsu8x(bx_ zKD;y~Bfo~MD`qd{w;dC#^wqsJi?K=j?#n%)8=gp6TTsK8Jsg?CQ2hyNfly}>&dJ_1 z-p`ZSzJn?NBsk^}Jcg!0a+=}9#YomQd$Ou%|H-UdO!nvY*g!uB1Dc_Q^ zCsG@c=9^<0%IlCEy>_kEJ6^%%VdRHeAGS?ff4$xFljf50^TX2Y<9!7430QhW~@b*blEEZG71;gHpza4jQbfuld0HdKMd58K&>= zgDRAt@2hTod4qc%aGfZCTFov zO>Kv;3aCV(c51uAY3*4KiX@prt%YDe8IO+G6)yBXrH@`9RGoyCOu^(tXE-?+S6v~L zTeA1=0jL9j>6o=tW`e930Upq>F3wcQHL8FuRqp`5!im($sTdYjWn)`T>{rdWJtn8( z`vrTDE%69xdQ%~Ph$&xxBoK(c8$lFe#queMtiKy(fWHWWK`2*#mV=P7`yhfp2c`(S zB5TVpP>6&<#=(*(W_)nR;tdv2tG>&LoARW+R_6&xmVVb;cu^Wp!WcIX7Ci`Jkow6c zgg}NGl5X_ia_!eu-iKog?&YF%FqYOe{O`AyoQv}XQAQqVfe$Y&&7f2NKEJXXlqw;C z_t#>aB=hS=(-=D5OTb1kf5Cqk(>Whwc#T<*_iSIVf?UeXVd%#v3ou;M;s>;56v56b6^am@P{KlpuP$}K16TbHc>l6Ob84ghIu z`Z>iy)ziDg8RKh)z~S*iQ?4mgUc*C|>Q(;-|0Bw!YG4-$VLzC66PBQXpah&|AvxKR z21+ls=_u7lh8Kw#rnWAMD=#o31_haY2+=|~5Wk#|E3Hffhb1V-bFIaDT7K>l322{f zd7^RFj+F%Ao_>TuKO0sYx81p}eNoXr1@sq-mV3;pSKat?N(}4D6`(`(>)3%tGAucR zOwn8(F`Y6u`YIug%U3=ydwezds|D8f{_KYW(oVewN;YNT`(u$C8uwT8a6q)uXS9z6 z|6h^@;Y|=qM1NpH+T9>@BlZdp$*JfM{NE5vKwtu@^=h9Vr!cP2hdqjjZnBCDd~O28 z0uo z{FimN11YS5ae0YU>okFPt0 z+^Xo`D%QGK1sWIp`)Xc7=Rf@9tJVp^pU3O{Vp{043DeWaOM^AH>dOxwRf@9*$ zxL^8Au0+->wjNsg?O;}DDbJmld2;bPN+o%MwbRA@rEy~Lw$-GxyVcnbD6LbRip*E| znf5hG? z;xn_gt(Pz6u3Xh}@_nD}EDf09t{jtJy72Jw#^qFH+_f_5kzUl``IEPxQuCtwXXnS{J*cujqL$t3#rPEA)C^rNBo^Q$t6I71FNv2pU zO?aKm6yD;-ab(3o=x{11Vfh3xrAFv#e?c2zT8k--3PL@imt*?TE5HPG4!ZuVK@Cv+2qGstL?AE0y)^e#vXA(mN&gQ<@ECfP=B# zuX@sm(W+x_p3_ib4~U=HKt}FPU(Y>ur+T)7Dl1q){tq9R-YFhfcrEYrmPoZnR*^Dt zz?n4SKe;N|ZUGse-uF!(nsQt2VgFFZ+LE4DE_)kZ5WgpbqAA$FBb~}XKp)8_uAELz=E%GCtr!8!&AP77NFV2T%mp=Y#}_DrSj^2x9tr+_ix8V+b(CLpI`hQoz{LcT&ex zI~zYp{G9RiR&XT{?lkPvi{Al5pnpd}X&qfSjrq3+CsMoZ6_ZGo56LN@OzUf2xZ@bi zzT#@O&aBr~ecEmy@Y1u=>@^mR)NWLhI{$cR$OBG2UJ@8*-)2h~#Rmq*rV__%su#Vv z7+vzdB4hs3ct8!i{-$9^Wc0@?hXCFByX!N)_AM*h0{g|4vN4(w(Jf(XYKz0L`NmshvX1Gm^)R(LW^UVYEX{U?)FCkS6PpaJFfExTiN@t{WBk?U2qMo`s{ zR#4W2 zeC&3#QFZs>6R zhokpX5eKlg9z$1fu=VGD0ArMPEToy#pD$NpV!^o=Cr|_&zWpYi3o3+AFD~ZWp-aA0 zV**=qI7Ayi@H|cg1^odjqWo1;Yu)irHCMg33XSLQzTh?;_TX9G8}GWJnk+@rxgCdr zWRDSY8LqMeMj_@mrOnRjP$P!a7zDfeyZGT4IT%glDB@nBJV0O-D#MJ&e&9NwuL}>^ z?(85v&?|4)>~R*;bT>i**ON_LmP{0OPU{Kg+={v+@8#C;TV-^&sf#%e?k;P8;9u-+ zeji^!l@&&NeE+p?&d=D{t=7MO%%)2a%IIHctVqK~k@oI1)i`kduSc4}^Go{%+g*g&%J|Yi?-XX|wXY=uVFlzX&^o;kKLV z(Y9ZJCxL5<{qA%sHwZ?5r4sUN!ilgs_5cSd8QA47AlLNk)(t-b1%>$>x@e)q0Z%4SRdg0d{P zDx=nf`Xsl5K##ztCHT{I{YFTzmQOvjvW9AJ)si0s4b{`dlN{+wT-yLTWt45EQr}7V zo+(yZ&l$S35F1LxJh*ghPfo<^2HvzPHij*yqBht;xosa8l;p#&QntZFw0xSj9eYp9 zJidNs&re}a_*c(I8Yasg_w#XTbs8p3zx&SjoS{}%fCG2UiH!djYL!E4Vs$wE?V{aN z``$71k6_QYk{0^kL%6Oj(i<>&sSNkl+IlH_6qJl)67ssV>gS^S!L@xqvEZTEU7-lHM|JDX5&&(% zI@~K~s;1BVF>=e-u=;C`OZDqr!`!%CS!4Zn9)lP99}`Wmij;j*bF)}&eB zMp_w6dl@#Sx^;907e*MMAIbqHYzav)7i&4J2P7bB*H8%#a1wBdvze5LYU0=!mC|6hG50HR81XAe3NQ`Z0hI^VgK(a58&7Dk7hq<1v4|N1ul}99grznxlNV zx7B-9=lrmq;`o3^6&?Uy|5aT(k_Bv80O4`S-rn zj5Zo+TYcoL8$%e?4uaa}7nk1VJakSnTQzje(>V(VQL!7*pwCkGGl}xZs+eyFj7g#W zd*alfJ0|Cu4qxxQ-t69|OjRE{72&=v%=CmW_(nfo3#{3|IvgW(msvbZk^@%tu(kvqAoa&#Ml)EHUo%oK ztG7k2Qi7R^zPL6SF&NDTxFhwUTyZ@C5{68`ji%Tntz|q^K!y$5`xwBuNvJ?|0h^6=>6N$qHu}x+x6EDF4+6oTS(8OWxFirXr5)u@NxDalj=-6S6H9#W5 z6Ku)~NdVh9@p$!qnj`n`n2dXCi;Y7g5|r(IXp(|(&~E$=hbyL3F&*4oA&i8Z2+|2SesU|!~QJhm5EBs1zm*Sj@Gbum)|I4{tEL!z% zI^ovHeBqZM>T}^M!q+#6LKFUqbFY$*JHsI566HOI3{~LfUa|=;-Ja_*@{qd8mjIoC z#cCd#mx9KXtMg@?U+u4Imku3a;;QW-uVfG1Q0#9#SSU1@gi}p1o)Z_ZO#S#DA+-%F zw3l7%zG#ehQQ3b*h^R+j1To;=mH7iJ&xyz@c%RpHo};+Hchteo2_?NVC>w=6%YP#_`7Rggw0Pfbbs@jH8^j; z#H`WP2RiN20q^6Uo#KQ~2YtqzD9F^Ti`BB38r0Z%R@>wmt6hn#PF2IAJ3 zFHkRLZ9F$6vQxy$JAXa9977fF!6qDyLol2OTY!HDF|CPT-Fk1{vco5Izb>UEluPek zZ&bgy@pT7oIvaX;j(P$~ZOSss;DH3W&F+D+;nn9J+f~3yW>G4v%k_G=YwP9WiJ!jj z*D{IP5;1GE%$p#bZ7-&v0Sj z1Wtczg3v8ZU$CKiFkhHB0h6Bsing&me{wJ(Fy;F=5{X5{oF1MJR!u9mu#AMs6~lv%h9u0GWSmL3SHrLMnSuB8x-S``k%ePbMosQ4 zS-$!w0P>!=G3{Gob+cx|09?h@`E#FaCWpzn012z!nz8pc%|>PEs0G9k(#l;eRip=; zdt+(HvZ%d06KslJpGU&2TB}A2rU?7!%iEkAwBN`o)XVD3t6~1G#!o$M%z-cl+d35tTW>r z${kFGGB*3aM9VM~5|#aVnR6J(dO6`!H`0;KL(?-MERHJCK~zY^ARVJLq)N8_X4-0s zZc{l~`$5X1kIVe6&#Q0*65PuGv-Y{qOKWIs9NwBoXF1%ix(b}%iwWYL_P z3PwBW1#rmsU_2L!tX_(Yi`R}G)fi)K@wZI%su+!%CewK*4N&$J<~n26TPWYp z6m>^E;;}2<9KDeu#<7l)*4SAYNqnR&0 zP`q{Z?d9rl#Z%6+?fo;xV=C-iMTS*}F-VX+WBpkxt3(1PfSY{D$&@Ku)D73PTxntS zQ(INEtxem?Y3AF1$fxL+(MLQa6JjYEX$b;?&>UsuLP+a-Hjdz{0 z!OjAi{R?ubyO(5r=58W*Zs(fey2YJ>AMYsXW)|Pd9PeUMivs z7=?=n?aLlk6BDCC;J{iqmlqp>!8n5q040zlACX{HkR%SijQwJ5dG_Pf z?S3vPUC5LYf8I3kJ}g-HZiTjOIo!`G7&x=ow(Q(2_0TQLlZ^6jlXs#R>+{gaxw`CJ z$2%PUpag@(WB8K>b8(RpyKjI=I0ksx@f%5$+yb?R)S;|AVsUWH_;oKEFz;(4$J2L; z@TohjY}L{ffyJL&5NfF`^>5W0E^s&BgE&pJ<)3Bg<(t4-H&%bcZR)@`L;BJAU=nj# z@+rJ|C5hwO#F_Cwtm?)0_t`1JuvXumeNl;KwiB#>%@5e1y!c5pV;BNs1EnlidfI2I zf{yQZk_h)M({Z1wx=&v}?iyO{=+c-Clv=P@#_tP%OqsOHlEFqwkx&U4frjI5qPWY1 z4k&J2O{6m8Ttk0Ph5mdi-=T?Yt&pC2D0sWNKdf@)xu-OaVa0W>1WRknPIiAdW6sM! z1rS1zWuVXT|H<0kHOIYqhy`0|gy4mk*6WF=qOG>gygyj~hJ9F}^tkvJ%wB44_?AY| zXiDi=B?`dL=4T+rs5AGum#*|;wCato8?qjD&8-m9E~SLVNYoR;2aj(Sf!V8VUPem~ zZl8Z~PzlI%jF=u9qzgF1+mVv8H22Y6i}t@s{&;TAOEF>T;(ar2y{jq{@wUJfwH?uo zs{T{7vqcALrtH8;Tyt&_B~FHha6`H5P8mZ;q9c>_ghMYs(QFnUFrDIImLmWxq8-QU z#Zp?RJPw~n+O#c>=yA_19m`?ZRfFW8uumE?KOGV*=Ws#;6aBiEO)X zit#@~5rNoGb;u_dJ_PPVd{GXsS;AsIf~)|JRVC(kDV}N&9dXY<7h#mNbT zzkn!hCe693b!A`3gU-1zG?z7zyYg=2GiK=ySJG^>mk`DH9*6S6JSOB_^v0GyK*)<< z;vE+|PaeExThdR)&E#Vix5R98VN1O&FEp4-rdOV@i56cnR&PM zjb8JkEGG=+sZ?oq7^lglj53CX%F(MCv$T#-K^!EWCx!~#qm z?jyKfe$QKhoxa-;6Yh5gyqtxC*Cz@?E& zUIM9XAn!Sl*_L%O1M>8FniaG2G6~kKx>G}W{qIyZP$-qk;g{$3CN>(Fn>}RRH~U^4 zi0u%HS>M%ml$cEmjQ*w?T?UeGMC|SCxwLa)y}cgdyK|Teto#&_1dq_ZcH$8b8cPK) zp|}@_2L2hgeFj&sTzP3*uo$#}gBKrDof1h{9d0QutM?6ui+ZLFsc3JlwL=u<4GoX0 zBRt?LW^0Yxy5Vk&QsWFB!>Zw@UYyZ^hh9v%78aSGNswXy$$giebEo<++mYJI4(5 z^X>Q=+IMdQR|yt~`FK((x)mA|^p%M+w7jE|rh#smQZU+)nr{kh#d=Z!w0J;<+?w$D zTM1I|C?>$muo!N+7XKw(I^RIPk&k;?Uz~1ec@5qA0?(-l#@cDZnN=LC$2oJ@buP=^ zv)}3!Z-O`)XU6I1RrBe@=r@@_(c(y+1jl#3R84~g8zDBx4ZALxDL71aBgAQ{y>J!o zj~n(K9)23Q`(39OKZ#oT!AFr@n8xOktx^PG)ON88i&%Gy0IXfD5{&xf~R#cwE>M_=nhMP*8FowZzXH|>6g z?nbpb-yyU|9J}NL*l)EA>{VKyo}~_~f07(MXUL}<(dc?5)H$G2 zb!wV%>|?{f=%%ocx|P)}P^oDT`N8d9JJDTMv+u`R;I+h!@1Hl`j&!BcFrp;7%I7F# zT@!~3u5Am{_sZlkFY*pVSxZ1uyqawJ)BS z3H-j2JaDZ$$+FJu-gHjS@a(-Ozt>!~ulLaZt}2=L;@eKlWWM2g&aq{k!KCBCIg^55-i-KDSr6nggk4aG_&perokU+c`W`qp@ zux;}q2_RFTF8BonDg-+LKR%4}uvGA+XatbqMGC2egF1t_BpH<&qo^j$*|YGZ8A7}m zm`SfI3H+HD*&J$}mqY36h!iendSV86ec_DkgS+GH@v&`iSBs-Nu3CO<5L2l8c4Q_(S}NAe+$Lj|ij2Vq z9Zb+Kpq$6oK?1;^W57t*Ex4^URPpW!ASZTP35!7sUQiOxYFTgGhMxp}$nx0UI>MoF zAbJ6Z6^(A)P*mK4ZQ1Y>z`M5o%G$~#$uSFXGK){&d-T*nDK>cj3auzLjvCt`Kcq^v z4;Wcnbx&T`KG@!z+$k&u|vY1q%PH~rP1dl~gFKBQA_MFsD!R^C%vM;bU=F;Sa7+x!pz&cg`Aj*Rz%=htG z`2?Cr2toyQxF9#L)m?!dg1d9);VkwHnTJmYqng8zs~DhdY>d*Zz+pm|2xZxC;lHpT zeW4iq5W?iEuMU`_Fnizmxqd!Aip?F*Ox75t|DtFV%cjX{>ZE%>#_qZc8_qw>cazOh zcJu^d@K!*1xc4ld1zUQeh}In}?fGe!Ez&4GTpN*p)zr-59~`C9sDl?qf+AoEe9C z-HkXLAbG-VzgMDF1S;VnbwCv|uurQ;u&;nwmka^DlH|7C!>X7aCRH`XrZ&b&lbaN{ zFD365)B z{g$;lQle_}%z(b$p%isv&ZSOa6E)~~@z19FYVj28|g_m!jtvE~B zxk;k5gyNlU4?CAn?;x+?!Zx@Ad;Xn&(urQTmt8#G{6s0kO|y0{?U?D8Oe3Cf5Aqz# zYA(t5Td(q2L%CK(^sRQ+>jUWi!smd=-hFTGKULhNDMeRlCN#Y5Gt~0Ztys^Xz5i_( zfKIpjE_Bw-0fV+R#-46iq#ft1D9eIN`joYzDLW*Q^GmuNcT^f3P%6_<%deTJ8Vq<+ z$+xpy20uEVkJ*$L!{etned~FBzjyHswFY_Qs@r!d`)CAyCrjE9%`W3RC+dbPm8kbT zB=FZz`c$*tAEilKxzxehYwf~Y>^JfVUr6Hoc(mm7(6&`%H-kaysk6+z)# z18HZPLp%ugR?G;Xsz@^)AfqrlNWux@&iLR!e6L7$)#QnN;YzS;n#4g9@SniV17Is> z?hg#X9xD+1KHw1L8dwkn6z)csO z?RI8AsVtw;VAiAVNOiKi{BnyFC9A&ujL3khA-HR02HM5jT*hOQy{u6NG-!)fy6wMU zGt)sAh^ik{7!8$>wegliDLvCI%?0dNAK?lAL&sbevmSnmpR0QOTiBAW7le`rS?` z2i?j)kW z9=Vos8eY1)AagLS5R4qUgeKrYt#bx_?UJzU4=-&~l2+up&*?%ep5B6(mc^Yd(ES(d z$AqLg8l`(c1>->sJx)a*BSPC4>$FweTX7}eK$jvO{p1+qvXzh<-Z%qfJyp0H`=4Mt z0>FmXxQWo6aVOQM~N^m?v8 z{d3OCe;fZ)dA5igD)dm!o8qv=c72DU`dRvy^PBtD*X^^b)?NkUW{pVR+q$*S=k@P- z%d-59`nlf4%^M>%sUXe14cq_wCzcbShT+cj5W5p$V>Cq~ z`rsZU!4U`cIW)o`*b#I|NGI{L_OtQbr`{~Wok8tzwgFfNjHt?+F;4nK@CaAorJ!Zk zmK)a9$>{4fkGAUnXve!arl~K&Zz1FCl10bFzDHXBNfJgyM9@p)UQ*UpP6vuv+FR1n zr>&s6F^=`mQL<6uicwP9FWm6q)jkiJmxOn!FCG1xVG0xo$*(Y7uv926l*D&S#u#*G zkOS%B3hi5HG8iEaaA?JNPrdwZL3XAgo=142HPA?0HTaKwY6dT`6aLF-1F8lz!A6=i zNK6?+iOnA1XrVAUV8~MW z>Tmz@e~*8>bm)b<{zEG6XjLZSJx+`K%MAKo&dWU*w~!hjFCJj2FzwO_UpZ~8f2nDg zq<1-`MQ9KE@$l9`2_7`!*Y%jnj-zVFPH1=xlOK+fSFjt5SD#m|U^SlJe)zp;Wpurx zi5^wu@2)#KdV>m@O^RiVKovEFToo=~mjmKTq!Dbui8cXsV&g3ts)lh>Al@I>0N@Z5 zDkVuogd<=qFhP@!p_eb#=3~9sC=J7vBU+4Kbk;NaP5aKGK{ztu9wBEyO=NjUj z;Hezd!Ul^MDKTj$j~N;4I;OGF>OIZoVQ2^c{7vnEtri7O{^9J!mwm;#yWHcckC(r0 zG$3nCoV!gk&yw%O?r#3Yo>-o-#2cfTcOK|klDZ`NJye0q$9MyV2k*UMH=W~_jRJ@+ z1??4)q%#U~UnO*yX8HQPomT!Hf0Pkr=RipWJ83(g-F$(}<~5J8n5|4(0CLJMuKZt= zy$e`OYuf<4ZQE(1*lnf4AhZb~l~l7fQAo1cq*8{%1}5eZO~q-+TSn|6kXANzIzIp7q@4<70rYQDX33Ut${x zuyr%zVGjH-hi~T#D`)x)vNCsKH8dM^AQ#nsZCaWe{Twdx_|i*%Pxaar0>zb@IR8$oi2ZaXU47nU;G~ zGnM+mct5FUK|8U2FeA)x^&H5lZomuw%pVe|Oo^w#*&3j}&VckUfM+4X981Oht{ezu zq3tgYyjPwzz&rmkP>#)-*ObeI1{5Nf&vPA!m*voCLV;=;pMfK*Tu1+6w3eP@B#5J; z(T0OnAzT+1!Jk%?&wK7T?)`FMuoAw%O#0ExiaQL@{6Y5t^dg%e>zg3+Xu{^4Os?^Dk`F@uE z;gh9#WjEW`H}4SiAj04^x0lNPiU$H`zRM?3W$t@)3TV^3aY({Q!awkCjbz0X$8;F~ z+;gRFPTbh)oa;f?Sq{xM`f`h0tyNR}BJnlZ(Qf%|XH08ktBL9PvMl@V$~;V{7`wvv z6~?tH?lM^275qX;Lj0}bXL-eA5Ra&ZFn+T_)RQd2cRM*eBv^~CjM0fqP{#;3FizDE zN&$Z{8bbcv3|&mKoM3)=#-?X*67hj<^UEY;>**9?x#!!q+fcsVecz%tg{r%d5B)XP z;fO6Y#+NX;cln^i5amhuy)uO_gFv2wtkLMk`z(h~d|J_L78;Z^Dt zC0|x7xvC8%C(7S+8=cro=)G*4v%Tcx(a|jCAKs>g9gL;ab35yx(-E8PhnI5p1?X3e z7S9HKTDGaBaRC*yR}!baQ4&ogK_dj3w|Q_ual50EN%SE?zRC`Ng$#LVGIyuJTdl7D zLTziId3p(%7RI@kOhEBeI^3r^G@Ql019TOeeFstG+@Saf05r8r47jKPH^MRkN1oi# z{FF}g)Q8ZxXjTq&#KL1?fND;s!AOp?qe0VMOz#HGX0bp5Y@RmOUk6XJ_?|mG*Pr^l zWYwi`xSq9@IyJ{~-SSU6AGmF@_E@=$a+FcJ;nAVrR(q`f#%LW0G5l$tOFKUhzx4Kx zHF>z{k}DHd9C5EActaN>jYf2CyeYVkgCLhL`he!amD?A-pt~|$OdM`uOA7BT(v80i zm&^5?(+`j-Gxph?FW+y4&ZRzI@Eq{sokhn$1YPu^`o1V>*hQQ|EMBl^O}NZ=p=HAe zZQcI!LeKtX^QdWrjS#DE?t>l>puhPO_R01Bq}S0QSwQ7HV0{xuo6UYFyKq$iqPTaS zR&M^$;425U?&fuPd^{fK-0nWS;ddil*2$X7hs~uToeur5&O_)PrKr9!^tGf0%=E!V!yWJ#NHw@C-{cVjDlOqiq4Cmi6oerBIwEdt#S?y` zj6sAyY;mjz&qkJFribnj&*33LZV5;fG&$jg2xuWqC*C2hE6rR6(Li7XH(>_gUozLL zf<}tn#Gz?fGZviPxvh2Q>FBIpTl!nSM$fCq=RPx z#x-J*L@`8tp;+2K#&n}v5Q8A3-dPeyNI^suQjNe77z>euf?1?b^E=BgQYK4^7@cBh z%plAEhp~n+g9WW0;zG6;Ow$k8!Maz8AW$rB)HgAp)m|Bj`l3{6uaOd+gy9#IKT&KI zmB>jWyZaIysXodqbv^d%9YWi=1~kjkMzTK57T;QIQ*WGTBp%y=C=MT~bDNUaCX2bL z`<3B>6bYe~%^kkhr2=EC=C0&X&6!!1i}47rPm;G{AG!Do6PV4y+>w_s(82E zuD#Woi!uFlJ<;$ToJD7R88e@Aj+o+JHFi^1eOQi7T7BBA=;P&tn5J*Mb*m3s$)xqa z&$#4lQ``G|!u_eXGhsaI(%vVkBHpc1&Myv^%%^Z0E0K$%aN^oZ&}p+@U^Kex3eD!h zoZp|#U2Ijwa){Wx3gW^eI&=i6z*V)qFhP@r6VsvdQ#)9#3jJAbdy!EYV}6jnq{nDJ8RK;`68PZS@F`^Qg-6y=m)PS z|MgtP^CSu<sknZm{uYGe>%l9#u zSaj`Me3B3h6SFC2SXSZ)f9QIT%$1UrW(Zev-^S!}xFJ8l%PMCy~jKX)=jPXIHu3~MM} zRQt^9jWEd-1g`au^I*D=_^wFb7EDEL7$JFqLXqlSE{;0nGJlw3nQF~M&x#LDXRj~nnB z2;{Ju)dMfsgQO;^-{n0yZo3&{%o>XMy<_R;fHyZA!04%v#n(z$+|U_0Ez^*oia|J0 zseuX5R#02pkX@GgCft_4GtrzeTk#WQb=S*QMfz!CTp}V0X*gLXOSxB}x{E(0>tYZ0 zS?&IFe*{RT$M_V$ZC*GJ>Qg%qA;5v?_bu@HwYTtr2sE(IFNm4cd6CXY#OJ+E)Y*|w zzAmp)f*7;2CSD3mV5q znaoX4oMFa~(<`2Cl5IaBNm)A~1@M0KNO-qq{IXO=M5@#qAmfy)GPp>D4Y*v`O~da9 zi7&L_2rOYIoDQln%D|sM-8-2_vwuhy`HV2{_D@7O%UY8|=E<|_!*|k$B4j=i#_e7& zTHsI(K!Jthw(E?s^+2spRGc}wMu1Fya5%!XhG#6VIk%xd(pv!>K0T>|eYTla&eB`4 z`N*+-M@#v;U@)vBXL*<_q4&Dc_w>`}f6hI~FblP;eMGF6z47deI)I+^==GRyzRoc5 z7G;6;=DW&r{3~q_`jIt8K?6jFy`p-LCwp1M4WxxHyJ=O446#s<^5m;%M0?*i<4Y9@ zwc4kaXDo+iTrSJ*H&&cKgD4AHYlWJ${MK|9jh4^Ygm6&jS~gqPs4BBE8x$?LdhNQD zKg;>|XME;k5!2DB{D_+>^U=}AiA7#tFNzpuAnw|)^OfhuU9kc6D}C+8Y23rRwk*v_ ztThO~@mgA&LEEDe)c@7ZK}}=ag91mg?BjQ5f$d7bx`3-CD^PV3iGU0+Cf*AV&`TPn z#)OLTHf)ZWyMQ9`Ki$uxYL>3=r-$T7TKIx|Q4I*Vcw#phC+eP;J$H6YJOUJ@u$gP_-FBnqL;UkQn^>aGMg4-5&5(zJqSUky&0gHG9^ULXCjSD_7vZww>6a;=~#1-ORE+QX< zB~ys7(Omp5T0ci1^x|t+0qfagO6$v;R)*ZH@-)>NmkYPsz(|}zmkn^!z;?ErElX`t z9scFG$~>um@YMC)?Os~bX&IoL5xAC&nMcp~;%?Fh>=tE>XhH%7ZdG!A+pe02=ym?mKEn%Ci0uQk(Z;<5(-_=^?s zw=n?3v)hp%;bK=#JvRTOI^TamZ|vqPdpOn*ncTHOcsqku+`XnUkCN`US6e^nDHvA3 z8S*l*oi;kWHYf477ht}G^TeXYZnMS-k&(MrrK7RZ{pfQKQNIXe5I?7nnaZQOCiyN0 z1?d?sjISrMpY!ur7NCX0=80_W3rDq>0P4YnnHQ_u$AB8R@9jnjFxNmXsq(UEeN+=(ztO31?Bw<6 zGj0~eUzv@aURshD-8fnUN8UkJo} z4{-_?9{*A3`?#0adfBT0A<++_q)#af(c!BtQoKgmG%05yMEH$S8mA(}e88=+d`e*MMPBZDA6W!7Juu-=zejigH@AX=ijrV+6VW?fsbMZ4R} z(E#6kk8N{~hUpCtB1bGYqyZT!k)?L3+GqEbvh1xQRw)9Rc28EpL&H-?1-$tSQYT~Y zz;v=_P;f|8(wI;q?nNoKY^|c9{v*&8o(^cr$N~i7%5<@@l!X}nQ2%PLP$bEEasf6z z&g^-8*ssd{)S6$MD)?8TMc}>{BCU48Ge2$tlXN13vAy!6tKfUrm!TlPx}_E>0A@kO zmTmkyV_4R^q*=!sN!nSszOhiA+CKYuBXTd|+ddGCcLmXSTiqz+3Jwd&d6fA$i>S5y z@(T)boOSF!Koe*s=%8w#*V8W~D2uxaUTC|S!#vkYG#I;sv}eflK?z1hGbx|F@Lv_L zXq7UrmAz2-Mrm@kjfhz`9v{uEXM;CJKi$BH8;0R51|u>PO`<~G%^&oudB%)~ci`J% zdAujChQd_~2!7pHmfCN1yf}SVFZ6j5vCWtm=nxxlP&GujTH#1$g4$|LplM;e1Ht$< zBf_s!oRxNquMTQB9UTL4v8jzewT!f)Y zy+#^w{so>AG;)Q~D`f4nVmxHQYM@^!BN9d>9GV9cEFA+&xA3q=4Pw!(OJ#BEN5;Wl zEGORBwmt$o0me}BTPw|tKRMy?yFklIr`<-yIJ^l#VOK*@6_2}7v6L%KkQ$%*OlLg2 z1V0Huw`mb-;A_Vbbl(orS_v=Xh29b+G79OX9pDDoupHb^4da{iS!LeWRTw1$L!?1J254P^f}#GbGfY-k<(1H>G0HMn#~WY%Mk>0Gs1A2Q0a39Mns`8xaRI z@n_z0$Ju@DIuFxm0i_)Z-h*X0=ZV{P!Zc=WB)>R= zOOg~sWRe2>0N`a~0xOG>6sD2EU+@uqC0Y`fEm2c^1yoIfnl2g@z-wAF7_k{)Rl~0@ z%M4o3tSe=4rzPW{riv5P`z*@iWLnLUxCVRb;xe%c z-DXd$>=YZU!qgB+^62wNB0|qnDk;v+MwU&D#4P%|b)f1hC(whEYMA%p`W&_G3 zJ$b3o*ttTiJ@ANA{)=QpxT*)lyt`nfR{{S!JQmao;_#zEy@Bpo=h>>Xf?|?KM(Chn zq;)?ZZ*CVG5M#-epVcDr2KFtlo@9A)ON|IMjEj(NkTC1_?XH(9ma9I~fwxJDSm*zP zM70pT)d$1enGf@2+O=Fa?kV0MxiP2DqltjFDwZ)~lh2Q3JXHjL!bIm?atR zSSH#FhDJh&ZYDb49kX%olqmr3lMmEWj)VG6HX>58r(&ZJ7!~Pk2v)^VQ?XKErv~*! z5Rj2K{Pwbvtb18TF2%wT1>WkC@63$isczk*U zUllZ>^E@j(+BtJ?eVy`Y#Tr!st7QdxV}Z_@b5}jW%5yxv2a)NAr-Fucdw8 zVKnQa-4pf&Gu=NXo0wMBO-?(B7&?XlCpdWC6F^bJQ;rkcX(w9 zcSHJpPG2V)HlGk@eTj49pk=^I5lclCpxxyB5GV{0$ik6V#DH&yN-9aN|2Q(Z7DNA7 z*69V*V<;CINup;kfng$#uSXqv`W$`1u~_fvbL;tq&H3~<*fi>y=ENLGAE4GvVu|Rv`AHy z>!vvLQ$BvUjU*e4TLW~73IM@&Q5CUYNwOZ~K!!sbKpoz7YA9~thLI}k^yoOKh0_b5 zX!!*%sHt!q9LpElg@IAkK>qiRgIfMubL=1_)H>GclkaitCLY&38Ydl9Ye>K@B&b)V zR4yP_Wx8%5-LIe0+Xn_~G9G5YYEZvc&?ptmM9rX8?}R@q<#XCG)d5cAj*SwTmq?dI zY%>7q4KXkU)G%(A#EWWpnpL0Jy;;TzHhuHI)Yjy`^%Ft#bvZ%@3=N7=shyr$Z~1gl z)SzB>tXkFDQrp2e=#?rh zb4F}{hICOxg;@$5Ne&tVH~9|^qSbwxf|P0i^B^{6WvQ=HwH%{ZkO=}c>hHk7C}a2t zG*d~fEg70}-1BH+9DI`_SM#$1EF6HERSf{Eg4gvz2je2T)Kn2qKJH=sI8}^TgJtL` z0+mA+#29Ha0i*DL*-Ys`*T*l7Lno;|L)GO_J`iNaq`|k%cw9Gh0|K^@ju_#Jq(a4Y zNJZ)*U{odjLl=SiQfP|_WN3|E#~EA%`!#mV0vk2J)JB?AqG=Bynt&pC0QdzA#_(CC zF2t|=E*>6d zxu8@}g#RW)Z9a6`;>rMJXYb7-?w!Q;Ds{ z&}Gt*U<-c4PMFwcuBNaS6zFJ!mT?M82C~mQH5oa?9rZt<0&TPgGda`ZG=VAbPf5#9 zWAUS+84jIj%IOg!<&2DT&=)JU9X%g2AVIC8Gt+?CVV;`yYL7hSZ3oy^()v^9ipX>k zY5j2{fX%Lzq*xj&nXZ({7HO{wd~jrp7-XuKlRXlr268zs_TxY+rxH}9DRn0(Jn)S;fLRK( zp=z!g(dOjNZZjXJFac?Oq?dq&L5Z6ay`x7YnEuvWbQU5oNIb3 zM2KX(_XAYGz6Bkpq|5h)jQO}p2}|h8hNz8-@hJ`<5nltp!1{9;u_F`(6NGfQ_iR@A zdEQs1ianfEI4I(zSz-ASP|QAoZ1P%&<3gUWk( zydw%KHOBH}z|W;9J`(TVtl~T>4@3Eomy+X-UVx&Wep=wa`#dB8hb{jAgBO*|#h@wV*;BSV}PsyZ~G4RLK zFn*UzQ0rozo(UPg__vCgPpTN+qpNs435D~4q^ROYU2Rp_1_6b|_=;fLAkd=r&*x>b zfas&|f(-cLBp2&Pgn>C`V2zRVAeD}TntJYm@FhRxp6%n#SpQMLcBBM6Egc8-1y@P` z>&aCR-$Wj0mq8iMJ%&;Rv4f91a@@PX{>%Co)AklfsHY<#tIb?=lFZ**vBecx`Ws{w z5ixVsTy^@CMZ7#YH7BcbiNWPVCzdrTnM{W#Y21{Z+t*#u&`|IeYo|uzS&wV(@?jzW zyFwIFWh_zjD&rB8`s!V{N5|DVrW%p~X)I znS(EmJrd$pA#BfjY<2Z!*u7u6*>mZKV6pqnNXTz<3p&Z;(35ehSYEZ*ATf)z?_dPB zl0%TGbyoV8SLZw>NV@sYz;Xp0Etb=_u6r;=;PoJLK2<1XAG%4b1f#%?n;5rU?_kDk zf098w?*;8he1-WLTy+;dJwExKbaI$yj@@^QIi~{M)h@TNsa2UZiZV!=y zgN+){6l2P9!SMwMj$0((@3J!xqL*!Dr0OAg>_1e`Yeu1rJY)zk<3FSa;Xe~|0M?~i zEfR=cm`uN}vaGhl%S41a?2(br0(R9D%m9lZNsfg~!wLW`SYQ#GS=4rVD#Yk=P+MPb z@OTo&t*<&#{Q~)s&MHGn9j}jt;3QX*Ch9-9TFv%Xsj0ki6ID4Lq7Z`M5&$*fVWeIS zRO%|O*4Op{`|BNPzy24~8^j)yYid57E_jtm-SRKDc>%B|djJqfU(b}>x+>lQP5AJr z$i8}3+4{b{N^6eZ=*J(#q;}aW zscB;tf1Gp>fg*)=-)^m;nVH5<=MVp&O;{hE5cVf@B_ztFq3zXU$H0=bg>xry=d^+u z*#@;=45gW=cD7c=^a*KBQsadjmGj4?wO`?K%IQLhN`w~Dw1YsoHKs>2RuHcw!J=k` zGl-;={XNDV=phznj@gs`Fe`Ov^xf={_-aG%e7SS?#}};_82&ES{9OzUIY?9-(kspx z0OlCi+gThN*DC~brz@~!{@+zVCL7D`+=mB)20?%o8aYQ0U6V*fVhgdVg{(k92e8Dv zG{I(pkO2wmoo_*}F&HL!iu^4TB0%`4aoh|SQhZ1tuQ)asF|4L2TT8eoufM6b&t56I zLQzyg5mIH;euiWD)rt71j> zv}ovmHR(uIVrz~7FB=qC=;SK?xUKfo)F=j6R^Mel2h_Rg&c`l0P2Fd-vD>2J%HhP02m={7D(QB1ZGTSjSxI~c=Zq%W; zh~{L|VSsOfKNbMYL}OMppGEv;{9jBrkYsv5eZ66$KxCSK@t9g1@_=pmdNATj0*nZa?*xCB4JDq)};bcieWrLApydpN)N@)QE;1eIhlY%ZgERm zT@jnD(Oh&B7;y<^A*+u40a`Ze*ka=WltRwTf%8Ft;uQhP9>lN&RP*~|dI%~~H4)t` zF4e}ZU$S^fC$nUln}f=g*wjh+tFK(bZ+8p>gS-a%zmc~8XkVbRKME$Q8e7z{tx&j2 z(z;)$j%~4I$(3C4q9Dog$T3CSsgG)&`{(O3$(xJ>`$#|OA&P&;LH{Q>>0|D+1Lyzb0KyU&jJLp7N<&jz7xt6L6{?Y&3WG@Y!_;wS zRtk`Na%L=#rR7NCgG4Up9~lV}x%K77J~zjaOQd}*RU0j&+X-MiA|0Y1b5r9euZ}h9v+rYklR{5MOuHm+5AbyA z$Lruq`IP%ALVAPfWr-P`L__^6kT7NTeiwF4^RN~v;_5&}0&t~8Dg(ak&Bk#}U&xPg zS95)WW3Pw@-!xJO5C6k4gk23m7?Se%24at}PQ4)G#A;vl?_`f!Zf6$Qhbh3U?&9om zeug9ezwk4>=>Hc#Q#UG@7yfn<&Dl3ZkuP^Kwi}@5aEv3*ryMh3oB{840$0Ph&Auyw1zf7d)4kyAjC&s7X)o*J@85u+AEFHf=@l@OacR6KbF*Uq3wg~s;66Y z{xAa%|L}wK2}3(z>gWh4GenkcUkUm;LOnkp)Qng|D`Br~Hz$w67|p8eI)~e+ZYm~= z5TMH!)_z5lN*X*WBE(>92RP&rNOnZ+I<{B_gXTbuoB)+0-URmp(cncm5Y=R=5M)|s z>Uc`e?8y6JP#ema_x;=3`x~BMWgH&{qD~hwK#2t7hH_NF7B6KBtcj}Qtt2~+oP)b2 z@%M|=GQe1#Tv-h$#{B6cq+Cxadq7(E_G;n%pXr6nN8{JfvhLv>c6yB+;;geEyd)h5 zwR06s)>&vT^rp=)lF)E|GdfbM>0n2d{Fp)yjKe!n;s^#Q(R^F{~wE-jLM8k zbgwT}RG*7`z#v{A+6|w&*=}5zew(a+OLWn$9r0qzcB`nM;MMoKdBNI8BAuO- zZ4D;)!?s)oD3&mNxx0hJH$__`bqxDfPbf2BB93sxW5&}NugP?V=mEi3n{Dqvt2Zd7 zc13Izai}_p!AfPAq6t+^&^(QSzI~PRq_`Vs&yx3HrC1hwD`|smzCul3`O~QqUT+r5 z`mQq2%Lwl3#6OjBIJZF}ywi?4M6e>7fm!F^Efl@>#5p}T(#c31>3jV%5(ngcGO%i# zA^5+gFkgHAZU1jJfjkghi&&lieisnt0Z-DxrPGgtv`Q(@?C*%+BJw8zf8&w(tK`v! zz0wO-%P+eS+icWAo{T{JPY{AM)i&Ee3e&=ed@@c-GP~zLlGo~h+8x>}cQe53mTG1n zL=8w7Hv;a0&0(|e(yryAm!)g!euBry_*}-J6%SVRxM-d6#;Dog9JkH>E9q|4>5m?D zXinFp=@UzG%C~8CLD{&?Din-6WN#lDF1=YuTXXAuCo~Tvv{q)ny-!q9KQ01B+Tz;c z|H8X3$*|89GHt0A=Yvh4vucc=2c-E3BBB!su$gLxX=Zy-Oe=nv8{t%TuJ68l1Pzwo zXr*^SDm~Coz}TxdYJmlPK**8K_4Mi^9137vwfc6i|66?%j#QBi*lC|0(FhM@;H)q* z4+Q*mOi#(&4lLsy00eTp2cvli^=m8H&UOH+gX0lA3CLFhQ1k8?GRlAR45Ji^=ZA;^ z3P>mGpWNLFLYz0Ffv;A0e+>E(fPxZ$|KKL~rh%O_`2hqzxS*jt-l$0-nz;}!$liTsp=}?52JekjGbEF!h_n%dYo21(vXHY2u<&t0WK2n-1pX1J1P^=Uju~w}%3E5kFHwIL9`Xs-1MO680vFOP17r z`Y)J%OJcg_Zz+B9-%=VJ|AsX2M>R1p)|?Z)v3}U#VH>k7-Ys%^-gyC0%rCdYF`2WN+Ho8 zjY76J76Qspr<}pRxn-STF98SV|G)C_8&49SQJ#!ahRG?=dk5_5{eZd7kVuI?Q@F|+ zRDIkPMcOnfq9E*CBmNs0j1&9MP{11o>32sl@ND24Itatbq6m=wUjL7x2nGmGP2-}MM_(&Y(m@0+q}n_Dw}XfdPs9Y~U8|7xIYlh% zSoAW!A~D+Aby%hI{LxDZ6N>g16W#)fV5rfS80a$DT5adCRtL_D3_=#HbU2QwSESd%p-Z zbcYpL7Ruek8=?!ra!&w5yaJq5g9U=Dc645ya8oMv$=WnWcx+A2@dh5_X{tgcRb;Up zA;4KNR4g7GTM5z?_z)3}wNMoK&`2<{9gAr4`{}jDfk)@>p>W(AJOzIS=9My=XcJpm zG3(QV!4xwn8Q=9JleJ=UNZ^-{sq@5F#T5f&7r6)X?R)+0w-(RAK3eg5fYA5LD-1|j zXQbqK`qfDTv8;{uCG7U_QtE2xP~P)IIBMNR7N`PO^wJCj6i`=OFT3oM4Tk8;g4IRF z9ya~N$IcH43v%Ew#mkHYM1u>WMnJf{b0!KOT7XoK^&=LY5zA+0_fErRa>7AsB^749 zj<$ZpN4S~yvQAKO=h}S!!`N^Llus-rKG_#??x|Ie`v^fR=sFK1Q2kplK)9~Daxyt# zO!bLYnFx}+!)Ix)ZSlwh=J58{%AJvd8rIgC*rd??OLN`D;b5eOpYce*oY>A3JI+Ji z&`CCuxNs2FL%KLmaK`rwVXE>Un5TbeqG)>-E(=aX*JEeIzA?SA(c+yAffEWvJtCSd zf}I?mZdwpWD`_<;=(+jOKH@+DZC2}h3G+PdiGnF#-IYht@JwAL_dSD;-X+3>#!cW@ zV4ZRAOQI=4lP!t)7zgWMo_Fw`&B%p2>J{~{KolW!d<@P>R>)9CVh8AluqBjWRz(ic zMRr9ji<%cC_T47X3)J4xt2rh2#a%hj_OLJk)j)WBNrxp|-P%>WCIlSn^YiT>lS^Af zc*^(dks$2y{W>3T`6C1#^ZO(Q#}!_o2vFvkj-|PUZ%$hY#-N>kpaF3Ho2en1zxPObRF7;W?ieuCx(YxtPTyuFKhxODg&mwPwf#q<@s-juP z3K#6kKfhscMPc&Gb9cj2-?Sx{_|hk4E@=HZE3pKB{OaZmj~V4n-4yx_fAn#Hw!8iZ zh3Bs3uIZ6AZ!fdWqB0^>K>?gQUn&JOHyI9Yq#i;`@)^qb}*-%LdL(XO;g z!;6DXTbRD~sa|)9=+cFqB+f@}xVtQv{oC60&`5>JhqQvA{(7s@+aYiXeM5ePB%eLk zs4KH7?CmjRlxy|YXTh*e0c$DTAvmM;M#MaSa!A#_@Jygd$x!QMPjBId4XdqFPfK%Z z{j;z2wC(UJ+;?E@eCe7m=`AuFpYSsLTw3o-T0q<*x~x9r{VLCxP}`K{t#@k9C3lJD zh(SR|Ei>qYiRJkN>06pFIM3>Zgw9bQb2PowQR+Gnj{d4|svkj#4-N1rU)1vbQNOB& z0o})5ijI04HyYcjlC3j%ril1U`Dwq`%G~z3=oynTt1fL?oX5O6XltY6N<1zk9hz<~ zuDEyV6SLyOH0}o{X^TEMoL5nGaEtKBhP*X_i`Gd-1sxXsl{_D9aQHLj^Z7gHRYmh= z*x7q(Y&lZcI&VYhUt4Wb&gs4z-1#-p_JVSGX%^P-sDks?Mj8F#)!~yd8>fgi&Horc z@Ke8}oA24Wq0{E+NKzY^gHg=HVPpTX9~&>$=Uy`Vu$QtUIpO2lPj^~wuOs04DtzTj~+h_@m4$ILT3obQ6Vl?;lrt|g_yqb%a0SH2H5I_;56{2g&{ulG%g zr&k0{p|y0q6D{XOSnDsplW+c!LVLY5#0Kvurvy~LKiE8gz}tTPcK3=-jyz;pa##+5Z=p_d&D=x^^-1XI^UZ5sAFjv3rb?9hHhxtph@{laILE~ z_D5;xp28!8K3e#&NCI7UTmT9 z^#k*Hu{>+o;+XeU3mZwA^F{85lV>`q&O@4)Ru;Bh9J;x(MC3?72EO7ni;KLX;b%(( zZMgaRDQwfE4OrF6EnbI1+AulT3#YNRMS@s zj@Dfia2}dc>A<%5Kvn%Q!+e8I@_vJtKcd{PlUA09<4#w7?rnR-E= z+dxTic*Fpvmt40S-e0dyng-QAK zM%mKt7^)(krO&$J;Hv}fvLcRKVt@UbaSxw=1$#l^Zu7G>%RFj@-v5rq=3bu?&Oi;` z%}u%B;5!#wyg<{d-IQD05H}!uztYd8Bt*XHkB|-1c?Yx^*|&dXU2y0pufjFFCKxqe zn&(|rrelwR!7xmCvJW3H-qhU$c(x~so~W*jU7mMYj5 z8L=%&cD+Yqh3PlUUtf8Dpm9Sgewhfj6NIFi z{>PffE&C0dO>D(iasQsINB9ZPNhUo4O=1(hlat4@m>yW_yMn*c^Ox8Qi7j6z zEb@%xNs>$cSh@RR+9!pe;aAO_FVSTId31}7AA3E+v@ zzgBTBq^En~z7wx^VgM-Ewa;PKDTl)b!IeDZd`=Uu;tGg@8k`GO_9 zwfV$*K}36}!@H8p{13l%istpiuzMvd-=Efw^x*fUMq76peW{W0x7Zh4dAFr$INavE z`TAY*M<4dhi7f1>(v1->vpu|U=s0hZN}wZsSG1!?OL#812hQqVtL*YrCi{t0l{7gT z*<+lB!CKe_DlHB-ciop}Nq>xdmbBi(HG_7FY+&6%BDu#{stA)J4d>U~?pUUzM9joI z3W}O)_`BN)2Pq$0IP)~2ZL-kcjQ75fo6*deJbbl{q0&9+>kgs1vo=b-+G;eD&L&3| z&-V|M%qU>bXq*2^KbLhjdSlQj=7 zY_W%}mHYvj$U8YX^S!EXVI|G453Jl)Rh&+=F2uI3D_nrlubw%R&E-nXjdp+~w+m#c zNX!@$oQ|?dc}0MQNzM1<_)OlJob1(xb^dT8AP<`{m(|IHCKj8$KPp9r<~7foo@{2` zbU5olaFfM*%LjW;KvQH44Ue;_7INuCVVfZ2d-l6fjn?{KM6SIImc^`mX))`(LsE~8 z-z(?*2CFH#S1xIuegVFfm?OJ2v2#8#EIjmG|Cjk_kk{`IeI+xR%~mjI4pF+-aK6{% zqXl4J=8iG9tVV`rG|#(n$2l)_^3lhw^vMqi*`2d2BkT2k)3*?e7TvcN%S^IPOJ+=s z7MV{J>Ce&ERFJE_{k|uiZ8^of?3m}h6R%5EBL8W_6{^xn!}jnAL0ju&`{BcZCjBs%O8>zYUle5F+{XZ zS-SbF$GCzWumiDvgv9w|^B;rYe=O@EQU1jPvFjaOT6BCGVQ|8H+0Tc~)~uE}$Q&a2 zUvdTyoVdE1ZgN{5774EmhcZ0gg^o(hJl+MDziI}j%9V5f==U#u4VS+fAf8|C#?9B= zR^`qs$5`K9HP74L;<=L5dTJ#L2OkL%yUaX7PnN&3l9OL6#QaN7f#2q#;4@E(0(=$% zK10E0{&hc|SP=XByU_LCvMkFa`iC)5YxP)K3vbA~a9TeSZr_invQA*KZDkQkQ_~_) z=dUBJ_qQFH6kcW#{#19g_LrFDDo}LYsk*tcDN;YcUyr3*ZuFr&MsPf#RF+hxO2PBF zQ#Y0KSz$JB=m|u4X*`5C)v)q8EGVXm|6D&mjjwXnjZF9%$}fnW^Rx8mYqrRQ@f8nL z4$KKu`IpAcNdSCNs84VUkNV+=LJSVmBS6^OGrzM{h2>yegBHyB>XEO?-a&C;<|;)) z>;Wog>q^~@$owa>EjTQ<0(zb1qSo9ivtF42k3IME3cfbo2i7lu&!lPGxWut;&AnC5 zYMEMm)R-P8^Y0$qv>skv)U7iSZwJs|nHT5(a;5>#oVsrSg??JJX?Z?HTey*7HR3 z!l$$Glb&L1;BIJVf85%xT1x54LY80+J%TfPXw*~8T>Bw8@L9|3*41!WKDbma6&&;p zj>#?0(1;Z?dFkfDrFjMgZf{1<7=Y6uI=BtYp}F*g3$d}{R?X1K^czoS+66Z~AK<2` z9(x+2FOWvnyQ|&P`<&{^kF}sFRGL=ws$=U-l<(@q;LKfS;9lFselu5?Bes6GTAnLt zV=sTW_sPtC_OavVOj7xVQpV?O&YO9cZ?}vNv(HO(cEokmzwe8%0Kr!g`5d)bIzM= zN#(f8JrJE7yW1nC+sl@3F9(NS$l8NrZeGqkA6!*zniFa#*}Eokt<$w-WoxgU5B}-V zv3coB9HvL+ie21Rw9==x?huFUf=nKtaR}V^^y`Dslz=;H=VeEA-TcY%?Z(crNgh+4 zbzKhr{_}y`J6R~m62i#U>}R1b0?&1LjGbe+ySV#JtGoPUq4YQTOoQ#37Ov>>vKN}> z$}NUJO|r^gxWR4cXIE+`b%)-*h}-cN(JL>mdY*XP`)q*4<@4)ChN8kI-TJD!-dz|x zoh6#X?VsL}z-PTAt_%8&Iuts&iK*up;a{XiiC0bZv>u+C{b^@}XZjbdfT5m3lbv>{ zkG#*%u{pcoy?AbER=aIvn;M#b&`KoW4!zG7(s#CReG+|7xSNJJcx*IS zEho%*R-D=Q-lK#TZ$^pWgMG1;K~m2fE6Mz^i-%u<>7o<~uXlV2a=QnqRAMU4|MF*g z2Ze7m*)XyKl!LO43||Ys*D}@d5Kb_|hcLbC69xj~PJUY>Yc62Ole|xsf>&{5G-Nma z`T;xz*|u_i`46pT2@zTB^9M)t!$gyOQs#nZ-i^XYko+qbevS6bFs`DAMA(x`O`8*VLEo!7>A0U6T=8yk& z@XDlD;+I9Sd<4(r;a$iEOf|@D8U~k>%964 za^d{w?k!3CmO&sdOi}OAKD!Jj{z^Nt;UuWIr1v>dB2cj(P9vPwsxg z5@oosp6w4M_GKnJEeD?;1N3ru}ee)fQWu3|=pi|}eIDNhaU!hGi_jeyfuP;9Nu`L~1 z;vfn9Y$^L2SC*QLSa$x^Aj!s$!g)+$Nx;=EADnpNPyL(z%OYBCWhB=x*mZGoS$4I8 za5@os(!lDhf-pRx$TQma!6EtWq}#n4JBYcwtB8U1z|gTdZgv|wgH zOrWjDbPv~pViW|r9y#7Cpdt^?vKQ=(^24`0`itK#%sqwiV;Pci6 zO6ESyJF`!XPv3p{=Y7HLGn7>>`(kL(&%ejjJv(uk!=N5dNX-FnvajW{9o2OK-0Jd8CH{}4e*sH>MlKzEXKb<)g^|5KNGlg`RYs%!!65Q- zf54Zt)135spTU*NS{3+{W?<%VdfKV!viFQ~Pu22dx1Mn}WlGa-J)>m)St38?J=kt%w9kC2J49rcTaN<5-E+))j0(3bzPmaAew3IU4?n@=IwSn0g%3-^VKh-$cLGl#9!5+-}R$u?g+PM8sqch__?uJ|* zty`aeck;S}5=k712qt^a-RrH26sxCm*(kg>U*7y$CfSoeBh!Z=U-2y%j-_Wgp+x;Y zE{Da;`19q50LD9bBGNoB8QxS_?%Q$4>FBM(hX_t&c!76vnm^;k35GoEn{S7{yqNtx zK|zRIzAdQf5bE=1WCk+iE^}U+^OkE9gb|6X^o?^5HlV{n&l2W2BTE>YDntbGrdP-h z`&QJ}CjguQxdfjiFz=RjoBH`0Ck|)j^=n*YyZ86KyQ6;tMytXm4sTATWSXOdsU?~= z8V&v%ku`5r63J|Kb#GT%CTzWsWAfWO|4keEYX?EM=NofkhPm zFv!Sm9WFjd4+)u`{LPIXvgzJB+*ZRb#P0s!Gh0ov#M9q?PH)D9p6@%M~Zy3WkdT2h)8u+LFL?Kl;eX1+*qjln;A?wFb(~2<%UV z?ZP`&W8f|S(rHA!Iqd|yp`F}T@L!UB`Ta9rZU(zD)#r?*+8UuC;G?4S?}P8U0kS5( z?FO5@h}=*>0_KO%f04)y!kd#ioisNjV9z%EKP_E(R8mr4i(6*`E$Z~ATanv-0 zN}X)7%q+{|q*mBC<`#=u+K52g=;Q)o##nBt&FLf=HcDtJ9;4ARDVKvKDTJn`8Sd=* z=7Rn8?s@O7-~D~R?|1II@7=GG45D0W5dWJ*fEXAlrA}XgKn|KN&nKh6RPiL$T9DaD zyZ{={sFzfeSK>wyN!>^D7_&u-?rfwB=FKkfdWp$OeSF%1lyWVQ3m90`Z@L||Ve>M!g*57{y6La*5`XnDRA}Xx z&8PY#cH~NDWlolyJJEa<quTQPsS>nuhe>xUJKnc?!7M6{$Mk7gdZKlH^f2~ zZJPpDjTTto{y>8@?kwEUD~N;dzV*$?c67#xylTd;?A(5t&sn53dQuaYbmH+w;0&ik z8C%yn*+Ni3c!^{Qm~d+CxaETZ2G*8Zz($gJ)uGcTO&(zy!FPD5VY{o*ja8^BPncdK z;sg*bN#GlXSAnG0>to>S7;6Q*2CVk!@9bOhvRG@vNI@xsjUZoF4}IWxnkRHHu+|1m z7%oZGmnNMcqv!y4F^TA!q^l668$uXSI(a-t7sIu`->)SBT8Q9lFi;G4?~e)}V4Os5 z%cn2YT5;z;prh8HqX;FTj55eZxE$Qtv{`=T-A^_SuEMYd2G+)4QU3vpQUi-Z>wu;h z1i=ZZgmb&Wb879NB~UZnG)Nn|>V)j9PN1v1G6g~XGa#4^6c40_r_Z#3XoXcc1ooh! z(fRvg29_yUj3@ztAF>ee!wD&! z$Q1D79w>1MD$j7&X>y18*N43M3K85O19%k_Pf#6TBlI|)$Bd6^<3Mr6w>zI_UsJeP z18fc6ZMwA6_&UzrL6F<;iBiS_lnm>Zd-m_h-_55j;{hiLFl%W6p=_IZ6rENpChaaU zKuvQc8lXcK|Ky=W2)dS{bvoh02+aSR-@)irbxMk1fZKEjpZmuu$EZ>&Z{#TFHrRm z&BD0--(B{c%gGLxEC$nc%w}$%G?O>xM?T!>XmhFuz2a^KOS5j$zL)sERrpfw+#68z zG%cVpsXP_!FAG{|WMElTMft)NAD-=Q)kxkpGo){1Usy0Zzo|N9j(1D30o5v19=Oy~ zaQ0u1rYPUFjc^yPtzHd`CXzET*Y`z64Lfg=gu?h3$ue4zK@c z+m(-qOx@42e3sZ=H&XfVnbmpQSa;(yBh3*IIBUYvyMcY8zpEbEJWwNTe{Vfb^h>k% zQ7jKpgq{0^Jwb@!zKgxIw`xUJiwpAN>PN#*7oP?;mz_K^N$5EkJy)FOSz-5)V`G`z zpp#;9X8tzrR1%DAA^9{hB$al^l4k}TRewd#nT04ZITzY1@y zJy7aaD$smtZapPK?2|N~?oJ~<;Q&2N_*nTS}O z;d2s^wwj`L_`<4z@Uu%AQ)Bok=qL3`9bm_d-HQv-FYTy*5;2NA?XA@B0)n zyFJpMa!-W!XrnlJ^SW$e@N*sbohFi1_}Q8=4D8IFLVMw~>r7R4tLj+cTq}k3T!#HF zz+=dfvyAzS8K;6NPgPDn#KA&ai6%Fk({3nxHqMk@rS=d9ApXW;qdUSe-TR%U;p9xAm2fKhx8rJcZAn;ZsJ=fley<$g3IB)ZgMQEYz8L}0zQg^F^gHVBSiZmK{*M1Y zJ0A$_JGk$8sNdm#?}@)xn(vsu_nhAe{%7a^`0?Y%j~_pN{P^+X$Nwpub%P=QXZ_6o z@6C7lng1W1|KrDxA3uKl`0?Y%kN0)PPAGcPrz>~KU7Y`sj)Ty6T-wwlB5 zZUPC0tw_;G_{I4d1#kk4A^Wv8NXzvH2Qu7ifq*D8i9P|3@N+T|k;d$HM^@1XYEQ4u z&Z^GR8bKi=@>bS{TguwX+Pgd_SC9pz!{(wtb$z*!ZUdvUbTGq}m3go1Ha{JoCF}?W zQe*E7sK&ClUXDV@pl;>6=;00)_n&Uxo<9`3^ltD~&bm|zWg!p;4fjOt+@4o=RP9z$ z!k_6-M;kA*GTdBMc9Bc1jq7+Qr3A^+q=TcFR#DS22&owdBFqXk(#x7NSufIKYYi4q zgpw5>ZAJ^FtJGD}lH|w_D{7r(M~agFMDvhS8-^TU5-JJVVy;n8Td{R8Y-M82Y+|+U#O_g<51nlX5?72X-FG+jiwvZeao}dgsV`a;!>a?+R|?YD zk*1$u$iUfXXXoD_+HfS~F}2eSpKYyn6GiMJ5YB&ld)3y>6H4xHB{I=U)&~|LaKd=J zRl*M?jJ0_fuqJF5A)3C4di39&Ov_qC6l<(!5>yf6JL0d%*hCYAAY@jGbs+t_A!+ zu^q;7dszx9bJ7c19s)O$nIc7o#s`HBiaF4q6u3MwSVK~A!FY-U((7zV+py6dSR|IE zW+HYE9cb$2&Qz;{hH0YbdeEI{8kgx{P8c`?kIreTkEeW>3P4IWp2dl-P=AqGjmiwt z@c5#)0yUIhexrnej~u~*bl<<~V{&>*5@&KPc71Bqurx)EP6?knba{xl#xi(-)HN1@4el)~;-wimi1?8WDX6oUum4Ja`JmRu7Mv%K>C+feO; zXUS3eZBXzYVZcRFnK6D#!0}`p;N_vE>HH~b3k2pjx!{2$_Ht_$-)r5unDAEze$ge@W-^y?`gwe+ z8@sAh0ierogp$fCl){nV*cx%uGnR4jI?Bw2EL8`_3|0&>;W*Jy_%m!t9lE9;jgPnDhq(I>dh)B*btpWZRKEe~~ov0}dU> zi&ae`fteK`T{>;JMJ{YYIu(Zy(N)n=9jWwe3)P4hKAPQiB5v%CRtdT*f}ca^WSZJK z|1*A?@N1=`ax9U8lyg3G3y#l`XZRwjJs$(*K`jft&A4X|Q6&cO=LIZXTgMr9e6sbF zpKMJgV}BIFYKb#mg&|$*%|nS@=Y=S#=KWI*NpY?DD690=XgBn9*5!De`ybP7ZO={RdAKD(6xQryX-w3VPKlGd3a%nT|3 zBi@gb{(5==-auzbS0Vv?yJ-~n$&*8=3jJlFWevXWc|-i|0b~-P0?^7w4w1NZ>SCM> zZ!2Ylb9-Ag+?8oC$EVVQYJGc|ea5_p*SbXgjw&t7WK0W5lp(GMqN^vx&q#a*C^xVY zJ}~*$X^W_~1YX^kTF(x4*BSK|5K<0*mLt;?r~g2}aR691$Xsbb~8RC+WPEAkq3 zoNW??&(b6Ex#Z3slZ`bO^Q0SIFf)76UuUkhgWP@|MZ@KM*}2YM88pdOF%s4Smk}N2 z`W!fd!P|4rE=5LzPpE^>y*%- zjN5WIUV>e)=zQ&wbsfglcqQe)oK@9Gt>~$pM4#;C-JD8mBlXP>PZS^E)5dR5O;Qs9 z44z4_w+r?w<-*tsVG#1P%J5*DM&OD(z?bN^cTU)$UUIp;dPAz~)n68uT34?!<;T^& zjUn29-e9oN=%oi6e5S6^hWBdq?gI^VQHzHklnk2sB(z1ssrTM#5bu%DZ7fS2_9i^P zX8$x-)4O|{xLk8});=Y$$s|*srP1Sk++hTzY@R0782$pZFcYA~UXB$p^t5rBzEO=~ zC{`!CWapT92A3uKl`0>91M;HJ<(7^xu z{I8|ugtCmtYv^{|#9Y33))f!1$v+YxFPapYASn)1svM!LfI8EmX+kXw%2-#3u$lzE z1!3pW;66sZi_h^1PWLG==1cer%6YZkIvK?fE~7vxWWmb4={%Nh1~!s7rhGg! z6`18kyU5$&;j7oITrsD2eX;e@-)qudatEid0UeKD~!`q~H|hwD!-x2N1&%FT#J>($FM>C-_) z_#`?>43%UPoRl^p$>MRTRE_2_jE0+8A;n}dvDb$AarIPpI^`5GE>vJ#Y}#pJd4s1js@A>2o5??RIC>;W{%9`OGTLA>hvCQg_LJ5Ai<{* zLomUR#X$n}9w-gTKc$Mrl5#0rgkR=xOa{Uj3cvgT_duL3Xh4`@U5z1ZNy}&+3g)OQ zNOhy&$Yz}+=~KAM;JEV{On=#(7>bw<3m+Wfl!l(Ds+}?yoF+{);D!TF$B!8US{~6x zL(3L(2Ne%9Qu>eZl7kPEp9&=eOs4K|T#g(*f|<}Lgi?u@IfPoOF4x{$WVI+rMp|fA z32YXcgdSLhYwT;-r;8QxRuTaGOJ$m3vNH$mD?)%0O{F!rY@Ud$z1YWA zMpVZu^Em5x7!%aMXfBUC`!1Y*gJeWiV3J#-Dx1K#gqB=y$EctyP#m2+l%l$Rgd`X# zp~20(C=TO@O2nqrC(F;Uw?e&Oall+1q(frk3h zxpzjJZ=5M+l{K^zp9I-FgD0d*IMFO^ZhE8;FB1#HX*e6=Oy56=p#eK!BX-}`@41AY z{sMHu_zYbTX>V9=CGkY}z*$c-5NQj7rp_s4jNr5xGSPEDt*%yO>!eqn63!}rq`FFa zh*{w|bv*}j$u)2kOt(8U{YRnTWcL-%+h^hJeqot^nuA{yiAzdu1@0zpss^b z0sD@dNN#++wlOnb*wDvuZI?`-z8jCAjD@An7Rzuf&Dwy9XlkDQbP%jtKkm5KM%2bH z-rTB0j@qDRE)_0q!#Sw2#s+C}0h|V)DBn82MLJ=EYU@0Kr!1~jtNzjyN6#hqLNwzp zu9pJ_4^0MLmpuw0A&)?LuL2PBqn2_Kc(2 z0Hy`f00+imnF_sxR&=3wE%BekWPs~eZYhT80HsGYB@AI+Dm%84+_U{%F2Ug%jBpnf zwfLTAMT<;e@HvY2#kx%kuCZT&m}{$4$8=87m*6BKN`!(AOQ%_8XqbEdjJjuVZSPK7 zJ;ZudLQ9m*9>W5Mc|;$L%$izhSTGc)DA~XLGGqw{v8n4T>FRofW_4re3G3nSlU#2x+Ypr z$GPR_sf|v`mWT6)r10uC5Uz>ryj&?7``}XAqm}Fi?dqlf%$RuO9L7m#j0!tvde~S9 zh=CX~S`w?Y4=kkTHqc7Z%t}-;gFUN7b}5R_Wg1mB>{t8hEgW`zS4;-&AuKEotqpC0 zfW#^kZk$DKf{5nmvi6H59|rVui-Yw-GXzIkjhXXb(kgqU7UWIyNq~Kd69LN7@?*#V z?XvFR^=vc!(hH`fOxFBpvb1pxv)GK{r5KC!L>MD-Y<;a$_zMTI z1H4Xljik-abKEa=BP23c+#ahn>;1yQUs^?7fP=mRHow@=BnI=S#T>RUEz`z%QjHmV zRm_=+6HW1;ofMtVCX_AL3nj$s_&gPRY>GJ0!P1|ZZ%4b9ChVyuuMS|+DvT{i0Z$$m zq3?y(WDH_tJ4E10of=A~#f~{}36#Y2=#vw(7@7e|fS4)BZVF~ZJ#Ppo3QsN|eOX9WAoz8GOVl8{A-PmTO z()76uY?oadQEI`iZmk7Y5|*Jnut6a&>j&FyXH`At<~xj{%}`>%C(rTixVAt?plT zb`(`**ZceEt}1qyu1#;kTy1A(E9OR*S0|`k)0K~%)%@0Zm!~`U1NCqG-j8iK0s1FT z>5mV_vy@X_e=lYD16_FghdYREQ$v}j6I|(k^qRq7ek7rJ9?uVv$I~m861WKrYTl1K z^V1cFjIdLSd-QI2zr0ONNi4vU7JT290_9d+gA3&bQf1U&SuzkV(7J-0#WznuW&i*_ zFOB5i#0mNF6sP5{2}KM;7wVxD<$f3Rtce6TpztCEsO8#n;ixA1?f2^k<3W_0)&%Mg z<_v}yyH54asYKE~a=6Y|3z}VZSN531rad#K$_pshhAKdr+62dG<*t+-o3~odU>1f? z{tEiCo1HJ59>1gIf86MY%k_Ago%i**+6B+k3X6hI2^{K&hQY*yrxWKA9P&?!T+L0P zw{|HGSukPfPl1ySa2f=ZO$mplHq0o-bBx3AJ_00H)#EYaZVN+IfgQPVtE!4XB|W}3 zqja~d3#y+k=;!NzDbIJ>0FkW*gOj9M0Z0R6;mokk^$%5nyB&ZlYXX+j9~C+wV!Meo zf`)GqmWF7)Po(ki!^)6X4uS|TK>6#a2xzJkhtmlVxo-yubpQlg6}WaN21j@T4HhIQ zj|6cCKs?74hNQ|Jq%H@LRjfSX?H({vJL@m7%LQskjQH_5Q1Yi-06&xw-&bb@vy@%H zVm!B4lk5`$$I;wx$UiQ2%us*}T4YEv62uA?L5E&?!2g#I$pgOI%ja}8m2lxu%~~>e z%o4tYUq0Id2-xa~fGzN}xWOJ-G$glKQutcPqW?P3RY7z9pI==cAJkBkr}PFXm{BXz z-eP&4!xwf)=3vMf90Hbo6B0BE@!A0ws~pc&a<+QM$grE6J}Qhfy8a!QweR92d`GP( zKw8M5NrB`@s3RmLc#xcA`|hD>X9@WkeMF+}mr3s4&mUH=p|Cz*K}&<%_M-U+o;&Pf zGfs#YV!=c(fU$h^8??GFO<6n}ZM54+?oB7>*xD))&-a2pnpRI}+}%<8 zS|0egY0weZ`dDd4oyL4DxU)B!m1MRWT|lPg5@}v9*#A8*K11l~J>8$Me`qL`N>=&W z*Lc;m*YgQ}?dEygyy;`(+vv4BZC~OCf4zG>ed4?Qd*SOkQL?;Sni9jex%RQY|J=&H zvcbRT_$v2Wcl)>hRY29<=w&y2%&0;cVSCx-=EfIT+!vRO^@35=?SD?EUETADP*uG1 z3aQ<^;|Z{w-G59iL`0>LA8o-b4|2h9}Iw}t%;+U?_1@}~G*)X?PYeXfbyY_4s(8CAQ~X0o4bqmhjE>C)=` zFfu9ZbTggnAeGbX^Org%lNG?=RFi%t#V2}>R#R=jv&IeNe@2OW1q3#RCg#xyd#hzX^{h){LbP zT1bexHwx5hMA{x<;{jO~Bw7TNm$xQMRtB6d5U>XFtY;^o;9N^t1KYU*YsN^Qi~mqG z2?yY0ml#42%>tm!2(9w|%{+O#N?xhs0kWYP_$j*0pB7l>KBpPhQn(VtiFk4*BCk4Z zjSRHP^cQN$8K#;d#VfzCv$wH37`JY%ARK(SCPXr)F|Gq}fv7=o&jk+L`a!2O0E{h| z=CQf9ygdx7NP|4Vll#n`Bub(X;S;T9n;j|98I%+vU@~~C-o$*0SUPGhJgp5eGVZw~ zD1`~WqB;u&I1YSgP~JSsQ?M#c>~t~YOlIs-U+#gbl=~`~Y(&JUQ6l|%#CuLUd0$iN zAOTpLsYHihIXp^ehBOV}c+PZ!`|3Wf8S!kJ|FpbvpCUhTKd)S3l>!g)m3QI8Z#$4K z#|?VV1sP030|}&?A?yNa;?NwtJ}2i&9H#4+&FoXP}*G=p5Rk*%^{32+z9X^esr#5>3Y zuEjynNNNP;%Me`Scc_=xI0!m5q(R4WcD31Yp1!Gr-3aq0MC)f{Bj=Q%qouyJ@Rc^H z^QacwC=MDlY#cdk4v)6iEYyZ+ZL6U>0?N#e-{e7DKRYp}G>8t1$rRLfMKcO1tBDTV zF_G+Lr--@VZB3lpHF!v;F{EEWA7C6&Tb&W0!CNh}o6%MtzGIl93Ar~HaER+2Tn6EN z)$T#FD#?FENjxn=hDYL{M1g-;nE+kk%)Eq}385&M3l*un z6AX{!3f(f+EP|Vs-pHrvol=W&7d~1hZT*i&PT0W~VNqV_Di*Nxuiyt1NeW6qORi94aAemCGZFTAC9%f7#Mvjq1;5tlr!zh;@q2p@kaj zbkH2vsk*d4Iq-u2RV|$&%E{f2=t1{D%g+vuM;eEYc@Dakh69Q2c(54P2X+eYi zJzq&=_t%q*Yo#@NFS1XuqRLXiWx}hlF+G+`iM~vMI>OVtodjtvPf^`zA6-3^ymzeTAqD8)DSyBsB zq40ui6qb_7{`^xXSx}5YQt*yr%cH8lWdILFPojxpmINO{ zyC@G9L)^QpksUB=k4=IBs)K1Kk;0l*7RBBBvMDtN0B@16E<9khedp;^Ovy+ zL$*vS2TUr9X!6ME4WFxD*%22FHvWk3!f2>m0|%6u$h6qpU*?HNq_>Hg_x0^w1rw)h zpCO0z{==#&%op#n@Gi%U>%T9wWkO}a##NUQ*65_Vm8uS@Ic8Ur&`LtiU3^1~BtNfJ z9!Gf&nm}m2Li|1vhZUi8X}~DMRA7a*4F;b)3Uee@d`_3&Wzd zKMBBDc-HTeeqfvH@I!-xlmeJ$m(DvQ{iVfKY*;Nn>Hk>nvUr{vCd4!rvD%tmf3(f4 zaBpx^X&0}r=pM=#XVnx%m2Ju)H@cBHKFqMYVg`#4Ixqll%v*D0&1^;e09EneSI}_` zG8OCfDiOYb`M3-W6LGyQ1rQ;{)-Mu;Ew!^bY+d#RhXP!NweNyY>BVOi! z$LW5RnF$eFFsa^8@tbD)p^|Tt`G4!I5r>aRfAEBqoVYrB>N?COzI%2DE*?d#y(b_OF*-(QM^p-H4&yE^`h$sE&8z zn9F^IdheYzx$fpwLu(Tk*MiFWBdi9d#V1T=hw_0VQ4rkuEF8WbZWR-Hc)OC^rl)u; zF`uy8Nn3~|17-gY2~e-UsoA7QdMz<#zaKy9H|v;q8`XzW9^B`2Uh&%;_mi|&Jvp8F zQ~rM5jl~q0iscR@H!9cVwIwHRB~+@h{yU+kKNW?wVC>Styyj)v6Jfw@bO}Nhf@a>G z>Z&`WKOHiu?Tmm8cC6{btqASSb$3V|arA!XY}7hcJvPi8E#LTHIuO8n8{DPGV7Q#f%r^E% zX$!QePqr-Ats2X32L$PVdTe;^_$riEcT6byX%ERQsKpS2y6>6nGr z4F;AK83)N0IG?@wdcU3hPWmsM;Psr3Gjltf(eu3kF@IPNDa!93N*>xsSC&ZNG!y_z zq8T*`Le_nB<-HUTArK7(9@H<9K!2+Z!M75ZL%SW8g^o@JckMYN`qLOux&T5_7;v3Pg`+SR z9z?;Ffo$DZ<(u#yr|FdQU3Z7QTfJLXpCBK&ukYyG;N0#~zb}VAT6|$XqqjP}y094Ogw&=fpnV42xZ*DH~$fi-E=xo2ePkpkG zY#5u8b%jii-?V~fqwgZeuTJzFv)_1t^1|=j8#xUOz{$OH%DqGQd;u4{=WG18ANqg% z`0?XgAk6>!|9`DbTkK&}ymUS(N6PR5l6Xzcc*@Zxnr3rC$hb=s8wCjgdTj!J%Bomy z!d&HETWjI63aqY?tV;ISDBXjlNtx>TE`c3(iU8h#?4I>|_WJsIsYV&PC?Yr#$A6h= ztJlA`GnwnDi_4T%P_N|by5^C_x%R9-G`Zg${@yVt!clx0O`Q~pwYefDNw z=PQ)b=j)ZS&(d#yb$xk%z2(1u@O{BcZYoi@NK#hkls!Gg#JJ)4Ho5UcNuH$@OLlua zpUi`c$v-C^2kW8)`6w&Rx?|9mj=NSPK>ZGiK+6vte4 zOZfalV_>U!fynlr*Cz)b!d#ru6nVd}307DIM!+xzwQd(X36?Jz#U*f@6uju}IbwP- zxWbycTz9Ib$cdcs#MAFN{p}ocFVnM`XixAL4a>;QSxY3r;J}1)hZnYkG|IAAtT*%b zaCuc9g*{%JF*Fa^1ltJ|3)?4VT=V%!%v?BLUZ>bY7>(F(qa_*7=s!zKp>`9^4NbVAN2n;F=5X^<>n+KQIY{A& zl}Jw%XTfQVVxUIUkz}RTpg!UzH!>k5$;9L@4o76;NM77w>1M2+x?++VljQ^h#4JcRFV60dMQbT4$;*XHE>nB*~EGAw9G63!tTzr5kii6d5`R_5RduDp$!# z?$j0GVe#n;EopAc-WkKWM-Y^8naojJldDzso{Ng~IiqGmnJrbcZ7H>f1`^Wei^mXP zJaYjfQkrpJ;*mt0<9TWC5|EnV9wNnZ(b%_!J?cPAOYSGOWv0edlp;N(a>q7|S(M{T zXEX&$ljfRpCbL=VXSu5*iH#)A>OeZA!mhTu`kujxnSsVj5`vl%p`8weE=H&FSJZTvl)GcjLT=VF$2Bw?&Oph9K+O|ilFveDYR!Wiw zSv9BQy@zQ!>*jCJqK`=iU_+_fV$9-%sc$R9d^(h9{V@D#7?+z%l;YH%_R}#D(gbKI z##t=pJlKR*c+xahuvtQN7ahpLN!0P6O(P}RIepD21j|d7S`xiN^tPAkO;q#BM`b7@ zbLo7-_s3wBX}E)vPji%}Cb}#j{Y|7_HH+X#P@s&3QdXrw4RCo}2Z)n7+MNX?Ie=Q* zaVWi|C@aC-&(n0dSji&qqMub$AC26JS*B8>nxp(Bii5bAUnv$G`|?NYC2@)sc+V?( zgX7LEhD}nPDoD)aLf4o_GLGJ|9!gT*866)VY!@7Gpl><*TIdR5VyXV>gcxPxNKpXJjn$++CerC}s%jMVtdhXK zK$M0tv)CX~B<1|(K1!wmb!HLd;{>=M_34s;o|%(Ugpx1Y^1y7gNMmirn}~mvhDwhs zHL7&VpSF%a5f(+QUraLrm1bp=T}^~AH2+)nKHwo#rbbNdVcyvmuGH{{-L;Ua)$*pc zFm*1EwtTeTYYDk3nX`9Twrid#zmY9GQM8a|xy~aMTIQ;iN#V!~vvhR&D7XR(Tyc_= zjkY){S{#E{Q{6&K>8?v(4enl9`}g_#%;I`vVW1C>kW0L2mS*_m$OZQ(*N`ID*ohd) zI-YpzKO0WXT$L+r&ga@SM~SUkyf}76XpKKviOU`2qi9A;YYH^*sBBZ0>R&<1YL{W& zgK~p))gxQzBo7c186ev-DFGJ*UkXU|YR*|yg>sh|uN-+%g-|2rW@@}wR;1y&Xaldo zh>-$X72{HL-VD@a;>(U{_iCDlsHOHxhW}g$+l%r%&JoN#DC~GrmPpTUHV7|<@J0;i z#&hC9A8R*Pv0T{oS$-JE#l37lu$S#*fBsBt0 zzJk|Z47Ym|^V|Uf(mMsm>=h zM#mClHL<-}oV_ww4ah@T>kCn^Z7AKrDO*fu{Vzc?rqw|-`)U&)bQDDSKN^yoL1qi& z27SB5+jbdWi!~E0QeOB)q;h@C%*0Rjpdm;(_b%piK$$hLg08xF6E>_bKS-Um%{y4=E>`Oi@ArFjQJ|<@BS3cb zDrf##dB%EdtsSHYAWY}vXAZ=+-N2kb-N&u~rNNmEoSf{h@r5B>^6BZZp=4ZbI8Cw| zt5)-L14UyDnD!0*D~0FTP!^Of`>MQ{sB6MFP_Q`2%Sm`BSn)QVsCLctcCZdGnJC{9 z2pR)=NY|U$#KLRzKojv`fTn1SwjI)gAol88-8fM^p%=*$)Pk@Z^c8$wgO1|ePq~^% zVuR~`88*X~fLTH4nVIIq6w%Jn==d>*z?mdS9nhOk=#XCYDRnk=GlO3)-SAt;C*8e} zy97x`V(WfDaaC1L`J3ZT#A4!ri9`j}-C$u1L44&vh+SK{F)V+yO2&F#aT-=?6xx3O zgB|0pvAvSFLey70*R2O1Puzft%d0IyplTG=CnbPLMkHLL2E*UinSY+j-5(;AcMAnO zYw~{`Z3}6u%w6)a&7lHDZ5qco)e?*#D8n*}a)ILlL)!xFecD5%Nr{%q!NVw#0|z?; zkJ)5KSx(xO>MwS@2`6MG3U+J0#Nm z`%7R)X3d+FH06-g#ND(1e zQn*&&W}o3;Jtm)gMDOE63qSS=E9&U*MXx(o+_Tl(->B7HMW7!D%l=_C0sYvdhQ-tH zW&HFr;TS_6d7HiDdJ4|ML*zpiqK)1;>@cexbz-qYJ=DQfE#~C;do`5eQzzG( zcbq=KWYVc#$YIJ~Iaja={#8$*A}lwoG_8}LTrney2Gzm^H4m!n27(t(GDH)E6%u~i z`}!!gU%jNYTS-f$vJPSJfvei}`~Bu8rk%omwu#vjQ}v3Ja&NNK&U_uh2iKoSe?^>a{R_! z-pQ=+GzL^1J;OSf?zoxh(~o$qgE^KrhCDW4(i}->rODl92u@Pg1f@%q9sqaNBbNr%@`pV0)Ms1;Buiz!C`}WlN^M{@s@Mw;WpZ9W z1giY7(av`28)AXk!s_c{D1J%JQwL*-!Avt9Ix>_kiqC|ti4?(#Wj3i-bw7qThZLGO<7Wuf zP^Kx>37~@S{_q^G)(1V^1AOh5h#xEb0&MdRy`r<+`IJ_>IVT#iMl!+RwA5AE_|)9( zf;k6fE_9z2Tn>$n9jlYw*>Hlrlk>PA41MhDaaepz2Mpu?Bn20d?R}HsCJs?^;0sXx z`L^BF?d|*aDcbcl{3TTOMyrSmfP&eu&DrdJxN!J1rK54f`93A^*&ms*^`Va#4zI1k z*Pcz9V*;u?^p)^-^>{|9;Z*M}#xx2KLykuE0VDyvMELlr-7cTZUzu4haG9 z$+%D?-7yo(2@6a`<*^|=#KnS3Id=U$D4d)soAb+b4qEJ3W%|0@d~pJct)4BWXhSQm z4AyFwwDwX3M>3LZPZ@97>W(*BpZoK+U*!)k)&j0~I50o1f;<3SsGTDN$uMhH!u3k9 zr<$Rx?hBfCKHpTSGRTT(A0F>p5sZV`6vuo0NWyI7R!0~!;@YGg(x~;_ULj6(f3ig& z&9VFTWx05*n*VWD?$A5B#Z>(s+R500pSL%5=$8naF*LrZ@JyaB=~Pl*8rV~jCpdYpCgN6$3heU~*Z2`MlP)-k!p3YPh#$zO4uz{}RgBdZ3e zRM$%2M(JjS8PWJIxR9gGcNSZOu;{w;=SFf0q~|)7+VTfu8OL*Rdn4C*A6z5Sy&+ZH z2ptXa8q`7Du4@isKKj)#02f(C!;Yftf-oNulDZ?h%tK!{Qe00R`{{z3jg`HUa%0Y-g(4p$nLqo zNI`FkX!So#DU;@pA9WFdO;;uN*i}NcOFo;Ym{wQUsD65Wk=h zQ4>Fuk{x{pA7_2IIQ!o1XJOFX2Bj7=M5tbNF@ktOSf>Io;{I3;9YZ03zf5&by?R)o zSVyUeO#j~YTv6i@-VGAmP4@1pfw}B=*DZT#&2L$E_^1 zRe2I06xsfkInX>eBv6e(h6)ZaP#bL~#B&DtD}8ff2-*z`mRjystB(v=Yp#RQk7Ebc zb;uC%Dk7%WU)vJ#(MBJQfv0~_`e)xY6$;LkAgOIHXo$iRVIvHB5Y{lLDVolsAPUW% zMX`h2+5%75pdclO>D6U6u)QaSE?3HEQoP2W2sGV9Ub`PO5?^pazt=yZM4m{*#N^*C zEVh`JFEb?K8$zpyQKb#A{zcXPei{Y}0VNP?&T&%F(m?SXQ}g^Tp`h5a6joTo9KD6G zXso%~=VDk#^!liShbnwOYpX9m`?3i98|Lvp0Mn`eB>+wy4hJd zv%iM4bWh)4Y{Cq<(I0pRA6@OXq3EqTKgm)GXl0aUcKhgeK&Ql6N^A+xMDslW!a)o5 ztpra)DSx0A>?#!9C;^(#_-GDVz^X$e4lJQPKygc@m+s2Ta&nfgbQ~CF_WMs+I6ub# zIk%ZgyQ4@BPX2Tq5n#i(>6Qw^wl*z>f;}}_;{E^vLHt|sk39aW_qR#nQC2~g&_c=@PaQrRWmx*c%D zt|Sf{9i>0Y79)=HR33GWG!Be^EL*ENHF@1cS+8h9{l?V(DZEr>1|*V_W7CmzjX6(+ zQ7^m2pQFJMrOl>fSkvyijqPC5im@`>%{H6^WQZPJ0jHiI zVy{Kz-;QN6^eF?7JfE0T`iXMb2=tz#r4W`Nuzd%RGcka^N2_P`8~}^Gjv-_Y@zs6Mcp~s!MCujF=t?lf5$tdqkD3>XaEfL@huc z64i4tsn>~zO-Hq3Ri`vyoyVw+p~7rS$~2;!Oh#Q;VYEQruuSBTv z8!wTV+Bs1^LxS-=kd-3R6~5mMdYnnLoy*nth7)rRZ(9gz=aC*yCvQZkRz6;>2qV;n z5gYulK}($F!4$shrN6(whq0x;CQV}9mweQrp=ZU}ckKz%)PO?5xW@vJ5F|t}W~a;j z>L9Jtf2ndPZL#TR>(%;20e8+x`wm(HS=Y*vuaBdOp5F5Nfcr5H7aMcQ6dW6kn{y)HGS;uPg5Z17t8A)X+aIiRPxQ#OJu%z&FIBgB5FU{~_{T%XAF z2`rGzP=WIO2o2<%b7l*SnfwqgcET%Uut5QXIVGOw9v|z$@$^On8R0M3Bw^^Yo`~R2 zIonAP)|Pr&Nb|CwhA1jBa7O01Ol$s$79_jwj`G=b!~VSL^csD~bcoaN2vE9xtQd+D zQO*>eiA|5lRIX?zCmSNoG%NsgVmDlMiw{EKM;JdQi37no3kCKm!`xbs55+KQcU5#> zzZ%bsXIs_i4#UxdVSsR5+E>+l66%*ydT532I(3sAlWt27QYpf)JvFmnWhu=Er%8 zRHU#9LXdkHjt8IcadEiXkTe8nht*%0tAl3lsS=PB;>xB7+6c(H!y?=!9p|_PhU}EJ zsfvd8#P@WRFME68QgqbJsofYNhqp`2?nk*H<=Ds1(_aM*it|j|azKwIU5PC;33glmR}dN6sg;y5ED+4g@jQE8~k<_~|R3`bkW3W#MWrWL+fYH;v|#udNOF@XL25sz$8U-p z)*IM*5@R(j$|r}B#-R-}OJDvA%)yH*dPnHDapKD*!2==GT*^xkz0y1{ujrAOjZaWo zIw3FB9k7==b`q6rOJyd5Y6K+{T$@)wmooWXEg4zyC=_8l} zYnSV(Ld*zh2C=z3L-v?c75s(hkPL;Z9XRDaw2Z1zi9$ilvo9T_%FMp>gfkma4Y5F@EPF^U4%tL*Xd@|= zCHr+Lakv1?WXfT*WIQCxx4hFI91rJOl1u)FG&?b#B`S*%Yd^t~IdGD~atwiPwiX2j zcqpnKrX(gPMmL!^K8+zrL}5ALaS6mXup}3j*Jqp>;@q-*mmRj+hf>K{`)LGR9>Vc%I$lx&VWHKt1 zrhV>0cMKM#MM`zVy)PQwwlP)HH>=h%d0Cy3l12QN>SO-f6-Z|KX&^a3%I18 z4pj=O*rhTyYnHWHu33Rk%FJi^MaW4${rRB7=mS@A!TL9ov6vMC*Qv4FtfDn%1#2>F zlJKseagXP7ij&!{+3@kC57^iQYnD}|D<tjVI=Do370Od{H`}tM6}BV%!#|ONj5JjA3XK&b^=ELmW-hzL0R8WDs`UF~UNs`ocD zn&5E?+`_78P`Be-=FDPl=$R_3%`{G*xdzk1BU#qldtUbXc<5GZ&zX1{b1>Ff02>W5 ztBT#=1@HNS=`TXVWlyF6<$z9jQ~9173d=Uh8)9}pa7H__8B1nzd4(ab7`>Ss&N@FD zq(L-Cz-}oT^;Wu+E3nM~QY#JHRnuya%WKd}e38p+kxM?ghOhX+u&80Z-=kT7a;@Ht zQF?2*Le}7Mh1Fg;DCFMOR-H=xo5KB+(>Y~}1(#4N2-lcKQG)gz1~X}`P6rdTXlczM z@wBwGlI?cqacxR90*M!#>%x+;j&zjT)l&>OJs9DW)D*z0dpD6}GJYHNW{s2B1|*}Cm^Zoo%V-U%HHj4mCL1vQ z4aA*M0z0s61Ky49PTZD&ifJ{PTWh3mxScCD{lBu?OD(;u7jm#k^!uW~7sE~G$@iqb zDb5w&&8b%O%E^9#d$gVv<~x9u>y^U{H@paQjIdAcnV@wybs*9ssrH?V==JbPOvM*p z!bE7C?5*s(TZH!mbmIa?=)wbOzby}$npaxbqv-ZrEbainuPV`z zdlE5Pif!7$4qArbFWoDT=XMm7EFzfh8Efa5|_o{c8F7$px5rWeStpnmFc!SSB-{t=qvRvLw|guPYge+ z{bu)~aJ;+A{c5bwi?7Z7>OIeED`2-38XbMk$yy*%*a>~>10Xx&My`@SliVEG|4Q1+h`i=_ZmF1feS3`Xc+3PO#hHmxilp(GlG*|V zb@pY-r~^rLOeXL_b%xQj0c3Ra9l)1$#v^1}Gh|i+L|!}i0AB#B-TdqyJjWYeVzOm* z_JtJ~EN*Sn`{$o+Zx5}x=F+nVyp}dicxKW~PG6(*6h=VvU+qh;YuRi*-E(Y3)55dt z{*>>#_1!)}f<|58J~myEK9BzZJV3+0o-VJ~xA70Jzh1s_7Q8|K#~T2q)Az)v<=F8W z_;gmyMLh0Z^zXVo-VYL{{|fFh3m^z18zfSSh#;d1r6PnVObUDajw&-qgwN9yUsHtO zDhJU)5N#zW3oXGR8sw=!3E~hkc0pz}zcwyU}iCVGCr#KhMJ@AU)naK)XuG9pD-3{&8X zrYIr)#tp-x${tu~gg!x(6*{1Rb&y;ggka}z$5n^q6W(q)~uO6ORY<1Mt81T34(O1 z@U6`?V!GTFz(f}Rz4r-3V}XzjECfA#4;Yrc_gPk;&%y#@G$DrbAc{v>4y+IfgyQ6j)@;**whn?0vH)kqmlN(0;uL`r8p?<^ zrQ>ptJIPR125E>Tm2`Fbu!uL-dCck*j;4Km|Rg(9~3FgM{2+ z6fARH@F*~hxf2zi`7n!?+^l_TWFe4Ds-ojisqzqFgfo+H$xO*9GYS{;5GRP5Ki(P3 zf>_3iP3+5`z53{QpIN3#@j=03XNA1}ClDB|4SJTE zd98`77%paPmSjp+ED3Dkb&LyFxgIq)jXlo=++-RO21asLtdpG5oR?f|pklPa)j4QJ zvUXYT)G;?x1tN)8x-JDJMXHwSo5SQE{&QYVDeEH&4Hv!Ec={Mc{`E9eUS5UUreG{x zNsIDiD;^1d{AEX6rMbfgxIBzE9g}OIcXUwtf8`?q82fuim(+A=W5~B} z51P}4T1e$^QknM^IjM{6S!#-70q^Hzq$!hO(-q!mvYL?cT`of`Jft1US!8~X>?ik( z*XPcx%g-JRmBTAYb5l-?%e5rtp5{7@DEvN@7<@kCGzKbh6eFAIg~=WJPoH`DOK!-* zLC&L2#qU8sV;81cMdH+{oSfZVPX*TDOw&SP4sylyQH$QR3a>8R+j&4cNW8$*RC3!0?XN^MV{n?6*{TOOmpG{{}?@tCp{4L&S(#lb-tA-2wt__ z!dhhB%a2$?tMGf`MOd%t)PTnLoP3U3s)rZAU&>`uYg|moEK&%t@dMfe!p@z?N#)6? zo!B2ijP!W(!ZkgKf@!o%)2qna>wzahp4>JHZZE`w@Ej?4WW+rJR~Xx>{$=U2{tls^ zX;tNu7jDbYOn8OC@{ngVYVZ}nIV}h-RDx+9(pbXln?|IHk2a!9C?-Im@?CicEV%}YnmMhPK6=)2Xa!(mULsvNMnBWNd`V@7dJhS_P;1;f&sQVD4Az^?0Q z5N^_JVni$ZO*$adlM7&wa+A(KKwA`ElOX*o$JY5{nt}ASC`>DyBYJ>?)^k%;)z1Mf z9lOrDFx~iHPb&U#*wYBdz=JxL!&f(Ljq1*{-n4z`cE^>$2R6xA-SeiE#h|_gmD45X zn22U!18^uL6FY9b@TnAN^mx_@_jqizSV;z9xqDYnC!aD%Do?K&j>3A-6JG_aQL6fq z*}Nz{0h*k!LV2rD`JpVm%4({QQ&MJM5ND@Klfy@Lj3_yNd-;rxuPVU+o|F&XN#s}+ z)Hmuy*RGlePKq$ur{ykK02X^KpPBS4GjiJDmJ=SBTi+ej?sU6x$a}r0H(Y^w@7EzO zu9f_To&UWkPh(6-Ro@)!m+M29+=|sV8z&fb8?tPjLA+MJX?a;o-EcN&UGsQc|AJ3N zp?<6JU1>0_%gjasgy)I?mWgxy?iO5JWe{nn%a>^k!aO(o%P25-WM#-=w=FrZ-jPwf znAqv{9O4^l2J!cv!;3rugzU1rpGF8PZeL@|hGrid%1rj{EaKk<4U1a3*%#5ZX-Vk5 zApF*~8ADb$?&WQ8q6j~;4+B3?FafrqbO)*wHs*x@qJ>zSC+Up9-(8JCfBW4jK>sWL zaWUfbShV!pf+oaM#Ji)>MQWdE+7@=?`9<>oU8dy&jz3L%t_^sC!y1tt_O5eF6T-xO8k!Jf zAmp482L)S?>YWR)BP!@V6&4IZx&bZu^9I&`bu}<6h;Gyse9*kIW3G_R)BV*T#fbc8fYhZM zVb)dX@^0Q8ab7YK2;dXuGM2J6)ef~x92^AHR?r1v6)#w8cYRGJczxAxLaXh~@OFSb zV50D6U_w5WGe0O6+QR}5c(A-48krU{Q7U6|Dh3)PjL{b^=5kUJpoH^3GV z0VUx@4}a>12QvJj1)dQ+cj%&cBUgd7JL>c1Fn-Q~fT(!b7vJId^}t!P7(_2~(Hu#n<744F8O=QLjs6e#Epf_Dte z#`^X=CEyw_Cl95eF0|R-<%Jpt*nFC4dg<{ta6{A2ARkRhoamZgMWP!@GPke(fS8nt z(rGa>sEcrAcVR@7K>@P7zTio}%puG4d8FNbnAa#w^u|y}HRexrBkE8EYflS1!4})x zuqlwRL7&+U;No(PDWe|v#8ecT@Sf-Nyr%rMhO;|hBYh?6Ncn9QiA+#$>VQcogU8di z1^cvUVR9lWI&s;5E_i7&IYM!w5Tx9DZui1#_cGTJ#6N$ka4eynm7kiJ>n7;C; z&hRxF4-Ur)!Zhhyp8=#x8YYWXkoggd`BB^I)pcD~M{_;-O|J?nVjN;F7ZNT7w33`s zPEPq1SMkzgo;eaN3n^q@>p80(+eV1mUUBN3#O{bxSP>Zy6i&6YmEyEX?3lT=Q(pgq zQF^0AtNEV|e2U8}M$_#`9QO$vcbVQH(BY*PSa`*`R-Y*?_Y@akZAjD!?!g}Ta+oNs zbu6|;jL%VRo(T`X80}kHQN*{jA_5=j33Qvv=Mh-8WoNO;+4Sx4+Pc5fY}Zo3+hD?X zm8FpX;%n@wxlB^=1`7@bC^pF7uEXu_f7kNeW%{XT{rVdF8h5=m#r@lJdfS^CgW5w0 z@V4VW$M*FV>jd7NFR6aNJzOSY=v(`~oJ_wTKjk<5J$srKKAzg+)mQT%>OW;YEx#S7 z&KmcgiY+X^ljrumXTNYq?*~Btr+cvf{O5nl3C#by|1WKiH->B%)y?y{yFoV6Zo~Yr zVTK11X+ws5$T|KO7))b9M|M3#NTSgq89IXyQrG!0mHQ-5+Ajd%o$Lqx3;bfam_T)h z&jf@D2}D}sW>#j!W$o2hb%jsb%3^xn<(A<4{`{ipB1gc(%_>H-YI=W7d@SDI{Uv({ zm6L6izh36InZmy-9y8X{&fkvydT#fp=iBr1vG?m;;1{y@W^Vhk>kmthzlYb$Rx$(P zT%66^S1EI^KCkb~NV2kp&nUfmo7KRcT-L&PTFCtDD7@m~nUNHOD@m zwV0d9KEhcuI4G;fiJ7wMlNEJ$CXeg5Wou*aq#foAsB zN{7hU+T_Ebe}iCURq#rrAL97xp;vKNA zSx+stk`08m-A0f)!(=2+3s_5t>XtX;olC{*Ii;66SSzrlJyRf@0irAh@wCv}oH`hS ztKi47+0)gv#4x*c)1+wOi&|VZ3K%h#L1`*m1E}c|I~gFJNj63htm@|KZD{wAtcbluqI*=x%7*cF z@+f6@>eh?3>4y?pDk533&IM^snaSZlcD#T-FOjAI&oC*$gzxTS=AN$7L$Ie z^1&+u9RW0{BD$B#5q7ce14Q-|<-)L92E!0Dx0O+Bt`>ybpFGxv7|M;LHD()UnTU9t z{TXhup>+frNeu4*fkKKWebQ36Ya>yueE=-0Y=kJ8b6|e%wt#hH-o1o~wP2omeVA0< zchd-pkErtriVwWqe}56s?sqJ{#vHRhgG$Ut^GwCPZ?YJ=avUl!PE4kK^gvBHljUkk z4z5(@sNSrr;BvzuOZGsuu36k*bubX!ShgCfV^nGw7CX!Uv5}Cv>91RCBRHST0={CD zh#`{y=~sr*>u?JO9Q3bq-ML?!hPq4c+8Xael4J#X@_ia^Qvz0&&>cF{K~|Zu$!$5( z8ljI=FF>FaLCxtQT73$xaf;khkx~|eUo*2c6{EsPk*9XPi!Ajj!Bv#~sidyE3IGm! z`^z3uajD|pxJ)#>tf5i$m)7qlTePWZ(v>TIPD#^omA+mx?1lLeTg_>oTvK1ORP&@8 z&7oDTWu&!70RU`Wc(Y}-mG=C2c`dgw3|`g&%S}&0K_YJZSEfl`DMiXUT|KhM?M4a= zl!j_DJ0>ZQ<+p`8EfB*EcTHDIg{~G*7?_r3C*V@vfuzGy;lIjI3qr=X1Tj$bPJWY5 z#r(ICD~3ot+}25s(s0a!lh%Tqlp-Ja%|xzx!fvCwtAO>mEpzkKFOq73`*A{h@>MA~ zj;^g%l;JC`$j2T-a)?O@Q+9ce88GU(Lhokr_R6N0C`T+m2a%hT@C$ zDqR6>a>uq3wFD`2yRU63~BBP>1cixbWd+LaoG`TulH(+9mal1k%yncEC zQ=oE*aZ5$2E&+=0d)QCC-UN`oa%Q@ckTl9jNU3I}TeQUJ2VN(9E+dVn7auJT%^oZ7 zTvoy4()7RrAEMovkP3nwQ6taHidt=6GFsU|vmVf-=fvo(tN83XIjl>rwPCDjp=)pb zCFgSBT&UGxo^ArOHgO6;iIZro(@AzT@wuT?(OIF-1!W+K!s%=+EZAGdlyB6kHn}Vf zsb99j6FoHOa&q@w&~n!*qSpKf?Qrh*z>MPJe_^~6+FPHDB_`<+wMWMSiY9$_PD9Q^ zNUd~=G}L-JvUhED9qU+ho{DI^6g6IjXzQih&>OzwKG=Eoq;Bu#msS_JAb1I~RUW(a z>x@C{C&pcZn=kX^&co11Nk(HzQ6?6rOL7nC12ueN111ncK>ENq&N45ik{;DobfF$g0U7zDPH{-OnB?>;+n}J zpK2v{m`ANk#;*{HT^AXfnA51d=!WBG*^CTJygtZz|FLb3Nw=g!R&;E1O!g;@N!f-1 z6+kDpn$=#<@m4jR;HQlLLk%@K?eqFD@?H$O#ggyupr7)ir>*QSI)<|qb~@un0cMOL*~91o{U2s9xvd8K=8hG^LB6((&={?hj6$6|9NzY z_y-K`K~l=3BRxYAk<*rAFSd(I6nSkx?>*B z7Dy&haG+}g2BZyfz#zGZ2iw57eFz5pzF-iJF^>M;ae;{Nef_8;3z|Z{aHJ-<-#Y zaL}*=pq#$2%wPzDKe#NC2B4lDA{mh zl#>90WSC&83V$_7P+`{xM2OS&rym{Cx!%@~+#^7MY0U5)Uk#*{ehGmvO<^JBKCXM5 z*eD9!l*O>h$wLyY_@Syxf(NA7k?IIR@4e{TKoPaMAo2FA0=6Mbk?(DtF9;c?cjN6~ z#e6uz(EKL^+n3^a$0x8kTd3G#I84Kktc{?WPr((XwdRlXN=&D&Am!TXkB#X{K9I&M zf_EL7+<6rKF8g>8Mip5N;bLwTzN`J^hcurJJ40b*5&_Gth?9i99rwv=kuEt4v`T~F z3D|<$?*}dD4#|_OgceX5yt|f;s#}r(_b8NCXOt633@e2Sz-Y+9&rAtyLGnkEp#Kpe3sqgy0x?hT1kxm~6`>6ZvAmz5|E|=ze>gFlzQ@>}>`-Za1UL+F) zRo;^zBtm?Z*y4+g(pVQqu>yyalt=^yw?^6IB8**!@&I}TQFvSDh0CvwnR{%+B_!mU z9SAne>&|3{dj=*L>(YeUhXtA?zV%HSAW?c@+POqz6D%>oG~HFk3Ph?PhVkXe{puH?z>`U@R9H5>gMC-!|i2vvQU$(R}o+!$gHS5mO}V74 zmQW1j7s!#u0X)K07_nM)pB8Yl7Pua5!YU0ELRVwodxX!S)Z5|XD1Ha3$Q|?>%%!}b zeP0!Ib+_qb1iTR_YLa->bluI@FEvZ`W{0KB((o<9E&Q#DY)ikJ`x=(Aq|8z7!ON=t z>rX=`Xnz(hkA%#(Jb}*xJpzt%La%9_2}hp4z^~uWclOthz%QcJPPxuy(Kzeg&i2md z&;i2|=ehIhSR_C96a;g@6yb*fNVWQgXjY z(wy76DHDxc(lBE*S&iLt(ItGwnSACSc{W-4vS$lGxN`t&57R#9Pz06CP7{6l!N+5W zRrVxLktSQP*_|)hj4h{5>cuLP?~rP}bcMQuwp24`pAS%|dpe&C30*cZDvJ@?ydP@- z2Tr$%NoCcsz=|^_gQ0yy%THD~ZiQyiJzSjUbua**Zv?U<2LE-sQ&nY5&;bE+?l6P#X@W9YgU}#IszS&0oUpUMTgKwl!SF!X&v5cc~}Ioup1e=pavo>+e4J4YhwYRj2;=J=LvV#=Lg^6La3wvQQt6?0uzVEM$B&y}1 z=8Sp{irUS;W)PO+SanpJ=(1!EqGQb@k1obq;b^*zP9%*!oGB&YY1JUKg=NAUS#6Vp z%6|u(wNzaN$T*Zo^E_(7<(94`Xg(tC7%t|%bmdJd6pkpSn00M-hWt(>;gGSpOG(V; z#TN%e=-TFH*B)i$8i4qV(tlQV(=c>DT_%m8GLAc2O}X|RbQLOn*khGJTv^2NWL7oh zK}@sCTDhLd)Z>Dg2eG9aaGC+z(A`6S(U_o5*A?N#Z>%!BjpF8Gck+n_ZO zWzbjyQeiN{RdNr-y7ZPzk2EJyDy>bb%ei#;y3eav9eX8Y*p-{|a4v|prC2UEz4Jr~EU_OaGMV5%hFF{#ab?J8rVUvk|1@wDR(j z{)5;PLh`#!TfeU+*KRl>;%^sp9@3c907=1&mHQCgsDWB48x2a|C>_0E{AX2SdibF^ zAX08&Gc&D1bmE3>X@p-c#Rf@-lB3kFoX?e$Fa5w9C6%0%obNZvHWF|}cCgwY$x$15 zhzdMp>}1Oac3hQT>^x(lTeF%hTZ;E<~bo8K5lR=j4T@gXFMsrh?Bl`B~YtK;t~4f=`f8v2SM92#HbcS zq4S88>yAl->+UoW=kWdkRN+awj*|<_ zM%D>qkEAx#WiDk-x$;KX`Hc&>Gd-2C%SPROmXM34L_*Z!L(rf*TrqAj^AOK@ONOeG z0aA78NjFiy0OR04N)?ZK#-l^#upV$eQ|srJurT0dQvpoy4G#$0^t*H_Cb_dnSp!Gc zOOkMSgo6&twzENzzuARkdGooRcVRn8%nj>KIqlDa=4dCSV@l1b$zC^--7CvJ9hSOm zIz$aqfY*7w9q=&zG;_5Z-FE zN6DLFMWv_xlFTM3kh=>m;&IK98DaGmXHCRfTXKoTe3*M~KRd;gfLOGl_GO4UrXGOg z7)2>3>-0y>5w%|P`q{B+h`ivBMJ zl`$7L^4(U$i4POJwYumIB(6m4Sn<3R6lt#FN#*rZwAU^mic@Opy|z$B8DsXytR>N; zKb6TRl9OB*;f!b3c_d2fHWR5ZTFta)Hm0>3AyY$VGwwyqTNs@{r?@Jy!klzt_ogu+ z`^N<_oiJa-lim`RH%Ky;Cai!EsjQq{@_LkkYFQ%DlbkDBM{IL4+S)kY352@h;c|6@ z%!bIsLr>XjHznrwT$foZ$4$%PhNP}uGdl;dTqM>RP0tn)IUR(ioEDGXHC64@KOCV_ zH0^~_u2&XCr6+NRm?~vk?x|@{qA3Rn($)2Te|9Wv7l7&=H%irDIr*sdP0ODykQ5WS z=w~D(^ChJU3Inlj>pCEtOA4Q_%GV?zwb<<>nW=!*k}iN_l{~OkxorN*6ZKXFv)&o z>%98c#$-{<^LAAa&GmnrE_`pbd!Y|}IQZMn13$dB+YR2H0o%NM_Y>T##aIq0{hqB# zL00o33bpXWQv!r8Yrs}BI?$AQFFAsHu{ z2yg;*w66iVdQ5H=pu*n>{EJSEtF`+_VaB$?jXEm9jT-<&0ag%UNbU1gR?bTw1ERCE zKnjluUJpDer-v^a(pS7>`YRu^3I- zu?*;;H>{IjvBWrcqXTKb|6(z~xq5dxD5krWBRQB*;|+u+S&U6bC;{go1_|#$)DxOV z4U{~4E?n_4ngtx}#Ss;8$nt!``Kf$y5Vm4)B4A$4P=nK0Ez2TVz|(6KhpQWH#|%;4 z|8*h?T2m(OQ9#+Ls0=IQGpoemZDj#~a`BxTkAj<5*sOPdpe*S3Q^=p;Ehrl$G)Ca< z-B|VmbJZa}g`7j>Ri}H5BKuJa?&+sOi*7)jZOw1~{c_OuxN2KrL`ug&t zB#e5vllY!Zx8SfU66~laXtdW|G@tdDl(YNDc+dQR=NA2@r-S%_7t8UpLb`;c@c^V= zM6@P)tLH2VNC~@5TSny3T)y^=Pei~UR*REyOLgU`bd{$Lb%p_u&i9UN-yhNgrlhhLZXTDJ?tJUr4fgTx%^jRv!f}=Z>@Z)po<4gd<$ZaBGPt zzLxSLtYVG=vIy*lj!rBL5b!QmD{WaCI_K|nP1M~|V<_2~-&dp{O5@+@Gk zR)DE04Q=w`_4z6*f4_le2>~N0o!@ZN zWEwsr@y;5=n;cfuE!N8l%d1V$IA?CSe(@VXfdnVq#>el1_)i1^@JM-s(#Nq4!QMje zR1Wbb!0LS|)fDjj$}6xC2Zmr`B!6?m9g)T7sm5t)1kX!K2?8f*wA?BRQ*H42^zSHs zu>QsX=Yjh-Rff{uIfzhdJ*63r5D3jXr*Z`9Lc7UP(K-+Ue<0$Axd`ele6#W ztV%L5_jhE4WGB(~7lswI+??++TkyB9t?5Hs>sx(BE&~}KnAS@Qfm*f;guYek@4$@#e<>Y-T=C zyB%M;md~sHC)oqTHx389a{u$e?#u3r114ffWaRGd_SW$0LjT9mcUwQ)k8=HWw?FR9 zgMibF*!2DL!5D$Poqva$``N8K`)k#(CshC+|skj|8#%;|2HP+ z|MUN!C2g-Gi9S~CtG{E*bJO=H`Hjuk7+DWABMveNI@9BjGe$9i*icEkCNr(^FwygISQC-OvG)=&+ znK}+uK}x(Ok?ahR1Y5}4wKg@!e85U04w<9ry^n<){YrfWIk1P_{usA+BpG-#8PaN? z*4W@so*IrG0*R!~&+zWF$&^Km^T!*}!$Gg7f0J?_>fYmVgXAt@MEPPeo7=6QoF?9L zpLFf4)9m_yE66E-X=AxNa*RcoGg5zNJiz1D(HF1IZ-{%8`WOXP4Z&?X6GUws#q)Dx zsDhx{h7C2^O(%wvR83xM;167I?>*pI z)r9I_w%LglG2ro~Sf%UeemHg1Gk!|JrFlC5?CeA;WDX$atyGQLR#M$58%FUjqNQJ5 zBEHpBh^*h5VqL>Liwbr4fY^MtmJnc?-{?+~-d?s@_+!Dtg(D`0a+z#m{6Z=b|!te2$k zCasN+#8wmL9q>V>FI&Q4OAZ~?&=XExf$qp(Vp{Bl>k;BM$TtOMTl(-_jIp9NFCDp| z@Stoz6-_qL&NAc0bQB0C`5#(NG7E{6tM|IeS!p-2iOpVz6*<6| z*aB&1FL4U@?6D|^Y7~b&Cw-^3bx!XKm^7X;PUCv?i~L_2IXB6S7WfZc@i79=Znq6t zXS8i-oT8go7~u`)6?AjxuFIDwngt^35bu>$Z0ODB7I1)=#qK9uqynI-RdiMM*V(wnx$U2SGZ)Xw~-?ppoJqP}}lt+QHaUfl2)S13_vOnKK8B4DR8MTucZ znBM&hr{FJkrEs1=6Ax)RTZwtPp2#Q>Lq@a$I(Tup@!e{y+XxBJ6=a)>>yC;F1}VRL zN=J<>x47+mq-)y*Ny4hmbBI&Lw&e*K+lCI2@|;4g(@L!UzRA7}Mg z>qpSmuHIcH_hk?JW_J6()=kX_`A5BH^6ZeO7&v~;4WRM<1h)Nr-c5?xw~5d0`S><~ z`K^EP472z{26vyY45zPgM(MQQFVdXd#p4UORY=qw&(6KYKDF0c&n{zVurz3dJ{#pLc8QfK4;5!1x4_Is~ zLQBO$I59^6_{J%$Mcu(&Yn9o$ER45`~(Yj%#aXTI3JI#vK zzT&s(81bjI=Mfftr_IWahsc!V9-I{?mXH`xB=0YeLgaMK^j^D_QVpm|rN8h5UHM@e zrUI0sIaH;hyBbRIrVpqRz4ItV2sG=@3bc}1NS3mkD5TbJW?W+qD0_N3PzYf^C@@#m zR~OFmULh>Z&I zC?+MC7AABL6?upl3ocCRQi&8OGNG$+GX}&eOp#m(r3#AmrVZ)9-ZyE5tPC*SLBD8j zPH%{e_Rg;6EmR=k38Kwdqpma#d#~g!0uo3{JJ`0ag~S=TRFX0O~ZF&wFDacc&@(b{D(bqep)2Fv1 zeef&9=Uo+E z);si?m$yIq1^K5$H|u{oxc%op|M|~<{`3FA3=&WPeenOY|L?3Lj(&5$-RZ7}GZT~N z2Syxg+$^IxRIC9MT8kE~kVm3d|Iyh`V#@tk(;Xz?JrnESzt%E?=^R6XH9Oav(36kU?Z2errY8+Se$3JQ|nMm zAe(pnW9BG-Z!4^xekzZ=?mZgu_l+MX*E{Qb{hQ` zWX-sWEQwSy`O0W>qKiIy>Dt!Ag=dDot0vJ* zHl40SGHWH7HMFAh>5a2m9$r_fnRDWl2 x8|s+1Sz${CbNiM4so9~y$q7JjPb07 ziA)lX9uGWCRJuDS&DcQ_A#A*eG<5}2xbC2fBujka6+w>BP^Kz>WJ49+C)P=?aypZ2 zrC68Zi^eBi#|>Q^L?1HqB4xj$#F^^7UEsqa8*~@i=h#A*oKhQ#BL=aCvKC!YhJSYP zLH|!jMUYfL$zcc^OgT?ErP?Sd{YinyK2@|~W`v!?K8PtzHB3;JAPnRTY))#YR;BZP zU}nFeU=jp~mR>dtrw>wi?`8^~UQztcj3Glu091thu)bm%wT1 z$_9}>_A6^9!!G72lfHE?BhDMntwaP_FQ9BK5oz(3Hbmb_-m#YuXgY3QuR z8dqkWnC@_#Z{%(d@tlXoR#pxLL7AbsKxMN`k{^1Faxn~wh}2fk%#|)$MBQNI(iDYI z(sZ7xLL<*OuTmOFUP75_KF~w)i>jlvHIn{X1iJH-xi3IRP)oS5WS?;lra)D9n7>UG zO>I)OV%5!gmXU`*(I6AZQ17gPmrPQWYSOEEzV9!Nk!PexfOmv@?N%9;OQQ{U9WtLF zE8?e8>Z^23<m2fnE7V;YS<*?PVD#J&A?S$t3#I>omzEwIGeISvhar1p7!>IpF zvXk7~E{ew>3EG1DlGE*tnR$HlTB>xZAt?=hkz_f-g$aNMU3@tR^w&zzWS|Vr{Z!^ zhla~O1*W(1){9v98E!2tp%-r!%`X*aA*pC|S`T(GhPhx?!m@jszGf(J8#Z)_{pGY< zqUvVs6lJmSfIeBFM4QyBD|pO1#XFLoa5CpAlPsOqoN2BKMu>-tqXA~I6q6|h{5Qv5 z+*#SfUPV&K;|x4C|LK)!Y9WaSfv<12dn4!GdC4}cJ1<={{YB7iR3(wcv(n9EN%#l1 z<@e>S$UNLaF}HR6kF>&iQ8(*A`vY)uSgH^ZB8zfQ1lv;U6^u0e*+lc74EhC%4G$+s zzv_KOGfSpjKGxU3AX?u0s>dcq6>MkK>A6o5(Nb@@-96QaBEZf>nr5QO8;ap_3~LFO z@JSOj)B_>6EvtS#QI-gw_zG23`W_vM zDf>b|-Bl!}>K~*B+iND|#J%UzGjyZie`3ZzXrsW};lwE73@hp08ODOMWLho+?$5&# z4F$RUH`9Gv>8YrpbpxA?-B9X2O0A(4W=TnuVVhGMD=T?5+2UkNMc}nrq?jvZlh2AC zRdGwC9FV8CQDQ65+iEvDiC8F-+AeJ(f-SJq$Hc~^&?H<5;yJlEZDC8d=ZaKp=`k8q zwmhai$QB0y?NqYz+);dyo@a1ezS#sxj+rg1>c?EAE911*BGIjeJ)7jm0FCFP%9|-o zzUn;y`0Kkp=gq)@7)V%GJq0zxuMK2t^mr04S4laHj0GE=P+MJY7TMBj*UjXo2h?3R zR5)qa6-45nY|rWWwe}#h9upghU`|ODM))t<`t@)eRH}zRwJUP`(2$IcmXoRf7(io< zp!n6-SXjH&T7uv8aFk{jQ>$UIxjt9F7HMe!wbi{qdpb6YJh+l7kzgWH-s6OKO+LYraupc@bso&pOD z`{c@19~-7P8e0I3gkdRtlfG<{LIpiA`EnLh7`vcduR~z!XT9kI(K*|awl{FPyuPab zleqXVHY*_eUxtTTvjFR%j+hkbc3AVY@8enj8-=6o2M5g0p7BhVf3KfwQ#)5*g72Q+ zG@k#gUjf0|_tidTYEY7Zh251o#0DzCC;qS_dHUzjQ!ctouC1Jwj69{zt z z4wMZ!^>C4Tr;ukSvELFf+Ukp(V({BM+kP;d?D9cGto;pY2ND7k+|dRi5hGMWEgD8* zU3Pi;nl}<;7nuwobaaR>AR|D6<0rt4mqYmO5EsW_hzA9AGYDAU!8}^f`ywc0aUca^ zTQ(ShnzUl1q6W0oHF%&Js1JYxX!e87q3InpZt@P3G`^@ExPVB69Bdo{V{CZ&c%TQa z)Cna9=8u2@pWQ}0d@^tvLs#C0&txGIY@>{GZw8Av*kUnp96cNuHa#aVUEyY`GC&34 zqs1^tUN$}V22;UHPii5G3znJd6b&3mD09FB+3M2_db!{sZZr)&{nZ*ERMj`InolCN z402fwmcD#iL9!}f)#L^T+v85Q6&9XLn-cp%E%X5=knN*UX<10hfXQs2rGVuqGw-HM z;iye&-G3n!<35-Hglihjb(up7Ki5q{P-X_22DUg%p-3<(s@PZoypd5WI+U=&FDV!oB?w`HJqA<*f_*tiW$-|ncx(G|D`Y-45;Q`z9CT2K z18oC-FH#HEUgUvshYyaVuQ|XMa>fF@`MQcF47iwD;{*Ma5LEFor+W%29O(-wG~;97 zY+pT4bo6`X<^-Rw0J0G7*XH$1!dCzuA=y-c6~7{AAD&Nz3MLK2PiU#Yr3Aea4lV`s zLeMlTc-^h3VM_q0odb@e-V9(1q*lwB%@y<%2~ArVVsELpi}FztR?tLl>Rb9hr$^z< zhf=d4R)8U}6&CoQiOF8=1XH#@ffZf|T459N-9TuXyVO+-e;Ubso6t(Zns*0 zsR#Eo|3u)sHtx1^h-k6HN9bcm>f@p*f@NskVDAF3PYWTHp0kGDsXON85SW6^*OHf~ zk$m^?_jh}pmN>%Mxj0(b5}cDfWWw!-w=a1E{DQ)xLH^Oby3O1Y?9@Qx&Lj;8U;)kE zA`FcR^E@@pH*`f+5YYyP57z=c$+sJn@$SPP8*d4H;=p~wA^=%`ROJ8F6}j0ctbCXM zWddy=nK(1w2y$W)tI$7T{d|YZU?f_<_XTgSL9U}h{7A>@P;$T7(1ZmMMqhsJJHNOz zlp23aM@gRl8dW^s>NZUA)K%Yac?vZu4gAQYZ$#EV}Hac6TRm` zgn$$LxwTPvHn(80C>?TG_B6ahh<$5knV1mv-z+uO5AINdnYjJYBkZ24 zj@r>Dsw6^w{}p;$WhU#hC*GSRrmnk1O!D{?Rr75GW)UV|WeKN4+H~Msa>5~Lm-(X^ z$xWq9s}Ca0gHy!aDf?4LGxylK_g-^fb^Pc>eEI=p_*ZD1#W`lkY^%gizQG(yXHnZ;_O{pudZ zTB)XQyMQ6aA#FpuO*<}}gP1I*`{aXCLXg^tm)=59KL||~C{?5#ArTl3QUl>jn29*; z7#vu;Gu{GZeArJBB_Inih_+h{#as+UF#(KpvpvhhuPn<0LfyCUBLuKzrg|rP^%fd6 z=z5>a0G-OdUQP>ra@9#4)P{IHI4>L>WO0eN`S!x;@HIX4S7d%+iZJpZ=x}4K6(Nu^*bn*Ife5&ZY^< z0)VgK(R8!h$5n;=zh6=yN%qMo2QE>Oo6}*5LlLqA96!c8TP#Vu{0LGR=cw(FlYtRW z2Wl&**eHbO?kX^xOO4ck>nD)>A8WRD{rSJr7A!)9Kk*t+eGXem?Us%?qVxbmN|NQo zsi4ev05+0{dXx@Aqy50fY15}re!(Y|4Er2EoM8L%%uHh;0oOH4>1+FHEL1^_LFM$Z z$)%elOh;c3hK;ab#sfE2Ccn_W2RxoqRwGfIAi@^`p3qi zMmZoJQmUWgdh-Btxn{)hfo>*WNE~Qk!+>0CPZ$zv;&1JnE4kvF2>FQE8ZfVbz>w6ZlIncuzxIeg8Fo|5fv*Trg1{v`%Vb*7+KLk zbUcv)D${w2`Xw2u?WC$T&%urfk`K7@-aKF8Z%BS`!P(Jl2Nde+1sYH!r<*soS@+zB ztrPFr_7bGI(DUMIUL8(&svEn19f%-K0FTrbJDVS~7tB@HTa2#Wle~}0)gAY6IMD02 z+&+Kb@6FlP+&_XlW3xYRgi9T+;ujs{j|Lq+o-aq)nzc7}Z-B0oyobijR(SRFM56j6ZS%h zjaFIjVGg7DIGh=p!)wJU8e0<|wRzi5q$xTi^*~o$iRkszkgw4S$XoS;*?Lx^?jm?g zVmscy8{B<3_F+{IkQ(T(+u$_IwB;2=uwTh83d+UfYkm04jD$_o{Pq@Cp)Zc4Ew7m} zXFK-N{5*Fl)to#kXRm{tEQkbJ6LTjjh!Bl75jGa(N$6~R%Sw>55eRHOk-11gl-T|f z0T_*j6tyv&w$E+ablP@i^;TQEYBs@0dLE5JvOi*#WoVC$DTPejS)zxqEiODeN*rc| zqdG;xm0dIV`noJ8_NyIA18^Bsg)zp)*7`D(t_)SIQ~~7aLZUG2`i-GYeRBE@v?W0} zYn{vqLw~x#Z1V@liMq1>(nndMWU%$P1o();EIAWpt{LeY#T&3BD!_Y8{LV~Zy6bre zgbMZYdo?M-T3>7tTYeonj>?DKO~No&tFdnt?v%h%$>`Vb7^6ifl{*BjG0U`Gx#$Pa zG1p0Nt4UX0t;c?L)KGzpKK`ICmEgNG92}k%Cmtn(Vg^H5#Naoh{nKa3*M7aHyfaj>V zo6;JDugEGGM+a79pl0wc^5Ud&7w)NPqJ>k$!Z0$TW@w>Fg~%hLVMj=d;}yZ%k#EK5 zr5h1Cn8b^_%Ioy7-A+~L??HPwm`N%}WAmY~XH{smz${N4?lAr0Va2gfYmRcEM_RxG z9frY7vQ9jugh<@;P$gNh=vB#05Na?S6HaJf@qta<5u6mDfv02R80f-bht?TZUrjpa z6@fI%s;f?b!gHJyVv_g3fwye91O}QmW2Yql(X!Sh(u!+J3kqKnuU_oa)mo8oNKh?| zDbtJcRpZW zG5bXwrcia7h9i!n&NC`jY0?y&B~qoqqMNQ&{bkCbCBY(v`OlIpoIr+j8I1%-j?uqArVgrh11zq0>DE_$q=x7AKD_FZldG25gITPTJS-hz@qO? z{A+-)f0Uq7OG{|(zX+vj-dqPu(zcp{uieRhD>)!wZDqPz%|V{2CJ!J*EfqTpA5iIh zhi^063?5l&s}|xpMoVSWnO$cCp;%NhC8_SP8F8d(Hi=Rnns_@?iKwRS4&ZyMSm2Q=}lGmw4nWW^qHu zBb_#z0*TGmGCnUZSPJ~z zP?K`_wUVclpx)4e!XR$gW=C9>h8JmBcIXX(y95r;I@{E@_eeE;6pBux>R4d5Z%T3& zFr$tEM?ZV6o%F2W3YsjTUK$E)$y}O-D(ajbz}iG@ajX(YR)tLTHr-uRPOOuQ0xRZe zt2aoZSWMa^dfUC?q#vToZai1W)GRVVEr7ipVKcr0v$$Gw=`t_h-r%D!qusjFL;-XCuiyX6=rqA?vBt-t49oQ ztM?cdWn3xQ2xg6AOK%-iXSgE1q2Up=Hfi%qJ*9#%Y z)uNjs(HPIXhZMNVw5!9wZFH1#)Zw1C57Z_{X0 z223xlkFXZ0%XKCMYTzRo1u3Tb&0^U=(N{$O#Z0}XXQb?Jn`+lA&YWTsh7T>PQrjAC z?*pIw(pivzuJ_`YtQai<;|@EDhnpN1!f3pZ`v{1F46d)U*;|wdUjpatiPnh>L0Sk+0>@)BmH6Hb)ldoeE}Qi z?!)wG5mo((vsu(8n{UV}I3fugd15HF#pV*iVYX=1Qk1HcyzL-TwfUO@c1*95T)A+L zff{T&@NT^I8)T}F$;XgUoKYNf#TCkNDmNuG6-TZkFJvN5Mej^}16EMn=XF|KpT1V; z5k!q6?$cFtW|>D$U=wRC6SP*mctpsv^6XMRxsemvBsc7o?ztlkZpb>HvX>g}kDzhE z@IBrOMauMOVaqQE{9K*2cH6K!x`Y^JVpp{GZsLKZbK)p^yo9PaHw}84XP+M zV~$YPqJx1t{qS!W*L{ns3d7_H2KzL5r=@9mGQRs{R*z%XP7pn8CQSk`T`IK) z<&Smt$X@wz0_kwYBt0@(P`uUw^+fVeX*#=te&oYPfCx(MhD-h<5QNOh=~-eT4dWS( z`K56XX)d`{QzF>bOOI;~5qDyP3!m#(3sS`&010ZLSb&+iBZ{bv_2X7y1BCpF%1*)q zQ~`kF$u>>mPJzo_R^c>hFd<&0!4+avFhB8k%8|?`DV!27-nM{Mra0Wow70Q- zXw;Ip6A8W-#iw)N-fO;QSN~~Zg@W;9^)$s#A~8F^8>6?OIk*#Xi#&`;gVAfqWy)|f zauF_^=E z6_4mO2Paly#(te5c88^=IJmi(%QRa=^!}jhZAV=p4vOh(wnvY-Af~HuF6tjNQ(cxC z%NqrBZ5KQ2zuCN|F4ojkd1BF2V^Z%Gh3iAQkNNl@?bu>^zvaI4%AEXkwErCCzBrh^ ze@;5?VFsr5&3-*3#@^`D-y!qfG9A2Yr}aF}o~e%t!ixHW0ZvB*Axl%g9NN!bDSx+p zM{Vm5Z!R+01Z|@5BCghUg+W?51(25-ta)%#r@vG#oz7UlMxzFJ{OROj9Sz2;i7)S` z{9?!|fSm&UTeb``&V{{S#h~`RI^T|-b#%sfv*dI>hcul!G+F6}x-AAy$tpsR@8B!Dl1Zd*E>!&zBKF#~GQT%-$`?`r^Hj-EaOl}7 zDYb$X*CHPQU<(3JF4IKq!$v#afYPPAjOoa4CV3694r^(xtb*w#98_;2;HQ8XQ5wE; z2tuXDlW@cLdwtyd_dFc1MIcfyY)44<=m2NB|DG0=cc)t3 zDhU&dYR~cX2IIm9i@D}NEqcS@fYblv+~#s8=VuD;GM8F(ufNav@89SEUb@4I3CUd4 zoE$u~h&jY2X5xPQ04qtCEEeCt(RbFULu$Gta{tj6|1>|YysK&WS3ks17^&lTIOTE? zBGwa4wBo6+!T^;J|GcDKp&A8H2WH_j0S;-JmzS2s8p2s2%UET&*}#Fnsp%^tme@6V zsCg-KEd1E;7RJcODfL!PsHBIx^I!NlX8|{)2X-euti0E{;#@4Vu~<_3p19-=z2YSh z5Z(g{B~mctfIu*Z0^d>^TLf^Lxr{iR{%&n0`a!^RnG)tTGto|{_2#`49kJj9^2G9i z_m9Rk^Wy%XtxDY1Ntn{L^KSer|5I1^MLSrw5(EoA4=j>S4IB!GzjM}={=3}qvh}UK z?=1P(>hAZ6A-mgWU1-fmV_l+0U46+i0eR*0-9qlrU}`q5LiSgLH(xFn>sxB0IVeUWaz%5H z*eqbEz|nr1W0(BGBdHvNOSmL#UojyIZOctu2H_-f7Lgpx-ZH(1zRoWNh=EAWx=lG4 zN=EwxR`3DVi$ZFclk(Zq$1SuFHRi0st|JG){sx;LwSZVQhmfsD{PS0|%@}`@)~%8p zUf(yrYY2{#E-y%1;9Nc%`CRkdxWn|Guv%jW1R+GTx+zFA6F#m0cL8!P-W;+3O>9DF zBrs-Be-E8VFfRg!w(ja#x^~) z2VsV+9lUQ3W-L*e^_wf)QXj|{OR#lSL=G`EsFs1`Z{^D<{dZ0V4xH4KYwh4Y7P5no z?^w(bu|99LBDZf_US`MvYL%%i{KLuiB~}zl`|(Q-h{u;p1}-_uXi|Jpm;P_|!-*Q= z#4*UDys`+Vy)<{FkuN&xH44q6F3dk$7vIlL0ALaL4S0Pc`;OC5B>z>Ws0hs%JzJWP z;AAipdw3k@O=Ooi&@@Ock6ugg8AhfZLvU+qcz@ZM94l@J9!<5YDXzyIrODE(nQ z>*`&QXR;~I(P87NUv!Nx^4y2ee#5m7Q{XU|tG~1W>Ez&W)_bq1cmJ@6Iv=*%Hs=^b zI*?m1CW;{_DHxeC>|dx!He_eC>|h5eyc^5y(gUDMHL`4GGj3Ox(Dg z-MAfnedDyLlr;W7eFgf@fBy5I|NQ4a|M|~<{_~&z{Quo53W#6%|Mve`vVZV2T}Ery z^z^=r8Z&PwOe5*x0>=lj)5$KyQS`Z*4^3aC2Tuc|HmddCZrLHVEkYq;Vg%zTz+Ql5M)({BZ z#SAL3Z?4ZbO_n8{Ry*lNQUuBgjdmAj#)`~iG;!*uFq|`TYPMbh$Xa;wEFzVN+3UCH ztzXLSWGQJCdqm+oYn&BG9$qGKqCiknV2*A6-YsXbMxB5D)>rm8JYoMX(J=??94B{dyRgYGGWA`q_>EDRt;eaUJPRGqsB+=s4s?JZtfP_R~y!p`$42|6OOa!3KwuKAhm6N;bE{r9l>|g%E zQg8c*hc0Yoi3rYv2}b{mKC+2#$=;f2iyOt&0*o~WcZE}?dax+;ZL%quHy27AwaRM#kjUQJEU+pXv!%_x1AMM8j`a@2SqRnkl{r7q5R zlv#l02?ST;11`(i%ZO-Rv-9a_&ALxd?kC_Rvl~hT0<<}+6op)-8xDu-3)Td7u}ivg zbn?`XG+Y(^E*4wR;hi>)H$ED!O5+X>2U->%X>QStAl@p}py~6`D$+78mMg{tW~D< ztwzHohJayI`ckq}2YIz6+VV2947#>UkNYLul%o`NMMYHpJbrpz3@5sh;;Y2%Ntpu= zv>{;CB*ug!$H4$9F(**kRErSE8HqQzM&TZ^w=wI@mMp8~BTrX^DB8WSV_Qa|ISrMg zTfp)VT%~FQ{-;2fNKG=ClcBsA2fDi^EodIHcAY9Pd_Vy3fj30_gUkt#)p{Lp1_^U(!Y`!ql#AyV~;}3hjqWij%#2fB(x62h81K8iseu;a>|ZEcc8#P{(Ay_ zxT#bw)Zx=|#kt23Eo0s;9ir%!180y*`eVLBZt&rhXL=4VfElRsrCPAv>MH_s;ax~% z`hy)Vf2Wp_TA-8wpE)V_&Yz+Z3d+AolNPm{I&Zlp775)W%I8jsvVohA<*Ck~#MFru>Hzw#+e6 zD3Fm!Y8x2S9)oLIyu>+~fsWoY+jJ>0aY(If?ywEhq7sKnswMQpB&1+7YK;}EP7;x)dhc$iR({o+qOi-JGvwjwVUP)nI#WX4HX|_Dt{=AaR=W`DH7k!o^jN@3IEc zNW9k&HV~_-3?pk!N0mVle}-JlQm&EE2v5FKD2OU=WtyaN8p4mmTs#~-N|S_KSYtH7 z(s*pz2%`jrUC0Z`I(qIha#dYWN)PCc;=(7Q}!Guj7&P^)_fiL4jOqV zrP>&dZ8M;Vj#gvF@Rq(D4d@(1J&MhXOA718f!NF8G<5|+*OA&cb_pUkrQZim<6_|^ zC743=$G$)+lA|V>7}=a~2W)aArPK!DE4o=s$8J750%8BDQS?P%SSnwD20jWtlt;M~0xtF;kVh2011^A4Ah~9MFOt7m^ zXM|S+F~8IGDPw5|$MdSk00l!&&>gY4 z@XF(G^D&pMECkJNH5(KFd8H>s2-?6kUlxI|e-qP;y*?ub<>iZ<3(q?}mg$jOS-Av& z7T3Oj?&a^9L^u}_9v5HSnC8@#7FQKdn{LKY7tZZ^c7d1i7~bdkibKSeX>>1%g2Ha{ zwRNH6=oxKJTxG&A7Lm@!H+D zH;5c>S5I%qh0{5|MHdcKsg7MybcId*(IVsw4s-Hrp>(HvYY!AW|16cid5E;%!O3Of zgV#3_ID1bom5|XcfG*?K!^7<_f8I8-aL>#UE4H-j@+|O!a5lg8u)Gn~ayVLkvYj2Y zY%yMp-w*RVMGY-t+Mesn;%4R>a(yO=z!=?ap7#;s?z{iNWD2+kZK^?BQlJ! zDP*(QN+D3W=F9wFKRWkM-)vWYdZ>Ei?s)S*4Tl%6?p^(jikjLrkiTLENC>jWOT)}i zW~hm^5eZcziGS>6G{r&UuPkDNNRz$Xt5bRmBF`(*Xl~e1%Qu}UaF6;Gg-A+|>6c%N zuJP56Vsb(yO~cG7osGS&Y`z_)w;qQAEz35XAHo@Tcru;LYcXIfj{a?{!m8f@kebY) z+y>O0i(tO52;Tqd52FwF@{&)4jm3khML6=X5(;KXX_ULo3+=SYy%a(x`G;h_Ko z^f9do@eBHXUvsbMIrF~8n^ARC4lqJMoe>ORsX&Xqcc72-w;dQSSI@JD zByZ5w_pE0b+6}S2oG$A>zJQIEO5UtoEi7}{v;-p8IKFe+gMrq@p}RLwGgVVn&1=0e zL(3MY1}ozIe6lU*$MkZsQ+*fUt;%q5f5-nxPiHGei^=)=EAj3ME3-K9qoRbI{A;<3 zIz_$?jF!3^Gj!r0VGbX+d#jVv{}uL0CG-kE4rb|Oaj%T*Fb+PNk0>r~HoAKx)0Mtx zj@BKGW@#$<;G(q;84$G=MPrip8DlcZhv;8qK@wYJly8qe5T`pIzz=^`)b?7$^PJ99 z@EbKI@Sq|hS!i2=j1{!44svF_|9-yXY{t zb3{=BU~2(C|1&ZsFAD$;KZ2jv&Xgl~#%yLle;u_OM8cRSr%m3T>@*5MgdNC=pOeB^ z1&v&DUkd&bJ1uUMsoziZ9S=D>uOLT!U5B^rYjBhv6yV}M#LuqM&+73M8`nRwe^2z5 za}jTak#eh9k^aNCKxoK4Q4N&(qio9gxc`f@i(3+COK7~w8U%R6VPbgJKqWlr;Tphr z#cDBJ6SGpSO2b#_F~NPp;t2j%0Zy$E_wMzT!ht0VAjc-IU;Is&#Fug!G_-L=zq1`i zmi3LzYL8nTWadU~mX>_QmUHIpkLmbawT(oPLl~pD7V6Z&x^y+KT<5dNfARhAyU)Ni zZ|yCrU!g4(k}wIul}PjCWDH~J$AvL>erU5t+Ge)Mxyc4$tH#Wyg=L7LRv)>1D6KJM z`q2563vtZ|B8dCLBqX|xAYGVn9*l7pjPHP8Wlbn^v%m2d7G{ty_MV_|Ht3I` zNfPELaTP0rnvnD5Eh^=3ZJ$pZVP%}r9pf$?>9={C_z0o(@zwg#r=$aM{2mZW^U9FG z?fV`f73CG#e2s-Y&k6Y@UdL;(Emp{PK)w~hjug%HFtpSpRG=z9E_GqGh1&_qyT1om z>7^RXx3#5<@HEQWlIosutm?Z$B3pOtAI-=qjl@$dk7b0m7?Ke$LbV3@I9hr_eRC9k zlg46`Q=P8yI_0eGSj&}Imur-o1=b4b@!Np``!fZl=!aT!>W~nyXL&9eCxnrfd9Xs= z!NKPXIAN?ak0Jh`{N%*64|v_rL&H8sBXlW7&EB7rcZq5})SAr72+qNM{unXMafi}z zZHSV4>GZI{!MnfK`*+xg7~98QxE4#Yx$E)wg5m8L`NN)&s1OPD&t6=xoYT{L+)D<1FZh{l~n=r6{nJXEi%GPctAGND+@4zg%I*Gb3Kd@XD~zN@`P}Pt6o> zCpRXl^h4@5|FF~MqzvoX-()VpbN7tXO{u!+-`W$7;8Z1uzv2zw_YZoTJOsI6^gQbT z7$+P1ZiA_fk;C5@eStRGZ4s^`71zfw`dT29yX&x~+#K0ztKN&3861O)&c`*y`1L&l z%2!q!#oOx#&2MAPGym~2&pcWucphdr7F2JH;t?;OBK${t@^XC&loRh#uhlNGib^+B zKTmX@2&+MI+S)zXrcpN9yty~LW&M$VZRFe8d!BO!r+fH;ZjCwHVTZr+lAsg1XFt2h(7H1u9Hx+km7t^+jH-GtsT zdr9MDnRvNSpsdMICRZns?m(w5u!3VyA_~yld)DKtiRJ8yN@kqtkmpRwfReL#<&eKHD zr_>~`)(8c6l3AL=B0S;w&Oso%0I+pl;3<2d4`QMm<+ zE-dilUN=E##&*__-etAHJc^}gi!SY=<0J|NPbaK<+2IZ5?j;a1>&uex8cOA$kJ3tZN679#Dw7pI zR7-w`DqkfYej`q*pYhs5_MO_@#QXz~P*kJ*fBL-kpa1;lKmYm9fBy5I|NQ4a|DQpM z2;#T!zx{uv{Ga4in-f6#pLomh_APuq`J+*MEtq4I8&4BxlI2c&VBy3&7v zl;>LyJ14!fzP|CjKPSF*E8h9mdMUymgVEJjz4||H#-2rRuja7BADXq^kK-5^0#ua^ zYSl8Pc?~kj_;g<9!!qdMcfl1^YWfu}!GV=o(qUQ73d|q+Bwl zy0&}o;AH~xamiK{VCr=a=u1%qumc z_KL-L4ZLSf3zbEsddm%k=YZx6_Fo9bs?jpt;1!{h)XRnq@^^vR^(|pXlT8zL7L!n>bSiZUPVvgf83i|(Go7v@AVhDrF<`6?>RC&mED4>!GEAm!| zfmiZc#qmD$)zHO(%(KZlOWmIs!ds)E+)i{eb%j_izSg1cl~L$tj2hZX!+m;fL~O#= z9Y~Sa*21*IDY71#@(+?p&)f~jREyIsb>fjVe`(MY0UaZQQ)1*!A~m`T?$FM_N8C=R^)nxE_K+_J(T>D)m_tO-&i+ zc}RsgAx!)`p{Pie+p(&`qN=+kGSwZ8mANwLG?ZIS$S9%s#*!QktG(woMgFI*6=tcw z_eQUxk=!$fBEQz>t%_AoCq(na z%^l~6XC=JEP$*UJ1q(I%-5X08Am?%B7UT^{;qwHJ2`$B3c|p~aVrBk>>5BMvFfvDH zJhxn?=mk$}lR!z~Fr!$uO;2Tw zXPpwc%oDr^noLDhJ2*Iu993bD=)yk?v*kpw>HJBanlGwo1C0|5M`jl0N|V*leQ_!* zmD*_2hAnWUol!99_vDgp|D}^QnPxL-d->}$OAacy`6ct}J`=)Dh_)#yUuzds)00XA zPa93o&mN?EC?>9?IUOFS^p?@Hel<>)tzbcZA~OWtsMcs;xVGD_QX3Ceq0<&RNxbm= zTHJLCK%20Y2v<8pH|aC{ma z^-waP$8#~TCcw;EabI+52?)^tZLd@&GD^y+!jX=T0Hax&ChP_p#e{L!g1)B@|j9QAWQ)xZ`s_ zx|aHz{FzIfZpRfuf8iOQ_vqW&s^qFQbMI#LD#u=9>9dZ&z9_KMu&e>75u`ajDXjD{`{|QheYElZ*=iY0GU20`lJ4N&5R;Bl5=uI4NcWkb z7mj^i=tXFJKkgxd92d5F& zR^5ppycd&fs*xSnmn!Br1Yo)Z)wh4EGya{1uwQStpb|oOX$|H@yNRy-Gyk1Rd`aSm z-+r?V24mmDV1F=7Xb1p1M5I`!JRLJm2(@IA7?KsE(+g05xI;58(`m}PlaK26f!#wK z{T=FE#7^+xd`Z*)RwJrQ_Hvm8!y*jrr(hGcT=7DVu=R~xEkXXSBcTX2> zsUH167eW{xJXM(?U@T`!=#truBqt7~MG2=5iORRp+?o}T9F-m?Z;{wNUb-}=4 zq00D#*8mCzNtj}2yv`q!NGj7*-S2E{+sAEfel}krw941bO|#*-=sq`4H7cMQ<^;^k zdegZa`#@Ld+J%p%C*uSR(_K-&QP+>L7UnTzzsanZA@JX?ES6i%Dh3GOS&++>dC8wI zodg3Z!NAQJ0aw5}=5G%b!AV!({m~0R1Q}Eu{NXdT(JiMS`QS~j@-1oGG&4?YZh zqElNW2?w`elwZE&j|G8w9H94zYxpy~;KX-O=+X*Q^8M3#b5Xj}g#GV+ih6#fd9=x!j+v{)3_kTC-ceRbjfZJ3csW zsqYuMDRF~`o>Z(O%lmMCI=VK*9+1sf^+x^mmJcA=2CQx4S`zSyz!rXS^Uackmzh_G?7&8E$THn_}{E zz|yTD-~kB9yS&7jK%Rk^zI|2!w_gtAYdZoBy5YOBcDrB%o=p!7L&(LFTM)nq!4ws& zi;Q(gEM}_{)CjB=Sy(Z^CcMWq7;)$o5K&k}KnB)G<^a@)l6Z`t;p$Qn;z{|k@>f2$ z;8r-+!obZ|t-srkFuvH5Ay|+5Au~a`5@Uxxd3Ma-Qi`s#nq1p=n$@^}59(z>yHqmo zkL3h!PK>#KPoCP#&(2J7orSj_)>R4f7wlSvyq86J77rZnQ!N=67ZRzo9!m3>6-u0_Zm^}MJr5qT`J z|G_G%7Wy}vm}O=aC6|Hd9J-$$5ylo9m1St9uoSLtMBFUe6O81C6xUW3L}>kA1$Y+G zAU;Ndz=g% z5I?{F&HuWSc6g)c^bMXRo#tcd*BH{uNSj4X%6!Hm`WS`}e(VK=@_yB2>=3+(MZ?;rqTvdGota zh4Kn%sqy)P(Z}Gk=k-hC`#bjsy7^kQ#yLA3a!iJcYI7om^#+@DMwMQ2Uz??YrY)>Lopqu_^9gy~ToZ0Zwg~ID zP%1;yTGMJB65{gfm9&$`#<9E(1V0r^0`}wIKqcPOV_ODDTg=nP%}teKjUZH%~xVpTmYp)Ld7jT)aS*Vkg)^%%)RCa4aT~%w9sE zd@G%qw^4`QqjagP9suZ&q<;=vDi3wKt|*viM#6=lB$L3wR+9v~AJ@-uGs9xeE(X<+ zZR97{ui2AP&N@0qI}Y_v_@otW9z;mu;^iP1>$O%XCmr+#A$A`P(3*&D7DX3b;lC45hEvBo;;gQ6-# zIVtF(3YJKf4Ypbs(ixctRR=Tq09J6NvE(xqc~!jhTXB8QhG5neEevajFT$j0H3}KQ z3)(>!{h!fYInY@Nn-r_J>@VhiX$DPgWFdvOEfsW<>}iC{n{7;RZ7#X^Flb*EFri1Y zM!uI9jT;3vIvn#9Tk74e2Cudsa%9-R6i1LjlwMhx=yG_C)g@IX+y7N1?$)Bu?mLib zKJrRGYnXfv;u=`!l3T(VDeVZH&Y3~AsM$V_Xb0>rFo4mQyPTRp8+d?XNUzG%q5mxp zAPQ1oHcRA~<6W`|HZizq;nCzB=XX-Bkx4I^ZDBOilB`-LwZ=*PODSPPt?PS^{wkr` za_FIlhwP~Pz<|=ED4yUne~f^cyoK?O>d{-Z;eSb%rD+PXcea!rK&K*ckrr3YQ3Vkt zk-o3KZDGFZ-l`0+5zyfEUcnmK?`U#Ylf^M4SQcwCSff_cz7{NTa5+W@nK%+L-|R4&}f8--Q9QR-8$MDt@zcQMSdxW9vQ8qCB}BQhrZOcueUB~r+>o+cZ3 zHC4LcFquohQ=A71tfO%l@Y`!fy=E2=*f&IUlV?#|T4Zd7aD1-LBZ`iGRZ2;CnQW4| zDqffpb<+kFdZLM@TW?{6I;_hUvqXOkGm5V_+E>|;YP(nj0^)gQ?YCKsQx69*Q&YNT zDfFITiFA(Rg+fj&cBD?IIcd9jqv`vSKxB(#Os~l;piwaI@MbKX zJ&pHGd0dQ4E+{E`e`ZhJOFZ+b@41uT&}^m)J=-!`$l7uHS2l5fWSq(UIc4oL!6@Pd zN`UH3#F%9S{;{)-GDp&@tYR@~Vw}3tkCml~E+4+^{+>Ij(?6pXyfXTALh|K~UBZAl zyRntD$U3eh4xXs9)o6`mZZ87ur!1&MxIf3w>JMxPxvn;!sJ&P>0&&u)B+Lu8Ycxz> zkG+(iB-))-xsJPQ5wwRJm311W@(ECei>`oCZ`Yur%a%nfqem_T*@PkP%c7rxVfKDI zT!k+y?t1}~v!j1Dex!(F13vVOBa}%In+{LOo+o;o<|WJkl6(4Z?zEZMtIWiESs$NS z291x&6h`_BWvSdXt1)G? zCRIm(j?7>}%wI&Y*AAwyFpIm!BT-?TDuv8<3a(eCL0$mZElJIX1T5CuDPyw|ZSZv6 z=f(ypS8>hK6KjaV9L)Vn9rp_t_A-X-XPZfx;=>pDQxlU%pc3s6@;RC&f^zJWk70pw zqJd{EcZ+SBGL59u9N7Zr=ZWQoQ$zLH+CahyF9WvC!Q;K3D9ba+19OC=bX8@oj(~cL z(xKX4P|So{I9Biy$~scj`XWPG)ZHh4Ag!$H4`w(&xsvTBdX5ftu0k-QO+66n%apfK z`(aELR7*tU=n0T?O?ep;p^^CWu5Y1p-MM2cF%}A4GT@&M2C%y8y%|wx6RpsGEi3nC!e!*+scmX>zrNx4valEQ z4*ve`!Dy5EdWakyZSB!)EeCe;ti~+AKX2Z?H=tve;Xp8Q?p@JpJR|_2f3LD2(VK49 zq=&eOPdgJXJ|lj$c&q+H1XXFdxQD&oS(OjP6U}V?a`4{l(C zU4Nu5$K|}#!P8zj+VHwYgp?mB=adOb8u%;a0`?Z{87|pWWOcS;Tm| zXQkK$VEDi+F;7du+=C(s&m4o%CkGJ6Oh>SQium;rhCvQbkUtqm0zWI4HyuR68J9R8 zN9@a_MaW}|w0p4`NSSLLevF{#=dJDwl|%GdG5(b$i;X3<8YZIrEr4Wr8G~M$$A_dh zhk*l!L#j)k_vS}4^c}zI;=daG3|>(Yw`EDF>WZMsR7^QzF*Xb)kIE&pluIZpsfxh* z52~k9CuA<*$r0hO+o(b;-)+`}*Fl^bEuX`BaU}-rrb;CS52rZ)V7|!kiiH{~^3{&` znirz*qQ+B=1Sd`He0Sc!Z5uP_BOyJ=qs+6aqIAk4Bs zc~$U?I2tUSr?EW1R88qvQ|u<{vrE>7Zr2yg zsoavFNu>ai8FCD3wUIxa!HPfL7^Q`w?d%l*aeeX_HTL2*XIxJDi$%tqa>Z3~d5X4HkRjAux^- z*%a$`QjY-7T-YRkuHtaT4TvtCBpC}2Bkmb24t#QwdV(LO7JFnJ`mY*#gu-J{PZPC0T0J z=L}^~Gyn#8$34M5ck)H?#q+(3CcVXnx$p#>vU=C))xY}EN$xqi^f}_U z{Ugj@IZz4)BO4UKumFJ#;?{wn5#q-$hr2$QXb*!MrQ-Z|R6Q$ML|5^q;<7^qJ!7)kXOO!ZbKDXj%sbw?&gTKC8!W)uz)MNDbP!Jopn z2BR{8GPb<9Fq(*VNUhc!&T-G)9h_bBXaOA4qpqQ)IY*D$-zX@kdBES*RAtY|@f@6! z0;*<3?}RG+$`vNVLX=AntdsyPK1W%kNAT-10=Pqu9AffsRmE>WqJRFkWsxc7kgl-_1s9 z7Br|Jds~HxN_-cfjDKg8|GKCol`$5UONAgmBGirz)+h_a%^KPSW;H7`W%2CqozR3g zf_AG?@l2Y%%{^3TgehQ1Ek^7CK8ztn^V>3jJmd}FwyOJ`B>VF78!G_n{qQi(%sS}$ zzMQC~=$w$F^L$D&>#46C3!j_~nm>!-$gL`(SBpyKq$%MWJV;5cAMHG&tQ_K=L7iA7 zJAKI;C^m}l8vCT#R{zGvE3UAXSIV%|)hS<@6-P~0px|AHMG%^8qyN5+4JQyh9f-Sv z4U|@>{%FY9P&5W@xmm|9Cp39j1w8zoZ@$W0QZ8LqExiET-0Dk2K(`g9#_faVL}!v_ zL+%crbSC-&$^b#vDGyS?le%b4eKdL*erC{pT6* z_5(FHQ~7_fcMm+G0L_|!$F^+ounCH_f-_4)W#<*aO)6 z3#P?mi}{}p*Z&V70S5@6```IrOWGbq9D&Z;yv2Q#`gSr_q$a^BGFgNP1BYKgF`_O_ zB2|b-U9HYZjbm*93^Nh9HA1`Qjs9(bR0+j#jF!CU3kcsirdAOy=fYj}bxi~?qyXdk zW=h3f)!qO3S)Eq^P(i@Y_sO71HQ2`A*Bc#x43wodW+Y4h)|YV$FdcvrAKJpl^K{?U z6vTsuez0DL^E20Xw&!>9*8dCMYMZ#wwHYSra&Wu5*3Az7RjdJS7qZO1quKXzh7JmU zEHl1aiLK;_HU3*Ed17ugOf_EDm_iqyWja|Xd8ZD{gLsZ8`04ttZd_^?}Bp5PKciLejaEH-avA1Pb3t+0xTG<%*S^3Hfv4D3H zG1MJ(%XNP&_FYbEm@<7*ElN+lP@N2bbBTJ)rq!X4NqJi;E^L@dz*;*s+9PZ~57~{}r8KKRJZ+7+FhK^z z#(LC;UdO7GD&eM0Ru#~B6K=V}N@+kPArM*lF)@tK*s3hBQt!T8iu%e7vc)sNa(diV zj>fDoxj1-wd85x=pHLPIETn&j$#&9tT&l`aBE-v}5-{mmuxxXBjYh{Fey;D5sj!M! z8JA(`rh$traWQl_WQ7ZK;3|@arK%8pYqTk<0rMNx`0FG;h*h7bd3QASD_AF6J< zd1!Ku5cYQK#N$McOs9AyWhhO130m}Noaqy)b_rHS?rJ(ImR6d6ZP-7 z5H};oxEM(-DGc^R4?zmB(&QJm!~qSltAeTeIlHcunGI@?WHDJnLF_h-NXB5Nn1MtN?PS1y zT!5gA#aN*PkN|QyR%q(#h@cpLvAhyRa7;~70B4hHYrL|#{9myr{}HsAv17N z*HSSq`FO#AXed%tB%^hmd55xlZKd=4OhjzIP975J7leGm=@)hktX+%`w&vmF%*lT7 z1bn2l(uTeWX5)#)}$Y!eQ@N3`kAPL%9ur{$%g%%m8HelkaUc|Vs8?X_sKPit8s~jW?@9LxS`2I zks}+(Rl*964sjaIwHm0ConB!d6vJk148XZEbdrDby8`Vg4nHXeHm@OPmOuP~u5CgZ z(hQ&dJ@MZ;|NG0|1nBDCfzc!<%$lBXe(cj@A{|UyJ<%ZC$;Y}M1Ak&*3*tfpt(pGm z+dP|-3qb9C2-r*4Z9ySzIh^LX!KT%td1oJvwc5?_0XaiBHYOZ!aE-8U*suPdv2|lk zd#=p{Isoj`pqL|ZP9LHz3bGr|wv6!jw_rFY$>+*wyD#6TQ}7ssZP2X*YC4o39KL@1 z?OIy&u3ot7F54^ga9N-1xqR8G&pTn_5CG(Z;d~_2K5qUG($mU8B8!Wj>VixT{((lK zdp<9?e(i0!y`0x>3w!c7+i3gx)2REe>SNwt4@91RPpm_ei1`*qG~H;_>mC~(S&nN< zG9#XTj~Q)a*$N1MRS}Jq8R-f8@s2MhQ{9vO^}zOJjju2HE%fHo0>=-LM$vb^kJg@( zg7^Bn3Pv;<&tD(iK(sBk&+}&SE)zSrqn}GCU&wb`BmE|K@co*=R;suAEPRWd?VDa# zL%-!&@VStYmI{mz^ho-UCoC&^(=7qV%%0a`wu|k0yU89kZlV?pNhm{aMu&9*>LNWjQ6M zle-mKeW%mQe3!HJYI|>C=4N^q_sh$Bww)Ax!1wl}xBdAZ6@km0|7&1+aCW!rzfW({ z?eG0B(WHZCdMXm%lYXQr_df3bqff6}k^Ln@)O5 z{=+^Alzf{)%RVj&T2GAsfR>L=c!Kp{oUTOyMKVF`_av9jKrV#`b*zBkVpuMG>G5UJ zGY6TZgUFkn_Uc0ZGN*vsdMG1Y6qbgeaCfu`P{rkjqCztrjA>PzzHgbK*X?11h1b5% z7NC4}8*4qZ)EnUVf%DB0Fr^Ko%lToKW48q!i)PkZ8L!OE{jmd&+=+-7{@wUwKeZLa zZX5kepyocX4UM*58LVq^yr8QNUTKu{Vki2pvSxBgf;k-cAVV(K7woHZCUJMzU6R9c zGsI(vY-l(yfaS>F93k_FU2_QR2stgp{`{W#2rz~^l_qXDVK@&hh7iHJYOs}htwa-8 zdN(PMs|d$hkPp7M$XZN@4}&x5FOY9(UktDVkf$cnbW<)7B9tS!1_TbHNNxOQXCM|1 z*+6HcmXZD<@?TlMeS=-<0emx9Vfw6q%YwmW4mTR=Vfk9+k>`&KfC4ceu?eoHg**B{ z&0rVV9=Wl6XkxC&vx$K9XbQlgBSgi9D5#{=I}H4$Cjjx@;U2;@h%B9jIn>!U8xr!Q zA!v5hEAak5$O{pCSP*u+0wPw?E<0W$9f@Ow8o_8{Edj#Y0#64VeFdSXpIrex)z$6Xxu8ZnP5JXCyX{-!V#EOvHWqH z`oZ8o@IEUM)YD_3+d*8+9!Ashl*6=?y5U&{wTo8bbiU^ALUJutG#s#rB1#IZ5FKd9S2kdq%dMVxN(6NdIHL02INn3E zQY)bmU1a*M5kvjy_TXoLK->hOlKrjBTNnm#5@e!LXH?4|Txo}%yhZmLCDw+v#m@sA?0>u(U?@PU0Hwlvu~ott1;DR7+vx%BFxLy2pIBJ6)yrgB zn{OV;P}Pz`deWNaPvc3!GqG6O6SIr>fa-vUA7d4n4ORmq=C`$COM!?ovP0W2sOZ-{ z3Bi!_f;11jDUNV>Nzkn$9|Fgq)&OAkFjHLd^jTx6*2ATuq$^;XPmqa}Qq5k>y%MYt z+rfQ}0+1IY_>8qJ_WM8tX9VG;Pguo|gjfNmth@i7FT5etz34`zI~m#LjvpU07y1wl z&C8Q&WpDyj1t6@JD+`=bARHKGMn(35Luj9o(gx+X;SxlChG8%vCS!TioROmS#j1D{ z&VV{oFkALlEh+i593g5fEaMzZ49igWQ~NXD_W7Y_?id!YWhNMVPMl>z#{U#+tOE7W z6L6pSJKGW9TNmR*H-04*NH(5n>9tnV?rGrW6_9tqLY}cwem*GVxD=uU>W&8|3$p-9 zlN!^DXEpe_hCu&~YsFxrEeXpMikJ3?v>zW+(u&*50P(ofG9uhYcXB9$)QLl(@3M+= zF}WEqASUgkrIZ2| zfP}jPT)nF#BS8A&j5WG}|Dtb2FL&>Q(U+8)Y@6JOXjhGyon6cV=ZXnwL}i)GqSX#< z(H>iMPg|}P#px*xM9->vcOIvf>u4f84iNrCmu<|6`40C|mk+J`UBF({Kw#LOUV=VX zf-Jf8BeL`7%$v0E$EqK4B#|i!PW5bhrYH$u?G<{*wM_d1$%V5|JvttaK#XnLx`%A` z%R0IwyBHCTqIz-z(!tASu@Nn)O@8;d0PM%e<`_pji_YBN&e1dmm2ec@Lia4>imo_P zI%dqJ%X*WAKJ*o`t~b>PfjXE$h7m43_DQR>76$;}5HEa|`|RFyj77A1Hg=PZF!L|$ zj?Xm!4_hfyd5_UmnBv8(Be=H{kzq4M7DbE~cRvTHopI{=lP15TyZ0qMMUEE^=YX-Qa=Byx{Hhe@> zYy!|uHX;m+9?gNiv+C57FhJbdvxslY0q;ZSJ;A5Q5Z%&oC|)e!@OgsVG!RRUMt>lN4|7XQL|#J|@*xzY2Bcm}f;r5yO0+ zFkj@>Uh@dlxRe#*PMx}k2t+8y4*_xRz^S~-L`QhFm=TL9R%6#K?RP5cyLXnoyAbE( zKnfa*(?nC&*Gi?F<;5$a@-lUHZVvpNBM~R_h0XLOh7k1G>+`+WY(3}e>y|B-C+ZUR zMo<5wpHVGRHLzHVzZIOfUcMZB!qn7aWQ~_vrx}!-nN@CCwBNn9IuEh|!_O%Mp*#IX zq3i46Q5dzLXv3v$XVmCmK8T;BWZa6p?zoILavtu0U_?W7Z>^|UF zST=tc{%ZdNapLeeU%0=m_mP(+-Df~MfKx}!#8hw2$$FCaR0SlTu0{>+dH332cz3s?=`B*zL;A@^_u!!}{ zghm&a%fkbb_6LvE|B2uONkZB^y(%iRI@iNGh*1ftcXH)N& z&|tDNx*7}?zJ=BZFnUcEiJD6$Xve#Ha~mmxS$kOqsm}1=B0v6YfXl4K;2SP9f^y?9 zl#WM1)N;9iQ`8xRLs6XPl@XYVgz?ZtL!L#c;aFb2b0qA94XhdtBTRbY{seE?ENpS} zciIt*64y5(yaG%(f@Gk(*rdDAvLy^fSvtFG{T0^e9J#&vDX$Dxxl7??Zd332La@wI zsF7vmlFn8sEaUw$U)dGC9v6|?IMUqkqJ2I+9{|#&607w$GC12fh5GE+{H+V(muAE4 zTvXy{nfzvHU~zcu^q(qie`{X#dO|!(7U+$kMexhC3@Kv&8vL|&LM>lj^0{_>SkJ=h z{2qjZcY=3ve@c7s(b3!B+W>>r>bBp$O!o7y?{+_a=J{bU-{fsZf>%_e*1&j9dF!R>cp2v~vLQ7be111C_u70J9+MekqK&o+sl6SJ=K1zvV|JqU zj_M8F{=7XN&c^ZckLCS7{{CI@rL)paH!g-(TVYSN^J{9Dj{|-Y9Shpk?Y-Y0y;OM9 zzzB1!VaJYpKG5Op89S&$Ps99$!d=HRzPF&CF_xeELrqijNxg7aXHLy zJcp#Ni6h8=lnAIgrW|Ws1#Y_tgY*y&7SiYIP52e#u71B^2@y2b7OBpDjn@Vq9cez3 zc}c}l!iKM${mM27`Xx4}+S)nthI%hTB#RIPKto4fAZ$O%5z8v!wsfrVy)MN0d(<|B zFmyBtQ8@j45DdyIxRq8P(9?B<5RMiiP2mr_cntD{l1x*9CyD#OyImT|5*f*gc(W9y zr{1ep*=qQxs8+if@kGTA)B<6ZcRc!`UGn<7fyiiFS;8RG{nf*?g2hLku~-Ep?=g z#LvDdu!DM=XoN!Iy|=^RXV{P{?~T_)O=d}m%Jm0?)za%a{q@=EW*y1))p2)akp6_N zX2SgzQQA>1iMzpOW7;&^Bq?d86@7%DmcUSy=y2r>Ts=im`FJG^cr>2sI976O)if`B z+z_3BL}-*zZE2N1o@GoFu09sw>1A=)8!Axr71RTpb{I3kD!r1m#?%q5g--15+>^-{ zJ>gI3iyzTtCdH+uD%Y_F8Y-$_H0HMiWpgGrUH?$j3D;6pH?-wmjWkKxjbsH^#rG{} ze)D|Hi&*(_^Q*}AR-G|43{Un|5&!QavtgWY1&U&U;h5{O__FhNoJW@CL zDy6Mk+Drit%gGWAnk8X*XIbV`!O)8rTx6thp^F#%tWbx1He2J0O3VmRvAU@)l}lr; zf%1v|%gCdfYyb_|4qRnE-8JPA`e{`KT!1QL&C3c-hYD?--d83Mb}tp&pCXP8&Wfz0 zpMp+qNva1zLeYo5DOt7^+v-`$*G{AiGcP#uYok#%G5Rub0O>_{jC&T|DnalhtII+C z6`siK(Lwb=9n)7xC|J*l$$7qDKwe!{Bh%1+=O&iNjzE~o72!fVx+LIen-DhdunOIh zyH5Uwi68|=DFmvFQVR8lu{`4?p1t!kqHTl7t%hJc{@KHQ_o-iz8blFZ)m zba2n1B@BYykooxyunNd~%jFYqB00Lh&tgq#5e602R@_>wX|%$JAF7;Tj4MR9N;4uvgCIr%0fvhwh!r}37-5Oe`_$Y*T`tn&)lSZQgLOzkMD zA!~)H%X~CeC1P~B39g|CzF}3(Dyq&-s%m5VeJAS89-YvODsAox@Wka*ggrY^#TDM9 zzAMhP%!Md_FHZbg7(pw-n9n=#3w;_vh_V{x463^nroj~~;rvpg0}51|iBeG-Ki)AF zb2aXYsAn*}jFahO#?~bp(1lPb#H8Jp@7bcnCP;Pv)RuXzb8(Z`OqME^OhQE=?D|KA zrFRo}CLCm;LsDpxuRzkc!pf>rSI8S2jui$TW#$q_ur3c}a@oP-yQr(Y3y_bwmCsEz zn1WY&Q6mB^n1WjhXNDr?t{Ljdu~M49a)Mx=BX4YStS~-O6&bR}RiGczk+~+WvMP`L zEpmH^DdaL%D@p!erU2WIN$GW1hfb`ICZ_Aw^3 zbeqz!dWggC{V02CZFfuW+Wy9-o@+2$6gk|}q^18lr~0P(x|+Hg#*cQ+C0?9tb7#A| z8>%s^+^}OV#MP5X0XS)U{R+dQR1I&pY>|eD6u^6FR5=0trln znbRYx17Q6*y+Wtju9SE6*6Gdw}xg%?<5 zQ>Z2y56mWaetkuSEYmVjq*V111G`e(p^^*2Nvjm|us6U|kt}G^T3EM^3glv74R4by zy+NiAS2Ws`hQI+C-lax&^08dfIwn(NpU5hBInZ&10liAjEPX2dAgG(WQaX4U8VC<& z!7)&xrLniSa~bz9^iWkftQ66r?jiXoxGe;t*~SSwa(p{-ms#em`>A2gdI)Spo|$sA zz?BP|C8%)`<0Q-mUk$EUsOubpxl3Y%Hu(>vw-PQKU%*XyJ1E9H`?BHQ=HF5lWmOW{ z!=Ab(lPMMEK*)#fp85rbyY2BQ>Av0YFhBJgU2q>n=4)P$I)C$&(LD!rnmf^qliYjw zrY6g&h^aQF z%sFo$)m}SIqJ_xGB1;p&2yG{DYa7W^3_}`q5?3bQTAKB*Z0HU&Ez<}CP8$y{5qf~6 zv37(VJqBptwiQe`JwBf1ySXn+O!un~MHps{O_NCUuMYAOb*B=93Qi0A(Do z^#6j@=`5f{Y+AwvHp8x#VumQoloMunJg9cxV|}`F;xgjPev|qL^O4@9_&*v;LhT7? zk;d5Z86u|H(qT=!oH8A@cCKkD7nKDAoD7djcUb_8-$v& za^hS<@*~wl^Hl}PxS*KF#t1W6X5>-_XTNw0t7bU5G1v8zO*78eRl~WDf^>2&;bo+) zA5N=ScfDWRI7a!ZlBg2Ig@VH0b9XxAHeD0mG&#H5<5vq-ba2?;Zg>6)a0J!3iGJ<( z6X)TE48+0bb*K*%vF4eJkAAf;HnOpvo|4}s=Ny}HT#J5Py`{qneyyP-l69hfVDkHz z_}tY7rQLUf4}s-RD^NMQ>!U~ZX&#k*)jaiK5*5VzUAFweH+UdkDgow4i0@nlJK$r` z7_KMi*t_q62^bK4psf8rmAm_a(9@jpquSa1f=CkwQLp zfgns=+(wZD7uTnhs{`rEzA2qoD|$h>T$EJdMtZkW@msy-{Q!yWR{f`SQCENFv_u&8XiB!r|{cQ2`^#lBu~2oGnaYX}cFMr&wk#ODph z!|_S@$!zcm?b04-m)Y|u?3&i``B&rtD8)yK{h>5#hSh88y^&)wBpsNpW8t)yD1M() z7`%hd#bp&OHwHm5MRq3R1t2vFNcC9$0~Wp-3%gL=huTOK`3tPFD00TysN*c!aay0} zF|r12jeVsPr}mpyJU7-w@;ro$6yeIH-UHsER5Kg|whF z?C>GsphjXJr8`@hvmGLG&6JN6VbiO&Kul%ev>(z<>CuYT%Fw2pCMjxC^;yS$LhHFw za=8{`SsHR#`pfoVipLjxZg|y-cFC&+II11T1YJvJFk7E=%eN8=>Dvp4=0{3rb3Z;i|Ki2mp0f&S7cu}#(mHR3rS){D1bWz3PAE|53l!)6egl#=v-$iu($ycf>EY>IyJa9oGaY z30A+lLD^{IP%vt@7-ZM}nYu|N4b!YTL)k6^`S>?rq-6hq)ZTzi=b0}qXY(6Y#bPm4 zftKAzUh|Wg?Az1qjP}_AS`qD`+uGY2efvm@+k+Te!XX=~2mV@nJD;YDR2=yyMs3cm6Whyh*Jzk%I4^jhC6?YWP*Rl}V8= zX4G-~+TFLkLt6?TBH2YtEwn|Z>tyEwnUZ5hMX^OEii!EA=tUPZXy zB+wmvMAIs*QU^lX@Mk(;hkS1so;*)Qp~t{gWZhDsW(29MZI&zCQ^$ zLyC;FyA5QSd5pQsU^uv$d*aI=y<{J9=Igu$bdN5Mk#sLhF{%N3Mr^d5OI@PAm45wm z8L6D1%!WHBMj?fLmy)H~5lnfhw!XcE2)J&JMPynDMXa>qB$5T<8j6+iiWZ4R6w8?_ z76}#v1!m|Ubc_L>>SykLBnS8W>OnIl>n+1Y}0@+-d znhZt62cf|UiY)|{E4Jf-JE?+ed0}4{t&NQ8qV2Q~ zH_K(Ls4U#>3s4Qe=x#QglD&3vIND;UMS&9wG2zG_0}WHTB5F-!4zoxZ3b54n{B39z zn;vC}O27-fRhWYj>rlwj7$=OToZ~t~O;8$tk3Vnf;V`lsr0ZyR&z#r^I6!D@aL*Ky zW5gdz@0>ig#K}r_BpA*tsggItW{i|KZkj8AG4n|*0o0E8+nk!93Rkrne11I16@b{y z4v3R(IyFmuSQOBlg}!TQfN_~`nB{F-80=b!vgV-QL1C!Dumd(&|AN(_$s%9QH~JLg z@yuHQYfRoAJt6EqcvMDzsN4p|YUm0L9I9tRRdtqZ;L=>}m9RQJW>(Ty*Xaw0*T0mA zNMoXf;58jpoH6Qo3f^ zqL4XhH_wm;eTw566-xo!EW#Wb(_f;447jK@Zn6gzqfx2Gd}E<$c~@xB{|QFlxdCp1@|)bIu1PDV=V}lo9dv1=au$3`puib+)=+e)(He|hA77@59P;9d_rMc_ zkjVg}Uc)hOuV7c^Ci`>Z43M6lRgME~coA^GcM(5aTnE?EGC6E^wG+rXj62fR(lLBM zLTT+rQgebuutaR5C@xy6$5Cfcs#HKz+j7 zIn-_p97ILVwG)y=v>oPYWfMQ~+FYk`mZdNuYHz<(_m)Lv6Rth`RdXH#k~uTkw!e81 z@uFf*j#w3{4cdsg^j%>bVn?F-^>%MB(yB=9xcQgc;3 zwfA3WE(u$27r6%=7Hg+Jj8*5RMX#(s991t3dqc_>O*L6UX_0D;`XHo?tKP%HK9ql) zJsVQImbsI1T&iv$b^DU_TPFnir1>aZE@4VxE^9l8$xlp{WjLCI;DTy0hM+2FCPkT@ zoPHOgqqc5eFMQ9kl^3OJc#hcO8`vpA@Bd&AO=EU5hLKjjT1n!b^(*a+M8no?{~^_{7U;0jGPl= z5ee)3xoW3=E^BcN)Osdhd9iBDHhEoH9gG3(LTA0zW_hKX>om4}Uellu>4LM4Nk!n? zB2uUm5}tBcq-1p`-zi_v^*LM}aHnJ-s4)IZcC0L-k&P48weN{4aEYoAb(JRE6{lJ9 zdB8^0dP|2&JEpH(s$$<($fSzLG<+cYncBA{3vGi!M6_fU=$p*X1h!uTH{z&+#N}c{I+Ha>wU8M8Di(aW^@= zH!s+=P?e9rt+y3RZ~|slE{X~1?hw}*S3sAew~GUq=J67;y|!wgIaT0sb3+Jrg?$gp z;hOE-C~3QUd7LKQk8|*Lp->EalC}0bimo~i;x$V48M%A6MQN%zq9T3^g zos!a-QTVE2Q=qXi)TXT?R|pXsZ6(`a^YKr^bMZDW13irvGpk+(O2cE8_tJC-Yj}Pz zU~t0U(`MfX9kW+-79$ue&#Rr}+RD9$hU^sOtU$gOMjzAY?dx5+<1E-O5si10xfi;g zAgw{^NiuKr$E7b+wC1_}J!u1W-ogf<) z`ej>jLfhQ5T{jGwI|lEu?z6)Xmf4!SsEyAm_~wze*UM1AlWS#Lyixenp9kEeoWNA+ z<(DF6VEBcc>)0%MdQOGWgj>WVW+qHb+4DopzcrT4hG^9>)myY> z8+-)~dGVHLA4u~kTzk9(7TPm|A=<5E9Lpl~EG}2!Z#){%OAfmPU#iqzn&e)JCp!}8ZTq7=IH)<33XH(K?qljD%GHk^8qvQv{YbS6Ki$2^SV{p>|Kl_ak5rRvNG@| z6LORJl_gEz{uLOi3n!Py4+t*xHst1jxU9L}<+DZj8D9*zD>G24jrSiqrpI}A zoS*fh0fZda2o|V1N`iSB8f1G@7mTm~Zq+|0Qrtu=&qo@U`m5kdas+Us(>DrV6g0Y4 z_JU5`NuMySfBNwt~0Plom|WtOVk?M~06fzmq7@{$!UD`v)- zPfe0Cd6UZHdZ3);r0_`@CXi6&^TBSnaO7Edq<|>#^;4~2JQND+N-I`KzlMg%_g;4k zmBrM;x`O-S<2rzC8q}az>x3AIN@xijmnxf!neu;Sa51CF{^oC-5npOksL>Gc8puw} zg9J=$yhyaCrk59c?0aTnKklL&I^Z}sE<$Ic;@hC_@KP{5=8UbemC8_I>0S6i!lH%^ zYXmTmV%Hp@XqvfmUEu|I!Jvnk%$lCtP>TG;qWq)H8hJ=tXY}c|-u}0C@mbXk9?i8L zJ9UBn?G(^sJv~5Cv#z5fH?i!g$m$SFJWMsa5<2R&se%H-cyKBVNpg}B!DDRkOX3m* z42_=Q^zNn5w=((3*KaH>Ej>8!2*lW>VvHrj!#}utVM}a!wFAST&vxtHFF;!&ZIiKA zXPtm{3U|`T%3NG{Y>|7~^k*g4hJ)@7bC6v@pBg&R>343>5^=&2S@msL+TX^F{vpAx zs5xw^NS<~8JaT>YI(j#g-VaKSDwwc5aY88rb&n)Egk3YpkJeU);~rIlLK*XcatjH5<>K)WiXVj(+h$iU!8JObrGWo^~Lt5eS*c63Pg zXQ#CGLq|pj1Sj&WHIIp7;GcnO%esq8t6v}!VHsuv))Rw8h51oj#^bj|ZGi75ibv|Z zS#UPKSvWjY5GUP;(Jq3Sf@;_AZW6*yN#$wOR`fN-tC5e*H6B~5l&jCCO68tWqL#-T?1G>fKBCU=}!)ds*_S|E0FZ$3(PFWlYZ((lI zdV@Y}EUg+(`M^R|Yy^47F%?=_6dITjKB-iavyoF8z!A|``VSB2=Bgnv#&!thsRvq? zai1~pJ2H{VPMT0dsGVNU1iL~Gf+X*TfMpUSTFUTH>pAVl#V>Ywo9)&QAYLITfrTAkj{3X+3861IE8*IQuI7OUXyyaMuQ9kt zI>aQVkQ|}W!U)Wjgd;JLl7qGDY!t(#UMfE^eM!z}y!Psvgg}aIyqdh`FoEL);k#2J z1@djpu=a|oIT99UfYQfQ(x)2U>aS;|*)#(}B=2P3JiklpLvAd z9EBcV5(8a43v$IKew;=&p}`i0$04^O&1lrH*rAoQ$7W5KD9tAH{FDUIJq(CYRhAHf(#=5lq+o$3Ri_+FN#mxzQ5hfSUd zlq1qPy+fK<3E4c%;(UfqQi+BNUIwtE=R!ayhzcwQW$rK(HS@TK z2#GIxuqQ9_TXRav9bgh;j!AhekJt>b+Q@Be0N`FywWUz(;m9WcJYf&)2QrsOCGT6c6_w?0>Hg955;{Ecr!2H)AXr z0J8rrg|+1teWx@a!gDBv_JFZfFXOPgM)q`b3fMElnZVUzVu7}2rk)SUOT>g}dk*_=krH(=v^9tQH9H{3-arWSMCvk{|6uL%gR8~wzl7`RAx}O`i8`!JKHN<{ylp;= zi8>sYitDYsyia!e65#wn>-hz)9v$WTPd}Rc^Upv3{PWL0|NQgMKmYvm&;Mh7!2f6d zUu!!KMHJ!I*u2Et?bVLo>=YpIupa^s{H=t*k3=kn6Ye%Ty?qtd#$j;WwoSGFt*;mG z7sBdG+vh1m{Hgf5=BA=17n2T=BXWPtZ%WNo-Tk-XLY>vQDb(VRhw;OpNhxW8w|1wu zP(&)qI(pK1wf*Vp2s0sCh!T8}L~oC;{~$!D$6r1)`6co2+riiU&t{+B*mbDA@ZVRDtgro#mj=FMU_^S1QlW=QK4pO%?n3U z%H{Z@dIelw!HNPEBoPL-MdRiskV=ZU7+CX_aRG~|AlT$ev@zsfgBg}ciqH%yU~Q@e z?*^mR2LzVeGg&-zsulihwGP|jBAKa#Nu(LJ4pPkJW&Y`2jEAY@Es?8UqgUREl*sXMIiv}*ni8kL6tzK$WpRaMbEMHxaBN_nQr&BJ|HHf@cfYgOfhrFAX6b&tA$K%R^k%fIMIT3&5gy z#7wR0juS>}@LFu=wBNMos$La82jh|Mk9j(wDEWm#q~#_-ZUKlZfj;AL?NQY+>lHe! z5Dy~#mzza%3B3fl>+#T_-zYOAg)p)zu`J;=Z4i?LHd-o%C2u*v^%3ho98A+eRb(q# za#7Sa0c60Nq}7#Nr5|`r;SAYrfV_?dXv!nOQ=BaFZ5X5WzGI-*@t%iVLtzG?xZA+W zYzOC^kBQ-lv)#u;Fjp!i-{$}f9j^esw)9D^ROPq&k<~-mp%Hc{dSO*Ew6}u3NTvb2 z{WYD1_)TieISjiuE~~J6?jw%{jwuiJlTpjHFy9GDMM1lMZY$RTnUFeS5@7G>56Nb5`0Xgg_OH-r;kdHIP2ilEicBiChm&2D-= zX`Z;AWX#J{Z(>U?rGaM4bf&hdtu__W-0xTwSb?UMX3;@W~jwK)kZ=V6f)?6njCth)sTM&v%ui?z{RBb_8n4*rpdPirf3!*NzxvXulqX*tv#HMnA8?Rv%7&*1@>>V<=NB@)UI)0^ zgKPw}L?TB`j0OsbfjZ9SRlIi~a1v%xR9A>N><5BUni_9FS-PY?yKHFx61AtuVo=}V ztacgqUWA&DC6D(x@JDNoe<`S4O?6kUpIGv}aN1^}VqGw9*b2I15ktg?t{%DbmI$ON=v9X$= z-rc(VMmp(rlyUFPx?2D3D~XLb_&B=RzJHooxw-nxx%Y8;e9XD8?hfT=p6}+{&T!y2 zBVsPNT*PjDzSZ~w4u9$r{7-iw|NQgMKmYvm&;LzN2>+A+v!(4()=@`m&ns$fF5H{( zNs>k}>>EVZEm?b9R5TKP^P4M5qpC#pA?Yt%x={{QPM`%18^| zOXs(zdwIVebHIhBA__bbBS!RlK2A^H6e7rn@rPcAZ~6WFzkc4n8^3<|e}S8C^cz-& z6D0V1nf*Kt`_tUE`B}IB$Mdzpg1X46~m63|_o6JrA=?N$y0mnZp z(Y6KU@Be#>>0*K71dKd=uS#Z^1-L#0*)<5#OI_W;kRM|9ZA>%IfD=RqY9-(tcaMvk zrP0a67E=zU3nc(-hN6x=4}IcvfH*ZJ2jOqe?fCb7?+}dH66roL5E>W)qsb-}VO2&9 zU^+~OfHrfw>H!f(Hc8JTB6wWl(;$mwIvT7({SAX5)b&B~W}O9Ori#8)2>BV@%HR@& zt8hCY8tIL@OVVIS1{^#?Ih!0}C<%gj7-ES3s!mJ1{Ih@;o*dOjJPrjxL6LdfdQQyAxghoU5;fS+Ijqb^Y~2Gf*Z}U36;95lddUCx#LczKz#xWUgf+L`rM*6ccW8Mr*KM46RN)-*7*#W7|Bv5CR9CB0~bKPQ`w0{p&O6K$c4g0 z`MI79ML&4}1J=sGRk0+BM9o-Monk==J|z=GSueLsE;Q@xzVvX?V8PpZfKik2EB*B; zgkjcWNVJB`;(ZvZRb^yLVrW(EsFq17qGqy2xapqMI7P8}lL3H|mB%a9D z-W4AwB`va#t)!mHIXh0s2LU?lJ@Z&QA}sNoygPmp%!>rh=uCRXC4%y~8Y%ZugY0ru z9OgE;SKk2z%RIqS7gxc?3gpdRg*Ec1N_*HN`|PMxb@Sm52_a}W!TRZwvnr6Hs9%_R zY)-mtpPwZmU4+3gH-9%0I>b+(uJ2}ZHYP^Y@aDL9PrcI}G)Ter<5s1N5L6;*Wt_cd zFQ`T^WvVF=kpytC%E;{tMsg#yUNxF$3j3T$Lfd4E!rn&IYh@a-6++u9*~m28VOHo74U3N^QW2;cEGA9X_c8w9dQHasi_5;vr zsc?r5xb>FFRaVA6&)0Z-02$JuOf((u7>&<4M}=ooSSObQmoqr9u@w|A!rp34S?;rm z${erLJ1Z)k_qbA}1VnDyW1xi9V+_kCYR7riX^}vnx@VM@#O*fA&SL|6<|ztC4{N|G zO@&`cRAGXeT^F~@`SS|x_Iqy27xEeFu&u91%^)6e+gzsdilyk-RfA!pV5`Mil{lw)Fd9HAs;Qd2UgCPHjkB!~wQxkfhou9v-q<09T9qQA-0>l4N=aA5 zTBV6x9uF&qaBt=(mxD;hCWyFINBSEIHU=6U$W!jr~+K8@!a z(_6$?+5(R{$6}1a*^s|PM;17SDGq-TWh5#JVK(`jiS1Qt#3Q0My|mVu+OlS?BFj^z zr&@{NO?Ij*C>djZl>1l{0MQNMk#Z3Il)8!G{U%G$Id-QSH-?L})=f4?kd}b#-gya9 z!Is3jgQqV*HrqNVo|0m8fw#7IEpV&dP#^}l3PdKY1=WO~||GbiRerBR(IXyFD4O`O#FWFKk4Qo_D z)84bao6%HY`1KeF*P+Vd-+fM>CS!>y#ZR=rC+C8wKz%5ch2|giA+D2BBVCJV!}>Hz z1_Mq?QlT|D?cUD>a~dq`<&h)532L;gE`Kp-W8h9rDvBPRRRLri?;6`QYf1*2^xZ>@ z>HMi5cPEAw7MoS1w~Nr94g{(9o2)WIDbsT9dwvHV1OG8o+NuX%Qm$k-0c#dxK5z!6 zswtf{RWue8Z&nn-D12~b9!BDuyJFnr zKNrS|{xhwtx4jH(>&x3M*cPXib3*ZWq&DZpe~&*Q@NFM_KiI%@=6&vkR!Hm5d0`>X zM3!ad(uS6%#hfDea1hj&x#-d?Le*BI$~}(Vs@Z+~S?!TiLODEIlYdW*Nck0w|5%Hr zt$-Vu7`#QR$%(E;q@YHQW)@X`X7*U@Z^2p643N2;-|SZk&Sws$#$2bNn;FnYOHa36 zJtyPp3P?*=OE-%O>*z^R?6=;A0KYUolTTk$pI^c1($dlG8;DVh64B{n(;{YPUzj<3 zEXA~QD6ELCX2%o6*03px|1AYnLfF23rkH$4Mo`wG)gS5}_2F$RHGU&-!O*S)DBz*9HTcxI8&#vS4Y)*cguu}gmW z>8r4e3!n=MFc-zL5RVvu)h!5SKdDS5C}+R|(CtH$7u;44sTW;|z}BLzW-nqm5|JwP zH{D5$3av2#0`6pDOc*4fKxTPAd~n8mmCEGt>grSj4u(qgY3wE5qE-RwO&_9?9JbJA z`%NbjgaD}0qQEc;sa-bWNike&(c^&z0(Y)SG{`y(Wfw)#k!`#+c(z}j$|%$&Z!+>B zh7+jMtgW#hCLB#%ojAN4Ux^IExk>^G?%-NTxiWBURic2;>)VzbIP_{&Y9rq-)}%}U zpL4J5RU&WdjyrO%VMUD3Q!cJYiu58;wGr5wje72y4o*-bIah^oUQ*9GrZMgZvb2TC zP(xD}EG8yq+%dg9^nZv|GaQ5i{2uW#(tLRsc5fSmrjNnbxl zg-hKlfV7~MCQ=#}M8ZLr_SICNuUEF2YKdS!-7K#z&S-5O7T;DvKnyvRwDg(>Pf!}I zx972Ium!*%o`Y-jxjrwTWNSm-I9pgMDFG^2PoN5j+scCqFjTGt!2O~E2)j^02b~ zN)577!(e>&63a>nZ1EH1bG6&BXHG$0>4}R2F4#so9vPkQ=(A#iIK&#rFlk3m4vWWU zK@v7uUJr1{E(&N5C(o?|XbtE!ri>Cm7bmxw3M3G;DA+(W@WhLxVNoA2SziQiP%QNh zOW@)<)8PIv03^>%MWAn%Zq&bUngs%1%Taxp-o==DqB`=aIz>jwqDa(+GN4`=D+mnD z58N@g=`aH7hxMH&j(3l#>Tw*HTL;DW-adwJz?JnSi@%8}!xfX;m7gcu8#X8sDJ3QQWDM)#ppTQ??3&vU+r;j~1Zc<|pFJB}6 zq~+)Jx(CWe8RhVQ-8sGxMyWqlNoYe3ZkI$S261yk0)yE1HdVf{z$iyRJlPG)o&tz) zKETR5smi20n797`Y8e}B3eOG~Ys{$Gb==ay==WL-d2cV%McU>Zl%kdzq22eKxUM=J z;AP8|!|k9@AJ@5_AM#WWLJfq0R1bMgUD~((@P{O$V`g>QU=}PnwK0o|9jd5=P#tIq zCpEZ690o)n-X>JyUT}-SwoAKfQ4hr?s_Ce1)ObQsl|^4_%ozzcmKC_Fg`n%VT-W=W zd-*sVl(hhArQz=^QFm45Kh*`%H-#J`l`?2|4~3MzEFM~iOi+uC3^uid!pjKxz2n5u$_rM;d`v*IsXMM%w#IUQ|DL#*84?E}r0WoI{|CM*flz}Bn5 z#JK4n_$ZY7nDJ1A<4no^eGitAN*^u3Z+Flt#dThdew#)&9+Fu4ueCLBh;Q<`(9pms zsd2(a8;WS8R3WX}Ed{SEG`LMCW-eG&TPM*5FE)5BQFRSV8XxEAwcyBMm7avWAV6sW z)4x9i2eAexDMk@!(vbXn5YW-@3;`P4kq4$%IuQqz#yLs@b=!trG@Ux4GgxjI8a;z6 zO*5Ffh74{Ab;qLBX4`Am>9F4{v%xE&+iJ&EX47wuf}#)0fnzP7unS(OrBtwIttjV? zW$J1>Wz-5(8!`7Bv58-t zX*I0@U~JJVXZ%c0Gt1$)oX2mvqMmx5pMYsja|;5ZK-7X*?5q@b8J`#Nq0)X16xMA4 zRyltaHrjA+v?yUcM1qE&5~Sk43{Y^PMRp#u$aJBNA3qAr50C+G(tm^6~}$>v%W&Zz0{k$KBjH$HyY-^>fFYc(#!;>)qn#R=*$1 z_~9EqyPuKzfA{R=KmYm9fBy5I|NQ4a|M|~<{_~&zw?shy-}e7Gp^Ty4uG~&v|IJR% zN=ayughYlKUpoaFakEEK3s9k#L{&kA=~P{ZRuF_Wp$IB{vvt=0>x>g&@p` zxcISe^}d$>?A>i66%m&7WJkQ>*ZsW&F+n-1|7v{`_`jUaW%Jwrev|xt=l=os-r9Gq zwQ3c48=BkyE!NJty_z$j`OAxZXJfPT_x6Fu%9EHTjrXM7tn^DF?WTr_{W}i=3 z@isxsG;v9p8I2Wcip^Q8NK;ISyh;(8R6jz%@YOsVpJN7q)26<(BW=_>$1U3wzWFMq zIbjlxHsEa3zFeGnF)(IGZCp$!chK;bo(6jR(~)4LLv&;*#6sqY!eByXNXS{pA|_6W zk5G>Fd74az+T&T{Ny@QBEzRI-Ro-!?F?7XRvxaDots~)iF>$NKKe$0L;Nf)z1UNYn z;|=JA^*DE6tu@SMUxdFD%cYT7iWPCvk0T*7BAVg(yGbT6M00pd8LSS;I&AgPg>qbF`@On2koHS*;j~=?Uav29Zx!v08i-x(*eXE7$WEg3cy}JsR|RbY>~X4vcuJ zFPwmT%x#UFNPv{*cf)kLPLlj8OQjJ`Hi^6}wrqwTJ}dB0oucG|#_gao6hf(t95&%o zyDIY!d*`npk2wu98&?tlAWyfRb6}yQ%(UWFbZOCz#yCdNscjWin&r;; zLUcKuL_tliAg!FW1;7=yjC8R<4N-BYz$y}WXjH^Nu?kq3w!)Dx97Z{R4skvEknMT# zy~tL}nt`cprkbwQBQ04LNXc8z*PVtTSIAPXJwxA+Gz#rBquS?9nu}<_X z4-rxpQs7pJEk()9;Awp@v1TON3rMwA)W|4Q6;#YY-l8E(y=+_dT%_C$1VeSD;&Zod zt|FaCz6*oGhQhZ_R@Gz`Ai8niN=mA1g=(=lY}w+qHDaBzN3!mKdx_bfcx6{SVpTc* z#-IZ}+=Pj~m63(H`xLK39;St<{e&Nn!lNi;{L>gsAv0}A9%$eq6ho~wCWafK91SvMUt*pvfK0!N`Z9wjwVfSBK z9rq1l#;o$lX?W@)J_7@~*9u&S;5EaJRG#-5b4eKJZJ=q4AD-Sas)}`WR@@^(K74*j zod87(gOqixP~)ha0)|@raxs##50)Ymfp9%MoOV3Jtw|iB=`0~eMwU@#sFOf#`H4Ij zK5b?_>tTy^y29XX48?}9-dS<$3KQ!N2RoZ7rb2H4f_xMm+89&Hmdxb5#wl{ZysEz+ zxd&g&65ApIx(L9nxB{o_1Wb&Rp{{D3_Ths5B(vjSm)o0>Vyi@L3k6A5l0#BTopML& z);pLokM&w>&h^9Pj2*95<|1c8R%O(cj-W;<8y!AS69;CVgN>> zpOj$C!XJqLN8aF#;sUqa>IJi=bKgx!SwTX#?K$vV&DwH>w_C`}jZX3i(T*oo7D&EA zbaQ>XYnf9mRVkaTRZ1sOc7*un0VviHU(=vxWREiNFXbgVBn5OzvCZAYWm{L6IEQ(E zKbjMzv5bSQ8(*%M;#q7(Y{OHLT+0nPMg7yoL@OBfVGp&2&{hnM3eT?G*+i=r9cIpl zyZ4oX8c+Ab@*?sO&ZvxEOH>CFCTFZFF^e65v=5kpSjdp}OG=4uu+cA7Wm%oGF0G$f zqtOQ53|*{T!-h*}R;NVCq}yF8yzJ$%#H%S*UQOE>TK+}mrsenxKj}Q7Qc2nu$@8dr zbZA=(s0-PR%AwS7GM>`JwSgY?K2*9^Vs?cP0qdRG!AH@oyNKesvBFOq4i89 zX`91MTf72dXUp2cJ$$~;mCpDd)jBHag9~R65=tM4G=-p|GQM?>emdP;?UaA=H0mPw zBcQs)j;c0`etz52q+P7Xb%P0H3wtosR;2favLO!(nqTsp7-Qw#gmQ*EL@9aTiuv_2 zWOa}|yj%Rk)e2hl#%Yyzy#HxCc08xMdbXyVJwm6W%uKR!u44Q}*EoL``lH~boW|3M zB;E?*#>!2L?v=#)qmZ}?Ex^t2gAo@n$VuVchoC2odIvNp1@#XVv!#kN0EYL+i7jP~ zw=*n}KegkRyg-L{WWwj=e2VW|Tg;iOP9;zm;F+rxiD_<-uD43&k&KlkxgybLt(XQ{ z-NZcAhFswiKZoZ+_9~X-w%B?8n3Y=s8Moh;Q3`4-6H)b5tf9VPtWW0sOKHmC%$)VN zqzJnIiRIs0T;97N+sT_ge~+`~?~q^IhPhq;c9Qn(RN9-VV4mULy;r@3a=7owu8;sGPy;5SPmJH9)#* zgw3F*QD8g?P@ZI97MRXb^N}pX`$NQsq9pNfT(f9Ar1;h_aZtzCac!7{shNbscV&6V zI{`X2EGN>%12gSt;`e>(V(MU2d@qk_43tq!V*#W#jHJM79P6;MghZ%#&=iSB8|0sz zNx8FweGVr&XWZsJqiKa6qpAGgX$FIhCa@29U7AQ(KY0rYfWGXB5L^bd4K}m_k@G|K z@-!^#?n5)dKY+to-6&l4N8+)?@cJY|Xl8;y-$3uu@LV-5!QIw^T-G#P@U_fA zETWY>HjlX6jWARgf>b(PSsHL%nxz*mF|zFk7B!qO+Aw=-yn7r0H=z4mbs!x$#P(KX zn+9a7n}9}s4tDN%9$Wq1oi>;8cv^aVUS{d*EF4hh4Tu###sTP;fNW=g_EUg34g(jL z!H0>`V2mdtw=ci&jB{NkC!~N)BRt=bc}@l;XgR<7nzLC%Lt9L1Y^>lB}94Ph9v|u`4%byZ=lbd zL5Wp54Z^aZ26}=pV3kw84Ew#cp*?P&ZRU<}F!qBnnfZS{GR+##V;D+13`p=aS%>JO z+^`LD!Wqi32`~UekPm@&zK+#52g-v69b16uP=5FC)qVtT&;zn_s*Er3l?-p?!S!0JcR>xX~luKA!JOgaj@JqS&gzCcM^%8fmYTIedM5#{%TaNkkJ)!&t7_rh2U9%=26kZ??Nk|a-m>8|_9cYXL>Y#+Rs5BAURKstc9>n{EAy=S8T;A$ zb1PRTTDhT1Rn#hO=T61j{anAF{&h>$R(AF2SIlPL`Q3wIrFQB6iSX9>f8X4-_wW7s z5&Qp*{RL~i71p_mO26!K=-}x0f4v?&^vtf@L8tb6ea&j$(G}cR7ExR_an*AFe1fXJ zReKd(Dypie?oeG?l3pV-*{QlN)SFjT$;mHlR$n4*MODp4RaJxse1ZzKsfg-}qY3*p z{)-H?sp4wRpfem@2lv3#99LPPg}zYnfOKz92O8x_Qv(LcVuKVqk~J8unuSDuD;|Sl zY^RQZqe}%M_aH_RTd;qhubLbhe25uz4giMMbj6I|g?%7>G2Y(7zU)zuAXeC|V(H|F zpxj|O(r7>fbQ7bH8sh{8ZG(1_BDO%jCIvhvEQmc6fE~6?5SJiB@WhG~r!Fkw5nkf# zX>TFIV0Oez42XuZbO*TM6)jsQh5Z2kg z;#gFr8yh1vO=Kv1c%5ZB87y^@0<9P-x!g#nUq}#CjCSNQek_bg741c7E%ri5hPTF5 zin85_d?}O;P>VN@V+lHIO&6m? zp)IcjO>0}KOhM!T5PPmIjF8Db-HkYxo)A&*fQ5%NEutQu2Qtb`apR&NdDly;RbNr6 zrKR`K66c($E3(qs6iXq=b*_SBi=A3d>Gnxpi_=ukIyO1b=oF(Qbkwlx$}eM4$*@o$ zxF4xQU%xzNUY*LY^jXLv7jqTkq+g^km$S{fh#}=I_IW9F<0vy_tdVNGkyAe037MoR z!{vI+9r5cb3nF;H?y7T15;ZddNm0Q>7pD{HM~P_AK$jC{3%2|iW*ApOv?^D$I#;2p zl@uBr!u|)P%S4zl(-P!>ZITLPod{_2z-voT9I1Z`90*ezVPhykx)&%W){8y!iLt?W zuZ1Qpa%YleVR6Zt0(M^G{%o|;a;+Ii5@8>7f+t38B1wq#aLSa3nGFep6;)|#&VE6u zeZ$4xEPP4tChuBCd?rrm?xZb2`q-?Ai5ETTu}PA)lg2rZnM>A@;sf}E9YQL!!0Owh zBlC-}SW+%I!nVd(VU0$@yGrWSblc^T)={_VXOBb9k6=Le zg!$oIZI3QmEL(Hlm=+#X=W7lg;jYSs1rSl+L3a8FJX$E zJ~fKhAqfW^r@0Ia4+Vwyw)9l~SY=pylto#jRLY52rzB%%sKn@HVxFRwsw5P!T>jw` z3ifgf*&be;0>c8cmN!&OBm)zGcZD=LU$<&~ZfR<~m_3l@<0q(jrv}p|nBC=2!IF8A zk-xDFFb|VIWg{ac!o;4{TH!t{iJO#W`RLSn^6b06HliR7I4~1oaN*LR*P^4U3WaqZ zNl!nOXzPDIS5pE74b!U50Z4;dxlU4QU^caqSOslRnmZjBloMck0H&$Z=*2N@Fb7D@RUszxuGtbQFung%Kp~NQ%u!n+1*>h_>MqJF@<&nl?3IYBiufBCyP8 zfdfws)`@ch+mKhIr=q&WaO0$|N$aKfCfvc@WZ940+a~6>wMid6N*Jz~`QnY&4kTM+ z62|APHT>M8pbkP?TbJ@Z%q!i{T`^r%Z9T;!j>Lkl&3&9QM9TbcT!QJY)$Y&<>XCLmIAVSOJvAm`#7C9+MeW;rG?^Y zWZX--XzL8&jdSn;)J5aiJnSYl32I<|xq*VOeWRWwQWhfZ^5<9og{?(uEHnAR;)h2zE|z>a|Gk7sYr4Z+s0QN zS>{4F`-F^Av|uAfhPsR&|IPzwEPRDjl`W1ad&`RWoj8SBb$gueXE8h>z)nfKfp9q! zl?6+28;uE=JAw!r?`s|>^4GYJ#5Ir01?zquP9*n%fJWP`aGFOY#(G!f?g zh@#1mk2z{z!UqfhvLx{9|L8!a$#L{UQaBH+p7HLi}i8|gMeP(wH~7b-<_y!_yeGO9fK?5z~f_2SW<$;|qVS=8c*Y}QRvVJoGqWIiYIY$g(GQ+&$0 z%vgV(X4WQ=6v_=rhlz(A*(+|iEmMj75jrLpd2PYQjx|<3vo>H)y;@{Gf5n;blDNSq z1snZ`=VR!+{%_u2e15!2q1W@8_AR~Y*QI0b%HQ`?aWc00WN)zdJ-y0et5^EQ%Ixp= z%ML5WM)J#N_vEIwRgb%aDem-9G-h*fh1;w9;MD9%8vB_6-W{UXU2A81u$mh}xBpKb zv)cd%+3_GZd=6?{0H9T{4=RI3FotkGcxUhJ;LH1=Uw0qCpi7Ny5t(;=;KknRGlbf8 z?v%ktc(V%tYac{eAagE&m6E=380MZ{H^d9WG%IMn4Ke z#y>RE&@butyk4m+=#C^UPO*0;zJQTlYK(gOC$wgQGg(? zX&|;|6Dw|rx1?f=`e#}Ud$9*3!9B;N*rL;Am&;6{bTEZ{h!*su^x3VGzK#=Y|JMa z+q*8d3Y3P5O}%}qEm(U}LiW1v$3gRQgktsQ&tCaoir~JF{r1R$yWV7|&(jx`d0Gae zfw^~?>E*%HMaF;yCouvYderGgnD*m?zP_tEgozFhkwXu+QY3=oaKmx(?SO+_sW5M1 zR6Fb#b>#!Tqi`nW7E!NJ@agvf4h-DLgkI-iA&6ae9cHNt>RHIR&_twV@Q5B{F*tGn zRM5QOM$TLEzItoJZFa|J`R0Y)5#Hk^8k|`ek*Q2+F#V`~Lv2!SlzLQ{7h>kpGbl8Pvz6N!aj`sZl5Mh-5vT;;E zj!4NkgZM_wq?V`vXQ@$tIp2qS{?X73Y?2~$F2QEZ}kqeHu45db2p3Nj{aCqxFZAP7og zCZI(CMWgnsKU%RKreBdQ4s#(XAQVR=gf$T<2w^2Ya<#mq8j)*VKw}Aff-*+`@s%G3 zw^Wx8iD7TSMHECSo{^X$RzXWi z;DjX)vW+6cu#Z^Pc}bBB0vJO?L2Gd|}^_{Km_w*{eHTd|dn)^o}<=m8;f&N5VciFRk#m*+0eie{j5APgfs8fBp|I zU7K7P{eQm)3*KwD+dnfm|BgPk_|D8eR@gF=1zklQU;Qc#`-+$w0ect$Qs`H=!kLrN`Ki~g#=A3m#5b-?s z`rck|tln;mzeE$v8ceQLMbu5&Aq(L`tGjs@-&4DRSGxj<>AQJ zw5T{YyZBV4TA5ZpmW~bndb9m^y9<|ds;aazC;uLQ_w>iaO6^qr753Eo{XefR>dX86 z()xer{sML0;B&7QMNsSSWbOMLk8*pnlc`kyrd2-2tk?GZ{GlS{O;y>{RQc+(?A1Km zwNzAv{N+?z8S2EUuwtrNsy7vjbyS6!sK!*2R4tb)s;l_0TeEp)s;kDtYHhYnR@GJ0 z)mLUmP2At;zNw8gVyZ#&Sh7t)Z?%jCpiZZlnC_ZMIV{4{0%+fZCkC<9x#Gc;EqO<7 zB*t`^aG}SdHOJFN-@ydyMDG3L?c>pec)P z%jSv}$Q0Ru)nK5l%TUl*L>kU#;gw>GNoS4CP$ias@my9af8d6 z8#Vt;w{Q|cB!|^nlc6(|dNQRlN{L1OtCec%;F~i@twMUPU(# zH2I{VZH@YC11|8m7(E$Qph7TdA)SOfED&LOVnKtyy$f7r?>f@BXKm~d+PapBF8g48 z5-m3FGBNU`G95mG$j0)G{%)u&g|Ud1mp1rJX*5y9TskQe5yE7mM6Y>@e_T9TNNk>j#L=imi1S;H(ruqjeVP1d8R#1W5b zsp@5NY&G3{J-3jU{RLWKeZ2TB3z5GL%AiiT}^{7U9@p&7*^xY<+QSPib2yxeHRJ^~Bx43~BEr523$->yWAlsuT!Z*~#c@Vw^Q2>Edu_Uail&XE^O|FeQYwSiu1cCq7>)1y@-rO4B+^ zQm|+}67|xNSS$GtB006ZcpP_Vs6Fa`8W{PA*3Kc>$!d?e8lPW;oH=9IPfstBv z!VX(uy>OhqC184`q_Y*113|X?xRvGA5PkH-8`-L^y;0AC&3IZzQq@s@_7-#M4ZFCs zwPjrme`^pwpbF*A=x9M+{y;}C-eyDzP)*3^pJs;-fy}N`Ezv8)X3}$J4|v5{T;GeD zCO*}=M8+m--hg&BSuaGrqFyKamnl_BH>ec+|z*JYnB_-@q}qYaHt1OGdmqTh3Qv}6D{Kxd&BfxhIr#@K5e zF%Ia?*euYPuFmg zMmpI8V9m#XG#A^MZHiuKP0%;l0CI0Vn{eQtmwoeQg!C^hTENbXi-rzOEV6T0Z8&s9 zq0eJ$wC}@g1hjTe>_CWc5*)T>c_}~to?IF92bJh+jkNpnt4fvE&%>#uSjE%x2L>me z6i4h0Z+l};C%1Zb<5#6Jl{%X?;?6(t;S*vgu-oDIRSu|p2P!A#4=((a!>MU6YzX># z-{WUa_-0V60?`EruhalA4YP*OMaiZ{Xzqp^QzoE|bKU2(zIa_TJnkqNM`peanCz`J zU1X;l_`t+$YcFK?3;x+@e2J0M>ffx>`W_`Q&@P{MME9a~mu%l=1KZh^1-OpygQ_~W z^x!3eF5s-e5$9)b7rOew81OkAJ^6euDBNuKt}Bi&Q0uuAG#9%;#r1G4 z02KpTr8c%Ix(NB9W64@D0nMCe@7$oq<|2=RU!#~yk=m)js(jWuo6rITzcO)m9r6^@ zp#TS)qs<_U4uy0h>ZGs#uXfmW+&pCS*F@rR>^N->vDq8mv_9A~5^LNJ$||XDV7Yj_ zH(zh&WeC+rmpSF`E9Gb_&n2sZ&GJGdQ%$Sl@Hy)whQ~3KY!41Y7o54e=Ld|8OEe?z z3&&1NQo%z%gvU-Kb&%%H8kQ})qnF7;_nJs$>PTaMfEknh4L_sGk^s60nbJXrOz*Sf zGhN5WX}4$mw2W_3xL#kbxmf*s%pq4_W<0Z1i2|4n7GeruX4bFzWzC=1FmZCXQz@wP zF2uO8UE()llKi}*f1#ALU5IyS#x})U!X!;Q7PY^JVMVWTXaCI%UFHjCccNItjPIh) zW2XAV#)D$4+ImPSjdFX_{D>vKZ$Jy3cS~kn0^2_qf$W3#)PUVOaT5XBr)45O!_;m- zd8wzA1VY4E30~_+rL2lJCB>pttyPuMiWIJ;P^~o;(+ZRp!4w~S^6qSrwaC&hg}TDT ziXAtWY^gFh_q>7So1b|AsJx)eNnda-of>5VST> z2&E}?GW?tKJwr=vBy0eb{XdWV^$j_IUtL9#=jVbg_jrmJbzrwf?1`^uIboEmg*Sfw z1B%xcz-6Vt$AF-YQU=FQ(#hL0j{X96jy|2HU_RNg60wU58#cMj*a@?mYLGhs=~{DJ zF=1kBS;KHE?qMN~T3h@fCw3B0fN3zWgt8*oD@0eUSf0^jmV$VYqHv=u;#Y@sLSHhw z3_eM|hIYfl(FXDZdJ77$nAw3{#b$0san(x0Jt-o=p^i0-FSao5_^twi36PmRA!-za zz-;>hSIsaCx=Y3JDRe^md`IA07=VEu=1y2{9pr{~$2ZPr8~m~cC3Vi1mx3?c^JJS` zt~LS=#`9I;#x4+1mI*R3C7>zOYp$85e!2`8~kqIn#e!89q?3szMU=1f#UB9x&GWXaeoNZr6U< z69)!S%})tp5?&+&p@J9>E5{Hanb;ir_{@;x0KcCLQ-@Utl-*p zz*Hh0=-T+;5ak@d)Q}WeyeY7d89es{;K|6ap80H!u0f&;zSFrKGZ3hD(S`*O1}%rU z=zv9lm`y~i2|>U!p#m*(q1-IMWON&+tUEF!I!$p#AQiN_O`0D2>ktU4ghiBDE~G^k zN*)=(l4BKEORRcs`T4=U|H!zl;_Q@!KetA-%Et#W-*F`X7WUy9!4Yd41#m-G-C{zK zYi&vlq36&wsZX(FYRn^m75(2)bgTsaM8m&Pmwts4)IWo+i181hqM;pB3F|1cRO+Gj z2Z8vIV;p2L4oN{AzcCz#uRK1s5%wgIwQv^iN6nx=?Qw+pb$2sBl_-_~~)R3R+t zfCLtZkn@!V%;O9LzCUnw;0)@;#}Fd1pD$aRxU!1->jj*N!0&EJV2Dg~))6rt5k-a8I!2UB0#U+Ag6TqFpM<5ZA`e2IVEaGtNy$2!B! zZxiqZ&Auc8M>~d{o^Y<^T>8)_qX%7rV-9tq5mBl(hsEnz^ZDV*duj`*dx$^rLFzzt zj6rMcFOB;OO{>{1F0pRm4jbyJD<_DEqeZ+S{ELrYM10fm2Xy#yRyaC!IsG5rUIVb2EXg) zA0>X`4+xf9SMmQe|GWQR`CnT*9!DINk9%i{wfSZz^I{{L@WJjL7%9jgQ5HxD2)YSE zA%W(g<0+&^Ds3bRx&AQL*lv+30Yn-ilbuc8Q`B#Qc{2D<;8)1+-!D*9ORoMz%D)~ z#`kxte!oO4fcWp1!(sp1``7HJ@fYf^qtgqKB+S4+-TbR z_}?N$^Q=hk27bN(c^9~{Z^-w*z6S!*GfrcLHY>=@R1a%!^%Tm^7ct9XV{9 zhQf8E@o^U0TC1%;jlioA&-1^*`ha@d&9F|s3V!zeR$ge_5=M`LI zlM1{nfVO#L_oXvuFHGdj+;~bHdKmnAzso#LS>$fSJE-cft+HZCN+3;6?;GmKgF-58 zaQ=#Tfntj__niAUVVOZ;d0}l-+r#e#1B9+>-5iA*D!DweAPf#4mm^+_TO|uW4mT&- zZszuj$q;I00qS!sQFPc>HCn^c8W2Gf<8T@hJ^6!ji_nOf_>h8;RC2V^?uh`LAzSYC zMIwNfo~8>|D2*VwpZ^(HaVU0MMFU0J%n5`BQ0<}u2Br~gX!Vm&k)}Sir;wUJ^;0mA zG8VVEmEP#ct)j#G0zsvavXOjDSO-~`)^e+74>2O#Dc zQhfQcYaLh)u?ZR!omB}Vl@k=~iB4`K?=?!>J#@x4GdMsVe22KX`oz%5a?puyud8Wa z%nl%rWyb$(3^1FF1}^YyB?u^0{6f&4_5xF6pf!lkw%dfomg$g@r!Q+o5m$}0iqjhd zP#$usg0u~qV>D8ekCzzr89u|)0D#e_f+1sx&hvsG+^5%p$0R7Ft$Ix3bo>=l-dY-v z)?@OD7n|^^LIGOSoG}Rdv%#qKU5pMKt)3_zQrZb+!9p+amfTEnN}v)jUx7uC2(lj; z6T#&ZDI58#F^?d(dO$j&qA6CaX^e_P-$>8#eVOo08jYO`fIOO3-x51?Wzvg=XEH5D zKx;78kq?Ykgichcr9_x*IBJ|@z5~)su0nVWtO37B0Tr+258iz}DI|e?H}aN;lyA^Y zve1nN1O~`GP+LY+5ljq0V4rbe6zk$>`z$qb+&Nf+aWGe?HAxpb;`nM)E)zb0HaeLe zglvcrNzaJK#f#1{VweV_Mm6?XNGHtle?S3>4(3qENuFAV*0gC!fUF@bH&!}>0Mgc8cVp+Pb$ndGj zGr&VO<588OizSOtl#}pNcg9B=O0ka{GQ^yk96JlRS{1OEpTa_kToiCa3y*9)TSgFt zXcjkoGvQo#OsVmPAqWh|shz?23FdlVvA`~}WCbHfi1UDOI+1h01X7($25OUdLKQ}q z@*=&4Tn|w;pUVwnmfFn_DWdzzTcDDQC&IkPB4iP`qtho7fl7Grn(5TeihSYr#Bz`E zM%%GS!}FvDHSj-)c-<;Pyy~99(aO-7_h!~|M$5ibmls&GVM{X?(V!Rmq7PQLRO}m%0G=tf*9`7bnSoWqDOE&!N8bjEp;}VId@umCx;s}9e0_T)QSnq1rtH( zRB^3xKZm2RMj>2NIfDX0x`5Z(f3~I)y!QztLiR#|NX03uW~bp$Sae33g{b_7$LvZAoGQQ#sb%OIWk$eJ z?4@SNS{}^-bg;>dWsErxPGCO`+O$eSWIaFf7*OxjXdAt4ED3G>vF2$6we{;It@g_` zm!9t&ngPrO8d9~BNu=CZWf8xI*;dNC0r1ha=178Ywh-Yz_k>FczEG5xM4idBcBut5 z%(+cZ6G+^glwjd0CyMD5g=S8i-UL}vtAIRkvd(ln&JBn}NNvGkD;JSsp*7?PHBPF2 z$PInfd0J6=P$;^Sx}2a5hGOqC3D6|6SCEMPF&)+j!eV7;?dE7`35)~RioqK-WvIoZ z4IC#6L&FsTBwb4fMseiB5%LRd)OZLWg$4zUPUa{%2u1Y*nV`9kRHyM4$!HRRJ`GE(TCj#-P;Fb!4|~FGC+$(Q7C z3eJfB(q0ux7Qn{muij~yi-ouqxV7furTic4+f$4vP}i8@nK@(Iwr$(CZQHhO+qP}n zI%C`Hmp185@7gAR+MMTlWnZs%?`)GHaSv;Ny6Vg70(J(Yie{y9j{2eeYS{CkfXZNdHzSfpe040ZInGO$|W8I+3?86%EOm9h?WR}Py-m65fpXLfm|cFRJ+_u&&9lv z6NN2#1gwm*VCv!FwjpWf$|1ja!jJtW6x_v!m<&>HTo3Ws8!Ym<+%ZxYZ|=r!;09n9waqOYgx z`pMLECn-U%-S2i*<=5s8fUKUqJ=kkxs;Hpv+k?zw|KvBx#`g7#DX-z}+e_%Is#Od( z)c}A5lHsAxCmhSBv5P}+{|D8*La+^1%AS~&q`d!F>*qSG;}~pb!f8B(91wSaW*e09 z=ZH7)6^Mpj65t2i+HDud7d7=>UzfX&|J68dfy^EN&9nOm0EELE`4#83b>LMt9MM%6 zxR0Myz^#>M)F)=1kVNyOMr;Q@M6cJ)*`*AgDSH3t=75IW3#bV3Lo0&>Hy~(!Ka{m= zE*4y1JlEbKid2*XfY(3A%+oRKRm^^1?}Iz|2|HbSZpivD<*4yVX?qG)IHQza_SWKg zcD893B05VNHP=2VR_JyqE^b@ofRq!1?A1!``OEEZ{-&lleTZCjzla}g%H;-!7LQ0J z3c0;dH#*GNjvrMA*?lge&g{yo0P5i0dEQFOvM*=7(yu&uf07yQ7|@eU4QB+&C2qBz^XceA{; zjV&XT>==JHunb|DZWf@8jnIt&p(DK0QaunGSu;3-bd!PteKuzwm_l@?~|i}Bi$GgvaZ)SbR&hq zOg2)m&pfGLz|_P>;^@ex zrbdAtdUgn}O%V+#NN_FW7ZX+6{|taWl6ZGUZ=wy*3L?@8QxixEI;EICK~k+fo4*GW z9v#H(TUm9UbgCyXk9qTP__F@u!TcSCWuc`kI9fL;7-n1(uOUTooj=hr(AyVfkQ2qB zmy>=@@Ejapr?lb5X&^gFfYMY{yvr$B&V>RMzo@F#UWyd`0M|FFK2<$7S{ocDaL_e7hTK%b zfhmQLloX8e7Er%f!B-vP&u_pWlB-}}4)N^-Oq!T3ooFa7Uuy=7%BU>TVh^*ESVcWo z!7Z{7Ewv()!-Ak{862VVVet~B3{T)j8ErL-*2%&85;J5_K!yroSD@^IJkn^nt zcZZJvu1h@;rvWBXIc8gOygW=JZiO62smVWjx^}!3jW=nbAlzZBnBYL+bXhI{F5Gty zp?>7PNoeDoVl;2G!M!u*t)PX$cuAFcY#&DE7Y@8M3+aih3Z)$O)lJV_GdT9@WE3{< zq2k;yYR*LI0&GZ5zQ`!VFu6R=fxy|-p78ct+dajJLIk${%9IrPgs+=nCV`xH$uDsGj;qrC_8{y2mm)>j| zTtEPt=eTqazt9zFv`N=XydXd%aLOtLFH8akpI7?JUf#*=r1?=kb|%Q*n5C4o=ooAV zrR*T?XnKXDY71)XNTgXvX&%U0)9`khm_(o>jr;I+Ojd?QOCu!!o0u_1Ad!8gO^{^; zhG)g}YngvCVY#%xvUu}KX#=LvGYUODAhSVs*PG9-&%RHOY~K&cClMZCySkLWmTPke zp$kwd2BVs>55w8aPs7g=pQIBpl2TAtAJD0CEjyq+p8-Yd|JrvTZSU1o86z$B?r1IlcLzca})k}!LEF`{xKd@j2(C!hogZg9bUzoY}dif^!c@X z6@$^SarAR_Sg>4@C%dihb24!N8?7uyOVu{PebSh2=!tDKE^5~+1oJI4Ysq}+vk*&I zo1+ab0wXO5cxf07{PPt97TIMp$C<%n$CKVd@yiSgaV9|lcKZ%>72vlZv}{E}D#a|Q zpem5SeBK?O7HRPu!6+z2gfk@`R23FIZ$qZC$8`(wCPDIxQ;E?cOH?97s~kGjQhqH* zq^&-|vwVb%n zR93Nh^C*d2UFL=y2G&0jqe8Q@SmQ`csV7W#{J76Y%mTFG8y6>x7X;M6h~n&+@Qasj zX8Xvc_DzEOIp3Z4jmV>LpB(OOru{uE?I2Z(yQr6@JqzyO1CP~dQD->@GF=$_dKn%9AJVVR+^X5`yL#aS;UKZ~zHj(ZXG2hZ=2X zL>h6Uj7>Z^W0UPvu=CzfVe8m`a)&04wI_-J;X(|%-`sH>y>nQ<(3KIIq8L~Nak~&) z2ocLEpI9qVGI@N>mo%9h=DPc%X23pT&@^hCed3C28x88_A->3lF^k5N`a*ol z3uRK&0h3>oOZtSv8U=3Bs|{2DQmN*zHbVvW`Z!E%^_iVgZc$V6GyKT`yQ_3^xZT$Q z8iOllEdm>6m}0E$fF+E6bk35>z2KL$y3EX9fmxXJ;tE`K4PSlPUq#lWUqRNa7feG9 zc`wF9wS%2yt_JgsI8+OX2i}IQiFDJy+0uS{WgSU z{`d@;6_tWgKk|PF(mq+E5sbFW3hLcep%C5X*a`$*N^m2e(~W6bbwJ)&&4&y4-T-Lm zX2X0Kw<6G=uOEm+8|>a+9=D|lhf0jPb>$V0LhDz;CxGbQTXQrh$~Psa?AOP-ULizrW5Mg@389cnz*ofChGXm*d@;FE zU`MUU;%`bM=f*EEXC;~YE_u-D5|3Vd*n~EW_Ci5tqZt*7Zdj-qZm(eQ%qb}Zr*cV3 z9tcw2bA3qolt$tDU=tR7$J(6J+R|7y=RgrP{bC zCjAiPq9IM)PirdRN*F8XClfHJ`4)puJL1@rxF#CEQZbpF0Z@&atm7n?_(!QZ!RBViojLpcU#h<|~YyC%| zn6fmbyQ8bxvWmLV5o96x&IF5wJ7>65;)XJwekMa^%Yhv*g>|}E3;6!!dqFb5@BvrJ zbDu%v{bsEA%;i#iRE?IGyj>>;jhSHfBBUI-JZ_p0#UCZfJ~K%>1R^fCSh$*RQUza~ zs=Wj%exc|oRNMg+I38WS*wSpgyNpI%;LNprlN zZEb$ZU-QOJML}Lj(+v}u+svGAPd5m5KR-~g8<}MP)kXEsKmYGwhx%XoKYQ)wfraa{ zkXZ6T5)BWVEI$JqiO33sgWTW0nq!_OxJLn;0@Z*q8u2I}t0*hBP_6^B^Gy0|zsmq0 zkAI$xzFIC{*6q2fvMWqVq#>jqQQSa7M``K%Q%%K9Nj|IrcB*y`*31ntb+^mGEsr4; zwfcK&I-lV|GW*_BLvCEV6T->X|{#a##1@6hp7hBk#VF)-pGI zATaF*d=BcJjTN@oC~wn~Mb6~Oc9{D2MOV#Vha=DE3w!-jzdGKbzgW(cu$swt7yY_f zG+Gb92##B2n&1%Yxr?#?zd4aIWO{VKjEPP@%2vv= zWw`blC_U!Dc6A5T&D}9ki{ZVikM}f_UKaa0@k64d94j%b66B04qj-4WaO)o)i&b=f z0wU3Jtl@EgX)vy;ZK^*Ej6ypR+eAt72{bR9*!D}c^UVtRBoVAEMyJzNPEkB8_NzG9 z)i<3wnHnIiYMv81dspyOhx5tuA~7Vuvhsx#T~e`#GPt1K+)6+3kB+32Jq_L!1J)rI zm&MDo0sif|^u}CS1yM&|V#Vbp>NJ4s@S{Z--Q6*w39Ol7C=1d3QHHDt;xUn#m=+-V zJGC&e(Vzv9vO(#_h+wvfL}Y@0J0T*AOK#yOjuJaX>zoRKK$)dLo7Fv&dpviUGN1T8 z_>9K{%Z%2k1t;dk*YwsqF>9^TB-tN5TRaw23ZBFrQ(D!CL@6F zw09x|AaqXk|F-l3njcj1imWWQ8S!-b4M37CuqZPd9@B`tuU{+>$N+d?Ybj{fr_=w& z7{2s~gO#nHkK+1t&{ShyhqXKMxcf8(1U<0g)p+j8cIoQE76iZq0TtS8 zKmtxES?yzNDApslS5&xm0GB9$hC?xL#tnp{`uD}f1A2%)1S|H?LtODF?dh2Lr8SqX zBHl9kZUCwzp`AqDOVN_Jz+09jT?J^eVo(zO4b9Jpc29Z%X%u8uhj7;#>zO5jwc?EbwWM$#Y~XAP48v1TpRckvY`chf-+jiIi0~! z$LKrKt)hcLX*s515c5>tG5W?{4xy)7=bKL|DPJLHT;3v{9#EN@FxP*B|HN#Jkku<6 zCe+?%-9MZat<$&+15VFOmO#t0X{61kpVc9FmvGtGa1tOJWzs{|2JXH_HUB5Jj)r&p z4dp383L^9UC&StJ%)kt4>nc+Py46aYe4)WKylTt88bK{yj0MVE?OymMYr{h{z??;J zSy?OE70!jlO8I&OL2ZNYAr2h1wpSBXfH4b@FH0(=5v0=`u0{H7KXUvL=(vm|1I%5@ zS=IUhyWM7Pl~g46t-?Byuxwq-)GNUX`fd|BJZAl{14HtHG+J1*+H-!NJmWREya9PiFe#d>v)$7{fRid33J;|3iuA9 zDdM5+4JXeY_Cjm(R`s>;i*h0d&s%G;F} zeA7AY27zrY`&-dy3#quX1ks}~_*xzV7D=5$a4%A+S^He z4587YO-v85&uRblI3nsbQ_Aj#z(nUh)lr(ESQ>K{fXoES@Wc%4NcH_97<3OWAWvUt zaFQy(d&X1NhGo}ZOlDbfJve_KS6|YA^IorXc9nn zF$Y9@$)L6^X<+`a)nguof$+_}yMfvs@IkSw?Pp%x% z<6pooi<=>-6rLoH;PVOUOl!b6h=Bx%DV1G>0jRiqX6ncUH`M-f=jetjPZ94%^i~I_snk(MU8Rb2%JT(kVIh4t9?t6F*636QVj2hgr>4xs>j-}dJwt#7@pb!%z z?1Mm2r0IcD2r`qfpLdl&NT@F=kWV0T+8671z=V$;yh0hKd@gnh%=E%33L)$t34@9! zLXMpvdW3%87*Jru)v1o6{=o$^Hs@OHg$!rZh4It4cgDvB&^n7?H z8IKAjTj4bF@~Pmtak5+;2oc|e{41*#A**E#+#iDXgxZcsvV^y&0AMYI;d78* zhz3-qK^W`XQ0apYvi=r;FoUp}!(1Aw%1-OULe)}`Rsw`}Sz&pWwHzoMD?@QxtYQ-j zHt&X1-#uq2I93I;cOiF3BoN~IA!b;F^jG`o_;QYBy&Xy*Z+3DtEx31xw95YpWH zc#$H0G@=1*>Y#sN#CvrexJJgx0Ori^u9f+IV$ky{CrQT~dA^#B!p)Q$YD9|H3k=uD zGY)cDtX|;HY_lmhU#o=RsPv}?^Y7x&lruaRc{n{<3m18m%%Hv^g~`1htW|D>D>&nZ zLE>vziau=ZD0=5|qa4hkE6Vm&OR#%27$J>wLs1s*&Qc>5hzl3-tyJ&z;H0BH7=P#w zp0J!J($5s6teu(^r^~4;;-9n_xC2W17eMDiY3e@*4P>f-aQ#T2?p!3Mxu~0|{J*zu zgU5DTArKwhd##taIApfNP84^_Yg0)%M0UyEEP3_z@D%HHlTQvtduYepgs(^tijy&IYB3Gz5WL!ox@dmMs z{SJJ?=8Heo;&if^AbvrWk(~}rnnH~j-s_4dmnzA5*GBFgvC%SYvX-+@d z`fk+1S~M;<&A__Ax|)14ctE81HaXT4`at{+lRh2%7~cEjU2lIpTI+s(arBIX&aWQl z++6wovzXq}xw*oc=KY+^&enV%m}Jq&x!q3J$J(r>mY&~`wY{29y~DNP2fF-M@9+Qo z^Upv3yAr_uXa8%?*kX&o+j_Z`xvfd8ay2zI`N2XQz<>u3e~E*`gAs`k(x0j{LaItz zkB|Zn6Vw^t0<+)YXR|xLfJA65Deb7}tT2HJMq?vyb>(ifCHuZRR zZ`xG6ByD+tNmjI~_Qa`iz4ozx8F$nzXEL5tsP4$&c{k|-P`H<-0w%_Etyixs%G{af?oE0wt*__ zP|sXT#z^k`Slv9LHwYhkITXy8S#-XtmylZ8q0hj|Og62gEQc{1=@(X!m&!tbCC6NE z&OAy#CugFS0bJxHw}IV+QvPd72Y~&Vv07XZO!b#kKne|?4a{g<5-5zG2}nR=0z}JO zSz;dFsEC`B@!Gu_vqL?mS#s&m5)}4%dqQI}k&yoOl0F8V|1nhxAZCn9{R%@A8ms6> zSiXMnelj{Nx2B0xU{2D`7X-LK;I+Tr;}x)7G|#;@Xi!zl5%lx`SfLa%&H;2#56+3{BsBo8igb$i z2X;h=is>R8?abg81$4Ady*&uiJ_($s5-Z=Uuxh0g#UxA$|M7eRUr2rhSIA#k5miX{ zaE)xh86^Ed2fOP%;Clb(LZR%8?2iIBh{JY(i^Jze`!((l$9hxBn!m92n3&v2jmDUO z>h6%@;;{C*9t^>_0kTG6BuCp`z!uT^WQXGU>H6Wc@ibUCBzinB#OPPRo<&oe{GlZQ zU@ppZkkL=9e{fbXv~cdNzc)qbRZO8IRt@aHf!p3w6=rZgJGODOkoVE+pRm#rzF{Ai zRrNc948dnjtf}LTW&X;ZNhlEj`g}QZ4+IM8qaq4{wmgbyL|N*}LTnFvPZKY7=bFOP zsb35A8l$&kEFUR``UyOf^#|D486M>(tf%*YF>++AgO)V}7X&bu@|(ugMOegqveKqI zRDUCeCVmyb`77jjpR6+ke{ZkBB%~^v7bfQg0}W@S8x^}@m^tB{FKCbXpy>N@&?-gp zb6-dW959TUA4NxxKm|0biOr&W47jvYc)8n3`msun>9i8eTWQZ7X`-JEahnLsRb;_K zWiE=-hpx{a_lmNY`d7<_7(0M_qdBCQ+QO?&J`j6H&%*y5;$8!vB1urqb&kO|Zrr11 zslpG~l;;OOxttY(h~%UeU}Fzd;tDEIaH4c?QwXOM+?r#plQGdXm^mVU5i&0grFV+{ ztFd~Q{Cv4>vYn#3gW|wzf5)Fu)&46Fs;79O0^p@`x;qe>{Ynx0qHLSl0mk5{QGgeA zkx;MhcC@CLoNgw}$X>0wjG5|WVa_ZBZ11R%>C~PJzt}1|34uM4li7Y82yvylP0HvO z?v8#nDR@IZH|*d%Z5f-YgGNPXU3I9@&#qrk-wWPPC=WekY_ zP;?Fiw<>QwbrP0-;*!R1g8>?uq`Ca(9g`{&)kO6241N-^pct5-EqeWjfBAGepc`Pq zHjFI`L0s0vHq)S;jKz$SgChh@$w zH8&~-lVjJUBszRjLzCnAK;U`_;Q&}6f4V+le8@DyUv@UbIBd?j{XaXyuFVWw-h+4r z#*Y4yiMw}rX!k<^W^^jvb9&8i!{jM;yNNHzi94f>Lc0^{YtmzXDYOtUl8AEipCF`j z=anMxyY%A_#~GBi<=)RdRCm34I;}rf^9h8h~=C?F}OsVO`HyuF^gvP%-$9&;rtHr`A%)C0zAZUwglcd z=D{mQYKsGSs!l+uN2vJU|1|w*KYU*!xn`yFi6e>Ttr-^GJ~ej>yyj)) zVX~-xX@sz?R9qUp+B`mMQ1+qnYX9M&3nlp)@~GouT_}d6`m`n5Ay7uFdsey6>**y{NbegM)K}byEeiDmCd!dI6gn zGFeH>?r@-cl~VbIYHE5tzUco(%hynQ&sixFo5~4mdwuEK)WNO2@oDbr_N#xwQXn6yw;+pU z6h)j)EJA4mV$+7wwzmVnBg6lKS-BT@0-g!Fbh`oMN7DcJ9@1j_z5juOy#dM&NX7+C|2pe|+bxX(fLq$@=l1!W zT1%^=)ALKH`#t^5U;P$rwq5LB+yZ;O`F*>QgS){iW%y$3f8%Pq{W|LLBKL+Dgtp)* zouH->ie_MmryXmCIM;@LVkn+TAC$M)U#v+V?OBXT7hS#w>2A$GR1oKS+maNEf9Y_} ziK1N>q>e5q zUUh$TMBKvA(nINe=^#F(U1E?{4Y2Y|nRQej9)xvh6^vJ}*ei4!x~l7Lb0t1sHzxcslyQ+4t#QWE}lu>;Rg99NUqr#OKKD zqOzwrlV@1-^s#sqtPTXW;dFMdiv8$_+M=jx%enx~8oeYKhn5+WFe6$Dtdckp5?Fh4 z4~4U1m9#n_ek`g_BRFpkliF?N8+V(w0Mby!w#7ZYYv8iFX{HH$SZFkdM`2`ht}}_S z3RQ;730=AI18`Ps1UUt$O&ot`jKIiiX#$xXpA>JPc9e6t^zmp2Uy&B zD{Fle$#dX$DJo=JsFq60D0L|c*;xSC3-+amiv+UKN1LYEd>gi?DXQfd3-Rn6M?gWCz=&_DhQhwdx0j@U`(d&Mf9< zI;175ynuqOMxlD@l0J{s5(lAc(4Ty6MnM4VRI>$raYS4RZmfCg7-tn_0bovuU)ay!o4$nx70(9Z&ejr*hC)^;K55#pS&!0&D5@mYM)fHY3ekarb9-tbPT1Hf zwlm(9{oqk2U2k406-DZr?(}IVFa5i+f zaP(3;7tYC(V$;^C;xS&;Iue&0YkN0N?YT{f+s#sko+a-*^Qb6T;;>C|y-`~zIDSh? zQ!8&Pg;*13g_p%NjI+0c(A1gtxI*(bj-_aisG>@J2=3%;7{&QE1**+6pn2RD=@Yg( zuN{bqCJX`jGcnNZPIkRt+v@u+=YP!tA2BilGBlP18uoa1(_P zT+r%KJ*jC$6p5>ZBxWnYBn})kzzHIt29ff%>RUllSYs0M%_s`ZJNZVv#sv`a9?dIF z1(c0S>IWsT+@vgS#>brskQR=%z&$+nDz#GW4ql5r#R})IZG(aR{%BHVJK&}M^Y8%EDT;iLa*CqIJCKyck6Gva( zx9W@QY87v&zko}KRJStbd)HC2V$a4>bU9-h8_NH<8g&|TA5rWZS0SO${iG*bUGI-6PM(F44EUEHiy=UI*;A?G{@g-Et^7htlV zqDH{0Nl6Ozcy+52_mTl_#8`oAH$qy10flo42z>^j&v*bt3dpDKMwDUGbFm-CSKUe< z3M40G-oc~Ic0 zDdqR!;fBJqoIkZ(*4-^-88_@G$El<2qQNji=EkbqEdxn^&wX z3{tuTd#2fyKPlmf2Sl9_ojJsQN2%c%T5aMOr}H)>@Q469)i_+)WTb7CV9cwcIk$}! zz4Z{NyS0#y@dmBd>V{q2oiaTqC^fNXw^jYgvCVf|DH*MDoo9Ks0?0bYpWQtdz!`D6 zL|syouaA15F^p#E zb#oFU*FiP}YK}KaNvwzDG%~2xzX@QXHP-oy3Dn5~&zIv0F)DszI^ve<+l@~9gQu7p zky()$h$FiKFdol|ORMj$vsk?Gv|)D8tQrRV_oh=ICRii2GYmSF$Vo(MEqa(i#3+gr zy$%L(e~Km%c?7MUF3zYUOLK(-MC5#!Pl0$KF+IYFI{c=y;6ISu1e%csjZ@(Cl!-_5 zw}O!4C}UpTNA{b7&hsw^j&|DQG3fWy31W(`$)0R-AdvW;alG$%G~$i$wY-12xAW5D z)N$khr5+OnVxDMj3=^WE7A_%FHLNKNL^l_bbBE&nVT&{pyDF$k#LRf5)c?NOj!&p9 zTy+x$k=@NsMjjIhi!Gh+Ox{E`?1r9+avO&v2W6D+)hvK9WiPQKD?IjiQxf0zC`6)Q zZ=jqfz~s5A31mDk;6}YUiGyu-&b@{2jzmtz=Y1llKe~U@@6kTnEzarZik^=&#o=~;wlrDbg3 zmo+_)G>5ItD%S{gLc2ns9Vk^d+o550-`y|Fu&NE1yo6J3hA`;9-JP_o&FRlMf~0Nq z{pTc?z9nEf?szCh%rEa@8gK7q2(^t8Rx7HwGWRK&_65Td9d#|OKkT{D4LdIEQZDuo z(+engPcfqiekH9Ra(RV8^$M?=@mU=^S2PE8wftRo)Wpzz4}~T>+g!XW+tx668#67(@J%Fp8)+ixzEkiBu;iwI#=Dyt%2GcK z^?*B>bBIUV_YpDV)eDMSWMvHUb>Gl#n(!d`%3z(E+@h-FPRY7C;f$kVGfsNZU$=Ce zW~y+kIK{XDna_l3)pRJX*&z0 z>bXhVCb=x@I?_-9t9f6}VLU=g$ElEe*#Lo1wK$2p6?BSC9o~er>?i*gYIR3K59~24 zM|n2tp{JlpeSSoY>R4>?u2Aqp0!{PGya13GP!GPg+^zMHm*@VL^2E5I^kXyq3uD)T)-tQBcfiY4o2iPuYvAmfnA)7U?a?HlJNTk*{yrx7*F+m+0cq(I(sHhq~28X^6#?6W&ZN4llZ5cGDZ>*$3-$ z{g&FS_0iSnhow(o`jdKbT|cQ~ z47b66p@k>R`J5BIH^7n8?~Xr8>Dr$g-&(JBIJ;a!V9zsd{|WW^Xy3mT6SIXkT}gt4@PLoeczW$(D+@;q5% zvKFrv7s}1jn#)!&G;YS9;mWFFihQm3thiLUUeMkn?6-L@gnYk%h2Q)S zsLq|7Z zcsSp-xBTI$@ejrDJ9~SdPpP)Z2g1E{vqy8gU%l@>kDonX-+aGfE1h%FHB^iXeJyV8 zPhmlDud$_!XnAOazsKKTc-vgcA#%tf1Ys>#w38$Re#%n`@zzZ6c(P#U51Sh#X5s+|aMCYe$^LRVUwAfG1VCzw->6PeS)QYU2&Sk5ZK|hufBrKsVg}Q4dCQk|rsg)WeSoAS4mBb8y ztpQ{rLH&`SROMHR8Y@@zBI^pp+Tm}58eIAD2z5)=l8;AVp3L;Z)Qm~|_q2vOsnkJ@ z0|Mi`)+X7puXil8Eu-C*^VAjx}m0?Sc3oW7TXR zx67s~721T3fhex)iIJ{=pxkV}Mm3(y5DkbrnlKgOAZqYEf!GI7@I~4K*vl3jtTP}n zgH_Trfx&x(^EI&|gzNqNOa)>hk0SkbJSZ&01XSnX(nu?d<*q6C6*lr^_3pz98V)Nc zU%)jD{0C&p#GButga4XHn^U!xd_B zYy5guj@u|wL#2enABck|%?mHFyTFZE@=CZFN_27D>B0~|2f@q$S;>}`p*>Xwo1U{G zmUzQ!ILkD&t-x%{%?x$IqgAK$WG?Wom7VpA0^V#CVUHKeC)zE|5R8T>fk)WwpZ-hX zN(;ej57cl@@=vJ8T7tR|r;NN>-N!)fa7ql2WwkTJrVSp zk0@0R2qC93jkhf5v$!TAFXlF-MHoK>)=`^Gk_Wcjm^c{gz~tBiIg7HIF!iyr|342 zdfe2XrTIxV3+ZVq>`4XDY#2*3D+PTcpFQhR5AA*F5NNz8=a(zfYH;{AK1i#Mh=E(% zdY~pmcU2ZpnjPcJi)3|+uuQM@YAi&a4`VtCH9mrZR_dNcM8%j7>HYJMXHbB{sx~Sn zQ@VsG#=q4m^+=RDK;J5GB2tR#-wNWu#X(Dy#?@(-Fvr=OjRH7zziG*PA#qzJLn5JS zDMOx{j50bb>NYNsX=4*INoz+dG83lNB|JAy6@gNQniXL=5^ARu{q*#A$s&A~U|>PY z2e=(cy!VZ}tEJE+RuWkNS$fsL&cV%K5Tjb4r8mPm_njRvLkV&Od9p@5-G1h^UCe5u z%EZ;HtVBvLJrTZ_{8tr;h+kIWIifTVDbv%^1CcX-%b?L8BE% zLZ1+tBb}CcQSOpJrLK$cQJjv3F&z{$H@7U}7gcg0=mzP#sWGP)05PyGK_i&)t<&j$ zwDM=>b;uoz<{%Rj-t5QJ=5)P0>DA|SHRk`Sj%ifJ_HueOYM|7{mt&S5B)?3dC5Ee+ z<2GoVRjLL#{x#ileRDeFIXRb#?x?K zMjffl3bl*#WR>kuYK)@1EFLns)6MRJDznc@k!E>4eBMsCYpF)lbsdIuEIdLDVy->(JH;yHexm0h)k* z(I>9`Z2j9vtOxm-xnC|;1M#GW(+bo598ZCo-V?x12Ulg>2)goe4ZY2Yx*&~ejGw|$ zZWArXk~#N`?2Nj=HGio=rZg76f_Z8<4a!2DP*9Dw;h(V&z9N z^(VTXqZg-x;0UMyOQ5T$OndAyJ*YbOfkBPFS91NrqEBK!u-fnRoYY$X$Sm8kHDSMD zXH8hRRVI^ApVslQU#jKI*8p5VqrXvUX8mCb059;eHPbq1zEdjUA|aMS3H@RUy>j;} zDc!Q1f~NPXOnYgVJC7=&6y3m9W4*K0AHx*0&?;aa7_%n5GU%+nQg`DQydl6G3N@2e zXQ~|uSX#@w&OdXt%go>%3c(@_K0w!PnEq@YSeKIZkGUE#jq31xi?>_w$`nXWX!B!z z!d^@TSLnn9vXLIjm2lO02Liw0{w4cMHy)&dl(&$3rz_*~0Ubbi$$w+-9)g5{8E!$h zZQHip{kCn}wr$(CZQHhO+va??>fV~=Y-Z-)d{0$2S!R=SDyal_hxNilc-UZo(lLh7 zM3$0l+<-?snWW8qD~jl&-DTbbUgS1I?Z z*F>$xJDvbHl5*(zz*`zUGhOwNGDsQro8nI3eRk;LMxGOyY;K{Emk@AQ6OSs2xcwfh-i#Lu(Q6yXDH=@FUaC^EK! z8DJzBJAAU6caTH?kkO(n?Z~H!{T9lT0XMkV@rfpz$f6Cgb|$R#y7<0>;o5d>Vjas3K?|A47v@2CE!Q~H1X*MI%j|NEq&0Q~9xPycsP{!jlG+udRBg1314 zQHM0>H$_C6h(T&hs#G4Sg%F1;j;w^}S)8Hrl2N7*HK7!CJ?W2mPc0guR11@ujezSQ zS3ZFkFaHLXeTU|`_}JlPjv`o3)fpxA@Ys1emGSG{;eA5mHls1ixjO1PxI@B8-o_s&LjN!8oi-s$Ri+CAM>H@JMN zPU?aZWBvqo9nvz#1`ZxbZH9lF*cOq=p>w#uPzD1iy?S>5uM(O!OClBteumj0fLX$=gELptqmD&X4jTfijCykHA= zta+Jy#GgH;G?CvTH)@rWnW2^b5D9u>%^Dq{4XQB;G{MosJ3p{zL}`Ve=4V~i#av}5 z2#!J4u9Jr67+P6uw745NVID90IRT0sg~(C{e!i?i%(&aT&=)%`3ClgP@VO9O5D0Tj zO!h8`FF+EeEpna;S+Ad4uBJ{-MJDb}D`Ej0$&>M06r!y-KDni0&?N|RW+jQQCTv43 zTTp4T8hT^v0IEdk@~mGR>+31)n$JXzHhwN2#?>APKUp3_b@(N2@^6z93YX^8_AZ`N zS!5}HdPQ)$Gliv`ZuY>`jHNK0QxSf1Ht@~a`XDvgku)jTXfjF`1nqZ8f|EvX9)t&f}vie8o|1sjKlyNHF@sj=4vJY zyjXE|fciuyex-J8Or2XX3Qy7vB=soJ`4xzCEL!qSBgvo?jd8Wr&awC`eTI-!7MYb* zD^89UHv2kf9)b~0Jg+FWSr>SXg|;aMwoFLG(alI`(q12@-6fjl4{Bw+pY4?j=uWdv zt>Mni)V51C;vRm%HB@2kG&b6?)@KCFb73d!v}^C?+#VT`mef$$i(9Ou3UN)eKRU5a z!LG?%tetx3)6}_a6_T!lJ#B__pqwV&m_h!)5bftu850k;}=!i!gkv*T` z4RoJ8Q=%e-tHAYKneY26}nIFLU(Kq4R2Mf|0q^Zik`$mC$zsS->Jg<=lN$R16SIr+9m_9E zro1@*)Dro6XMARs2Qa$XL;B z92#=ERMNj>x0;NT1O(PVOl3h@6$DxzASpX?+#__JO@-}SxrFv6k@yWBrp+2E)tNvn z`Pz~lFQ6h@KV`sNQ(Q(JXVxRHa3P&A-orwAYrR;wMxV6(1zg2|+7!-2{=P!{Ze}pI z%rvKKh8G-^RGS~zGU?^Y8!dT6F73R@Adlss94IqqyoDdZF4?T1q9;~$zRQ{MLIu46 z%ARAF0Z3k2vrPC@9|Z2H{T?i_kqcLWvTL3n0}~1$u`@#LLItIzBx6L=HvF>%Di;yM zZz^=l<|7fjtO-!Gnk9zS;4}IgUHe*scT&4yhpxeXQ~VhaT#&6V5G9_ z*$0O~E+%I(jb=dS@h9a}&z$Ywy|j2TB6M=4_A?(n`f?8pys735G7Z5d^C0omFge#n zcZ6?Ex9fr!H>|Glw_%^BACiR8Gd~I#pK@UBPFVbge{}>`%H|(ybnY`IkYQX+Q}jMm z&T#Uc;zlyB$-SOxY!sAJ35X;d`Z;QcD+ja1Gffo@CI4hlP`oAN=+O}$Bq%ou&9*1$ zOQg%?7t&e-Ktf0c@9Gii3?#^DZql-wg{eE-Cb3Va2k+6L%&;9MclQZkkJr)`b&H1G zzQg!TqxBF6VQr0en8p7mz+>9!;{KhY z8JFQiS5H~p)diu3=9(+J_O&L?{58{+{yzeXWE&4m(w^G+WBeC7SzC}g4m{C*M6 ze=Y%sT&X}|;7Igx=1c6~kUqEqY6zpp_u$ss1knmZW5nfDYY@hNo*fP05QJ8f?E3Kn zsrvbp8{`nVmjy^h(&Bn@q4qzFCt_eX!t8Q4&8Q0#75!W02n#b`OL`>!j z)AV^844vAC+P&p`+N2NzRLmFz-=T|;bBesz!F)pD6QLSx%N%UOIZ`SI@{UA}kZpt->MPFL{1cIy71Nr| zEJaDVV}-1cHt^Av)F^Z%H`4!>Bm%v^9xTnITcLn&VLq)N%nK)}g>Ugr^3pom zp>JNl^M?!&sf{Ie179yDDW#rJLRco~S{=I-0w-Nx>7 zv+;UbrTZ%!D_v`C9aA5}yOLPiTepQ_8sOo!BH4W=COCbg!eRtdV?UJm9_XQrn2sEvuH zy}ZB2_Yy{0qnoQ~XTO(kIl1il^tIQs)104;nXglyr{6yBzqr33?KiVYmz!Z4UQRyl zzvC0Lu`}kZ%syi>ALq}*r8Bemcj?rP#?~B@E|Y6b8}=BTx+boveb_$h&TC;G<>P#N zEUjV3^wj-h>kV5B?)xMGh@~5b)VO~2(`J%j{PMtx)|`urd!uN5928Q!wX`%>Og>93 zL^8lCvg-CYsD_pY&qfZmGy%OWB*0>C#&xM|#}+bNg4;$D^{VVH|KOB8fCB&@bXHVZ zd?L;v_4Tj||EYw65xnXzurOEZMG0A?0%B>-iVGDprYN6D z5V*Q|_xR(RfJc?cCk5TL;fx?j-8l@ECG1p~k>(DMBIW*EuPbw)R~EeYg5QVw!>w zGfbSu#+>km51}MQDC>Nn<3>V@ljQrsARNlsdP9VANFvF0Y(rq@M+Z?Z%*PDmMiPTf zmS{Dvf%NJ}pwv0%pKZo-Wi=ck&pCdr&=ds^A-0)Yk;NLTi+B*Xo1(^ym)1aJ*)s14 zGi~a570D$7bAw5t4X|~TwsPw<_#9a_sMOo+RS%xnLs1=JHx<&g8llCbA%WWNe)3sj z2j79@I<^iuh`M{7)k#Hrjp9ohHVYjCif`fXA>2z{29VH`f0dOqi_G_)BgDEJgC2TE zKEx*nA8|gCf7=A1;}z172YascU)#T3zoSvfIP9E-kbZ~_mcT>Nlp@R53GEj=IaHhs z@qafxI`-@kBN_AJJH>evBkH=)p^j>(z@v) z5zEF;Co3<353se1!*eK4oh%4TQMO!`za&m6ImX3(v5R)i0y42Tr4{%RYb7_cNn^iV zORXs8yMe;&XUdY}cTO|N&2?_F_{iP^O8FjfqLD-_PPvyrR{TxIVO1AUJ}*g|Q+YHd z6Cj*wb%|5|v-<3D-eX9gVHK8`8-TuiF!1j@2n|SIMVeH4#KTG>FOC0r2&-&}vrzZ! zBvLo{FP(15Lp;|tYCV5x4p(0G(rWvU2^*U{PCW$6`3LQq(yXa6pTc4m%W#Q$4v47| z_+*1m81sTY%Kz;vOKYmZvTe{Fhv`JmFD7AbF5$vd01ld09RoqXa7q^&$1( z-#n9EyBvbwGHH9~2$}vsncU7vIcNL3D~RQQemLiUsdp&R%qtY`qZF*eLpnz)?^jDQ zZd-)9sGs^5swQ}XHx2Nw2$1aMOyjwQ6PJ1f4+d5g0o=*s-hEu7+cZ7;h>w1=sDM(Q z)>&l3o_5YzNa-C!+*W}kGEMpDS{4Tf*_RQtl@?-FoFIse!ExE7q{-H4ydokvbGO z=A&7PCF1~9Ky4;&&BS_E7k{Yn28OSd&>=d37i3{jJ}!-;bForY7KJegUtooG8mDtl z8+)YG%fpX^`*?pZ#AQqy7A9P*lqa+0_-`$zr3`@DxUh&Qjm`)RA*yvqJ86xOGsbb^ zJ1T7`n8-BchzR{jH$-359zHij!X#4>HOo6yw$HwQz$@r5s8B^jB5#wawy3JC2`_W0 zjA(y`|2iIY&b2v35_xj8%?$7*W}kBI!j1V4Co-|2L@d3VnqDF$45-p`LGO)JN4KHG z2A($*)N6@c2o8(5%dVk>m07K?b?xh_d?a*^E&eAJhfLp4q$vaDI#+B` zKJv@sB4v#*`%KiYZg=k>11X82GUC7->!FG0~sf=jgv{HZVo@+krG_&IT85& zxbV{iPT(`ePd_`cs52Bs&omTUaSvcX)AMs=xc+Bwf%x?x4Ty~b_Rpb)84YB)O{H-> zLws+-(F?2>rDzCa+z!QP?m0N$&2M~%dA!a3F0ZFDgNW{Z)}d~DKwHc7t4j2x?fV0@ z`3esgL8cOXbTsxuJ@?~LkkM{GPjB=-f9VYUWVYE3$xNjvgj(E#f$`VjJMZ-Nu+n$> z&$Knurk2G9Y|{-LY=Xm3N9qa9VIqxm#-;M)tMJ>V8t2Bx}C^>c2D$-(y(>8SVOBP-a9Tkw8?g5VZ;2SrKd(#~4 zFXfY{i|O{5{srM2N5*n*?!r3X!NIWG_ijI<=-UeZcLQ zoPjsfz!~D_P0?^+&YlWa>@A zheQB8b^1n(#zbGQ8(=ursu!owZe_2W?iND$YR2*#V_0W8+BZCO5cd$m(RUnkk9xkS zg4WP$-+czIrGPI^?a*AS|Ei;onKz4*_Hha7jT{C01B>dE|5OCFA7E#?H~LQmx{dqY zT6>!*yx{x&{yzRTc0F~JFii|PdNSIx-09xkn`-|nbb365Z({zOi*Ox?hBMRicJO}u zSVE`&bNBS-`?@|_Ix;h>@uSa78A@8pcs(lAa4sB5lFQ5Mh zU;p+0H#}GX|F8dj{y$^;zyAM=%C6fX6`7@TGfPFnj6!m39tm#*25}G+c8m`Ko=2?c zh^(g!i8n+fBVG`N>z?R*FuyFW%7>l{gzp3gdj<$hK!>;{A206w{7?B0OHKk1)yFK1 zxVXH%`26XrtP*pD&j+6f(|T*W6-BtK+t~v3CkeX6Z*8^v^SF!4;s!vLUjxTR`}_Epe$^}AK^M9kmeu8j&7Eg`YqLW6O&j#==62`f zZHA7FZ>*sTU)jm6LeI}zc?opst3s~9JBB4jfQQ^xW*x0DSIxy$Sytr<@lrn+QALHE zRPcbajBACHudu!%&XU@h6Kb-KIqW>Si7rHZNt70l3USGze|Lo9k_m}@mk@;~p#pDi zVh%l1z%_lb;xf;T5YsrOuHoRRZ4eC&iHXd}W{n&9raCk5B%iku0iuxM@2~fnn5vB^d>k2@SapOH!dtx0JXGE86XWWS2ThR(ssO z9CclT(}8T7LLCax+*_9*p+9iCykH|T)&p`S|a&6wccAn^YZALhjIzyT8$E zQi5bkl~kxYm2S>xV|man>vcX{5S)Qs3|L@#v8O;mDyei>L86krX3Sw#s!%G&xTnrh zWdWgn4kN&=F_a)l=~QCL`Y(JNxwc+RRh+5}jZ&tAm>d$LTSTIYGQVASvG_@21xb4- zwUVf8fzJbtHzSkf6-l#zs8xqG1!AdG0+(E2TywGah^%OR9c7N@4P!vEt(#h1#?O(E zVn9i^sCZ(@sA4e_*@mp12s1Q-dIeKq#F*@awaR0MxFR;0EkliF@gT~_*!3yO2itm> zIKAIgR>Gb~fi%~*WH-NtX<}WX9O4;O)?6Dank%JFBHY6)=^)pd3N>zoT zUYRoO3t0kCkSS68)o=;L5$j97j2P9#*ZGj;-Cp^kX;aP98VaDN1NaotCP;LaHAI96 zDvVgH6bQZKh{$4%vM`Ytx@=ZiI0z$+5wXmKpmIc%2&pVRcIh%Eg?xiQ$A@qRYp@IW zJ7O7^h1E+OESi>idDImI7mBDdn?s>oJ2ehvOGhqR1G5o}Uw%44;!c23ioVpM$*QMu zx*rvbtqEwV4l+r0wpK_wHv=fRt|nne&9ygiXjuF{1-D928LCAbk;}~PaLCkr<$EdW zLl_|p%S6QDMA`Di1@5jnf)mO_-N|2tmXNi|s^LA@9cCLpdIyD>5Z1*I72gKvRL~?F z!-vaq*5;-;Fw}eL8zXvfpyH4XYMdOnsqO?ht-g0QLo-E0#|CEOAR?ye6&ksY1>FUd zX_<=>v4pU##pXnnb&;>CSC>UF0=q~aqmp82B+=+LB1N`=FGCXDrpJ05gxh7LZ+3kc zO-*dq^Erb;$w6GjBsF1#1H(Y&-lX{=xtR#LQ(^2KzB|1nc~c0u|bX zwyu*0yrfMJU%ehH$A%OcjngK<{n{d&EHFKZ>#1!0$2sz~R;3N*n!dDeqI5^K3l8TW za=KOFx&VNRxSEexL~?Z`wp1t6x{gBJ_4z&}N7gKxjCwA>9o3n|5xMo)rq)Gv_C?~4;q>(q*CF}=}A}`wXrvn#UHkCW#Jdh4dy{~$7r*2R@+$v z0;#1g?u;73WL1LRT6(0!i@}d%Il9e(loaBWxUt%0;Qic{KAT|d#EYPFE+^9&c^V_SM`0*ql%d)Y~P-g@lz zV^zlnrwgpz?{~N#)A_>QTjpP@2^4hj=T;s5-CjFTyq<2~-w83#-T`R~41aUPPX6cc zdcCvD)qroL&+o%blUUooc8&lWQl*e%1+487w96skf38YV(Ak>0tGjGxSquui`B)7w}JHPa;I4Le#fk=MH2LmHic%=vu(PoI`HA54su{9}!QG zU4-7kfg>PthE0o1VOFSF`V6@AD&KgR5Nd&gC9!h4FK-}ZF5)``ZwtU$aLCq+ed1wG zvKSqsZ2qppb8&kvDK{tT)Y)0Sj1w3>rsVfw@yG%g52`9&$Q90 zH%<20Vu%l95BuEEG3pWGKAbO}UkRarBxU~Iw23eSl-+r}F`Tl80x5clUBu%<klW&pttd5az>b` zhbu#Mym7KA0XHTB^`t^Zw)$ToB8<{IFnF@<=c_h6w(m4dRDGAAFF)xsb&$36zp-SA z@xO#4FCauD586Mq3ldkrbX_oin*@+in8l+{bhP=aqWl&;2VS*^{nH@uZKsm&nq|*l zVUONa^|`!oTSx}9f8!Ud4QJAyD6(6+qgJaV+pX&JcP8qM(ytE-f&=K?F>w_k_iWjB zQGI8OB)g%|*B_B&#Ik%2ktR6)@h9pxJ~IA19z-K?wB@+>@0DNe9>R#D7RTG454DVZ@AwZ1z#Z!X)f;9e7U2hn4eR?Mr2%5=&7mN zTvgOTfMv{rYtZZMqwe}!{ggqyU#5{>beAL#o=TOe>00U${@k0z~VP$!Jq#tJI=Q=r?M^%x*nz9s_9wLS?lMmcE0_cKvw zD)17;s}DeUhC>53xhGk@|2&d8d!4xH4idNQv2YH0 z*Zm;LnGh_@a`5?%KWAyHGBF~0KTaaj+Od?Vm|yIY;(L=r++5qt#Zj;PYf3sxAOlZ<*=ZcLA%Jn1FB!J*J8d zvqQ$>JeazIO(fS$4&{eJx|hrgKsam*u@TXR-%#Bm+i|vMb6qh3otuMmzH-iZ;inAF zPKDmTl!2!Za&Zp2bUEva;5b{#bU?8UBj;P#rOM#9Zqr``k!uT|Mg%0-}r(9 z@K^gk_y3i&|I`1$UvGMMKsUPV_UQU(MAZNMp*T+VDH6m__DLk8Hx9`rM}r#;6+#KF zCj+n#ONs3lRaQfo7YE!XRDOZuC;$A7e?UDiZZj?}Jec9fQi7;WD)^&3JwIoj-m5R)ccC|7#AeJphV!`QX z)r#4GJ>v1{!bS!B)kmF&jmBnlUC)=LPM21aMyFG;xcM~U!GCAR9w3m}XeuSBT9lE) zQAS%24CoKuEDNK1o8y(XM!~<5R0fEQVsAbuGJjVUL{hT5OsB}hn(Bkzt02STMy|I_ zQb+=k=bD9d>budV5hOOPE(Njw(nRDgF^Dr6QL$vue?EXA_lZsf;A3$RWcLe)X!1^F zv6za+Cej<{W4^n}aOFHD8v%&z|Z3TyV6M-pU!k*ywsInwo0)oOn+_40s@iAl!b09bdV%$ zW1C-PgJ*1aGMckS5<3Cotpo(5H(t()lznKPDA~2veo1JNrF*ADHVug?Eniz-9;>`b z^)V&&FU9e6fpN%%3o59E@C4{Vuz;-F_E1u|lyoW14K<~+v|f|DMFIqt{D@{WWQ#Hm z*BBFM$)R92%{`ZA?&P0d#!0-K6*?|}Oi)y;CEWA~TMH5Wmj$hUOI=J&hJGgyd|`pC zKT^%<)j!a(62v?oi9TFmm~kG_ZQe2+F*c`a`MM)p4@M(FoLIxCHQmBhDO%26aOq$`V(?vzmpG3%nxRop{ZnV{pMd*Udyzzq+pzcl+n z5mtH7p%klDPy=g>l9@Bq<_i zx30{|%4LtByMTElEGZI*T7=lh3JIF{I-R2|b(+b$Dd9C&rwBL4a+(-TPcl`m5WHbHqly@@=TBYHc*Z-DDvI|5Y~6>`u`**3&tPMxFlLu0;3j}*XVlx@$ZNto_!JMsNRG8V7a z^(NgZ9@d|p*20lkgsd39gU7=eq9kOM%1zI{4y?D4J}-DCG637TKa%C0|8o8jXs*O< zS3RJ3@eqg|`7J24W=IvoB|fA`7hU0|e*h-Ih3x^K3VFBLQ%3HTi+NFEDGJ>u?8WJp zWY(nTW*{QHb&}ye>LCPzY+J1Zm9R-fVzOTxOcXrYyW1g|aT~EXFglGgPvCVbnFFq2 z12)@Q95y*WL8A@Bo2J4B?%$MQ$GIck+TnU`ZFV@K5EU!S%!6M6YyE&eB77x~tZfZn z&40T$Lnc))G9F95UPwLdxBIA zo$`4IF<^MVQ$}|S2K+!Z*k{pY=3*^@b>AhTW<*xwCHq9Zyj7=nPpx9}NecZZ=po%h zXE_o@KGrn_FnaC6-;ae=&&HioSit2ZH3)M&JsXSSVy{c>F*jo(5_rp9C_uRqKG z0_9lwlV+MWU~YqZ-^t1k_b7gjJr^F#_p?#{4u!VGqg|>Xu#8szx=HO{;L`38F#42} zXPzOiAEPeI%IQQy)QN`)%GHKj9KmW^oHor~MCkpy1a@|>-=W}vq)c^O?o1Kd`}ciL z6p4@M#fR9K3?}$VXo$s2l|dQUF&CLulHC10%@E_ zho9%QpvwIqNwBv`|I$4vrgeY4~UFZA_zOk61YPrD)_)KLAEPIuzyhK1*>fJb_?~* zbM^32=7B_0p-*m#`=Bj79RoGuIhrXf*z}}12u0KYMiUa?q@(?Gb+l%FAr3|ia4rdW zoe2AZ(Qv0*yrgP;7$nAg_$eTwI=?y&oV_f@3JXbS@e~l4txWUh)V%MC*?@m|&@kWC zzQc^!K}(c@M<=C5_@lE_A;O8pS-c5H)MGF=qG$%|e|9o{%o$>SANE;nh2YL&Vh(qE zgb{Q_;>&>uIpzKVz;~XPfJjIA0j205COOTWE`VTa0}$YBM6qV@WTgE3n}PlsNYvC2 z1@kw3{l!%D@;So{&;y1^9uFD@d!RB7DA&@i_Azl3plrB)qdZkF5RjjJqrj7R_DFWb zd^|>ZQ|1VO7myqfd3xS_60kQnLV0$eWTcn<0YKBp04R=i(7YuMx#BvQ{YJw2BoG`=Rvky@gew-4A5wm>R`FPDv#^V| zGN2MHSV8`g15^QxYqq>;hD z<6=5GF9?=`US_wWhv6qe75YLHOhr9`VqmR!YQ%){r4G`!)Dcw@Ze20)Km9itiONuq0MAf%HMV2cD z@(e_3tdYtyvu6w;_yum2`ENRYGiIVr)|3{xm@Q&LEv&RDn#^>v7Y+Tu9uL8IbwH=X zkUoTP)9IcO8;og@5cKY{g+FWC3OzZy^Gu>y?Yf=B1|fSoZ|WYXHFq{Wp!58>YUkdA zO&(|~8Jl+fGd~YU<+IMq z)`vR-N?c81w^r^J6s$S-tTizHV8Zy3&nkp);e5y!QGzh>j86TlZ?lQ@nQ@FxderzB zH;^6!V2pM>-X=1v3C_Wjwe;8=l_4T*hMkvEd1$X%+^B@r9ZXmz6NC@RJG5Aeo1k)< z`-KM0KLU18#k5KbB$zPBm#aIo4gx9&jF#aTYN-74 znCS5I(LriYGd>rQko|4oa-jSM+Bro;%8+ZkWQFeC$@4rvV6JO_uc*acc;e=oKA;B& zE{XQq4S_NRzLH42Y-O6s^A>yLD@yL4X0RTUbdDv=y}?u2O6gTp9bS^9!c}zaEV@8)?p{Qi$Ah8`Ei( zx8(}Akup9N)<(B8wv|r!oDlPtjY#9am@S}G`=`!GmjJ}K2awdHq`~H#p4^lKe`#Xd z{}>-vs@u;=A2U-cb!We4!d35`l&PFQJtQ02-K%5MWELxl)-ap1mgH1wF95J6SZ`;` zOq;%{6)Z0YYiJT}-ObVI<_reW3D!>uo!cpjC+1sD%6gQ(PrVheP~OOc1@`iarZ}a> zX}iv2O}R#ryaFmsMQq_^XrqqNnA>fguGnv)jz4L+eLW?h+T%(WL(xBnj`Y6OZvL*+ zdz$xw`BVA;lKcE|`2xtxy5=tUelYrH2UD2n6wa;{Q=prOkXtOTB$qFY@ zxac$Qs9UO^Hg`D?U1*PO2#WtRkr7XpfEW?!zrc!%su+1n%s_pFH>Io5Ml;9E!{m4b}ppjtqcbkgC(0EiGwI%VAnU^hM)H z*5V0RujnF`c}uv2SR$!uqJkx)Y54X$9vpA9)_Ln|FHGycqeppU-LQc`e58*2Q!f9CLn*H{1I?72t%uA{1cGFii>OfnC5w zKZahEb(JYEF}9Bt2s}A4m?HT|u#gDsl8+*d;h~2RR;V#(YTZf^yoE%KF-k;oD=p7P zvxOv!ikvJ-4t?d01k(TzX&!j)TJw=m;YDT(bq-EeS=#NH%`TyHMmL}cMl|5TD&`Id z%-LcHu#ZRW4VCX5j!dj15^`SAvG3lJ<+Jjq{iR{wjuqnTpRICf3MOWojOeKE9K$w@ zDzJLp4AHEuX02S+u*$g&NIHsA6C)%4Aziu00J4gBfw!tVqseQ-3SJ#8#fF7<4O&q7%J@Q(9GuR`TLH z8^4_M9K5|;r*f)-|I&SJpQ*-)O2i`rnRHRH{>Xede98lCet)@q&XG;UZFF96HTa9= z{DNGB0N!3#up%_uu($v^Vz26oVfL?uqo5LV))HIUslaSLn5bC+p&=g+e)eE`XWepO=%UtH;F3gbDRMf=zfd-bLs$|hWl>?YqFPmD zrg_y##cs+`rIF5DDb*5b){w`fP@FvQkma`vxjrC>JC~(UHu)u|-7ws=mt(MH_QYc| zPXyRT+Qlkd#S$S!CWwb@k*(a2!i?chsd&Y~p-{W3^OZE=uoF$OI|vgs&{O7-9WbdOO&!%AAgM{$3y1q*jFEJ>nOJnJ!Nc|`0ZF@#8J?Z z2AHXhP6J3@G4Tw2&k@2~9eU zi|)iE%LsRdAQ6Q85=XCa%QEw^NuNjyxX5IJY)jnWl&vIB;Z|eZWmQM3LGUM@uV-#Q zl@%@M$&Th2buu$Z@8IZJ(<*W!%Zr(bnPCHkX%e%?bvZO^)}LwCB0x84jnyT~E5?1{qnvZeY+wS0o0Oe>1r? zcpZ~S)?WIn1g*E-%EF?G+|;5?%pP!W;Yd@K9+Pk%lvB&0{d2}7RmHx1mQb&+_2zWN zesYCUs{P_-{3fMRIMiP7#~6vjYw}i(*>WR7(7JPOv4UUu#U1g;bHutEnHiAz?~9(u zvbntkJNVMPG?Br*E0o)8-}q=|MH2CMA=kZn@XPF3y4N z$$q?Ja4mx349bn`k*Ns65S%l$H5<7s`vn%`RJyK#uaqo~@LWmqj8P&7_vKJV&6r;f zOnNDlClf&EOLmN~#GQsUCJXHc3Dc0L0J{y~)T%JeEU|?!2f2u2zVz3)RcB0R7$;swo zDyX;?c=olNK`^uDo4bUk@eA=xepCDu6cTYuYqp7$jf}27C*dB-%XpS$3B!kKzStzR zG(Iqr$Dqh1?N-~SKyfoYQ*UTqQOYE9m5e_xWp2F`eGS9K?_a_6VYL3`rhES4Lh<1E1`tQUtu(`6jIY{y^g|M0SjpUsCHgA_JU;Gn z8Q@EG#@{skI1)OV%(jI#ixeAigoSaeXGu;1ge2(GSEjmulH~8vg?3sH9%O6I{24B+ zO7Dup+%C)E$z0oeQk3A&?(X+L$@*QgnWUnwwlxuaChrzY*@YCCc^wY!6`Dm*cZpLj zZ_pLUx=ginE|XrDthEQbnYkCeNK+!?qcV37BC4+%=$H*P@5RE8T!Dg~QQ*~s!9|q5 z_tZjc`h=h6349VxLmV{+To zw;cO{W>M0Ndz9_YW>RcC53snfKrtmzt4(>~y?PS#wrh_cEh|Q`I;a$=R4GN{Z1!md z-C1i8bhVSBQiw?=Zej&fj}k_6r}Oj>&-4@ZaVlbR-po}&{8ul9Mn{QOM^%M0!*J>2 zppW-0Q)+b1KyE2v4iXvezB5Y4PR&u&cu4IFotDV&vO_qZvq>IB{a$;@5Ff^RJIC$F zZtRA?zSG|X@||_Wa-O}8MJ+YR4Xu-PmU3f<8 zN8bxkL{LDO#Og3>9PrxJwYm~Nk@CHJKzqD+ldo~MHlRGthC3hUuKDJ7{1cnfdmW%z zZhAxT{-io_nYtnE?M--e7oWgJ!C}yz<}D?pu~M0qT`Oisz|=tMI_(%nFVdAM?WY9& zJAoweoKb`GK==L@fAE?=|2Wp+QJVjbf_}PZe!1~)rVJg_z#kPLWGm{z7U&KHde+-#9VZUcysbmFp4 z?dOi{rybkf?ri-b{_%I>(k!yv$HCuDZaS`7JSskR%?lR50B~V!4<=#owVAem_k%}; zFI^Qz$rS=*O*gprBcf4^Qd-XR=dGWS7WzfAQtR+Hx4nMs!zmnIcyKgWh2i1I*XxCa z<=wV5CK&Dxp6>FhNnH!;P?cXfu$0KH7!en!X3r>HjjF(qW}>-=?z1ETn((>6(uNNOqcW7B7YjeK}3xeiKSu2e{0n3{SXQv?KL65EuA{{ni?goSXy&otL;z>KrT?oYC z|NB(lra!DMUbixM*)ITQK$*WNGO_Ntjrs!kU=w0BO^O;y7te640tus$$Z-&8q*5(c z1)3doGWWJ!IkPq|IrqqRx2_45yv;f9V~w-lZcg*>8qrj!H(1V>B90 zxwEnrR6j)8eEfi(BkJ}3m4tQ(vHAEe4f;mP>q54^=|=rb)ZQHhO+qP}nwryMAwr$(CZPZ_PaI44NgIf`O zo?%XMl7n|e=87Dc5p8O1Y$Nm+zpr(_?fM};=5O8Z{fM8@{h6E2Ha2qceENA~Z{6#1 zaX!muXM1Ja^Sl}zUA6mFm7mtx?QNXkd=-(`>+Jq{ec2KE)t-&Z_ypivJ8;J4Q{Pv% zi~9r1#~(aH^SK>3vj+jwdjPI!*KYy+1qE(n zyid0cWXb5u7KeV&#|zum{6C#C|MUM=chLX4|DUbL-h*PB`}|ZWU8pTtE#_E zD+v_|K+pt&xOI7Xed_mBU1lXNGnbh!f=}J0%X5=?{@!n7GLp^AjM}G>kNI=_-7Hix zT9?)7AD4Y~k^B1v1dn!C_?zmj^!faK{l5L&#Xr9NubcnAb**&rvbX*7>+iSnJ)B(n ztLbl6_Ko^{zOT;-OccK4Ggrlx9_klWdvWP+;x!w=@Wj z6-7p!ZOe?YV_oaZrA{NN-16=#WM%rCtDCHbqnUB8BUWQ0gN(2%!ZbryMSVhJ$!QPH zcP~f9w`DKUaZwd^&r%l7Q&vYhGz!XHL%LT+uBfv4EUUP7&IwSwYX!DImFtrAi`+*Azf4<3Ws?0!-vZGBOr>cB6f%riB}{B#<0nSmO(!T7{Gh{4NPh zYT$7?kksA_fIF0oMX(V@L3x}j*pBg$5Obq59Yea?Y+NS*T@j9c0Rm{ibR4nCPEyP% z2uiq#O#JF&XqZfL?v51e0qa@Rb%I*ja7}D?be4t@w06a)L{sgRYPM)-gVd(9o1z)2 zdp3%L+7_i%M^r3F>9jpK_#*TDBsl^1VM0c7R0qS`2|ZQ9WQWbqPiVP!f{MQ0@uZ26 z6LuobhX+L9R|ICl>5MXzhkvi#BU{s3=czVUO~u$iJ%wWd(sp0Y6aeciRaMZlBe`~s zQ_8(bPZei0A#OGMo*4R!?a; z1$+=-Inmm)Up`q4n2qBHY)(@hd1c3D;=nE&3t4_qiLyJ_Offn5oNKcICA1>8C^w$k z7Xb4pJ4uR6o9)&xO~jxDB0+c47xBF%IGKe~px!i6MMj(j<`LmuY2n0xR3`vF05n#PUITVS&J=#>+8OCK8f1grT0wb_(MgjFoZusKxsI<3 zxk?bIX>+#IV7&|AE>bYMlJEkM_YW+o9vBw3>9kkvdqb!W5RIgXMMX47g z-x-{(S%};mEtaJQ_UK8YQC9C$`B`k-Vkte5 zq~qkh*dD4wc-m<=aOz6qS8fx8Ef={r_%Jni8%MG<3CAD0_3W9F7$-aeGJ zR_HilS;~{x>J8u9oJf0Fo>v&JEp8y)X3*KMOtHVW41Jr=zS7)!FbKp8_3!DYNZzGs z#7EoDh|Q4s#AJ3l_Ok$BBXOCX7wR!)mUYz-psuPFlu+r7SQN+p9hMDVD^Ergsvkrc z>6*N@yg(AbR3=$RqU#! zZaiig++%GutWT2KTBO%xqiqfv!pWj5eCQG$mtcn9UoXK96fMyHk*)Py$@tprZ}6SA zDg1`mf@7G>hafe(M)`Y;Q;wS=JS8wd=z(G1z2hbY+Z#D zu&q4{010-h>AwNra^(GO=~2 zK`D#LZEiViz&?4!>)u9h4djU19fxs%>mq(YvxCC{t8=&~lH=i*H#%$S6!zVL+hKnG z^rGrVTB~(Qd7ipmSM3;p=>-$BPg~=xDC!Zi3%Ybe=_0`R_(k&n&+e@BHyLZ3lxjE} zq#1^NcNtT-_nBmE^DRoVE0Cb6(m01PH`$Bn&2Pw0_S89wjQ9wgl7*ir`x|K26FZgj9wXMX6@>9XB48_Z|pM+~0X5)};)c-VHuDoCJjP;qbyg5}*6g z0)Al?Z*MJLGJm@Cz0ryMC^zlA-}A_!yrrLKVWQD8INIhtHAvu^cex1jf}cqacHvfb z>@7pbWzR7VVv`pPFd^=V=fAf4uLN+Zmv~{75n(%8fscjcQos{*$(Ea0JFyV8ccUIi z*!^3HMPYs^&3g&*48$+GMVL|IIf1WuxV~+?P7n(8J@B@)(06@e?WtQYPFLPxu6wXU zv)?;an^6L+J_1cf=p4G`f#4Dv1$$IWmx@`7yWw}j^*DKMqU=6+O0>5iop+fUue?hN zKbjeGqpD@K1ixI3;58NNfE86wL<#n$pofa-X>x-p4hl!6@CX;Z&@X@)uO%j-Rk<3p zn?$cgJ7K*4o#B<1e%H95^G)+_|c{Xct?uT;nSj7gHObrhp;C--*YFHRn*5DThlzNYpdq21d@wD+dXpG zCCgp}N~yuW)wGj&;gfOdl)=~@hWDaMF7ru6_DY#_rRxLD)=|g{g&d3Ba6^W&Kr_S` z%TS7qw;~38@oN1`SO-tHS&LIxgco#`V(BDi;M5k<8Coa$bqapvx*y;Yum04!mr27l z>9eF4=q3Ne!Du?;_dbMw{lA`+{~30^_3`p^@@wYR0%mQK=;P($AAAM5_jcgF#Si#P z`#)aCPceV>MO?ZvbL#lL?JP{R!RP1xUR*4EJZ9JD;o;_={B1J)3?-LK&o~a*?9U%e ztjX_tTm8cR5YPzypN<{>`Okm;U!V*A|H=Qd@hD@MWBBLkSsS}MnYpEHhHv}jBuD*w}Bl!K`y#ake{6l_0DtT{J zc^4zy8jVE88g8BWmzPy_`ak*Uc=UiYf-kSP;$7@e6nA=^p4b3Y07HAXdRt#dxqCO; zKpbF~XRo>Lc0GO0 z=IpEYZ2&Ly_S-&ppSCD`5uy>Nas+j4jWD(xi&*y*%xde~G03cW z9FyxxdyLKC;EtvBGbuOPnUMBAO|e%_oUeK=-tY+F%UextnSK26e*oDm+a{y#_h7Er z>Hy)XSmVAxv;LcS!$H_}0CAjf9eqK!808KKYv*>Z{d?fxEXsE4P90 z`}D$cpY9(5TN)9GU!=-C-ImGfiXQgjgRSG@=r~xqV)?FY05yH?`6W~qNzMW1uzf)K*bHssz$;9*U*sgQgjCW5TgO zO))XKrP2} z6^q|55Hp&V9k=|{&UB2^mpuou?ed{5-jteaKH(UCt2|R+8v~^(?2JWv+cJ|ZjJ`26 z*8Xu2gr`Olm-~XmJbEBUb*QSe-iW&jy8}{J9Fk#aG}Dw^@?-KTQV}WgQUS{HR=0}2 zv|ewEE|-*Nn8>k{2^1uW~Sm{F^PcU$O~g?4IJkTcqEG zMPgg_(i`_>&ttn4UmWYXEPlf8_a#A#zy}U|#k_EtUzm#1Il1DdQOhhlZH`TL)-Z7m))k;@XPv82Opf3j zv-O~p;8B3Uez#zSGx67L2PbPB@>7|CQ9n&gltqeB%9$biHp>dd5Fgy_Y+UPcF-d3B zWbrT>Xg2h<%cwjaYnd)X%nm!X9r0guVujHYUIKIPP8pO4!Cyu?U(NWKl44_%*rWIlOm`hg-rA+`sM##D63z{XC)!k*Y3IgD6i}``_T?g_7Wi;# zLuqrHL>7=Z=GPQWqeSbeuvRQq5r_eAzQJ|mK}77Q6Eq@8g(46ysw`$SIc2{MF}0}# zy`LW{#t%4Wi;|K7W&hsFp2j3^tKm@;l{1OIBg?r!p0yhF)r6A~ntvqT@p4xE0ogmR zhXg+b!sX6-mfPiFhLA>9ADtsxTa#RN5zX2E@^x%7#t`FCNdYXS0L>|5mATF0s`Av? z3~MHQwB8M)8cnX=QZ+PRmlme+j|M9^K-tJSA1fk|&3xjY&7hOU68F_w5~5#3XmOz> zL<98_H_7{YS!C}uL^MyV92$8wgy_r2wc$nn=y9yTVYWm{`PKC%M3En`dny2QS3ze9-18ph!hwR$F&6ulWAo0v@B*`V3 z#W$7rmg^E{C%Ve)QLbnm$zu;AM0QNuTD)e%3X%YQ#eo8FWe3(;C7Kc&aJ5|IHx>so z8usS>%9dufV^PHFs*r@htC2Js0_)&iePQnCr=+Fhz(%&(45^3R`E50jr6RVw)uXOO z9Loj|xhMFbsULVcmf>{T*o;(1srklX|%@Qk11>k?p0@eJefo%ms{Trw@y-sP#9Y|#BHNzxSksuXiSe^6Q zo7Cs@%W7y}ELYmGKYIp|C{<24$EkS^WNAw@D2JfIaWa_6bu6`KF_PBEfpm^sN*8NA zhzHL4nMc%$YDRf8E|L2HCk`2@yT+m6V9!)~ZGM|(>8gbzp&l(fL; zXi-RrLugJ|9;`+n4>iVnSdgqNTlA`1Wu!*Rq!0jrEv*PrZRj+sP6eD$ys>4t@$6#_ zYnsTQWfV1ZF9@dV4C`Atpby8w^;%Z4@+daqHt6_7{ni@@v;bhgy=;LjSqKF6+I~Q`O=?k;2u56K;=>%oVWCHum z7tKzzo9rJ<<90JzZQ?1Xz}r4!#Pm}))RFv-T9v7wX{mhsUBODdQfwvVn73EetL5$lz`bR}Qpl z+g)S2CB*5}k|mKMw1oWBl-$07VOPPB99LDs7<0dAn#G9!6$8jLHK~l06+v%`AT1%p zjL0GTujHEy+>nty z!2=UFj-CjEK{chfjL5O?J<9&1;2 zr~fpJ4OgF)KWxQ2Lfh{0c*QVPapCDd>N4Tay?$#Sn9>B#cTQGzfI!?I;4MJp@$!Ig zjbE4;5(caCB1L_B{P~AA2`rTRh^U z&H;mal=;IsLr*!I&m;vjTmtEr6m(59b7|6x-|7RK^Vl?MQ~%AdM^ zN{-?Becs9d+j$uHUAd&G1L1ScgNSu@fV6NNJ@SBi8yypmRpMX0AdVB`4$7B4Q6U;mr4 z&>-9$k&BZi?!NcmGV(})%zc7RsnB%FD^mAwy zF-{hr;cXw6XV&X?EIWAN>EW!%Hjp9aJCg^BFqtT=JWWTEyf0Wf!Tb*P|S352n+7pDq4A z`|-vNV`zUL$hCH_yV>O%RgHUG<92tWFnpf{fBX4`e)eC`?fNL+*?RngA3I{`>i#+i z=U(G$cX?XPx4+)r@cm=Jm;s3U*1GU`a1t6#PRP0 z4wXGKj$df%mmgav%m4X^oz&7u?!$i{%Qm^F?9M)FrplXoT5XqKtYI>Zj3WDB9Ya!! zLi&Xdw4umllFmV>%QB^wk1kKXPXJ~c$VW1|HFZZmCD9DU4tf+kX4GyFZvM|81}_~g zrr|7f@~^o^0>g0b?4OU$33Dc=d5oEd3tk5Bnn56#r|1TuFYGyDlIt+;|C4?Q1}5KlA%>)w{)2%mkwxN{sQ0lrou;2<7flJEuGt`WU4;VlXi^G(6tZG z62vTmU}K}qkso46K)c0)*?|nLG49#O9#K(0lPL|dgw!a?AWMHt`OIQ-TV~L-g|XUP zAmvgVZoCG=nPJ%Zd=!YlH6ld7AQ%=0zaTTuig6;3!Hpz}ypcp4Y$$WcG|9p2q?4FH zWmJr8=SAV1Y&MER#93xP`QX}v;d5(*-Vu`_5qa@U$+T*6L>_|(`D~FS9{JA@pcTL( ze#+Q=dnRk9@B2Zxj6}d5>J1@-4*NYyBBaO!8=@4~oX9;?CpRhKbfFtkTxZx4pc1ca z@G3R~kNqL<49ys`38#28dBjGO5}qq7nkqJYL{wFOCx&D%cvXpI5jh%;oUxi<_;@AB zqa;XHcIKJlp(hl)l((G)C0R(QizU*CE36SEEK9^zr*MFbMI~}uG8sTsCXpNS)UD{h zDmW2ooSgb9ggDD>eBu1_+;%F0 zb~Xlrz~O`gU`Y4M94D%5a}+z1m>08rh-HycPziHzWb!Es6qn-IL(GLl7Iuwk+w@2% z$#&DCLQ(>H1kM>FLiBBY!%Qwm+ZwHgq{iYN z)(|u!Av!V}>~800OnONolDPyP?Hpvr>0ET5@(OOA>4*c$Ty&SwDy=3ikXKLOSBw$O z{UsjbGNl8m1s3a~#%Y49@Z=I$3o5KlIhap1PVR{$Bz9Y&yPOTD%d>MzF4-;lX9+1> z^7YGABUPo^hMJiyp5+4?>r_RjD2X6t;fZ`!)CN+#GVkrV?r8s@z14PmsPfZ@&WXhB~k({A-IBrqQpCl~wI<=s@Fv9pE{+CSq zjQ(=oGOW%bMCA+>m=k+8(I9j|4$F3%WkinwsO^OlBitETF6$9S%a?vh)~4(i4VZ{{ zt}%_MNCN6B(@h#hGtM*=u|}bgttT7iPCS1GhrtG+s^Jvsjl1(?(XMbR$>UOfGFo%LCiqT!#p4>uiCQ zkkQ`W8Wb(LOeF~BQ4CMVdQv8H=O(`#1jtPe?DJTtU(Y#zBd7GpQ=#h1aiAL`&G30Z!X*(U3%wlcsRSm@bNmiZnAG zPN`W8UKaKfYGE5!F6@L~r1Uv}n)J!oxP3IJPNXu$^+vlQXQNKtw4U0@M)r9#w|;pj zs|c5(778~EepYu0GN9?=VUdNU>eS|rLPZ=T_DYovbJ;TYy@`BW0AG?OQOE)5ww`d{ zv^1AHIoZ|J1nkO455Iz4qgxD+{-H^hS!tPVp|~|x(_*{M&9mNb43}|Q3F=v6Ivk5X*Yn;p2*a6^o!IaZz_=!&%h7*{v+nH1M+T`G| z*uw1<;bHmcJCjw1p}FT>FyO9qsBq<;*OjI?JU1%2J>qZZWPE5fT^xziSh}kx@)bT0R~{BLdogYTp#vYeF}@N+j(PqBcLso*rl80Qs43FbX|7gLz}r zvdr8VRY1ERa%FTV^$0^{ux;WY6Nv^k>yYyd!|2yx-Ixq14}bZ*SLpbR{~FT)7m?E` z@=ZXamiBVP%r~mCdlR*npZ*>8=Ah1-&hFwU2-k8MQ z7qN{&PIbpUW#DI>>?uCeWdK-oy)GB0@B*3bJR>rVq2$!?U77f%Bb_u;tCVS7P24GN z<~q8nGW}^oM|+Nq1@(*TzO2+iR;OXGH+&X3RQ8WF?d3W--`8;{m}=0y%gM4pqYjtn zwB5Nv^BuV++egQ!SMb`Ko!EG17ANQvu(UtCT6r6|EivYL&N%u-D*FxG?)Q~cgKd_} z@>*d?uk;F@hBe=w8elVMLfuWhZ`X}aj6j(sK=et2pY)%0*{DXIT6-949pJWab39X3 z>k~lkLRpefc%kmuobR7^8l;>xi=nBUlD=EU5bg7_uEjT~2+=!{id{61^h}>3-)pLT zqvIE@eQqczkfyKKaM4;>4*JucZjYXeu9aNDrB1v=mjpYPMdq^vNA?hBVA=^CcV6|Q zN3gPOrv}JEn_OlcTN@9|z`zllD^D|0LqcWV+ik5K><0T4?Q1HF8>SveNrVkFIbBF zxyIUBNS`t+MAFklREY7}sYg~;i9!yWg(rV6vN`AZcc1@YA<0skH4x{^1hvJBQ_eazNp4YGH z2-go40=6Ha?{%Z}6N)ikuC(b(?)&)ck8YJvKl=lW$&Z}YSEd7D4j)`sHxj|=_wghO z%kF~&1{?^_{i{p_SkF7(piw2O>0a`vog}xRwYAnYTs2k%!Cg!%JR&SsmXI zuB>fkZ+WY>Cm%llMdQkMUb3!&22QV?YKPy(zSl%NYcG={%!!^~UObprff@pt*-$T+ z?|A?-21W*9Yj6>EW#y=s%kNF#1U9$u>E%FtN62G`D2(%ZeGY}GO4Hg~A>j4D5fBoA zZ}k9*$>+SsTiT`Z2+;lEy1r-k!QV2xc%^Y^K1WpLzr08LWw1qE#YJMM`18Ld<&f&Nr zj2P#;DDIorM}>&ZIb<^|@Y6Mr=yyHHLzXzEs>qH`z~^~K%JGui(Norsek!915QMh` zc`eZo`7HTkpbOF$@xs+=PW~l$5%)$!aCokWU>=7a{R$?U2G9aA;G-()?uD)}RJ>QT ztJne`^UVNS_&&rYHN@i?lh1yG;GqCfk9w!8`amRQyw!s@bf~0cc7sYr2UuAVg>;32 z1{rGT?L`#C+3YZEePv{5Iz#S}Q=ygFxCQ3U7{7+csKK)C;cCw(sl z`|b%AvRhf_2f2>+5w)2s z)1xEKS9mmH@qI^}#@mOs^z_33r?x-bAFW08nEhR?J@l}TZO0T7^0!{|?pJMbS5FF{ zMCMrEM8z>EC5LK-kK?tq0(%7o)(FoG7z+Y;#7&6X`A$*5RUveVURM|C5b{hPD4$^W z7JXKn>|s@~#RZ^d3ZT3#8&tEkqX3<tlF7QSse6>@m#pUXI0Ygp z&C6d&2-#|LJDIJk+~OSoJXR<%@OCdS(IW*b7^=}wD9;EOiwj_ZH{?dn0tRHm!w=-G zgKP!`g%+L{#X=+L&dSm5vRud=?ujPP6}N$o={H8i?YFk$AYHgrkW%x8XICF2EirNJ z2%tkN#eNczq>uvSvGsMgj>XX2N{FwjfRO7Y8xP{h@+CdM z74=Dkv2cXN+~3s=n}ve()Q(KSw+_kgdu4PE>Aq()gB*gvK)1k5xWmIimmvHDhFE8! z4!8vv{9Givp1KL{naPfpm|TQ? zs9Kt0H zhMP+>M=yy9gcLwCERywz2Sz?$9Em!Go`MD7r4mY3ANmAIL$qGd1f8530<7Z+$L68_ z_m4FtcMCk+J9~Q8XJ`zQdKJM*;AkuOe@*}q`#Rw@wwVYRFi#|UdMD0fs|&%SEQS}* zh;~6QM^+!S>~XP3JR(0eAQ*s(68!c5%uD%4Sho2jGsEe|pzVnyIc^T$@FqY`O$3qV zH?VnXgxOqC&nZX01BUuBW3QCr-tqfwq7w;u4KE3r_Y_h0YdZr=zpJ`rMj|{lMcT}# zf?`&nS@6Ct^~*ym2afr9#MUxU1%=k?%WpnN(JJa2w^dN$*o0^@;?Y&saR`v!51E)k zdb>}IcAHD_fn0!xOspEHXa>^7=0TbB1~482vmlI#f|yaw1fHJ}aB(1JN6+@*oy&|*0>1dx(S z`}e`iengs3u(k{1QE4(E>*Y_{jU^rZj~h)YejY=*R3?;6k}H)$ToXyP-c!7Qqrl%( zbkIKs&&tW85a=70RfqkmP${5x!N5#`hPJZnnAH2f5C(vwWHvN}%4nsqq$CWq;LZmhh=YWWb!(?!*y}3rwK=mZ9_8UZj*}G zfORMU02Q(>=0bSSASlrcm{^dGhu)#|1Rk?HJc32;5lmo{cm`v50m)ZYbyZh)nVU*R z8e*goE*$TLUwr;vUgnkZDp(bCuAP}bb>XJ+toOMWrARTa{Ed9SpRbko@pRWOCs}35 zGp~HD%p zgv*rjcX{9aaFZ*%tE8FEG}|>9J^`=f)Mx9kn&z&!=9;p$rY^shS(&#UzE zxH`>Eh7RI)QK0wo6i*Dzf>v?JOAGIi%$t!fQnx&1-_oR=7M7+O&Xj5r`K=h0`z^*? znOS{igL#-K@p~@9T%C6FAH#ZWg35w}pI^|=6VV$LpMvIok_;KqZJ?%+Lt>U}y@GV8tOD`9~PG*{%V@v2)ooV@9% zj%PmQE`dB}p(I!AR+I(E?O9P{CkMBn-%>;0%JX;*d$?lOsiB*=}$rn}6 zVZ~y7W$#1L2249z_X_bkQ#&m$Ss*u9P-hJV?lG7l8kkyzZa6E^$V%3XJg1J-w~1eH zGrTYfdNH7q9!D8LPXi!ctlPoX5nWYbCTeIY5ZG}%vOPGT&5SeEcbDjvbB;E%B7MoA zmA9T+<^CLyN2D!&CW?_QgdxM9giYR}%sx=FC}KJpYm%L#PToza1?m7uXna`sIbR^H2wgje-u zD8yQby?0Jp>!xn6UF?vyoRJNcv>ryvHW-4LzjTh9(IoCnt(fSpimZHV&dXFC1MAd` zm$b6Wi0lNKW?V7vmc^uNJr^!!P!+*2Z4Kv>d+z9vtky4+Ig5INVJ2g%2V$m4rXstW zrK3gv4J311YK`(q*qBj)-kn9X%bb?!Y9?)@AFizR@!bRTRzL;3nY_JA3u8ItX;B1P zq}AGOsyZc5G2h0D`_6`07TQLf*xY*Jo^U_*K(OMlVVu_{} zq?SkX4(jgCR!>}aO?6K$c+gfR6-ln5fWI$GUT-bzsdHG^a%0%>o@N^vD{Xro$!r(4 zNzB+v$6o8-|8Sc4Bng@>qRG-mal1IXLK{IZ*e=OSrQlDk|9S&VyWv(oc%m8ppiCHC zVL+$eP-#OrlUa~eIy)O5*j4IO)n_@GpeTfYD9VdC98aiJqeN|5%a*SkuS^STJh;>3 za4Wl)Y?c*(a$jp=v{ODe&G6hp(FRHA$%OKvQF}$o78i4RwbO*Ax+5~w1e%PLKyV1K zb6XeKbt%bgjkT@zc?R|Zyo|t_q6uGDv6eT678_-@nA&8MkvGVS5So=3a~m3`F@`^$ znEjUazE9}|{I(RZky*Q&HZKzOnyL_`)hn&o-0n2pDm%>NFfxc2lM3sda^tnwzokKl zVY1yCh42n`YTk$tS-Kt9c03Q`ejP-UqA6A3K!|mkfvdFB6{{VBpYe6CYCphy9c~ZS zCE!KCwiN8O?<7{er4P7{>JpP&>A6z>)lvHewIy~Nvq!=w{7Ded^iNQs${L*o=m|Ia zc0*r~QeCx+&r=WO2AerZsUUVAZP^GsIHi0?Wv4R8d_$syy@=rAaM|t=HnHL#PHe-F zmfam5qj@U#0YlfOY%b*QY)VFfXS8c zS<6|P)FtB}Ou9=XAk!FUQU>b9ez}rw{~%um_Kc1Cd-DK+)c)~?p3mF9@ICIA9i+|q za~bFt!u>F*CrV8ovloCF-e7lKs-Mmwmf;`^!lZ*5mta8a+u(zwN9TfYI zd#*dpIpL0@q!@12OHUe-)@=SpzNsQ|)NMK3a$cz_JU;H#0P<_6pj5#;p0S_~AG-P2 z3O`$9z4Pz;pcrPD3~}>!1NhSyroK<14gVFlf4R`s?^@U|x%_XG!uW4iXj~GzZcE(T z+O}QFHEb@*5;474w84k5NR>(>TfxBe?SUPPv9S#_qK#MSPd%w&+75c0_YzNF;NM-;?XC8?TG4LOY zSQBk=9;M78XdwSpIl!cXp(K(47{+?qotHQS*RKf0y0DoOR)-fc6!VIONseven*#>U zoDmuCZDWbzqFC=WwDb%%9x#l{k}?4tCIuxPjKK=L#s2J@Lk4Vu$2eH6z-)KPXulC& zJTKn**;B^YS(13!*iUHC(eRXvc>H2S6q-ug8ZZ;+tP)s1z#Qu2k3!hHZ-NS7D-fhx zaJN)MMl~U8T2zY|9z|V%lHm)F8^=pvu_Hwu^f4LA@}K(ql4mpoTa}9 z^FU6Nul#U6C)`(bV)%}kegEdQXvd88uuGB4pbL+}-mpK;DvQe~p%b`k#E{r}pyd;# z^I0sKw^!)(%Fe%+I)~?>e&kVB8}|^f0>XBd1BrMrpQkVhzSX!u zlv-@x2ebha?>W-L`@7%pj&xQ1msdV6UOwKu{QYv1`@`Scg9}1GhR<61+piz-1OG37 zpF8#^Z0nm_kY$JxrJOr+&mvXjOY4eRhql(v!l6^6>r2M>wzvA+o&?bO z2uro9Rn)53L$TC_R8&c+DPOc_`hU|Dgl*Xaq)N5)?Y7aXlq-7`fPpJ(lp)o`yw^os>A?nG8;3rS0%2q zAmK52!Bw6iQv#AW&*xi0E<6niQW$oE-vO&+G{ADg3RdRgw}g4mnV{eKpmEdGh>Gz` z0Tro}&#p1acViNMn;CfB0vU-G(g>++rd*gCKOK00o`_OB&9>qqJHX9~DW2n$V!mxa zSoh&%mz)J;`(^jfiR~!{4 zN5upPdDbJcUjQGYK)hfwsO+5si!|7x4ib?;7NW@Ols@Xf18RXfG7Eu+ zGPI1B!1jYgE+dx8R1~^aTP859vMe`}Ap1<;D2wA#D5s_rph9>Bd6diW%e?qwPz|{OrH;iLs zUKiKVR|jd4(;Hz1aNCjPqU;>?KRw3h!gRjkPhuRXl6AE~!Zd#1y8IrQ0aCUES?@n# zQ-v(_(|x$Uh6Ndy2!tZQx8R}AT1*IVGo8j_QZe`}o#}MFy2f!fsXe6`U#m#d7Io}I zc5V0-x)~;+wuUj)WhIi(19DTqC}fk=FknHk5p%kThItjnJhHu>R)Hu_?B5B}7OLz{ zl5yLHW)o@*)2;StmjQvz*;5#{>xpV|8h1V1CT4?W+KnD;i`&jgs$_CdMe@4CNPLtK zsG1uV`8QxIg17aLy>8g%jnPC&^$%b|7JI z@FC^F*_`L;24ky?21VA^;e*0pCapwpET`KVvan8~Nc`eng9<+Le7)g*x(qkF4yyM@ zzs0B#WbkrCO%*;y60$mUa$9dG-<;>+ibs3CT`q`4fexNK?&kNs*;ANZX8O z-BqLwl3fH?XXCn&F6=w(-vb>iEabAY!sYB5;AUgE+lBQ~f`us7va?aR%u|f?BH3II z*)|{P6r=5Q<(^|IF00{`dw6}K3;=IHkiQ=rCFNL0HX$R)&=<#4MtL>Yz&@nZGLdWe z=kFp}W0YR}cfBwr|F%QowWly$A>RpT?G4;)Trk)-YZ;yjw zRm15hlPQZW=QU^RS&A8|leCs_HeOxXtx3B`!gM|RloGW)*n!VoTN2L=K=Vqm)pU`8 zc_6?}bi%3)?xWUzuhDP|#=r2q;Tj)A;?4~i`fcXgTO{Hdcu>v&P@=DJf8H{{5ohj0 zyn1uX_vvz^@=24Hte)I%>RqMduS4d2?O;!wr$V6W81cE+qP}n zwr$(CZJRkkC95RMlS+Np^A~#2cU8kfSBgWgbR;=1z}!nOpZw0k7)NE1kG3&rzpylc z(x_3@o%mHrtrxcwn(AALjck#!t_*%KZKZ_|u`J|I2!r;how_w!2Cp?J%EQ=RUD9@VE3X=Rx%s~+E0U9Bf%ub=ZC?hBEw_YED? zOJGl@mfp!Fm&3AJ-9;{_?<((#Bz_KV)YRRBTw4nr6VcIeI`|J-I2J1KMIc`$kC!VDo&$mAT^9^e#vC~7` z@V&VWhQ*M$&(|ENi@@GtQKrRN+;ZsCCcR-OYEOFWbAwA&iSNf3gU&Ng;*@rc!`-Lb zDffz0!;4Sk=sM~Us?DnMg)zs^Tal*O?MvOVS8dwKdPl4|yWn1#d4357cZT^F>5ew| z%YqPC3*hEfKWp=!n1uaw({IklG%OpgAz1*h0w)H6DPCdytN+)lLPmbtY)}aFq$LKwG^fs8o1l+c$1L~+w7~qcGJp1it z!*7`$&jQ*=iB?!wSXWd~>Mo6BLN5&w+fY^r-{Sa ztoPgM*H;_gRu(>OZC?{xpTqoT3r(k*>l>Q#SgSeqQp%1M+sj?XJMh+~iq!w?z14sI z^Pm6x=Rf~n)s6Ij{{NRPV23l7G8UDcdwT$5#?FM}C@!H&?!ZRxh(v9OxUM^*t}%eu z?eAZ*F+Zc3Wq?A}ieQ0CrcTm5(Ro4sSWGn&HT!ri*pFud^bLSCK&Kzs*3X-h^X1 zbRUCF21R#_F&&8|wJ%p=o@JPDRD&ihi_R~zV2!Gy^eq%S2q>F4Pa-i@3-~82Glw$e zvA{NBt-H*$*m8~~OK%kk%{&353l8Fr`ENpkk$yx`*I7K#m;)S1lQ#HF`hggqR9^5K($xrS(smHh&w2>cCOO2x2H$PS%NLiEPFcHq$6{> zBD8!`(rO`XsDzao65|ZT?j-GlGNVT_$iWKo)GL-L=4!YkIh;10)bT6>n+$CpcP*hT zCAi;)lPSBPyah;1eG@mO3CAZXY4{;mdcG;lJHLQTOFK-b}A^sQo#IZ4sPi0-~tJD}ifUlWsigMclFS3#*hO}ra3iT4q;^Bo7nnrOkiQRcavwe}^ z%*V8XS7=h5z2;-&ju9~L(C%&QlR41=L^)h%7`18Y6BBENOV$*((!s00C zrA_#hi$S|B-7%^viG+ECyJT)uXRZRlx!5DxpzB;(fl8sJ0voxp2Xn_CD#9fvjZ#4= zM;Y|geHw*!K}eURiDewxr;=fJwc9v=M2Wfq7lTDSOhx&(`p^l8CRat;G<929$)fIH z2K+gk$*R-?n%K_5nWsekcyc1$oC9X zP&Q|@bK0`pmxhS@bQxtRSXF$j0XKLte8h z%~Y_tweDFG7l4aw*Z2ctq29j*eBaLO+G6lV%Meg&f|cUwHBSmls!W!R*@}(+HUWwe zCYMkFEjwb2d^6jwQ}JpJ3G`TaNg)-xY9G#eG;0Ev;-GcXzCwlh`C!qQbb*8Ra=NB; z5RjHa<(Y|>k3snc8e<8b52xLd7Q5&eK>Pr7EAobr`9%Som2OrMbIrs$UF0ez*ROK$ zu!c$lTwKR(C_CJ|0l6za4O z84NtoE)ArbnexGuyV2_f-#HvB@l^Avf-b-PW0X7cAR zB$~|yl|_ITgZ_eLl(|ZY$foSP3cQBKIGd&NOCmqEzHaXDVgpz@e5+x$A2~tI9BQ(|RjeX{Dul>U` z*DSgZuWcFS1si=)1oRbg7Exkn^14$^-5z#;K5zEsumCUGT=^qiOYAT{2^DohhoDMn z{ReH9=LEw1%59lxM9DGjP}iXGH#mcwHoxLyG4&EKNqLyRL!P0xQKBtfYlm;68D0jQUh= zlMWw)(^zsIJ-uD=N!2`6TK#mt78j*9sB;5Ab_@LNI3+v9yFV7FV)b;QYOKATO`2 zXZ{i>_aMjBPn+n{gWLWboa-tMx}u=+adTp73u8*#0l*#Db!9?8dFg!8azhXhbmJ2@@+n~)Fe-xsl`S3N&Ozk@oy^l9b`y~lXJ zf*R9YKVZC{T43;_L;L2Yj#Pl%7^^8{{b;p4!Sm;qVE?<*O-X#Bu{!(tf~aBy5Ah&< zV74)E;wQ(yV55G&Fi`>X!4;aosU3_Z0QYS($n_gi~ejSI3;?;qqQDWi+>lC_0hZ}iCT zkf*N17_bsb_Z%;Hw?i?Vq3{pj0^hTmg$H8iXee&aBWegvR9S3eH%M&k;Ftvz(_r(9iWX?}NN5pqCa=O(~(-rh@V8nd~|3T{!{G*oe;d z-rAPAPNY=une0lma^CRr#TBx5cClhQNx@#LarK?=yEfkqfgJQ1!C9p+()yc7KJ~B+ zxt_Z?0vE}au$)C4ITih`^p?JB9!#tn?9Y)HnFKaQ%1l)s^3MOySgFt=r^})mfHa8y@@$&A$@)R0xsoR{vV1! z_it(4H-e6ui%Sa=NwcFa7%>tm|I(q;N_-A1w%*N?BKL*Xw533^xGRvMOdpWW2t;@+ckMH z&LGi75K%k{M2dn{go#)Q$bQ(}#k&TEG(y$0;a|%9E1|0)_!6{|% zh$VKBZIsxv3({9}!hwW`*(fjz?uGSPtIeM)syuIEi2b2o_igLTRU{zYViK4--T$K zVZ#prftLTRGyY%&>DgTYp&R-ahY^P#EAFL)$j^>D#K-3dhadvrkVd(|nUBceJ+5)N z#bZPz+Fo>c1aZp=&+RrRxB@~v5N8x@ul*9thFXPiG`q!mQ)fo-%x|>akx#^YY90LR zO#OKjnMntWCD`Mg0x1~2Rxn(h4+fbXAHgVVJ-JL33OXv=LWv|J^}38&BcksV+kSb73QUB50H|} z0b%`s2yx4OdM2t<`ot<^6K=;5UMbDCMjaoET}N*FnGeX>kIXgibp2wJVK24P~jdJXVNVA$aX%K=1k6>JP~B!;E9 z-I^*R+y7sA4#LqXSO=t;0TX$`(YyRN0J4Ape2NjyB<@+*$`^zcMA?d17U48ca}e}h zTWe$d3B*kOum9c~Hwzi8#%&S$?HKi%_1sRKeut@4W8ldtRzvYT_!ZU(*^y^Va@|qB zQvslC+}L9o!^(FB-TFW3xpmiz6q6_hhP8uMkVbZY48zL>V6j9u-!3RJe&2V+WE=a# zhYe)DcYv}*(SA)-?*{mI1oK!<#yL~#psFhf3v)Pq^wfWY^I)ot=G~C1hRE3uE4{5q zocu+f^80n8C_G=`L?hpx5Rak|@apk=Jgmx1Bi#*rK?R_=pq1!*9b4FVvnh^oP1^J#MNP-wA`M>W{|$nL_xCMz6~dAitPQMHwUafD*9GP#V#A zr-Iax8X&o#TG&Jw%JO_gl5V8_c=J!wb)wJQkLh?f*I(k^7nP-D0Yeb@?;Ha~h=g{g zZt90K|F|&&F`Yz9%65K1NUT3{irdX6>*;iR!1BIs#Z929k(+||QV6b{MwJSYdP2$6 ziMTPeN@d?XF1ZN_-B9%ccQ$A9V&Iu^fjSO=gg<%N&n6Lzl zyv2Z*!qcLj6dK}0NeB7h96kW}RJ#y`oB$b{F7}iU+AJ$H2=%oX4u-w$Jy=4*vo%;7 zXww=L^ak%lXfyw1CKP!?TF)l`jI#(5r8D@kAiTe(fkaO*rF(;lA)mHSZbDd1nviA&dT00pDc-L(yag3%(rk zJQ*(*-xpa4yF)Edm4fvlWAkqyWf$xtmwn(z$|c4IlKa4y++~U(m;0cLQT_y<*AN+i z#=b{Dn)Mm-`tRWn*zsLL#iZ{eCV385bb$Q1S2&KN#_Iu6Or-APr-^@pqq^$dxgFT) zD3;%S=SideS^u4X#{G$-XVfE-{z7_piX*-d%2t^C#rQ!p`=#~$&h7glAFZbK>GoOu zS@Dk)XK3mC&Dh!Qeja|Nx&1!9&Ujtr{d~X9#B^<3BxmUMxOnMgc}_|nh*h=m{(RH& z>KC&xJ#f8uK=IiP%uU@R&ynU0%;S1UG1JdxAxt3FHnE&tC+<*S_pa1;lKmYm9fBy5I|NK8w zf&0Ji|Nn3A|Bp#+X58%HCQhw6rWI2_PYm#a1sIJv;E5uDbFc#hu-{feWa&dtrRp<8 z7_!GAtVeiEF+5MW>3G8g;yi;sqkdz)LoQx;y3SlHCgMjTs-sQdy1qHDN&kK7sq8#M z=!3jeh4t}u?*?7I{>Eql%)`@vj~qNK*va~O*dy;F6+8dy-&eEyc~GGSX;1P6I=dK? z>&^4#`}h_0{mc7HYq`}~?GyklQiHe6`Tji30{<6Q0e=U2{`dSD!?xR*5&|z6&QNS& zok=D`FzPLawJ=9k$|9b{5E5^yn&%}uKjm`*vZyKTA};kn?Pv4?Z;0p26Lsp%Wos+G`Y z%o=U=d3+vG_0-nWQ>zwd3}GVKhH{QgWu0;_30!w%;GWd>n6aj=!B^!9obZL{HCIc; z9nr}PhmU_;DZcVMp(~Bb(pl7|oTX2&Ka{6_PWgy@8yPbUc>p~@^bqjElzOJ^pwC-t z-nSl!hVPULuqW5*v6^Xn-B@9%HS=Fd9nx#(&a#l=(qNDdD@dB5<_tOee8mmO~j|>(TUE1o)Nv!nAuNNP|GL>*#h?2WSKQ@-=N9JA}601!2{2Pti4zr4Yt8 zqw>{i(mOyx!~hA|#)S19Zn_B)507MjL|tdXkx5%(i|yMq8=^npz@lKHurq{d`j$ZG zQfH<~loksL39Li%6C|Pz@&gz`5!cRZ?ltkcSf8vgP8cM!^YCpjPcM5o5X=WkNF6kp z_Z+>-ZM4H>dldu?IHQ3j=*hBKF+>@=B(-%Rgo$i?zN@HeJcw-?%NEczOuwogEvcP4 zg_UECSetE>&Ixa%N+vN2@U)+f~`cxFQ{xRBn)QYk%w~%D}g9T zBJn3kd_Bpd)I}Yp6q@T~j-`XT1Txr+UH}7I1=wClHZ)+iOL@Cpd#F}a4s3crNvHId z0&JBIa|(m0a?o5z0;w4-El$yh#bf(kiCX}0T3`%Dy-lb{F77J~hP77`*`Ej!lR=iZ z<$Y*q(<3oxthy|hFxeNtYLBqJ$#3 zo3aGT_Q*eki&Pug7?wj+Br2VUKqhkPq-7L3jH>{P43+DX0~IS#%gt8HlV@!47=2U+ zCnK!9ZNN_@tE9N&JnaBB6PDJe{zM+7X%ppB-C{<}o;?D^J9p>}f=v9JL=v3ZBZ<7! zG558MS;6+yR#Joh;J%ZAMo${FE=V%8vmY(TaaJ|Cir~VcmML^GPomj>$4qK)jARE| zG9-*kz(B7ov)#9|#Ad6ypsIlUoCjxHcTS_mp_d=RysU}*K@gR!UBfbPFZrOx{(^AD zmUv#4tIVfEY?c*BbC`{hvg9`$V^J{<|mK|FXmomgql*CdBKlFQ7k@4U#BzH z$@1(>rPo!SVN@BdeQB(0X3s-q!Z}r9_x-d+Y65d&nrD|=IhOF@D(g;LSS{uF{+7p|npTZZ@1u}hzB-J>^Ux~>Gf=fb! zJ~ql*mDp{EAZc3eg~eT+3t|2!?`jq(tjKCHISw|~IlHA(a&Nix5w892JYb}BU$0_H z6Z!<;L62*wa}OTB9|6zx;JtK_Cw#YmTlV&nAgdTv(Qqt?EMmD{B1RHm zb>ZKvY-MP$g&L_xemc)m+cqaczMxh^-hf+j7${{%DIxOkO7Wct%k0^M*TDnM|I=`gB?p>D0tt zxd55MKPg=NzMH>*5oeB&$}b1sFPSLeRp^*Joc_wfy-bks94)34MsvT^8;r-1@OAut zE%cA1E49LI(!=#6u%?QJaPSg?g|5vKX6&C}A`UFQDKd>%^r@LA59h>|)rAU=TJ<2a z)!Tu{G~u$WG?%rA*`eqZwqvsC2-d2IoO*p<_Wq9}J-m1ZFNTwaU!!uXghTMjDyO-y) zB%NN|Q;)sZUx&49V9IlD>r^O8(g#$Qb6#OHvDXg)^r&yVOf53Ip1{*0yuJtXx*T6% z(erJf0-mX1+eVT4dV{cMzT49TZu!Rm-$~;G`_Ba-n=cER?()$)x1J8M)a{Ukug=-M zMaF=bdo7*8ZpfRj2GN!lT*hzl;dzQ#TY{GU9{X9l~D5<8Q=ihd%Dy6M&dyR&vm;uoG2G`gx>HmKtZnS6fX5OX6+d4s-n}JleWTT%uAysk3HkGw9+0{{(f;OAE*PbCxxCMEf{xnW?6$vmUV@T_*!+Bd z_Rm${=MYkLxq5xi&m16xs6B7qW7;0?SiaG_zdQi{XUFY-{$Dk~{9paQ7l$K;IQHdg z>gM|P`s!-tx4q#8$LiaUL==(jgyaqoY&0wsPkpf6?I;Q7)EH6o4goGWU^nmw=qA@4 z`VBq+?*ab-ANU6x{}%|eqN1~+!qWr^5dkr>pwq3jvc&ZAp{k}PmtEi_wC3}3zcbX8 zF(qfa>$RVKg=%}BG*qt1(u;bK6r+p{pcGu%^28hC|rmUhMSLxZVOQ-Eq zP+3;1tLmbvEHczvercWmkYnwi# z1AIEgF1E=g2stJTl^obeuE#F)>Ep~QxZ^%iY|xZdFdP`4rZ5#{2J491gu&;jxOtAiDhLx z{4EhRL%9}Dg#_+?hsQvW?zCXhO$61v z)Xq!O$U*#UeK4zaJPjpreDQpY{E8?RO+UeY;U1Jz@v*r`(3+{#Z&nSos+-&%EC`WlAwVQMWQc+6rOU&l} z)k}8J33GMT)DjL;cGN~62Aa?oRjKrjg5vX+?8hF`x~#NPA!eg+L%-7#`4<$_M{}Zf zLB)9B%uWcK-}b50FeDk}B@~@#j3z2ozKQ>=`8e}Sq{)?KQlwg>AicFNl1yLdF_4B+ z$kX(w_;T@dA!{@-G2A2~gVn$yl{}`Nnqe~WW#cd^1u8fO4eCPKj4{93z2y*S0I`di z%QMT0Y`FFW8bpnm$!4NYFbuV4u~Bkrw3gD7F=idzU=KvDPY3E5R@2*QL*+yl+FIVR zq|g!2R?Z3Ot*Jth5_viIlq6c-@*_h8W)B*)!>oE0RKXHSeAZ(C6P+f&hLn&dAQ}f+ zSqjHVX&t3a)hY3MdN&@ysLjCx4wCJ(TyZS8i<1h4{%ytW@PZy4f2Ls>9axy?kgoWKwd8=Uwk+KqX^jp&7D zS)oS1cFQ>H%e5gn#co_H7Hzbx*`@YbPPw^4(~yLRra*_jY4V-z!Le!^rogRe5ZT4q zk}@jk{MJt*h6-*YTBzA?KncV`9^2fbt?Z$!^wj$i#@UuV9NoQ?9;_ zs-517t9904YWYR^T;@R|idE*6Lw6A^q-1vcpZIj zI~B=Rd9`d{soKplUUuf?xuvB}>x9I1E27+SQqZJnRGMN6)P!kNH!92EXGin9MI7pC z`&=YdB414|1Lrc$=IuJ1Go#))MS<%+H?w~}C&6jm7Z;afEJ+*b{b>&Lw+cYj2 z4^u`%$k}SftGUmxT4mCns{2|zwZ^H}$X>Wv5o#hiLh{R02gKCBhulf8c1gZj+2;uF z`~}v&Z+=|SOa4aO**zsiL)_3O2BR$W3^(g^HQZn;G+i)O?7ze(7t@&b3q$o17iui7 zERq0P3$E<748zDe)Z=Uxo6H$6GRryB2Iq5`$i27Y2=e2@C&xAM!d=C3&?Xt|vOOfJ zjn%;{s*|WWM7_N1BQ{cH$@0UTC9VSlQnzG*c4g-g?k|^>6)HnHu9MPhM%?z>BShv$~Mq5L5f)hM;?4HMi5pR zc<{?X4|ba*cwvq?OpQYFqu@Wr(G1BZm>p{A7J<42kaKOZ)?D@q`=Zr7%SzFVt^(zx zA&-RR8l4T^4hD>2YgW67YPiQr0)@h=L@jjxn0XF3WhglYASfAaQvChXZJyYpk~0r@ zQ`AU#altpdZ{05r70f{~#vA*Wq1Kk#owV=o0UeDCuRCb(nY_6^XJ^j6NviMu)U2|j zt-L!vugkxmIj>rKq3=5HM>ed`TZ^1EIlR1_=j<%)o)>6#0PoL(qAfPsI)T^*c&vS? zwLJiI@7+Br!i2yw_}qz=wSMGUM7bT8G+iJr9edvNF#TL_D#6t6$8%v->$; z9~r@r=RW73dp4T}PQqmfR(S74^C$j)kZoet*4;crMuE4)X<2$W@1TUuoQ~g4>V1+B zvmgR{U#s#*R+RGLPdj|ApqUIg%!|<*Bn7U(nAlcq_6!4P!Xjc?2*|jMgc3u&2u-77 zGH<>t!*@rc@VvIseQ~^zS%A-%Ja9>g`#(#jXfQjH?CBsfti;lRWLSA16d4V2Kp;;~ z5T@H8Pap%;E7*}R+vVc(++bLVNc;vBj)&6e?r0DvB!U+n*uI@k_!h0+AoCDmW!~Cl7Kl|b#@;h%rZo&BZlm3A9kucwjm;MiA(c3XsF&2=S zgcu2`VISFmc~J>+eZHjBsmOrKLR$Mo!H=IM^cLe;@V}cN2PiyJMCh()BDBYN7HB}X z!b1eMJIP?Rz1$-UCXS(EZ1KQE*4#smHxoL?BB0ux0Jor{&OqXW|K!5hZ>VHFej2@Z zjTDRckBa(O?2Qo%P7*}?!NiZv!a=;}u|Fu06Xq#z0zCAXCP4E85}EjgNX`7w2|bLd zrV;m_V%cVJHhAcYJ@qqI=@@H$K$Z~24~}wAS1Rfjzq2*+zI{O2SoE{&wZYQ_hN#2# z>Fv``2uhIA9Qj6)L^9c!^Q6tO_%r62gBc4yaCg)RBm!2SjN%WK29gQK(1W$$&}JOq z+iKyEyU0kU`0b{HdB4s?1IHa#qN!D3B~(A?3rMWIFDMiX zKF%qX;KKmr3fkg|nCE`B;XNys`QN_Dg`Dev$%2}P8}sa=HQwW3rKrdb%!q}g9Pg7{ zpre%TiwX=zFy9CI3l9%+_e}^Y%^WkoQVu~b^5CN4={#i&UQ*z zgcji!*Ews}MZvU!pBhTgE`l>f=Rs!I>7(r3pZS|GEevr9(MCn}hsfx$mRdjzrgO>C zwX}H#NWULJRC5O#r(P-P3i*#G)(J4{n1bRuzKq167rEQ*94T zR>X!!33D|*2`AwRzoQz2d0`+OTuYU5r>v(xluzc(CCk@s_cqTM59UZ1oP%Y?7ih{>-`Y}%_-1gA7jTbA-9F(jfZyxFi2Jm?jx42#cK%*=f{upTe7)cHUxN;x0DJH5(XKn!{= zRu{6|_Py4AppjK5^8aUt(|`W+{{xz^0RC!0|40AZ;fNrOZRKuc>}>pxaqx{t;L@$* zV8@eHFyt@e+9`nM&GAo)pMB8YoehkcBN8LJW&+z0+9miCxGwVo?b~*`2fiCd^5Zvr zfDgV$r&m+i(b3^yl0tG+bS4@%ZPMA{(bYq^q?sVHnmtUA@({d>2uR=yN{@Otri=rZe@^UeGDrS|)q`wP&1i^5(SDxfUH0Yi)FX0M3!)nz^` zl%WaOBb<&pQ)U=H>V`Nf46*UZMTc~;I9)zKaRq1!{KzUC3#3f!W-kgGiw}ROY8E`> zVDdl+Le%a*3v$raX+6cuEW$vy$kWU&`3J@zjVc6g z#8D9z%pkjBx)t7>QFhj!FIs!9hK)XPLpURuG{|XxW6&a|*A*LN#o7Oj35gxQPO~RW zo0$Na;jfZ;wAuWICwq;GC`;_NP$1%kixu1?hD6GHw;UK8p#tiX#sB)uTkan`+f}6^OI`|Gm!H?}PUH~3x404p^d3J77hd2uzJf{J^zKkpo zYW}RtxZmmFuz3#hL}3Ky?dTaL1jnx-1juUOEZ#%0?%;1q`#MF2oh{Qvl4oVwT0vlN zh`173w)snhgv}1%!U_}5_H>nHK3p=~J(L{9sx9r0ht=e-%nd?YmZ%rcEi}u}>^uKS zlc25HUQg62;4(>TGfE^C0cE7>y37sel}i?Ph#v+D-6L;=hcUr}M+Bl{%v9NAswl*8 z?C!9Es5bX|9qnU}!W?Z90QifZ7S5ZzNZiybX_s z>+E#69szMK(NWoIyK}SCGn5w7}wF4=c44ta5u#CM2G2*TW;xD*z zc)+us%|9NjgvxI@`1W{GIRh#Zd_U>@Y$)Q0^Fay|5+!8^%SGO(ICUR+sO`uQYy|mG z<0#L7p|mz1u}GJN@SYDQb6z4~GfrNs%u%a2JJEW(wc}zYYn`_7WFiNPA|tc0b0g67 zsGFXANfwcp`0g#K7FcUAm8MWqd%ZGRKEV@JxO^NuEbJ+2F14?QAy_tpQwUZaAMvBl zX~ddaNwi;Iq5c_~5zJI(4Y`BxVkY<*2$+UD0yINw$yMA)(q`4F9ODvj$mv+K&dzA& zZ?SwxvxxK@!?&Wq1`M#bULkCxU>v3ATSqIY-{3? z@t#v#_!ys@l*Mx@Wj0d{nyzLf{^pj+6un)|@)j_CWduo-TPUKP;#zZ!(eGi~dXzsL zoM@xb;y6kao0BV2he)5k-0X!}XLT`&)GGzi^@)Ww zj5pGRm27|koxvS{if4Rfs`Ct+kpz>kgDikc1^1>$pkZ$0b}vxPJB2Z+H8kqjX*e z{So{;7B(I3wMHE@F%sh>4mBNN*>u3L?$Xx7kAn?OGRxg#PA@>AWXR?R>CJLc-7KT- z1Utp9gD!1@?+{T0Gl*1G>UElrW7Ub5Y~c)7NA#%^JVw=o5c0jf{gylDtQ1KLSKR9* zcVMgK(*$o0HbNS44JBB4bBa{Q* z8TyfLd4!^A@b91lNEi!QO+teChf$%`co*Q57+PY25ycrS)c6EqDYW@>(Qfj?caEr=Fkb0W%@hNwuR=<0g?A>=eWxkkXm)zYw`AWF0|asOex8@Qv*K#%aMn}_AxysU*|^e zx68*RMvIy6Q8cL-c0<`cDxB$=OC}@ zKtM~YIG_n0nwTQ12V{fbWOc!8$il$x?4=?Y>i+%V z`_fzi@0NzjEIn+P%-{FqYt5E^M@Mb1SrqOA3&yK!HsLX%8&^I2s~smYe8(Q>lx`AD z0``-TX7~7w$Pk>rU|;EzTcL-_G+~wlk7*)GDkrJ7e~gtV4z3`=uK(SV3-BE-3Bux* zObO5&CeQnJEGZ8?7}mqNb#O(FFz zkxK5U{D&O7^ix9kSb(J(VTcP@uHk8DBv51mq6m$Bb?N?aa?^m~dgyopT6z!N9B5KX zunu3yA#sAB1ar$nY!Ka;+?o(+O}NwxNd$w8lrTToN^t{ia-`80(F8W z0_~R08zFBAN<^x*HYXFG4ABluVw@1V(`#mh4E^FS1b%fj5A6_w0hQz_1 zTU)5tYq;WEcxY)gyuPaW#Ude=ABOA4gY44F6$5Ln#7okF++a}nW>uP{v14-mM+ zTwi#wRs!K~aFdSoBK{9LZN+7n9`54hi=J0K#KJCqKv6}+-Vo>7K~=+t(jjW2(A`0R z$7i(`U330nioEc=jsW7$JK%=M+qW|>a(0T|usQcK^pMOmnywAvX*hnn4!iokdM#4) z82R|jwc!`~^EjT2_QEa$aduS%&;3EblXRAWAG3rB=~a-Nr!aomWBKiRvMJGkzwU5C zSJ-`FMu1|YSG-Zvov)y1SiCT_SpK5b-dLiv7#|z6uQWW!*imTd>C(u(sskd7#bgOx zDss1^5;M$)DMz`P!Zld@s>wgDGL=Rn@tbWa_XedPHp+D^qb>4`ST!sanV;6^(4A{m zhat(jG0Gge_Uq?|??o>RVAB1qrU~VQQE+;c!dS9*65_l*ASBD_?q*#^kA}E$Jbi6R zCVh*wh$>q#(eIzVmHE~z(BIbo7^}N?ga>KZ?(H^=(eya`98FwIu$9%DKU)my6X*iy zNKJ%REdrajSQaO%#9A)KN_sXZC9J&j@~O#x&m|*7HHQ&IEc=HI|G_XNn@_M@4w^G} zyIXu5y5sIGT2<&S`H^#y{s5sJ|AQ2#Q32#psSf0tX$(9z>j@;d7Gfy?+AnfhC{=Sd zSz$5An9mdB0Q!ei%XpRNX9Q_<1A6smC0D+pZeG$i)pbi!vudPAb)#IP%r%p@&x^O3 zmZ}5IEM0K5L@kCKW@71Xz>H#3_iJZ7u()5)SePcX#hx}1W-1q^**@dAg;rstV>FH9lHnVE=$)%viH%wchOkM zu*ZEI!mYd*Dc}EOybYcXgj6qe@ZZA;YJ=Q5FhoSj*sH=h5+Un_7|~Af1_O1eaeDwU z^b!)bCoPW*-dF-D;=SBg$Ys)RceQ3^$M?YM=<2Au6V&XddWc=MP0c~qMpB>XOLl}OojraX*%hg|ZXDf^EU7Xt5D%%mhW@S^Og9|lBt1@(! zD(kL~AM&0hXh7yC2JhB=2Vfrhz7sfa+rbm^`!|)h?ZBB`%Eda3%QiEvn)KLSIV96& zY?{oN-q4*NU`u-O`v2_0`_F&=@99DV_=EoM{jW9izyAMcYiU+ymNs>Adre1iNf(Jo z^>3&!SqX_aG7txapC2POJ_*9B0Kt%Yuo!f6T!3w;4TmPr5jIj3-?af6+Ev~v&QD>#M&ApS|yyE)!H;K3;dA0KCY2>$P z59iPDPQC)wWSXfaQjhodI2V=jW%^s)$Hw>h^yz<{n(yztKk$}YrAil#($2Tn*jPW8 z_krDq!Q)Fe%@aNj_s8EOVsdYJC@P!DNtCM7P{y6h4hxmix@k*L-pWcwObmZ)CVkd9 zfnGctX6^+^3>D+$Dt+e7_LhFAA~S?q-v zFN{>qAXqdS)kGo&Oz-@*1QNh?CGyTOgS?ByprhGCP{867xByx}rN4v?kU^x3;)8dG zf)W_5{QBky?Md}=$E@vv$cRNYb{?oUrtfC=IKkpguuS7DN7fknw)@n!&&*ep8Ib#e zNSkKV^R@EaJM6Hux0R!ceT4%lXdQ^+j^9=KjzzMF0U2b-{qC{|kHf5TgqhtpU1h+qP}n zuCHv{wr$(CZQHhOo~m=I`i{Cg=}{-$xs(5ytYptu^6tHoy=JKJbbgVHG*)*CQyzmo zZ?_g_-ETcte3xgW_F^yeT~*aaCw7@}F{`n0%cvrRx9VrZW5Ptc;>qMK+j)Rdbwifn zVKlV4NU`ARYhPnukvyy6Zq`B|5iOM;XZdMS)gW}sp?HpWnuN}0T=`rWitKYK)R10A z&QTPuRz{wMhMCX9`92tql(tW>ci1zq&vEOGxfLseLkQ<>TB0CRcLl-YL*jgvF1i9e z`ns*w@r>cImBamt==?DjL4eu8S%sY;Lb5S-5PVw`xX0 zXLVs&OqIT3e{zIUvS1?>g?Kh1Ib|rPe2ckEVPhkDAKS;4bhXFre@pF67Iceiwyr3} z;rPtWn&p{m$sDsR8sZW_x}Fc^IOS6%0dV2?P?O0UV$ikB&9ePLYa@cVf}2hhTY`ym zOQuyZ5xa3}oYF&A+zxu5&xS?kEC5vEoKAPTM1a}&AeVlyW%dV zpyh$9I7o8Tl%@DS+EChs*z!rO(B7*-dlLgYuw#>p#P}TdoKqqFZ4+jvDS|qtRh+Sv zbKybC9O*-B1kx8PZG1~Z$JlyK?}3$!@r zJuh0FO06Va?1+rHRKsnJbHZK3*K6lS)8`Cm{%ZHPT(H6agSjRPJDCH<)qEyTU14)9 zWH^F>-J2xz4j$vnXOk)G;&`=StKbBTk*z^(5cKF)k(+jP?@D1HPZ>J+bXOuh`v+rT zN7eWuA)et6!KR!Ax=5Ait0ZtkHJ(eEh>#y;p+=bqNjc5Q&n zwYHYp?+a-lA^x-L4wCBmQ;eq3f&qDSoN=aJe#7VPw`26t%9Vkoq2{bE3WGcrB-ve2 zxAN9Lrs9UixI*A}$Gzj6>t$~Gr^Ysez|ur}d}q->HO*XWyb?EtRO&DmhQpcxD&}9O zphi_6-q?z^DMy*Y0eMyBe1$f(Jf+2 zWk-)ceLsxp)Px%YDVK-t6-TG_c{(2JPo+3^kBE+pljqd1I_fV)sK(~ZkBES!XATSe zA1Z@NIlYriqZ?+l*D=~RC1(y4{)qYvk@QKh{63_H9#a<&r}8oY-QfN(y;YPA+4#ko z6$fapIEGEV$D6_m?45BGEYBX>Wq}E)+QqWEuGOGD0*~%a$@U8US6TWSQzYYvb}^36 z-Dq1XAN!WROmb>MPNrgSXB~ZK%SN9Y~IqG%mH*)b^+`0t+we>QY(TN|50vtkcrn*uJgIb z$Ou}yCeGXW1ztew_3?pc_-~Jix}Tl)c|pLxXR!G-Mn(4ySx;|e`}Ni7=&7}q1;V|) z{$aMB@(Ktu=xR|sP|Vm__^T?LjfRk8VgzUy-ow2+IJA$uKzT~W+JAXHc3ch(`%R#| zAa@?_E=q%)%l*zSpa7%6W8_q!OiS`fMY#pnMzhX%G1z z(0--^*kU-jLBP%ctz)s>4Z`egj22^eU`%o|im5ve^~^3BC!aHT;3s+!cg*6#>carG z58;J2=`;8w^k*2*ezwl;&UGF>gzrW+>ivd3_y^0_jF!IZeScO%Gw;J8xLPTmIm-HtOobdeOL$Y9S*L z5%e@IkT$$g;>IC3BD*7Y>P+Jq3Iu)8N|@o#JyH&Y>BaSeMKA{30Mev;5xxx&Mrp|M zyk7z64k+`Hx8yO8B5+=r=DZ4)1$1Z&jxR0zqaGKoFB<*q{l_s|A*V(FFRbtSV*)Tg z;aL$-1Ee0j;RXN^+%s?*L9}iF<{7L3yZo^WX#M%|)v!Lmi;9Av8U8JS)d(UyASv-} z@HQ(HE*8w#4~b4;1SWU(Fq2!ckqHAUt8g*oEEhTyzTIvT6LLs~4yNKBEA(020?X47 zX;U>`+`(Sf5(;9oE61wt4-6pnbh?0tL?bv0ZrfZqcAFG+T6R;Up{sdva1Jq;izsj` zH!U%I*wI=m&YVRXSC)U*Q3xEDu;Jt7Imd5Z$_-Ad5J@pBoM?q&az0PYYJ+lQ6zkfl zzlCl7^3n`skG-S#eEsTZ0-}s~P}>2X1)C^Seg*38*?>rlgK%t;f>$R|X}`mO$bJ2u zW7LD{1e8%VZPWvV1e<8s@ogZUX6~2Ll@01#|Z~7d+M^bVS_;bAMVX>hPeOD>mkMTczf9<$T-$cIulA$P{q|RQ73s( zKFWvJK$_Q90d93kbPplH1K|T>JU~v?D(#=^gXcp3A@|3aUr#{lKTe2mMgJbI;s8A} zhRUh=bEHB|L!EmfxR~l6nwC`nG3i zz5w_IKhOQp3ur#U@QaE^U&Q>0$G^nBKcH@*79;=LDgQtJ`Okm;pG0B)ul;`m4x|(4 z1kr-&rBq3}(W#ZBRXwWc8VtH*{V8<3T|{HxTtpeS;8qHaVKI);35}_Twxvor^JWTZ z-)vT>x=8^L-{<2WZYV;jB795^oeoqJT-hG0 z+rmb@kdQd^a%rQSEc_%Z>-46weDp(S&CU1jJ@)-}1q7Y6aOEWA^-A0AVxMOjQP9BL ztGenxOq-0h2@pB^yomN#xuOWkM@iY=_|GsQd&5{cPwTla$#qq9ht?_d;~dx%4!T-F zB(38LW1CFiq2k~?tYLR1jo;Bl=^gi_>E$jn9K4kXx~9|6jrm8ps~quBezI|#YDjG* zrg)K9BujOfZ0C|f=z>|(nEbIbk1Jsi1)|Wr%*AjiE}M$V#b)?dw!|Vu%Yk-v$7?kp zq+qLDkd2A{Pp4C;6qnGq=3TlXyVnqqJDotMpc)sL1ak*WY<<83?#0fDuG40T_QKmz0X zA{R#U2FxiF*lPsZaO+sM4VU5&(Uvc^idm)}Tx$^~WE|vy{Eo<@riM!vNo224-Vxic z?~l@6?q;{>br>J0=Zw9Asxxu((qTxp_7ACkGHh4rdQwbrqJAZb(@3|5QX;83%mcC* zk))c|M5o#4xNGnAs132AHc}H_*VOakvM+`F)-lM|g4VN;)Cm`D&&F=PuO{@UwM3WV06qJ70Vc5c)5VM9@ zDv8~N(A7|(t%q33xQ&xPx=f$1`xk5Hapjx3#qySy>+D(;RM7PfT2bDot)&v!CXCZ2 zV2qN&vcs|RB#eD3o`c}lmhgLXe9OdBWFxF261|MX3k6y#+2V9e{j0I7fGL)?Zn=6s zA*qA&_||F^8s#Fl(%krTR7Qmow)C)0J4Xgpw+1NVtr|L2Gn|pVTT}EyIuAp|BZ9^Q z=ca|XFzc0~EELTqnSMuxm5lHmX7*B=4h(&ZC0ct_%2}5uwi82_L4_lhtLSg6^e7s| zNaSl}(Q9Q{g1y*y5OiQa>QXSA> z8M{?ZwHqdM0JBOxzchz74tR`XrY|-T*F1QkDO6yd^O@)H1kn1L*(c`;RU znxnP_B-Qn}GA;BAbN=xSZ{ncd0D;fDDXGo#d+N;EjiBYl3X zP7jBqbT6xS@^ii?_S_Jy2EFLfi=4{B_-#ZDGRZ(OoJCnnr?e&pmqVqi7RRkVx5Of= z%byzFW<#D_QddB5d2lHDOT|fBN@fKia8!AD)^h~8nPofv(w2wy5Xjz-p`As&%qZ{Q*UFx3)K$;mU z4f!oEsr#}wQaVeT8k^DQgXz4-{XnGL=fQ@lB46Z@Y{^*IjE)smmOKCiJ8~|4w5_|yr$Y~6qB5_+M6R~kF0Nxb(KBrsAW<(L{!q=G`BFi51V0vl|*X1 zWW}A&^?wT^orAr$<%u#V(A8!~={;cU-1vYXHI1HarCCqu3nKaB?u6Skq z&iVLk)t1p}_UU@7n9Gd3SjTN&)5z zd4cc`;GNK*YUAYZv59}TVS2!+*B@Cc@o=W=ZsTm|aktLr2RdQEI{JdCH~4{@?MV#9 zsNZp)_#1D|bjYvT;sXYA|A9y2UErhXD)7;%_%yEr(rdcmhd7t-F{oh3-0PTl>UqxGXMpHK?GK)f??VOl8*+QIfO9iA*bDkHcxQ!?%WHYIdlJAf zZ{*M$%DDO64jP)Y(cG~BINakD5a@^lDN?tD>OcZlc7gpvYQm+aJ7F-wA^2}Q(Xq&* zHL}o>8>Vvo;_UAju{;)@#1BUMUrMRvK);wrt_LW13wdl?##+!Q#BYe)F8xXE=J@Wl z8la9}kXdYEWfT;oAlBHB3E%feFyv3Ykea}Obw~%~I$%QIU;JDG7N}ts2vAZm&<&30OJ6Af0Hpt7cY`sX$8Qv`6=(tA3E8lYuN2mg8K{ zhx!qpBB7H}+hv$t0Z4;y8i9MHg+6dBFOv#J7Qsk^eWTqq_7F~GcY4tKz!zT|K)xA6 z`{=nl{=iVAv_#@QNa>DmXhKd21D^-X1C)-SYVHXb7{SB;;%iT<_d>r8+sHOQsw#hF z9eFYzvk~GRASQPk!WF9iHRfhW5{WpteEHW1g03*%K@u9|>gVR?ZWP+h%AG(?U``YP zcmDAeB@Fq6_V_y1puG4iIOskXOIYChJoR)nk)Tf(;OFk^^t^<)5MPkD@w3I;H&J0h znLQDIb+~x4f>=+l=Rg1X&wu`3AVK^;=l?l(_GlZ}6ARuJ7VmRC zEjFMW(1&l^NFpl4qO@a|TYSR<;YWNRk3>hv zP~N~(7#2VM`5Bk_*p=3QNb1DReU3jDZ@;_?|8pX$T2)@{$Fz;VS66NM@YQEmrj}ee zZXls^GVt)%?WJD@J?#P!Mg4bY!oW8$Ooo5*x6*&|_woFD?jz^H;Oyh~Pe9^L|EVsf zWc8n+^Y{636(}l+Sv(M(VfO z%@O#ST|gp)dR7n(liWUIBrBQ93+bte7SS*W=@+-CNlLbv^gg-*pemRkt2+aI8+$Hg z1B2YM!>VhbAx%ryO_@7fPXzZ8!CN_NNijLgkAt-Ufov{D{IbOeLq)?&Y_y8p-Hx0I zNPAXUmII5H-8YajlNtBY``t}R*XYb{smw)*=G)eg2^qtJvVP zW@BUWojQmW%5?e@e|eTRi45vhi>RjPqV>|V1s;m5X@05z{Mt|)eJD4oUv}f#d9z=6 zP>UhTLsf6~86`GDte|X}%XqBVD?lcq2bQmXX~B@psxkh?`6J=R%}g?q^+!Le#ES{2 zq}xo2dQJ3wMl4&AY!t#N21#`7UPaO!0heahy0T!5oU^kO5$~Ddmxt zPeI~pnoF(XKe!c>VjZ6>7W2Cn!&Txby3lru3O$p$lA^Yo&04or>!~?cRtqj{ONUOj z`u@IT%o)w0O!I83xb-%& z#^#vn&F3n*u*%3|iC-V(>(uo&hgEg(_~UoU+I?{$ACQ)=k)d6K%xql;I|ap?Ka z7dtCs!j^`wq3SkyrdsgMYmwDL!9>4KC^V1VXUML(P=r&~7ZIj=MwU(-LXMN~Fsd5j zBV8ID5G-Qle|FC7(dNB=m!_e3JiJDCJ=8unVc>2O~_S@*3_$|50`ic8EB0OgX!)u zy@=IXFh2@K1M_3w5q=JPQX;$J^;c=vlGn)i_$N^gr1b`GMdt-h-D~UsDiRE72o5ZT z%XE5^z>(73wd#J`-8H}-drEg?v7_~Tf%nrpR@4kBC7;HbfE|e9g0nA5KTC*?Kv9oqM<5yR9S)@P1 zmz8P!G4Zm-yl)|QjGQy9;&ae|DHNl!ex&4x@_v~jjaIGAK+TA-U<9WnRDp)+J3UpD zssgQ1HFsxDI>m`KWEIDw_4b}0Q6%Up=HI}MFv(T;2UX^kdHs;&NoX&<%7p?{uxIX@)4rr1~5@PnsG|=GQ?&#fm z^U!R?Jh_+pE~4H;2|KPSo;`HL?ryw=)&AaB$0P^j*SIkJ=fR-mu^;N7uu1zZMLNES z$gt)(rLqFqFw?5nYSQEE?GBdjuSADy=e*pWPFsLBkFh+5%naFwilI~`ec0#>$A+Af zo^B@6EVytSo()=(8nwvHc6m8sIDV;yo_T>z&x^MZQ731o3bS&DvChMGlF&=|Wem}& z1*}&lm1F+U7(+zWCmMdk%<+;KWEnaf0Vfttm+3S0!4Kr*l{)$nj-XeV0G7mM9?DiWlY}zv*Jy~mDNArDVM+4Zm2IUbJ!|{7_S(`*K?OR zX~!IjBDU-D5{U&ZPKWshiY1vz6b^mQFr2**^ExbGk1u>uAl_TBc89XCOk982POO#=gz}18|_J|Qs&Yi zHa^sxn8aIbcr1qGUmHWTc97P@L^@wy0N>zT!O`< zFtg}M&@2zBZ!RQtS$#r$d#FXH=~@^ESma>KV={?-xUe&-R%c zsCvSw2-6GVXM6qj2!QZ0h%Y{{7%{raU-@3WWstE*2L#erRN|4 zKhYxyZf@@H0Vc#GcGG-oRtZ^an^EG^#IHM&1gAJYt#UQ<1D!cyrJ44#WZw_;LIBjX zHuf`)B>I>nuB1^XVge%ad!bzNZii6+096aYR|(HZLZU9JEMoLhi`M)L3Hj@%43r zJ$`8G4EithtHYh#nn#Q~aLn6}sw32v_R9d_c zdg&sf#+3c(3l2xaq=-1DkrHL$4voU*{oAAwN+9TuLlOlsO7f#hW!v6y@98r zAEf8{J3kWjLO)(LlKpTiU=5)L@d(;Ibkihhc1A^0BdM&#sg@2(f|RSCOD9i41_B&S z+@#PigX}eEFPv%Y918*f#;f2P2^zUDxZ^xbzY*OG*oB)R@cY+FK4ac=JJo>#YWGID zkbA%^L4=YUOQ>Mj!8=0y1putCh44qlb;p3zCL9S!*anM@X2E+qd{Y_bsk@bhf@i9# zV;Tu8Lz*`6$Q+sgo0Fr50(&Ls+LRm zXZhfUXQtCtZ|~kH8PFxbi#Wt^#de4jw1%<}^k!sA>bid5;?x5gKc-?x5KkB%6Z>rv z4AA(0=F#yl6buAC#Q9n<84IGqQ*rZpqF($$QYgh1@n1iL%zXuLwvI1`y{wyHZ3Yle zT=|4`;OMpWfW;qnBp;zQ5k{}mUa&gl_!!ntVmwb}8EnB^q-Eq7j)vv+kuiOr;q>Z_ z@3}Fx|5aPQ*=U%4sWIAV>1Fu+>fU?bJVDrhYufv8cy)T4pxyfD3vLGD{?S^YakGC$ z@+I&xbX_LTu!4kQQE#u6w$olAz-jL)Lo0)g3g1`;M6<*Sm3(Zr4v!S+8@p5lhR69o znPj9CxM(LlSI6iSU59e9(?60!W>DXBvhJ#V_iMhYkdaPfUcTViwm4-P971(Pe-!c? zv2q0RCKii!8-d$5_DK3mGwmK4ok%gr@0CuLjbRX`J9+^gHyyp^E5xBO9SK2z|K7$3 zefa8w3!pc_r=37J0UgW}@h4z5;6-#-{g_OoVXqiuJfdL7#Op?`)Ho`JO(wdFBHD}$ zm8l~l5iTLU&=M4sk2BRX7et{ss*OyTvEeHxP{?pPSvA@V;ZgA;l%n{?lx7$i;w7IU z9@aC}a&dEr(O!jqHG7hY%s!_Pv6^(st3KtYwblIdcYNC zh;STuT>W&TH77oq8sDZJN_i9*nK?qo$2iS(WgvC9I*B{msMrkxu#wucvj`2$I7#d( z}WixvRpR0EU5-5c;_pqDTz}JX{pU13vaM&V{_Sr7?}O@GG6rfD!q=2Jh7R zSwl_qXFc*ad@I#EH@|Qh(w$g1km|#M@ODf_v|Y|kim9>SkMQlG{WRh^c`k<{e1-ax zDts)5MD|qYq4x?h zb!NQ-I#zOGC~P_|f$PLGJtr4J(%N9huD%3u^Rk*YgXJK4%c`rU%+l*cM6uEVSi$fs zJajBF)+IlA*C2)4&7X(KQt}`%c1)U}nRGZoINk)iTA^5V-xz$X!z^!z9wF?S-~j^6 z1A~~b_PC3NLX@{L^;xgoP7tyAv`;wuO#J)&5CRhdK?k7Kq2_2gEha`Mkt`+U>6Sym zlIPjdCTetVyqjv_-}ik8D)mFh)8wLOI1Wxu|3!qqZJPB$tP2K`;0Z2A4JN_gPk3Aa zc=-L0kW+kOu856bipNrEhXPC0;oE2I4}>=lndZP;3I$>cl{dN1ETykStqpu$ISJ0I zAvhHes}l^G)^2m5>cOi?h`8st_3wf!FacPe(#4rinZ&fMi*fCyF7C^BF-L_Em#oX~aT>-v2}=hTYl(LY{6#f?L}=+qm{8 zbcf>NnjGGo&z)ogU*~~)#;{);yPJJMiJiX>jxW@1wtlZy6*)Qux&t1+Ej>BBB?&*i z9xlCke>aux-s*Ztr<#gzG+X=MjwW{GW2>vHeSr%Cf)?mMd%+4keFGp042CZxAG<&c z1|l8;fJv7UQU14Y>i_?MNB+P4|L34PhCVT|)yM1cvHeZkl-HIwszB7~K&6ztm=1ui z@+?GA0oCvt0ZGv=B_pv4Y`0dX4z2VnL`-Y;i~hp!JZc*h)u){dNPHv|`iE)i?Z2?w zV*?`(Of0nT>0y39>uVw4GN08_exf^Jmf)bj&9~z?mr=mwF~oh*XCv6&<#wKd8PM;v z--V4iT(f^R;Q5m_(X`m5F_N(7?s?j?;nDD*e=xnl`B$*fZNNw;gH!L~DGnC1fbaKq zd~9yfdElk~ZKdTR-|GhiOMofNs0mIB8K4VYH{y%^-nkg`QKTGR&giEZcmNovfP2w3 zNFOqJ<5MRrl&qW1C@NFDci{q4du!y9jXs(ShSj4gKi^&PzlNTMEUN&PY z+~#;Ji0?}FLsUq@cZ zuh8_eY0Y9Sz2}=fwCGq2-^MMAC;9IXqV$U5r`Dk`#<+um`^w;aO}@S!H!<#{YZ zBF8l8-xr;r+jK9=;fTMhS$Y+A)+2HAK_>Ilr>+6oS?ER-f8*)BnY$7&Vi;A%#RTk*kd8(^0#y%-abm*xG#LnNw>w}CT+&gp&~Zgo002-9J=lRye2zOLF(QJfq9)&av#4;+X-L(X57I7>Uo{i!_u%SLwnVGO} zI2TX-EmnrwrU!J>%~-L%tUV0zOI&}g9TPKj5-0R5N{b9DX3QyB5v{=)8*D{~ffKK80M%$$HU-7D$FBfpf=}AmValoWda)ob z8?D{#%w%x&07&# z2>WcG=|}~3apQukF?@x45&YB1jUU;EAe<%Wy2h_+OMq|Ar@4OLg{C!0H+u;!T?LkH$u&oQU z9o~8k8TzWQPZTsE)xU2Xu%oSy)gXn=wxOe>S>Gun&^c=iDv|+Dcn5SVUv6vw3bw?; zk<>`)SXzCf%FYJ3l4?vXYAf7yONUjCq<~>pnCvq2adW&N5D{1&Me=iDb?aK#Ms{+Ux1VQ&d>`nO8&XH)p5Lif*wYIbB!lYgr^2%e*2)-HqSJ@h0A{AE?p zdIt(sk2AL>ieby?R=0ec^-27~dNasQY?~)7wV2_QV>$})40s+0gOg#|-T+rhwvFdK zeNbSJINsS3fTuw#lFab~n!lAkY(>_4s$ANbvsH?|UCj1`OPzy~&bf2!1^)VK_EZb% zVeR@$MO6dNkOE2OaQ__-a}%Cr(ocAnP#eXZIV{dZN5UygX*NZh1I7;A4ZEZL+4el_ zmi%dU$@`4$I8tf&kXE?4>IIv;kbJ3tzgw_O$||!G-=!Y#b^9#cC?nH+7W_drm<(mq z!%cvhtJh(Tpt8jlPl-f+<&sUxwxW4ltpteL0hM=2=CpKaRg9GB7BFw_)g=u%^I?07 z*Wh9f%_byqN$ck-No!s3%m5U>87 z+DHsPdFG?q{sryv#?vp_UL&L}wQ$DY>xt#)15L@xk!dhwT#qN7Y58XUv`NO6AO#sf zOMH(^cu0m&k(0|M)=gyj9DSd7LYD6`9u`x;) z$L6+i{7=^De6+f}ebt91zkl%-;)T%V#~b336XxU=2YVDl{g=MJVI>DR7*f*XQi0aC zF0|=iD?7D#irxDXf+>3@D?9;MzM1nbD&H{!N7{Pyx2UR02y-^C7hT=0xTw~MThQV2 zmy!pK*Slt$H`)EFPae`W({vg-i1m<0vZoNijay+dnaxWcm=YH+2Hsz2xzv_N0{=9orvm5Z(E zocsiy0Hw~bfmTal#Xig) zQ#5c)%)zp`-);$CwxrbrXF5!R)+}gA2%-|&m# z#pyqxWA?#6V3lFo#aC3UF*yGK@q<#~^puJbA~Xi-#aC85vhj~^6enDX_AuE;8M*ie zd1u+X0NCjueQ)4|qGHdc&%8uEH(A*_G1$C9>I3U&;niBE3D{eYKTwf%rD;S`kdH=_ zMD1|S4)RD3+^nVMPBV^L_fWI78NIjqPB|6mTDr}#?=3-C)S>i6kRi@r+lo>09*v4s zUAqKCIGB;!g@07cdd6>qW8&RGw!rxr>AS8CQ_65^Rc!QoMXpH{)}Id4$T&I>Y(prw zWvXLvI;aFIr;yq|uEo7iI{^U4W}1#2C4qlaWSXR!InGCA4`p2cDAreB*vDnrh?au% zBTYmm`^S|=WIv#W(nQJmPm=8QDazCz-mOwE-Daik`)xdVX%b$>{T`MocNOtWV?+Ys*cixSY%QT(Xwp@=V6rtYT+R{!CT6?b6#+JC zF+nL9t);HP)ElY|b~}1mEsQ8u(;Cm#PAPcBW3VXW*>-2CWl59SYozR+};_uCIEP;x%Z0(z4H7r4gh=(vtf#@>=f6OwD%l{*81{ zwjSESLQg+dBM$im6$o~Im#6;tTUV*wYX0HQmlr$;TJX3p9&lJ(z~7uf__tT`FYY53 zwnyOS@PTn8>XuN~2Ppp5J##1+BNgro(qu^0kqu&M!rXImUof-(0KH$Zjl_=#FYaV> z$8pzci`kcR#~&x!dxvo0{0Oq%gY++lKt8NDCD1SA^ zZd$&{)mP7cZjUp>$Ecl$-agE)>-%i74)4=x)dkbfB149l2HkepoRS6|j&VzN{ZU5g zO=V1TAaSxA-gUs~C7S~zC1RZ6c}4z?ZxzeiQs^)-d#wzf{~Jm|cl0psgYFZh)d}7` zG65zM<#sli$xE56!!TF{O#AR}#BpmRcm;VSr`}P-u0po!hM_ZOy&iYUkXH9~zKGo+ zr6pwnh{t-wBY~@~_scUDXcY7q;Qatx$Ecc%`Y&IyhrASpNeh>rHlKwd{eF?j`i?(l zEqE->&*i)+k)s`i{Swjn^XK&r6QixWv&hH$MH2o@@wFz0x~sD%Dc1~*_fEQxxR?zz zchp!lKIY1OJ2JrgV*f4|5wYh^-xD;PAbhX%@_J|E0MSN$&j!7ZloPVXT4soKFc?oJ zY}ngyNv>EmdRC;#naaBI=qwq*Rc|Rm8^wtUGbKGGmH-L_yYS*%2k6SZ6E0+UQ#AYM z?c?B^s`lsM%W#Hx`9{)B(~&5NJq8s+`txegqU!3l5Mp<=jYHwbq%n5q$PEuJ5$iGb z;QMl9r|{@r4PQfiLVaqa803v0vmV$TzD7v6pd1_BaZfn=$NfPfD8=Jpcs8Kf3#EMP z!ph(Cd%c2bp+P}Tg1iuHe%?t1c!Vx^P+f&N)azhW{GnlfQ07A!;?bF4!9elc<7P$i z2VTB>vh#N)`RFLJ8G&ndLUU?LR4q~^TzPur{&4$W&!E`b#xUvPMtF}e1m$*Glt0RD z9xu~$S#~imQ_I)9FH09|2L+j*X2z>N^Y&j>O05T93*vSnU1e6!`>|%-L{7GE@3=5e&`M zzi7=qZISpVqEK2)*C_6V1dL4>6belf?h=KWEM_#2Zo3qf3C(tSHc8Zx1j4?Yu)ga? zgT}}8d)+Sg$7_ANX5OImofbqPX<1kt7#3dw`g_ds7JzKG)h(Mpcot=@oYtsqksL7<9fNV!k&``in^R)}OZjQZ5OWYhEfm5==wzXR@%U5wSZs+`ZhrT0s3 zQySh3`(2jt(yFR|&aQSh9UTE~XXVVOvuDpg1yc@YGmh%Rnq?c|HdH+_kxEZ%Ni%2i}$I_<(>E@ z3hsI%SNIfT09*+6%3J~knEcNX(mZTjCef%~%<}V52*C?ey_ea=H}LbBdGi>zP!ys{Z!BhMZTn7`_ygUvo9#krh#6CIY5r1f{n6GrdZb?|>PEfe# zpTc=&m8rVHJ<*uxwRpH4?54NkPb!DHwtxY1cOzcP^ggau&fDI~z(lxXd?eHF^}(<@ zQmZOzQ-O{^U|+8Fxv$KXTG}{FRv8hjTgo=E0k=(D5hJX4Bx9RpkC`&Z8y0etw<%S! zvZt+`Eq!DuMUr16#+N zEO!AD=_0X>W$tep9x|u=X9M&XrNh>V~QYTlPoG$m!ti?WbGy0uW-em94CL zmOqn*2DDPL)C;L~UNAWn3a+1A=*3n&`uEt8JqTLV7f6O+X<0FOpPtld5whH-@+>he zIEKSmpyQ)OWwpZy)~9JmW|Z(II_GetHjzcoFq|{76@RwyL`{|{42+D)IYqjQT$2eJ zT^k=ky2WYf%EB!qjh|L}(`2t*;wdJ71cHgxizJag-XbqU=?EyNy$A&&_}6hO9LwqE zuB=pwys|J!+VAMNr|8IKj3s##DXr2hLFBnJ$+<(? zMR``F4(EY`MWPM~c7&s=@RhSx7>J)gOR|;7Pvj~=n^#ly`H^|&0Ttvv!rc|~7`)(? zMOnmOgGHHS$%UpUoOH>hxpukNvwLV`1U75oQxizKYsPl}q@W)u%Qn28k%zvIb*qyO ziiIIWu%&$OoOmv;4_)Wm4$cVR=Be7OXre{U{cs@#!d?FwrKMbJ!}!Y_e&kV!*jJmb z;{=4R^iz0>%L->H@2<9K$nzCAM}A}qJt&Qh2SzD(XkW!v z%8Z+Mvjn(Z0M_7|xeHE#m--3YK(wE4yh@C;&g<0CeT72Qc9f!l+Eis+EvE%|a^uc>q0xmNpuLqSZD3C${=f~xC(ZoGL>p98W zg-C5U2EMrh#)&h^PGRO5Hd6pxmv^4oU6vI|1ClqLHsZvC7E(`o^y~u%!z;FRGvi*s z{0g#-!}DFf!QvKVaAeRGt2F142JnDfxTGD~t{k(MM3j{=L?iVKmJplgw3uBjX=QI` zxlZU>E>>7b$y!A9s&BbE#8i}M!CoLE`pp>EFo>nYY$Dx;PB84MG)j3*(+8QtGGjRk zB3`x~&5MLvmbF_aV)3LoZa{SMTUyH$?`VuveKkL}fIFrMx+DqmjG$R)72XOhj%$r8 zb3uXGWvw)r3z?WYLbKRjOgy6Hwd z*J9VHtA!XFhY+Y|xy&kVsP*rkRSQ|GW+FEEY{pvM<^L96k&V=L`F01*>xH;kigX#h zHGr$8M@z5A_7dL4C7Tx)tF!x!=jza-PU(!_?GR7EhGCpQl7gj$G^5zqZv4IsC=*lD zFJT(`3##Rxv%wcJSkx%Ebjh;}^El8V9@uPLmF<2mTpn!ir0me`$))J24*cVE)U6ur zJ*7K#dju*;@X_Q89az*(0Mh6U4T49xzR=>@I_GbEt#=CLsfsFFS70DbGC);KYw!=z zw45kwQB5+9W%^!#rb7(t?G<+s>QCz`pBkw>__pD$@w#jb^MTz}vBkeMG{kPEB6W;t zZ#gb7O2dDxmx-VhmEtTR7+M4>h&nlS{iu3Y#d;5rGh%PzPVh2{sIeMno9P>=+Yi<- zRgGQ9#nl{D7#Yc{97PM3eJNKdFQuJ*(sRkC{9|4QsC6t-bOn9)Z&Vg}WVA+H4#i|A z9ItPTSvojfxyffF<*a3;WZ)Ir$Y9HXDldS)Y3DaiLRnEE#g)-;0p zsf@LA7ox$v-VQaeVky%wLvGz<6cg&Vc2{vwq|;lUKMn#2(Gzh#0}umzIjNHGk))h3 zWz!8uqEP>scPmJE9jYS6N2%c^Zt^;gcdJ(l#+F&mbMtR@utFCRn|jb#ZDU(;o_eQg5?AH}<-CLrWPja@Ep`;n=t^xtZ(QRJq|@_;wQAvKzYX`TNlY-p zU>)kvV55sq`wkUfsG;-Mz|@19^3ysX6>)BdKJsaa(eN#wW{?b!wDh>%imZ+3R#s{g*8Sq;T(qdo96+?vENjB`v+^M;ElZ$4bN9SVtmj zJ;!RECCGF-35_E8=G2<;%-fS)!ZeWa@ZQ=CpA_llNWva^WyKvD-Ct7i{rplloZCu( z1yvah+g-x#*+FlwP{Rw>lVX(9UKC9=PYQEon1}N6L>$mv%pOArbj5Z4JhE zJRv2KJ*15M4;b~Xj?ZTQ2aWNbEOyLM`_3asI z&1+Y%vokX%xDMDnbsw`b5Xr#tR$=Bn!N*}axCjEV`68br(cHtd>2aevm~J!&Y-k<` zmr?)}%6c1dg*nq=WKH?ry5Mi($lxYd{x3)8(4z=A{^JXRAA$aRu$clO-nKk!8B%{d zR0&cad@R&n{WVZH2cA{o=(+dcx#MM1SF>}hPz=@TkfDemF$`K)%&OcV@zI2L?7q}L zi=q5MKiytAOL?V6N6v_%w;Io9saCXG(#(Iouo=WvTg0m4rSodMQi;|r`A}e3FHGTx zcw{VnFoBkfgKx`@Q{wRNw&W`dih}~cg|CL=@e(?cmPCod7p~BOus9Cr?@YjL7)+g? z4orb{2L0FJ9G;f06T>QIQ2GAumqtnw)%Nj3qr?v643Z z0XsmtH51V;Fj69cMQBJUl#!W1H(`xrUOLlGL60#Dd}`oVl=%=_H;bTY zc?fisK#M(xEg3MTAjj{1g+I9=*ymf?uuQqe0)UMUPN5<_L@^M*|AU=-;1LCE+5^0{ zZQHwNZQHhO+xG5R+qP}nwrzX+eMyrx{Q-TO=3Mg|CYgKY$zuVLC)Zajtlw1TN3SKY z)X5wBCd`Tv*-OsPiJ!_zeKpI^#Dp?o$r>*PFcpl)#QUK$jLb=6G+Pm^2qf6mY6mOm zk8#8I1m)lNF-0F3eQDGSP`5dVl~)oH-}O>SH6p*(MDSFf4U|Gx4dfi0AC!Wp9ypsGlEOUd1!yeS*b7dp0k9q$Mw8aGQcLSXQ$vZJ z1TzCP)C|?<>)Muzq?{xZJuGD24FB3f1IzreSMLS|*);pD6rS(1A#V<^ydHPKsjOzf zx8}6mFtE3?OG)lWa&}`oobN~tL~q^!LNC`_-yz#@KgG zg?PZ*2bx3!2e^xRPwtPd4-=0YPHoVs-_zPtpV2%Vqpw2%7W@aKNi=M?V=RE=4dVke zRhr@9EFGBrZ@rluO$Ha$*=U$+RYjyP#JaO8fXP7$cp7!nTr)Ci5cGxY+>1=&OqWaF ztMkczr#Zq-><3iOZEQ=D0ib(-RbJr&0DuuVD~^Y)96q0wyYSuG;w$jqW7yoNx;(n5lc*K>(jk-QhXbf zw)jL)^~3Ff=-57=NZC82ohVZ;aJF^0J2c%5ygg_zV#nCoTpwPG^!lJ#J$GhtP+tg} z;dOs(5S-0y8sV%*P{iG!$J*exSP`5TEm3V*IN>eZEdk#>f>uO?Bi76nOlRyr&*jeQ zs#DwGb(zqtj(t9G!Z{e;2Th=mGu@z0G(FIhZcO;kiSpJ5nQhcj9BabrDj6i7>ta!}V5`vk4)7L3?(e5cp1aPWs3}Y6yLu zGpayN=>f$C`o68g{TCgi5RTW15rNHrFRO_gu@ma*uQO7{ygwicG@6yIuhD=X&7%7a zJDu>4{VYC}wmOatZUNDro^6ol?C&5fFh4_V{4#{Y3A6i-(p@^@zUw=oFpj7EP`DIgCb7GosHP{yL?Z0cyC% zDGdE7mfXD;?h-i%4WIyT4K1Q^0NT@$WR#CQ!^s7~`nlKe=a6S+nEgezM6hF{SbDRU z)38La>6Be`T*R53PGYMcm4Ob$Kc9Mux9~Z(i~3!yttd~w*cffC-R@!SU;(@;DRI1? zxTbzPc&FaoTK$~d>m}=QJ#;J7`noNPGAe21{WwabUghm^K0LXt)obVZxIZ;1Z+=bwN6`RAX1{`u#hfByOZ!7t4J zy8lnw;*6rwR&*zs-xre4w6ApTivQF_bzG=KX4h6F-$sDrs#H%_L&#G%SUZFqC@Zkh_u#mEBV5X9E#PZexYsD09vR@S#m>&=DqaQEj43z)a=o_!0R9ZVN`TK zG6fE)QBL3{HVI&GVDXP&L`e$;7J~MJdV~R(X)#}U=k@?+Ie~AQrnI?eEl-Y-Cx2On zG{d9HTX87bS$dL?knQ@vyt*u7sgqUqf;+p$v^Cs<I^)l~C&uq1?0nLC1dZX&#G&R8uvmOs=0YYB&ZxdRB*u^r8_|~to2}qI& z&C%CFiN4n!NrRxro%tZs|Fg&fScRO90#%AJKd$`+XsED!dPQul3)c-Pw!T^h_7dO* z-X&J>=2=`C#BwiNx#}3yr*t4)izeyP?Sums9V;*^|TcOv0NX))3Lef_(0;gQ_G=ZSi zVNT}B8qpP(fsr0G4i{7Q#7Tb#n6wr8hRt5?K);@Les&v+vALFy1#Z7?LAJ%V&l6x7 z;(JT#B$iaOjw$JRA&-)Kl9-=9ae8}^=7b4Ok4X~TWJHSaK{n-_jTySnstc?}B6nWK zFmOK&z3SSq-Dh0CF|f61k5vTB^#pYX>})5o40<(*F2+?9`;0_fbcE&nLRNseQa@+= zqzu4Kr_F#f-Rc~rSKC}2ZGb&tHV+<(oqHckeog0~?Z_U;M0ur}+wO^SfxjJ{X8R`< z@oF`-!az}320NjmXs3)>IJVgbh_8Yf%Gxq^BL(PB% zYdNXb$ygoQDfc%RT6rrfiwQJe!T4%xb?9i(4aEhGxavV0_q#URYhjBYrlRjz7@Y{o95w0oZiP{+9)npnd>pZ6>7 z1qT%nT(+a6*Az%aKW%SjCe{dt)ddzsI)F~rT|xPhCeV0dY2AZbXqX=yg4&{r&!Tz- zd34744BS@~I-1aIbQVspQrNt8(frybF!OxBB|WTvwz2Jt>{g+HbE|l^$q_sr^V}HA z&MCv%TjMQEihg9X@^eIZs1sC&%0R->WZk%nJh3hb8X0?3(W&s-k;CJ`!bs_jjf0&P zJcPJHS~FvhW`cMM#osI@^OEi`GfAJaGC?nzOHgeML43@NaOkGV34AXRtQ^8h2|Xv+ z+?)gUj1Z;GK``mUiC(dF5R(--M6zJQ3;}26mo8{QhF0g*=mh1ds|=*(5TourrHBEb zO9m@GRL!iw!!*fbKgr566yV}$VHGvHqX{t^a@&LCiOxH6qZHfHF90~Jt}#=Q!`f$1_F{%P^l+~xpL;ia3W=J8NnU$#EqbVko9-|vAy^fu)P z6qSZX#R|*2IKKXoLRvpYXItObUWCgA+gI( zV(Sl*#zCvmuO0adn}ov=rhj~V%@YMf?@T?%ADiA>Jd;0RCfL;>l!3%6XF-RePwqjrL<>+mK>V-;j1(SJ;{TA9Pwe^T7kBYO+ zcL5pxNHiJUCNIWe0#`{a>}YB%ziEP3D9UR-=*ZlKNGjpWV12`&X$b$^sBBnA<8jPL z-&6kw$(ov{)p3BdE*l#`3*d1bp9I@o#WWV-Yn#ZDH6C6ab;j629P@aV#5grB*T&R% zY1xEtIan20;7)4TT>*?@qpLg(B^W+tI>j2+vesP7XDADlr~8U#l9lR#CiaTNm7o-- zyrOak!2p&wEvj+AZ&+|fEhf8`o$GM(4QDz!4<i!n!5Nm1BNQ_CQtPp}YbbJ_ zYN9l2nwc>aN9$t>vO*S-@1-DA7}7!|7Co++a(Sh60}2X+Z-%5o#nNSD)+um)=T?$} z>NruWY{Q&@tf(rLvv35uXEcAK#+_|U#?7=j@aj>EKNpCQgs40KfEbaI4yH~$i|<%= z#xof;O0TF?MJxJ=Y+ShhFp;S3nP^zVjp*t+-{W44P?Of&C-HUT0{_0QrcCbFxEsk|Ndo}gu@~JAOcZj(;OfJ^TyssW| z!5P(?8=ZW9du0BZm_&c#@rl0kxjv3My*Jys?}~wLMXNP@i#pZoMt9q0_WLf1{o{5R z)9jx1;#t^lAwsq{FmF>)k`pxgrU?6?Y)F6#QDjP9O7jG-|P0ZSj?D z^HHO$bhx z)p5SY`xnZSKHy?w+OevUGKY7H~YDE zxdW{mil3+9%l|Iy_Yb~b@b(+}tjmjynB8@rw#UuQ+uNP>DB#z6x1ikZuIC+a@c6f^ z*Sp9@1Rw0#Hg~e2@+d7rR)!ti98i425NPc!l6ehua6q_-Lg-gvTgL{S}#oPPiz#6{M%g5sw zv1<+05YVoL{VU{L)i4A!Xm0CCZPgl8h5GAQxD~^33hbPMclK4V(<;vFm_QuzrHEun zq}+aC{$L=tT7GLR1SloC?1)hJO+ZEuDgBgbF60)FsKa<`sJyqmX6Z92ls|;_eWY$5 zg5oe|=(g$5$nJNA>eG{E9o`sFPN{1~@~UH1O}3?ZLsh}q6qzWHrSE*^C`PV?jhT!;}T=QFrP+4B*mk|Z25;vwZkTu|w*z>41S2AN?vr0ID*ygHFy`LhR*E5H^} z;=5yCER#ipwgv6B-+Gl!jNhA7J=LTtD*eD<_)T1zR|2o$6IeY zYO=|0TKp5xxX2CIjzFp|k->MBANUu(>CQsY?&^7_lB~dug2*r&2|8UvRn!!Knb=;{#alu3<*>5xt3TL z`N6ZAtSJhr61NmeHDvMV(4v?ETQ{OM>PV_4w5!({ix@uA&C$F&E1Y6LdnNrmrX{B?E$sq+fPJzdnPpl4H#UmboT$3Q%bICdJ?B}j&K)u}6 z?Dbs&tOkE3ji3|}-sW$~Q#&{>0;pmJxtkOOeMg>=_pyPX^IDH~A2lri*BsrYI#w2w zM*l)pC&ImYBi>Pt%Z-Pt-~&5}Nvy1|vvwn)S)D!;+aHDYrZ4UtZ`&Ct8-G7|IP`T69}%Ya!K0 zeAE?d9wY7wP|gvOQh$_D@r-g(0|~^NeC%`vsv)zZ?*Y^G6ahHoz!h5IM-Iy@a!*V6_f zRn{LKGllE?uxy06z)FaSn?6x^pLL}(=UEhmo-$x(Q2VEJ!RXR%bF8B+3!#P@+V1Hr zvnP193^;8s0uUW@MC6qibIHx6n$7MNfAD8V;Puh23<1!89Et|zWfH;(Rr90bgY6&S zY7r3-&@~rmm&2Kh4~8W`x(nTx@5B)+bfKN>(GC@mvzS1a!m)lX$pxU0QQBOa)G*02 zn#QuZ%TJyz;FAWXfm)43Uxj}Qb5Yqm9lI#k89%@rdDJ`r#e!TDX3hz_)@{`-REZ{A z#i-`JVkFn2dNU@!mJm%c4^8c3$*#Sc#Je49kBDjRv)Hs08qv8N{108oT;f^UNCF+y?0irnShx0 z=}@v#kPWV%OiCz`;hOR|!6GGUnyi1F2n9#Y-@=w_T1jckObQ;Q!@6}(7whCvcXpp7 zeGOBZo~1*XuD3v(Bg|^~yfCJ!MM@FCS}Q@eNK>`qTW#AvN24bx7k4049gKUL5&5T{4rC{d=zTB_40agDa;Wo*^?isK;1kg zZzU;WXPI^CNs|Gi8xybt8G)GvRP-t|NFrTVNmR-Hn6te0o_U(`a1FH88R~WvDOt&E zwOZYf`AT`W`+BAu`{lv-{zDS-ewrN1@8Yp48s?1QKp<0*QF6ZouYDPWHS%mMt<-@@ z#`UgHf2mP+8-ig(S+8Omh%V>$^kqRTjFW~6+@w2A`~9xJ>7~sCwTeuCT(rk$MznAg zi#PL9bR9;8lO|$bKRi%T?JClYFJD~!owVcc67}sLc19A);TmF*BqV1-M9AMsYdjQX zc}U@9DLu`L5%mO(B$ox1kApWn>0}Junn-LpTeG6x#cjs|dwB9kbp1&NW#Bie9@0&8 zv!Snys^ld~h%H!+r9j09lU(%<+9WFhUrC!5Rr~;KO`~cCVDi2LY*Q8xuccVguOhWH zF@l`&=!%AN8Iuf*V}-WrE8Z*$VUK|lO?Yf{8ePhWsKhHgeec84L?hUb`ZSNv`-829Zx<47U|49x~!AY^Ea*gmE-Wr8yqZ8JM%@#Sm>4TC~Q& z4?x|D*j#*-#Pzo`*SD{rJEL57r>U~OyAvLDyE3pb=__RIf?Q_J=I+__ zip!5Vx!YD6=>qjtY`oB<@V0y14$&E2r*k^#cPB`tKG>pn!!A+Va0)cgmqw^Z)&DYj zo!?Bh-nmoLZ9MnUIGQ6eI6jXTeij-dh}UFh#0j`=O80TK?8nrO^c=>BuiiIAQODs6 zkmd|a1>b(E5e#I*ND6+zYwhg*47=toIQp>?jmn4tMt>_T# z?E|MG+dFs9eM#2f(_eI+TiUiq7`}Tv^`xbHtmE>;@`)ysn~oilkH-t~kERpG-E?Ye zrBbtd`&F;n zx!!kHDelshS*^{C6xz~4kycBMRjP%EpR~nw<}nO`*VvC{>x(VA1IFqZ`WV5lYj79X zq}B7bM3)$pR=ayua-84h9bP$zyJDk4@f(Zmw_5_$h~qlD#gj>pv{g-+W9t4Llo=mr z-4a^ZBedGnY||2>)wc$2M)2{k6cbAnd%ZtfE)07WbB`BdtYl1=*6;uJa`#~7*l2^# z=1o9-(Fo}DTHW=vApJq!`ebXt^!2_XyRU5<1exgrW zc&>Xkd$nzou?D>D@C*34ya)UhBV|7M)Aq(?%f{guJ`+?MRvkvYcjo@q+*+k~^!mCr z2J3gfpZ(4C=><;x`>nUL)$OqN%j0Nud$YSW>44LY2-n^Dy8~{&+x80}5f~OLqlRjGF68b9 zxAVH^199uN|1Ed-gV^i7MH?lIYQe%WM?E0{WF-bM&#yEm=)<<;m^G|*U;)Brj<8lqo|oqE@9SjVV3wdj zU~)*EM+}X*;rWOS{)F-bYnG#8KaF=w$DPjg9vX$)Lw=x6;TTbg$2i^4j=04H)-lo}REJhs;v$I49tS#xUVfC~jT)|D$~HGz*tTS9Iu5IE<` z0n_mxBIE7|ha;@QrcOyUZF7{U4;Aym4zfz{%p?VIeB_+MJS{GOD3_DSl4JHiUfD!n zB*T6JS;LcwdHmi8E9gpT6~Cn{^Dl?CM?D8WW(w}Bn$~UTr!NDY6rf17vTP!}+B6gm z&R1o}jZG+Am_#G)Z*?rjP7+b13?4O`QVryuqCv}iIn&tib0@RWMV1&UGln@I zpS_!NMSj~$S+EUBLti)+5NZCO-K zkM7i|&BsgCK$Xz#KsC0MLhjnv4_G&b=6S5iPi4M$G<`F?xvzEj^3Ro2s9OgdEz$L{57ZZGYzjw9kk_^yMUej96N6s-&D<7d3_fq}= z7}_oL#tuIuiq{FVr=5D#*$hw@?B)-xfe0ftr|7qw0FWz1@Q#Yu6j_7vYWd#p&)*1j z(0b5pw$A^Pxf6*lEYPDP6wU}n zc28aMLtEZnwd5EXXIhh-cohnaev!>(oIz}Mh(}(-hFNs}gpQU-s*o#aEBKhel!uaC zz>Re6#86r!?6^&|eo0qQlWiS8?TOT{oI{!TU?ASULCPHPQ~QC|*%F-8+~+}X2+q!% zVKn^06fKtUz^XG_1ZsYI#%WPmVkt#~SP*5s%t@3Jqz}4&HuZfy zEoO5I9eWlXv<2m#N>Y<)^TXx%C3vu)v`at;6Bt1L03%rGL7^i(B5Za|aI68gH*&Xg z4ZcA)70-BIST~}My?U%Y*|wxrU^fq;HhTpjug9Cyy^A@baV0V@C4wzytWx6$ItP-3 z$0Pim{#^oE9+xFB4jQHm_G$Oow;J*~n3Z`dp$0%W32#E_WtAu%bBqQDX+!xLP|a%~ zXXz^^VHk$Fa75@mW2%Ns^BTnXhmJK-J_S0?D;Dxt-#MZZxq_soy?5%4y>&7BQQgCO zxZ_lrdVu8zSm8mOfa*hkowK&SLJg5rz;oJwFywr;6DmAeP6$VCFoH3%k+IOvjG<6^ z$ejGLHx^U%NX@K*sG|og$215uaI7>U4a)7IDiRs;G(@aq1eJJFQ)d+OO?DBZ-9C2} zDTY{*z+g1x)XDJ&+-in2O5E+Fv4Le~eQ~PeP#SdSjDbt_8)iP!ngWuQ4;!5ZeRhH^ z-~)urW&)F=ni$oTlmVS%1m7rNE_3n};^Gh?7#pye#XRc=Ix{6Se9FOMeMZV=t%Z^X zxuYZi=q4B(_x!vPr1>;!h+K(H;XxF7TAcueML6cD(8T#1x&y}tpncs7&|)NX=fX^9 z=uYDEI0lYX%`%x7c^WomfhSdR<9Q~7Y6|)H4gVf4ly6AhhXXxk(lC|liG1v%@GiO5 zid^s5gr~b19Mo~D3SO|F?6RYb;fSHOL-~mzIHJNW3XS0sv~HMy4%NjmD0Nt6nk7L7 zmUPi-zw`)_5EM~LC4*|b#`9KhKDG8p0|coXN{mJH{OaWLK59!$7;z7+o;#NTGS8`R zIdk;F8;zpL33-efo+9=@8Gx1qQGP@1NrirOB&jGmDDX}N%_93qOOer(vgg_$&FN6! zu!`=;xvL4r$cMC8LUE!`oMmbuB&T(CN}F~Y+{pRAJQCt-)>It(0irmi<{>6DFY5)< zP<%4EB>Y_<3G#afN(QrSyUB7pz!Df-<*}O9n$U!8kf$(-%Iow9SUgdd2x{$J%yng9 z$U+lQ?GL%Tn@BKAqxxcukU}$}lTRQf@>HuB`tFp3TBoEt34_If27>#gj}OOG;9JW~ zO}kz~e*J z^&i7(7Q$k{Z%CA3jIXP2EZ zxcc7}lX~Vq2a}!I-E8x;)Dd39zFv+QeU#vxe2VY{xrZ5nnKcA;c_^I&YZ18;-E4eG zLPCkFtPer~e^$6+ak5sS9yZM84V47vOG8sLmAl2+KCu%#C$cn;vBktXkOi~Y+~f&q z&?XlqR9GqrtN!*)0UY89kH&7$2+ua32@4d+pPSv>j~3V5m`%4CI%BT_Lo6=bycr{3 z!~9jLkSIiM$L)4(nB4lr@j`h<`b=a4#3Hu;;bgQh)XWel(N1K%>FIjMC{H` zA3ElejZX%>=)^gGyGwJ7o%HLtAKTQJ5RA&vjN}A zTo-iH<5Pm!Mw&(*YTmNst7MYxR&bYxm@?5&H$KnLRiv#9P|`rE=&+lS}Q? zK|akT3r(Em^Z7B?d$r|@TKlFKqR_47r2_+aosnt#K4l{eKR72Ybl>j!4mCbt?!`}x zI>j5J8JvYW(}Gb`wYLQo?a}1wa5`Lo;*@&aH@-W+##S>Y7~KB@(GXaTIKzGx9E(Y%w2iM%^+L||GHaCj&o|yz6tS(z%mn%95Z_pwo3j65_kE1 zQ+=s#6fP)dvrG(^!dj6_3n6=ip>m94g4mb$k&E8iKLrxjBU`CvkT@8 zTm-U*h4;M2vbBe6kKhPr)bu6bOU(^okbL4BVcQS3@A`u|6J{S}>*zi=-P<=7dxqH! z=(l_1CMawdisJs-j-S&zlZzj!d$#lSW`ApM_o^S#^H$;4?9>*-&h2*Ev&{$i+Z)&I z<+sJN_j?F?@pI+Xnd{xq_D2bQUweDA#S#8{5z_qna&z;+{UQh-wzK)U zN9=Ap&7|@gMQ3>#-n=g~RC_%# zramAuEE~j72nAA15X!zpR5mk8+7Kn2P@!mYY9=~=vryVbj;RyLv=2wCgU>(jD?t1k zx}kB$EBAuvWlwTN#d_80dR24xwYvG0P9K6H_+h&GwYBCozs+gCI}<=29OKLTa%1_o z<2j0&4ZsuOa2w#6e)s!3(-@=;TW(PHYrJ*VE_avrmp1oz_IFV86};Rf-+w<-&3325 z`A|*G)@B&$2P4n(`@_qw*9#dMKN#V_5?crvct`--55l25#wDEEx{3g9o!!C+^FY@- zo2`YgrnTPO5VGFj5vJF1*ViC^LNGCIKsXf2Ee%md(x0CFUczGgT28lmnQ|jV0#d;RCEgPJawd`0;6$+8?3o z$x32)l`xzu`mE%14?zX;CF&MvUeJ(hW0>`+#=P9m=$O!HCTPz_{A-l0wJGk`{*>}L z4~Ms?b*#X)xw>3JB;(#mJ!;=<_1Rmd=zetwLAO4IBf^7q`>+hX(W=poVvVtKK$o&} z6TYx^H4q^@um^e1d*=K_tAVkIx>5f#DwHnH2=-PdWy#5!nF0?I{h@nPekm##!W77k zg{c6c0}ljVAj4@U@_WMx^a&_i&*>~P;t)2&LnJq{k$CKk=jNg^qnDURxL#c2Qtcjk zhK~T+f{lzhEyA(TE!9TrR2sLrQmV^)99ZTz(x`S!4*riiDG_>bq_@zlq|C?14Zhvs zudV_C+!YS+B_iu(@RcibCfDCwJ{wS;Ez?6vr zu3N_?jHLopla#|=e6aAhQlxRGi0iIKG5wVGt!7YPGBj zbuQ9(3@gz{z)qXLQG}xEB${xHDM}_X0r!u4nBN zeC8jTrvZ~t??rDsdr)07HHmdJQ z>4)@{(5s|ENa2VT9j%L-U(>7pxDF(!ifY;OK($PV%2KP;4RXJR_G30kV=9o%Php}% zv_4ZXuQr7hRa`+-|81{^YJCEUnO* z%QjZ{hzD#)M?vRhTT0@pj&Fgsm&^*xWZs3$9s;v+L;t%Vo@R@Mt*PDEe>A@jx0XGj zf|;3|%_b7+BMC4QE2MECE_quZ@PZ5B#J%Rr0`Ex(aZ6ODZCo{=eFJj7Hcig7$=OV* zJiLR3t4UI+{#PGkN%t~qgUHHhC3+#GDgx*MX5f`rn})4QAANleuoX>pmTH$e)Um)! zvGNM3Zenwaz45UCY1p`?t?y=<3zHl7%({7tG}LUeBB4Y#HQhu?Y~h(bH{~2?S~)Ch zmE38bMNNB15}0#({>1cHl=XvGjtG_%`LToAA6j1&XO)vs_7;SrHbGg;X0~)d^OvG_Lqh3?#2+Mxih>(u#25@-G;`GP zQpT7p%8}J3v?NmptU@Z+l2$g-lUb1kc+X1a;8PrFRS8j3t$~@sYHiY|ivAs>Xau5CqoDaB z=6kPO>s(TxtNM`q1X7YxH|bP3 zhB%;{;P;d5L)HCSCgpx4#KmpWJ;`(=64D9pZ&_4*E@xWMDkf=)qzR%t4pJ($y0j>E z3?2W;y4Ve(o`$EDQ2cKG;hzB2T;F;f17QtH^m_a|H-kmx$6>?FsdM>GZ&Kkf5`+2) zBjKp3x?CuoBTHKz=(N-*DC_&s%V_4fUus@x|6T0EL7Q1ldOnOrxi*uDCw z9q&_A@9=Z?cI8}-H_y7%>hVFQ`-9fhHUx-j!hzlD2(WlvaoeZ-k`BQlZaYb zbqB8GN>$`x5vJe!n<*^yi`kIO;XEmy&Z>BPMu*Z=;r!lorh>H1Lt@gMlOaOo4OH!7 zBw3-~rWg@D?ndtrc)+lE({yuLA4G5HK+`)ahHcWb*xYa;2Rs?Tj>Pr*w*QJSvxU+0 z!>YJ^EPI?@=207K8Idq+(qbF6BS{F*?zcB7JW`^rgR_^MuD!IH_r8}JmtxkGt9Q+= zJa`heanHyB#b--$6{ zwH1xP`S!e&GNX)HSKK58qD#q3-=mny`cPSK$!POHlhPh@gmWf^ixCt-G>iQSgkluJ z=H+vz%gr`?4P|RbC(?dldTiBSWWB#-c$d4D`JeyJ**Mefw%;2~ar}Os4%1GhbvOt% zz(&9sJJka73L94k>l;Z6<TP3n~)wj8A`3KL=<*pb;8gG4x=)3Df zY;O>Z2fez7UTH}`DH2|fyL;TNKeahthYQC_jcr z^{Y_Qsih9Mu7>c~cdDO^FaOn^bsolvKXo$GxdwjBv-+L~N03do!tM|H;jsTT`@>+f z?y`S^eG7-Xa+CR$1DCMx9TZ2c)jfhtbICRRqI}wQH=?rXN1ya+yh6J8{l0uUApfx4 zzW0aW!yFj2O0>qc@L?6qgVQ_A%JF^|2~^fHr}Vt?_3{Zm?p8mlbMk#0%wtT)opSR1 zTpp4#^F7R1{v6awIV|_}M0fTbE0JSp2z|>CI7 z9%vt~^@bBy;(kH9zo7s@jgpw@2M>MO9X7k+X*_IU}?@aJGbyp8JYwFmgOvZvy@CA@tvY3TRb zaZ_A`Aq&EN8oW)?Z9T>!2XzM(<;RY|^Nv4W6n^IV?gYFJ4J$RCb0^qY??VVbq;0A? z(Co{8s7UCQgm_#WhVFA#_tD{~!L7C9*lBfw@tZmJRfE2kcII+l2-es@w8v;5juitE zwyKyyaj;&c6P%6Hl_m0kg-z6pdD#WRMq$*klwtz1-ZBsB8R?-dzLavznR9If!Icar z^?{EpSre=w`)W#;1bTaGAcBT{lLk3n)MY~EgnlCI4H#}I{PG%;iunZ7qC5XA!?=K` zRa5H$J2m(t4kY>bihs-RC5(avj*gS^+V_zITqNr$cc*|5ig9;z4QxE=9m^Fdu%Hxdt&2`58j? zmApLdTbTn*DU@l0Gk{YQAnwlqr%u7CHR_D_lwg#6tU68O9lO>8UnIq`cV{dMiBr!8 zR#8(|k%qSjw|e?s;DT&_^WhtL`2*o_61*25 zecreyq<`>8S!HG|CQXdrdXE-aXTQ~v+CaY5?euGeq7gHRrvraa;{KS#?job=P9KA+ zC;qvYx5^GxoOcrSzJM4cC2Qq&r(j}6GEwHQZoe(fiD0f|s?YmhVegGpTdu1+Fl##e zemX8>UL_-8E@TY0CwdG|_c-qusymEbvP1|eW0r<n znx)v?d%?cqV^rJRy=fQybKo{^yx*Wv&V0~2IEPoNQKn;i10XJ`>D(H;n{!`|^sB3~ zlb1oJ?J>`$#pi=R5P-+Ga50|ZF!ScoK{y(bdGaup_5AoDH+nzUfb=zMup>Ma}wx6k6 zTYR4zFV$*xV16YN+qUiL{L`dO(~I8p?c22TdGgJ^ z{AKOzthJt%?1jQT+0i7U+_a&+aY5#`Y%Ml8tPchPN%ogNhH%HO(3~VgZ=he^D%}@d z$afzd0g4d~X>gK^?VZ0DoR0qm_!*Eby<=(hE#0Fm0Ej_|T&A_PZ1SzH5@?xBaCffK`wU)xn!J_~l9WYvfJ=y|?W}bI0~2 zC8X+q7VZAo*Lzp5GcU=~gZ|!202ZsR=UqZTT8JB}H)`Mc+EQiL`)j0tCqW_l9br(6 zX^GMyL4``epG!p^v|E!=Q-MuN=2@}Pkob_8BlA@g&I6vq$Xm^^4(X)ZJpR$8wfHTD znob|3A@&N#2l@hJN24|bh2b{oxD1ABnj$41ii4r@ccB%D6!y{af>W*0XjbKeuhoi* zIc1UyWfd>dgS%Fpd8hJ}iiLZQ#eD3t=+;JZ)I0}mpS)MC?{1rn^u#O6JA&qaG$t(y(eE@C#ss10OC@)eb6m-trH103oZ zOf)kFlf80#mh}{~aP+ARlFqI*Et1%%brZ}->48bkwDnN>R;f%vYy0!nAlemQ6bFIS zZV3V6Kn$m8`2OfZ9s0>p7ZJThgb{Lo@GS$dIt+13!7WOpuVL+wgHmHXLgo9K>#4xq zITSiZwi5oacv&TX;#9)hh*IZeTx?SX|n6(H?wuY0p2-s6j#Ra4` zMDthXsE;^i-A@O~=jd3l z5U>`AECvK0qR65VNp`{HSyQ3`+*IPv+2p@c2V5o-)TL+im;>D-HP4?uf5z-C)dp(! zLy6i7F=Hx47+k+ais;AYkm;?CFe*o*^d7aUlLME;uMdg}(f%h`fSr(*@F&mB7k!|UX#16w{%Rz_rjp1C8kqy2%8J0!wcMXM*7)y&gCsw=Te-b?jsD2wvt@6z^~K(U z#tPc-`C#{2VI4lx08suPMcEbl!A+?3`3ipFohC1(iIW%=fbD+??l1}RL(HSBd|__I zN|J$d!<>g?C|;{_-T7Jlj=x35u4h&uSb~K(q?wonrZA76OLD>0NMFSa@8_Pefm)R0 zQO3(Km3oLr%B5)m^gwD-*FddDeeW0i#Hav5yQL0f)4U5Ur@G>pE4Rs-pae%#ec9!} z@#n}|5I_$~1!OoL=hOKPYY`IXuOQ1~wf5xxttsbTOv@w~1n^=i2VC1jv#m%|t9H-{ z=$(CFxlWdt>|wGerq&q}bh%Er7AY~~{0OA1aJE+b2 zKrd=(QqpOYVxoJDHU$wjyvtm3Ec_laiU;8-U5zcyadOIKLNrgusAe!!s;-Be(L0u% zmx3Hj!rS9S0q!UTxO?eE&@P1z7)qRzLm5#%(pAtaAB7!vn+TKWlD-@C?*`3y%$%2` zHJBv~vPMd5GsDkwSv5#vZDuzAmx?ODFX{S5pAA#-;+mRmzxk}C=M0A9_Gv~37q?2y zn27lFQY=>#=b#6bmR7-TlxeclqTv|!b`(U+5I`mI2oeDbZ4DFV4{@vOz|7*#9EI5$ z?O)TQ!mw28lkhhpT+r@a9vCE?C!&uN%|DnBYf`P&LUb+=H>2ASnv?=H@5`CdzK#57 zpK%$0q1Qv=Z}3Fi+!_6Nq{VS+ZmZSc@R6vR<}YMT_ZH5x1z$%+Z899}{5;GsVL%wr zzUIUnsivrD6^e8$Tf@abUh*e$UQ}=aBONmfupGv|15iOcD|DWSZTWDPV@vFSzx~|T z<4if2Tj~9T!lCwHkal!H`ImEt)Q0AqwRzywfsELUEy)2O2PMH`+PIV5e|pFx)IhFF zgb|@<_|ZTtXen6c`;?D3n}_nU1yfV!uK@-^ohAG%vFkRrg^z0;Lp+rpBoe2VvF%v9 zS)SRX4X6^@=Aewz-i?3(M0v&!)*-Oe44H~NbKnfo)VydZWm^h}k7H3)$R1$U!=z>S zlhlKH$(Z&*D^uLq#_f_0xa-(xa2=UcpyQpdRS#n=P76iAdg{0qMMI}IETL$iFv5il z)dxrHN(EGe>fQS@CszvMMl=W-aV~Lx)qsx^Pov%+Ji*F)xYSpuYEovqq?KB$a;@!g z=p=E@nHL06`>r~S!{YQg4z|q61b!5wLg?ilmc&1i$OHS3&efBQ9UAPSdlxzF1%RF& ziR2M|`7_P2121J_;xW4k6sz5tIJqMtn@IIuD=YpEC=Uyx=97V(NC6H`v*`vrcMa6r zOUtWtS}=g2RaMVKg@I!a-=Nn0)9z~^c;{VWCuep`Jq%C_uxn#;Er>60e4wlBy;`^T z=U;j((!7l#q-rfUO%-IIc{C|Fuy9g+iR$FS00F}~eSV|`8M#vo)$-hn%-|>4WJO9J=fB82psx6dLB}!v}FyF5e&;U0{j8k zRr*Z2t@A+tiB^4D^(iO2EAZ^1uRH!;M3i*9#a4R@0?Y?E$_11*Y*@hrf#o30D%_^e z3ba}KYm-)qqRD^9ki$Q9Qu@}d0+l5mUI5-Dnj`5*H?wlD%Y0(4PdFWA#i)w3LNbmW zK#K4rf@NyLtmXiEX+JaUI9j_&DC2dj1{qeqkiTnz59Lps6gV!W z9XCK!ZH0YTS>l|rlB}9Fk{V5F#?-&g@3tA0i1;|H5{HXQZFXQ!CW=0RGuRsNi^?%t zE;Q8dpVb%0RQJmtlitQtU=Lg(dM^W@L4Oiyy0mJsOo^vt;^$-UVy5`~uw~o_I-u~w z{9nHkSZLyEVs>f{;qY@;LlRl&z5I*g^akjk1%1uVn1g$QISNJ4(gkFGt9@w=-8g{? ziu?wG7w4<-Yty8g?N^F`iZd6Nw~BX>il_1~-~m`P5nMqZy@lA@>m{TLLL-Dzd$k5; z1f2SO>#q>vMH?d^lN7yu3FoR-yy=Hw;2Q!U5jOaSmZh~zYdcWRr9?Cl(I2lcRvC&fmL9bsi@lQ=*uR> zRmkYgXY1xNTa+O9=7KbXypNq)iMeq>;!(FnU9`6fr;*7cF{^=+$3u^7tv#e>qmU-e6~1 z6Imu0;IF@qyQm&U&yVZ=eZv^eb#pttSnD!tvcSV#;|Y7mT}Z2^tQlstZ+PfxTf$AI z2dop~H;&oRlP;^=DptO)+Xg0!Enx?uj(D#UC^x}FKm6rBq5-N zh5hzNaY zK@?|>7Z_a3FqiV629k6ne&|8v)*`!vy@NH^q|X8ktuv_8XwGE#V?pMcTxvpawRaQp zy{)%4>(ce*vQmZR(hO--+ZRM&P6!MhL016Ety06uX}{!zSj>Ucm^}ScP~DqLT_SDR z?v$F`2u8BPpt#Nm+UDc0 zo689NYzFKKhHh+ZNJFBJ`LA&q4BV1!wL_*mA>SGD`0DMz4N(zT_H_ShKJB-3GsdfR zM*(brD@^`C6A$8afw3M)=2>!2e5ml8hv!7?>ie!J72!Sr;JqaeDHkg_YM^iNHR-sf_{l>0NQGEUT#?%9zh`sbNH?D< zHPsCaVD*l0-Dp3v^|0<6VR7>=(x!U0f8(98F_Jd7r_2#Cx~F+hw8jkvLQ)v^?X%`S znyO0ZF8ankY5vRWM8Y)`NnO1sM|%-TD-Fo3w#COBzS|RGsbav~6w$Sj#s|Q}Xlz2H zkY}IvZy`=^OTRO(S3D~uiZj&;nJ|-(R4*~i?q{wAZXr5HnG|1?4c7T zVQucL@Y(6^`a9A4ElDy?@n9-k70&eF?snFON86j%<7G64Ht@sHc;HP|w{<-Ue$11F ziuO|X^meIl(&6jh`-H;%$m=LCmGu&;&S>Eojc}ZC66m|EikFm)>4y{VGdxg$wng&p>%J} zZYVO&wQ<(fh5s@n(_aC_wvt@*k5daXBugeIj0%ir_5xkOs- zuoa$U$ywsK%l`BBGL6$VYilD6=ULHra*9UB{VZcF`5B){8fiB>^n(M}Z`pDe@b3p0 zKw2893IPpsjp~qYZ-u6PCuGh7sw6ff{q!<|fY#(ibKr8%quRI)jUaZ*VQi}5P-vx^ zQ#5G)zwmm0zN>W>1O1auKw7Q-KM#e&f2h>^hE+(CB+C^sd9rurv0}M?HTA**_AuQr zcZ!<`+l3G;N_$Fl5A>ec2hzg-YS-y&3PzpD)%PSXg`_SA$yX|8Y=y{qgkhxfmt-yB zh?|JpZiN-3O^_ZGJ(D#E@k}{}87Ra(iZOmp1fLeXm5H-oOKJzcbfV|D{U+KE_ceg_@C$Q!}uZjron9(6DboUkf~;i&G;~z-aR(tf^#-Y=HaMK z`jb)=;KYJ}x%NcDv4hp{3tZXH2+)p!b~}uia|+?M@ss+_3AL9o~a( za3}K3C!tq=M^&+nAQp8r8UZ3f4)a-#yAKW+DIA%|6H=F_t!LRHco@eAs9?&n3tF*S zym{p*TCSNtjNJexG5y|UxwFocanwB!L`Bb$qFYs2sE>C2f z+V)ql9t40Mea;{=H_f9;UHzKu!4PK@ZZRj_NN|*0u)#Vs`(u;!p&oh{wY^wD%IXoV zY5MeBi83mWRZK#`+kSs}UdOg1BH>hS*#T}6InHtnX!?=Uc3yuBq{g9}nm|;TTJ}ha z&ol(6C7?cv!vmqRTB)P40X|nk^FfS)jK{w8sUEaS zQ)^>Wrqn8Aw&V2(Tx5xYqnl0P0n}E`pYwK3apdrb4v0B+f9O7#-bBLH38uT<2n%v< zXd1!vOr{5O4vk_S8i1HuTnncvo?9H@&4m5GlmmLH)<5~>E`>yaxK(hO?)Jq zkc?KOh3cs%pB@GO)C(A;s&7HI1^?9>Ge47 z()cN>b#B%Y<_Abmqy{9&l#demi@kQA)p8T|%~){AEufR@V{w4Olqg7YPdNfH(=4^D zx?6y}W;MM*<^%R;^iCi-2s`#GjvO+xl;fE59JB9baBAtWPx_BJ|00?l%m+ZnvX1r? z2Db|GNY+yJmrNfM*p-5g9kEyY0Mwr4hBlZ27?kn^Y!@W9kHI#>(wyQem|Z{+xoAoN z9h(Oc-v9(4zG2Goe-VU`>-b8 z*;b@-FcQDXB|Fe-q@VgehJ4RIA%P)6jBY8$NP&-bYB9T?7sKdZ$T#MP^N@;9qZk*u z5+GQZGm4&_UBx6j4eVM_!g@SHwJgHN3Jf|F2go`Hh605FT@<^j710l7|A^qw4D@DH z?WC}Du{`y927=l48X(QU;O$Nr3yZUsV`!!3;ve%VFzJ~nPtsh9j9}(E#&Mcv0-Qq~ zl@Bi6;6PyR3rKcYa0KV>0cF}?r-DHuu_zU7L^1*XK$1l4+L>w_gFK#6OJ~!~q?Q_A zLI@}~P!eRbREJnPx73QFu$q_FVl$#k+p~_Oq#tua0^CL}-Gh`ZE<2AoCkz#V0&dYs zq9K2%GG`tMxX^QCH|c8es34hTZylIloh$7=cT6wy@tPP9`3X2FGopP=U?`?kkY#C2 znKg1{Pk?%3z?>^#IHpB~391gBWu!bRKh2SIH}j^xfyCw&_j)c|&WIIL_7`VWc#7jU zTDin9wK!SJR{xQj4DQIM{9kC$lK4pyXWi^5h4779CB$ zRP1`pT1fMsC7d;A!m>Hh>u_9-oc&v{Pz$4k>~{LJOLJ0K@;{)}T#trWBV~qmtnD}K zUplfF6n*1OnCu~?TsY)lF}WceXv&>{M|g(c0`@ykwOcnC+_-rO7TJeagD|KtWVK=W zfYS~oJudbi5-Su)5Ls&N#DA^kqqQ)w^(VSJZIw|O)+&}pwl*Afxn=FGQ?@mgS{ajY z3g7bajHfh>m=qfVCd-%@D_Y8!EL9VpVC&B3=-~7~{UdkG2N0*t5kL9I`rg5}RS-sU z1Vw>1Z{UwC4KyRHdelmBS>9RpHGXyk(FIV!ULMzfyde-9;9NS zI4s+!F~*-7Gy*Ir$V?)^h(58=44#N8^&o&`=7W2Eth#hVs+KwA4(in$JeRZ?eQu~G zGPBeuWP;_y?MW}8UII0>^*C#ZnT;ebjQ5PU$pTfjRsFdDCa)*uHeJLn3~#2Q7IR_v zyfF?Xzyd_Rdw$YwL8BubE*6*rzR4b=mBTFK&c&bB#=7j3G(gxf(S=air()w}HVn?= zfr~6rZ>KCaYL;E_PU`k4>h4L#EWNEFIbfJw8mGmU2NTAYQl~diSmW3X@^B9GC=6xZ ziQH-o{$GuXKT3V(mt<#pz39MFvp7_zeUg&wJP_gmzxlSM~VQ#>21 z%z?D1g2veVto2sDysl^olvz)p4o7ptyHRD#i?yeo>*r zz)3A`2eeDhVe3(nTrCenWv#g8!2y!>y%Sr+FXkC!dbGP^bP;_l55_`=Y$o^CVZEJ7 zfklPGNmO2U=S+{lb~dQjhK%}T=+SYHtH@mX9XZ!g4f0hPo^$zUP_k_K9y{6riBr^* z_`+7d50rKxWKk)!ixtx3y`Wr{9Tdf?g4Rz{NIOggLD4Vyot;@0b_UH@3L2Di?$a$d zmiwR1NY|Dx!iRQp@Rzn5RMaYaFs>xdkevSR`=Mgxxn8^mQG|i}!ZLu~$iQn#uM7#= z+h9V|V?!k#twJ2BM3))$G2WJUA~!oXPaiJ2BtJmn16>C15o~7$b1s?M^<7Gl2ekb; zn(2|w!?)@t&$LzSi%I;)c*6x%c9yxokzI(fu)_jG_)rgE7SMVXKb6nZ#hIq`A*ZmA ze;Fa}3k*sO-+u_&tb~3)YV^-&D?#CY7^s7nl(w&55$ZPfruOq!)i zTfiA^gub6sx1+(n%zBA^4BX(}4R^bqELc0=f-Y&PAs5T~^2s(VaP3C49G8R-N*REq zp9*H5j3?+ym(;9%ym1I@sWf>Csw(59jf;(oiZRD`^h(c<_e(c-nd=7H%d`)m zS6?SNWY`{j^#f*ALKiz z@8G^e{to-Q?;k55`FGUcG5?3>1APbi9sGAF-(h`6_#N4IG~Y4(hv$QR2lE}`cNpK{ zd`I*h1pojL?e{0ge|SFVcd+06`VRd&yzhv=`~4mLckKV+`QYC{e~0uP+IP6$k$gw_ zef$jHvHoZ0|M>Ca$B!RBe*F0H2EN`#Nqf5VdMk_FCmOaw;5NSjL2L7 z=zLF`?{P1Aa78M_s^jl9L37tIp{_Fc0ld_gTFWh-m)4uov>!+#KoArXI>$oTRW$ zCliXnVodSFk09owtO`rAsjU(e-W4K(N;00~KU|}wL1NPhuk;WMOh{5$K2p_~4Ps^& zR_a?u;Xr|L^KC}%C^#ICPq3I|6Roh+j%P5gf@&bc<=0syYvl)b)UEwf3f_bJm6}*X zFnf=AcyhU!o6?=9Se=H~lI&OI4j@kbEFJ}F6# zo4o=z4hnEm6Md#`VNeXIr+9#?&4-t^BMT4+Iv7^G(JeKl1Wc8Uw9HJDn&P+Jj*>KJ zFEkqhNjQ@XvS)mTbC^sCxf_Qd#vqCd0yltZhcu-R#8~FC$#NhfKQDNw+9-GZCn1_( zh>kU4g+`8V|Il{B?5>&I3RZ?Q^o_=lrg53hn3;mB35KNOpoYI?AFSwt`7%n#@JB4i zYISpQm7BuSeZnNJ(AY;o16^hU_ipUc960SJ#wq4ME)fC!q{_l%wKW**F9OJdPQ-@e z&v)KpnjpDhxw1I2UQQ*Gy41qCxfUG*D;F_`Flc3kc;b0E`B1=*WaS}kU^c&5l+)B-wA-k_ma>?b6 z0ZtVC4J6fXa36>6%A@P!T6~y|lS0OjW_xl9EM9R#!J$N)Q38>YI`4NMB;SM5a|@Hu z^T){n-+?Fv95;s29hfm*vlL2SXmyQ4)5b~nBu4V)jPsBmazGNl!0=cwS6WmPWW3gf zR+z#C;1s>6pTfXA{Z&zFt7KumFdLRjicqbO_{Rytb3N^xBGyJ?`ybAZ4rmD3aKX)p?DT`C%?&o`Mx0Q67$tfO5PPEjxu`?U@;kJ^L?{b3i>^% z-xx_`@_!py$R`M^7R*t>F681MJKN;9`w=!rtr_fog9M?;3{wHLT#L;5**9*PYU;6t z#A+f>XA7_<;&Ya0juq@|(t`1OLZsxKBJJRDJMY<*DTqSIC**s3xBrt0Q1N%BPW3%) zBDk`_J#HWv94*;17DB*oz}E2K@Ol1AgJ{e_N$*^@;Ab|kLHE8Mp7<9xmoSZA^4xgd zRxx6Y998$33R8z#OLbJZA&W6bCyrB$Y7fav>IjnFzBY{7K$T=QS^B_s$%&t^>LtXJ zH(~z{g*FmLv&?+{a}HRn_8>18k>DUx-!HDVUoN~;A#&&3T~}Sw2~?qc2q4)*h=8}M zVR*1-*HyglIMtu-Pl+Uz8C05v0K6EI)?63y{l)T4p#w_7BsK&(wgY{=B2un1hVTq4 zAW~_=;9MAmk{?PhxYn$+QZ^exv8>WTkVvXawIW?Bow;;eVjZA8kt$UFGTZ1!09)k+ zR)Weqrx|!PrWk8crWY*TqeeCIY(_E-U~LxACknT-IKmrk+A!y17{#S&L$4!u>IzaD z`?Zs**EKs?85y#ZOLdgtx?|Fy;%QSGhirT|^;rbSoFJ(P46J)zw0$~t<;tuRZDC43 z!5R&UiLGjj-Ir=y1z>~f#IF1iV`x`(%}vc=?2uq#K=OR@W#+IO^2KpWMM|P24(C|? z!i~_deaLMlIT)jybe!7Y?zT+E--RQihxS1d)m1S^;~h~@Tq65AG5{*%;*!|u?r>yl z0|jF)=SyT){bQx`ez^*XrhT(U^5+T4!VK)!MT3#D`!*wUTR%XOoR_gsuEk`T;hVFY zmpdo^USdBfTcHe$-}1N5>6vd$BwIkH6Ehk%+7oDI6p5A~vZ{#5sX3ADz_TROSjBRL z5bA0y>D^wd(a9(PH8FQy0vJ>STIjOr?Mdy`%)j`HGK;Rzh`syJ63S_YqJ$c&Giuh6 zC60sKpslS?@h=d+$fQc{X?hqCDRug5McNB1u;{uKsJ7VbK|go0{U;OjkRFt~u|zrs z3$FAL0{op7cPAR{Z4^dyXD|lKO#Z!rvaK)kMu24*T<({880ES*3Mbnt`L`&JM`r9; zQjG--PfGA;N0>vHSNK+xsV*{wpGd))ORC(RqJTOSTT7}jBg)&LNG$fLlGD8-3D10= zp=x&D_ZK#&NwA8792lbMHn3$kg4QNe<>PHplk9EA1}L>ld=)fF((A3#t-sVjo4H@O zi1tmwkFPVXtwJdz5VDlZKyx+n7Jw#dfa9L-kwvxLGk5dP67f$Uh`J+z%O5seJVR#T z!SaqbWmYWQ%Y?$%EmmVdBLb~A7fO8dR(>x|!8{{3eGdPn_!nuE2xx4l14a&HZs#yI zPiH_cflyTXJ7omRX8o!5N}b&}jdovMFqF3X ztR@|CT5_IabsRX|^U^iGIr5-5b)ooX5VHaMssN~ISEgOvx9Cq-#;;B}r+fB}!C~qA zR)?{M^;U0ZKv;G$RaEjmpX^e3OjK~o2S3sP6PT)h*LMP7qc^u}QRB8$YOa^XCo?UW zW$cH#XV=$WMjZkS)V^#Df`!O(eI?YG&1bBPT5;R=57eDNFvobmmwCruMLs^T5@#*# zoKrUeJ)=M3%s)ZMs=DV)yV@E$;$8F@GeS&#_pq+--tVk6zu2een7)>W@w9@cJ|9os zmI}?W25k?e-@C!=+S6Tj%vs`bnp1pQBc&Z~4w>&ipG@Izd##t7Q&{%|!7FIS1Y2pq zs(@db?HSrn#?Ci=)0)VqefBS;8(p1wHTy%XLXTVq8s2pzY{hXC%9 zak23{_Y@pnUrW)pd4)JV-$PyyzmV4JVXDrjct4-Fuk)U8d0+PO0`^`)n(%PA*r2{H z`cgjnMDJ>&ypH$gKX<_4?;O!S!DafPi2mC*V$5OG7XCBOPh_pmbv&VTRIh>x`$S0{W+e@!#m+ta zkM-}A@>3WBaoJCKcoKoIiWY+gB&L^nkH&e63_tSOjz1KkAUHjIcB8ZY^)_ylxwRs- z(6{>_WxpP@1UV+B0Y)}ODD)WnC7zC3c31er`JEL;<%0mo@s`t>+pD9d{is2W!6Xf; zf%MnTG)5va(W(>Q`$zr5ElQUL!z0KdNd}mq6hQ0)GD%Z4sEgdOod+=!2Y{5$_>s7% zmNC)(_;H)Sxa$JGBp%g4sxMMh5Bk@Tvg^;iqVkhu24xIE)84+ofE_^MZ0-w-7(iIuy5b?$;elx4=B`qINe6dL%5{ zTsxLJ_yTo>8E7@^4WN`yDNrL4l@=+| zz2$iI=_y0V7F9&@a1{+yYmOvzf?C`Z=G(^=;~NQO8ozNF81I`$YHvGSv2526YO`em z935gb%DkZXhuLGh*mAq6{C4hm7#Q+aBe=UP=;+b(&a+9(u<5~J3*W@h43ILV0LI!R z6~vx)j~%oWOTn;kaK94bJchyp1XZREa^X5)IAia)bBR~ya}Hyv1r9`vLoi;pI5j#p zISz~qiXsw)dPl2WN--)4ZN%Dk1`Q|ley9Z;v#L=5kfQ_|&Ku0I9k zc|?Csu~&K$J`MucjpnjLO=LQ*i3VY%KTfal)YRQFupLRmNV<%E^Y0>iY`PZiRbFhJSSt+Ij7UcElOz z=?!JDclX(&_zMSd&qrBjB*Ko8qv@yHIcKByudpG$vnxW_Ok(`Qnj2JB4OTAHSAjA$ z00Q*Sn75YfRrGD}qmUQMW4=v=r65q(OfrM0NxT=3A-hiaLN?v1WxhHVvYnXGBd}b> z=w~INvYAnV%TPAL7A)1M%})@y1UG+8S8WUyE42yj?M`J>wft8HL#1}Lz(Z?Z8DxEO zL}2EG<|N3ut)efsOpy)D2}<9&&nb#;raDWvxamZ7)*UT+zfcQEBXjXPmNJ0|X@$gN z;a6|rUH}_q@w@{_^+rr}1FHA{(Z7;5kc^Y1b@iDg0rpb$=%#>76!@ZA5V+^@x!2HH ztiVjz!Hgw%lDGc0#vU8f^6je0-hxH@XC}T#(js4t8FLQng2|4=$&*aRg-PHUA6mX} zen+*}h&k2ixW>2)KVyQccP>3=ipV${?r27Dm>VbsKoxhc<6V@$X|wfvm)TAs7%j;H1nM(T;q}kK{xSR7uG!yUO_LpQp+b1i8Qc0oLdu{3( zn`k#zzGs07;tSzSA=kF(SEmj5ALQ=ThB}%xT78Av*)F%(nVLDxiGU-bf&8%|AJW_; z^w_q+RC{OwQqda?a%B0-D9Bz%(HBIJydqB>ql~vwggA1L=~_Cjk;`4TH*bJEsLqZ+ zzQ3q^HyF@&e_;18+lh_*#wm+##1%{_5=BvB_IS7b&(Il9ed78xlr7ALV5!FepBf8# zCZ;=t3e&Nm5p@1Yqt5LbzS);61?gC0Td<^RXczlWuj$y6-Zos|KqCB*u_QD6pfM>e zsPV_eo!T zV|Lip&y)?>5EI(#_~Cp(hwk`&K3rN2VX^}3Zn(T)Nzi(^tXmX(HI;8dotBz^2)(95 zC?H(SgH*dyulN@WRX}x8Eu}4gJd#J~Mq}MEIfQ%amO3_u7Q<3)Dnel#Ri%eIEfzcs zW>Nje^Q9#Y8cNI6bpmM16;5+@EwIf_EZs|^WPn^iSTtkIGTrqsXX z>(2UW8;hb#{tB!We!!4Nhi=7dm#S8_jnq}&NvvF9r8WYD1 z(Wh3?QAy>IN}BQCX+$yPWTLtT*bJ_BIc}k`z{w1T02}262hW#BOd3#{TzYqxn!PlH}u?rX4-I z|H*lSVwAO$+jJF5dbMVl>0??I&*oiho&x~dvxzqM7R7*r#8oY;JZ-v8VVDnhHVKoU zk!AZ*m9uj}(oJEJoVOfm!(Pp$Y5N9`H}`65;w;0Puq2q(=cmHylz8X*G2vB2EtnTz zTN@h{U&kaAA=k$Xt`CsZvuxe_l$;0SAzdhKAF{@4RMqYg5nD*ZGnA0p(3RtB$96ay zV0OthSk_j*`5(Z38dOwDQmuZxCowa@a|Wcz3yXb-dhGyLWcpxPYYa zS4uZUzD-BfKvnPx+XvcCRI_}34O?mH_`E}E6mVk0Jvh8Wnsa)* zkEB&aioskfLjzuQ9rA8C-kBPCLsrx{ub+ooSs94L*{@=6a7+Dx)!bR*G)TLojDMvj ze0dK-HBZFy)KPwcO^L{R28laKgynV;q_vluB-a=lnT2NPpd$h6TtP1Vg67$QD>MKA zm+CkrDHa>*U(m_cy<(gAj3Dp|nhVxbXPKa_9aUC*p;pE-0Lq(`MFa-(R~jM-_6p_a zU-w9+%JzY%J7_*2SPsG9$?N32CCfUc{;iWFromOhB$uZ}8ZjDc*`6<(Z|}|4Ybssn z#nvx6-@L(Ur;{JC0HWPhe-`Km)Km-0O=NIS(3y^-<wUP;zFhqwDN#O{(8>~#J2_S*13#`6obdx>UO6R*P=4;+wOUt zI^K&cz0x#O>e?uV)8D%U@9ZVITg*93x8Z7m4F6-+Oej2YhYyIou2KYtSahE}>)%m>#T$Jpp!~W}I zYlD-6+xrdeDe96(?ez_+e3PT)Px_EOsEU}=*?z^Jo0ec7pozWn_5b!R?8lG)4kg(C z)BYc~qfPL#(o7s#Siw`Q1v+Y*JP}X82!n^s*LT?Jn6#G^xi?H$Eh3MY=i1~r(Qsd} z(vPMS6yhBo2=E2aFUCi2GhLBGd+IU;N8JynAA-;=iBoZ7PI*gJSNTcd7D5kXq0J-f ze1kgM({69`gYK&#V29J=?T@$j^V|loFFVA}aL=|W-sh_}6A*R~>keD{&F;tlET5N8 zye}lp4O@dUVBgxnnYOkk_$|(7y(c@``RkH^SF%4>9bY>i%g+W!jvZCcLm@eL&+=># z36=slyp~MtSAycexU|rjhr8F){Mcacp;P_(scLfzF_-u-W|5?y;9LotOh~-uURwWD zDvtS`U|Q*XuC-Ey0PP|60fBf!yE@oO(d3~pS(S}a2F#w^E+=dx(;q{5nAnAH0 z6wS0#dd>!s>F5yl4MP=Q^b9Z%11W+IkifJe{1qry;HS)q>8f@(!~s02Km*{ET;Tb| zqr;Ps&ESGg5QUBzKOsP0pwG1k`)@#HaKxY}R9Xkggm6JLK@}K15#>FD6j1kq*wcEm zDpErGp+B2ZZ%C$UW#V*}*C0BWnG&*3OYxB;v5UlW&BLN!sExIl^<4jIK!pW~S&Gc^ z%}L;f3Tbph!xow+kx1$0W&-XAZ%l`|iT~B?#C6np?$}0-aDWk?OxIiN<1-2wnfY7( zcW+1>Ox95n_b3Q8kd2a3enk8q)E3HkBf;G3?G6kiw$h;jWH`%~BwTt)46t&KiUPPw z>3Fk(`M@bdYM2zpsEZ2R=KgMeqqHq4CxwK}sqZ2@3a{pG4hkJNVHI^1D%p|7xzvL4 zUYQyBUtvdh?QQdOkIz z70~WmdLA^!&^6-)+TgsQ@Wc7gi~Q9HAnB|hs*uX@VJ-v~4!`iXVmbSW%VQNmi7#k& zVlU)1vl2=!4QEN>HFi<*ld83w;Is1gy;h4+a(4}nu*({cpHBoPvS4Hn!(BXqtR~nN z_=Ee_9i)-Z^5W8=4Kn}6^V^0J5fPb`^phfQh;W6fa-HIGKkts zrY(u&YOdGJYXXoH&wo2ZDV5K4{s)iLzIw(-K2fCLLwL_o*%T}&Yz5%=y%!8B(sZ)C94Z(V2>d7?uu zO2p!fCGT!z-^EcX5}>oxE(n;B-l#Ydm!je77KmPlROte-s zS1rs)UD|UO#tlxb6cD^?j9F6NLy2j}Ovz|M^qV?h^9@wrI)U+J(>9o8ux${^38P|@ zE4tv@L5lTTq9tJRNcQBIP$=B$E#=hl7pA(Mt^F+(>BL|~#dac*>Zr)9#o`1Z<|@qV5quUe_$m6m4sCTgr=5sxs> z5NoP^qqz)kU`aS|R^Pv(1zOj|j*ZfwUz|>?hd7d#GGhClO+t4jCyrt7N=X7IiDTR@ zJRP)6FB!#~oY-L*7))nO>T4+o&Q;Hk`@c?Xs4Ds-6r0VL+b0*{{1YnxpkIA}m?$yZS*6E&NRy8$ z?`y^aCzQH1(u79tORu=1?#JWj-Ir7*xK7B)fNQP9WFpR`iTE9Fo5{zwUnC3<0!H##U-4oh;R+ni(_snZK(EFo(1;HaMUBI5iO5vaFMMY)}+U`^~>&a z4l>-V-JE6=H)?Z|9)j{wSnsCnBW4970YWyNg+XNv8tb|+NGr;sZrYkEOugHK0r zTa;q7QOdah60QRe*ixkfjc)%2(Uw&fWA^%SQEG#pp`tapN&I*EWnlFb+iW9@lyk0n z>3=O>KVPjbCX{;6W+zws;H8Yrxer~EuI4v{x=Fi*dYFIVJd950lTId_FSqajg3wT4 z{y8;KfyHQKWsIM0urAmmEY3E+w2(JfTtWUGy5wgIO2J%cr9`@knz`;`SXAOP+8oap zYRP6XTAW2kW#1> z`X=(()3`#=of%p$Zd{xVZc;zpoK57|QW*n{#-NavB^j>WId>jI7eA$CLwh62MasZavOK-v z(NS=D`L=KO;I_s=#vEB@-jnOr!T^~Hrgp4TRjlc43dp5Yz7*rib3?+{@PfEPMb>5E z0+Y7!&n0nL%a*IdV6U`}4VnIiDuIg^=VEG>%!mwm*J4H%OT*-fh3*E^{3T}DxS}6q z#bd?9c&{@wgC^jydArCo0as#+LrFA|fyWbstT+?$)v5_|advkH&3lg^g)!5OtbDxf zsXOU~OavJ2(<(EdPFK%pY9QjbB;luO;`<#&j3JP1sOmnu4tC%0oo1Phs^dPCmjhPH z!RS0J`9Nu&xfg5>HmnQnOz5N?w+-%2dki|V8QewW{^&diJOCZ3-IE>}@AvR&AeOP# z_g|){SRcT^J5nt=yZqWi!~6C^E_;_W&yV9X8Ra0n{o?^4fG+M3ve?jh0j=x5k9RN1 z9d2I2DTi-J8Xq|cNCx@Va3LaJW1-KG) z)rsr9r-BtJ(xSgoAmZ?^khDw5IouGq1T2}WCkVx|&x_-crVnJ6BI6W;uG4UYI^zRgi82Eo?_|u?vvx3<`a=YaSa4VipDh1N!_ZNm37)KVy*Vlqn5Len) zy2LglR{Xasj_BJkkw}_42oE0;4C}vAsHW$95@pBV9 zZuQhLmz|xALFW&{!8Jf65IpcBjKXJfAvNMA!O!fs$%+qMn~1uu2OQUQu?j`y1G&#! zs}DHf?s2Tx5FCRhhGwvLo$Yq6l*zv3+T|$qU@Sxs)vsgnvcnKi`l@%TN5gAcjm{>A^I@wNNm_08@5rQ7{I{FN{F6fLF=LfE9= z;9%!%|GvBFAE$QRcV%$G!{upn{7r+xQ|@`Q)ny>{IR*TcdWdHbRh5=vY|tyDpc_RX zvJRc~Q*U36v}nMP?g^aI$d9b&oh=-@bXT}>hLcV!L*^uDCu21*aqkQZ&VLBwt0SqF z8JC~mBGFE90MCQ83BRS`KKz_%A=NSWt2%*YApK15&gWXhaQR6+kz%_bJ43aduDanU z)4SN38Aq7#kYeWbdL)M9LTOkB>Y?4EaIf%z*GJ|H;)RdiJKG~+rdJTV#0;aS=&Ox1 z*^mH6D=V_UVMdWES{o8+K#iQBvQ5HLCE}T=eq6;&Mtu6C4g^zAwm3+c5k0cCtjEbT z>)jUC$&&XV&I1)OjSSK-aKNFnY{%#Taj*X&@JPp z);(_Nx0Os;gh~l<)goLwRXY}efbHV?BHy9F!a5t8N<+(#VBAH3W&e`+7wC=tjA4ki zOZ2|Zf23-&YO8>IY|~qi+3+SpiORisSQ2z*f1v=FtRCnYQiRB_6XU|Ijaa_>ZG8@k zHw^S4K|DsjSocgt0u|vlBq$v|78Hd<`heH8uLZps%F=NNQ}IL>LI$ao?1pH$KpMmBM%M?;o$MDXhDpfZ^?NmG5`~Yw6b4Gt~5AuiXw@2HA5lN(?!Z` z+SY8O=uBjswXeo{UMHJ%{3W68J$;b4k|aO0ol*seO8Fvc7}4HuDCj28bU|0hJj3z3 zFGzALx?&6_iZeQO70%AUm_tJct|$nd;a!Rdqj}k*Fc;0hcsfW`@B$VOE_@{tO6n)4 zE+x~YtdYAi0)|l_u$W6F+#{U&Yks>h~N`quB+{lQVi?~l;;~D;Hr0njyx|px#AdO z%h?U6p(T7uf=-aIYr6V1pf__SIrb;v#OD!-p!IyO00A%SYfLEe$R6FB2cN=JcHSV1 zi?T*~DnXfDFIBl~jLiJzTq)%_)%F#uTm9%kgy4z^WFOhnK0+y>6VWoFDFjkPSrjeR zE`^an9Ofc43!;e}6^ke`sXezD7E&b+(88gEH;CA1hDlDKL2Z^7q`}Z7;~QbyB%J%# zW5HHu>~C6Zv#XkjJVR9wVM1Qe=vvDxQWm5+@Kt0yCn?=s$B$L4+HU7%6q_b0 zRw9onfl`8pmYU_%$kQ1@2Z;6z*?lt6D6==Y`F2qC)A1g~atr3pP_;VZDF#uDnv2EC zs12oDakS8n!{|12A4{K}36GS=4ooR(gSu>#b_;4zy(Y<0K0XZ7TT+^;PPIS&&{Pr& z*oF_&WVVUxMlnadmuzW^@|!P<-wc7hGeEpY5RlEv06tTAc?Nu%?ttLsGf!AFR5ch| zMi`5Eu~wb!ps=UH%m6V$V!BI;KAn>}F$3rMxA8AuQaOCH zyJr%qNi86MUcHxhnB$k}pYpWpw2E{d>^Bur*me=>v;_OIwo~0`P$&6D57)GLv;#eW zr4^IKx3BJ^LR3o}GC}iK?jvMUonKM^P6XOfK8KTTrF54#bkn`84v$%Pswkuw#Ry*` zzb=E6{@A2(@1KhPRkwGcj^kvYM|#mbj-A+AHJT-Z64)9cI8nk*t9xXkRx8PD^g^fR zMo#oJ@Ud9fN!?slf(!L*I9+<6gY1)UK4P@J=b0bi^s~`7gP`u%Cl!5H1*ac|S$*rB zQS6asE2(c?z+{>u;4$mmCDbOCM%hi`b2&n3xO!zX{$}a%O65z5m$AK@b`3TSrNF0e z1A__4e67K^Q9on-CAyMEUd`Ei-t_+aDgD>e_*h!!35VB!{z!%$AID6A$6Fw-W|V73 zXa{T!EfvUR7!Fi*Y^_y|EZZ+rq5(3?wj|ClUmxEdM>E1aimmS*S3O?S*&Q!lWLPc? z%M28IQRSf~{w}-TLNmw(9aUQ1UDrcv&qV=`(3AfW9W`ntQu2ZoaZF=Xj)2|t9jn1o zu{^zHtsIP|W>cZ`k4RIv`Gd7;=*s>iD{PMZ=^lV>KxpJuKRoD7%5q7X?&&BoI|xtX3|i+yL)0Weh#ijk2F1YE{98U3Zt-o$-&u zw&YZS++1)Fpz{e~g8{yi2o*ar402O`ToZ}CEy!JMMlsu`k8e_rXruYh1B{gi$Fe?R5R&?`+KQFZMT6K zLX9Rd8GGs)ClDJ_F&$9daEOrPIXkKBNJ?NLk_=dRhmkZwPvu&4y{>Z!a3!>uv4$kx zd!xb*-yoAj|CeOaenMT4!8UUl1P^d4O;8|Z+e;*f4=19uGNKapSdR7i$HBZ>%Lby9 zcY?qVT%IWs)Jdj}Jn9BZWZ()cWdMqVaytJl< z+;3s5>hZ*~9g#1>2IJjo-R}%>FP@FpGm!Vf@iV{b>R?cb_8rIT+r1|p!}IHYY$^9; zcdD)f&(}LV}5^ndNP0K@Y^3YuX8$sH z?H?2q11D?j3{BmYmQ&wu{;=bwN6 zQxKp5{AmBz|9=|Nu}Y(;G;Xz>9vS*+=jni8btu3pS=z+Zm{u5ZfjB3?SmFK~j16K& zAgp6d^>xYQR|QvHQ*O!KZ0n=p55NIQcnIq6!17&_lr>7*o-@@Ri_t=?^@VyJyPnRv z%irv;JBrI``Hn)Xn!6unmp+FZVr;lqLxI0{HWwQ!FWb3SI=fzHTY%_?hPPmBx87Yj z!81HDsoSdd@9(ewbABH_`F?Z@I%JWSIZi*Sv1)8@u68`$c1~_ot~ztwSA7qE0$p#f zi4P>FPRV>V@C@j@vG5k~@C3645??9duqTGNK^GHNa$N06yT>%TcDh@a8&2xblhqTe zRJ#}3JZ~Sw=+rBAVD=@20-xy5Cgm^-9bvf-BS0dwl$~{R5u~*CKK2X;k9!{dp{r|Q zhXj0F&N(cR0fr=gFwCr1(y2`}h0&n)J#<;%o>ZnJ?|76?_nS8avzQSM5JUd>m2QQC zepv~lwp37bTErb?g(bu+f@o%^D=PZOl!7vaX$Q6d`LS@41*D)B?}*<#S0IgT9@M{q znqoTt4gMH@5UvW)rvNQ)GM|BM2SM?YOxPi;RBsv*vTK*u0?gsXXQ;Y5kPe|2kW+Rp zMS?V<_pZQ;V6?!cI2Hs*BAtPP(C}mOI#rh`Ly}5OvwsD><&`i4P_D32b45O>bOdBq zfkcF+5kN>I-jDXlUg}Ds0}_Py2->8ZTV941#@zLTOo(CRB{#t|bj_yYs9Z2WNDcbq zYBtI`L{zCmoY_1gQ#@EwbpqC7B>z{gW8A#5;8_wEbqTi(RD#IrWVD1ZU2jS+%TI~D zP_*wF_H)h9nS$S4O1$d2p|ieOsv#nZnS9~zg8N5kxExq=Yu+DY>igV@yvm5KqZvn5 z8o>CkF_Tq%lCqR1t7`<#Y;&UKZH0STuP0DplvA#0C~*C?mDbIMDQmta2}VERI53E^n~jul#wg47eB)L-Jl1i z#AoZu+1CfiY|Fr7{4DIw*%QF~T~7-Q)$LVwvrLPIpEUSFHO}PcrPo&kFqPHoO6`;Y zC0mL)E+z!#@-4grQ7HI5PZ@CmW(Db>rt@z0ftcMdi6XEa?kS0YMR#Dy2I=9idJy-w34CAs5DpW~MYYWY*X=*Nq7fuzp;>DTUMCgoxrD#R58?f@$hMF{Bp=Eke< zG2o_X;G0W2`;)qMpDr1N1lTNcS;!xVESSO>k4N%tDD^%DPW^KX9K!=63YyH0kSIF#uZHQFaT?I*(K+e9Jp@J7i^~`w&DHc$>gh5wSW^M= z0nd6$a7SP$8}(pj(P(rbR}i+yOpA@b8FHPuLPPXBaca2)wqLzRmq*MFM)%VljaGi^3;T{C$VgQ$o0ogknSU; zzBq=^&On9KbChTE^lBhqI-K(_K2!`iy(3`b8ll%R4$!=-?Cw%#EjHzm%&}*s+#45u zDELn0l1Bgt>}057P}I_df=I_5&$vpf3he)MW1_1_o6^@w(qOFw1*cju?Uh_CeZ&4c?#oM!ctQcTwkEhEUb zu~W_T;v6XWuxeToVhG?TF1o?-iNCQvD!7)%UNYv4l23Er@VA|}=gKCCH4uIe*W(_6 z$Bl`i9CZ9POhOo-;MH*Q*V^(O}Xb0YP`@ zOA+PtDzaQ(4^N_z!=r{7_h=N()L??F7dG1rp^dyYt}LE-KRHty4;4Aoi)1k6Mr4N5 zG5n=Gw076QNBF4f1!F=AeYdFqVN+d}jd7==9dzx8BQ?AU11+DW!C5M?IBO`&d{ z=FusB8tjWj5$x~?r0Bwgz~5+vrRk)e<_ePDx%(_9<&vq}vSOUhv_CSfOdE*b12rFJ z=!&7GPh$t5(Zdp{nuPvR%Kw$qL&i^thK%0-SU%{^z~w+HthB0_S(#En7X`WDfQ3-W zd71jsyLm~-mih{D(Xkm=Bvx}uYkqxODJ2e|X`0~eHacGUm&ySENmdmUXAkNjiY)i}>!>%q_C<1JQl3OQ#4CrSSHRO(|9V5TVb7Kp1 z;+b0()a%YE8eCObL#>~fJ>HGVADNoV?r>0Rqp}H@lU)iL922dtS4Siadz$!M`OU8# zA*Ss(Lx6(+U`}+N<@ojt$GQr=>mI($`i+ovU%@5yuiofsxkw{Ym$pvYpwN|mlDt9{ z`686}sJoaREt6~S98E;puy()c_}mZ9zcoF%&2P)hq91e6ylI>ElemhMXr*_Z*x+`_ zfV#gIhfms$fpqVr=k3YkcJC;!M*ez5=ayY#N@u zDJ6BC_y`r}3ecMnn|E(YrdpMz$}2Xrk-Cdt%ho&ef2&Mu+4+8HiJVeY(6s)o*BSo0 zR!z8oZMFkX#Jw2|O34{M$nBL|f48Tj9UCxGtNmNTKpL%C_k>8zT@ozIw`u#h9`*YS z8C1)=T@!|eD4_1lXs@h^L`;IuKVr!!vo3{pC;M+1D2YT281l_ z_KME*-FhI4_%lwLLZZvd(|bC~BXLWbM#GuoRT%v1HM}dbmKJ4_X?nVSduDo6vb8r2 z@6zhp+Uf!~w)?k5mCcon>=tI0?{_$M@;Aczv;R|*>*Ln-P@uJ~{&_z%a}#gN?e4Dh zmCdzv$Mf>%WE#`{^Upv3{J(|=^}oIU7lS>D zXjR@>dQv}G3?ZS)=fqk>R|go_VB`m86e*gGeh{FMhz5CWp}QpDC(>8<4g3iF!@KL{ z*h$4i$e4MOP2V&$b>-yBLqtTxWZ8DzVa>+N-Old5;ySo|Iy+n9`m5bBZAw-u+r#<0 zeIHrlS(;gLE7|&UaQ-~#(s$CiA`Eh*x`QrWgBj58o`#Y`R$|R}1>U^2M$;-{l z^?MjOI(kaBSn*loRH@77`E$J3sQzYhOl9kp%=uiL@{+OJEOR-WZN7LD{g|5XeO?{i zs*LV=0;@@M>2k)SA&Xbrecd1f{-|sY`z?UwW&KT`$0NMTx6+UdxA6$kz_hrZkrc$Se z?%^Qlr3uNk*$)PwAHh81lp0q#y*2nUKBHM31#InqaT z2iT`?yX#HD?0VR*VTII7*^5Evu`mLozpbD4=aT4=S!tsXW3@68M#(>s3*|}`GSd3P zM#KAn{#DzEUZ?+rxBzw++`aVE=KAHV`{h{1FZcb2H%FZc>&ORjz0~vZGnes3-1%>o z?597n6**MVM^i#_7T!fs^c?yr#aFx;s~NLhq|U)^i9cLdUr>dh&^nTMg}i58q+yR} zV{)y3;PhdurX@>1|5n)Sjz)hdJAXh~o%XOvwKpApkx8CRwV;Tll_6SnB{2ldtsrp# z&jRfN@f|b?&EEoRzlxpo%Ey{wW#~jlT}Bw`ozDP?c^?RM&G9nxPdy;f1IDS(QXG5g z4PKAQVCUAPCMNAgiVD(xm|zW=C9gdbeJMRE8Ou(FY9icj7(tW|e8 z=Huy)T@j6so14TIIPpDDV3QR1?#RVw9Hmx9X;FqDRVbZdDohF=p_nq4do7NwE)~&9 zkR+ro5!!)UuK+9_2Da5jj`I^okiIz6E5L zXaqn6Q|RcXvV~YYjY9l9p%8>4E|zFXczKgfgJNGpu91*iI2LoNuuir{-~24t8UrQ0 z2t7G=QFo(A6+ffSnRWg9<#nUgyoKDV?ZMKIL0hTOs`FI3CS!K0)tZtrYyq&Mm8H0a zcDQ#$`yKlrBs5PvolsJL1Z7Lb!%9;R6=^jUZw9d%L>%E zK%w}-V&)v&&`0yfwV)FVsHrz7u|por71pTth9h;~YWk1Wb! zl?+~WQO3v`s`>u7MVNtbDKY4>cC?YRh@3QXcwhjgq8^um)MWUb}`p9Qo}O2UC|H0d0UPETZI}qAi9w<`WzJ@Ib+fP#n47w8k@P zn)dRD@q@eNbK8SvU=~II_D-=0F8|-TzE5De(VGnfuvPRfSy#6?8?Pzrb`^#&h|ak5^cp#_Im_LO+M#z7lm$!#fB=hXP9Gj>;A-={?6jukL%~00e+jd zk(tRU2ifO%_~+R#_9!4MUp^5)aBf_2Q6Q>wzc23zCR9;fmHb(IzCkf``+oLraSE8` zFmQE*KOEMpge1xkgo%*&3-Kq+ z@0f{NB#=_|JWvYnlT@c4KD6{Fv7KO4;yd`h>X@E9^leRAcEYdtt_UHHgOAdp5`fxb zUkH#!J9nT)ij*!V&Hc6h1qM>l9tGr7G@S8yzGq=0rW%wASmwR5FY^m-baImS8Gro? zhP}gP$V(5XneaWoXZC*L4c?z#8F^gpa4sv4z}b|_`dP^FpIXqD<}Fi2oP6|1zagS| z?V<74$^xq7!-!->j&D(ScvFd>={&Y`6Id5n7)$Mm5luf(s5z&7bYBQe-0LLVgo5n~ zXs=_vqj9a2O(hDa+jhkxN>G6&%qOuLh z{hnqCP=pgYrNtqRwf4a$ne+mqTqU<06dl|D<7_Hqrnlm(j-yY4(L)( z4}@v~`4%3@awhsn7Zbn_!Z#JP+q8I0lN9NHk%i(Qp8f6I$bXsMS2YfX*^6L;hV!=h zXmb7mrS*x7MARpZikC(67v?-0J`2s#2q z?b+M9xj9vr*Zbg<8T&(K^sf8Liu>zx%66$46-_^r8*FvuD*NN4i-GAm;@jVI8oA2% zKZkEJH}{Q?+}SroVH9H$q{`0M+w-)4CH0bvC&$niQvD`1Q?}Qw0X8@`SRXs23l}|7 zM8~8H=h1yck^x?DN7yj@9+O$cAjf~aOJE8oi|YiF>Hx^eMpKuNYRcI_2jK*P-oO;# zL^Zxpf0i~p^3L4TgyW<=P8QJ+yf>%b)MZGj4fVOGEWh&ngdC1UcZ^IQ3{(Eb?L}M% z;u>(H^spZv&5)tsz`Eor4gH?d~R}Nze-^;u~-7bAR0-HxoWmM4mDYTG0sf~x{WUIxzFJ8>cli_cn(>V z=d@9HdAp1tvA`m5JzOA4KBX`MLnSeTqhZ!EV?aITBZqa-ymOQbVd%~Q$+GE$BUzi^ zzPNTL^cgEE+?WkzwAa4bNXpZn@GF)D#&b%D3-f$gDpATfIaLd(E`~_uNksjvQ>U#! z0)iA#g>NqZ`Da2sJsdyEp1jw3LM%<5pt6R;crWiGKO zfRdh7o_-)(7Sp^u`WPL;lO#BgM3~s|I+E^wY7Y*bCZw@2grT?Xq7FnHqf@K32c_^@ay z^bdn1`;Mn6+=yq13iw2z!X>+4Kj{Q07anVJS&J0;F)u27EFdEA3-k=w5H{TPg%&3c zX&Uqf;?Nv5iST*?iE`=1IsNwEc!drPcg-${6O_cJCUPSCX`uGwq{nJFO~vD7GhM`8 z3W@nTo^(6mG5SK~$<1#4G@}x_$^5x1x=>h3o@hehStIcaB(u0EHk5Kk)4y918=ZBs zVX$GEGIsHB3QFaAr8V%&RLyQDw3T)eVeYj*q)?DJ6E;}OjMH^2C8c8@dKK!MVI+b{ zL>kT3n7|1_)(NSg&WoZMDux}LvE2+VnwO3SC=8WEd~^RXhO`N6xZ^ z{iGQpV7un5ET8;_QRVA+Z6aOcD=R_xQqKsjRW1FCEZ9`(g6795+;wx_cAA@m!rFx* z%C>@8UJLs}AYq~5C=~;I!jW>iUJhX@>b6cfD^K*@!xYikLy3#`4#2jb!AZ`h0E@KJ z)p!Z97WE%;g!M^LBn>IyavjSoTE&8Yl!^XEGxJ~8C8Y7VS2>)83-yYDJ2KLz+qJR( zJ#Ptliuj9IQz2Q{u;cfEa`EjhUJ@&m0PEN9gwui5M!-m)i5+TSOD_gx-=UP>Di#zN zz0;`P$x4*sVY8``XBF{@pb->~B>rHMglUv;p&;9cOB1RF< z8INZJXEB6f$6&I%yZf6v*Y6fW5pTw5d2?IrQx77f;=D@nwy9{7ZCf-i; zRW(2ZcF9!wnY|JwRWE<|B!LvLWor`;CMGhYdA3x9+7&*gAFK|5Ga?UD$25Y;uNAU* z<$WUVJF5j_!dB3_16y$eglvk7n}dUfWCS}GDSihpE8w}e3hJ#H&bBDP)cQ`6q?eF& zPR4C(_axe$on4B@=l-B7OHCC}JIvnA0qn%r?Wd3H5N_hp5dH4=7Fx@ca5()oB3#{# z$RxMNCV&~(}(AbvJ{sWDMomq zvYY1+ysg>UPHzjr2GH>Uw5=I*C>(i!#$R#;rLCDnZ9D);hk)W3yi{-J()E_S$Nu8G z69UN`@~jh}htS@(VYD+%Vj$G?+nXZfPXBJ2;C}yoe4gQX|82OnbSd<-v{olaowpCC z*VFp_4ts7VXOkB@H{0>$_LV~BE?!)vngpa9bSVHi4DaPG+YHRJladGIyWgj56KxOP z>I)hCH#qWlV$k>Su$SwV#0~xlfF6=R66g*M$q|N@F&5x#PzUX@;j9cy!)Yn#4;N)W z8cwo*H}wm3L{b@NY-|rpECrr-L(7# zQD4y-KZ~K`s|Y=fot_0jdxe}Dv@msk$m1K*1Q(K>e{_WpHIy!C{w2Z#ksireAFE~k ztN(HUcteX&FQoz0TM!EZLGVxbyCZtzk-^$5@tJ9cJ?=iLLFgXvKKAh~FugOtn~4>? z3gDUx;GM<*xR#gMn=lBv3l(Ky{M$ucuEm@ztYPTgtA83hKu}`}cqM;TqSAhIGBj8% zi57lWApneKKYUN^Z+$KIWMlno@5cJt`k8fX-#e30fA@2?v$JrUk9Qk7@^8D{;W?hi z=0mUYqde>UwfFb)$A~JGZ0k>3d(YzMgKFkwY^&H$vT5tQ6>9mnJk zxXw`f*nc|f{`1d2|NQgc>LC8N{%@w z>E-KHEg$Zz+oBAxl+feH+l^Z(;BYsV>&w+qEs0b&(@xLx{ZFT6CjheEwE*PxtBtRH zwy+=Y=O6BtTHbe`hwr0L-}i62-@x)4NhxQ5IcmL+kCmOD&rUq+>sV{(9?JaZkC|+E z+gtsEzy|8;g!KB-zL#ho@D@|6%BESfa!U!rJAuUWH?zmFR@1&5!}3Ad>O5vx7kmYC zY8kJU@YAXM+!3^5ZB`ekD|#twEM^|K3S%}Cr7U#jd7w@UE4(Z0UbTfJ*xw~?^R-y5 zC6I=e$B|ynK=`-`!=7s~AYY_88<7GfB07v&F>13Dt7RTJjy*lyq0$Xpp>Chmr(^sBGhxkDNzQ^xuFcD z3Pq-Q+tjKqkls$#@Rh^Kd~2x4d`WS?b7t$xnkXV^h6MRLBe*4N@S#yliZ+>e`7^26 z)LSC&Lx?fgjV&M*aJ|arF0}TOYWP|)2juoChsnvXZnWDc#A<+ARBrFaCdpKIH77d7 z0!ZWtJn6t|2s@WwkgN33L!y!;rwqmlZCpb!)iNB?OoQS$xz$r$F<@&CqV^A1qLwPQ zG*K^nmfdY!PTAniI4In=E6P21oJk+D=R~MF!Qq$Ux)S##N+`kbAUddrv-Sd$P7Xa$ z`eRye)5wocj_oDEPVURdf@xc|dp3{Hpbbp0ypT2Xw5>&7q=VaUjaBXJYlbDZItLz} z@Wh$N#kz$153A6GxIFuQJpZu?vLBWC-e*8c_b)UIey&7 zyYcS~Bg`r9s30FjQdk_x zWGCLt!@`YN+|0Wk+M&pAKsnTkLg!kBK(+1e86Q4|?u04(PDYMz+)F)xy*6d- z5Kj;ps(v9vqK-KjqfJ51FN}K9EXe`3$3nR?y|^ZzAmymZc{VG#jvhwECnpqh8-LCs zQ#KijC=DSuJ<`5_OE{p%3*_)uu(dxuw)A4aF_nYSc5o(&+KFkiaHj})YUtSIqvy4} zF*kKE@}O;(4q8w(=9G%{rGiz`#a-O(RTfgu8aUMT z`FPox9_S&gPBpMx=+Rn)`3|;t)*Il3kM(KuwFKVm=J@L8*$Uh@8{h?BVj9R@(JA1? ztp~TYiaKkyeA}hf+Ug4TM%RPms)@FhUo~#?j2)W1d-g`7?GLn7S5Hot=P&_ep|So* zz{oLv+@Z^SbqTeSyQ-=0g>~W5yPc_a^Z|{br_s^uzpO8bG^{S*$zsmShEVC8(IN9* zph~Tvw5Q2-(~*b&g;!)lH~5-E*J%yDxyGLE=3N=eBr0rcYD99Ji1R`%X~ zm>LAs%!Xr+gw;d3$C=VoSc^DG=;h27r&4$HUVR!Rx%>}JAYqfeRg=-_+Lq9ldrVh8 zUc$;4czOpEs_e6g4C{-U*K)fWxP@-;rwi_PmxRp9`mpktR2DcF0Y$ZsLqrrOo|tTB zOex%{)#mHhmMTFuXSz~`uT4Mucp+Yin_!l~#E(|?1veaeXbNd?J02(VGwmvDOtTuz z@j=m_j6JENLG1*Uus=hAhcb_C>_9DcV|pA>D^P{y1YXdidB3uq^>#^OOw37Js4|Co zvmf>l8pBGsA&PJwBfg5m=gijF*3ii}2h>$Q6 zaPcTPNC!CppnT@N>7Z^02!<3r#w6sUJ*;PljV^zu3H2GQu~>X?cR(oalOq}DXH{ia z#ggnmLNzdRhYAmm3ZLJLi=5(ZlmZHi)>5*?!HTh-HFrB=s$UA>L)XPX*&+kyd zDM*T5YTLcY#Euql>moeV2 zPLk7LE$5R4>LpmJGj#+9E7Jh3ij^HShoBcY872T#NtdOb_@ld@K z?IxKZY6$|P7-X7cL6zi2vZbQ4txe#>s(x=uSOPr@PJHmioT(+E=Ob$=yejnQq;_29 zK=;AXd4|C;q9;fEMuqyqzh2FIbrJIhU=t94^Z(Cz@}D@p-4>J;U)u%(tQ$35v>jt_t%dT}5%* zb#C-ogJU-U<>3`UnI8(|&AsHA@NPiPIxRGDxy6Ee%yM%x!ROPQpz_siK?Wm{!Zwui z#A{IJ&$0>Wr=6MHOH!%R|As2CXU)vB4!jWQ)3C87UGesBKtW5bAhTQ4WZrc_62&%2 z56|UbR?Y9lb0bf8>Xt+_;la^OtzbOX_duv9iNqClwO(qR09)tS-K{i~y;-+c2 zj~ggnA#69hp7G{5*dBUNr~jnt)os>O?S+Yl4@9#RfXYnKQCf?)HZU6Sq!3ed!rj1_ z?7C(vMZKA~EEz#L7GP6ud4`$=9_P*ewngE*(R@ z+!SWjtJ|!~wG>|+!p%bQJPAkH6~0<$VS{kS4@d5_zQs*ycJxxoJP7EQm$l9mgw2H5 z;gwPGl`0Aof0cr5a~%7lYcIsBg_Sh`&^F_3r-lRuVZ>ui$LzCRg_S22dcyuz++ zt%e-}GRBzeGK!IZ!LiOSKQ=(AYDPE#caO>yf^=ug)2O$(X~Z_I;EW*W10D2;xn$8q zR1Cj|sPs9#@j*G(5erA;WyA7z>#*uUQdaPdpWCj5-aYK|jjq~`1Ik4xovsN8)o6aS zLy~K`tY~zBYS9LLZ_s9tGOSr|x_PP3|GZz3zVrt{L)xa&25*S88gjb}l6OK12e@uo z#|xq9U)RABsx0^8As1^M$71@I=0TG*6YYzFFd6u#rnz$=F^PCD3L z#rmQYM*ej<`jP3uH#*k+{rW_2#}0qK<|32La2QWJQgdQ+Z9dkTIhQxYVBxWLThwN% zl95Ws1zV;=y#wE#%zKLv~Uo?2-FHBNJlu>wQe_y;^^9`Rqc1#v1fIIy-?|M zS|J!Dy@=Ica#HOX6##lbg}>_})A?{emK}-&ZR2e1@g1Z3IH>X3JpmNQKk+P;)lBMx zfb^RtDIKMdn@LL7hmFuP;&%trMCGZ;V~w2ffA=XeO9@$;bP=ZP2dcfWD^|l;1y7lS z)qljR@WbPA=amJ3VF74z_YTcTlC?QgM}!g*o5Vz)p6i(1JbWmbTyR+Zlhi3J`ceV+ zIh55M*IPFNf3=oL%gxcZhsy`*#C+;Mldj%6r8fhffJqFXe6>e9xe0X8@{7#N2I)-dK-6oD(lVR3j3tbrtQAk5?ur#Z~A84>pi-BFwBT{RiN9Dy_>jQ*G z(b5`($BLt?3O21ur^~<^WXv^;1Z7V!jD&XM1t8tptP+Lf;%5?s)G{F&^sw?j*t^H( zP=Iz()3I&awr$(CR&3k0ovhflZD+-{?PT^;P1V_7=fl)H=j>elBl_;@>V6)Z@CrZI zt|5&7907`=VSM8ldZ zdgcUrVb#w=kJ}MeGDk3tHU!cQH3=u<*F%LcS5k;HPyE^Zjr#!sMLpg9J2I{1|76b{ z+a5oY05Gl9I0|K%w7h3dn6bbk`p|yC2++Cz0FxVI}Jg=$K zm(>Rfo6qI~vs!I%dhmEnSPL`yJibCQ0w(8p#R*ZkU56;}bs-D24;NSipg5)jQdmuJ zh7IW>65M*fa1Vu|%*=ROoh$hN6~R0WnAKAN!Gz1^Ed{aPJSb)KCr9*ORJQB?l$Yxg zH094($X^+{uIUZE#b-)3Fa8 z=>%avQ`Q25{3Ne;B5AV!w%h3(EH0C=JRZV~leo|148a)i4RJwFF2Xt?FfC zGS0p^of^Hy^D8Ltfhr41uL55-Yv>}$V-erwvsRxU6;|IM%-t~?fYUZG?wDDGy^MfMXNav4JVKi$N?e*OCOKY`1C`~P1%Nmmt7&;FUuXC`A@ zN5~MQsY`$iGL4GvuU#+|WO6(tDruXZN_r+vsIeGQ#<&cUd%lQBO zT6@ZZaCx#krR;W(gIiVzrH_`Lq#r#xz7Bj1`0DEYJO7V*`L*8Pj^u@6>Bg&^pg}iV z-5t*CG>7-#g;((pb~ig5m3?WEqa>N9ZwET!iHr$7yiiA}o-&$O;~4&lEtz&_mFwGX zG~5Sv^+HEV_#;u|hmUY=-W+LK&mjH0>J*ds$>!U39Zy?bX%7zDMTd5nJW;j@y`|MZ zR)xq%pTw3^tmS9I{5A^J^6Ncnn143P0<+X^J0lqq`JF{HW$jp-%ref0CO|yv5nW^! zz|-mqGtW%DB&PMamrAX4YG*Yc7W7zm7>TO(z`}@!1^UW^7)?ylAq1KyDm}{n;G>|N z9l?TAOQ+$!D2uB*ja6$gl~_U*G(cIvRN}ll1dFgKC7=83^Nun7ZSf6>^zqh>Pd>w9 zE=ii^AS)q3Rm7}REgN93%8QiUWns#0O6XfI*oFX8%47Dr=fQ}3f7fR0C2oaSeBhm5 zXEeKtL^sDg@GX8#WoM?&>u-ENVB zgLnNmN zRHQ5a)MR9rM?qP9PxdvCu6h zr)}VaMxzz8bB~zBgl3yk%9)$hJU<%Y>YpenPa4{FTZcmyRM1Gn#ac&;t@FQ?QEJnj_Z5JWx<&|Jn{> z=?ZTu230oUJy)wXN176DW-Nj`Y;D9a;B8D1Q9fr}VE0nHfk?Zz;E{)DpC?T4L`iWa zLwv_A)rVmUZ=9;>cv8h9DBvEeY~I{_y+2jPofVA)qb{>ur!9krfjR-ZAWCOn8}W21 ze3c=xUUXjv0rd%;J#X2x3|_7=k2%=vm|4_BXg8DfjiPY3*u_OM51^<(@$Jy%5@Iwv@VRYZUn>dQn!uE zgb8rzTguGRe79!-;8LW#cB9dOo$xyJN813hhP#Ym+yE=ID)WB7B?S}Yf-TZ{lS?dU z|2;pHa7B9pm91bA4j4~Mrb8SjOO0U5xhzTrWqd6@^F1Bh;cRChsq6#+i&V4n6oN(s zB%OKn{QS4R`X}Qs!2YT#CBNQm!9SdiL%8RY?hKqATg`U%aTY3vPhb7<8(4} ziMM?BwcT{JdK1V$-CjYXBu*6$3c9XS6k+D<7(|0E;aiwmyF36wxqw||A@ zw>61{7JAROxW1OE3O}P!UwIL|qaoN@AWF(&V0HTsG*I1VyPC3(j@3c!`fXOPL~^YW>Cl$7*H?TL)i z@5E4Z=X-2AJFI*eBBo6o;vJ)PqL-~5^X@#i=OKo_dWMPh8UEU=np2&C22I}k&ghtQ zsvRKx`-f`lD(4}|A54yquF>-PL<5}%nLeWxb@aV-MmM?2$;yuX7AP9JfRN$vuY=n8 zuL~AwFG~NowJMv$AvXmqx9vV>S07~Drvgv{O{Yx1Ikr^tQjYyOlMoyEU=@N#^8C*dOeeuCZ zUg#?XoY@<>VdtE!lCrcL7xCnmvs8nw=!pUE#?ZQbpa;C1VuK7*pg%urR)Q7ld|N8A zR}m)|^*Qz>%^!WV>JK%MCoi(7shs0aq;%@z#OeTs`zy5y4?NE37-=L}V2Ntpx;{v7rHBbgB%`e-QX-<%%npa`P_BP#gk%R@6I~O^ z*qFsaIejTtnsy_GAV`#g6`Y?6uhxxS*8IGIxk>_FZ4rkheBUBRr9z(aU_q{^Q?kBm z2rFItb>y;ea!{*SyVD3(G3qQkI*vDvjKSnOj?hELY|W&|m$*l%WoaV%iqL1Nb|dPC zrT{mDzHHvn_EQEL|MZ@k25^0XiFt7XPaS9|P-r?(*s`iQSRK@Rz_2o5bMhSD5L#OM z*l=ZJuGiL3DbY)kI)YZ7)8=ehs zLJY^f0Q7(zM{<@Gx)N^0ynm%*Dv9XSlzP;z?=0>o?d+k=9+9m-c;_mdd87xr_LshO z({Bki?$M|1QLnZ^E{#+nn|~$Tpl%icl$b^lA6y|GA9~A6Gy#3HO;+3t0zhCF-8yAI zL2OJPo(4niv8V#>ZOLHaWFD^v15O z?xwxky+&pA=Hj3J=uyF!iq}r_zgw8!?JZ}u+TPsY%+&Vw^ftN){A89a|B3qYh&o`A z)pWM0_bT#zIosi^(w_fM$KS7CzkdDt9}5Zs!2d4z|C#@1r!0<=`|4ucN*Zw`fTT|z z0r`{!!&` zhr7*{qen zjZddzbC=p4<#W-fl0Gf1etQoU6#jujoIF@p*4;`U^x?*yfpO3ceA}$M_AccH;l_wE z9zO+aHz2)#!P)_Ma=}oi0Y-F($d{x=RBqKJqTS*^ebQaFGcsA6ykP4W9GoU(-@}xB zwv_V`aIU{A_`ydod|rqd-tIJrH~zuZ0%_g05<(d^S)?>dS2zhTyy7cE$axcrLJsJ8 zc7SWF8I8YZrZeq44_G=Q3lK!XHj0txL=dJhh?5alFrm4M^?s-}csPsfCK7|VVl|}< zzoa#gLDZ#IL`MUPLb^Xhi)B73Q3#8@3qpH0i!M~PW)sdtLxGYo>{{PZ7^8p$y^eVL zf5i%T5)Mqd1dC(?=waw`clcUmz8ugEPIY4KgI1Cf4UcU5v<0^)7D-Y^$BonzJmMX_h{b-#MHjJmyk1vnDfM{y85*XKx zhceC!@%~mA5o~|iVl#))WnznZJoieoBj;|4V_;Tq%KoMmB3EMbmyV^fXcxSB5c^Yk zg2VVUVu!o7uALN#Mc^R5Smq%!$DKzFD!*v{Resh48kdY@8en7?BR$?a)(waUen&CS zi3s2$kl`G0st7AaFpPst;fn95$veq0xm5vlLQybI=y_+k@37ns=PGXNTF60}jQCCi*>L_KJE~Oevx*4x zg=SpKGViZyz5}IGdHj_$+<~o&3ei<@2g;KcYbQGc)xVI6W4YvLDos!R_YMT9^4)7D z0~G}~k|+k$;Y6L_Xk+yY7?&JI<<;R=z)^ro`N=$T8C|skmC9~(yN?{_yEWoLQ`&Wo zCWs@NGn|u^tF%O}CgTF5_mzD=GFZ^gF-lI)!??D501F?dzOrlKCE;FH30(O|Fqxpl z`S5t$Rw@)i=sTi1&c-b&F1+lqnuVbyX_<$Tr5-eN}r7#oXQ%iZKRUBMZ@ z&3W<~5+0xrLPQJN$Kf{(4N@vdOK}o&HhCA!`wEa}O|<3=At2I$!sXb-HZTfD^espm zXj!r))q&wF8(QX)aPSc7{L;VMyQMfC1Q(Q9WpaL<)>c(LJ~pjLL!~PAq75@8GB#l# z%XUY`sZwfVrv;2v2EC-Rcz@5F4i{2{+OGwtJF4zA96e7DkF&3Qw+}{*F<&GV!*_Dk1R7I&__UqscKa=!{<{HzXkOmLc_S+_Re8J)t4ZV9c2oJ%culz_ur zV_7CvFv>9Rk_!vcU@3W+$lQ6=fW!XXu-s@Efh{=ku1Q}# zSJ(!Vfrsm5Li~`6^bpQx1_W6@a5{LD1AqN(@7m6QQH)T5zM5tzv|yyo1inj&)l~%!<$ov9I>E^&yry&yrQah?C&E{?-D+D>R2k)Fd0+A_yfCIA1cKy(qmVBVOwr*Iibq@n z0>o4H@t#=`KrPu#7vO2IJOKKhaiY)&zP=|NLJQeL@NFexlR^&v&yi&d05AEPZ!TmK zX#$@O664_f34o>ZBd*Aw{b_5^WBze4qe5{|-u{{4;iyROz-dSYE>*2J4UCE4)9}#y znSvAKeNbb+87j%U(5w@mor&$IBvZ>3@4aI!muf9d8>Cf_IMSK4)rtGSm+gL^fB0lS zU(FrfMGY0-Cy;UV&uqAIt0EuZhaUCNDWjWhrLwe0ac zdbbk$%<>$GsE^)eZ<}#iF4+Z^-a_51t-iQKY!iYDcGSubt9c> zmD34|tN#I@={d&zPZ!CrU%!6+`t|GoYgzy6{lBKHvd$=KH^WVLE}$k7GYqgs;vIoz z1CIJQATc3`9F7D?U@{V*UD|yzFM`xiAq<*?sk$Y4(*s>V%E~j@$572@fXWg2Aw9{Y zb>hs|r7tmb)(~_GwbJzH#fRRG*Gzk>-Ag{6Kb{2o#>++)sl>DG&c^fBkF!Gi+P22e z(~Qy|=zQodzr%d*lj|T+CLo^sn?C-}si>F#d;J`JczwfbZwXtw0PG^2YFgXeR9XAX zty_M;@HxbHcY54>b#DB7?Q7?8`!>4FGz&3BdByn()E(&dEape~_^hFyO*t zrp%1Uuaqe-K1|rH8{h9sOAk=c87M>L)qgZ#n7|2B-jGV-%3PbAU95{lnvKROif&X96IU#cQ9nz1 z?3CFcq{Kutk$*$H=wE0tpPv`9S#%q_XZYMSl8#IINv6*Zv)GlAM?pEIv%59BhPX1I zG*p2EAJH{b^(vPO?K!pLF`t1ylb#7P8T^1-;-xsAMQMmUQV~u#hZcMJsZIpUX9{e# z&p+QJmr%}5qI~WY8jZS0fcP(Qzau1+V|vEoUz>Z-;(e363S96J_cKiRABUFYDV>TGpAbkdZ|eo6pPE2}`7 zVx-?=ho9P0@b{VFW@&`AmjNXnBA?`fCHr3RI?jOosub5|c} zwRv>nqv`=m7EZ_ZMhonVU%@54PpafuIsE9<;OD)xNMxeQ1O_5m%EJY`BAqa}oOxQ0)*> z_8sX*(}?lamV7Ai8Cov>V!AoSE?=G^=){EYNCs)(VJe}m1Os2ubNoZJ-be~c9FPaf-4|IVT=^y>-4I71{_Y7V&|#6mr# zHA+|}8;Z$#iQ&D#+z>qs#5zP)>b)z5sMcv7aWGxSP6(;hJ|K_$IF`Ba zwWnGumxX)@p?wRCa*?yOSG+3m;1pOgWuAL*Sf5Am#$cOOg=ldIAJ^DhOQh7}y1Df7 z7~}p$XHcGrr>O%VUa5?6(&U7$>M4W9bwG|`z>wov2(=1{j4KIMtE*Z~T%f@#0D9BY zysi=O9ZS?kAtGB(heJR2`De9Wky9g&AlZG~(HdI`Nt@a)a_Aj^`bp~cT0&WNHH8`r z1YD1~Y8^FbV24ieG7?j>sMA_)iwEv16-|CPlV>rg_+3%nXfZB#RjU1pYL8^WoJ=$~ z#J$$z*#uMkBnf+XuH(zcBD>#us^hH0@IgpKFa1i+`D3fZN%4-O?HNVw(a?t{T_i-! zf2^72Tl;kixxAr&>IFT*L#sm`B5c$?w>cock`}W8xkAvm6gQN|X^7!A424^JRuhI^ zd-CcyH|Vzt;WyX~;m5V9jeGN)bUS?T)UN1<%Xe_+;w~~s`LA#uHXZwJF}|!wevkhC z(Ior(@O81&RBbuXb#K_*I^I(EwOe$M(mhU0*&aJbX0R+Tz}E4$mg7d@gqP1q4>jlq zqPDakva!?Td36xqSNhew?M+Ga^nUdloKJNh`Kx@^oYG0hf_*pgt>V1%BP)3wnSa!o zdtKb0659Ckb+YJl?REo{;K#>(iFa%Dh}@t{vVLT=X7|K8ahF_A&bU}UF46!X7f0A> z(~@Fp1EWnc$gC0DcqZm6-pa|9t$$QaO^xD_CWOv#iMSAy_s1Z^)72YVf`G#S75v6f z#Gl&Om^8X4vff@+W`HUrH?X<6nPyi4s;d``3q`W3uXN7BUd*H)aYX|i6yH<>#V7St zu8(V^OV*)wfUBr27JH`Vpq4c_nJE3h|21p9ray0(i~=O95WzdRa54_LZ_PK5aRvZ& z6vt@&0TZa;#sod+)ub0#^%x%qd17by->AYjm0180!HyC|U}C=W0fb>q)n{ORd^Chv z3LV}D45Cb*@sP6E2_I*fb72zf~6zn}J-^qnWw5UAu6zRk6NYZi8HhOJKV zQ!TDqO>cZ|_B)>)5Froi>Ky3-FgunkGbqu_hF(8Cy}sa&JN(!$zKh$bKd;YQ3i`Hw zkBWZ|1~*<>__nRDn)qMO%>MXne02hmr?Rtc41=iW3zZzjyxi<_g!}+h8qs$DrxWSd zuV24@{rW$S3&ek$|0ky{j)CVy7i5EEO?O9&fTHwIodtbCXDPKJN~Ms>u%RkNV+jgY zF<(*3rJpTsx2oZ$1b$9bKfiX)++aht)ak?gyFFb%Q$#h~+I!|@HskI1!_HVDCLW6t z4@M8pl{v9@eRJak*-u&N%Zg$1?R)p)+ewHj_(52Ttk>s#5f~E5aqK36*!Shr=bO*Z zFaGA|jbHKH7wvB>LgGpBbAGSi?d@CAcfWtyA-dGWtm_LN{}y^koWcY}?~uFRiE{8P z^Bst>cgAg$OuBnbbO;N=EKNQeG5mjEVtWBnu;jv7RXe@wA zJN&rZvQX-S(uYhS(4%!tq~cm`sG9&OQnS>FoW>H~Rl&HtCrep>g!^Zwc2J!~(IXoe5vEI;=&wZq%tYxFPTp15f{(5N zlDQa_?F=ZjY#s*gd)$)Z0>ME550L0GomNPrzSORPMf5FH*-cPzSy92_0fYwied4hn z+3*)t@b-+8Fu`zmJTcCY_K|FBjLcp~`M|`|C<(46a`o#g#u=rqv&ll7q9`3y>yM`t z-ln)R6EuBQGk=2V1%ONx7^}z73AHHK9dtn!mFLIRwh~v7F~fNl^U$2Epnki@M*}NO$7&w^f5UR=`e#FmS+bA*svMze0s)k`^wJcu`bd z2y=A+0Lq_}awi;f@NVof!J748LlIkpMP_-Lk=T8tk}cH5&LC)L zsK7xTc>d9FrCc<7>Ofy*0@kW`*HZ~~F*>y5Dmrc}o_7l|P@30Fo4rAq%?;Kt!6I&n z2nK*>X~r!S$t=vIFIe%iAwe1AYCB67;A{U%TST55BGhReU^b?a$?NQs^?b%?06Rb0xLPNE zIWb7n4e*hDL048(F>Zc5Dp$53q>NIY>w~Et`(P zBvV=B{2YRRINq(Q^v^q{o@%bZ^53gJ8@H9)9CKE%;=uCgZntqV;{+jPbzUP-S$lH3 zn&^dCjrT(T&dpDpL7xRF`pBqgDXj`xp#SKGh=@q6&CRRaiv+sroKfeXdq?rsk!#Cu z)JDT%3q%NQ!Zkw!{Q>>bA~d~4>iUZk@*qY|m=cP+?yqxNZ(n6$)>CH60tHl3d04+J zA-!&@Va{@%w_`C&<@pd77j0+$gou>91|gQ6TZ6Bu^-PE%6k3!LvQsR6KP>7x1xqPjOO5_F8h z8kfK1FZ1_}HumaA*F2twb^{HYafIi~SqVZ@Q$@H_L&c}?qMl#`O23TkP?J7+Nx9-o z4i8$Q3iIHYnre5Qg1wlfBFa25`<#L8KBXhr9jvT<6+@B_fgZrs`iAA@- znP_8z1OJTYD$;BTjb`0-Gz@4$Z)2pXT2SdgNqm<$4TvL&FuR7t(IZ3CH0v0HG-(@_ zxmklO4wG zYr8^ouaWG^5%o3ukUgNXjf+*($qz=fKCr-@0{xbAViXz2F4JR?WLlN-gcq0BDXZjV zgoay{6&vpCgwqJCe$%RZGm^0T-lT;|P9l&vrdD@yNvxLF-iJbD?we zh>T;8n;HASzfY`vWj@vew+641Ix&I$V74iFzM{Wbz}HsDKFANPXEKYqVRp%`%;N; zSaeSF0&`IbeWDbe3GvXo1aNC;5hrbO*TSD6v#uf}zNlJ%1xtv#jq@Ue*52|E+oZvq z7*iDDgB({fq8aUr)BwWbQy(dk4Q>;2V&v7VeF7%B)tNfiPzj5mZsG6wP@PBctN-1+Iw|B}8`tg2%oj-cO|LOSo_3PKK zU%&o`s{C*N|4-X$kD`vo$>`}RIhy!#B-%uvP-?yjG)gRhwTLP@Tqw8#prb0RHpavw zR9KOs5s}(Q(R5AIX}?24p@7~4(9WTsQaf*nqOX^La`8Ix9p@63gItk8RQNaD@H(CF zoBKK)XSX{a10EB4alCsws|4ORc9)WWFR*hi;YGv2`}({;d>Q+5-hO+)E$j2WT@4z5 zxL@ytF!ws$b-(I)|IqjH-~KQxf59o^0+^Vl`?dKwzE>W^J<4XfrhSl}NJIMqepWnO?ACJR9a-q*vYc4J>ibR8($Ktm+^VuatLNM(QnMd_cN~ns zv9gR^LOmo3_j+ewWtG6U7TolR*tm3+w4kDA>bdq*$sR`1pY%6kv8G7WV}}Z#49;=x zg4pLrKKvm`O=<_~kw(il4fzx@E*asH#f|yHf`yIE(!47fr*o6gT>hZtHa`-i?{>hL z2xxtWi$#%VIAsc@oIJQ_J*3%+{P-OjX#PRuFh-WJI=D2@7`b8IfFgl1s)>+GstZ=) zG)VevTi3|bp|(6+pS~JSPH#cRYcB`5oLMk2sVb?+Zu#6D>@=st9xbfkfTA%$6UMw2 z%`rZ&ln$ii8zdup&VjqNZ-_XE_!l{1NDfhOB=DxtIvzC*W6;7O2jeej(KNG#n3YYW z_J)Wd8W|s`)_#~^Eha8b;h(w{7qiqV0O;9g9joCp+qMCs+^yBR6meJRYgAL50z@yU z36}8ju6-ry#$*fDxg4WQ5q~f{+TnSU(vrKodl%51;H@L9M70XRtN`S`M3eX$YbqgZ zysN}&QR?{rI^1w3pi>+})oePoS`3elV$1Ihc;kMgL70kv zm}vPS?Kk+Pl_-ZSUUDFwkY=*ldoVvc&f&+^7gASiVJ)vM0n0Wf7eG$_0qQtC)Mxz5 z@B%N>1Rlo0-DE=R7UAU1#^FM|hq>s8l%8EQp>?t0=?Ed+g%PUHLbIk{s4pKd(t*4> zXt{8Om3+1)-1^wi6hr#X(fDMxuw+t~DNs306>Rg&ykHw4d_`HYccxme1Q=CyL`O3+ zhtfLN@yAH(<)=b&pc1Vy+r$WV0a+{kbbw@*nrW1>usuRnH17dXvgNL!AE)w3mL>MA zO(QZLy8*He`>u#t$)Z*9OKkwnLl+f2l#(|>$Yx7bNpqe^vbAX8W>g|&njRZ>&|X+) zwXTZPrK)haB&j%9QY~?86^1&834AN_if+CnY}WyC8GEKM>cj@qWpH>zW>#%&3aoln zm{KS;i!`OP4&g4GA-N-Y5)3~R4jzQC^)>+K;-SR0*FR2?a45^Q9b=`UFjZxN*o`~5 zqo6clEk8A?h&Cc`~G2(F=AYSD`652e) z?J7&PF9~uXc0}K#k38oCG!Bch3m?|F)_me)D46@^+(lE0wi>};?Y4GkwKV(yO!J9$ zH9xun z&72)&6=us0h$w<&ToW}{HlX?+wLgG>ap)r(ZhGGWhq|(~+=cNERYF89+E9W}B}oBl z4l31uXwv$4>?O93Yc$xd&t!j5m!t&ChzBZ9kcEKQU zO3P{_EV&(rO0vVPx~$Rw9ru7F!Db4=e#j>!qSZvPMTOiTCAHbCOpT-LCAq-<9x6Vl zPbYzw#??z?E2g*`@(mPM0~vBgvn0(+N>VnN^KnNCR;=shKZ5zC7&0w&nC;ajp%zXs zkcdw#fr3#>N9DNB90^av6I7(1l9Fjmw_K{YOYJFPsm zV7z{1&t-$Ec>dPlO|o!!PRea4PQ@}-sPsqUMW~}mM;`qLs;qow&@Vkfj$C$55Mw0z zyK4-p#0J~e)K4BX>}Kj|NaYJF7;Tn?k`D)#!bUtgzMTW|Fpqa$j_-|CqSyA`ue0IC z$X;6YxV!TyVC)+J{Wsd4vi)Jq@2l3mTEDWrJpJBVZUyN5AEvLPic7olr2`67ky(+4 zXp)bzCsIq*F94qgBQ>J#9@vn3OlUjM0^p?&u1yM&p4Z^(0AevDKFgj#U>Ruqulw>%LxiQ)*q?X7g->Jpi! z&1=%G*OhNC26UEhKJ5egLm~VgD5#A-ATJ6AfOGv9m&@KDF7B#_56Yj9+kI{BgPnrb zHe#l*6PKP~c^7i7B2X{8!K@G#hqst39)PQlD9tZ~v3T1mud=(MpF$`6=k#htB>f*o z>3ngYb31v;$Gsrno@P%wtZx1R4=JD1?JUA((9zjfKE<9aik~-};cebj_m6p+aa#B9 zzZeUI&kKYD3%-nheW5co8r*~3<{$-_VISb+8bMyfh`v0yR&Za>Lo~?1eheJ#k=6K5 zXIaYxU0%n}_RjWBP2koJ6@2Y}obfq=^t^j|;e-8LdA;B7PJ@5Kko_R_d|BQf7rzGO zpL6m2T$}v3-Ys4%es)QI++gYWxp=VFT&e_V)A4Y9UqNn|U*Uth^&0-u$@J^juV24@ z{cmsOzuo^!+u?{J*m}8{xteGDO!edl?29|@M%T$g5P*aW$Hy~d{81aH(qMEz!A>H8 zYd<2-pQZ;){^_3f6q!&MdF^?(uw#PNGVwI6c2~Z_!tN z`q0P0IX~h@TK=?dal5!Enk{up(Nfalmr*&G+<>pqDo}!d0zWVJ{du~%*jeqZJ-qq( zRIRLhJb%1Bt?Xnk6=%k+#79E)Yx1){crLK?rjmRtn^P?Dn#j#o@6aU? zi$66ixX8Gs;-z~8MJVzHxNljgB(Tevoc@t4>{Fs$G*9N!K4tyOeLSJmRrtt>&?!H`5V+u@7!F@z~ zj7MUKu!{>yvitr{h8z%V7*XEMTdv?Az%|p6uUVALN&@50B0L>@h$x+bMMaIm4Bcn1 zX-jj1FqN_lFlg2e_5o%|mfT!lR8@H9Ng2E!)wCIjAVq{imYy4R2-%9@I+jXI&-Z6& z%!}{5CiP0oi|-LPJS0T8uU^y#;%G{2l{E`z2p0jl2Z1|rE6^TcH@K!If5uUaw^Zgz z5K3Z-5c{L&A0XZs_qC(tQQ@RzXIEsM9vN=bBpwRLL0~PH3-3Gyj7SXBZEReqK(}lk z3&?pJQFAzK1<(pinLLRzXConX6=;&Fuv$8ai4d2Hz3Xj9JhFJ@Z1@Ah90{#`%}b?F zYvK7aP|c8VPR*>3sJcJ3cJvi2rzCidG0DG~2L#>IQ>ijABRwiPcQt2G2Y1!o5ouHp z_BqeskADH$sZ-2`ham$T;g#$LxI+ zg6*}Jkj=Y_Yirwe$IklKwn!0-8|30~`e%=C5J4AewlbZWw-2LQ(|&+T67|U1c$t>S@4XlG7P6a0o5|b zp}eeD<@T6-w~DP)y3nClL&_tiB-;Og3Kt(#WyXJ-?i`#d1TG-S=ECJ5Zrn*a9WOPM6K#5Zb?mp37QOAkn~)VoNT*F3ppx;w;CWuWI$jn+2YRw7Q{6PH^90Ot4OZB98ig)f%`e#ESj7hh4I7@ zlWdco>724pZZqdW2eU)&DH0r}L1kF0prG?Hnt#Ix@y)D-PJ5GNE9cix$Qv>u zHp}tC+Q1UB4iy3FWhqx)KsocKmeot~bv$a|QoXwTH7P&n{Qz`5M(~Vz0nlS#SGa|m zTPEt2kveOZ9HCug4fjw)nAnHP!bF(Wpos9yjeNakQ&q@R>o_~^)Yc6lv|X&C{WFzF zveR1QX^OVk!i7Zg)TX{~W^S+o3T&OjW-cQ&1Vx2Ez8bpWj-K+qX0I)@I?L6f=a7RP zXz07cO`~nMbpj(%fW8N)Z7GOr+Z7%GA*4|}aHrH0C2!L;Vz5;@@tRFDXZ}wUxqA5` zFYPs{4CVWI(C@^yyrriw7mL(;o!%3YPwSoc!NZ6z=F>z}KlA{ZtK?mm$76~dR#|AW zBxJAkqXdn=YAv?Kq<8pO(V}%mzxIrM`AJj7xAua4$!*l09cr7+>F&Kqyu&>fV!9M| zZu<<5jfX)*915=5*c#aJIPl;GBL`wc%+0&X52gO}Z_85`3_ykk-Qe(b9Z>#1`%T7W z?iq|c1Ch%lp@m7D1XwrCp@%=i-A~Qd=sJtE_D$aVaMZiQo6@5yb_e6ee1bndFR-7& zECaoFES@d$P8<&47mIj#bMx=PNu%BibK2K1Uzm-nZl^C1epvJM)PlCwy1f>=x%F{2zg+!1Svud& zz8_ci7VKo38#-J0lX%!v7b9I?Y&Y3dq_;zhjJ#MvjK59!z8x?P?*MtZJ2&tUX87vG<=&bc=VN=;$_CIOFi{Nwb+gmvrWpjFeNXdAgZ{kjb<_RwbN`k2qx|<8 zS@j%%ATK0$GG=-O9D5bJx@2n59Pw~RPrKLESQ(WsoQRNUjegxm6Y-ukzFSC;33)t9 zDAxZHnF+fbwY!iuj#x?}YGJ#DQffLeAJGjYKT(gR?iD5d!aIC!B!g3yl ze!=a?LGw;+m@#sep!qz10|LIFGI}4eAZU1AndNv9kuy=+BANR}kPCsU?dr54l16YC zppwb){gNtX$dh|;N-ikF0&ArxaV`tidY?Q|*wcF{v8;;JV&Trpn;D4=SM)UWZ(}gu z5+xlmwk@E;eSR22?O}Gr5g|6=7>$KlbDuhkrf8amqs$Foph@}`#85Qx!3iNSwi1lX zJ4A&@lGB#3O&&3lUblwTM{GZ`CCI+jhtpg-t!w3_}sT;_Y0nadK790WfWtxNx>y9Q5;j27(7Xtm9uHn;L-;~bax`kuLM|WF-S`O$u$Q?=aK42njc#>QjlbiT_2OV{9-$aK`l;e3!~ zi)7=B1Za)|VWs2AJAfIHXE2s=q8UPy<_GV@Wy0ieRp)`uKShnlR$b3+XsM)bg3@IW zOF^mj<2xO}lF9kW9BEsq<1wZ~ljZcNq8o+Tc_a~UtVp?c#q`R6q}R_3=|tlb*e}7! z4kw6R3^9!r3m$@}#xD$c2Pim0!8J~(evj^Zg%`!0C@>5NabtL1q?b&Ca1HMZcxYup zc&3&kd$pQCYD>Mz$GmCHK%Kb7QmkpfG zkysMD7Hpe1$`z#pPUTtKJ?R8oILH9Nc17Y|&Nou>?hpK``D#!nC-` zHJEM)*jaPPReW4_4~Dc)F@|AK7e(=Oa4OYASte05-B!_O42(oK9rQIS+&Z?V13U*` z76kTNI3j)+Y?^AH9+(mVM%Zy*KIUVbmo-$*34&^xK{E?4eELh%13(@cW+@FM?$C0Z zx{NfHIDOM;*5M+LEQzF@;)~Ng1Gy{Um_`_v@Q9t0dIOOvhe|shpQAnK?+^(62jpJS z@R^bAIUOM*)k~b%s%fW!QVtq0n@8iE@g2ASX7bJ-HZ}{Sp0OampU*ll{bU|bw$r%C z4otUpz&9U^P(VTB#cDerkegagk)!!Lx$&TuL}g~<>t5dB^${O;Yu7jPQ2By2==wC$ zcz~H9eX_Go6H5&(=@j$SXDjyR#n#q zRgN+$puBquL**|ob>|`v(3QQBdb}m(hy%L@XiZ_xD*L_ym41>kXwfq70CxcrDmFt5r^?$N5{oY35bx7ADwiNaU*3J|XZ>}m# zNN+dL5jfyyYD)d|rzq{k%2q%1(e0rmDm{JPKYdCA&fc!&SMtE%;ndv8n^` zfaeM7e(uGt^_}x$(ANEFYq$Ka^xp(OIy$b_j##i~Ajg8mbeGJUGa-qq37 zv2qB$4!eb=rPu8$9OHBgj&jat`k&stfBpLP>({Sezy9Cbg8pys|Ls&(arq81xZUu4 zr=xd9_V(0vgBJ|2u{UC(w6fksO;~q3D^REzYd~QsT>GmlB5~bMNDoq4(`AdLbcbw* zI{J}*0MPsZ-4{jKIlp*kd6|vFEzlKJ3~ElYciK-jZ$5nEoN5ToWoAH}q}@_&$z-j3 zzE>)$Kin)Dl%=UBd-XdT+&9vL>!0;3nDRDX7jdv++Rgne;jUggFSeep-+Q}!5B>6& zzA&Y77|CQZHaGXr*PA!;=xb=#n%<->7J558E*h~b6<(udL!Z4t0BAs$zh2f-$6T>C zumVV-uAGxwuPk5&$G{450)4Szh0RmB8N&SrA?UQjqq_l~)r>cWp(a`87cA@ux#9jH zVTKVkHH)$pwZe+Gm{^;eC^uy{?s{5K4-nIdwOClA4-h1`_%rVsN*qd=WW`(|LNO=U z^yyKg+id?kaG*E8gaivt|7Q=CDKRRU*or%l^p>A9l`k7%8ww2rhK~YYZ!KA31+Gb# z5A_nN*lxYp^qD^q65e0|Z;;s7I&TaqN4CIOg(ce$s3A*Mo=t)Z$La~?3NatfN*x)Z zl2gD}mJ4@<1NraoX~BkxwVMbYna4$pkNnM4kzO0nAGbt2oONGM+lar^k=vxIV=)%_ zsN?Qau+2#d;|fMnBN7_1y-hP`cb8R!6DaQsu1MF`H2)Vn_tcyV7j_Fewr$&Xp4hf+ z+qP}nc2;cLwr#8=E4}x@uI|G=>G}@(y~dvyqw1cMyHa%Ohz6U@fMl~P@(xaxvWZK0 z3dhHlb9zlKRExsiKxxvoG>8m_4CEQhjLU!&VcnjbZdVDa0(y%KkHq5ARjfEyLTwBGFSc%r77E(Rg1mA{ zE%*HAq_mhLs5v7JU=0lZxDW)=>R&rjuYay0xdt9oDLUn>5;5kyGswuH_~fmY4%nJk zWO8!_(fHi_>K2L=Obl~16NT2gKSbnKwJWIc(o=f5<>Ez5WI#}<3-cPjgc@mhP$_Xm zX?i0I275MG@Sut$0}PQf0i`}nLBV@4VmgXiYj9h$vMkL#B*yyI#Bw2;10>63E@eVI z*tcRA;i=VXHUC8|y)s!Z&5;bt!RFR+As!kvtm-P;rYaM)F~9cPH9Nnae?A!+)5<7u zFxXk8#?mc(OTiFAi*>e|4Jm$w8pGR5*aWSVa?e+ZG&z)1KPDCaRZ>q%5T}q*xnwzl zF@*=ZTMgVpmbZowszYWfO(IO5?qy1T+oWA`mkh!BRayoP`eFKfw4|+i8?7W8p*itP~ z1b8callg3u@I?90R#^lnmrG=u(DI!$-3sy&nimCkfb{6mNM^KipMGmYBKhn$x37ZX zc?HwK!NeHZn9(4^4QXzZZ2kCFVtoM;y3sS;IYmv z8Cw-9_NmBiEXa`qc?1{qH0**Bc8OF=3%1ym)07yX-7BwQtfL7Qph1k;j@r5t^6cxF^Z9`@WL>Tno%1ueXF$Tf%P746+>AhY+p_MPZPy$^Ou}dX6NvI zEbW9cxb_ZH-ov5_Ilv;uNPLPOamw+oBZGX`rwz>X;lMq?oHH zm}mbW>jDh(Z^zJQz0M6c^=?0LN-ps3He7Y7&Ntj>asb>@3&f@s|ImoXs@K|fWUwX} zxPX_sB>4>b@ z;~mF&p1nDZ$1OKMR||@m5_z=G9i9e}cRrO~E0L74fszer>)5x?3co+|0*R2Vg|3ruj}eYNk_7KE}zaOu;&dj(lmayqgEJd&Bv6D(}1d7^5Qt zmTolrb4*%KYMfWCR*mO#q6w{cU4(m6po=5d*<@Hr_(vpGyi}T;^{ic#%|>gk%!4WG zaWDSt*jF`gj{B94yV8DgJ(WtsvQR&U;eHG-X2I)muKLT6KMHK^nxK&Y^5(m4LGIeH z6w;*o@dn0Am>U~~F4_s1v`T3No0D~pXme@{+1|@Fl|OC;ytnXv-sq1MGsZ3~JEWL? zwZW9s!mYpD(aQnm1*ybv^~r!vo!9#(ut3q|;{C)?7CPdNC$zwSD9RuW+ zZ)1LWxm*UP;Vh*OM{i1t2t=R9^Ml>80&pn2`)y@Uqs=J_1U>kxr-1prRS&CpQ>=vCv=n7bm4$$`|0LULM@bJru9|W;r z+Xx5&f3&~l`4xeQ%ch;v+R$EYkS`?Ll(sRSdH!mZEKnf_6Taz^$2*oA>59x%UlG!= zqBCS51DK25qn%|%^g_!PALxT02yuTNH*#cJ+9cCgi~#*ZR47o2Fo4(@^05xg&hBBvz>y?~pwj^K0x*oY&wvyio$ z2=5CyM^ie?un`@-zUvf#HFs8_T(Zq&=T2vs#Q z_>l^Q!m0@AKV~MaJ(J2?(bpjRniXDhNu1$I&R?aIsAA|DW?1G+Kfu!PR+YdGS0%Jz zyzj(I=Io2m_CoC0XUs&Y9kzm)GwumuXvX(C?o$gfPYtB@IN2 zgo@UVJWwovMGvNzJ;t&?eqTBZ0byksARe~B2WFPM9t2u~=Lec$^junQl?k81JQF^F zW!3_1>Ww;eM$m};P2V)wROd#KQf!4~-dU$21{4_k?iAax2VovF2W@pD5)FQaY(X(& zVp*~(%aGlW3)|;T-@YnjlM@A%B8SI0bV5*fkh!3Hj+y%g%_0>IBnigpQGfD=SF~Rf z{FQkK!4&%f5)Kwq3>IoPQwhnj3YvhIcBSsSURkI{V2Vy4`^fi*WI-Iq1I<74Q#xWQ z8$1K_3_i5yLN#x+19qk}$(Jh;ITkz6*#PArp!(ew=Yz{mhHV;r7&DFZFYz&17X@*Uywbe)YCW*PEr!+HU5vm- z_vG(iD-NxctZ!pGGdnXYcB7Ps=9FwrU7eBjTr<=yr<8EoKw5AOWph85k%`VKmy$Np zV~Rs@T8Y22b~z!7{?F9DzX-M&2Y-?3Q61Tb+h&)?olvDW0=#OTcS>hQ+s@4B^+O7{ zNG(6_1n=Z0ccr>=EXEa1vwmM1-`0=3_Pg1y2mj`9^4Ry`JZtzJNI~whcU)1-UB>c1 z#{oAJX4(A`KYZ5cc(5Yt{0=UU8&7*QHeTz7NBrA0Aiq`g?AOC;c(7hQNO);6d(eWC2QI2yFE2ZU^EEd0RkXdL__(ESAlqwX~LpI#vU`Okm;r^vwr z1u}&EpZkBcb#(m?z}ug991|$2)6=cQR0$9%rf3jd*=#{HaHvGVx5B*6C=uPD5eaA zfpx2!$MgT4-=}ARe}vMz6;y6OimOF_roP^1D}Ua{EGU#w{V@tZr&cyS=4DGBgd&+s z&y5>0)<*SV5;;ayVJ|grMl*2|!%d)o1+3s#y^|Q zDO{TT1u7td7p32kkV{vIYtwDyEB77%q-$?);KwD!C)(lb{WY-;Zw;ckD?F#y1+U;e zDX+6E-isIin{Ro?M^DHDXw9WPcn9V(Ya|W-dYkwa zAGY6VP?g3@>3^XzMSwIzZ9K*Yqs(3>1^=m%A!J2v!_mVftWr@@k|`JCMZi28aj{V$ z&3t~#rLBI;=3k2dq?Pdg^1r?dfS-Z^$(RVJ}a-PR$TW5kyL4a8O7 z@J*BW4epT&E(}A;Fuq{_u89ac8f;ick&Il;R`i_p_lq}(>Tsm_dLhE`FRaWp44KOG zA3V3RDseTKh#=yczR*{h3oJa;paKIWTubI@OElwYM-oUkwRE!eu0fiFG!F^6M`}Ne zC0J1l-CoMY0-*c-vawk9ob@Bp?9DkDzu3-%`C;9Au47}GdZL6*$b1X1?#Qu1tA>~6 zjKBJav3A!ZNUiy6diQu47>xX?${$1F6YN%%=VGK>H&_|Pmu_@qxlI*jgC4L&hWs3L zu^BkgS8Ix^J?8%govmXW>WxHE_nFe)TP2i$QC-b?kh|{S=*bMeMN)aO?&S{Z)LqwV zx+53LgmMgBD~d16_Lo%i8J!5vUiaI;o{3}9#?fDhUDSg5=0Flo9cnhFV@Rnch!dFv z3Yh~ENc+fTV6a#J#!igwMHt$%)*|ZY-1y?ekAPAwtdFh@-+Ovd*EBH#!DoXq3|GAj zKvW|H=?YwjgG|(0N;WZCDRK&PQ<+sFl)>;0uHwo}VQBgk$pjz(hK#_w4fIOj_6eBT zDm#KHp}p98t#sG|26+nS0#!Mg0aMI^AU{s9f8~b#Me{INJCw@#eE?%Gb%8e2AE+3i z=#YQ!D@C9_B>0$eZXBMCVAV}#S>e1F0*Ac@SQl3YNhm1w^AojV&1~XqrNs59Iqy+v(cF zWp`yb7c>3goI0NA5I4K2CtUGXLMGm1$#XIaI#A>^AfFhgI<}d$O+{42f)khsSW&;@ zmfQVcopmZnuBkf>E~&44{|>Ez+*Lq1+A!KpsBj9-`lfhM+ib9=SeL2OsyhRpNhE?c z>zCwkNRyTBtaB5Iu64hb%MW+NbZ&eMGG7FW`V_}TJFm1pZ1xpa`qxS;#POXlN^BgS zlxiS3>yDOb6y*%@ZL zomM`yQ%6%9+MeuQ^Qg8MkUlL{(cu#~jp^dEOT2w4K0QviGpyim>3_NY z68>c(!I4ZW=)sXWfz&7hH^mI$F4>|jl^HIZ$>H?YBGOU(@fvlrb^)jQ(JKiHe`$r- zHfJv6k>mcu!#m+l&{|_EK8)Z6P6siLZNluoyqnxK%*KHcOD>;2xcHn;=jt@sWLBc+ zaOI*VrH5{5kp&F1=QpUh|0t^Sf>MCjmT}>w?krS`2K5Tt8ZrWF(T^}0&y2OBvLO{5 zVas#oSPS{d6!nLPA|k9r^tO!yB~Ru!K9$Y4L|n;~GFa$gn|J~Wv_}Pz7i)jkmd6M= zXD*r9d`UAM`JFZXI*u*cCZZ|b+E>3X1|C#tTw>Ocbagii9^Q$v`Hl*ckOiu49id^MM&_<{bL+5`sx~PiJfN2id^EA zc-g}l;u(DDOsoErd=b;Avk$VOGGSzoldGlw$VuRwTD0eKQVQ~jibN-L*jtMJ&uIS z)D$KIs{NYe4kCnr$h6sF{jFsFr~`fxXIEZoB?TV6C`W2v71MEGoms!9UI8;QhOpLL zIL0p#dA|_GDUeAs4cG#Iv!uSfpZVhlom-0}TX|b!7ubEH$;UhH&^LTK;sq(^wV<51 zpZ$asE~=^c&exycumaPTZmuP!#Qv}`;@MIv`FDayM)oP1@T-@U5{mqvA$IU(-`&J( z<2DKJZ6H0Q(xOmjAhCOQs5N9S#*Q+W$I(9vKBV$Z+MonVuSMulbh_OmONFsAuKJjE z0ggysY-#Q7467!Mrz^zgY_^bZy3gXIhaOm%#jYa9J9Ybj0s?V8VC;#P+;}Mgn@mAU z%q=yN)E*&5V*_(_05b_;r7Vt)R-6lnJ{~|bkRxA;Kn8878_(%0dddNHC6yDeNYkmm z(i($Te^q<4q&BtGZ(K4(aka5ryxcPiO$})^|wX?{S%(qm|R4@YT?* z&9jxjj_$zpDTY3S`qo8( zducYk>RX^L85n=o>uP7(8Q*f-hP5?3yZ(vl-y~Vf&hz{AtBp@PQ{b$0v2RD5Qt#7`F$MTtsgm}J zinZM1jbLQ_IR$h|!gmiiazO=zLS{xXIPZpRz)k$=y4{C@I}7thBM^mgaYfXtm6ElpBBe>1I;) zIdT0}_yvSws73&?vvRX?Gxfuhs0DuxK4!S6$4LwD{=pAB`hP$`Oh{ye$bR`CZ!=FAV5r_j((Svij7hsX|=K&HeZ|ew<8*FW`Sqsd~(c zde_gv5#Yz~vl9B9oUDpMImc+7aCLs#WnH#|d+}q}e1qQGAN(TQlXwK={Pj=hPKF9y=G5@*iGRHq(4x<=$wEEhx?tn?O z+2>wyjQGtOHr24s$@#DG^>Rxu5b*F%ALex4-p?g16zKgM=H_qAJ>Y*wU~>NVQ-IEG z-?$1ikSyqGwQX+g{@%Z-z3oosK@X-Z!D0XNTOAUXu#`dW$7y~4p7ub2M*z5QAD9bm zdAwi>el?G=F;J{ASv8Q&$YmhA*yd?C0G(51ct8}FXZmD4cLG-dDr|tmOpb>}D!j?i z>@$Qd69RQMGmWtwhZQ3Z#T$+ETv-g_tvjh1`GG92?))$N-8CTU9yivJnKL49d>1d? zBtdm+V!`d9gpLr!_czJBu+~qCRN_S-n#6B26M22b?=8Za^4@Olw~PF?$7zIkx|Z%m zR^+&A4AQDe$;Xtq7D47j24|GvOH@Lh1T*uFTBrw895$AD#x=F2sEd3ZhPhswlGHr$g4s*h60gZw&s+&ZPFD*L7wkj_ zv5buc`i$Y^qW#nY4P6?Sv9jm@!R-xU{xmu9RzquQQTW2p-NT)o)IGtDrd>eGEt$ zsTOc#HM%mpWjx6=So{!|#_@PU)M~vcH@~LZO6SP;!;koNAvwCdog$l)`bFdkHGlxv z6n4XhRzDsRC7n3#-fS38pY4$=0guDNtV0?(M`%t=qmvQWs;u%N*Su6j)=H`*6cp<` z_pm9b*M!bE)foonw31p&WBFG`NSbxMH0@{& zve>WKPhdF5iAuX3`BfE?RC{=m2ZcG`8A4`Go@p2KThI6p9^v=|{h@Xa!xDfPURiP_ zjjQ02$Tkcn7;9NsN4Q>@ZvK=zT`wvs1L3R(8>hWZsO?;q41v5hoK)|r7pWbmCV)G*s?m#f_HaT+E7TOOU7_*stn_T zo4+h_h|!g|1q0oP)w~1=p7H=LM{_N&EyRq%c{RIpQ&N3DV!+(>WL0m*b9wIbI~OSk z`L+zILU0KC)mYeML(0R4X`YUeXVS0iFBUWHACez=(yK6=E_+$sB&pAZ1)Vjw`IF-~ znbQbyJ=WnRx16lDWv{Iz{^Vf1ie+vBDMYE6CY|{u;&N$DXATWIGhB;jr^&Y-#$G{% z9(gBZTA1BaDl*KHdJ)U~q~&rX9s%Qyuy*z0kLJS7VI6s6${KrrZVyj+3Dd2bi5WmM zztiOti~RxkLU5JUULK`V?loC%Tg#}lFyndKgFgrHu1FA86iHk8<1{@^6l#4v__H%# z%ggzUDYX4gW4OW-b~i0ckt65{I!kL5xn0YY{Vy^NE%K@Hxvf9$iEDPeq=Tqxx{K=E ziAh%@Wq5Xb3-jfg1;iG`sj8f*2T-$1;tfT5^H~t5oa#Kcd4op444Ig>#8P8UqaJ<- zL>xCHU}XI0-P2yr=}i~IF2!AT|3NLWx6;PkRZJGr?>qTBNJOr!dQQD}KAFu1PEX%l z%88+ZQZz5lls)71Y4N*W{mq4+Wbzk7CnIwFN{V*okO|F7VgfqBI*V-C5U`PkDu5QbKc*ZtYx)c9uyi{;HI( zE>r#7V{iNS-}ID7k50WKlVK8BJsdc%@;JZ7E%ERhK|mhiGJTr4B^fR+*q`+gt_z_@NrE#n-;oKFr^fh709s?Q3>qWzv1~IG;U+wp0H&T+|%%#Ott;z&jfovJ);F^ z)!#Yy4;phNOZHsJ6?^F1hjX zUB{}UTFf7wy1x5XF|1x+a6(EiZ?&@`7BgNGM^< ze{jHaBH*-0!MPC;o+5%SjVVv6xm=JJ7Q~sx&y3OF1p~7rfPMPIb^e?8!+#w9{9A(! z6^KoVC~MD@=(QQ_!QRoDQ4B#NmnbUO`snqCw-845sAqE!{`|4b8Q2cc`Xr>I`rqf0 z4F?L?dsny*`AB;$e0wN8;?5>F8I1W*Zvy{diB|OH4w1Cne{m$BpBtcB;W&}4pzlal zPJ}!1u#LHhSMTWkwY;cKQ6kRQUviR@d_tsGrJVlQ>-DP@PKQNS{ZA#( z+wG=mtctEew}RUYmBbn>BI>AmFJI%lwE#-eZLp!gj;w`50>QZp^1A-l76ZS3SrO2w z3_hK0Tx?u=mm_>D62G18Y~tcmI_!58z926cw{txHb?znoE*~QfBwb${__eivp0@FN z{JQ$s+5E&9?CNh{l>Sx^47|>6Uq1rW3x$iXa|-saRGFKk!7sib8elzlN3P-YJAQ)t z4^DM_zv=axA_CDBdp~>jP*=Z1U(e(kdi(brR2@Fyy#v&H_pA1fa9;>&_A0779thXi z1-3puIfv7~N&lzI?|=UDpa1;-n8*KP|IaJvuA>8(?#JOa;8{bY;IJSPmOJfMjLm0& zATl^849C+fkN>(sON%o!b^U+5{#QPQ{QJ&-jjF%!RPcdDkl}RqcQ${1 z-o|sf^-=~3R3!cV&hI2TJeVGZvdhewSp|SqW|wACm0L`8D2f5Ld5|jS`QYE-bkj52 zhEtn^gF#U(XoS%!tg&*-0~P}w#~Rtm3Cz~9QWoZOld3n1?}fCi;O3G(3}%A*Gh~_C z=1VKOhhIE{EcXj07A&m5T+DL6?VL=ixf?wNS*-O@RO+32X0mLD2}9$76W_@>UN zSmjuzKb-cHyv30oe8v647=yZvzsk@RLsiJCKAqx6CR9{gI@du!@I~0kMY4x+y4b`h zGw>PtmReXwX#ZSnv6szVQUWVMT?S&fleIKA->72$&7>4ERq040 z$(^Ah=az9hikX<(PZ=K%rsN*VgPX3_Qc*_Jt=WbuCSu=KrtgYId9uwK!m>1+XQC2& z2f={?OG%#*Ee9&7sY)VLGMO=S>XM_aVE+U6tIy5mAdSzvpi>z^LA~I}pSkwNGpYhJ z1Fd4sn%L4R$n)HWbCH;7HjxVDPjXgAB)g)+lM{-guEWKF=zTdN$*9%LctEXb2cCWC zX-XYYi9Oe@WZ$eavG0)P$!^-&WOI)f{EmF2_=8s_diq9yqcV@6l^KMSV?xPJ`x+yw zb)=HcF3x@VnoaIE%UT(IE&(xzq3J@cS0*NNDKExe`eJP7xm(BtZgqhT?+{POvd(PcZ{*p$-h*hBo=i{mN1ng<}U z4o@|an6{Q)t;R%J15g@fBXH)`XV|tWH@URaUhbL}l1H&^k*bw0O@x-Y9dYP4>!2wE zi=1r9!C&(#9NkRkib%x?jSdi-3%_Z)qIWZ6p0mi4*VjtV$)&$K9bH1%QZ`u5Td&3I zeuuD-25C}DCFD2YGnq@CSJ22Z^r(!V_#~3bQK0Px7FC3Ls^CwxN)#v=S3V_GOq&)T zG|Wh#P)i8I$Nu`M(2=uq&z*{x0{1m|Ahqc$=go5(!tWTzy(BSgxJtNN)#X2BQN2S; zP5TPOUVeV7Mz1tH?!cbf)aBF?6_qM%b9Du#xTQ{Pq)&O5oczGU z9Mo-Gi#j-s6>~fIjP4W{?9(4L*0bS}Nf+y$(?WMTF zb0H(&z4<~!bt6Y@QehXwclO?sE&d9A1%kcjijzWA(d)D!ctHb|q=gED`?snyS$c1|R88V28`$f|r-%?QIxR7a%`HAggMFYPdgwFRkdkBoU{sB90TdvvWqxPfK(KAE5V`_ z^PP@Yi%o`}6K#hO-{%_W^LTgupdSpfgV*EUKXlBV=XCL~L|E9}rVP?~zp!gdnj667 zN;?a*3&%5B9z7|ZG7Kg4_yV6Y%m}itgtld+X z&A+2V%iW0=8{z}3F1>-k)c=s=d91{Y#CYh7bq#lTDFU==g}ZM1MZu=ar9f!RbudI6 z0fZaoc#w1?mhZep6^@ENH2C*on{L2qAnkW}{6b}AR~*xaIxrz@fx(9EgmCc8B&e4N zqyIi0o*aY_n&kJ*vsWL3nUq=nW%l!k1f>xXNpyh74onoGox>Lli@^2^YC(=65UQuS z@o;fm?4@Ci!$hz6M^5nJlX@?P5v#{IK=#Q1<7Pu;aII@tAEA+uzpfBAq9+!9cMx$I z$s;(95`mM1ALBq8;Q)o=nS)Ql6d7)HhE7ht*>K>04R8}A70h_l0TAhT=8&aWk<2%? zeWbK6j9Z=~UWTl&0YKSld=a9NS71bN2{BX|F;oFG1@K2GGjz0HxG5@!$W}Un_)Bu? zmEt!p0_5Y_!-DXqFq@=i{D*qsfw`Ck+zE6;CYfP))10~brZ{6Xyl?ki-dlj9Cx}D5 z{L%VzgZzP`yt=E1)IYM~L)KO~L9PL_{KQjQRA*1zPu4hH6C=k0KKj9!l&3To|E#fD zm=UX|IbO{k6a6^yiPL0~%B11n#2hj4F0#IUJkyR0Yz7glM4cDI-6QB>g2s)Dao+6C z1l`?`BL9}ydMe+S=864IkTb?cf+U26LuVEIVn%PzbnPb3kG^02V3<@5z~=7O?$w=Q zTB5M4nTtotRmVNv4&oQ$MFE8E?vILx#6P9f%Lo5L< z%uQ$5cW3{$6CuVp{n_|W3zPjP`mw*oIDN0_PXA5kKE`-2SV6qb!2B;TL@;L7|8)KR z&wu{&pa0)Ng#N$Z|LZv5j-wNVb?2Tcqev-XMyJ-r&~HYeeYuYaz&yrk^!{&=0FJ;%_EHSp5-IU6m=4_f@waHO#7 z@p$<<|G)ElI{*98zjDTRolN29BABi_C4hP0Y3q@HQ5$IISD8=JxXxP-lW`Btr4xCjK36Xka`;PNt{NPHF zFw*gSJHy@*i9Sa2G4=3(!CW#>rq*rUOxA;ZguU^)4WpKrc|s2iiE-szFiCA6ak_Wy zZv-ndS_ih-hz>^4^x@%C%~KS~Oe4`@nn6vZD&k^4!wKy4*Le^H9paGl4#N5gnrI!v z3bs4D*pbWGK$pHH?<9r-P|C}Qx- zgIWhcXUQVdE!NZ;2Q;@+8@~n{6FF^1a0fYYU$Vxq8Ik^B9va#b{R5(sa6q=H-Dn9_ zOIs$32ya*F4hfR@SM@YfJJ?2N@Y?0*HnE*9AnExynwb2GS3nT8(3G%*Z^Rl-%#H<# zW+4mi!Q9VZ|5%rm|B9~oV1cTYDy%ed?&?Ter%@fFlu4{JwgqY^bpqrqgf*o$8a1^t zL548OUB_5fBcF^kbrZg(?EE{BmJv2irn)TZ%ttApE%w(-(roH`3K-ycd^V$x(bv{y z(}Fb_SY1^nr2(c@rLp-nQ_m^wgA~Egl zAaaNjxOW_LC=dbkFPYP}t%8{+s$Gb=ZeuqcX@!W=tTB|m3x;+zoI2_Jf^jX18d6V+ zjeJATNS(KpJJ{_oZk*681oO4X3f>Zm8FX~AIrR-p;k3+w;&cOPSSY5QWqETe_?4k3 z418;mT_h7|3AX)2`RLrGxQkd`(V+KE0Yz*b1aF*&`o_yz$VNmeXsU-yXa7DJUcCVG znB8ub>n;r3Yq2HXY`V5lD7F)Cn5Pz3d`djNkFvG?8+{iRKL1-Pf4=IoyL!$Thj9~6 z`E?c;MdOs;J%@&C7m5*;q`8}=HL9lG;AjVHxi2DjZKnbYjXH`COATbH%|&4SBt+{x zY}xfFNZXLt*PoynOEITe>813f7|RpsS8;m~SC4BZXjbEaW>~q+qy>PzWmp~AU{zkl z#Pb{RHm0Gg{*{!nLlaF8#gLaX=$J0pZssZOkgrg3mayTd`U{t!rBoTwOT!5Xu@MYk zA<>{?9lan-1Z8vV1732dq*5D_C9nm9>3|J7aKW*zmU5rz?iqnKqyq=1D4Pv5+dV%M z{j1{{`SG%KFUs6k`%&}n;%6Bq-Ki+u?eq`CDd;ZebZmMYJc(np>2tJsG5*yn0O(@} z3f?M`VA2opah`lsXmskhGPHaI{HmDAgFNv^hSG4K30h_!4q~L8I!3i@t=3;p$y)6W za$NRHlml5C>&`*45+g7lf6}0i^y0u(MxKz`j;CGP^ImOHdMA1dJ~y=LV}vA4-Bc^h zUBo)H1UX34d=e3Bxteu%2~km}q2{deri@~PH8kUi{|21Neq`gv}bz< z3ufEUBg<*6ptfARzmMZ8RKC*G1h2Z3`U^c`iV1|~mmt3HC?GBEtq6}KXhtg$2 z;on$`WEAu;G^8%x3GaQYEuE$|zum(43=;n^F+w~}X{k^|;M#2CeNdh7_I3I4fnvg$ z51up30lf(k%D(ut5g<}PP-NS$(zQf@#5iv`#D23Cif5*AErC{ag>473ue(UhY=7nPQSIv7nH}!97v(7{#1^ zkxZB7m+MZZCYe?8DkAoouezh%*xHkHZ@3i6DYgrua^44)SQ%(CCBpv&VR}rzS$Rx) z65KwUYJC4-b~4j7S10SGrM7mI&!@t}JfRvGcSqorJj?xj*{XHT9)FfONmC2Z6B#s#`biNC>Tfn2L%;4qbeHz$xOJ;lR$- zjVR)qfWj*7@$(niU~l!~o$^P=r}-cH?+wPTvu`fokHfN#?uR>bAELwlgARVe| z5_35rz{~w<@^fgP$Nus2a&zTs!wH{>U*P9L?5}=T0I+hkU-AERE&I=Z{_~&z{OA8u zhyRcN|6~$W$I&-*&*9eCa0WCr^*A$zCM7ifso@cS4*YAax#<|z`zBe^yZ6AhcVyV~Z_r9xhP2@{F zhW2bcg-WbYwiBv61514m=S5*eJa~MrqIa&LLNLmq3LZCCw#b*{4EG6cnMsRxJ`09= zRXSeGG_8CaqZ)5g6Ci{;gjO{BdhqDp^8?mvS}|&xEGSCRS^6vzbW2r+T6xk)lND zYrzc38K~ysLhWu=Ukb5A{D3Q`5KvfLUZJEd7GUAee_t8Uh))m9SpC6uW+rG#DHQtZ z6(yK=QZ!+|4pm=81}fSKUQ-YbQXI#zj|N7dXoXEU|Kz=hCr7pZ$zER;9#2d9FVKAN zso$9Ig2sGMonEwkRIoa(DmD;>;ky!1L*j-qeMT9Dc9C8_SSl)F28IX>5S`Y2CMg z=Y6CHOvKne2%Hj&P&C0Y8YE*YVj(sRd{Wt3*y+qPT>S1tT=8PUI*rZUy;RjzCH^sU z#5XH}FaGg9%Aiq&XogGW0Hc{CFB}jgMfPtbto<99Vo)ZJSmU0_dHIRPYtI_E4+6(c zc&0N`93J3PxJ%JwTu}`7fEZMjFmM=BtN?}(eBlh^2AH4$SziAH;oz&RCH0&)StVx1 z3Y>}S5DosbqKLOU#hk#}h%OQ}fZHCP@&VpanK};N-rglL$k8knc3+iA-J8l43>8m2 zr~f%5o7M};CYq~8V5TRin5?v@pC4JL+$qCGHG&`8-dvg*AaUz6!wK%C5tt(-Y?w-u zfT0iE0W@Ooy*2LtjN(l+GBm>e6-eg~m;KLj0(e3$pHxN;kw+5ow=n>(N%{dk-M*dF z6Yp@gofVpxaghSHl_cGo`q(9I4N)|JfXX3-bsPKE)MDS!kF0>|LOaq+!EMk~Gs;|B zQ8^nhuwm*M70QWET&`S!bWcpVSd=ufNQfA&=ewA=60pMTW`?7#7P*j8$uLIZWBB{6 znVilLt|jWzF(>)4<~5fO^5Ju=*5KpdhPnChEk?q-8s^-Su^%-+nt ztaY8jt|7kyDsP&yc>r*Bqb9$jjRV^1QS zHpF&dSoC%2bIK9XC;m|_dIsD)<^_Mc>R<&vxd}-a`f$o=L=|@qTQ^kw4%-LuIEyt* z4Ru>Obx{0;h4Q>~p%cdjLZn+7`u1`6*(!&ao=mnOws#Z6b7?rdbz_FL&V+=sVCueC zY=>N`<2!8HdR=Ij^sTiK!mSbbE{l??gzY#s)@IP++cSHxd$Mas$XWn?d7Al*_9j)+ zBuWu4J+M}H1 z%-=RiLZ`1-tJ{vVLG*}gKmN(_gkptSnFEzlvonfMhbt2)+ zx{X(-+aUKfva#||^URA9wDu8~r&e69EdOCwp>5r6@9k1ubN8xs%IFh_{&XFR#Z<~C zxh^=7LtRd`5Nh=q^@mCz1kxJG6~i_Le(DzERwM_4y<6^bq5;N)A)vU|QtTk z($civvRMhd@Ge|FH~D}r-HbBbwuX~DL`GV`?}oxU}ta(Z8EA4La~0vo9r;VT%NY@3osk`J!anCIxt zOXYdBkl|mIs9CevYZX-Z2ekshckYO7t?{ysL@Ge0xr9XjOABU>jp4S0l=L&*s%>0- zE`9{TKf6GvM7tJ`&w(oaEq)+ zQ*cSuV-Q`3i`VA!foUS*#8Nh@3W^Oj4`Z{cQhQE4yYoExnF-UIU+nPCTJ{;~yz*(9 zl@(kJcd&6OGzzzJI(u7f&u_kpVS2 z)ipLs69t{Ii{jXO4@GV)4!VHye%aJ`u)T83Lrxd=4qp+4Q3m?0GlZxwRh4#c+itK#GN>nr|?JQWQK;924;V3K${%-;?0XyNHG{x#W4MKHBmHiZz zhaA+DLV$cJzNFnF8C<{;6TLRo&e;X2$d|N%JjT8ECwW<7R zdxVu#1X`Eh%ZljevdelUOd%yUgND?x?t-Vr)3z4v!a}}TEnH;o)K(GM@w!@}mH=Kr zp}&=s_WQONAg1=x zP%@k=8Oc68D=QA;AN5QY}u$j=@+eUm7rmZs$!U%YCAT^ET`EEQByGGt@km@g6&^> zLtK9lhhL|+W8Baywr+v(dd07OKDRfwRpiq`2W!WL4` zN>%(cN%5YnB^>7_dGyV$uu+jY^Wl{w!T25U1huU55D_H7kM6(~n;`n+Px=eL?qQs> z1U8*ui3M`g+#2YcOt$F2Z#}EMa70K}>)O9@g0!{lxie^lvF3Q_HmdCvcI$4~iO@&a z;cFQ8OMZ|0dph8Da|LmB;b--&O{nzL^x?|B4N5b{B@-Q~19uKSJ9E>HE1ab5Vc zFW%7$di8bc@ju-{{`u#h{|UJNZT~;zfH#KT^I(^BFzxojCpDQ~gp6#49R{FQE}_yP z%M;o+B~z}eh4LjqHK7|cgByVYxdOTA#;Y2m3*hGSxj)~y-iH=~uJKRm z4~tOz)gB@di2020xl~v1Yp(Bf_h;%R;WI(^Z?BsyJ`kCD<{xf8eqXoyiT#cF)%_Rf zr+NskA73J^9$lE z9taUm3~9r4g}=@15bZSO+}Z4Lw!nF1LDzzdEKvwLquc0Bw~S6J*Xn*-v0f&PGw}`> zbrX}nWV4b#=i9dT_l7X;G(2m5exr<_S;8DPP&7g&BpP`khY~4b>q??W0$5jvGb zy&Db4F4~k$6|Q_Aa~GI+M`ua&k2*z{d1ZFkc`MTAg_OA0xq;mia`+X3?x!O&#>L2@ z<_X$QsJfLX0=n71mSL+}#@MZ4QxHe}J){9`QZ0%pWwO+L zaqE_57)27E!N%!A_E%r@PD)VoEcl*TeEjbj)aLkesXoOw7>wi+o__G;LdvZPI8L~BpC zT4rIA`n(!qPp$b_AI$|QwMI-eRaD}a#f~DsuZ#ulAQw6PtS=&*hO(vI+ordAnwwFi>!^= zML3r^`mF0o|ItwP6=q3#ou*G5(&;anBh(Q_&oJB~WefZjt;I~Jn=hp@kZRJdD=$_5 zG_>b$>{`nkFh(-N7NX6x@G8cnyUYmS7MxjQR)O!<4zb(}^~l>Ir*} zI`xt=vmuw8DuSShp8=bRU>3rkKkjda)P+}QbkdpnaK8shuH($T3fZb;s7q3J7buJg z!8#FwOk43#Vh*3@J@CPy-ttg$qEM*i@G<_Z7r(9SnF2u*OblA!-Gh{NN8zFtpbtm6 zS5CEQQBq4hTc{z3hiGK9U5XwgTNCeS{)w_loCspHB4IUQkSfYK@Ux3H$6ENjo^Q}Q z5BU4uat(>ysS^UPTuqDg+#TrUEMhdqE_zDIC>Arm9Qy7X&e@Id?7HPDN};D|U=no4 z+rHt#O}}6LRzbofo20Cn66Bc_wR!?t5;;j(z0qM}_ClqGyQ)d2FvR$w1}50b%JSfE z&he^-ZecO>vnj+Z784pHvO27;ldQ8ZFH;D;b1X&jG6jl=uTFh2B}}Armn(9EyAb?| zYo_}Ql4Ki$@|ie`RXKY_u<`q{(@ZfqmIWUo$?Kyf2UmOAzh~}TWNq2d8c`}#7N?vT zm$=}4RW8XVW_z_q<-u?A2t1fPb0JIt9zLkt0H7+q$PLT#*PolK>91T?X+Ys4>Q0_2 zPq>vv*FGe)eIOnu;*@I&t(LvSF;-GzEqW1cG}p^uJTd5PJ(gfb|IcJn-l*r5RNl=< z>3%iSa_Fu=u}z0!`DGbZ7bDDDa}-+CYzMFd{-7quNi6@ORgCOLDZetQfu;nhFav{? za7JCe62AG(pk>jH)JFV*b}OcKmk*o+gmPX?*uxy+tF%$}H_pUQ+M6N~J)vJq>K6K$ zBSL{4W9p^67T@au_ol<(=xu^w(p|Xk=X=iS<=efYVbp2C&wZTN_mktFS5L>!2pmT_ zuW1<%?SlIBAy+%bM?XTDXeN5v!GPm19)s#$@O_xiF`z!&=bYS(eX-zlzD_g)(RPqs zPOjZ*l=nX45_2!P7xhA?>i!em{(Z-REunx5dxEQWM?V^0u-PBpJ>x!hBqK_=%Mr6& zL)h628>MbWO2H0a*gLg6+I^RB=fFsdA@|?#4rg0|J!@b~hwaAMPNsq8z-Kj#QSE0{ zSd$214r}``qut@moKz=7!+NyQ_hmT`LJrkv8V=@!*RoR7FhDf!@S+N3+~+!FXS2xA zOrC^$h=D^TQaKQY-~>6K^v8auP<}g9ditlrEBbgR>}c&Zz}IK}?L~^c0uTsiqw>n8 zn32~wkz{Zg7v`QDRY;Pns>L;30buQlAZ0Pbt$m5gWO1DbWwm^INm5nB=CKT#cP{*v z?68%(W5A852nl)bIeJxf{%Ii*XD%@!Wg?3^)MRB$u7)t<@6N;aljI08UraFYEnfX; zXK-ua5a23U$aofvJY9`qX3^DY2M5l-;ROJl1IE_*szf?ib+7VZ_PQ_;682Hy7_)PvC2zRyg42 z;~zAJ^9z8##DM?3)^**j+HS0cTzFdJqXAbuy|)3#{@(k`Tq|06yV&Q2?wj}P`$7@% z)=(rN|I5N_@&|G_y~vm8^YdY-cn)GtA;8zqi{tZX=x~U#e4?5;1LTc5QEW27Cd?o^Vstin7T6Wb#+&2{+$2f({o&j_mCh=PUMd;Qw@f`{$p3{`u#h z{}Zr~|GWQd>niF>A{hkFacAn;5E?RB6JtplNs%ZENkfeUq3AGB2-D1X*QRMv!@w&S zs_V9@e?#<@`JW4(Ii9%|e9T|XUQS=v$P?VBY7pNy&d$z0*YyqB5+7|5mHxkE4xOIV% znua88)_b%?A>BdQrIkXaB3m`>U=9U$24rpdiQP0qc;4kn%%a8|q@Wh|oioA+&mCCc z)tT(t8Gk~vQAHr7xQT_VrO63MkQok`pcawE`lwAVWr>xpMQeu#4T+dWxP|OUpy-K?k^(CiZS#w#1zPCrb=E3YsYa@M zB-U8cj}P>L(xbC_cHl@_zFY2gW&!wqc@x+nMNGeMshVmn;B9Zwf5yb6Cq?}rQj z9Stc^Lq6>rUb*1$fsRGT1GA9Z2<|Wyb-zo8K37*f*yz2`D7@tW(FUM3RjDc|nHMKe z?S*Qhd)O!JG6S`vg73rKPbfh%Gqo{nm^c^b`Rh%2C6=N^f|6B)X6F)m`Z77OzAptJ z5p-sUt?1*}sYe03d5XKCj;lFQh&^*OPF;kGwr3zb7$R${J>|i`k;F#=84leL}~JbRhDr`A5j@@S|)) z-6waxiJS|T?QjSSH02H+tT8EvZh>lY9a<}J^*XsrF4 z0`YLtz0_t&A%?J=)*YA1(O#LMgTxsOSLe~@l1=Aj)HR9UNPgm(1%04-;(l@d$ZZf0 zgO6)Cf8{;Cy#&ytpiJ3^kt^pZ)fq=5-M#*ZYXx?l6Jh|RzD4Ayb3(nj=4C1Dq@AALF4k$bP$H=VOiPuA#9Tv+ACD^58rN^+2P~OM zv@z9W&vm6mQ_PP@F%B)M zAUpQvmCzkRYSj;Oyq{z?SU(si-`9er5LOSI56@9FXevE`zwllKhH^76@8R0ps^BKR z_UjtU8+ubVKaJWus;J|pw zF#)nwy}gY_>)&Fxe^02-zF5)eL91({-yk(s278Mb2cA2Z-Pe?!2?f`!;JWeSe+K5v z(=;Kx0s*-2~9lZpO(t&zgcgb8uNMlil4P?aX+BAjggcYG`Rr@O-F*+q+#_cxM z0=Jy^kRRJG0&=Hztfr95l4?n-68Wwc+@~M2EH7mxYSN{O5`FRUsA(Tp=M%#QpOV!F zp2c_71!cR4yEN{?+8+khgNXINeu0RT{@H^3>*)LQ>HE$96Og|9^Y*K5`DnW9WSRWTimon2?~L+l${hOwroD)p_YMyph|ScGN(#?Igf92h$sH8QhpN zX~4Ysh1hAoOb=jV3v3+Y?HD;MYe11ujOI$SW7UPpf`O< ztpzN8^+uJGE0{at_`9JL0iBQV@4+y~3{Fh|L9|gbp_cz5pWUZv$=E8c2EA{KMf9sIb%$ z)Za7LZ{_?ZaeD^=Lf**_W`kY1WR$lf9>~(@ib*W|ffQPUasUw_83?&H>Y?hTV*f{$o(AgjJ%K@z z5m*?nI$$}C@mJ<7AZ^DP88R8ag-)FC9gZ7Pu7I-qpoX<8@U3|YMV1o=%%QI>Mg1G zGo<$8K=$aD!T}(9kBp^63FyP&4y%x7*wsd*$7h-Y5**w^{qJIs6jnNe%LVuKK^gR5 z63r=s9cAGo5&$la2ya+hfhiX0mOKHfHfl*AgiFBdc+>A5SS3<6sb&LBD}+hwtXkQ^ z?Z}tHczhy5*?As?tCE}FJxs|}V_$$DLsKMjVKu;o>RrF+k%Wa-YQdi4V6|Q=r@&- zBB*$-phF2bw!B!_x-PiYzT}3Kujw{^4Lu|ZsNwT1__8oREViW+S!x3acVvB-{Pm%f z&*nme^XMK$iwP2V4NN_SanvjwQj?EF`^Y`a*yz3_K#gSBD#|gaHWoi2`5Ueb-H>jl zkf;}GTR~YQbq##lRwXK0ODLOFN|GoI>0Fy#R2P*srow6l6mhg{*#zrtlkVEB^5LG; z*@}Uc)#lmKs4Sj|u~vfIR1iX4^1M&lo&6SRpaOK*(rMb2&sSVNxO99iHPA?ZZ-F_~ zZ%R6^v05cLGI$hjl)6NGs~sgb)h`sPs%H!Nn_dLcs5@p<$=%iJ7xLz?CcwEldv8S| zRR*P-wiyNi_DtJz0gb6S%$En1;P3|BVk0Z10kN7gV;L85R)oM{e}>JfhSg7ciyP*oX4nYiYZpeg z<fqQ=45Q2(;htET--Zl@b{cu%sp0rE z9j7ute`+_7xFC{B7#1#YSoj$oUZ;x-d&Ll?k>SyBt`HlCU_ZJw&gaqu^9xa5Y`W8byUj9r)y+4_9-jHSjs0c*=|Nf#__#MiEn-1 zMV?sXn7E1G=Hc>6@msXP*0BYSs4F9&=3J6tABk7WW1W`fS!r@|$2Vxd&(k*UbCYVt=u9i!a9N1^DWO|VDeu=cp>t_WwOeNYap^-QUx^9AwxOZ zhDaKq?9@q+Ij#PUB?7&F`*jYw)F}T>%ZqUVgRBCkwrF-t(0mpV(l(Sb971jGsJ40e z?q&U`qjj#5BVzZ!@YCwRucJR{DvsR2*v^G?DB$%lYSd2)6kivrLT?7YcE1E#g$v#! z(be~JIG66+__Fn!qDs`S@0@t}EKgE?p?z*x`Q1NQiTq+}$5emXINRykf1O!MY45{B zEHBR3B|tQkXZTcCOS3#YRGv0fMi+jx`#fmHE&pq1l8YYkKb#I2JAP#T_v)+SMzsRDiK7Gqz!N`9_>|~ zU4K8Ss=74YW;1i|cF*wK>wGBOT~9ZktZsLMCVKyHcYJo?_H7EXS@er7j0H`6o=iqK zHq2)x6c=RO05l7J1b+O#KSDmg1b-5Ab|jbo#xe&?9{pMG3pkt^@_cr51GK!E8Z8R; z`CMJmu2tS;5kZ9z>A+cwr6Mq5p&k!fO^U5BK}lnYu@cLpl-|PKwm>LnxAM)CdZ!NP zswiYzby!kSzu6N^!qif^GDc9?RM1U=Eui=lz!pPm3lNQIh!T*CQZk{zP>uzcRD>zh zL~7)wPR~&UYh5cZ4~-*QolQuyO*AKHS4uWF<5J)t7Bf#@m`Vprg~E%S@^-Nrv)KTU z3kSXn;^Z4HwWn3fxz|NOHaU}a<4Cn ztwQnu*F+-DYzSe?Zb{RjTbo098(u9Uuojlk4>_VV--y`9!Gp**yoJVk3;(A8s=>pT z-eIpJr^2}zE%8riN$4WqBZF1F`a7Y903f z#ZtaGRXua+To5b%i=T0IpyIpK3`Y~JH}|NG>kKMe`q4Ul0!6!k8Eh3f@Pw?4KbOoj zZN50anAC5Y0?~raffroR+rW^A4+oPVOm}m@H|wTmhAvx_&E+rYeUQtfe|f^y;Gilb z#yF|_HcLdw)jd(dz7$o$s67OfW|E_ir9&8#?nYQ8y~B~**yYwwLB6tEoI8I-FAQfJ z?hc#8;yPsGWzj-f;A{%IGVHU*6n=CMI?|j!e2kLuCILx=yYrqpH)G-K>N*?d9h-5}l)|TZ zx14c4CC@}70u^rlBX?m$p#$TBr`KXdoAj!QI1Ob|io3ofNphL*ZJ5O&X89asCc~Jj zQBm7lrn(@wpk;-z9K{o<#&|%feNqejQKj%cc1zlxfE!@Tks-zzTsr!j*H#};xu@L> z9z(N`2Rf-d=CpkU3LF!HvT3`xEGN_UdG z6cRJF#Y}o3m#G|2%cMNiIH?P=DbT=86H8bX6ApG=I{Y$#scZ~{n03xuNQT=y_QF6Y z0!I0C-i0ci8mvmrk{hBZ1;ko-1;PHH;}8x$Cz3Nmod4o%r*c%>ekp+28G**C9^C^Y zi&YxMLk%V7(@+Qok@jcZE~JBVZ4b&TJ-eEgpoqL0WA-5#K3+&pq93(QV*)eWMQjR* zD&C54pt4~*4_2HMzSH3&98X`dG5C4YX(= zVPYXHYP>>6AqR+&23s0#yC%^j#-o`!xRWS})LizY$(}#m8;3K&qxcfKHTsNClHeJ2 zitMOg!Zn?`0-%FZgA zdR$7HkPLR<6ehZOzr2l7T+lD{8a8X_ z$q=HuQPt$qFSORHSR3|fo9ILA);KaR(HpMN%nAVZl#r-Jiza6J>{d=CUdgEaPsn|) z!?Pti?e^Av^mRqj&{FPdA0uv9X;~m>c)8Y=Mrv|;pmmEAonWlhgh!jjw88?&T8mS9 zjhRf4)^b~bi^+!?(0Y~2m0%;;Ko~gX+LaLvLs^YCY!U97N%o>wAb2Vv zxGHE;3Xd`-qcK|^70`aqj%`0zDf_@jWM12w;I$E1HlA!@M;u4WVh$ER){i&TQZx_2 z@I6Qq&V|uMo$fnK4GQ;5?T9ll0=`1$)u>dUR2_B<{YZ^kmqkqY|ZX0R`oEjcWx z8+pX6i3G(yoK)t5!n`=>5uH3Q${?}8!rc0^3dqfnhou(KA7HW+AN9uR$QElv{ZpSX z9by+^&m~~Lbh(k*Xy79utPi#hdqB1hu|g0yco1bhpkcsFHX*TtQh!hHX<=EH{}x&- zh##Z$alM|hO#2Tr2;pLYrE(zX53Rey1 zAl=>rJT9{+!v*?M+(>5b7TkC7Adcp$NPBJ{d*QsF5zbgMD3M3^ zH6E|56@^goq)R)6PwH-MMeYFN2G zhORLys;^Dzw$jii{Yw8;tZQD6v4Fg>A(iqkORQz$ca{fE28~h&Y9Qqr`gUc-m+XLa zV3Q*3-@&$kly0yv6wNj~cWK!>U;?(^!d}kEtBJanlb4H+Pgw+@G)&AGQh54?8Jm=nr#}kFR4PdXG(S z_ri~y&F2fJtu*Go+&%+rkW^ie0Kz56?BjZqT2X-J%+A@3MWR6B2Cd1xrO$>*O!(V9 z1HOP&9CJ!BCmG38waJre2yn>r0)Uy#cxd}WP7e3vVaqI6`Gs;KSZ-~@Er#&&$cM&f zX4^Xx^RSJ2K1b29=?zuqSRFqZ(66H_z`y3{jU?E{!*;*)@p!$O=l7Vr!9AIn9~&SI zx;Dbe8ASKOq9`7vA0IHdw7?tv2A<6@L&^*M6z0+r?&+Ovv;ud%SW=%w2QSE1CV8qM zL|c1BpzMA}a;ZAn0%4`(?VtDj+vSlI#m7vIg3>$r;qf~r9|bhjBd{4uKjoK_mi+9}r1A)}Pi$wu`8x=%_96-094GZ^yiR3MjZex$+y5wo>E zQOU88&TSa!?{0WSX%Py%shOTQVV!P%p@Ha$ysZI`95Guy%AD<==}U)1Bi8t{BIXRg zY^#vs1EOoeGOYHlLmw#se$y>i3wN{h;kODB1Aj+LCRBzUyUy+Xw9(Rgr_B)g-mu9? z*z|Jh8Y*);_sKm^WxBDLa=FxUU5)DP6b`#+3Lp|H8$B*(Mg>hHtd{JytDX85?Vu@1 za2&r(+Kn2aK-B+rh7`uEp7MJP9HohzoR^+W^2x{Vr`i!Jyp<;7=v|`a(T)wmXMxD& zV}IUrN}7+R!NrRS)OKZ60|mLLqjhAHJSJ+GM_wd34IMo$eL&Zxq2JBXv{Rmyh9Q)2 z!iqawk(pRD8UNbY9O3(Ji84&I?L+Ge$EkuT&~Bn1F8L8<=Ju&w6fAx36j}p=2pIM? zHzNa#?|xFf?6yX0mVHLb;EGY}FH-BqGPs7oHxcmJg=NHPbWYeW!GFVK~4c=GTIA(`?A1&bm9-gVOFlq3RIYk6q-MnT0FU}~i0 zZLOH^x$&VaSPczqYDuLAreMz&Hd*IJyu@CnA+t?r%KD9@t8u5zsZP5eY)*c}7(5VS)WL`r#A?&(supN=0BcrwV!*SVKc*Z8 z)hqe7jmY>;%-qn;B*^s?+iB7IfsM;kA#5qrUZf6DDToR}Ehk8Ls4GG*9vGj6${Zq9 z!3$(LMgm!f{IzLxfb>=$#Z3dfN7Pz+T;hE_4BuG#&3zhVMhx^wD%@TC>m&R=gnw`{gBU67i*(ge*EQ-Gb2_IkbY>X5rLs7K$Dl$UZzIdUYqctMj>!P%ao-SD@fF<7GnwDm1wng~>Etm}6mXs&$6e(W*!46wF1d<7R1c#W_68hY*>26h$|aL= zI6tiBv0n$eOCOxn=(0NuCqrB(Eb*VgSaDm&Ih&)f)9Gp<<7zft;~}_@nAOLID{3>^ zXk~~lutncHHDCX=*qKQ-UBD;9{9S|6okDnsB2UjKeFgX*8)lY@pzS~KCC^2!*CCq7q4f9mzH1jrork!+ONOtgS z1P8kjzClSQK(urhj0`RRa*U-{A6m#Txtz$s(>Tn4d{{}wVi`uF9DeE?Idui|Lh^fuHFQVXf zYR}i$JT7q!@=(;b$AejO8=oXwvr1QP_Jj&P0ac}Y)F@}pXfqci#m-`9(W*1BAG-*8 z{FkO&N>&CEdmo)b<+43>s0t%J(TGkboJqucBHTex=E`fb-a5ZKB6X%Qk%(V@_5pai z>^?j&y^+?Z)=UfLZ6>9&rbZgz-9~~giKp?#f+D6RjT~W&XFY4i<_!kKE-xs7VMs?n zI)t27Bb7&-6b@3?B%%gp0mB*AUS`bR3TG_>OBJpTF}1T z%*LtzF-Fg)5R0)H6~`_f0^b56l4@k_cBD~MR?QgdcM0?jy(b3mUmMQzNp2Zjhk)Ns z&{&tv>Ivl!_6{Gdb?h1fvqs*>Xt7QUFSY8ccwQ;1?HR4c}# zkScuzzXs=yPO0&Zj;j~>?Q;PhypV8{Y^>Uh6(1UCqy44aMXgery$I(|J8=fGapBX; zBWgY=J;bC9U%w-e>wTJCsD)w^HC98qYTAU(NV++u#G;@Y@xgs;CcXa)nf$DWihZn% zUH(3rja9IK2D%W2vRP&vi(f7}_{C9C9YeEL>I=nK&|aGZHj6h9$VwtrFzS|R2Wlc5 zuR%e%$Zsk=&44Vd2G)6)jzMf?zn3UFw=O%mEx9w#yl{?5wGv_~-9thT2!!bw2nP|h zE-DxyyU<(N=2*S*8jdCQ^Yl!KqsU5SQcN;?0W9Zt=p?$Xb7@Dh+(ILl<-|Ujd$fMW zdc&GGDU(q|ie5a;OiYgu^CWhN^Dcgaj+fgr21;Zbt}NsOf2XquybIs-5vLc#$bsA> zNuaSLojUkosTzUxX1b!7q*c?Kl%P0lSnh1}q~JX1{vV_#$!C`F;eyCv*pvyY7;9VX#%N)B0v@)tVwDMC z8?uL_*v=X(%oYkfhO=xxq9*@$7WxlqLDqRf5|YS2DHY_WUf5l|y$Da?^~@YL3plxy zS{;|@!3HlShxtey96U|FsZUS>{eiL%Q(Jez0L2Q(=tFH>!d6GEtNJ^y@soq9wQ%;*-w|&52uCsuAo*6b z_L5Kwt8tG?qf`?O7J3N)Nk}YX6V&_d{+VE3xj$nMbPMW;Ll)ZF91Yp@1YqZ*?SMmV z7PnB-FyPkJwmU5pvZ9}mcP$P5Xb&OcpxYArlB&s+Nbu#Iv@+vEc;7%KV#$Hd&g*be z1T~Q$_Rq}R7Zdv03GEGZNYzuSktRH58oi7cYkpe3%KrCtmsekls^M3H#Q38J|LmyThg)IFlv)WM6A zXgeN+Ov=K>Ozffy;O?b-d9t-(V=ah!?qmT8u9NrlzWnAt8u zrf4W2eG;ftK6Ibb9dQ^H)$^W|xoU4jy8uqdvo<1~qv~HDO3YdO5CR*P;}qa41SqQg zzS!k>FAZc*0S%j`YWcvmWy!?QIm}tkS~B##D=%t)n{m}$1vE-FMO+>!C<};{Wqlgw zOGHx6!d<4rH%WBJcb#5^Fg1IJ8MW#1ZkR-5b^a3ItaM9n)vwrT(#&5RRjs$5LlZ5@ z2M4Y0_HoTXdxk&3>D*qekZvBmo9013y$-OP(VgqO`^an3^^D3#c3(AU*(7n$bnc?K zpyW;EU)Fk8MGW%w4Q<;NA^HtOR#BY#I$(dqsc9weu4WzNm&$Jdix>YFSi)4&GG^5wLpOX z{ZQ8H)d?)fnqd&OrQXqVj{&72Jl_=!Ku6o@4jV*A`|}n#JVn-vJ3(rDGte+6%kMcr zr$^mc-z)yuoDkpmv-x zYXbhza*uhRV>B8~oQB%|nU<`LUS6;@BM$q&o&xgfz3!MCBlUg5Hq&OP=R*C|3S~10 z+{NjLaY?#dUP5N-!bh@fk#!d__8uIj0UzLcK~AH7@24Ds>r7Z!N?D^~JjuLV zRu6FG_*u1zl%XZiGEz8thIaF67Sq#-ddpKz%0V#+eStA(hjm$!L$~5t@YdVkaAZj4 zLewg`4`?RvJD@(-Yh|$r6Tx_sm}KehJM8Lre#95R62DBol|yX52N!_QUMrCW)QV%0 zo*ehavLmo=h&LBjLZUx#u?)>nUoQ%+=-=Pv&~`I@jh@Y6y!{|{ZM`P4eVMqz<_yOV z02VSz3Lr@F#$VkUe3?YQyvFHS;gO0Bf<_~TPOZ619kk|8^07PHJHIFeT7=CpJ zS6w#4QhG*4KhWPEGjl=@>7$#rZVEJr5Qx*V#CoG=-NZQ$;o9#tIe*%}aM{gOeV%&q zX7XnKJR{k;MNRZIH8ux*J!Db7?0mDn{^Z&H@oI0M`5DXGvK*~@{PXLV=|c~vqutm2 z`>4WA-ddfb-i|^qbWg|wOWdi!!G329f0Gtk$a;9dDw{oq|)hh4(` zQ_+qdu)YTC?3j}YkNU`+P1Q?->-G=v)oV|am+7k?Rk|M%7<}X9bc4JA}j6 zt>x?fe@<_lA71?l8BX&LZrmGrVGDjh(%7u>|F0$ffByOBpZ}5u2NYQOU;BTZ8CSJ2 zWI}7t-7S4L}GZ5llnU)M#4GBANmh5t<*+z?({w#jlHNZ%1(M<2@N{nN9ztCDwn-<-Hv|NUQ=y$`62 zzYM>7Kfi>(zYBhfR9?8#cuw_FJ&)VVPfzM+dIkA+Z<9V$FaHygb^>mSxoP}nPfZ2W zxdanm4Nkj~xupFNC{AC<0}>wU$poUmh*^f3w%+uk7>A`VB~c2-#`W!DCeS{H8j^Nt z8yd?AOBL5Ub8ki-BaFP+@A76}$YO=*LZa%q`yh+QQ3lFI{ZXdLIJ`zWEj-%zqnK1= z+nrHN&F0ssR44aznz}Ey=2x&gM?E~;ZO4q=;MV2ff>)tL76JHtRD(@|B-Ar>mxwv( z`lA9BtCg4FTD{uE%vumd;{+?uN-R|lHfoWiWtQqQaLlAO=tkM%=tZ7VeY|(h67x8^ z2Np?Pdug2dat#hp7!aD{)BIOhKpRrAg%-Ro?uCw+YCdtIPK`u5v9>nM8(hDak}M_(2K`N5nWDB(|n$97zMhf3A^u`05C+ec3N0 zwFiMyn7E<>_))Ut5CTw${D~1}fbA`Qvl$1Bl$NT9>G`P!rFt>haTS#uD~x})1lO4+Kdy$P6hOyuY~#bh#F67koWhNU>-ygjHhtC8Jel0b-<>rW z>hD`ig93QgyO{7mLvO)b+pMGRQ?gD8u4~A8&su06{|fme=3@R)H54(jax_{^krLI1P^BOSbW6RLlfn)fCzn4bSD)Y>OqD5^mQ~A`~*wA_*c+a%|i0DX4gD z=`BIMPJCf1A`TzPsCZ*vMQj9$zGi$FKA3R^-~q!Xf|zJ4cC?+9)G_mbKk!PLrMS^7 z8{Mz#uz~T%?4}DUF&K?`CSj&ae$&h7_%Z3PA6NL~xn_`;p|F;VN+7h?Tk)WY4wKnf zWt##$yqGPY@MM5^DBe;>vNEEXbmX}LxH2cv)Ch*lTXaqUd@o7cyzp97{ zo-~L%$vev%`%ahu3cY!cl^pT<4A4_!n9?_?DCGnq`N$j1YDCMbJDsVZk<$lOSV6_b zMJ-4-bAPfJD&aSZT;+W9UXD$yfFNzfJPG*!#0RfgCI9)l65z*UQ?+ItCCGc%Vwxl< zInF~(Pcw#5-phaxqsbe$*(V=tb4Ii`{jFV%(q}Ak!RF=8p5|`&E^(A=01tUZ;3m&7 z=n~2ZCX9i;0*=<>+;BXeq}g&;R?-RR1&o^e?xZU4bY?s$xLkUNobx48+uDC(%y!`r zBR!Y%!h?IoWAV#yEM@%F;9QyfG`W^*?W{U!5V9O}eAM|Z792FS7_tHQJ6x#){36y+SCM)~xu3d_D$6#$F-O>|fB{nFdn4bU# zmEWF;(n?Zy-+lP>=%eJYy5KXqN6CXhj~!F_B}Va#bz+OP1B_(e^@5x@Rb$iD6OmO! zvM<)~k;STs5Nvla@2;LujKYr>vKy%9K@zi#;kFBeLVN_irU5U9nbmcyP9l!hpB(n;V0MO6LUkcR8hU)SsOF` z1WNzS=bnEFsDCe|UB)XvIdW&oB^_daw-`Ex@XRyMkY>pXn=^0ABi21UVJBb`b5$Hq zuH}0nfAb2HBZUL9jc18wpp%pE@wq!V%+$ajUxIA=Yz4pO2W=0p5wyA}aIRNmpbH38 zhTL&3Hkf;Zy+kA$@&ZXlhFF6qv$KE73pNi$_Mjp98{`j31*E0b9ngecfl~mXMz|d` zWZkc`4t>$$TkL##T^?g6CYmg+Q~)gm|tJxSc|RXK~3M27Sve zDkEgw%j@ZAFhTvvc$`#Iz|a^1)boHhzjXa~aIuH+22dPd1eHAjwGWod9CG+%9UYie zfc}6qj&&ANh^mChT%;fhFF|bw5Tg&POSL*E^^I9eTV%-}e?Fev$pHrp%%>$0&mqU) zdTMB7+%)x5e7B z&`e!$z-1XIMgib|H9!XImx6?bAFbq_B7;2bzYLNH#_xgP&Wuf;82GoD6q<*nyEQc? ze3M*)#J&2F;67w8y*>i zbV?yES#XVeZ05tX0vX;Y<|FVhIfZ}C*79#coTSCke+6`JNEBvGfWJJQ(D(;5075{$ zzxOb_ao8Fagrc_|9aAg- zM#!VtzNgnp)QLT=Br07s6vYfwc{o=njI_)u6UkA)CxuH^*hc@s9E1Heh16TUxx@)0 zp-zIAM2egMc)OGi%SP{vX&cYgRcy;HB&H~B)JHcv=%6l@({MZ$yEg?h9;AQ!g&Yfw zx%%BHZbBRy72QQEuBos+fb)I>(e@O4ZPp(F@j^RFr1!>m(Sw@^gf8aE+M8e$* z^tJTA*ty5%T)1sbz_D%Hwyh^lR&3i?v2EK~v29x`wr$(!y}M3zpC8a&ySnSW#!r}E z#y#g4vw7~^^qpP`o(KoM!@zGC*j0?lz&A3xaBL9JhM}Ku zq_7tt{YE`Xs`a$}L>##UF%?~mVQHtAS;F98l=69DclJFJ#8TUI9oL=$dGR7MiL#(1 zR$W!Y@KC^KnM1K-=0(eIGY^_KbRi~HR-LfA^FsgN_qFCquHJQj_c{3~Yg`ke$8D6> z%f~M`g}Ho#zlr!UdiR5p(f$=SlKuI^wR7$&$06`$;(2^f*=qjdZtdA~_pM+rx04-} zm!k7=I9V;>N+?q^R5G6NB9KYD5M@k!q9ssx(|YO^+M_W0QegiD>Ek0m^>UiEt+c6- z{ocKC`NH}1(fzLLz?ge;bN<5ngv;5x!|}nd*sFd168iRaJbaP4!~On+7)2^0@ShGx z|M2!mlL31Rr7fpM zgd@F0ol#h3nbMX7x?xyHq^2pZN6?~paVoggvSdQTiN54Z3Jd=Z>&!Q30Tt1X*U5Aa zH>(&2M-%Y6VxDG4xZapPs(_y}t1)FQ0@;TceULK(kf({Eclb0=@6w`|nCteR&{k(_0;1+f(dh z0#M9FmCR2fJUI1ur_$!FK7+ zhtvJeD+@+*XU6xGBuSJg?B&U1X<7aQD+_unTZsT$AFXI>QLTjQ}I{b^WuSU#fzt~?3FHrp7j!~Nq+~WWqYcqO201m`~Y^rQrUt65avgMs25p3SG;$R zKoPXeG{P6bx7$+Z=|ct3h5g%cJeCcA~!3zI8Gz~mjQU0aHEcyn`S^p63_ zw#vvi&{=fHhP+P?HR2eNZp*}{#_=AsTLI6t8)jo^*QgytR>}g{OUK9xl@(2Rs$a^* z5&t!*Cc+!fOqUt2+SFqSX69{{j4ac47;<5E$+e#9O9D*9zpe(R@p4i7=AkKSBQ@BX z_Nt{cf-{w!*{>l>jjrr-?YWK_WSe3kb|g*jr60N;ir%oq1KPY-xa9g+5pfyxN7|;M zh1FZ{>k4V{b*}b>uQ~a^mo3(f*O>!KBN3!TGyp%|`{$*9;H%kX^)m@w z2od7_E;a_UB3fW-Q=2<1D{0DN76aqR<_EZ};T3_kp4OD5I%1KoT!5#(#?I?Iqp^<> z9G+vq@aN)oGBSI^`y8NC5m@wS%~&Cj0c*5Bj!_sU4#AkrPX)?!7iTC=VgLHt!Ye)$ z!$uAC0Vx%OoQL8?gR0bq@mu8?{-L6xaCT&ezf&sK1kLdDpkv73D(SsvfsGT(Ophz4 z57$O;&JaSlED2jgVldxCtT6cPS!I3T9U1SXE?VtWC%#QQ@P+Pdt}0ZcTA+$5l(9=F z{g()6A#Q3fE5tPZYp;63L=kL>A~S&4I3{&g>s@CRB&koy3U?uvOm?Uose;Gw=%B-DEb<-aH!p z-O$0#Tm17X$E^AeL%WbKEOUbpOEnuDW_oH;6D0u1qQg`Q3`_=ybN5|XJujql6m}}K zd7S!uHLh}0izssEltna?!)Jc-0d_{94tJ9{MJXD73Xw%MhP7N7xrW@|?Lc7$9Oxq` zd9G}B)KEC4xhIe`L=O!183Di9XdapwW#xeHcu3CYTRn(_aC-?T4=^68i39LQ8#0^7 z;tj;`;iBw- zs;a-O4UQX2z|mB+Oe54}B)lR~YTrSX(nw8uBeYzRvs26@-tShd$uR5OWvW(Vs9o&i zMXiIOQiwY4OPQjpJlfhyK}b-II>JfAXr2{%?u`J~OUcT@D;J)|GvHzfI~gkYJD~;e z)P@=Q1UBTUOKcYi$}&V5ddj_PZ6N`@%hco``gjo!T&#XL z7pn5@Ko`Y0li5fcdW`9dRmhyIQZw$DlL|F?5LFhlwc2=*QS5nP%XGczcESme?60gEw+fx#(W- z007kVde4brb8`w6zn4=CPMFy{dlT&HRiW`vMcgmaa_u#TCe4MsXAB7gP=} z$95NJ<%wmfArC*XUqJ67^!N-c@F}BakbA#q68bwqE1%CEhe0OILRfU>69!C5En8csi|I zo2GO5&Le{Z+YcBT*iBBTbdU<0Clyx(P?Q^A%Xk9=l$5N~gErJj4N1mhP#5ZQ^a*`e zLfHWR-oG%LY&3$m4OnH=6&;0VtY%!+*ZYwvWSR-w9fBw31T`0LKxD2wEwk2BbOQrL z%}sxX{C}gGfGIN7EQAo-M<~@3FW{pBUrjj4Ofs)}Zx^pYN17PFL={Qz*<`^Ue29Zn zJdNiLU)_QfOTLEvY*?(lnT^ZL~b;l7xgkW8oPSotKc>HYu@&cp{DJ(5thpIMnC@wXiLam zyjQ!*8pe@H=iv#-SSs#4iQO0k-K%92j#TV%3*3?4mXC6c4-PR`g%?HGdt#}QYv4U? zVn`8g>s zbwR%pkKmXB%1OhYRoA>~I3JvOXyae?NUG(lfohzriaoZKQdvYLs&1KX!LWAIw}6>J zJ`pr-|7Nraq>jBJX0r+Az!$E5iRCeGlQ7mm`>C}8CWV%u)VW{{j4(fxhnINy1e_Nf z;4YKRTt6G3H9y7-RK3DjA)-aGWDXk_l5h+l(mt^cf*%noIt653=6TA^f z-_3n`jS?pLtG*9rvfx%Y-wn?8 z4ABv=SNe5VpFLBI%w;AF%=2!5T5#G4_kH+YY$6YWC+ z@%eFeWX^kC%9IxuD-s!^LFFA8`iuY3(Dk5c~;ZW@0)4(BK zOg<&$`Oved)UH1>R7v$`?v&FhU zIF=hd}dIBXiCS#L*xT&oRRfxE?q zIPetoF-5N~-Eqtw#?W24Ytq88gO-{Qhogn@cO2LC5AN+0M_c!LV2B*e4PgGF)?u#b zDp2lPuEW~zKQQxmE>KlK%B-585j0gdtqq{WIF?3$YcYIx`T|N?Jw=OVFy|rX;ZFxk zV5#1)1xo90P;sm}LiY(=5Jrk2HMm@}j|uCV(p2xsH?>pIZxu`TJjiV@8TVL6R?wnpsU^5UH3XpPWx*}8;c-f1ziwS2 z%p9RQvn&E3>faE(1I}yyG(nmql}d53_uWgK_Otm`gocDsT?^>p!hbeRyj;+|c@q0s z;b^Py%pgc535j^#wa2UsQY_o;3xr<(Wr)8be40UqI&=`F<9liE(=O2lj zY1Ll60G9E(btsIF;6+svLSlAvr}t?~wM?pqtTlJ%zv@SbBWS&gwL5l0;pvaEO9+RZ zuUCiM;fHR|%Enk;;MrJI&wM^NJ+keg7;B)Ioi)Lrb3#dx*X?~Wtg?^OQ}MNWU|g3J z%(;Jgw+Ggm&Hgs0%dT#^cak_d_i^kDLII7}UZM(C5SwgyIDgS~&!2GT~ zaK_QwuIPI7^%YBBu%8k_g9~>3TFkuD&#KdF-EMw;%BAHatmPxBg*Rs92RQ249{xWa zz5el!|G0XX|2_Y|VW0f3{O``Vqh|xxa_0$eC7E48&)nZ1`r5!D->14Hvbx_)886n5 zLRSM0kHHZuRXKu~LSc+b?<)Ye>Ff-4Y9KTs=dK8Ams&Bqt0d%=pCnJ=5Op-YfHj_`veD5s);N|sx zUCoQqWfw;ZlqXsOfQi^U z@n7CUdo;XQX1ui_uIpG0_N~-R3iYgI>FlTEtbR%f4`hv+EUlI6OX6Bk9(d%l z7X9WM!6Vg+%(GE}lOPqC9zz-T5XGh_e$ zV7DD!zL3v3nOd~+&8NuHjZ!X}?Wc9SKbCEz^oZyP{qp%eI7_mnsT+Elb8M$6JZ_L? zV_jR}n|G{A*19A+O_I(r(t%Ale1~sVtxfCz6vB?6OcL9h*Ve~HX1E@-Wo9WS)0@iF zFz$wPkszzBEgEdC3sS%I3ID>gczQXZEtAFeXXK-#}`MP;;Wjm6%%+ z`JidqX(jFai#8MGw&p0)#HoLiz)6WcDw939cC3eG9hp+|m*jK5A!Sp%hO!V!JY-Md z?qa*-g;G((ETMVTeX+=|Q)kT;SkFvMT`3rGXzK;3STPZIhH_H&YZpjvZE1=7Opgg4 zy__abC086x^IvsSl@ikDW`2p+aFp|Z$lgSMI7WMT!@bvFBompXjm9xwER9L%*fWag zkEA-uWACtmsjx*=jvqBtGe0cFxw#d*^p%vlUyzYM65*qpjp1n}kXePyEN!pIy9w06 zCVAi+(At?w7{>f~OmymMUe|1U#H4=R0y9!-LwR+Qe{ff&;tGF-2l@h(N~Se_&u68N zQRGT^UUIv@h-c)70`71JfRMnk^?k|$gSTa(DaA{u~wlsZEE`xNp}rU7zs9;J2* zL)6B!rszcXWPm%`U@sy`v?+hx7IdHPV;=&)-2pfx2s(bN2*@01n#jm=?=<{Br6K_S zjZ(5-UA?CKOJ9z=s3L{fxd;~JMehk$G4eI-=y`-n_aN-X88hwQyRwO_Jv-_MxntzC z2SW0OoyRehAeBMDv};3aRAmUtG%~o0nV1$4F($Ph;Fv0*40nC5@~)_=uKK4=6!ok- zwlq}5{@D#_RLtar=#*>~1zYG$=4_^9U+I}_>wlVo+6-;*oQ80uI-#%NYuX#D`?=P!AQR9 zkHx(%!{u>_hj#uD8Fc!9LC9KF5j4;z*=zta&>!tiJo4uZ>Gm{SF0adI7Y}H-J%~7w zL89H<;U%6^Tnl#}ZhW&|&a?hi_@XyHoJYf+mhzNv^)j`3;9Cr+yg3rBnR(qlz%r5c z1HD&ZGVr%F<=QXrd|Htsia!!0b2<0{rB-s9iVhWv%Re#eBWw%Q@FbF8~L)P_LPmLu?wh7qxwRe~)C7de2~!(k!lRXqbfEuq`5`;iob`+hFoH zLO~c1o9WLSt5^U9T+C-@WS!RD-GWT>M>Ys+6r*qK6Dtx8GRX_I`CwH9E67djv^y?L zCVg_QQ}`skl#9y2Uv4Po;>J6nO@QU%br%ERV zCe0BIR9flv{fMoPnrF9V(9!2C??{%;Y;#aGFt*MXF0EtlOV0{lU2hQ4ORv$NJ6>w1 z9*$A;1VUdqhqratfQ7L}$`xi8`|Ulfw#rw_4W@8yebBF8N1S>V z^6E5B8_YV%E#l6BHe>5De4vTMC%U^=1%sy(XdEc&cEgOp_Nkcm1+in4s0T%t*Cm2C zi075*C=;-`@L~)82p5ap&rH%)I3g;+4Cl9iPI!@ZD#>KC*Nr%$>m#U0=hiyp-){tk zuIYhAKDbq22L;o4h0i--bF!9auHMLVu9l@}sJx??)wwF%x!>5?MvWy$uxv){FJOCV zzB=>d$3*S+7mDAC-`@8*;Do@=j2mSde_y;arVB!PC5-fl-LhW_2?yOmDbf)ts+cZH zWY(n(*z?SNq1%WCz`5^X&1{6}V|(v4{Qv}e!QaC+-e3i587F=kP&oT*w7&L-*WMH= zF)KOq4=?3~A z|MU3?TF6yT^i z`7VPhLkQuDvBUOGkd4fypl|>LiUMGWX zCd-=_H3+MQMl3i3MNwF7ZlgW<2<3}V5dVN^QeSmroLId_7I?&W8p)vMQL1HslNESMTTnd&QE=1iTkG3ngNP{unKfVed zXG7gwu9pV%(DvN1Yw9K<1pO-G1cuX4swa|_(Ny-y5n@Ka&#BMKI7oT*q~?X93*Moi zhUk^f?#gR(OUr|41VeInDmP(76|%a2Wji9ciPB+c(A})PMWpEJA8GVjV{fLTD3s0N zaQ;yJ<%VNrzn}rw#CTdf0Y?S{1f}ub^Lo9hVSt%){Z_`;Qp%4~2>7rt#NCvV$v&|Q zw5cGL!zCcoqg;xRz{K*#1ogM*7&O*y@UPihQK4q(Vg7!bHB z(R*S5w*oSvYpN7iq#@{h%nsy};jJSx98p%PwfNHJMgxCa&u8e;h5j@$AN8*V=^nb^ zU)v`WRv}i6sas+|`4x>h)k;E;N-Oi&yx11dk%bbXnvOLYhzSX+^>l0NYlB$;XnN7X zn`X{RFrh;!rNc^M2Uka#wH-HyWyv>u0ragxg01K!c8(+pSRtz*GX!U+w##|bvpWo> za4SXD5amHpGFLBKG1Zx#K>@?lBY=9vB3z!cKS5{cmpnAfWRS-p#bjv-tQz3av;RJp z8Z&iYj0}yIZ}P1kWP^6mNIXtnt}gmya&J2>A=aPN9r)p=-)Nkrk5IR#JT3Y}JW!sR zYCgV|p4*c(LI=vqSF4Rtfby}^6Dwhs(6fgQmG4M$!p8x{P%dRr4O^ytRZMYYDDQ4o zo_NP?5+k?8JU*a-v0wN$kL>Wr{F7-hLo%jDSEMUvERBR5#4t{h;l%3S82`OcGsXo= zH@p)lDr5(kkCO?O(#}Ut4g$!>aUB(4fe=emu8Uwm2RBEK*tEsmJ<*SjX(&OfmLfk! z3)ytZr8C92$RU#vXfzBY#+vZOiiDo=SaQ%T4=GC)jX4DJ9u#S|$G#_~+$l20RT~D2 zh9t$CFu$ms46v(rl(M}0)S%L1_dtv8NZwwuEnc`dLUr0$;Up3>+f|RbK7k<(jr1lC zX1V`3@n|6=r3jKW5qDS8*Xbg$1(|r_c#89tWPh&8nb?!rs2i8 zkedLR8rCS{;kFI_ot?kIT^;sEN96*nuVBr|l;g3D1krqcgF?}RG)e>Cy%_&8=%naw zifq%wm&8Xk(Fs=wzcMarY2Jgtxa_4?9SYSy52oTLl!qHFXGA1#DO#ABC>Ykx^cmvDbxj?F}n!rdZ8+)iB5NNHrhAt4VBhoe0latie zL38EJ4G5pt7>1^wo$AiNBW#ca@h;odx#LvVM2?Gzl101kOF`FKU1h(w>dseGz919# z=5(zQ&4k)a_<9URZLDe>hn~y-kznAL$Q}&)l^Qhkls&gzRPz84mVl^HvoQwEBaBlW zk-{+uTRb?%vjm~LmI2_Y+BT`oPLlZr@2 zAx0{mFA`3JU#uwB463|SYRN5zw=N%$M%J3a{Yy02KG5or_9jHYHbR!AytTmXGe{PR z7fBuP!jVi+#CW8aLLmiKD~Zd1XimZ1eo_&Yo|5A_7!puAts_lCcFVHt-Lqtwlf6O& z1lv8t6~?i`ouEizI2+7ziL6xEVNNr@mUmcG2r#iKlV+>gj?ZZxiZU^NGB<`;hX<3`SHP1M- z%HbnXx7J%$0#yStVQ(>*26qeu0<+Y-vD9!J3Y4d}FA2+UPs9${G1H`U0kAK`2|>E=!HTONZ5eV`p-c!kJ#gv62OOLZ0rC5J zzEuLhPo%ZcP0EK=dsHRfi8-Wa21E#jof&R%=@B@Kw8rx+nm8f_4+qL;JJB=i5-Zq{ zn>VQw3@!R%4&$gnN9EBlm_bhlV#^kA+9w&*8COiLt5_EoMkY*E1WN(Ml=JeL!?Idd zx{)V&(P~Z|htmOg^&%bhY(9T559qI?^NK5C6YEE#} zSVu(SLQF^0iFbr*RU?DZ68Otqi@94Ub*uG8_L^%K%z6zMTv%(PQlz0xkVI-tnj&*^v_TT3a`vo_s3^ zaDR0=-C=&bx*`2ZsIR+3)!7alS)gp{3GtZO|J1V`E-ITP~hl`SWXt?<>GfAx9NGk8`oxZ=Ci4k^9*!^-_ z1gWz{H90bR>wzi|x9f~3koPLXxO;&5`o!QZ0>kRI`^1Pu=CSgh?#%!3kAM8*|E@VW zApfubdjFS-&IX{@WPGP>m+}*AGh04f;9>O@Asol2ZaHb?y3;98 zasfjV#uw;tEjWzB6Msa5i6I?#g>-FV7$d+vDE z>ZO$0$gT~kci6kEz)*CwcJ%B?{N!fN%WQ2=t$ft}zQ$rT%I?g|+*h~j_5p{CX}_6H zSJ*r&z4>?j{C)X(6{K>x5h`aL5lf)fKeKu4^*oU%-EoO{GqXy>Tv@K&S@$0>*CBRM zy&yTDsNS%ws<)eHqrTW*T(a;^bLot3W)ra0P3(Y)xe@clr1nc*SCQhastha$bTqv< zzg0m=;TYY+Szbzx+%F4=$*5x}ruMhfMXr_dTgmG*~Y$}n+CC>%@6`BXl(lui+=4WxbQLC%`MA)V=WZkVp%m2PiDTwfLZ zU4aK0v?SepX8$saHud&k*`T6O5=~J7o0uCdT6nbMT%wiUFUfRN^XkK2r4GV{%<-a& z&?X~e6;a$X#`2a@s&{yxe8QF0QciLw#R1z)uT_uK@VPMk?8s<=c>ei+s&LrAz*016 z(7A(4!|~==K?7x?&|@^69I9q^6TrF@SBLr;aubJ2O~um5CdT8jVX&sEv9;uKnlAeS zP#QFcw+DlCjM+LC?q$(PM7UOiJ~BcmD&+N;gU;R+{| zNryL$3rquy3gpTSCLLlH%7O#F=pHgvFg6ymFfnE*Hh+Z!O|m})YQ3Ssb7EgVGYcGqKBTcVSOY34zJ~gkQX%PP zg3OW=An}pGwNN6%P;9+iz)d8yfh)$rH2KTK%3DB%1Vp%|FTSUkosuCC4TuZGA5NJ= zlD#3%AwW4^vEg08SvUo1??x4;v?fHFS|!Dq;3K!9OLFoxDbt!w>bY2C@cLxzDv`U# zwcE6}6Gu8}d6*TU-_#D}(lXEmsObp?27wtC+Q04`{70%Vie)E^nQ4_S2L}lvu(4~w z4xE8202U?!ls;nZd>w#tu^Cf%jpHxl&0k{;_u=%S5-CH-4eWOnW=t<5byXNk3K4cg z3y0-_B{<#)Dl)XJNtNP7*Z_9~r^fOy%m*86gCeUn^<5-R`F2qry6!SGgZRkmYc>E> zo(`nMFcs-aGf+EQB^lo~+&Y$^lA^`)e&7h1Bi75hnFxewk_Z9d#Jh3afBGRexTwT# zlSk*+LjGY{F;273gCx#grk_!Yp0iWos7Gl@%`;mamf(16Ck%~ta3(?I#?x-lPHv$iWgF7 zFb57N5kl1#(E@gkjEjHz&@?XowX^};mHA92CL1LZ2P`_0kP$pTvZY~2k`^#c`Q3D5 z*C2Kq72lL{EFn@>%&Z)rnGuj+z~oRj_neO09%3QGoZ|9&N8tq-?a9y=$C@ZAe6a^c z(!?Kh=AUg$5=*|9N&13dh+R+e*ZdEE(*vl?@ByeS#gV&W%@)|7f~e!7Y+Mj~D5I=T zrS<6iXAN>W%{USX3nZo~IUr1MMeJJ7-!{1vrxYj_P1}iV$I=LUjpf-CoP!%^o>I?w z&q!*Sw%HS%oQC65aAqjs6O$Qa;uIEs99a5&%!63cHNOn);S8rj7!lh1n*{wkDA>1) zsBcJ=is|#*A-RXvf+MV7$b%zywHkr8e;*rKt@I-k$`I%5~q)+ zyYqnZR{y)umdzPPy)V>6KAy6bc}X4`7!VP7=WmZ%)HS43ZzBnxe<#2q#A6T>ztIo< zTb^I@DJB2}EpfF!F#c72QwHI$63H}?1tgIt#wCn0w~Fo5?t_mN);XPA8!~LVNIvN{ z`S>QAaRtqC0$bDk9GO-fHg>U6!T~hvMBsD&@0>kg)8Yo-s8-A%Vl5dT+zUC_%t1`^ z4Hijy04NR*;eI*#Ak48wok4fbmE2LW7uP$iuG-+Gg*`UrH-#f$2baw|&NJ zoGPNJT*}-=Hf(}i>8yT;jdapc*+Crn&dB*rL6DfkvN6Y+YyzMV>y)G}`K^XHgOz6d zhp?Wd{fFREc1`suQCHw0)kv$dTW>-tOGmD06V#k+O~{ttap0=>abSytMe~%y*zcx0 z@9f?nO>Yp?ZHZZv^49Rf6+$s>dt}3vfiN36B24@Ux>H42jRGA@HmptK#WQC{jp;UwBJ-3M11`Aa>T1ApLx)e4 zyJAR>crJnlRZGJA9WHgoFz&sKQQ`GpA)Fv=&>X!+};A|pP zPoMH=-N2hLF0MbWwDABMZDrRPKfsa7~VXh!~@ zcLW;crIy4n@f{a)K4`!?%8L7lR+boBHhy1S!@&dGZw%cDgFj-N*L1eJ;P2g%-ktZv zit$jwtgg`S>$qrCd>BU}7?xhtrOMR-GOKQ|_gl&g&^=1ZB|p0_ zev@E@JDl(@wC;HvAAn8j1uh3%r77wl zEqQDur}_BUBnZ_$OiL`MK4SMWY()ns*~$!sx&DD2pbT`-AsTC}A2fJ3meC#X+!HwW zg7@0r+2r_@MF;G6d|d>YQ3k*D-1A@vx9KL8{vLY~JrQ)>klzZ^_{XsIaZ~=*-aa>6^Ab5hm~p``G*4O`_Sn)8J$2G}dxtAfJu`Q4Mg=W1$J=DA7?sho zqm@;h=2^WzGW&jl`yDs?Keo!^w_8p8Na^N%pOQO+2yP^D+h0KL=bKLzLf#0gf@S40 z$I;ZisRU>Ran=job^X}r`Eigdce!`&T)cGPno?aBl9s#!=rX@ z-t;hA707gV>VkfTEIq}5X}}Wpcwe2hE${q*#G{2<&!Tz+^U?EOf3Y1No{tM$8DH*d>b6vO2CidA_pt)+Znd2My+ ze&X!F{Zt>eTfA&r@Ahh4=ty>Sx1R&6t~}Em7uN{R(LdhcVGj)N z7t;{%U|9lq>897jXU$_*6R zCi~k`){bo9Y&yH&$mgL#uSfU4>WfbQfByU530pmll|)g(!{6HFWP29Xp5l?0A*h+; z^ZVlYgfs2W9ri^Pp;P_|Uhl`^tKA9g!3)>ybHu~)yH9=OgH&ZKxKvbZEtf;TTY~&e zsEdI^q4Y3&mM`R*e0InY%`#z;^%!ea@b^ z)W3$r7dx&!X5L{B_#=qCdN)Ml=hODAK(NC{W71Px2bJ}kakI+84^pWu6VFkIA3CUo z=G^XFBoC09)6Y&KP~N!7nxsXr+nON2Bv?dXh-ErV>^;P+q0nl$%o?Iil@%})FG!a*mY1w;6eCku8V*2N5zul^BrMxn#h<4S~Hqx+)GGxrs0gF{+0^2M>>lgJBw%?J3WYP|m2(okZ0-#%>IyLV+ijq8ls` z;So_D#+)RS9m;i0dWmIX<_9*$G>=R5y=lUzEa&6}hdIeiID|L)y(r&wN1I^-5~}wz z!PS9ZRf9MI6#;P67{8TO!Dqsir3of5aVC@L2>4p0aw~oSj@$D1QW<&x2<ixWtsWy9(?^?`iWZ8z50?&EWaqW?~p=3xEOdOWe zIEd_AAWL--VTyTz-Eo&1rJ-D1b(ss=blg+T7N2g31GNpt(avPV2uq(ANr$EZc2|tS z{E$MdExbwVa|&XwF7?0 z!LD&aj>82j+m1|H82t4TC3KcYQ^Lcy27aodG9;m$GZraNy(J`NGJ+x3=D{8zs%HVr z-n*ySvHZ2t)6e6=eeaF{O0TPp@P=GL{LDw zYH^kYUx|k6I7NShj1sB@YxhV!?^Xc1fdKOuG?Dz}_LPMagATmA(#M^7ds4U%aAp^C8hE1c6G6}mI)u*TD%^l+iR%VuXD8V&^-htAVDKzfu7q^P zGZ6}e_n9#$K~1d-=g;hG&}rM><~cocmg<&}y0V?7ca7NC zT@egbgGsIAj*(lgho8_%2|t6xo7E8Xu^gY8u5k>$Nz364MCS(5K+zZ2Yr8p(am)2_r z1ROy>L2@q*@sCv|(V7(}Q_wJZB^hYJFm77N8RlyEcb7hQq<{L1Z1hN zm|Gpj1@OMY7`}xNTKe=H#kLk$9SIynxpj1KhEB$DH&`I5kMx^QjzBMFCga`TB7)_X z#fpF5mD)PP5g|b&H*XNfPR-GJKG;n(u}-W`4i3fkZRI`2cI1VnqjO*jz8fF>x&$D;tevc$r$w{fke05!JDF4i zR5IHUDqb*^;scMnkI$dLia0TZuzLyE^51V~$`qMpD)YO5T<3NhUFsSkkS7BR%O0Cx z0wFKBE|@I4$^v$gJsmsXJYxb0I1#Bz93R3(Op$s%HXfd`g~u%WP#~^uA9tw*V{$5I z7apEeZwnotwNMDS-_dec3T7MYU4<+nKnTSJdz+D3$!CP~iC1KKha&%AB%!zM!`-hQ zfKUu-p<@xSua6QCxFm)DRovT73cXT1Hus!~nA z`DHw*@_4}uAp#7=RmTihWR(kML=}riM;b|r2g%LD4h4fHjsTeOm-*0p6DnYYWHRnrl5hYz2O#cj&yr8Kg93t(Uq}n}Jp=1o*Yhg%c=hsZi&eF~p ztUhk$eR=q1eVtLju>bM(&G^~NvFGG(e9-sfZ+%^wyebyl%+${K*+0;BhW-027*amN zu$>v_K_?qfur@qn&!E0%v8u;xyVG|9=gly1^6ORS>B=u8uJd&UXcu)F^SBAQTS4pT zo5ZuRfD^j*2V|pk`|dv-TmJEnfBYW+`rqgOozYg%1?GRh#A^z!_7CZ8)w~Zz{7OA!+ID^@Z9*KFod@xUc~is zY9i1X8FT7i=?ak$ze*a>m#+faY-*{wQywRx#q{|Tsmwz&RU;Vk4w81g1gHm-5c3hH zsONdGJrwAp!(g`1#gM!Y*DN?pJuVF;7vYR9jza1Sp#u8ZQ51xnvBN~+4?DZPyv7gdiK^TU8y!v?dQ!e}tQ8`Cu1D+$;V@uan`j#^_ZZ>yg^;zCsA6 z-B$n23Gk3?sY8-mr#g{8goO7GeT^>hMK*A(IbgC*-HOjlDxj00gIYHfEWe5fwyu&z zyHW0PZ#I=WBw%{EblL#^zWOsz7smUcYCdkik2{JjPDFOd%(TNR>Jtd8Pje03OKanr z#uX7c2NL9+iji6G#e&Nnc6}Cj%QMWu`w&f1DkBfOW3rDm(5p1!5wHA-!c6@yK;FNd(zF`f{BkJ%Z8}#Q$LL9(P57mUcl;+qP}nwr$(C zZQHhOtZCb}xu$XU&Plra0=oN4PS*1#;|j*es7n1P&IE-vI18q5bW{#QgkES4WQ%}| zh-4N3MS@z{vK+Cw=O!a^?$Gy8gUIcmsyVN&C0)TlauXyyAY(!g^sOZ!kfySzw_g@b zj`3~5>IBWmp1ol5^BjV>RA3tUk}l*LO}J{txKWWfHR|%vux3w;JcR-)Pz7?3Yr5dd zL|`tPeN_}Q85yi?g6H692D>VLhYp+Kqo7C2%;C^%FoJaN;vcdx`2Z!0&L8L?kYwf# z$6k#c4|1XoU#05o<AQPG5*;Lo>b>KPo>l7&=okyhHYY^DE}O^~M;#*d_`@e{&fDb95sXE^br`#BtT{5pd{j$P(;)Rg zf~yFn<0`zJ^<=rji#dlxYL&YI4pbjUIjbr30vov=!p>|94A)6*n)#xrJJGGRc=VnN zw?a1Lm-w!e=T%bqlchqC%XZz;4}6NdMmC%xZeHE;B_$r+GN@`o!kVKHfwfwp{32i; zuWiHvK;jz))h&#m;!;4xp{z-(ECM5e?89axVbVA)MnQ;{OB0xoNq&^YSj|df+S*W) z>SnW`X7sLv&oD=nYd`^U6nYk(*?WV?q4CW??XP+}j%;U904*iG=3<6P;XAmL#cZZ( zw7~rnqEnh>Gl)Z2;xjDGx~@aRr6WrG$HG z7y^}d?&7zwB-$wjww34~H%L2AaClQ;#bm8;n*I?wlma=e5Zk}D;{ZL01fmfl5a0BE z+PLbPjFJRE(K_pxgshd$28kpV$r6;YVLxx@E9u9{Rx-*h+=QF*RN|sKVk`i9VpY08 zF}y6TfBLe79I)>BfD*46_>n$Ur^!4HLI-~)zx>|pYh(oqzh*3o%^W51WVNLVmM!rGfW$UK`8EC-{iD9%9YnkuNGC25xnN3-)R~Sl3Td{tPT{sh1F^F5 z;-q?>F8X`Ow9@`Xv8$$2vXF6fxLrGryyZ6N3&rSQOl*AIGXY+XG}?MzDgfy4;8Z9> zzW-ieZaLX|OL@9vw%5XJVYRb@6WZGQgg|n|Nlfd8_DIZ%{Pbc))@aaYH<+Ul_}A1P zXOTBK0?rAZ@PO7?3~xe@IvN4?0Z{s61mdoZ&2n?#=0z;-B_NNW0c1VEiV-HbIg(Pr zAmC>7c-q0Tr@n*$?GI#T5r|EyLX;Jt?Iz$qDg^6z!O+h z>u7Y&1$0*pIL%7IS+Eao*?re1hG}aVAnXZ@==! zSNb~i2yG}f2|DiTDrl3g%FeF`b_S&>hvw_PiWMOVIY(2N>yAm86C^+81_;_UM)0HmHdxdoz`-A9p z4c0p{$v6sZ3UQ$l=wZQS)Gumy_go=?-w+>+xi-%c1=1dgG{-0Wd!A=WjI^pWlN|xm5fOJ%9bd zQTrZm^}$i{Tz+dc#@4R~-t1s*@4s5<)j*_y`9~To|PfPaIUzuy1K&t#LG=718A+de8134{;iEU2X$7& zMi3a6*BeN?QwtodN5~l{3(fS!-QEIC_wS)6u0OwU^+bleBO~)XBs_k2w1OzH_FHdH z(m@Qo9ewGz_lL)g6%v`DDRe3k(iy-_)!;1KZmCCbbF-QXi#2+-Ww<#J-wd;Pvkz=E z%alscrK9dyeBp=aVrVoMIJJk?A5V+vwwN)S_Gr0=@Ws1AF8e~^FvI=Kd zd#VZ~*W?Lio@H?=h}>$4@qQ9otIx~w$gleb#=e)hp7`*-aK$%3%{(TOSh=sWr|;oob88A)SDOKUwCsL~+kMZ=95;6E zk0a6;o0OZI+x3(rtk;&L4PhH-#5LBQo@7j}^f*IVb#ICe!>FDL?rG5{MVtD&AKn^< z@xfoEsuE2nc&J1 z4*AH)r`t@LD9IY+eb%i}0kG^%Z=KyQ3o|5HeqA{p@1=a{A{zFf?Mpomw2OQ`~UK57oBn>7> zAy3ydP=!%2Nbw|QzS7goDn57|KwwM~OJ+&n$_bWI&i7Lj+5=e#fq_Y~Mp5&0;~+{k90H`M%0;g< zTW7rqVsF$CPq<1jG3j5LaQUEhH;O2njb=JZVnWPzLRDnQSHPoAnzBoY2)v7ht`90s zx!~zD70Rb-$_>%fSFphH$!?4sxobpYZI*4rmx4Tx3&b903gPDQa?W(CuOG_PKYc!g zvRV%JkN+V%HI?NiD$~2y+%-2%wLT7~RT_gX4`oWGgp9r7~yh?O5tggO;7k z!R_)&LkccM1R9>Km2V6R;0x?c3sNq&p_ROYVTlJ#jt_^dQCbK&_$D`m`U4t{tSU5U zi={xDbZR(0w{=;(1Kctv5`D|-GfmJVl4`I|R9N@7D7N9<`$ebNsyGnk%#Gtw#WD<} zLPlCHop-@1&m(#ZHn?tz385g}^@!w@mdW`t29y@P~~VX0-2wASF5Qxj6> zN~q-sTvyUTZdT!ou8t_@`d7zmn(TDysn6jmFp+2@sU-PViX|3bTm!+SHCL%3R;VFG z^Q`G0La#^l4&2LI>&EX>q$hQ{jB=$cYr0ysYApBSTIZ`vDOjF7w9exjx3EH8Di<{1 zt&z?$1#+#qnt{B2yh)b&dd)1v7s7IwN1EKCFXDk-qPrB+M2+qRKHf*_Rj2s$zPSb` zkv3vKZQlcwO^@a!T+9is0<1f`GLu1RuiHG;ch>hMK|=&HT&VP3kY;Qix%>mP(m><- z^#{&8g2}kSJNavYL$?Og_E0T?{~AS(^4NbjL|Ip@<%lvP$8wymR^_aE0_+v&T)Q?} zyl-A?ps}V}agL08BtyPpa_@6p1xUB3X>F#~(BL!dDy3OX8>EhKW*v)EVJm=a3qJ8q zMwLxhc&#p)X27AyqVG$0g}aT#bM7!~tuvlueFkj>cE^fjgMyQ}#Zx`R>Mg*9;dBfA z1;k2eSV64%WsQsBa4K;P_gLU7MmqEy3|U0laYU6kCwfCTN^ zJQe=gHr~Sh$+862mXKUiJ}ij4&JSXnmRW=cU&p!R`3)=D#T{NGKMt&9i5mqQ?W^`k zgSHr4=Xbg~F030nS;`)d}+*L?TKYFD;>MCQFPGQh6?NoHCXj-HCEg zFik0IiKO0q+e9v+#F$Nf(ML}$%S7Mg@7Jl5!rZHzjyuZc)i(Z|N53)`IM5gIg}pti zd4q5};hLjYTmEgNPy&x31i~Tn*C&po>F`vbV6$Q6S=Q*hYA+@Zy;9Oeslf&%NEv6l z17ttvyJ`Z+7^|VdptS*~Y4YMz$F+hkp+T~c_CgqU&U{14IE#M`Y8*P)ww2{fbpPE0 zJ)7xI?C$UHIONmYkJPT8h1E;c`z5r_&x7WO9$P*??a{}CIH^wl^=9>H-*+{o@OMQ} zI29kO57>2$=l#R&Dt2NndpzHFL|7KP{L9;kIm_{`vW`W@`16K3g9@VicZatNex)Iv zjUfsN7N5E-V%Zj{4qnQGO5@lx3ZJUa<=ZmD8ZSpT$BOycv~X7I(!h>!R$2)9%$T>l zdwUG>W6HHY;)tgGzTYRKBzZZ*?=US=Uc7_1J?Id&=e8}HL%T}D(WxL}I=ivX?UHFM z-rDW}D4bAZMzitpX-DVE#aL?Y&9Ll>+jQ+r_~lmi>_N2IjHeHx9!EO)!GS?V5<1xj z3<{S*h*J2IF$5&m(BIqMR8bE&7-I-jlCw0nkyD@W*vW*Q^QM_tQ3*akWD`_DC%Z_3 zYrBI*Q=5pjj13eAL_5?SlsZ#^Ao-BmV8A=d2WdQ=wLtDc3O3xRqX?!Th72s6aO4Qn zV4stA*aKq`S>{4xYAFLNAZUR`%%iW%XsVE8fe|y9l*JU-k(ffi9~X25a{CBWW7GS; zPp|>~3%Z8)piLLS`&`Zquy6)JI4XEtL&J>01jw+s#Jd1ZPb+eRzbJ53=Ywj6fD?ZK zn3-_)!o3BHLAV;O17ndUgt36`nu}3pfihqUUWL6FUYyXnqj?6J6N|e#ZAY| zA00L!-Ye1s=f&a#m*QYuk5IKd3xU!v_*KN;_IGyRUnc9i6nrbRt1~G)Emmq#E&~CL zbKVxtHXk0)HMPvencVaLVdqWfx!24?>~LJDIa=kyLn4&5+D0J%1eOY6@fK7%U~R^T z&#V9^a4r6YijM{IVT5P77QkahR`wuTIf}PnwJhmM2^fn@jpqe!-sXIaX%(Ch<~atj z5D<$~j5ED3NH9*p<;CE}^vQ*3+4zl#Qp3LULKMXi!cw}+XCi}N3(i8HD3?rKAtTmKP zgCG9!OOwjyHk9@3p7hKnH&Rc?wEAdvrR$+?)*qX_I;Eg8|5NveDb>gsn?trv4?$f& zJBjbbOI&vpx?gh{>n-@{K7Mx?_wFEH3H~?7>#coYxE~zPPxFXK30&rK<0*LE=Y^Gy z&Sb~?sN3=GU7!jg=zF@m{k1n=x$kBVQJHCE#GPG@U9J0S8OaE_x2>m9Mm+CsrxX7r zztEq&&Fj^D$Mqe(sco+%t?RD0z31b$w%fYDzqx0@_tV@xO?~y~j8s`yt9J?ZNP~$K ziMF=y@2nSQY#Bax-Rpzy@GDgx{l53q%P*)t{=Osh9>-ahwb+f`%%*RV+m#i2_*_3= zy;x<-|8$S^&p-dCD)~?Uza8|y`+seFU2#;s*$wZx&i6mEhYARx9EGwr;fL#VM7Edf za>|4dN+4y#cnLdWYOh(h^9oe%({fm>ybN@~G;}ic6eCaKm6fQsu^|{{q_Qv;Z>{NF5@bW-B zFw50iUB90zcqqJ31fegpP*!|pVs$5mQI$}a?B048j`)R+3~iSmV14}lSv2FyCYx0C zb%gsK2KLz$W5~1BAI=ggKX~j0VS|2G)+Tp~yEB(E-`AhKJLZ6A~_9V3*`LcHv`dKEZ{Z!_Q z-G|Lf0ck%NTOt!>^hx7g%Z6#eUf}fg1$fL|T$4XBIDkD3IAL&Iv$QKx^(do2D9VBAP}~SCbWQn{`hw)t~aAZ$`Q;N7z;x?4H5! z)eaybiylfFABEu{ekHzv)TXG=Bj6

%WC~(1NM+FA!R!&z9k^5; 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�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 z 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


Ouw`J4(^W#=EPYnMd`X{f8g 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∋p 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∓ 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

lWpjD&z%nD!|x~g-LN81F>4PcZEq|mBv+U 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%0D}^7VF) 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�wpb7%yU;zx|A^ao|9Uh=*drMp@L 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�U;))VlM>b}Y5b_`u=|@XzZ^nU#8;d;x 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

    2l;z_0wCdJf?0PN!3PVO@t~k>o(vL_ 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

    +G%02TG^c+b1f0D{Aifx)_@qZX; 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�ZRq84)Mb#eQbwdA1?i{t67D zq~9YGBShi zMr*Vckz4|rB@=uGRA4&jj;>rV#Gf0aLGY{oN4DYQGcfnjUw4wK0%=t)<0S2k{+nfk zkGg28`>N~;E{cQ?A}Eru8%Zr3fjMMb+-Yh{&VeO!wfp1H^vqbGe8jM5CL#$#dq{$? zJyP#r`A$;?h$e#mZPH2fiv#erlND9k%eLAZ*8(%5vJsejh(&oYI-0eaM_F=klvojp z#x;~EsNU9Dd;wYjmkR(xQiDj1UZG%UnzW%PEF=J4o47bx^Ca;_0P>jiatn(>rT;@) zyGc$G?T#DWk?O%nZY09a0VD+s?s4c`M4;IMWj_`d7@kA-zNo)TX|BN;w+3uR{kZR2 zV$@kQe$*Lw;rGCBIXR6=@(z%^n}XKKqhg~5B7D`&l;0sweYL@d#&~r3tIayO7 zpjXu(4rqj;UkQ?Yg~*$oN;j6Mq$uN04>Cqlj~w%4LqJHdKxt>mcC_lMr^9u}FJ*BJ z-^N5$_%p2=H7P6}afVbF8~4A@K=#5JlQwDl8i=?$a{M8x^rnf4^Ax^m8cujnxd#rC z_v1rr^dADLY->rQ{hRnRgm_J&$wCef%fcR{4>fIo^Et90Z6kspd8RaG;pHB>%Nfb^ z4mo*7N6y_PL0@?zoGb~aL>QEqxt_xyL4>W7jhSSu4_*+k?FBOaTt*R?yvNu{pfp{X zsR~q<8{Xi>N6|UgrrcKgwOpy_ed{ExLGwRw7|@(K+Z9R_?S^glgN&w@GE>=2XZAV> zOPKHA3c>4YB)ScKSKa`e2I%o35nt$h*WcTC4CJb;-WG$}koUCYnF&|$TzT-WBa6(a zp4=PKVU#HVBHo;&-FtOr=+KUjaCWuYQ|FWx#i61i$qeA^C(UNoLgO1HXY1&r=vnKq zj@eSp0gXRI!|%ouwjVMHD)j^qZ_(c}YWI38^ah4+??`1~gJfeyYa|Xjb(+!-u+`u5 z#KwfbG7|LcrohwZv=Eqf;y*$Hr(u9mzoG!_X??I1Of((HEt>JC-wXZEP^HGej%#O4 zhgz{|GDvpsGBLi5q3S=3Dg-3A1GsZ>g=1Ss7=%y-b6Q5@Tp*P3P=Qt(CysJeYSG$5 zFP@sPc`ml|Y~G}WUp?HC#GLe~(0Eh!)Pt_pa9QEf;pK#-cguIuXBa<9tqAj51VT%v zPA0hpF)g6ZfZ25=>RDEuLUu;y0ZF@s$VhNijRdIhIPdQ#yB6Kem*pu zi@dXc-ZZl#p$^UHF_}C_cgMrSZ$ZwXa{#?k`sx{P!2U(uIku{PcAURbXBt@&@F zyucNN_1){**=7ad-!D|tXw?w{?PI%$LO1xOxJ#D8yW5&D20wm|k)J`6>h`>jS;$>) zC;PYOQwF{7{j)veyW^z7pxW3+JDiH=uRC+3#w`VSG+zF%1Mp~;XFJs%ec=CgD*Wf4 zfByOB|8!*k)BgdxcDQQjqqo;ro;-)y+0R^?t`UdLl|}pFZyFMCG2K>SZ7pa;67aX` z)v8tLi4gGI?wMFJPwZ5ZF$S(6*-UH!e>qee?RI{a@gggh>hde&>gY zA9q8u$B*#8{Ib028pC)>6;k}+9r%^=sO|x_j~IgG*IWc#w^0E8GcwhImxf22P(MzLjA3w;~GEA~%YD-4YPhLjp*bm9? zE{VP=pKw7wtj}_@_IApVDPwO(lC-;{&7c%#8A8h#Ij7%dU~TMgzi;4^mAX?WZm;n1 zzu)#ZJH@>i3wPv~r%w8VT5kvrF6S*7pmj(OO4t2Iqx#426pVN7dJp8ug>W`6r5Tg-ye@omB@%P1{rX za|rXcjEPd#vUwSLF7?(RPe08d=qmSj=#L|FU5y8ZfUVP^5T99?dlXd$s+i9vP3E=5 zh9V>~mDOBsXskGgM%+UQi?6}`mY~fAV#ESXjuK%ip}}=JYCDQ4?<@Fxk8GW>cZ1GA zwiUGb=vZ9@Zb|27_h7O&Vk|vtiG#~;w)q%n_{}-A1Os18;YA|k zA>4_2uO2TAM-0}YE*Ktxen=v%Y#Z9xc8vvo7LA9BKMGw09NWI?PrnbLb5k@*C$$<_ z3flt@5ziQwn5k37*1ttYDv5krR{V=t_ryUg+~Y<(B%qdLBwZd#`K}s5d-F`F`rbwZ z@+`ruQow6qoj^g%YScK}h|UqsdWL5gS?NqbnCzgPLq=kZ} zFNRTXAMB;kRGmzoATo(`B4pg*EO?%|Md%2@OI<}ITX0)|I$ZNt_(x<~ND<}mhhttm z+9vs3DU1-ZSvMgiOH4C5mNKv!G2={dWVjN09W~)f1AXaH^J?rx`#ma4iK zwr2-trzuE)f}r+9wwOoWJZ;Q!BpBWC1`=IH|A^6V>bl09HIIH5rxIb00c7F!lJ)Xj ze2UNn$Af55(Ka+#lkp%2lzr`n3HUJz4ZS49T2ze+n3672dNoqkW3#z3J;P@~w`u8z zB4WH+!Y*?N6FRE9C3=_wI(UtDN!2-GoJfp`gu*hp26FaYu8F`3m0+|Y6IqE$=`_qC zr3bPRW#y_-Bc#gkMr>TOrj^;pB8{bd7#8cx|BJnQ`tbx)W<%8`HLJ z+qP}nwx(@QbI)F#>rH;ylkCpt52&QB>UmQ2rYiHNXqxGvtCnU)m%)#nfY-371rLj1e9qAK`p<; zta!&ph9NZjJHT6Wk@qB{=x9n7LF^kna zRm`*ps+!PyOefUIOQpZKl9v^Ar3mI6zqc}haTI%Vh>FTqAWgpHA*>Dx1hWzIlNLKqkN@kqRf2-!*-EniE!%H7 zteCc$vwo9xbu7mc;UF7ml(5$Qvb=cf{Xf^tNogySDYA;D12)i7o2}Ys*8Ha0p8jqM zXsSW7yH&$hYVMoIs+D_Tw_9MN-rDRjbdU8h4s#8&+FVw(yn~U7?{}coqJPm&+LJ=m zjmFnpQWt=9vv8Zm&{n^2DD}plwq}1FQiu{~-&;Z%^>-&`juk7=TgRP2oJZp7+ps)1 z=MbBOdl7DIFZj$__CjwJB33mP5TSgv=YYaX652V$re>FTqYg{;&1Pzhe7+2z>E;}2!rmz*Ceh>iWj@A z1h)uj-AE3?bvTPDgLDA0u>n9@XjQNWWh(oOXH)g&O2U`5 zghKTN`A^qYH)w0E2Ix9aBmQJ03`X%kMj>Az5FrjFRh9+UQVS(Otfnkgik8j$J%A{U zv{`&PY_$=LpDYmF4Jo$dZV`zT6n2|h3Ym@Nnph8@oWOSDRxPsy7wi6c8k0J3bQdPqsJMf|ZjOH`*lsUh~K19GDksswtpl%(}V9kje7w zpWuV4* zh#(2-61F@Eh9J)lS67g$Ggk9O!p^z9>$+T8h7fH`UT^gJ6u(nNKJtbx^Dfs2RZ7k5 z`@EX{n)}=&q~$BM1h)A$eO{8eo}VM$p%1%pl`w`nGxu-XqMzH1bk(O~dmrcXZtGnm z-SFdVqu#h5s;dy$K1D4%E;IL@f^An>(0}}Dm{wxx{mX{ zo*6~`h>TWGdtO~%_j*3|59SbE<6d@mxz~M8nfPW^PItct^wNzo zCdZxae`-G5ch!DCw=pBH>3MyD(ryk8NS{jGhfzv1-yX>|c;g}d*BS1gfByOBpMUbw-n&1!na+A#U8wEX9Z z&y61#BS+#_6cJv>=OShuS>hUT;HIG7n?EB@Fdw{6ztMWc=pD_d?<~>xslgon*c9%o zfq3IBF`)I<2W~L(ga|O8ulJhg0y?rBryv7OjDcI|V$GT1`+TY+k#{lKMx};MhvQum|F$Sz5&w)SR6F4DQprFXpogKh8A?aKUF%A}9jjwTVA2 zqk+BHS+Pv~UFdES)bljB;*V7u_5>L#95!o#Vg&<$=#XmQPw0`tk(CCnxlcRi%L+YF z#fF|$Ho`BLt7l7pI$aKaUrH`TggZtGU$+aD)=R`411N#Gep4L>Xi^~tP6Q$)g9_5a zv8!7id{7)`2_c*hW^o@!-;IG4^rNaCOiP>W2NnuC(KIOp;iqYVE9r+zFf(@PW}6Oy zQ;jd{I79WRd9|cnQ&tXAlhmC*#?cMgyazLY;T+$=EY(fgN`QN-{VH*ci*}M6f_ds6 zrbBU{GuRY$cuG_y*Ct~(=s;jU4bP1MM%yQk(8h**VaMS{xW+B8T$7@rU^&)b1gu)1 zLIL8Vg}F)aRDtgao^ct*b&8u7%lHDii%M`%VBuOEt7=r?im&og?T2Lv}#|tHnqfB^&zXG_$h;>uY zUKA^#Y&VoN92PR~kGh@c*mqXH0}&1Cp1aVf{PaUs*8apaEuK)}beg_sj{#f?F3$7^ zmMqB!nSo4-H}&inz4EV2b*&b)7UE@A$LwB5K%&@pc(3~!O6e}UXIZfRJ6}ohy6nYJNgpOAt8Yz~vG~ahUb|&TP`6SB4=2G_#lPym4RaUZzWx*NZ@ivTo;%BKt15?O%;>+cU5SAx?N^4 zTD0Ih9hx6--8#b=K0F#)rg718z6W%z>#YoKQjHYXPXA5tg-Ce-iUxOieM^;TUu_l; zY(lRCqjkwlq9!LEi~-RT>okN}cLC%yf|a8cO6oReNWg+Kyn!J)yv>w9ck5F_jC!Bj zakp04HPIRh4VQGATCc2Mj8AJ!Co5H4(_ho=g^SP}@O#AzP>sVZrYm-W6CQIk+N+jv zD|gJ!+E$GphOCGS@&Lpwm6(N#Scj^;g?(Ulq|@v)DCMUo9MJ0~4K8nyWu@)bblUI> zt}Ar>rT^~81k1-{4}9S`s3}CWxgb+S815#*bWQyU(Kz7-oIMc1Du;KU?^=7TMLE7m zl~C%Qf-L#l&+8sK{Yv1VbtE+zRHO-JvJ6l$IowD=Ns++6Hb$RHv_nC<(w;_7J`~0g zw9!g)?G#>G} z4o}1>9zn~ZzAWt(h^QQEp*~I%k~yz1znfE5*wUj-elE-p#i!65l`vQ%`6`FQ@92_f zJf)Z~!>E8^kNd`zR{C9SoVVi+ob5>AWLoNaQ$nG}jgL@;KkzHt1F#I2T0S^2${NNE zPnkOWq+KcpoKs*FI^_}?tpdwlc#R4pA-Jsd7?CZ&nRIgxLe0szuWOylBd|Q78}0tM zIfp4hruFoi|Ilasviz;yV9X!9w+Mt;(Lo&Tu!sGbQR}vkt6};SgAYsj!MEw(^wb$L3vOQ2$;VL7M;p!#Ka%t zn;Wt2%i+8q-*&nFr3@|Y(lvqndG57{44EU48(X@!2<$Q!`Xz(?8PDH@9lI|^%SBlPKF%Z|O-*~Zz;Bl}?&{g`#PHo06!lV#n(-t%D^ z=sXr!)!$5Z(y?T;7`aGk-bFM z_nhBmH#vlEIbt=zg*Y2t=BHU1zfV49xmdacOH@iCvuOLYI?^h@@BQZA zI)At<9acWzYdxhZ&UI8d(m2@t8ovh~P9o3C_fje!d%Rxv`nm$5@@S?Or!VPPbouZQ zT2?m<3>tGgW+lYN9T8`h-mvt3vCQ}6hGi&wvN{R!PMD-{fovaxeUwi?>*#>V80gdH zQ?w}`|s?Cu~DhXjoP&jv)z!lqN0 z(uKcCtaneu30f_jAt%*O_K=b}9E8y8KCg4B`CARKiH;^(scbgng7eR=1!hd7Tz=XN zK9KoV@vn|RSfaajMzp3I(gr+HxO9fCGld^yWU^xX$JzC7I->4!&iUzNx%aXRUn5Vn z04{RS3IOOfQDPA){B-zBLUc9Rx+V*{g&KFEOJw>Zon~>VbnT-C3pWh?!!q>0i-$=agzK7Ld{uMbaKOny^l*NTMoV-;B{J|!ObGtW zUSw9JJ=%@G?tB|@mhRzQfj~#|(O(qhGyh8^XKHy~cJrv>WE0P}L&Y04kJO8|rjn4k zB$tktkI91tW+Nwi-)v95;|KY>QA}+6#clOyy3Rml)wd52HnD<=lV3ULxEl z)xin11!);qPzV^brCWqs=`$~x2% z*T}Gf%UzOj+)HlzWY@q zVkrswOX=bKH{H6QskM3Sn{beE6rzVHL&?OMn9vwTLzYlo%YXuK?H00Ppn?VJB1w%X z(T#WZEJA`8^iC_M*XPa>5lqt{d>|%ibY^r*ElvHD(Ql$)+$k!)iH;@a#4aeV42+fS z8SaAXG%R{7LM;|s!vW?EoNDFCf)rZMs1_Rk~KQB%n=f#IHkQtg8ihNPTb%wNT^}N&dG?w<%B5tgkTvb z(lD_!Wo|lD^uKQ9_rFQ5+cvc4Lr4@jtA1h6nNp6s)1|CDsM9Yj97QUcS5e{q;VmJ_ zn5p@6)<>v?&@b(>$cQyM_!yRgy)>Gi*d=7N#K)`YyewS=oT@;d-zE4(zmw1tqM)%A z@H2FY1mN(MS@ul0ULn={2rcg+O<8Re`OP%Ac zetAifo=&T+Z|)uc&iyn%EUijwS$$~v7b`mM0?dRDDZpDev(hoHy%KngLKlJ^ zZ3$9@tn;G^Fb02lM1t4{n8d ziU(#*L>bRE3oz~82$05TA>&Ay?u#*IKh#1*i{EAT(x(wToX5#c{h*XdAtSA}whJWo ze@@1<1e^XFLfF`8FB^&KKFkdg+U7V+qwA5_CMAyX=n1&35#<*?7y|e;BPYbkWpD9O zlk2GuEZAxU)3)8!aUAaKT9bP%iw1eqJ_{S}P3M!6O3o(R8b@;>H4M zRe4vAW7sdd}>NR`Kcki|8Sv_BhrE8!|TnVCNhlkX5w8+DF zr`WA+I+rDZlwk*wjJ2b(uVCSNvziH-cr?a42W&Z&R<9|w-P+;x395JNb8GiH0Q9m2 zUdFuyRSdGyT`zK2YO6&dUwM2^nhokMNBCD9%5%9k3xg&`r}s2jYO`!FhYjswvTy8$ zy`y6xI9}WN z2WM!ND%~To_8w*4=lat;v)R5Dtu}8Gnrp-H@# z_KwEo9lkX2VY2e)*ZWes&6MD3+G6peU6`K~y0gl! zrIzrx(^3VrF?kL>N^1nM4u?{rBoX&8_+6-TVIQ03bGv>?)%b0*9$ai4i-JQsX?RB- z%zd!W=G`vG==Jbu+a>dWGW~s(nk+l7BHu;FS%unge=4`Mb1{gsd0k!{WBQ)F#r^p+ z2fm`bgG*>vYg=1mGjH3g^7l23Bkg?m!JG|JtNE`=%~3~;zNg;st;^>(+P3YFXc4$C z#_|g)H(u*$c~B{z`|`-g2|8&p?$V22#?c@Cf=Nb#?yoz@5Iq>m#lhr2Q!H!PnDevsm>ygWtHMn{8pa5{UCKZ zUv&#}*rGq*4%gp|YV5~;xhAMqFE5kg{|TEu?w8;1jJNdmwcd9@UQ<=LfBHPF9K5b~ zBMDdeR*Gu3tZ(;r@+<$^!(k82{;$LOKmYvm&;LQX@c-@qGjV8R=zcA1e0)26O?*7w z>F`MX*3uC(W0^?i#P!640L=(0T4BznMs*W#X4+c{5=E4QAad`mq>{H`Y&_~Q2_fXP z?Z9aPq~V>!4UyOc+S{VauBuKmnPUm6Nv*D?72Uqt*NZRT=L;A3Szsp#hT3nd=g`pE znm<{%W*2$XCIVWzT`!L_gmu-RR7@v4)K9*iUu&4>6#cfpkxm3Y)3{8g19C>?jLRC9 z)-A7CU2%9~eu74S-u=ShQa$?yln{YjU5NVH8yo&MJ-4Z|tIJ~gW(mJ~aoF{`_<+I+ zNGxrW(aZr)6RV~M1t?+j*R-6QobbAqdDwB&K>h|`^FeXP%+5%_hrJ=+E_0TiqXr5% zgHb?8wKSVNz^p4?NkV|hSnb!2Dhw3}L%Acd97B$jKoN0}gFu+&k>FBzFM6+Zh0%9z zD1wKc<{PzD>DkaYX(7&Ig86eH5kWOJ7pHC``R9s6G%a%ro~#e^Gld9;%1A+VK8*^e zIyI#ML(30l`5*XtBN>w+-B*Jb;F5;!Kjr`>X4N)o8I;n224DypzWNrjM-p#B2Y*3^ zI7kOF!m(ITjfszAm4qy zey3hXN@w>FDJU5Z8_9T4C9Li@{xr^C6Bkgt{sr6ImnQSqL+Fp-~(5*F$>#l2(K(UPP=&vL{+`YPtH5%Ya+iil3aE z)daMr#WrFDr<5_=mlwJ1&xdLho=$SdMEURhVmJ@qz>7bN1rLCxtsR;#2k7Ai{`pud zS3q2*7c+0&o@7qQ1&OwBQf;otKfB1yieZTs@x35&UZxR-MXSW7K&wNdvw}GDAW3| z?r?{Rg;~=t1SXBZgCxG*E1IkV9! zo-bgOPF11LiatcQiiKQ~N)1e6asFYF2_MRQp!cbOR`y_>cUKB2V7QuYuv$;Z<6ce$ z39{wb_d+hX%pnQM$3T5_CXNGI+fP_JX zs*JY{_|RtDi6Duc3TS&Od6PKf z87ZS2MKgekD`4DQ z72SrLB#vr%<>-3@&WN71>8VXLkZVOULY@>w71#&+xN zt`AQ@Y{OIr#va%d@%FKr^|Fy3SL{!RsEaKI?l4m#gflt)LTa%YBeli^)MhbNjS9@T zQix`SdJ$MMkAes<`Kb&2Na(Uep#UL3h#V^CspUOldNdTw+W|=xN5mprHvn&Q@?fbm z14&HLnTg*e{5*jDC|E+86FLU6WVM(+a1+d_`fqX7&>*%`rrG)MfYbb-hpar{@j$?O zCb!6P0wlrEH0)OWSw>nI84#aT$X z&QFZMhh%oK356P#r|liDAh$st4_QRBK+R*+MFEpsTxCW3FlZLlfHNuA9QljqcsKvs zp2}7rYI?S=q;Y$Kvy!;N&Jvi?7%78?5PLkLB85NCmZPtzUf9@xTg|3AL<`GAqba_S zdy<^kLNRCg$5?c@GU+!GVGV^8L;M+F#_cA) z;ijPz?<_S?C-ewLZWb06J+|0!DB@u7z^0ofss?lzhpAdLZCt(0aK?V`^7;m8!ol6m za$+S~O)s53nD)gzxP&y&rc~Gv?E1 zM2G|%WfK`nmlIehGA8Y9JJ~C*{|j0u3udMN!UOe1z+{%Siskz z9gyI$#a%efjET*GxHp`~e<3L`zX|ER#L^~vB)=9))6|yLnw-vUc$T1?2P&Ta?_c^ImcUXnf*QmIvOu{$6_Xu_giY;^~ z3o*qcP{~j`=+W$)&4gX;#+a8W+_da6y9PL~n9o9m_{QT!H$Dy+ZO<9S8m=Z^#nHEQ zOJ6Deh>qtsXZ#d30YQXqjzQ?Qyv`Nv!kU8%CwB!tDPuxg zVcodn#&uOU(JC?$xZ3Fyj#Qcj9SVxQsw}J%#=KZru=(88(ns4;w!s~L8Go8@oX*4H zE2kTBf@GX%1{lDu*6lm>z!Da#tuY|YM%kVMEb~Z%tboLo7#YkMW@<)mq}pI@y0ZmAJlK)mpcp(!OspuOW999 z1mAZ?djLR#BR(hz&4&08t~T2xdJEebx>mQI0lgou0r6_x^%~P_sewD6+-S#8;O6L9 z{OuL^oh6JV6OKD{?SHH!z|M%vRn&igJqi z*%frb7f6GOv|_4tgx_g6)6)^2PCBW;?XLMbz56ee4~wzdsR!b$HtM_kpzasAIwqYh zBJN$^mvX^DiMg{wSVolI8EbA=mD%|2aG;RTn4V{7?d@GDuW0SP|SDNqI zqgxEoRMeQi#w#6iN1tG+<_)(OaKKP4qS8mR_*%Bw-oH)wN5?P>a|v%F7MpOH<$TaWlQn`IB|o*WJ+A@&1BnU#+txAuyNk z=W#u1^_$ovexYW{+Fo}rU-w{dk=vP^^iyx-7O&4fvx4LP5){vmpsxWChB+_?t=gP{|^?_f9L;qoX|wk#=0^#a&l&7XKfP6ksgQ@Gy;`84dY>j zri7y+P{Su^7D}_JVcXEf;d*a&x~k$pxYQK%!G@{GOG` z`}_0moR?9|2+((~mG8^2qa^uy8J(@=ele$bh%3`}>)rk^angsPPWEI(?U}pvb;FMl z{;XaduJfyK0pE)|+o~jRcpis%5$6p|*b4Pd5D~DP#{Bgn1j%7*6P3E~dQ?Pci^DQ1@C3-^3OJQK zkEr-u`l+F{5bh1506;OziT=EsxZOs5v{8B~ub>N<6n+f6%+_>u%_oM_O}$6Zm}p8- zCjm?yB$n~K)$l74$>vr*ke0*p|8CaNXqE?eZ$dYymb_ai=|*E6nerREt*TSETmRs+ zLx5f%qC&b)b{h9Bzf0Ox!f$nSKx2kFPkC-{inxiM0Gw7+?Gx<9N+ND2mq9G&W4I1@ zyCLIC)8=TUW7 z0M`fOq>dOqr^Rrj!3srUOM|PZ&S!z_?imEZ4^MJ$K#9+I*VHQHt`-DS+2 zG7W}lfImnjOY9x#Uh;^Hb@~V=lW2oVgQsOt3qz4vdZ|f7dpXT1C?tk42vK-&?ngco zql6fbLSi8lE}b$Q`l<6;L{UE)a{lxqFevAqf2BHEmZ3ygH43nYSZ6(C2`L9{PUmR_ zf(dD;gBJm7@NdCrbCCdP>=nLf05oe@4q{Nq=DC^G^oD62SdISzmHV%K>|V!E%93X^!$K=Zk3Y#AcqlDB#5A6{G`RF(22Vpcoo!CJx?qIfAt z{Erz}Ygtjq*E^x%4dKbu^$TOC(h04*5BqEf^55!eo?9U{E+hiEFkNpx`78Tq;Dc zBsrX@hv3sh(G3>9173t5>;35`>FkybRP2xn13cLSF31S@x=}!h`d}h!DnV3y`o-s% zkqMuHseGWA3nrxKx#T3SYv_!QXAE!FcfL_U+pm;TRob5Ar89-B=Bt{pDAgvGiJ34v zRB>k`C#hhr+E)*Tbxr(t;iz=GJHpzmNMSulS|0i5YMH0zy8{E!ks}4M@-S^aJo_1r z%4Px^M3j2iZ^|Q$EJZlxt@*T%&HTV z7#DU;kk-^?JTB0pe?VP3$!DjI4iVZ$&?~(1Vg)8v1G+6gX7C`dabk&}mP0Kyx zYlv*>%MLF7U`G+}=ptpV)`5iOU!V?9nq#Vi_f$O1G!^*gE+Eo zCk>KR?CHV<7AyQg<*e!FdD_4>ANS8u-PwddPT|&tP2oJgio-OVe~*~caifaZz`iqG zbPG9#sri;nHaOF(X02;BJ{1D~m0x{rWz>mEiYNQ+S_nl8S19^%}- zB);MF6ekE`X)GsvkG^)s!&-scrapRbvl46Uk0ZZZzd}9;BsJkCD<0i4RuwREG>VYL zf89>x01z_TC!ZQ^JJf{fvWcHucx}&!CU(hTpT}u61cSHX;7rgGc6PB@ z5YNVUa>2)Cw)#Gl7{`b?6bks&;&J0?2B2e|w?H45nGCWHx&*wi6swP+89KVUSA+~n z`JfX>V zD_r{{i%yeuL@fy~sCc$EN}_N{WpQ4=~tD+9jSPY|^+ zE+v8n57o{%4?%vD~|`Gc_Kg=B`W!!kfV<(|kD&)U={2wkCkpF`Epm3X+1i>kjg;Y-$j z)p6qw&!|$EF6!gOuTEbhKTAk?99Hlk!Oq-<_-dIUzxSX{d?~|J(JWCZ6JXnPC?jPWjdQsM41= z^Kpqex)k!5ZP;Dk+}+JNI`&w2=zim`=T0<-wD3daZ;p6Q9{jM(+%v6_i?vJ(ZRYI$ zLwV5M;qm+NlcVm#PaOSf(HFLhm3Wv4ZDVBRIw#NGr?IoC)abqoFf6dW-tFmw`(i^P zi9&6fDv1terB$g=u7M$1AdC$rR9mQ`3sfQ_TFmUP9$YDydP>9Eh?TqYabr;Gq^Wv= z?yyirLSa-K#S zM5vIET|_+`+AMQ5A`?s$gDgglL|SYK3|-?*JkSJ-Hx@uqsjzGG8K7lQkWa_@DFFvb z*9?3n>ma$ zmof|?oy{aKWkeFXV|~7CBD~LLxUy`4J}lD^DH=PhYH@Hw-ETvkjWrm7@9R%eE}H~V zu)b(uB}js{6kVMhuO5eyE(^9}1&crr^-P>#w3y<(kNz$B$_1(iMh|1c);hKC0#;ZI zLO?9)Zy{EnoYSdUQ-$CPl&9FWFppA*e@B@tgZmA}vQoo}@GT~?wi-Z5-F|fz;Qz5A zvA+;nV`50?E(K1D{RAr>q!t|QBsQX_5V)Wibh|}%MJiFd4_XJA{dAdk$|Ws1$*V@B zC()XLz^W>^D0qbKk~DNCQz-W<&{(nP*Ou@=IFhYaNVQ(PR2U4y=!FI3-Lfvy5-2|S z&X5``hS$8VaaUBEApLab7IZqptU)$RGRqSutfF3>G3I=<)P$G{eiBHax{#gfZ+o;* z_WID<=kH>Y}h1m_@r|vM>X;Vx}|lh4g0ZJ~1A1f2!$|FoQDjx=7Ut z>mN<>3xKUA<@~B8{qDv?BLtMlK}kW(ymyxY^6$aX>xb!NglSINWD!+YL9MgVH55uu zYzLv>49+`=B4W6rJ%CjMR0cN-a_OL92#n%V}If zP`Xy(K8cP^-Im@xCuw+wx8zu^tGd`-ILWYGHC(}Kl>Iji6LY4Hq#GWLZse443-2L> z4&e213yvavJ{9S9N!Mj>1ME!F=WSfJan+pmS*+zs_IikxVX@YShErR3+f6nLkX2N3 z;}kBbd=aT7y^+*z$Z1pUNF#Uj%4eVfb_YFp_)O5jJ+X|a51t&VBTm)8h1iG<0*N#gOJ&wAGB9<_f80&&)44O=7-8}%0 z@;|aCe`yQxA{>{A-R?|6f*S8!7oOPiBx7*$SlauA*Hu%rU_9Nf45#{oTNs>zF{G+c za7AqjY~z`WbRc|4;qjvtIHlNGAXcSt6!<3AhR|@B)J!enMAQXqQH68rN&Z}Qx=eM# zZy&D-?^3BW-W;Z=wPtGNcuV)=IAZemk!!z4H2>b*lWIewT`xw9?*l^`-M3mjABBrpyB7PfQ9 zz79shVe~y#l=a*0XD?<$yzlR$Fdi5|umO)#!)X%CBqb_iz}EHDwZ8Mv2DRe76+4*f#i;9=?`adck&Cc$3Kmw^`C_O6V!@!4>4hA>?0uHX`E#C-NNwffk%Jt)hzjBDPwwqz!pge; z;atIbbLZKU^xHAb2N%YRjcr2Sw)v{^M$s30(HZScEtQneJB|XU32;ZUAc-VhaYX^y zbr};+8M_^pl8&R5JgyCH+u7$J(6o#!8RqvC8@0!JtN6U(IP6DU&njV99eN;G{KGl0 zyCrt^=mQo+B#8L|fV5^NO7-SGnI{T;{#82CsOTI}#3Ih?G2C5pRE}g;zG6(nE14iD zWtqmG2%}YXl`0Sb1019~1#6Ei84l&6hXzt7u-}mV_xt7&)g3!SR2OIK(4kfBo(IR?qBbD3~4Ced7H>L_8hoMfxb=4(b~@eSb|0(L&2Rb?|rs zV(@z1clu%1x!De$x?yX#8M$a?2g=<)VewTm@Ia|yr_ zh<*-H@q?f|Wu6wr`-O2{S|^vm+&g0F+{MXQOE<7H39>yiAhYp~#w+Pk6icuhhA9^y z-sp@NBh@{XIWW!X^F$QleY0~Ju(NgXYQ&*P82K04Jy6b5PDMFgA?0X^#Jv+35m-*8 zFIKU^f=;HP={AD=tcLagZQE8Cp}^G-sT}nQ zg)@2|dysp8;AT7e;BPvBiyUq+eBh8b9GMrVt45hl&_mHbMAQ-6@)LMP^AIne(=!W%Dfqdy{$PRp<#sCXBkP$}aj?l#KU1$WRm?0fsd!05jxKqd|R zmNWDX#_X>@4jf!x+*?Pgksl!pMT<6|b0m5SWN&?XEP0x{1MZ+{kmn~=2OPW41(r4+ zxxnMjJ332j_EwJexG6A4izbu=@gT(oR0m>~xC~7-k#myl${nEhL-q1Y;$733V1V%s zfnlTL1$i0y&KX3A81Q^G&ex#>l!i&wLGHnffXOO7aZtpMbXo0g@fmn#CqFmq8a>xy z%-2Pm;0V4dXIX}-GAL|;=!dQ^NS=f0=T#5876vwq?IAi;4xdf^|HnU_0k{f#o zkR$`&k-f*)9?c}V?D}z!rpg88NMB~zhw5<9L7F4j6^XPE0PhWdMX@Uz2i@K1opm_d z#vcEk{N4kPzb*FH1RTRx&nZ)e4`XoFTpK@1&iCAt00<#o8WHs4BYketj^n()!aNaF zDBZ~j_4$4M#i_6c2GM59hnexkuEDnm!wSF71m8Eaz@lYQUV)6QGuA0F6V`ty2c7V= z*`l{0%CLr+H#pe>R5nfUAsYgM!bdPWe1oBy#qVTkr*^CKG4#jhEE6Jk7h`gsbDmpl zuUI3X{F*zPBBQQo5$&esscTsg^@a2~?GZmk@q&Qu?_7R1(BA5Z);Rn+T4lpxC<6z8 zUWS7LE>_%_uZAGqIr{lN9GFx_1i?j82AVobLD3i32r734$wgB9BMKs)U4-EnYkc0% zFWzHPW@_|pt8c1(9*$yGthXlAE5;dX?5j7NB}F4e(pKyA_C|f*_07Xi+Wyz2fx;mYe z?SXokSW-Tno12}L3&@!&D>F0K&&OC2kv=+k50x1FOm zK1@H}wnX^9muA1;`>)^y1bl~2b?qn!^ZxLEe<|A9x80`rHTD$oci6uecswV`6Q=J3 zzb*6o=sY~t7yK9%#>f+-K+1&D`L_ivEH2=6SstgML#|l>eU%z+2IX`qb9cF%ZS(Y->CaWS!x(Y|MsaS=-Uz#)z(gy=x`r@?6Al z@OK};FcoFh8Wf^m%J@=mx6~TDumA4%)DH+!-J9t2f|!8grd(ZJOMZ6g(`u0mDvBZJ z2x)oVL+HRTRA(A)tV8sUU8}(@;b+_nNIi6Z^X9_5_J@j|XhF06fzx?XSh+_DI+7`tHN(lc)F zk91LYZmYWSi=S3xa|wI@q*3fTnGc4ikisO<>XyEk93pV*zx;4R#O~h?AnQ;+Yg9v& zo!093JU?9iRzHSp_7s8$X<2u6ET0aO%5{vmM z1`yAxjM-swPf_yIf*gPsUJs*!$RO?)L}UBF=G4%-=DHg<&Qb=d$;(eiIJIUIMZ2)} zQ44pkT>8aOt{WTKnvu`k7g~Uu*qQqmLzQ4&Hrx^oh&19Acq&k3iwaeqbW^2p@eUFr z*>2KA$l+X_nZ_r)7mB0h&bZL2e_+uHrh!&gHbar#7z~+<#D#T=T^#IBzs)j7gWZw| z017ahZ-Qea&N$xPrQpFzMQKJTN0~bAC9-VKG|6~IzGQ#aK2m_ zVwyu9n6k_hVV=E=Y**Xm1qtl=KAB=htnmSNRRa0|_lzjCa_8pR^CY;8zUV@&t7a3$ zFr6&aHC@y470nsVsg;j)2*uG1iS-ZOK`1hQ98%i{kzn^_P`U>UMJ6mI6LX1&;uUQ{ zEQ?&hE{+i&+yI;s~Ud2DT3kCE($$N>GJ&TxfFb9Io0t$lwMYb(4YlwmXpJEgN&6xs@ktT_s--HR{A?-R-d=hUdSM!~s; zA*##}kWy4}Pj_bBTH~?(S}s?bv{$TH++>)Vb* z9xQk-$~bc9{u@|(>C6!SPs6a_67a!61|Wcw+!RoI2IgaoS5II~(fyJ(nKs(c0MdDX z1+w|VX& z=$5Xqjq#Jbxrc({=x9v6MF^|$P_btISYB0r4(~Xq_7!p${dH>i99rn_gc{RM4f=bO1L#8vZOF(!cBGQ z#z5_mhvgO}N*mzhMaInKNQ?ORCPQD82%?@3JC}!pf~b8Vrc*|AcuKa>qPP%6tk8d& z7hQi- zv}%`#Y(4FICpwCfL(WJ~>+52rLtH7eSU4o`h=TP&j)VG+7ki66Sdql7F#n<)Qmesn z2pFa4@ilHS9UFx7rMw^9pqHku*$Mz6iyrJ#N+~tG*VlujK!v(Pi7pjno+wTfhjyZ* zVM)i0qDk2pxL-{H%s z#T%udp+Cp=Tr@-wf9U-15MBX7z-tKc$941RKSgQl=(Rl9YeUFY9fs9 z*lEBk9&4#4H*7>uxqcS;l~s5V*i5*v%uk((*gC}9(?|>((gosC(U?mZS55w&SKJuN z21I-5Dl3Gd6Oxx^-nNh-&N5TgVN#TBfHx{mh3Bx#%Z@=LKTla_|8W~(4Ea5HB`);A<1~*GaW~=&K#& zOAG>9r9Mkgk7k?PYQdiI5fPJux#h3=HbDiat`R&UCNc&y3oNT>L#rwtr3_Dx9lM{E z>Pm|pS6Vf_7UXNMG;2_nQSnm6YMf>OqAkEClghSGQfa5D#mz|?zO}1YEPb*3$+p3 z+EU;l_wHElt81BO1|Dj8o742@54_vCki%Q8MHxg-Vr&OV2dC!tOpu$RulJYGd{eL7 zfvQF|Qq`7+MmdSyL>M`Dt%U@eyP?$E$p^>b?MCqgJ=rMRH$v{&^!nUa#Rr4}U2=o<4UqAjM!b73})SINM+nDVLbG=Z}b=P6(X@jloxe;IFFQ=Wy^N7QW zNtk+t)yAgZD!|42ab(To6dm)7(}NLf#Jq*4Gn?hf!x|v6+@DB1-zF75!Wu!$PcpDM zs?!Yc=S8MEm`eC+^eOD!ZH|_m{|TrS=?5yl&bH$g?oP%BX9AsTdYLkXlG9t7CBvLi&(&IZ>F{uS`~<1;((M=9&YH zMyl~y6!cJ+jH-E%vHmjos##wW)Sr&$>`pN`z_~XE4raXV>ew|Xl$soABZ`tPa?8!a zclpDaIB7wE;9hGuT{mi2A+}$jJAN_&R80)j!Zk(tW=&-36i^rISm1UVHi zlbcIzc1Bla>K{KT8rqdTx4+r_eCt&iNy-DGeC5@ks702_Lt<{sfjsEGIr15ev;H4p zSRq@88JAFS4rRlQBEVPZvoXY;{cV76r&LV%0%Mvc&{6So%q;AJ;=r;=t^TO6{XNq1g2VRJ@@EI@o5dz)X7ck=QrSj;hiUymbtqbFthKL9>nikkIJ z{$%|IG~N`HljQv@FLz?;8!rB1>2GqC?4|p1 z;(1%IKpKERBW(qBuPW%^A3PhK7|M;xd%Fy) z#hW2y#3!>C(-7RzgS}2{-1uo5uLYQ1L^^Tl5-g4z-QYd(s*DtID>xJQ z=|h$Pc&Y~QO51BVK>Soi+Nbebq6#>nv6*Wp^v)#ki+BDH>>%x>*OJ!tfECqVC)2(U zSH$MdIwN{-oS$}ny=8Z|3$)rF`(LOZd?M4WfGyW4?`}I8U3V{2X|%s*2V2YUt9tG1 zuO}%-0y-?Z9rg~q+AA(9W0h*O-7jd#e=hWz$CCX2+a3M?PwLSBbN-J#hMIRw+d?7| zc{KSDW-Qfsv{rFg*oZNR;c9~H}Uyu~*lRz#Jl z4g8t!qz~AEjpTUNu>9on_i8#ZF$pXbyE$|?#{-|q&bN=v&Xh7OnX2Ne=6IK87h2`% z)9tqIVvEmErMsc~VW4i+x8aGuf}f`OG)o4z#l^Q4_OEK!wuO-y-bRgU+2X*=v#M3^ zvhEqRyjkzEgU)wZaQ61u(h6V;3hCkf?@&h7N& z!`3X9OnqO#PtHlqNLJL6w)sx`e>ybl09r9yJ!aJ)-R;jl+Gy<(v5&URrIDsw`ClF1 zn==P*?%jYXjr2JXJ6(``122z>C1 z?`9@<pFe(0<4P7KVB51cKN<$WbwqV2884dI&uYYbOlP`F7Yc#(10V ziKF`Q>&%_sC)=M6(%%}nd0ukrGqSEPJEPF+-QQwcm+v0CrwS}d7GHNNPqFVkSib|) zeD29Rv_Q6BYrit)?VCKoT{(&u_QjHIsj92K&wJk`Ehaqq zyb;U&Up=3<+d3gxxsgV=U@4LaAO_`+0W)Ep{xT>R2Ij{X5`}a@I?+(f5rY6YE|Ap2 zAk?+~A}Zv7=gG8z8Y1u@%T%ywmt-GQF$@Rghy2ZuVg97-MTcTnUmeZ#Ng>(n4h%Co>izJ)@;iRlx zC$4dzDh1*XGQ#tS`2ZvUC&nbDiiCy%r7PvTyCSUkCAiYz>X3kI#8Rao5?l~?wMm;C zisK^11H{oI(0SknRw&I*7>z~R<$|k&u54QS{TTpii=E;Zx7)@K$r~e%7!M(5591>~ z9OD_CVxGW(&^{e^1S0@<63^~YFQdL8xnNT9mPP!*(4sfhr9%U-2K#Yir>W^^dvr|B zo^7U8kzWXj0|N6NR+4Q5@ahHa$^Zq@>rX!u#UKcr#Ihh#EwomCtmhJ}>L;=FXLE!>6m?9Y477`TG{Q(;_g zQ0j+8(t8r;HwA>Yq=3E7BVv=QiHD^YADl%kGY6E)i5RkZ>Bl`r5$@`+64QwlfzMCJ zud7MLPGhjI=_la@nW>?OAq8#_NDIgW1+7_J=J^5VQ~Y1yM~HmszfnomlSC$gOD|KB z!!7fll83zbJgLGLvvSL&Pqios&a~AbpVOO1c+}6!Qj7n9MAg4i2}f-UvJ#>@giwO& ze8(fo82w>&k zN2mOqZBOxP&o@$^;n%*+SEt9U%)(%-RN0{)3@wOfkrw9>!6)QACcab<)L1r=j8s3p zFI|XY7uE^6(k`AneY98rL_-2~r0B7570JCsPB`GV!zlQcR;4|O-*_G#!d4fsj8=is zI>z~f6vY{7>0JwvC=W||y`N2n8e<=!%q+J)&oDKdP{d6rregRK0h$5TDuQQn?8pH8 zAc4Lc9pC225Jg#{mK0jU8E@p0Z<8bDz{5gp8Y<6|1NE$>4J#3^T2QUrn0bU+N$yXf z+~^G5p6N`$>wvliZi$JsC+&<1w?olS6bKH`Qq-xiU%_NPpi1Q;__unDe>%l7b>0*v zjAA_LGs^o3vm`)Y7|JhEAVs-^x-xpT5?jFU+g`;s#$wDAVh^jf^NaFqxuRCO1qh1x6X9nSUE%{)XH-R-J}{~5fgmI zoBjbQK1;(rCzI$6t6iHHV?UjR@yfzO1UbX%W~k~VXqAVCGUJc->k<1)G=f|=!%+5j zidjtkX4XcdbLVpQRS0T4+?1(>J3=A}b>>0VQ~6-Wz}e#qJ>L!2UPH`q{Jz<@MxuabAjr~wq1AAAgCyN#Ljo$54NChXZp zGTh#-g=}Xo&RdNt|@@CdU)vkP3lq zaU%E4OVm3@c;Xo1br?J2uRTWyi7%bKlnTW5!{S8^RLnj?NAQ9+ag^6c0!V)2ZNMa@ z2VV5hHl?dG_N)U^lf}}=Pn}`Yo~Pvjfyd6&Nn+3MK#foZv9_2DAU_qlTRIJ(NQt*x{C`yOD*4+7n6Cii9%vy! z@CaG$i1yJ}p^9Zf5R(xVgQ$A8fny=J`2zWAHwy-U>Gq?JWWfWSVjz{q-!4(h<==c{ zRsY^z5%UluPc?@}Qrq>@!W!SyhC1kUG|#&y!?&93GT|nr(jfD2I^8IdNp>96t~ zAj8G5Ys6DqhEX~@uk!aaeWsK^1>(BG4eSF#OY~Hj z!FXz9Pj5s?Pixlwu9v3M!}Po;7bIf5 zCyCkBmu+}a5$U56PQ^WnMJ{S4_Y(?~ zr{gR6es@{=ey4d)VU!|JOh%i;^E7%?DcWDFZ29<|z5D|7RF3%RH~!U{v5GtQ`xHY} zDR|u9nB16rpi&0eBiB^d)Dko$TaNxIg7R+;?JdPpy5rp(AIP$m37OLlexN_|I2Pb|z36LTL@CK0PK@6%Knp#uA)qziDC- z^mCpvZ5Wu+8%GEONZiV*0ohm660(r zV?C4nac#MVTPv#&e6C(Uh|-+V6?p|syBEGfCaO3Z=TUsomX+N6Z)Bbk)Gu?d<1gD( z)mtCI^B8eMZS)yJY#}1rc?`j+UmD@9#%X z3B2mzb|KZSMn~I~?NA|A;n~cjms>%e+AkO|>1oSzLhPwO<< z?Uz%Rva$tN>+j)`Z~4sb;^JfYZzlJ=jqWm@_v#cebp`z2V+}|ykDWNal=usgjQ9s& zWxDR!3ap>Md3hqK1%k78Zwu6^n^+ZQHxqfQZ10JG^Geg|%J-35*hn`mtR@!EoFB^g zY`pSt9;f}OEZ5MJ40aaBE9*(=!q{GbiHq?@PLw&BqW^k&VW&faKq8nk z1HG6aOe?*LDWx>n7@r7ATMc)JGh&yBpTD1ElaY>uyLscdV(2%DqaX)28Op*JF_md3 zstS9HJG)w(>&A^DohH)iK*GqPEUm3wn&jGf0wcVbns2m~(xv*28dcau|JC zH=`0xCXMv z0jlwt@?=DbTmmI`bO#i3KVjquxptZ8%=(LsCKX=hrK(ID%8#u9A%oVFW{tH6w$7j9@yNO|LYh59B{XQ;;}XbU%Q5Aw=gQ zWk89ZVg0l+p|6f8@W);I#RZKvat@wqsqdY}SGSxgSdQcBJt|otYe5ieZB5 z!0@1rPEyQpLm?7mntFho|2mRWBbjP-dF zS_cMEEQ`ePz$C$)1uncfAdH^}^YR=ejtG+1=;TC7f>(o@p)^F>Qy8_=g!)R2XuCP- z5$a+E4eV4{c|MGl9lfW%zkVpK!}5i@p?Ddzrg@j1!wSl?5{v7vJ&3TARVQA)MAm-l z@*DzSwC4reqRz$Z?a(Bdt>ii5fZIkV2t^iu-z4jAm8pt3UusReJ=Jrx>O@t7q!horSvIvrX z=Zv)EfL1X;0R}J>1pxYhe3IByX1OW;=&(p`y^%pO&sxqzmsI^ zPUBsTtba;0D9t&e#5~405_I8Qw*qE7D&DqX4q(L{iB-!-o&>Ci*{MZbUXu0NgqXVZq(=v}P*mJvq7VCgT@!>lq6-J5`hXNcl&u zxo-fZOhT)>c}EtMUD_vuawJ%}OB42`2ISLX?wMa8ML+Jt02XNXCWxN|k(Z2T#`!K5 z%xfBR7mp$e!w*zzh@4OuDiNZ$#`-i1h~&e@)QBy!PfEvu!5tpoxZsyG?-^@cX3FjB%;kH~tV(=|)_`XHWEJmbpMks|6Z ze)Cq}0Y#Lw&0o#_1nH=6%&$-q?rf5LD z!1V$G4q+Ub+%Qo4;GUJgz*+yyF(yvE%t z(E}d+Cb)A$a<3kHQFE-GTVU;g_qnxu-FXPo_zq--U#l~sq{b-+LZKG{Blq6izfbb{ zDZQP3_k{7S@f822n}fr$wD)}ufOC1>_I=;Y!^6AAy6%3T49s|iojYi`+}`3|g+7+l zY?ycUz0Lr)+g17jdHcv@{i8f1Un&}9470Y-tF-L2rztuBfT^k8 z>I!2MdnH)K_%>*7oEQ<3GG3b~B!!2_iq-TuN0>yCs8~B2o1A>oqRs=yJDP|~aFVi- z+96hY7?;p{oT2c6ud?%Uz6rV-cM8e84S)Al?OSE{cXfBUM>(WCa^Zb`RunrSyiTvZ zwdCcS9Pu2x==l#Ho}ZhI5(K5HnwrX2sATGFt`1LEXQ5)Zy3Rn9-4KrsK>o#)`Fq;2 zuyU{4^XX{=IH7HMfP1;8Mrr0se%iqOQUE1D@-w!BO`96QxWP}5G>dMpA*3mT9 zT}|vbWsNUJ#N#IH)t&B6&`rt&l1dWnm`a2T6HJj$PD{voVG#f#swD$|m8|wyPgv|> z(5>VXXEWMmg*wAB8p@_r$T!hnK^FjEHw6?x*b|>?GK+Zvdt=m!Nm7=O7#%5|wY5g% zR-K^h9Wt)F47Zh3D$6SVB~PdqG86t*iH&{jSVtx(`^YkBqL3$BVG-ioEd96?ssR9}mHUIw+}5TojF2CFM93c`uy zUqw@nAVV0TX0{pxXv8uxwKpAv)#j?|kWb!6xJ(4e_yb6;F(FPX=uY3D5J%x+Y^pew znJ}v5?*sLVj?FAMf1kb`<)!K?b4Jwy@8(fw`VO)eE&hK>@KIPzW1Q`qzFgNn(!wMHIy%1JwJl=eN`NCGD=hT$kYxEZ_>p#;2l2~ zk(UUmJaNB69FV`kcuDcqYQa55&vSnp2~~lvwX??Yh{D3O!@^E%W`Q}p3PNMCND+CA zLQW($TSk-a7B|%4N%|7t$ms|&F&9&Vt+PQ;5xWQ>#z71lk8RH85hgJW0b zKb8`5%hWJo9>;7HnEDYLhC@R2BlsBchn;5Sn9}$ZbSDX;XBMxlBW)R{I@Kd~@T_EA z?bp!rwA}HEzQ4_0{ik=7=u0DIkwKZRHRmP(Wp2|71-kw$#sE2v%fn+yZrCQROiQHG z!A?6Eu+jcBpYuThc!QHeWJ)*T3G5ICm)y0j`GIx^d!)bE8)6G&y9j85HZnVWTG$(1`ex*;boL`w#t3 z&gDD{&|HsBIl3Hd{7O(N4E0CjfQxIgq*&o zQJXQ&Zr$cc981gsrix{(t>Q{ZjkaQFR*Ae*@47@pvt4gKaO|)LXHU~*w=SEjbTs_R zZSy-TV2FSQFYU5oHDfF`;7|>3ag+j&P-`c9rFwt=i?Snp)!Wi298Q{gw6p(UKS4dIuj~xezjD z)E4EnT1(Y6=BTC;8Q1=|KeSSI4BzE7;$~#N>$bM0&uM?-M2>A`w5YAOslnCck4Jjs z$H;R`LQY|YIAUk}&xuMqUBoY7#$$1)in-lI1FHEB_|xm$;0!_M-6tO{RFVCEJ6Hbm z&p-eC^MAG&u>bM@za6p|Lcd!_(=6|1gTz4`0#ahKYKo?=R${-Dd6j4(lFB}OeSaYu zrNCOvMy2Ar)Mgv+9-xcDOD*O9G=HG$cXraVlx;bB|KZ&-uQZ9>9u zx2eo5TLN*@uGFj2RLZy{Aga;iYez$i{G;(aBV>(7IFHYsNv%LxKuf$tSm*7i8dlfm zy0b9Na_Fm8148g1!?kcO+iY?UVk}f4`uWAbNe)Od7EL$qsOPZslcBmHSO5j%R13Ks zDNXe7;^CTvfJ~ZI1eEzLWZ_Sg!y0W3-#)&rat$Mi(r=aY;n`*222i#13sJNEvViaLi#Bnx3IhF^$$Pm)=rOaNW2 zu^}Fo5Uk3J{G88w z+L931NybQ%I8-2T)Jz9-qj8)V)?pTkL$Y}{k(|`u2DnIEn+VfO74ro4O7J^3K|m*0 z9JFqX6{+ng7hH)^cORv%Es!(sLmI1#X6`$duO0?P;xQc5^X^qsX@T4xa-uuP@?gMN z_eQJ{KdqPBcR=8KU&$M_71$PF28Zv-9GD3`_*vpJoHvN>i$stON7z#7znM0DJ823 ziUh4Ft)w8VQFCi&0GLV@S~<=df{}W*sM23aB}*yjacd~7Lv+vC(~4RS`UTBM(i8Sz zP0#323pg4uEY_iYz34|gP9}3NpUTy$_A1ou}XkOw#^r$P(i^$G-4}v4t?iwIYOw`r_3@H zdVGdJiVYIq9OG?@d-`L7l73`-fc#f#O+bxnv?={hB_#C>k_cbH#6yS>%%7F+ixqWC zgb}MBfeIHr41qvCad+$$ao|&SFK?g^mJ9`5i-SyXKtdJRcAcCLPyg%Am;S3TEJE1f ztX{S;z?haw%&kG;S1KI%WgT%4i`-QAn@{@+C@ZGQR}|iCNgRzu`jWaer=Op$|1e&elGa^oRf!w&)k*OK zkWv`1T#ZP;x+sSu0jZ%qQ;ruGM`VBVqe=jj%;jEjiBknmx&g{MiRyUo9D}2jIDTOB zzo-4U^_H=HXP2j0?Ujy|V{KVM!{w!Jx{EnQ+8R=>(4t+MA&Xzrvz0Tx)d$a1y;Q2VQ`gG6zHmkh; zd|8jOtgG5sck=nY83)`l`~dTPLw^3ZAH{$E`RAX1{`u#h|BEgEulawbj2(^y=2(^D z_TnPX;?2ui68h<1U0{vj0CDUH2t#DT=x~%`h(sQvYt7Nfbz!TZL8t;A!sAqAB(H;9 zXe6XEo-1E~VsD_{!J7bRq^^-i#bq74>*}Pxq6tVco~9SSOPh~gxfhjqYJ$o{eI1XV zIX>?>hv-@78PUiI+$@MOX26T&V|pL=&R-)?R2ZcpN04G2YfSG!)P zH-J~;!U`y!V7G#UBIt_Zfy z>*5}Vp)+&k;V}8SL7;2=#Vzu(gG7)}AYv9+JtwHF=5QrU8mla^P8${>y78P!l#rDL zjS$Fk6m!2wlHe`(s3)B2qjL2S#xVT=xH?gLbKsOA(mp|TGhqtQfg$V0qS z1nuGzix4Q=YQbQPD)`5BRE#hk?U)y|#gw%}m&K05dMDt#~hb}=R=T!a>TcY?7r*lN#&E#wu zdtP~2145EH1G9;7h=I!xdG|m*nb3@*a$c%+R}Q8uIXkaN&1d%JB*ef@fHVM@83^*l z*<+@rS0mDx1Foi&i!>Cl)MB^RC<_Ji z2Vw4X793=rx`l2Jj?Z78Ce&R%4Th%&C8T?ddvC!6Ws$xc2BwgxOJstzIolT*8PG!u zfDtt_3~Cq0X+%G1OWGSqex!B@V_!rk+QxFyAOv`VtRzrBPaxo{7+yEm!@A<6BB@ZX z9++S4z9cRY^(2R4qG_RJw`1^KI_wlw@p}*h&Wl@J9SN6YYS9wjHVerbM53F@iB|cD zLo)4CHWuPyUc0!&UV0lZJ#io_fUVLXM%S*9g4&Sr!%Df>Xi634K)TwN=M=JFrC7wL z+lgS;Ti1H3;iFb?$nQr4J!Yx}IoQJ5&at z8R?mt>NF&IfK4;F!wFOw$O#;G#DPvdC+@-CP>6T80iCM3-sbnAQfR6irL&iLf~s0O z0ZWyj+9b?$iet{Ce{}7gXqL?xt_kD096bVa??z8)^;W@_r*p4?g%d(t+& z%5-vU^cu7f1sXOMwM{56bk8NK@5H)UnkaD zB!(@7Ub`#?eI7Fs`mh3g&qUF6*9zB#f5FIsS@pe4@UqWPN!Zh!+gF(rWijQhR>;D< z9u)kEA*Xa~%*rGKv=FLI=4pfn8o3@EXOa&9yuA?u<~`14EaR^O*2bga$P=0yi_lhw zn&c(Qey4yS!v!?6;83eUid@}0*N0|z8UeRvrLq?dfd&VbRZu7F#T=pbPGoExhS)Px zLIET@)Sd>V#igApG9;LDq^3S3;Ggqg1ha<}4+F>*lLkQ%Ld^g0dbIci80km@(xD~d zD3o)IaCdrI%#a5WV}<2&v3JsnQ|9z>Fkl2gSS&on8;nWPh!)YNMLDXudS*Vq3fa2Vmvfy^HgrJ=eF7|mw#Z0GLJoF!t>oI_g>3iKp%XT!NPr-#VdBIG%X zlGxds0Uh#U2sOEl)t86#J;1=O#!z0oncE8_Q_PhcEx2$@PGt%()bYqBOrP+#rTfrU z*E{@XVrzRKoM;_ssG*O>o)O?-VKY#O=zX~lw2Nj12(L-0Yw zPwemzp1-V^X-xez# z@|D3VCwJHkY^qN<5)Ml7Oe~N^rtb?JfXj(}-cbsZR489<@o3ybEV0R;_o|d4w36^L zi~POmE*`mDo$?06R+xvM+tvf@d;po*oACTaxoP8zn0+QoX7&uK&8bI(NWhV-9Y9|b z)AlO5{eU*ll>a!{ZCS z+~xBGSncE4Dluhx>+UMq!(!>4g#AUpS{G;W(&2t@52Tah{VDHq)rsD_-nWHYE#Re{ z)pu0nyX&bTW&K+3!y7Vt#bSm>od&7av(=gZ4M9Wr>AQx|^Q`4Qy%Z}%Ijnhw`_FQP zvyY(>ep$R8x~4zP-FHzs+N(nRqWc(>VXw1}g!u_ONIMWN)&w2eRjVm{?8}{30}krd zB*T;V4qBVUl&h>9T@Hd~9ZuS!VIjq6%`#k8Y1dcMc7^Wv&+hkLp7;9~`D6 z1^(5x@rZ2b>vj75+V;BB<#PLT`|_W#vh%(E^Kv6_Z$eqx_WI(sHAf{9A@ZLC9bW#M z3%|hog(PNSpLkng_IwLWeZiYP=D&6Je8sy9m|ar6+ocVkTIOv>n>LtTaa>%4Kkzl1 z^hW>fEc(ws|NQgM|2`T2qyKCDzyJUFn{iL++$2uv=uph38n4fQiblSa(6ug>MWRsk zg90sm0}2X~1TL?IFBQ^!%;|0H#;5V3o;_)wIGVaqmW0Bv*?tUsQ-$${jz3l8ltNd8{+&{Ce_VM~vC9A$HB4^Rr_!?FnPfSGQ40ic+YS&nI zG#{q?O>NcGXlhPccI;?Ya&IFx=hdlEebVxc>@)tu#XG`RwI~?l_xK@4=KxdkV~JmN zd!5h{XZ!13y>tET<@FZy;TL95e))9x9d`!|)|rKPW1X)R)^1VUg?kX;xeI&`A#~Us z2Dmdu|NZm3D&_%B@;flJm5{N$Txjc(#f3)^`)c&d(H!6Q3*(_hnPO7u>EY}0z1gOh zqgQ8B`=eO?m6m4L>+J)op^Yk1(31Q2s+DzgjmBobXD(`FFtg%YglaYZMeD5@nWn_d z%oR?DGRx{hkULtj3qKgFGXhsgF9sKSU-oK+7vY+vdDT$##mF+(68M@P1d10t;G4uk z@6GkMUwCzN=}j160LHg+6D`wHy93e(71mm4bAwnXC|JchmD`GGn|TgE6V;N1T}E9V zw$Dt{l4Cx4$Er_&n?;*h8hXk6D-#VGe%Qd(8Jbur4a_Xz^}}5MKX;D}Mv{d$4Yi~L z5_b<;p{(G@JOtblK>*V=bRMl)Fms2l=un7VS-4KZ=WB?uJ}2*=Dbo6cQI=K$$7nfKrCH1?mcQI*?dU z4ypiXy^ZGGo2Z#@(S{yso%hs#t_dvc%Sgg9jDlxAN*DVoB{Pz{i)(69CBVSlRi)%nNtH8huUf3W5y|*v=G11m;jh%K(8mb7ne*aw+@Mm$n(p zCQ%;04K)<#TOgwiHuJCRF7u10e!v{iz~K)|Y>l&ZJf8@8;B2)R5>}f+qfo>I*sLf} zX2?rAk2B#}0?6wL@c>FSXjZPcOji^$%7sWhXy6FQe$EnM60@ZJ!bTCQrmb&rQ(Qfk z{Bta=_v-c4v<AM7kn6{bVtxBC+S>iktx+(}Z- zu%0pg9rLs-K?$XPiRQx9pKPO~b_j|fV3!v30ws?Ww!7PfVTJJsC>v0?Xnmr>2-mK zN7;SZTCVzCo$M5GTLUf({XF4qAK&6d6A_!jc4q~p7^75-izP)%vP}y;@&V{9wPDPO zbBKwHv>VI0(f~}`o!xihVvgR;NaJxOhmRiK-2((*N4#a+uj}TlL0hX6P~PbPLS_P~q`iI^E^NIZ((Kb&zhrG+ssj&8N6MZC20X}W?%g)G} zNN}Rr&gSNWT-=%Ng5mJ_BGC3~n_-gQ&TCTk$sv}^kl;3_o6P2=ICaNYfdz)uMg85!%bHIyQ!9!Xce;_kNT*`Wm>Q^*?Z!9-<_A2A zq7ECX?%BB7@}pVzvx(P!hvapv%&r8OPn#_4PYchvxlV=jkc46X`a>7sZE->{Cnb8j zu?<>%50qOWZN2bEeLWBj$V7A?`*01v2h+~7#CBjho2z3hKe#Ava@nJ%nKD>H%S~5& zpqj(Y(-3j)yf_whn_)$iSqZchyLoUH7L?eh*`Wx3=T7Qe8GpDKTjlg%uvTe`DrfK9 z%d4gYa-!ZXj|$K&7&+{=Gi?ZPdvh5GU3Tn(hfO5RVkB5sC^hYE(wTD20oEDmJ&p*_ zwJ3oaBQGgq-F#r6!*z|?nT76Nm4~h{{6Fm6LyRau*C+h8ZQHhO+qQ1owr$(CZQizR z+wT6J-MstBmnSoGf164zYFA19PtHkUbmj;RQA5GSnPQ2m8^X5$;Q6$e_$@eZqUB`t z@i2{soC#;NGvDTRxJkUD5ZW5|NVZpxagewN2DMp6n15Zb2&1rBMuysIZ3pnk35D!m zpqEZgJ$Sr|G6bYjM;H;CpYNyKD7c<_>vy@ydEy!DZE?mJ`rNQ0BnZoSv(Dgbvn07uT$mzMA4&U2&2xW})CAMgSJd)zjW8@mRdK z065qd0Tzclpn5Ck>F9pkp2M7Pt>yse-fdH?JJFvyTHyOex5ol`JsgU#EeEksmV>L@ zNX3%YkAdp<(tgD35Z8SCUJCd2+o*`{7KQz4eC|1Yyy{zcUfAJ#W4XP2gi$TKKVLtO zJdb=p$((D?h4V-u80$y}d-S+xhu<`1br< zJUx6}RvqM(WcGHp>qy6zP&J${kEGS@-zI#ZTlFBv{kH?+KmYvm&p-cH>iQq`|G6#B z7~)vhauau#^vq0nSThQ|w2V=D;vsc|;Y1-2$O#$rxIZ8@yuccC7J>~V88V3=(h=ta z)JGyXLvXi0U|+-=DgL1x?)IW8uQZ0e48A>#Cy9$H{^PHzs#_cjlbMO<>#1KlKDYAM z{kAyy&qALx^Vjv)*-)I^E~mG3H0#g9fHT)~5%6x_$3OsmS#R|0{?aSl*TPcQn@%ns zPWEs0-uc*K(5`~CCD<+R*P>7MRC?d1uG2|dci%wYRi@pG#|isp1HDOP6wc>nrr@;G zKJr(7$pW)CG@^?jvadebJJ`ub@AO08^t;RHyOwlE{{-4!kNc()Nx!pS8;`ZjUl{Es z#!~(C`R}2m#a-T?y*uZd&lCER^WTrR`A>LxgCaK5b7^iMe!n5E)whHk8SjRxTmO>g z7W%m}+_mhw{$2X@Qp>N#9QQH3Rye&;EqxA#eGAa`dtmWmLc7CwU;mRM3mesf)yQkE z`Qo&Jg1|DTm5r?teao8qQIjj}x2AjbfeY-*9A#;Wic47?kzSU*(7L8r-D(@~r&+^G zELVi7Cp(28)JHk{!Q2v3R+dnV-H>H81}?fP%f0VpjM;7IY98v zOqWvAp*!oxt@~+$@$iB-StbZykU7Y|KHfy=cS5_Qn_?ir0Ew5Nas6>-QH3;j{b`!q zadwvH1Bn#Tdm#vQ&1@BB3_ynQTty?Lyrslm{l&)dtcWXufHkyck}c-u%)iWYwen=3 zAlCJ*5E%Tn5a+L}`i+67vjn1*(?K8pn7A?VPcIxE*6@tsBw1eEj4*y ziBG}7(X2RQACfj4KGA_PXtty0%Z`t-N%lkT5I4p%-%-=+1jgvuXet2K7e90g;eu;; zH&i?E81h%MM@(pYin~k04yaH_vbW%Cs~IY9EbK2d5jS@iIv=S~z!|KoZ6FV-TH9?n zr7YD_65B39yrp7rp9*vrbzXr;G=|0k^^CKsrSWO&wa~f6 z-I2WuP|#~!=y+prHa8Kr230pA zBiy7B7xg#xyJ3{ksuWoR>LP+ywtpnT^Byhs&zY7bw+=ws0VQF79SQ^yrNMgESyU@w z{57-i6_%9YwXIrIfnCy@ptil%Z_6zF4S`?)VI2fk4T4y-0BuDU)R{{?12i7K24dMf zuZR2~=ipW|MPeZHZilA@5XsE5qszdz?n+gPe(W*Fj0Y$I$ns4Aj{VDqvdN(GZ<{2nC87 zu-BTECn3!y;f_aZJ_dD7LLs+8;VGH6R(WPr4C7?_D@z1Mr>!Q2%uLB}YPHkp;7vA7TM3Np72hO%Db8g&CoplTK%YWT^@Juz?3 ziWAm^S70qA zg{DSrd?{vLGlf_-xFGVa3S?X6`mPH!>ObJxG&tFEL7rMi1r+Ja3KEt^zJ@}M3z1cL z`a(q0@5TdHF-Hm}jlm4h%K`btlq12kOn4X{Z(B^`r$|#G7K8m!7$~wb2ucOnXcaW* z&8To-Ywy+mYq4BmzYd^wzGHxXE{9E1O!9~3QA8tGy^i+rm{nt6As1Lh7f55CaEl3~wno{gygRZxI=Z);&M|7Ffa8^K?xf6Ug!By4RP zwp?jJrI|iBPLIx+N`;)sR^nbd(LH>$hc1~A)pchT{D)~iWoLqB_swP2Zzw3p*3hTWS>()lFIneUuQCb&(@ zjRhex{P3@bZ{3(DUA>O)bi2@*KZtMpXn9Ypyg@n1xfK68GYCxv2<3$x;9b?XslzI~@^-?c# zEN3p9A0y|Sx{M?pO_q3!LR|SAijF{{ zj0Rx2CS*Ap8vvS+*_C;cOTz$zHxYp%{aH44k}%bok-B~N#1Lfv1?XDe$?nX~+bEld z*1~a62v9lkTZl6IkrRKg=gAK zKKncJP=DIWH^=^Y!O=qN#{y_v5R`f-3Z{XxqQFBtTwN35OYqoU)>CmPl7Lp#(D+Um zAi+Ke0@cR+WzSIhoBr!vg7M*v@d1$YF+|;V!)gm%Cifa;X3j7rODAqSO=lJbVY@rW zMcKuy-(T-E{&+Ss5x?E_pQ3_XkC%>J_E{=#@0;6n0y z$NBkryL0^-czVC>OTHh^(eQI{FGBT*8tWd5XiJ<+?8_!Ox+QmpkKjJ8(-a z(fm9*Z;Nw~H1@q~n}+VY`&r4Nr@x=FdGy*$V?6!sJ-}}nwX1#_qhqY!$^zA!0HV)3 zUL91`Z$kaq{iWr}{<}LcVI7T$TI%WT>F|F3I4e)D?rYskKmBHRI?Lzf33%E}DZRTf zy1K%7TaCXu*I9aBk~4d{Q}f9m1a;2h3w*rdsZdjmaHDPP@CA{%v664(v;RPO!Z7Er z2B@V~W7DE#7|1vmtEgFf0zb&Yw$?yQ5=OD_@P~n)We}jgw(_gh#UB!$PS8@KD$r7q zTH{m~7R(t8t=!O_tn4I1qeHvqc&&Iteo8WSf>5D1GKM-sb+V;B}YxIW?y+}RPtfPUd%W<3@T{RdR#Q%(pOW=3(n zaS3*eY`t~cCGQ|)g_ATl{XC@gfi*!6Oc%OBi|K$RtQCN&y2ajC2w?QWS6m{s^*kQV zKpXAL2Zg(E2+lqhO1;ahcI7ZL(5BRbKgSEo!5ae?@cUHxBDG|hz$bh#+`DvJhHg6S z5|yKseb^q5kYQXQB2RufCF2pEzcRsEwmTFNN0f^rAQ;Gy{Svu5y%G>g5UIB7jxm4i zjsi9ZfIi+n-=A}I(lZC17F#vISE-fG=((>7u`0$p^azX0!~S zSbZ7d>`tASh5(17ghwYsnaN<3G?3bu3~VJR&Or4k*#KMRc}^ODz_>L*u9f-QV4}jl z2SA~lY=@~a_Q{N3K~C(VSt^=~32D>?b)w2Q~{*+2@C1#eV@eI&Gh4Gsm-12Zfl})DU&))L)@?0!^ z)K$czW;`c-LZutNvk_`j91#J_F**!^EguDA@h027IL3|7@xuY(QGlVfYW4?flY*UB z=FmcqWTwHGrO$%1kI!Ld0jvit(Vxa6gvB`uOpsvhyW}L&iF=b|Foi=FkZlCJo?{uv zgnLi#SG^7^EQWO!V>+XFy#hD;bSB0d5^*k|Y;a=( zA{2O1abm7|yncvdYz=P{Qv4c+($fHNHp>&lVealQNl1eG#JC>cJ%eo&)(?iK5 zyRguzLg5Tk6jWe>yaiyH2gD6g(or(RJcf>a7Zh4?0A}{Yil+)#rc9|Tjz@N)keHWr zr0&kas7+Z;f@55nsEZ=R4%PZJUrKl2U-fE{1IXC`^@5RopHKFVj-)V=3-jlwTAg@dr$$ zT!@&@sjgd)ZN^BFI+g#d9H|M^*AC()a3^6hN<;Ixov>G{oo?kTK40_C8>Zb7d7Ono zfiqxzX#}~#(wP*XfDu@(FfuulO*Dl|pG7&rT4XYs+$;()U&IrL7sr5^H_t>OdHe!P z0Cz9!9pPCxrz?^NClr8n65~T5!$mmC#Tw^qQ7O)qNu|natPMfqiw(Rs5-V*FGLvgg z#BJE8_KyCC8?cAZfUg8?gx;4KUq4A4%-D_&5`Zy>!+Zca_+iCJ?p0wZjoJ?OU2Gy1 zJREvTsBynPq?7LW$N>ige6SB4&kKi97A|L(4|on(-Us%KQ_c0wvk+)I`hxSdWH#Ls zFszaVQOKJ`f@@>c)OA^Zf_FFjUxFun!F&_8ssU0;f{l5=v4uG(Hgesc(_B->NP z9<9-<)=2J;Cy!M80?`#`Ze{22arv+0z|+DOSib-pdCH#$=4Yk9tY0Wu49oZRd~B=` z`Yd{h)QhTHhlQK4wFWZushy=HlK)5F!YeVsgAJleVjM6|N^uZvU4FEQ+S>aUD% zVQ}WNKP{d4eG*TrwHZ0&Rds!Qyq_0`=Ci*(zMdT)Uq@e0QBe=85t@FEuDyvoa(_X( za_%{#=`tAa_ z)7`(>8QUOjr8Nj5E8EZ6%)c|Y+05p(%q(UWo^f)%E)Po?7pu3t+>dqNMQlNN+1b8t zQIC0e{OqHd@7_1!VLQ{`7X`P|-+OcFkHla0k3~hqeU4|J;=O#?hvL8Xa7=FY&U;>A zYfXN8)GJTR0d8xn@b@16xL%Jzz)QmpxRx*HQAPAy0nS!U4^8BK9>G&gC$GM{-FKTi zw;^$Ubf0gV(ELNQeRHR^??b!CQ+eNTt#Rk8K0zB@C(PE~%VTP32F!wwk@`KYuqB@4IR``dW_p#?L)izWGp%^{tSkL)l2nIDwYG3pssnWY*c5 zr)M7$J?U7QyMN#Pu^SuO|JCOBieYpy4ULPPo$>qm3Oam5-evErlKmZ%&+GX;f{_AL zUTwkOXnh90%=z;Ld#S^Y74y|aVs&M5@JRs#`o`6woBV+~=d#imIkZy@Jnd^DXhRUR zw3fGIwaM~>brC40AmDNQg*Uy>gpAQ}Ie9}=YmiKUpOMgqzPgVaz5QnM!AHTOmDnR# z1Dw?63mqE#GSI(Uc0SrZy3uL?g|tVpUn`ohFjo&Y&TYs~Sp%8din&KYX!95+o`xALQ zqD}$cM8X+rEBZK7{3$Z>NuZcHpDcVn>bO{pJ=9J2^>c_k$1odoNRidMes`2`+f4xWL&C7KwV zFoG=<;rt|%rwAfLl*#=69H4yHIHD*z(#qZ#hs`V>F;9@IL@H23pI&HC6R;xf`;(Hf zES`HTvZbNPV8zk6!ZLD~31M03uX=nCkR#V2G}p^0JBIH-`nDlFJe2%R_%{5JMEWJF z)lsrDV7^Xr#R%zY|Eay9Z&eQ2Pd)yuV^P@C7wzL1a|YzI)L~SD5g}I}*c!Y9G%zCu zTmyzaL!zXlKQc<`1q^4)Vf5SqNvnJf$=yo*PTvT7^#`Y&&`C8pvu$EY^R{6Ll>*ER zW#$4xx3<~PSU?~3M7G`@@A9jhQ?YCP1o!=?GueYy z-~!3wg%{f$AP3trkZV$dB{YO>YAYW!C<-2fPNNxE1oTAT0;CC0dB`?3?2-eE71{CS zPcikNg}oDTRbhwNhA}p)6<@t1?BmoohupNOcxi;g$SLHdXdrPThX%eH-f%OLJIgwy zOt^L8-{$jmN~m+ASw?gdjWyD&m@$>}M*Fc*Mp_6n(JTca`ao*IteiQYjcbs7TSYEK z4Npb0ey?O@d)X3$kjHYsAOmL7j}{oFb*IA;C6oFYIDc0gC-91T>IZms2CAp2AD70X zNOw85F%l9JA`Mms2~x!3{JR)BD$vzlr7f>SFjMt5krfshIq{)z6I%7C26TbLhi8|~ z$d|6nhc=gU6(`Nm&2DXis41b^S<^Ad8*BFB>{Sz_BvMATwIFr30 zc-t;625@2U_=$&Hlb;)-Fy@mXszIo%>uV)> z6z-AVlR}#r ziWSP!sgdwBpjT>dv{c8`W*tQQ2L00U$(XIgUzJoG$_hkBa&-D_K1X=Qocs&g@oH3h zA9924@Ld?SQ006_l7$_anJe;LR_E?8>!A^CTO!A_O~`2`V5Xf{(*-Z=-aeS7EpItu z=?Ay>g+}8SZkN2X8aS#K|CON4t)4r#$nr2LoGShTO@URGqOF>18Y(3;fG*xBhK`^D zjYT5Fj4Y%A>^VQ!QM=fCzQ^>vhiFTkB2=}(URjSUoOn)9`&w zlxpX3Cy6h!Of8jqnrnfv= zxjY|d$I##Vh0j$z=EX7cJa0$uk9)7#+~0@u`}Ya(F!?xso+^I)^!dZZGIFewewh06 z`}0rvz1Q4#bYj3Ta-dmKci#*8Z!EmLfx6j!$bBo%yWc(lpz%nw|8_$D=bwN6`M(n` z^#AJrYdfioA?D6=n$O-?#mz`*Nk$cm0ucsl7z*`o83DT%P6cKg5EI(xsYpq$bwQ==5mf{$;a>eU1D`mo#r|Fin(7vdeVB;V;T2*;LmJjnO9AWKM=kw#tA$^P;G- zv$L_?yn2=fUVy*ezRJWNwzc7Jv1`Idv$OkskGudU6)JW<-?87>d;(&<*az12ekFNe*i zc2x3tzMR@@@APVF=a|R7z23clIO#Q_59$r&z-%pA<@CzQdOf~|@y4`&>eTJYVfXGW$XdO* zFxj}GzdYl$`_sR<+2LVs#~+aeSoVAUYX;j4f`l$=Kgxz_BjS#TKJP$ zHF-L#@BMfMfd!s&+MzionV3$gixRSO?Yc<<>ooM|uO%+X>+osUhW3Fuo*Qo8H&PAS zG%M4ebF;e(^HkV@?%1 zDU4@;Xk5TmTuA0>TJIkj0G(x1OS(hiWxUNyI>SqXshX&`i5IZ&KWc&H7r7b3Bd$4R zc}eS?tnZotSIxGWP;~Z*Y4?bNFgg06pG#bfO$PH0kIvT%8foduXP`O*CJ^Dm?P6eX z0-NwLUCKu#O3aveZYn;}jhS(`fq}FL3FrXFJrwnn1l;XeoPXXFA*6<# zVPGMmVp%n!Bn6A1;jcjW3_vmc8#ct@_d%m(vkA3;z=Ls^Qql+>RFGlo^E4Z2fRtV3 znC0X(co3)|Iv2y)hy-4+4m7v2q|415ZSpFY>yaZ4guAxgkN+**nco5CZIc=hJ_ z0HK-+dnfEB0#CAfe)F7@GIkK){8s){fIb-fQuO z+lz=9B-x<&pu!T>bwyM$vvw2J&RB}YzNX0|#qmJRoe9welBEj{h+7wv&8f9ivXq;jSqFn+<>OImdubRUynWH|+^TfVY*q^-3Tz$>>~mr1 zw173VYI!F?o6*h4;z1SxLA}ZDK5RL?0}$%3fPEA%T#8`3ke+ZNb!&=jtV$vm%i>$_?G2TQWE>VC2BPN*kf>q9{S^w78|no%c_;rWbXP zz3-6Fglm{=66?Kz#Fs(qAS;z;5Ms|s7+~h(K&8qv&OoVbHykBR4v$dfSCh%AYU`zJ zsE7vIJGj;w3QTkPggJ|dMU+kduxtU-|uW;fkKofLJR-}Q)2X%r?X6Wu$VbenS0(Wc~1;JsroSiF{bS$#S)u85+! zL?ZOhOUFcsaji*WKVP6sIzI%q)|HKsegg|B zs7?4u49eD{WindtV@_BmNtrcJa6pC~g$x-erzge8CxsA3Nlw2C;UQy+McxXTHc7k8 zgyX_zwb$9~F(ZU)CLYfrJ+%j=Tt!WIbOw`QN+LvH=o@2Uhh^g)LAW4?s-vSw85b%3 zR;orG5RgWsQbcleT5elZ;)3(0`EaG70+!vxK>q?eQ+n>C?J}iYP8r144YxH<-rwVFpx$SqbA}O0S**NY(vx`#~VnJlc zfB|7ct~(%g=8;rclJ@qJDu$_~b0b4hvC#xNnafs9E{ko(>r-dj4*1KRVj}>5k=rz` zLm0cU&S~rZ4FeM9z7D|K@;cLRibHunf;Wkpco^xmmrg}vCarf?P8Z+0RI4NBC?2V~ zo(ewP-BYy3N5!yFu;>aHbN_OHmB1=LC@Hh1C>trN{lEDjA?Mt`)`ep#;nvnS=Cd<1q#~JI#{)MU-9S z$pvl$vp;LxYtJ(bdOpK5Fea5XskmVo$YjZ_OD~?B>?!8Jl1%$_n`D|K7UgP1^SD=) zNspVpst+S_WuiHk%mmQG5)Y|XGj#mYo0soGcuSZ)ilLTjEz4XMN<;|i9T2TLJOmhmTM_9vJ}=ox z4(9>*jeLT1)w#0L%d^tUOp*Wt1<}OJyt1;Zv$w9Y)BHMC2{&aY$D4b7h3frgXA!sQ zHcqDHR;Crtr{(kggtzxCj&7C+~XGIh5?d| zmOJfVD5_Ag(-W-eMIciaxOlB34pS&y9yfs5%!Ut+w}fhu+aqg4FyJTc>8y<4W!?UJ zP&yX@G)O)F-1!m>VXaIm`_x65DNF7-F=NLGYT-{;8@0%4X;)x#_T&I_GqjEJ;Q*BF zeX81TwH+c(Snk2fs&XL5CF*6e<&$`)vlgH7WM~u)2xupj@i5kR9zn=sf9m3KOF*0r z$ce`Na>$iK24}};)yT*0nn{T%z~Lpva)g6*bN7A;BVc1a;wGtawfq7zG{YSF37oxZ zrYz4naZVxz^~CV(JsC+>@G@l2YvSu+LfL_Jb_=6WST%d_%vCv3Wka=1SZ}ud7k#>avcpkzCuxP9Ab76 z@1Q3Wou_ad2kQ2A$lmyb);P@F41kRWPF+Mw3p&eYp4XtpiU#wk7IY!obVN&rcuWR_ z;0~&+K}_IET1#206Ox8z)U9!xQYYBth{!*JeR1e!vX(dSE=IuAVNNyW6?g5@Pn2TT z9g6F?g`7Yz9{z0TLA{|&PLe8Ed>p-cl+1Yo(-&yL%Zp`rFsTq%wydcd9!g6|`?@2G zLD!a0ZlNi@v`(bPnUF04qFPmAHafzT`%A}ISgeg9Tvval&+tWpkWTA+5a|uUHWAbE zA?yEcL1=VDk2?#dCM)a&m($cPMeRWiClYGXiEcwvHhLxdV^ziVbAX8w78zBH`fvrO z-IZ-8oje0*rEX5Tdt`~IHM8` za9&yIhEJo7FGCG8S|P;=5QvVB4I!LpxI+~-e0E4i$c6})m8l*BYPsa#a8JXKjYc+~ zai90oKsStx1~8wJ4|ux>%tS@dFQ8mIcBE9>Q?_3Ka!f72xeFs4v_9P)H9xjxIb=Tv zfk=f>$+C}2V6{qI{x!~)9|>Il81>f$MLiutz?^MT8YK!lp%CLcv`ic1H1iN98j%8p zN|f66^6%GfrkWNND-KKnksQG70zsj%Pgq*}&n>r+mh)#`Gt{Sj!C|FFGZ$QfHsK$W zvH;;DzYoZ4zkK17s~8|4U~2P6X4>JOFdAoei=VXylXfZy9|stIwNHUTMGY&e9^t(6 zh#=2|+&)oLM(L#Zx*x7gwOJ+C0M0kyIkCbgM%xjBGd;Rz!h38b>lk!WprAPSFKlgo zPlVs%{B|DzA)4`r-{M147~IU72X-DoLnM#>%};%Z$)*WN)zF$E-7zu6LEqkI$VO2t zepKW>D(sIbtw)A%qf}3r1M>$UEU1Ab3WVom!9;vIY#9(KPl)|d_dqmr?3;}lU%-7Xt18r=)V&Ff*C*~C zakS3CXty@&+%<<>VGF@hLkf`%8QC`iMNqf(!5Ai!q$d0^e) z-%P9K$3BykcQky!iVb8yL|Ih8gQ!a(gKP_7BEN@JC-)SR5`^ZJuASPz!+T}rg? zy+q=@x$|p6TpSoeH%- z>P1AA+>&)~1*{2(5O$54JGSE?E4%w^!Ca662ris!Pi@*~?yOwzYTY2UNa`xe)+UzD zPL&Y&@3JpMv;`z3DU<*)aNPpDj%Jzl^6(y!`zg2~7k;g0=)jt(cpSc~a%xW9EkVZ; z#7Bu$`2J4op7AGrSaD_@bfRF`yd^ERX2a-SVu?pgS-I1#zh5Y@)Cqz5sjw>HtL ztH7z$aeSq^_qB8VEzmPig|2hNCn1;7iRSp6R(%5})U?J&ygxU6K$pn15m~9N=Z34s zOTYZLkKhxExIen_zuHmy%hFEL-)iYuF==VHe)ISzv-FiUW-EDDw%4|@uJw)a9VRwT zZb=+ow^5(+G9ZT}ffsn^|$Ljr^Nb zeSIyw2|TT;St74(cs!%0D&L@V?SMA_?acGfKmYvm&p-dKV}<@7|Nl9mjG^|Ixv6n` zP2WgW2a^cka3Kta3+sR(I~O982&^?Ec`K|_iGwmGmlP+e@Ez6t-7TPh&z$M%{G9$< zdyS(?lG1*JIqkLmUAkMhd$~${p{NoE<_hQM_C^;w*|+QEXD#g~Teva0Ki}5J=iz%t z7%B5qrT=qKRp5=$R;PDkxJawLxw*aV)7xW8O>f=(3Dm6J+TGjH z^6d>SYiC=%=I&zSuWX@B~ASY`*L^UK97!$wvL9Lo}QMz?(Xs6U;#-tHL3jL;~L-9enaueoEtx9BesQ|h}+_t z{7!(K`>56_;aZCuI@0h@o!Cot3v&W)%L`QajHVZ)EqZkiL>pxHdQ?xXPgoxuQM+ys zc18m+Z;ei@Z(zdD(63j`6ZVg%$?O-j7?}Wy?KkY-0pN8(qTle0YQT>B^o)e2HeXjV zLEczbx$Ad)eX#d}dC`xJ*-4dPF(xM@GcVB8s;S5@V64rtV?d>o|9}`-nav-v^2*R&$Z#I@UNQj zkea7V7|g>_BN}t%m~*j}X-}tjMQKs5_bgj=4I@nM_x5kQU%Npe*n9DELZWi2NkyO2 zy|<(3FgrLoI2+OrWhB+q-Jai%Yep3m#YB=;Q!d;rEbOvY8*9#1bQzp6(mOpx5Rz^iMyr(j7-JptQO?_{(nOC8%Na4aGRl~#$7!5cD*8bPJ9+Y2bZpdB%WcW^BM z^FG4dfk2I%*5#@&HC$VJSZo-h4Kak!hhjV6$$9Y^wF|NHsyk0)mCAFA`Mpi)y|OuB zK@UVz_+o1n5x(Uh$DC@uU{a6qJu3Hgyfc$|hVrfE8#awY$n@)F#ZuSbcW0SgUA2;9 z#jYD~Y78=&gI7GNj?qP28Rjz^kASL1=;rCY%8t-L5QjrOVE^-R=nfvZfuau!%U#JbY86`C#W=*bQmQ3A6@fv6=HbIh zqVDLtFs_QBL(6=QI=DC?r=&Ez*~uxxw6GQ;JbEO;Gucx?^AElv_Q>xu}VBRa0$K6io!F?|{9#qY{pK>%6g)_~+SX zU8P4*oDFPi)B11=FFa}lZ?q%ukcRvM_e#X80p0VjA3Isgisq&BXAMLja01%??( z>~K3uioPYip2P7Wa8oCTbz9t)U(-ymsE@fQp%Z1|Ys?3%smL@mIs&B`6M$~;T=JfH zbPD}6g69clQzpdYptBOfOud)O2cv-_#292gA+g#G>NBOj)j}Z%CCYJ{mDU@}b6AzkK3G}HwsI1N@c`70T(xhdv8n15QN1P<1jQD#C-;>M zcVShO9KqBT2z4?yhUhG*g|@2Xp!K}(C32X?a|-;dy*UzWga2sFBo_J*sVW14RA(jk z5VOM4o(m$QJ?Z$)N98?EHu=g=o$rz29St7=Yk4DBx6NT&JxlWqsGHX)njj$K0o(_N z+3>068!aeUk!=Hy(2fFQ*0j>C!p7!!r7*Lwb0%$3QdnTg9^MU_G1MS{^iPmsTSVX> zk`?>x0jkh>zBM<~kmmmBmwq=t#=ld;uANCR(2foE$kHB88=VLQGU3TfIQh$DZnSMs2HI zvjrAu zj%r!vE5g`0*?yPsnn#mohq!0M(&fEtv@6IQv57$;C|RiO;Fky)R!n489oGP3Ho%HTC#*!HNiR zmx6`KQlb);lf2ndc!ha z$?T_87@yxt&r%0V;wWkv=F}nd1m0Bw7Mb=ie*hX92p+dEkG`<#MQv?Nk0|9d@ZA33 zF2PCuLW0Y~m86Gr9KL<902W3?cbPy$m%XS=h}=ZYjD1gSAbr9*G`uESUtlXdTN>P; zmeG=8iY-evqKCP3TAwQ>n=pM%_ZDO*0*PT3=>TLvo4*90IWiCFoc2CkVk&{p-kr7d z)^Z4+_6XpxUY+!i+x@Q_%W!+Pi=AhQv{xG{-fYULA9>;}IAfXRq4X!WEia>K{+`f^~jHD z!r}nX1roQF5~}rU<5_<9a3q{OBwRI-o2V7FEH9!x<3NF9;#&T+K|i@l z?sv2~Wz^IqPINGl(m-c%#9!?9g((UGQBQvMXt5=ekP>6?6!-ujzn$ST$|f|zaOw$0 z8@{DLOK^zUYC{0c>+;d0*qchq==^|0E#|9Bxv*Zl`oP|=IBp=KE^$BGJ4{&o%Yo-O z*{d_F)g*L^cOFN)(P!iCM7=~PD6XyfS2q|MEBp0fKzX4CF@F`{mCdtXe*8ypBa+I+ zJm&8{jE}S1r@n9G<-&^%H*#@u@vt!js{XQWPkYBZd=WFY3-7PAHwu2gh`YF7@moJ9 z_vqi;xs^`We3MIEZMt=_)zO=ct5hk{tik14XT||H+LMXe8X=EW+WnensrIp@=G;Au z`MaO}*Ij%ZpSIVZA-i4NY#iUmtL=fdv58$PMW^4h?E*ctmh#ZT@1nZh!AF57x28$Z z)BkpO|L327{`uda2=zba|CMpZP;=F8nYy5xxci}kX(H06fDWikrX<%pNsfmB(dIx2 zr|gnt*OTi@m^f036D!a1j@6Ic-bm#u98b4C*qEskz|)cW$6#{JrRS0-)X=;ZJu&Hi>Hs13{5Ad5 z0r}4o?1Pr0+B@em!hw!$2q+Q+{!j}IJV%W+@D3M>aC&1(R+Zgrm~Mc(96N9Pb`@|? z6Es{^Uj%bUhZjZfRB~1JpjtQ>tC-2cP0O!)d+YNC149~6;dygrgNGHQcP{~~H%|ew zBpS-7e9sIs_0S~n;hr6f$Bg%b5I*3bZ!*X z19^ww9~Gy;sz$nD3U#a++G~Y|8m}q`jM_BU9%*)LKJqrtLZyl-94;o-*JYXw01aMJgNW>-6#Ph;DAbB(cE4icK}^#9Y(d z3z8oA|FL&ZO`-tZnxMjQmH=-w5Xqn|O0d)#&ZJLaXK;ZM5 zo?-K$=fp@xC}wq4#x^7ef;c4CNg_f|P}ZIdtpE+0Cjl@Sph`?*qa#$pblyf`XwFK! zq{yucg@oWHm`8C35#Z4Dpb$RK@h7j3RZJ&U21hL55k`tuYyvoxBJ==G1a9IK%OdP$Ma<0_}#@sz3HUT zbwv>B9?bSHu7FOdDj$X9O``Fjqyg3xsNDH>UWC7R#GeCT;=OH%>kL)?Fvg`bCm{Sw zM!+HfhG`04f#@jC0nvo~gEl|#>T-1gLK9(;1|zz~gc@|&q`T@s@3xRGP#wkPyc@q0lQigfmh;A*dC_^`Y%P2SHut$9O1X%DzD6 zUVLeSkDG*}l-p1T7zStK&O`%N&pf5ahpLyJTE?P2!_KEG%1qK=-!^Lr*`{=ILE3__ zsxjmT79v-N9t2?l6IrKnbl_xLkP-)h2tr38bGoj z5qTu_Pats@t>MryOTb?VQ;*J5%?fmLX%~?h-QEKr#z5BBfbRJbclJDCukMyCq!&aB zE;3>61pxAkb_nC>rogK{hZX?cxiT-`Fq2KvdFpT6Y}?UUe$EAl{u| zBPxAlmQ-GJe}92R$Yj+$rc;QB?Ll=CdKiDHN7KZ4gIj}JT1r31kF_}BoRXoNil7Io zq`^NKkayPwp2(Xu{gfuIp+q0GN?W*wP!1S-HmQvKs! ziFs06b-^;_3C`pBrc91!_PQ!HAyGs2F9BMLehq<<@D9SI8V4cvn^tVd(9y73X;gJO zqp*QZg^KP0Y-Vf?2`R2)q>4v)v;I(E8Pwli#_#o?FL}y%Hl8Y$6Sl4XmRbx;u7$_e zkJ|&-;BZr!`Tdu%0zDI>$2tMtgb?yWG~hD95bdHM`H{hzZRVqXhir1E9Q%d3LpmC^ z2q%FU7G*3+&V>`+wbu(w=O4SIyYYI|KUEaeaiY-SmXnw4-#TQFD z&DUeaj>`^li{p|nr8O0GdDZbtmw*cy8(llWjfFP(OesN?;mRPD~KE6 z-1RDTcA{G@?tg0_+!?0@+}8rfpVA>&-S~~bP@xRV8M7C zlt5s}>x8Uplp){-GO**=z^Ki6a{sgyt@#M z-XbKL?YwfDc-V|j6EtSofJn`rMu4*)Apb?nW3JE6q(TVYknAl^X?Ev60}G}Qz6cQl z7BN?Ww8>lvd!G$<-fYbAwV^%Dx-^=fP4ZYo~o#2u}d~pi~!2dGH1ONRb8l;6(sF-ny+ZeI&>@y%!+`~8{7#> zike&IEJ|9@o|AjK=9vR?jsf-h4LU%wZmQ0&5$ISAXD(kCb_5xtYH(S=)wolvS%o6dCz8n$W0;>X#d)Pi z^ccoZDhbGt@S2ig)IWFQ_o~Ezey~rdtxrEHE9nz>##K5TC!x-~dK6Zyy z)g2WPlv%glKf=&N?m@Y2#f!j^d!I56RTW$_yJSC2+{R};GV4M z;RKZdqQI>wpgqKHp{0r!ReNCGPc&Y$C8?Thp#31!@NGTRE|K*8`K0{yODhunT{!vq zo097-_q+R7lG)-prI!@uXIguDVzFax`;{|vtIX-0{_9gb;8)J);od)H<# z=zluc{`1d2|NQg+iTQub|29r2qlh_%x3(^&+S?bXB*fVyg$4*G!(f5YdvKBzSpeA9 z55WKL=YPM3B$b4T&^!1C_($|7(p{zWr_HISo9Z~@(g;V@vcs2>&Q`M%j}9-rJQJD8 zrQE9@i&xb@mVbR;On0;2)h#n(U0;2_zWW!mTSqh=zup_|dVD{Q!YlcAc2Y)+)Hm^9 z@O+?Y&HcOqs;gnm3z0HoeLLUtVr?vJZC*aVPiOnHlC<-J*(%E4?SV6Rt?itUm%8!N z_(RlN@oZ}fJ3=iLK1^>jOE+T$+WlA7em?FEptUZ`TqXaX&VUvCyoF`YSn$1P|H^$k zg{n@^-DR)9(90TsekJCI?a5xA{&4I^x7Tn^XXY8*qfzpbFQ586dj2iVQ(s_M&o-x- zY7F+vEl`B{!D-G{MwXKpCzh+0g?B=}iZ1%WL*mnvJ%^q%!?(`8#=Z5}ABj=vk!kK$ z^Q{0!CwHXMS*BkU7Rs+1=PjxWnl4QhEtK}m6qR;tSS%~>vUb@6wKJU| zr?pYi-FA1(!W*lVWmpJ<09#ItHc8A(E9_R3(}fU2_9V-AmDRIkv>5K;9I-j}HzOrk1mHbH^#A{@roIO-I~*1S4A+WRI119B)->8UTCbAI7()+Jdj_~uRo3XE33 zbCi(oqW1eZZAAf!EMk1Ou2{KH368^_0z^6>U-Ux})A#Z|~UVANNjgSj?8NG{og&Zi$JsIUvv zR%z1{=WUj0nM| z!=;3ejIp{z4TQKozh9Alm^ny-LTw_tLa7>=@>LN~H=z=aM4bod-GU5vWz0C1=;3&! zI$37oP3Crq67R!x9>+Y}fLl!%>@%k3oouI+r!orq|SHlXLrH$h>iOYRcf=s4}Gg$3ZUp3GJh0+m-8%i@&gIGOqAxYd} zU_Iu;{oSEp4Hoakie<$_x{XOPJG>kKVCh5|-BJ`8ipw;Qlx0v9mxm7}7|z#`AYYC0 zh#G*&tiXCtDpVp6s-q+Z5MmF2fMCs5>xFsVlDoqfL%X}rta5;gQ?vY{K~pn?Tq>j= zj=l5Dso@ApGHrvT>*8%*b@j-01j9kEbVtWZ>}2KmC}d!I2x_Cnm1f?jsEB%oN|VQt zz&RCxJA)ua!G;mLXckcSn}-l>kx&=<28pH}SICn}!J)tda@|!Sy@iaG;?;{!RiWh7 z2``P8Q<|wYFsZRU9ZnzpVMbh33$}-fXlal`T(A7}%<>*_Xt6-405#(7=1B%j6nhL?OxQ09sCw>#^gD|XomyNwO5UFEz0hptCNNmGi zH5aaFsEbr->)wNwU@y<OH?kI-l?NDZ6gcwg*VD-WR*)~ zB6w(|8M;5A&x!*kXkxzr)Cn7Ji68Y;;iCZtcVZkj(bqN+Z50olUe#>dPL`=vQsfzx z&k|6vU*>nbA>VF?kzMgGSx}0y30a!MpgyH0w`nE-d|k@K}ieQ$=)%B?FO6M^s>aH`xkt9w4MgOLgL?x@X$? zR#3cK8eG*N466Om=7}W;qTb$HxA!P4z<6~O2vaI@WGd0VQJKyjPK8Q1qBx5@n^BWw zS&~44E#t&Fqr`{rww#%`M?kfKB_fnr)5agI8gBqpX_6z?AqVxtbmNmgp^B)DGt@>s zsEo?%wIPJ4RUO-K&7fC;{u6?I3M?@$Eh%E8f`ky#8?a#OA1=KycW=lmjAB|45EJMv zG>&;TRLDeDftAQm;i58x-C}RvM^u8dCyKN?l=sM`Uk?H-7Y_^V50uAc5KRWB5j%|N5%i_vPdoU;i5C>Zk76@^tk3iC=cn zxBk^qU3r~F7NvXb^XHh)mhT5z)I$N{KOJ5F`RAX1{`vo*`@i@9WoRp7kE8l|VMr1~ zfspUW7}y?I!i?;ss+8$k3a3};LQ9gC^BC(t#6F~L^bQF>WF$JB zZ%Po$*w~m@QC}vQmCUA}FMelBzeee*RFpMjivQ)|f>b?`ujR`UTJ0rP)!^p(`EWDS z4#iJ~QYi#X_bi+*TfK+a2NHqp5IR2?05ZmM?0#}|02EqUC2Z`Vf%OJrlC|8=hF$|U zW~*y&dO~`R9(j3rnVC8H*tnROczBo$9@*L1xm@k!*2cb^KEZ-|A>1l_IT;!GxLBBE zN4V+T+1_5?+1VJS0!O&9wX^Lie!;f9y-`BH-N^^p z{2H2hSwX*5a3lb-6sPKa{h7^Vu_^umBZjgBV0D3G_rr3>QDuN(2q~Ba7`bFI9!sGNy&Ha(YU<{a(Sgy#UYuC(CKDNig7LwI3XNtVCNbAzXom6VCAW%f|WD7%pwP&rdJ zht7&>+Q92O?p?FsrVRhu`V{E|iKY3H$I1Dl{kI&*mi8w=8@gDQ;0EP^JJaGj{Rv)v~We+crBpv)(6lSi@bTCxUo zcfYM)s&v|kP>Vu1I#?O6UI!o@qh@Xj%7R0fu+(8BfSF}auMXxT%v3;Z1Xun_9v;6W zfn-122tpc-pi0xW&cuPSTCCw6r8J@Osto>$#c|IZ1rIIfZ^T}VD99j$pBX{{;MG-# z@-t&TRR$_P+nO<);Hf0?-f$SYJq+=R@`=50hhbRur~~FT2H#p?JXY`2{kB9{Ip+3R zse!1wStDd+%siAV;i2dj6J$d!5n92qB>fggSDjPDwacyd-a?b0)tx4kiR0wcz4Fdd+p-F!F#Vabr~ZR`UHqn1R3(GJtW5i zS$|L=Z2;g!<1SNbg@&!*&2lJZs62-{qIIj&R+JybJb_oZ6}CMTBaRj1A86iqaLomM zo62U*kj>HHP03G^MrY6cKHX^p)!cZkJ7JyLVXMa+5rN+fQj^KF5u#T3zhN(ogblBtQW-K?*sS;}pn8m_T<_nxe zug)tPxY}^`?@@6tyPT#_HLD~@`M$bDEp`1mz;hNg_zu1X^2`|jfG6P97i7!?!=6Uf z7vXDVD?e`cal*}t@*O@FhrjBAd66YG=k=w^iF?T;goS%Ys`00v$Ke6xq*f}n(hNbw zsb{Yh^*h;wu}_djuIi(N;JDPjz$@b~`tQ@*=oNk7e3L`oL5^j;D!a`HOC zjiu3ogQw<{iY5tdj(u_yT=#7Ts#!nhioE;rXfSzAqI<3n5nz*BFxIcIWm06A%qw>q z%_HD*_vdMM;WwzbhIG~Holbhu=*g3w>$BUG{Aq>9S(Zqd%Ti~?qNCs+Z(6}qvGJ}; zm;|C49(*0Wn!2EN5k>P!)R)F^cv7c$ucqrW*SiE^nh)+ zx&W+IvjAXi?5u&~b?M03dBci3!{4fB1XoVAa3Hs8#hEOB8b_f?o6*LRiLe3yg_dFSL-DHJ%N?`jogW`9VrCX}O?ay+cGitsPmu_C}PWA7s(?^9U4Y(*zvItS`sX z0NrxiBl&~h?h@kFGmB3PM6U@=MCLr@s6@5vf`fC5AF73s@JJsL77rGw=cm-lCI9?& zD_IgZeV(UP{qpoQc9o9agL#H)t6LJ?FdDAWIEJNW5Ky~MHmu1p7w}TknstOZuW|{M zV<%`q(kL=eMIe~iD{XGE7qB>Hg+bqS8LiEfF{+kq{bYNul;t1eIm8I_OrE0&$pmr% z-SJFESi(B9AJqmh44F}!@S}G)j01XIC%u<(5;Ze-AHL~@y^!@$|JipmCr2I(rY)PW z+>?srRg-0LCoH{8$0_C2Mhlh#q7$Nunl@L9k<>AztMr{ zNr&a22f3~{2u0)@Tr4=QP58GK`R$SKE4_~^NJ8hd(?&N*HSEGHL=Ok&6s`2E4{x}1 zoS64URt3cfuv?lGrw`@iq;BGo+C?0JDvwwVJ#fH2_3H;j+3mK)IpxYg`p_c#APRjA`2xZ1T-y7YZ{5Yi`}=q?ILe=e zlY{Hi?CALRZ1I#EaIwzM$N6wrng>O)!T%$ux!MqStEnpw~4F%>RFS@L20a_})!+%FEAg}!X% zrcdzW-~Roco=5kZOK)4%WTiU{dJ5P_& zz_7g@m_8Y-rY(b34QXk2!Iw5QXQqM;WeW|UZZ2;cBn7EAp1yH~G6cjGAlJd!SWzq4 z(C7Pp2aM4#-@OtwS*_Ym^YpP$AB4TgdB|wV-1%gYul-y3(g_!`aUI>p-#_Zms_f3U z%(IfL%YVbQz3!mYl|sFL_m-YJrq{g6%8)hxOj(q1aE!vfeo9zEcAJt(lF-A2u#m3Vw|3 z=!s_ct03+8VfU-q8mIRKbRMi!v8uof{{k1=j^O)GSM)F zrHc}ry=qe4%r^4U%nFJ&yY5vm5I}d0lq|E%QV6|$*)OcQQA1}vj%pov#i=749FRxn z{@?=hQONazOXZq)vc|3LY2GfKbJ{15{23TI-ImS1Y0{L}xzN%?2^A>Y?;g5g`$jer zjUwn3nB&#K189CA(h$}Yn$%3Smjc&Q<5vzM=V7ew0#7z5AC2`&+3&X@2ACKePBR#V ztyKpWBHeMv482U8x~3|>YC)GZG(U2^;VdfDsR2vA9PiS#0vZDhCX&i#Sy^6?hQf1T zH_jt&!Q{1#%#GWYuZeYk#c4{uTKAaFr6!aY5+dLW>Vd9h4%zRV4IsiW>_ggdI@YEL z`(cvyv;g92Si_4!-YoLM71=c=Y5(rA)(d1cI5QyfV4QX5)tGjhJm zT@HaVV(?5uFXI)mPsDmT@c9R}-(17rg7%?_M_rmD_rC@)&e>8iz&fYo{dtMcXwZG? zBO7MJ;cIY|i++ivsSgvyJOmyhg^3*)Z^Jq)oi(1|0KZJbjkbd!qodTVMWLQ-DA6_A zE3pCw4ydXiUW^oIOS~;w0(y91-4$K=+RViSFFv!@q^(%!5|c>vBkO^1h9(PF1M0F7 zAZ(8vXAFwtK?cT7SVU`&3A0ohTKCLu5>1giF;sW@JM*-%l9aE{F$S?%u@~WfD-r%U zZGwR&*5D3?hK8c%Cii#Xg?dOz$rgQmi~yXGVx9*L3C< zL=$8RRTn8<;vD+=0`@ahtt>HCw0*YI^a>_h-#Rg>@_!_#r2_xBlr2z=%A98_&YNi=`p&7nK1C&4*#*p4ueB`&+kTlmUO?Z)XxLcveBR*bgJa)e*Cl zh_UY=XFZS-`s=q7GwU|kK`6E>k9XPR#*DE}NCvfE>_yA$<@m}z zve3v&a9usQES<_Y3KcKzQ>6^F64B*W(YR6$wO_(}MD{idrI zE;eX?6Z#mei6}#QJ4gB4x$wI?n^hRU;a(pQNtKT$GZa9*EF>|*s+a$eICecBmj6B3 z^9649s2)8u(5Ju$Dq@y|!RB8#e{oOu_=%@6cMz}pvPoK~+|GprP%>el1NPZJP~+B` zkeQ-yBZYTm_^p+^w^`ylA73q}4Y53QGvOQ(9ZI0*9-KJ237cd`gxeIBxg&?#?RD25 zJnPx#KK(4J8hw=&*v#TaOMv>?_m_~~#iw=Cx@_}-%u_{5984K$6CK4|2)7bh6sW<{ z?cffpV`EF@3Uab!68#6;QA`|RdgDbfi*K$EZGf;yn0L?>=o_V1s*TTdX|ENsb9~b> zr79}4h$cBA`O}>h6X0^7`2h2_TM=p1R19};MDOY1N?XXgLj72RX}%Qzl!3Pf=m&r7 zZMkl?W$3_hFni8up{!xu0z{Hk;o$tUSH0^`Gp6K zyZf2vquE?SiS%i%}0)9K69y9aXW98qTzGlqF?$2z8 zTMl;SRBxxv$(mH$7B7MYcDGgiTmLg#nupa%(^XG=sixby@=LQP|&fbzpHu27p z>yXRhmkRGz_s$w%JaX5?eMihHmo>W+631mpAIGn+NUEMQWejxp}0&vbE9(Jw27wymatA*xViSLRK|DgS@p4pP(ui!`nm4$v?Gs zZ~C7d3&n0Py+3xNg6DVi6u420iAym0Sy}pD$J6TM=+LX|zcVtwXIIauwKMr~44NmN zFYiw5jm48T32i;HRl%XCuY^>eFYR9F$GmMMB)`OC%&j)1%B{AzWk{Ev1iuj1w_pyI zx*J3x{^n@}yK(n6q_bQ2TE?Lh-*j@L*K1OBfjb6jzDKM$1myeNmQjdYGUi0U9XtL0 zYFmRHY=xH{v``unCI=%1_kn|`62Gi%Xfdfz4j4t&ssj-QUDJ8UW%!Dt;#Z;K?-qFgqnlza9wn?7*pc) zF)s#&fiVL54zY*gLHubv0swaLdp#VRqv`X`LnnS9L5}$^1OB6Um6 zH?zBY|~|cmSQD%7Hr+J7KQAz&gf3 zjD43SJ26`IriN^QT|ptHPcPO%m1^5YQ`A=);D*pf;u%q7(3&x<4S|q(I7+XdfRkEI z$QjC4T51h2DLO*fx+Y;(^5r*1S9SM3cz^X1Forz{{9p|67#BW?f}1JN@o@1>iZhnd zDWpqi<1Ltagf(ntQ|1gQz+p$Sqyo+32HK3{8F-h$P(3lv!iTeT#AN&cYh()I5?sgE zdk1iyH&I+K1?j$(_&PPxK@7kc0f9x@#Kve?$g{?=N!oY&&Sfsit}J|V3TZQ~veg~G zwo-g^aBy*7Ylr2E0#uPXTWSWg*@}fhA+hE$!Z=E+T&3mMocB~(R_sCru=et&EuxiW zk{XmRNuGEDU5JetP@~x17gq393Jk#_GY2Zqx3@flQK` zN}QvD@9*7#poQ0qf|n^%0XVgbxP+08o2JuA1b-CsQh@S<1;zu4h7Jv_59hR2iwgQF zqIfF&@a-*KlbDg4cke(9sl2>xQ$g4b*=>je()L)lEJ-iErLtS%Z5M&5sr}LVef-1 zDg1!L3#J=UlMu@`wQ9;RwD3WkJlMnBsm|K6zaYxe0pO#m!5X||(E6u{ zuSBHM;ORmOM4U#z9Sy(NOI^TemrR0C4($&6^9mSX$`mvXsN2m_TeRWQ`$#rQf_nmH zfa~;Z6gWz*8WqP$OUPWH(u?t?$WfQwc}!I$IfL8!J}9D+9_RHeV7pM&Ea{Su36uzf zA=Q^_byQBPFJyMGy7huRcJkx0=LgPG!fwW->%u4rq(mvrvN|Ns4V}X2wecT6V-;a4 zcp$^siRj8i_QLNOpczGFr#M}7PK_z%sAmjwv~;q+#MZEz+j)#`Pi; zsw)NGcpHPW=|suEQ&*!fzTh6jS_V98FmV{=qzWZ)B=?n5SYyOf&I~f1{X6l(q^Jt; z^!o{W9|r0w0iELoYs1JSm5DumoyR#M;N|yYZ2a)s&b2*@t4CCQlnv1%K8XI154NhK zKR8a=F*5hYbE3apYN z#tXmWEsH(K1fRhnhuD!){^bdLJ_YKd>-K=|_Xw2ZVqA3&72FGgACr)Fry4m6)XNvI zwHBI!e6S=iY>s4C9Mn6#H>q>T)~fiW#vaiKW~C*(i#YLjmzR$P5OR~fkYJB?X~5Qk z)UQ-7ojlf%M6HHX__;tb_WDVLM88R=1@dIB0fYkeRF#|)NBY<+m@he4^E@!<^37%+ zw_pKTnkpGCpszYA7?R(9B2<_zB(IX;+<^AQTxARQ28Gi<^()qhtlT-9v(?1poEylo ziyUAJ6Pu1JqAJTb1>}KQ&W{)R1GB@T9oCJ0pc0YOhdF-$EG~GEUgTa8AEvKhDZ&UK zVPM9<}e=Cecq#$zVg#KPVyLhoJ5t>;3ta?Joklsl?xo%AejT?cBxR*V!Y}yQj>^ z#mL2BP7&g}M7&&`tgneF?O)6<>eutjUfP-a-$~BYswRrMC9)ctm!Aq)4&@fVK+-P?us!PD7-aNL676fd~k?08EP&5KsuB2T-@+Q3cyps=`raJm z#%5D!vc<*-)7vJxP61ud#*U@sHkN7G_jE>`y`H|fr?GSy*lS{g)`WdwRn~r~Ykj(7 z71n;THT2C@>U(eJZ_#V@p{q+5pQ+n(*kbyEFO0HbiFfKv-(WKa$pZ(pf`z1sf<-(TRzm_n~JEKdS{9miTHd-8o-mqpU#VYd( z*_oZ-p|?Aq=CAgDv@bGcnq6ORecew1TInVnutUSVQui(=Eei}FS9-!W~X zY^*j_3_9dWpcRJJWKLTUqkVWW){-km;hy?V=IE31Qs&sr#8u8k-;C=>{^I;`sjk06 zW-z$MQD~%qnwGQjd?9Hub}m~*_N|KY1!kjQ7y;_AgT`8?lobu~0nFqArsvGOGVwlv zf3dKx5(m5GtA#E@rZ9aW{Sm;a9X@4}I7ka{E&+>{d;m>yWqp$ostQe$7k@0Ne8foy zDx4xXgFT`OU z;UirOjKNLYc%9=>(U{+^VHHHh8Nr->^YOmKHun+KD#I~(U-x{BTYHgcx-2)py6|(R zat~$5BJ3}dfGE8E(@dI0GL&Jch4+PMizgd{xZ!VcETdHJXBRvY^6B;e;>vE{l56_;oL1t~;MNS^fS0`HT)9h>nWY?&W0->4f59XQ5mFyFCSjTd zQ$sE!2>b-#yK81WhOcE7$l;?0A`DbLgMhx`y412ydg#nR`WGSj2#cd#B%s~Y^I5AI zz&!?enqATmsV-E-GTCWEy**x`fv`ZUiMI~LcqQ4+qmc$d2 z16pK~r$(htIApn2dOJ^|qOaw2;9}6r5FWAsM!JLSc@7JW2IRt+GvC8#yfPwt50_Gn zdd!1teL!1eoedhovVKZ17uRR7lf*|%GSO-=Y9=I`1X?<=iEc%(S8)CyEy+9PtBz!` z8Ok;bp6-?O#HSB5rdaFAc&Dmp+EF5n73Ghvg0=&;{6xYF6T<*W6bFfJ3Zi%T!tkoQ zppZyi4gp;Y#<%ZFHCI$Rh?*T~6tM2G=;pGcMf0A42GWzG>}3rwMc;u26I1dGdR)OC4F9gM&oOwd&5bc}W~2mQ?`}>Hxvdg0MQa>5@C~44&p$ zBcwlMFKtQzG1$&G$dF<)>x3;_C=9q*NWJPWE-ba{dCYBS_F}TDc-O2e5*L^EV*MFQ zUgd&or5MEFju8nyD3t?~!v>42EmL~I^BjGcxae7A=sa#qcvm^Rbs(b}LCt2pNgP^N z_7%>Zl;41zI3E!P&lxl-M-XBt*kY!lN4cNCB1zz3uF_@DrL&Oj zIBr>yuOky14FYhOZ*WdNYAP%mag>WrRC`t@q@LVGvejT#Olfaw$E%SI-YsIdFC2MC z=UgRCjL5#JNbGwz=RWkJ56*1fTzw~<5N^bzXP=_jxPv5f>{%{^{hf-CUjyqQ<2h?C zil-APSMJcqMho^>=WMm|h|cLNRKZfqp_B~~$|!U*PES?Cv^294zh+Y2!4cuQp%+EQ&Z%WHC$U5CTR-2UoGSv^Qz ztJEsd+&P#yi%|X4^T4+(b?(ZJGlD^L_H)r9*zz)v+GgEKv5$^diL-_t6RJ#E6R6;X z@I7?8fiD57Ps@W#;;06cI@Z(2sc4l+f3*6_BA7O686UA$kxFCo2Sdb1 zBEirEAf-P1cyLV2w4>xe zEZ(u%fWYgwRvD9p9u-$wI@8G92nG)|5lCgS?RjV~svy&xHAAPai*#(yBGQWLqtI;z zcj3WOReyiKGWiLjFXn1Z2Jk&_G*8V~IXdR-F8X`t#iMjs@v-~9fq;P0jQB0b&N zmL~^)bJJYO;B0pGa{T?d*)eOq+4=PT`)dC%kNw$+k8j+2TH)no_m{|IMm45n(+hux zvv2qH3s3+k4)H&or~dippMU=O=l=wE|K0zmJsqnmiOMh9{dv>*+P(S8$^bhBvp5%+ z!N5?L9uE&59W%m~hA`Znoj$X+03_E6haqbqehJ1-R`-WG(VU*ufXNCN^T(gedRw5= zzEn9Uw&QhW)ym$)+4JGVWt*#)%jM$B_t~K`6Dcp~>gr$?J(cyTCabgQkLwq4=)q>B zH2#5vAPUCgG7i{oul+NPDv%EI=l9_?^OQp^Re`;u10?#{!u$+(s=*XsGW^x z@H^JZv1woOVi*9`Yx8(jIgKnnb>EdSam$RB(K?pdwq>Doq9G_nag&EE=5;%E9`PbH zEflS?6#1PFx2%4#6_b8gh2tX^Kbkpa^ajN=-vy(cOyNw@VOhn5ISXJkiDhJTscJE6 zj4@IX34|K;Vxb&INuTI+wmXDf)LT@$YS@7WLh~lR+B`#FF&*fzlZEoqwn|2a4#xtT zVTf%h+FYZbE=v%PX!M8ya3W^;y@upqeZf_*O+9_206;NV_badETBrx5)iiC0_Ze+L1(Rh6rjxF?e0$rP#wO}aeDyop=lFG0 z@o6w!LnLwsd`wDUm*^L%<(0-7j&!^*kPv+Uv>^W_L`x{AFotg)L793f>WOP(R+OR; zyb3}uI4V-ibm)D8s}2F4rzUFb%w7cjv7l-SFcSBPfUGNZHU1{C{h}Ch9_leDf^viu zg$ccfs5}6QHN{E-Ns(S)SejPR;Z6#4v!N58<^&P_r3s+m)V ze1dT|sd+xXD*^}y9O4q;2Tsdg;&o7}hLE+rS+6 zXaYS^i$XO4+qo)GBz673A|AkbSMWFkSEmCXE@pE!h{+aVWBq7Ifo5X3au`H4cr7n! zxm`@!N-Y3U!F#X(!`wc~Jp$({3}{Rw3B|w*u4iv^uJe>ZJ6CF~!PEdFmmjtEVk|R&wq8Knaoc2s?`% zXUxQ1$YOL{x&}#In85TM#QGStK&Y|&Vr1~vA>@HpmI+iqN=iB z3zWrqtzi*$$>`?7Oin~|N-NQQhLJ|Th$*lZD1jL3F4G+XI`qeiCowJJ$Wjd_kL5A( z8j^f)MIJm1{$G;Mi$bf$vQOsf>q;mYD!|jy+GEsCHPv-GLDX4V#_>#8eBg^)IKdNh zZ%BHwb#-JfGEA*s0lX2?@^~#G_%5<)@(6943x5_$ai;)kK$X9i<@BhI_e3!U30)Xy zj+>C0C^8LbT8wD|uHVV$OqrQuvV5=>6dU0^Bs!&URE@Z8I)(kS zLf}Uh$_hMLvJ6NA*U4*@yxT0J$gvKa8V1bu&a&OHKS7QqSQf9tSxf?(P$byH|QRYASKAT&)ORakD;EagMEwIiNhbwCfWou+V=R@7Y20^0!9 z^i*wQ-s2AaL1Nx*Pp^CougyHgI3}-jvW-zon3AXdnvxrvr_A@>)O1@`;y@E`jOWss zeBaHt9}Z2Pqn)EA$`mQaN%*2~q_a#H(D%IGEAf`KcLa+{ZzeigB>kM?1XiDL&IwDj)25m2TR`|O|%5=Z;Uh> znHD~*ArSAL$~RlUPa|Wb=WDK@Ye8v_a3Ptx$KxujWCl|iP-yiQb%ec4u@AD~HB>s! zdDk|i78>kkc>iHpi&Q~<$vfhcj||&nOONwooCfu1X)QAUgLgK;1i07Y-N`5?boA60 z$K^3w=#OT zabuqo)o^pObPGC|ncJFrFFC=qoK_zi!a#0S5R^)ccLDh@t(*(bX+cQx(C_`Ow$2LO)R;ir?%FU_@wBs;po#JX`l zqRjFqTYRt|L9@EkWUcSzwD(;wChti9r}gid2QHh{BOFGVVnQ(|WJr?-Hnc{qp@AF( zK<^JwGv)yN=iAe~_z8#g!D2MFhQKVTPNz%cWm%J{bgG>W??erP(N70!Od(P2@Q*(%`Q0?7zw^?t{-ca-2$QT@QU1OXj z)~f*CrKPIJI$wBfeB@quyr?=2C&DRNF+XwyFFivog+oQjWu_U zAtuhDf_GxUnKw#g{mU}}Z`SK|OwPA95BG}5>&hl{-AO@qEA?btF0ym@$8n? z`|yDcmJ7^vIs5Z_A6H0)^hl&#)4jXeyE8zZ|Ha-tHHiXz?P4F>wr$(CZDY?K+qP}n zwr$(Ctvxe&Pb#VNrYfn*MJoS`Gr#o-`f5F0-MxCCCe|THo~@!3o?nkyd@bF-R2gjS z9kFGC`J;7qmJJ|>2QU3N?r`PR+fSY&!yH~*ehe{%tzz1IX%u?}yl3AYU!M#iZdxZy zMEIL8_&Gt>u$D#4vM(C^q|U7oZ)IvzV`Q+i?YsVPHksL{gkfw`mgWpIC*g8%yYcxa zJMN zyo5WpXxP>tD{m05YPZMeJ7u7%Kb!T@HTH|G`UgB$Ul1_RR!>J)OIJ%LU)U6`+ZA06 z-J;%05WUkt|MiZ(t$eH0{`C$Mr>;1$Y2k{Y^cY-CCvdThDfs8{Fn6CJZ*j2>elLZo z)KAxE5NO7)WVCXwP&^M#ejeY|Fj6@WunR&?2w#zR)WaNH&5UDV5ch(ru*?A;>t5sd z{SA4g>vDjfJeS??+s)>DK^{&0C|C9j_io{R7@l88qr>fH;W(F;zKX8rr}{V;UhQEP z3L{%zOV24;MLb{rdIm{~sj(?ft*DEw(61&Usb$&U4MEeWIR&B@zTdQGk^DI4~sy;DA!R0tJ8H zpK2sl7FA>ff{3%+z0($e&?8#Se$CD|pVua$e?Hpfz zel?=c{mDdS$Ng9xl-$|a8(+tl;j4HAC5%TyIxv0Sw|h3M;J4+!;n=-jmMziiIy*GB zDeRM($I}mH?u}jUpf=x^KP|9H9{hskm1W z6#qnWChs*S8faumFE>!`PVXCIZZj}K=A!ua!M-P1>MNOFC{9%Gga^Pa+ zZ3@&MRcu#8D$HPLB(AKu=(_#vzk9x`yWVGlbKZ_Fo6ca-w65{1e~9YF8o(viP)Alv zi%yU8_A4wWI*m{{8>WLqFPFUmlf*7U=zswxKs!MXItCa_`XG=gcQk99Q6^)|CAUrFgM>xRYrPJN>Ba3sBfiK=y6ccY zhKM;Plspwwsh&<)CQ&8qKrW{N*3MFyWzx?CWe`QqpeSk2Kg=8gEQ3+0eqyhp_?#M? zX-QCQx*lz$#&>HjYAD~L3>{*KUR4N=wx2iRn)oUo&5ba1ZVtnA_K(;w5;Ab=!d4VP znRSebtOv!vvH_@qWVH|^4AG0eG)8WJfTBrjQR$cEB`~4mc1`%RlX*8A3DB)>sqk=! z7G*-*KTobed0v21CNJ*Q_0G;~E;sLrzBTADSNS&kEsrX3^`d#G7Nw^w(O6?aMCF8S z@e&BuYhW~AIg=%jiLMWRI*ew{AcFB6DvceZeCJ8j6sel_duNYfj$d7Vb@UlJ=g&?3 zmlC2%ZD`C{$Txo&zeZdu;7CP6697d09?%vd^GTyq zWsQGYpbS=9JzHhU4UHNJ;pQe;1XS@|uCgF+iExTKAto>b$+kJDQxp0W9`4u;IGyQe z8k$fK3#=n4DGW;ql?JXEQ%b4jK_ z0=Gz>1GT9;c2^Mt>>GPb(`)5|Oj}XGBGXur{YoU_G>6*uo4}+4pBvHC^ua}v)HPdV zCj{EKdLIcux~VDkOZdweK9$%Q#9QJ}qoR#Pt`p%-a<#CMqY;kX^tfCj&D1GO=WG91 z1H{h9;RMaMD4(!$vn~il~RoaV(si;JCUkDn_L1FAfz&%!(0ua27XVop^>TP)=MFh-|yCvaGXR z2HB8hTi3Y(-uqVftEQaNCRAMa+dEjV&)Z}Q%O5RCx=rB9q+{PGczZ*v%6 zNo&JDP*Yo*O|~vfkSeeWHU4UmH@MqST6?i-=Z>6~ep^o*W znPASA^i0Y=S8rm8@Rn4NI+}rImXqstcypJtlc1NUF({YpL^!2gV1#w4Ui*+Xvu&*H zy9yf}RIZlOw>dmDbzomduSjdUD|X?2KGxdzlGmB{3w}JdkaPf1xzb{gu2j>jbB3Zv zWA2%FoanbN#Os)ybpw_Jl~G#`cmczK;cj%=Qa_p4{l6IxhJ~%FKM=CBAzaXaQPxF% zeJb;QF1hBH8IFq7M=B2Q`G(~1y3W?}TbVm}Q=@ zx+9C4+vsqE$Qdu#*z$-l+rqEiPo=rMKzIOJ*aL2DMJN{0jLwcz&5OeY=+*D1sgKSP z^nlK=D8tUjdEA&?wAMTG^xzNAzTWkWS&iP^)A0>Nlb#ZdKTl1icz{R!eV4b1!Q*?s zcsN&!6Q_9*#qvr!N9fw;fLGz`6hHOR?V)?{IC9APZvUl(k)gP{^a;asG<*TWWOJdHWr5J=kR>oxVf;D@9(EsiH-xfy_wbtQT=JiQNe)fYo z9Ji~=5mE?<1lwiZO_Q(-TUxLoCC;%*cT$59yOC{-Kp^tv2%8*^&wd1*Zi^_1Iu!LA zn&><5Z2)k{=K8bjqNdgbjv9p!XPuY#+2>i$`OD|lS(TJBm_qb+XNKP8C3!5S6%YTS z-1o%D&eh!Zm0X;Eiw{8vs=7Bd@<2S+#~mI!_)TLMW%u8p?^DByv^x9$wSK_ae=dDf zSZSVpK&5#Jhh)emJU2td`T5=qJ}tywhie_@f4;vDU-5AV2IP<2H7|O$wvy(+eW<;W zYouPmKCb&D)JT0x(RD=hE|C8Du~s_K^)uk6fv;&B+ER|QK$p!+yvjo88q~^gK#)=s zIvwvjWRF7uL`=UW=#i##nmE&ztcWJY^%^MkgY;dj-QqRJY_+qruN;Tzg@u}NRd`)5 zpq~P@KeSSS5V#nX9t?y*u>)~F646!>6S7_+_VI$A)&^iAp&6fLvl)sg4OU)-Fn!Wn zmRxuQaJ6&v6lXvg0=k4)dtJy?kc|xE1Xq%25J&=nHQh7nDGkG4p=lBzXZ zlIMMoMhrOx^+%RUIj*MDjq#L?75PZ%Y9T}ukv67oZC#S8eXxP!*cuXM7b#K^f$1#= z3b+h1&VQDGdQhcc3d16v~ez)5mPP?I1i$RHrXGqAa3VGNE^GzB8h)p3hi8MTw+ zAYdrveoJsANc1}7$dJ-r4l5mSY_P@b84qU)P)2#>1@U5PIs<9v7b+8Z`|w_ET-X?x zYbsSpkud52i~|5rzzV3#{^LQ&tkSbv@`F$dI459c3apiRRk&W0 zwMKvJE^vrT+V@%6k4K;dysf?OXpOU8F?*E<%>=b&^E_qbvF;_K=B*~BRR>Au4|%Vy zO){k(CQYq~7G)9;cX8tecZwWiq_K2{gHmpEPSV0j>GvQCR0S%_PxvSf(86f#M>rYh z`R)df-iS_hL!=%|Q^Nd%rQa#~jW$HGDXf_rRf;Cgh|rGW(DI*12xB>EDcpMIoR1rU zX%cOK7ETljnGLyl)G9d5>eMJ+VC$$C&PtbHch3ajYW1Ifch*;=G@bXL$7>08+GL37Y zCu6smFd~WnFcPY^zxC=)ZZe}&aCOFdf>H||lD?0?pS=D7GK7j$%|d5uB;MtitAX(O zC%1>`QdmR5e&(QCt|orvvB{QUByKfm+qm_wC{AWGkt35~ ze1MtNr5#U-@gogkzCqPk*(an;Uj%uoOYW{|%{%LEaQjX}u1RZNSK%P+vtFN`joL?? zcN<1DqDbt~cDB6j&Xvp^Zam}%6zhg*L@@pFR?rH?SnntafASD90Jj&-P!5WeV}s74 zQV+I~OU|mWv86mQ>pd1u6V zlq+e|0M@)_#5+UF`ayc3dG0F0{IJ*V!;bLAPG{5`3?kk&nxChumfPC`1Ex*+XaLtJ z`6clVtwpjy+JwFJs~EjVgO-6JoOSzTc`d}~Ng1fQLHGk(c`zyFDy)y?onuEf4Ij22Y#X)E&X@r7zl<4MI(5L}mM9el`6|ZrTjoy2R-ovyBp57~>~R@x(f&|7*_(i)CdPehi_mJhD+6p<2_M5moIiVdce{!J zZHC!91`9yxdZtbLVA^(Vu1)sSD#;V8Aa5I6ONk?AlYq@Z=Euz{UMza^5wrO#7p63q zA*&O{gJl752KOpE-twkZPAPIGEfEx21^V}ttN;|IB9Tt9byaysLpbA`%7l&#m$C8> zh?=6F%#ILY=7vBRRUyYw=nAOFIAlr7%>DgPY8 zsQIEBf59H2`SK%bV?Kf4UmolM?%XU`>;F(6TRn*;ll;r0T;@?XKtSDUAJ{2Oy#R_pOg)?IJmk+|gim z+=$-*n=NdoWt-J7r@;zl(QBWhbQFH?8-s~0(1O?P4%Tfc5S$^`8M}p0dP(-LFUE<7 z5gushZpfK(m@2XnYQ+%LmT(+vJ!mmGGQ1~2wEA;vK-!5rr-f(aYHxgH&Kf8_xNc49 z`g4YxC+I4q_6N7o21xm{EiPX9esSs@{rh7&MwrpzU}1M*ceb#O(J|3y|I0kvH+?AB zlPlwUEl4l1$93wg=niBMS6si7eD}Y14^4hwq&IlvSG*sm)3_h$hzumhS699d3(woZ z>QQk1-Ce$o_r2_|>+QjRkNz0jyPLcAnz&(rY}>n@Kl6k)B|QLaOe|;m!H;xV(j55b z<+*+5$Z({Se|2LHX+x$OWTU>F>ocpUBUQaK+7o1Oy z?-uM**$ohmCQ?8lW8jkVVwDPle*l%uTHH3s%V2;90s4Mz2d;g%NFb=3N|j=?VrH(hpIwhLU9*ofS63{!gj__u&Ucf6#-t7U-Hxv!v;R5~ zj222e_qKwG%sldTb=L8&9%^TmvVj% zT25Zzdw7`ubI+WAzA2V3ml*#&_XmRK4i7@|@L9tU!@QhPvO8!Z`$F6}PmadoUoM|- zyT{5;o}{@jgyxAQC?p=rU!q;3s9sa^?LuOUskgKcguNp&5;r7{8mXGn-6ML2?y8Ei*-TW z3S1H{U8O@-{+e(w45!$NtV1L!ghV#a`pPs64%10=e|*vrt6mv2B}XksU9}#a%r=V)!2FDY zw9j%jzDID7s`On5s)sngamh2)OH40zL6~w_(}b89Ud=v+g5+J1VNBR^+4;lxhZm@f zG-lpUgH;804K8nDxi8*yg+qfhzZrQP1v*m1dBnd$iWFB|Y#Jw|lf;<6fy-D3aq0G2G#MKGr$Rsse+ z!W%3Y(+Qg0l1FNb03AgZa~2ePQee@svgmp8s5jyS3qmEv4hm!#B?Exf!w+-3QUuMu zEWd$_U=J;*22C+OG;b)>^BgsASRog%mu-*xo4d0BIX%l#~4fNISX8sgvUn%*``#t<^Al;WK=SYoGp-G^jNXLN|op zkzC(F526bwtBGg;TZP%m&^&PF_5rDm*lVZHrnfKC07W4b#3dB>q$XJlOlqimIABQl zUBJS;4t)9OgWd%fU{yjNrSzJK~{j^wXoBx9|A@j{eTd$2n-8gI|r)$dhgO!E~ z@rQK|45oQurMTPyhXe(qgXPiVi!y?0=ZfZzg$u~GAcTc*4ERsmCHqxp zD_-onEe}MU9?;-$5StLCf-1ul*`LoL59~fL=4GY)3`vQz=psyRt!K>RCDTE@J1+4) zD8O_}2Ad4FIhH5cw!zEv*~c1Y2StV8hj|ejpsuJ**z(6XKWVYZF`3RRP_4pDA$J2j z=wxDDYbOBCs~HvxS$%cT#L0|fCR!*fw1O#8(=-P0h_&oKu|ARxrt?Wa!DM9OCir4T z`g`&$Mqlo?XQHXs7~A_`2mmA?32WBizG<5QnU^3N*$>#xRCg(}dNQeXNu<50>`WrQ z5g4jUQK+FZD?bhYr+>-ly zN$N2(E{A!aYA5f0miUB7da2q1KAn!m7c{ z=+qh~+M+zWFvu;2(i&Nzopg(y8sBWv0Dw{UDKLems)eNuUWVC!*Tun7j;&XT1)CoLC&j6$ zubBqgUbo2SqnW{x_Fy=HVn_Oq{hciu6v*0i_%wWTY(#UyzaZ8tj$RA$cef$R; zE)x0;UHG}GJ?ky=v+G-ca-HktNqk zT1+1qelzfc%DW5nIdgOQMANSa$@pIX-Ltl}zCFFCXGrdg#{2Hz{+(N}M^gGf8M8AoH-=OM9A6Pg|lLt@nQVEoy>}kzGOt+wk$qx z_cxz|qe2q-OV=V#d|Mv}Z~;PIm1;xH_&-YKNm@Dc(-9V*@4|Pd6=~;B;2NVlm+$=a zBwcyJI$>Xrb*H)WTzXC)=-MMyX1+D5Qyve#lgwr}58~|qqnO*@Yk#;4^Y}iIE|>|2 z2+-EE_f1|4N8v*{iI-9JNeez#US__kAyur1Bvr`Rml-uHa#ZU5Y!!1(sic-OEqL?; z<6*^witSkE59c807|3Bw(~wk+w3`o}$^tCJ%~(`<0177EfSRQm7#9()uil``b+; z=AF8x@m7vZiF#}U+2f#6d7AeXsPdDC%UQ*ubg6QcZN}D;nv~1d7aHTDZdSZ>6GRou zkQ)*f*buOFk8~zb@R|z1tFHy6c<>CTDu7-a@Zfp*y~!$&oAE@#H&x>VkD119L#n|B zGF(MtY_Q7{;o^h8!uihwFSzc{2$GA!OL%Jm)i|AUi4#5nC#8{`0g?@lSc*fd|1!qC zPRoX26yRXoa)}&Eyn1C4W$3YR@(#x6kC)b!sR^o4s6P)zbRG1?54V?sm$1vnfNX=4 z`9-OlLv%Mp-KP*>GPI`{!giA{R$&tXk_u_#3}QivO0^?8#?X%9Sg%-VhQ0Fic^-q0 z_YV@RHMyL`p>aViCFh}xhChSqcbB8QWaLOg!}ye_dvqa(ivlc9Wk?0hdjL?Mt;9pQ z_->sHNJ+40ahI2{TMF6}m{U)4AZ*h$obUn}$tgzWMB$jmiH+r72m$mWLB--2F_v`p z$n0wq2p1=uF*IxD;qg-POcH@fDJffM1q^67-Ik(l2Yci5%4Zofo8DPWFI)Y!)F!3P<4w6>Gx@ zkxQnOByy%Bl6(>#mV-vQhQab~zuOlPph_qd2R`ZP0u=6UM&UcFs0TbRGZ#L!S0Qf| zB#me^$xlL)P*j0|84xpJ0Hl?g!p+LBpeQoUR6t;CGfq&M$K%S=3ADRALld(|7nx@v zP#P%!SiyKoC(mINThz_z-%tJ2&hEWrMut--UnA42&S{Bjq8}stqs5A==*#I2>V3&(_8-beiM$ioO=s;h zO~POyHNGqe>VcI=LfRy0+E(4%7?V~|ru4}MHGz-l6WEc#YAjtSkI=CsPL?Gtd~^i)~PqCeIL=LY6TqCK~!&1iM`nbA( z7cDAyohjVDzj0&fZygjFvW0gI)$;gx?2IGZH21$+mCXa%yFzKBB?2&-duWBzsTd&w z%nAJYYxabFpBN#eI1Ax^9S=8?gvI?h@TbABw=MJ_qyANe3+O+qoFPaTw|DTQmzkdDt_3PKK|3w)6 zxA*_kHaMaPH*&KxS5r4`DQ@g8G6&JfkN9E!!2Ut_gaR5+N+<)s8YZA>FfDb0gmwg@ zT>#*E{?Oti0u#^#_aI^1p+^J$_=+m3vrkXE8;T?-glt;1<`LpLa6z6 zhIf;OViAYygBLoS4_f5+%*5%}on22WV{r&d0KFNJ*Xzn$J%U06{XYBpmt%bfFb=lP zG~FpWGxWyD_2DZcmwW!Ux7r_UV4LTfLp6B_Mi~)%Lu1$5>}+amPh^SV({u^_?G2yT z3p$&BA}OXyQlJ%nF@8!fL4GwVQgC3vP1MV`!Wo0qR~jgwUj_(gjpngi0+I?)T+!%7 zpe8}_;`&NiTng7j^SyBmel>nNCuh!X9fNDZOaUvbPC^|JF4Y4qT4nH(frj*2Fi6V; zPz*+5Uo?|Q;(UFc+XjymC~G8~en#Ne^IUz5QR-4IR9ohdN~Elra}wQc@D7O*dg6g> zDU(oW?~E{#z>3ZyAXp@|qiX`eI^uwcHzNi{rOBEWI7*h(Q8G&hP!2}N5?a`1rm!+H zB{_E)`r7oE%T@x5<7Iz&2OVv_bt_q23JJd;p<50r!i?oCW!Om?Gg!IGrBk&^I}S;T za`plRY-rO%=J^ZERO^>=vh1?b35-G2O)!ydNaLujpCqaQ zG=;4$q~lo`X(;2O6x6}6NW;veiO%XU9F?H^pNAIw!FVwsuJg)IEHtNJ!N{bAs$((% z0tucW24gG`aXIDUf>@BD@HtJ#S5KDz=!AikQk?qe6p5&dV}K?&g-uMXf>e|1s+*#2 zVrvjplQY=$Hx$Vdfn4P}nG7w=#h1Vmqh&BtD!`Pa4^QBPY6XEG@d@=e1cw;$UpIQi z0pcZeHI)(I3)yR78euGGsoP))sWN7C5G8wfB}e#|{uPZATo^=$64z68j&}WW#?^CP z00y^ujPxEkQRkhZ<_sYAM_ZemhZv8!w<@<+QL0ZjYP9qn$vmC)c%=~@K%M~Y2rj!k z12`$3#-6qvK&$W02{f5PxU3gAu7jAX5OO)+S2ZtD<_#s^LTWLScaK#RvtBtV65txG ziB}V_b_qA)hRKAqAjAlXbVjVkiDX66JW*f2LQj6fA=jTF$$g9pAC@CvS(=nKdy%3P zlwKfDjxbY#*fLis5t21$6=TWFX@Z87&nR!?Jj@R4%Mj<`2zoVLW{}37Qh>>lG}D9y zNspy%mzBIzKUj8SOjF`l+r(S%Bt5{!b4fdajqwu)O0ZXcPUFu`mu@Y&8#%B~b!39I zAZ|HZ^6~iwG`{WhdgVQNAzTjlS6X7XVcRFt3lTImViLwZnli!`qF;f3zkY*qS7t2C zW@BI&C3C!JgPAcwz5bpYR0YkJ(u@%!Z0p}?7(k)J^!e7KG7?t&%#uFgId~n1IaZK% zg1c&%I_WtR&^Z-dMo~0gP*iYuo^a>YYJI1&9m7~PZg-nFj*ep_I`NII0{I7yi;>Ik}}@TSv9cV(Z8c?mC$Qqz=f0S zaqJ8lKkT9VSEit9{Oc&rm2#A2;+lo7+ms?0 z)A1+j&O%uIcP2 zl~m>NEae!e)EzU*m6QH5Cb*-i7&V2Dbf-<1#lT#SQt0vJweV&tA~YdNuPD;QSGDFC zv6X_O;FHDA4SR^AT28NK!o*49eA&s>(l;wC&L*BX7>Q!sX;iC<_eROwndZb}1WgAS z{vhyG!qsF*_yz{Y1ziqug(y~{`BTW^_39oHfo3^e8k)vRrI7nQWK%+U<3zH4F)+^Q zV09!x(L9eljm|^c_yme?ShaPb2?ph-QG|1Cs#pEQ>eC3_s8Za7`p*+dEi$zsY}#}g zKs9k(%2%nfiM+s(n_TW16mlMP$Sn!dC_(WHe62+jqOI<_UJbq2QH&U&JGmM63z3uxh8rk)&{dTL@L-%z>+Pn&uSJ|MuMT_rcD zGFY^}!QvPN}C5!dfHi>gU9~4)9x_OX(k67zuH|v# zY7W6^^BfwtFJ>5q?JsQPp0)r)y`U9Dop3V zq`TwwUv2n{euaP1hAa0!opgTv`t|GAuV4Qsr~h{TFKw$Wijh68^SLqJ-6N;fYPmz{ zO(vU}1dDB<^*_e{QBiP{m^7<}V`Wr8LLfwbgQ)$ZTls6CUvHxB{D$Xvo1Lm$3R)4N zQts_N!!w)yeu7P&C?pdxa=q_5s7sn~dwX?#8Q!Zj|83ItxOW*S4;~vFC*O#Z@W{G3;1&(Mx~X@|8Jj74e_8{4~d_DbyAC7?Y38B7k%iY_v;Sd#rdDz|4|Iz zgJp^PWw*7wFh6}B%de{#D`jG-L7y*wk2VY3K4{po>^)vRF$*tu_0EbBcoPi7&yzc~ z(R>|hdoy-^FgmkOKdgURs|Y1O5ffMlhyD_g*}}iT_qcia+A%E2-YZjOw7R_B@NR`B z$rhC-G0i@wEJ-zQdSJ()#CO%2o2b)|RSlFEnRG=bL#3Mvs5K*K4|H@KGIR*;VV(^Z z`U%3Mk*s1eq^p@04;7Gw|4EYySD9de(9x#a%YZ9AEpHIs2QW++Gdv!z%itq*#G+1+ zQavJ4O>?P}IrxVtzh^mdqO{ma^;usI3Z%-(lj%VYlz_^WDw?kzXR)c5mj=q?9F32w zEs#MQvr)GeQB6P3@Pvj&QTA6MFa6R9BwE=b2~7quv1^M{6iy_Y`g;6%i*SclVwX$! zoOKlMNx7CAOAZ|k48x#>}pYu4Yd)GCKwv+W*dw4NL$@ebX!tyWhWvpoFQrB(wPwf z@ZSb$z%;i7H9|%jt{m7d=I1IEhMqFy3{&Wetblnp7+ZvjBV`lBXXG{l)6znA6C2yZ zOP|IrCDUGb<`-TA+)sr5PDD~GV4>(t#%E3+=_nC_X95s(ibnn%oC7un*jc#i$(!lm z)r*g`${h<_`~0dQwmF&v3Gqf13L)&uHH0+E9I~4cK=l=SXHI)ZWUmHpONT#p{g_V3 zs&{=4W4&ka3Bq%v@?w57;|jWdvjrE^dC6OgC`{O=hYh_0q7zBDh=KC?h74ieJDN)7N0extWn>Q5BmvCZMD6JMu6vBVxgo{4<^v<1rp-xJBP+$!Fu$oF82$SVjG`hd}^Gw3EZs<8y@#6l8_V-(PYykPD2 zch77}1-_n35A$5zj@^gDdS@iE(}ITKx?lFQp1h#$C}fPnb_nL7aPs$LqAn!TXySyD zt4QLZ@FS&~M{eCmyQd}$7Tj9fS1m_t^QNt74TvrwD`t|i+N2&MkwAK zHM1PSsnykilkJ>DK_zVT3X#=&wkHzEqr)Ypq3=|d7D}i5>zh;H0);W2p;I84nrn7! zy=!8=*wpSc_z@D6br{s%u=22TG!*0bH9wP#J4}%#5R2f78RuI$0!kSdMKT-#=iRtJM=imD7cVK3+KOf; zsYaK~=71=d{{D&XAYD2E#UHgm-Ms76V(UF@za7|#7sYz|RP=FD;lL**-7`bD@Mwj# zjEvk(jjAm5aQa93FVYI@1(P%l2JCWnL}**{3sRw$3KWh14=Ws+fUiInL9GF!)ZuW{ zx8IZk1S&>-RPJ?|CD{t4X4hyxdZ+;^g>5K0PK+uI)FB$E+8^E<@-P`Qj~3^1l2epI zU2f&oLMBY>%et{B%}Tn=1qtHs^jc1Fj5H>0{Tr1{0hU(o6koQ3k5IN`um)k8xML#P zv2e@0U2)?zGKab7EEU^=C(U^BwJ9p@qP2za4gISXx6Fm?ZrhO0w^i$IJ^9wXGg^IR4{M<)dVOp=u%uel8V|~q zp|H(G<#=@y^##cJPHwLUle)*VnVmyhS8(vbPyAarysJ|B4WiD@M(!qcN$n=Yj!ws0 zLNA-JUci4^n(Y7S-v8^@uV24@{rX>%$p75`XYAT;i6D%+UgCSYa^@zo&CHh&K7C*> zk;!7a0RRg5ag5bl$dbDi*9)QyeVVuI5iiZh^J~71@p5)3} z1+Rtw1_qz?RmJsjbaN?sh4uY;-u$V?{TSZq(hTgn_)()(G2s^!ElI)}sc>~{=zM)X z^i1q7mtCF}E6)9UyXD;m{hZD;vgV#``qDJxh;4-}s{3hAn_G>_4K8Fxe@=1n+P$>M zHgh#B5W$3fj`Oj?bg_p0jCiKltBu8WeD2K4PalNM5%jQBBWwlhTAiHe!B9u}6aWau zX1qHGY&FLg>#=T{n7xN7eg6Xu#UjK=0a%ppJ3gYAU%M~k{*Vw*c=j4_OmNtEabEXw*@d+(R@dUKBS zFl{jmOWY`wa(&3+gnSEU-KI9e=u8{NWJiESR(wGjri_yqK%9^{P(cvk#T;VF@=Vm= zC5S16JhXyh_3?b@2P|s2!T8c|wbe3FtxvkvQkD_is=5%Frv)i;hi6JIO2d&#w?di< z@I6E_m~pW&T8EiiC`;M7^|(Z>Q)Y{-93Z|(qnOD)GH6bWu{v191>_wy^Ov?bNbwrt z&LDqfeWG#(XV4xE^tzZfBu-Ez!`^H>QG*fiv-P<@S+JwSSE}tqKqR+wTqp}j&e{;L z2;y|91R3va&~%RgM+vP%Yov7=O)Q*?!~a~DvE=imM=;$J5Etz*QBc+~jnK))Kq*{F zECb&iRh1pf4?*PTUKRXi=B6WAx=5kcxU}h7eZ*d_ab5m9BWFggME% z9mAmo#+h4zl@1$3Wvrr*M`0l=07JPAuRFX7Fq8ipXUVF-mAlg#ly^UFX@Hz7V-V2h zIHH}lL{+S3)Nb0xhEBmdMbsXOgSU;`4#@t*?UPJb*AjNB&tGSgh!na%@Ei8xwa*pl@%3^%0p_5*@&`#r6pAfNqD*ugIfS*(;oqm~vRBU!fZ_b^7qAzrYclOd*+Ssbpg*G5}e>o8CykoVFmo#<<)AkefIJ7Q~o- zEx4Wsh^D(0<*(C3(S6X;&tv;R`h1t!jV7wnaST%abQepu&^G>_&PZSn@7{bCa`ta; zf$z3o$KP2@l}K~yY6qD(BjG+Ihq|DCw1MFW8EiX#Tf-ozT zNt6u@r0bYz`I_g2;%eoc23YE*$;ZfwvzjC7i&;y*rF^)mZtr`zS40^OUj2Hvm{br@sM9 z1k)IT4m{+Mq+Vit+p`jM4l@#>nRRBghg#@7z(pp_sV9239nG!inC=lA7FM(g4b7{b zxyHS-qLg?5CHKXlRUmYYEdCvM_m2~mYtlDFy?C*<4s<_SqSUyLYSjy)iMpJ7B5=s5 zmwB(QA{OVy{I!+`e28OaFxr!QCgPoeHU^&BWIT1v_k=(#-9ZCRm{YIM+5ys zpI!X+TVnhz{(n^z|L7a4vu#T|pV(y_gQKHPBej z)OzbbO~D~wD51!UN3dAdn(A=7o)}fP()rw();*l8PVZee6T8p5XIsf%U8nJNmwOwV zd5`UvRdthY{%(6ioQ8iOtAP7m{il2RuV24@{rdIm*Z&*f|8xFdhO{k?D1u+-Vk2{B zBR98I==5YgG65ulK!BZq1Oft3P%(jM+&=(lHG^Ri#lHx7eh#8K4hMbV+~_uT0O9<7 z{Co6yM*(dF86HlvYVxmc)51U~;wv(pl^rFWJrzEj#Y)8&x@q0~n@m)ndk4+do_nc6 zuzK0nJzq03R@ke_3lkfs(96Du6QSsJO6A%vs=W8_wl6`=qp#4P!CwPDhP`$AZLd(3 zR9-*iT=UQ0@&W#H1k=m;}T@A3Gqpd@3#QM%Bs*KqMBpqP(l`i7W&uCM4rJ#8*Rq7H3XK zSauGOV$j8G;3qsfVU|63T)@e^xw1$46m$sV!*UC{R8!^yL+sl^E;g!7 ziikr3#yl|I0+ceg6sQ>k)*yY5m2iXvma$s6k;ZkxeUlf${86QK$tNge;3?3H&qcSi z2jgtc8M&>oK&ApP@?^6sUpey3kV`3F8?-D4c8`xZ+AeIjLDcu8d%K2#CztVbNv#s* z8H%Z6#(B$u>k5VhrChZYVE0Izd&Q(wa=?luUm%Jhb({(|Vz-tVq7%)S4aTb1LBQyi zqcyjN^Gb-oec?U&OmM;2|MI8;cwpJ$9s1wcyQf}JV7^WG%eHOXwr$(C&ArUMY}>YN z+qUiX-e>PKA7JL5O!lt_O?ue0$@NduRziq;^_oE=Z61O*64)q5@D*+ta3Ax*X9TK_ zXPHnK9T5Ww)eO$clqJZ7g)N6ZYlkaSTK3ga8QFf zHI=d~JjdOu+pb7F0trMh6^JIJn*y|(LHKgggs55&M)r6mMUCO@8=14>V7NRtHiS`e zBt{XUm4?-BPcAGpE`QPyI-oz=3UPiJZmEu1GeXf)3x8!it`0DPqXC1cES;%>D&2(W z74OJ2UwNTFrsTtgPS`@FNfx^VJF(Z2nMJD%jL&|$62%{Le8mV4M1;I(i5DTXu5Wv9 z@$=}8v=;%<7XX15XEj9yJBV^~{4f*@!kP(xI)!0vL)7vpCTw9DgK}=a2w0MB1GyY0 zk}Q1$mbNq^MyZkuIWQ5 zTvNh}R)ve+@O0|=3TG@^hXt2mnokpkfk&DF;E*97o$gR3vVmg;oBhDK%bBalvrqwp ztsK|i&_u%yHLvx)q*R1tmTde5GS*Iup-Syv}SuFV)Q$g1&5$bCl5^ zg%!&RC-dJV)PP8;K{XZ>k37$+V~<1w6QpL!j2b%uUCx{gRb(P8&|DUxpq}-34A%%I z6wp?n2Gw&j5fBW@c~ViC6$sJO8t8q@sve6xN!am03!(;$Gaw*81h>DCB>1wIP zs_-337gWP88`8GGeP!xv66W2R-8-3K9G#HrSPvbXuY;aYdjKbQi)Zpef#SMk1amuJ z>6)xeOlVX<#t)_a&szyFVt&TinY*7!$Mlaw^XO;`z}CA4S?E0o(h*&#tfqNXqw5)p zKTUST$DQ~Y2bCLzwn_$j1DIK;!Z>%uNZgasvVYbf`@@0*(RWU7Ch|gR|M+qCt}GyI zPri3yfg|FCZfz*l6k$KJGIvQ>Q;PjcH*V+#A zHm3%b-Yww7()nb?8^vszhy%p}C|>4#=D3j;v}XZgft8&n5sPWIAi6@c>Tf{H@P$xw zZI_~?=%m8x$IZOUrGex2f*uZ3>v)p<88?I#sQ?nb4E6| zB;Wk)3`hksMCZa%PG_Vl`;OPWsBhC=p^THbjM|ybwx&Mx(c6&1!$nHY(7q|_^$15= zC%U&R{y^z7hUU+q3lM(|W4?aB8I8c?4!d>!mWNo9>@9FLrAX!BbKP~$&Z{6SLrEL7`#*3S5{A4Bl zUz6OC1BG&YKf6eU$&TF$?ibFosy0A=!Trg79rq=a{FF@JMY{!-uJ2);&&m>r<}Cy& ztGB%3*#YDj4OFc_z1TNBQ@P$}niE9){9>H}$dj{R^oCxk@IzLC@0pa72fz`IG<6*QLc6a< zU4zz&tZi?0M^UFqGWkWhXUziU@MdkqLgdTm9n77-?)&MmN$P*Za2 z(%9VC{asJ#T<^E9Pk3MJYHz#oY_;9on6*xZe+dg~h=-kop0d19$-t!7LBU{(RDscgGl zK)tU^_;jp;xBu-p_Rl~6{PWL0|3^UlkNf|c_9)^AH)bn2+1uHJ>Sv zb%_)y;UG}&fM`|WA;E}l1zQusegb|94+-u+KyjWg$~oa&s>`D)_|{cJV ztNVfPngQBMy##tCcEnZgJsE~O7UYEyr^B_7?rK;&?mE-I-?Lpoc0af-&V(W>h~3Du)MQI??pi_B84g0mBmTEgiG^^k;HjpOEm2r?zcHwHmYI87iWSq=;~8r3VsS~vQ-zY!X;gxPm08S zf+>OGsI&@~#}kngmVb>c3SrGn2ILO#xVKcWl)==Zn!`R-t&3UJzj9YMzRR#1vTYQ_ zJp2&yA97j&5(x1$+w}EWkq2kWjn<%&B{!T(Cgui=vYO|j4_9g2W@TydVMf+b4yY&C zRY!ds7Va_vmgn@6oeQVLM*P9d4_=Y$eKbFS+JnkWtOQevFT?@{9%chdR78i?0s44= zxY9~%EbVa|8%<+Q9W@7AS;%pXPlc78il$Wu-Phv4V;bB>rehl%vf??GG2f*efXmQL z6XF$ixS%irUeqCgVD06-q{hUsIUn-~-!Mm%+FBqp4)mk7f#0z0Sf_#ZlR<}LK zHayrS%tn$8UGvVzHN+wn@BAZV1jio3g$_ic9f0jB7&_-BXub9P3=V=NkSU&L z`E|LmkTm}X*+jR=RFrs){qLp3m~jPynGutUbgyZ@=N?x6B0^6oDR7l!J-{g*N{HG{ zpL(vF1u6msEO@do;3n|)y2o(>QT$n23M>GE85;&l(l0W{AV2V6+(A zwzGeFuuF}L!kG*35nKWVH&3qu%;=O*H7s3ASQy&w*KJQnBtckJZKVob%FjK_XK>Ps zv|=L`<^XhCx%8M^2z#AJWU~;7&&HQK-TGxt*tf~1VWks5v@_C_cSJO1H!L+Gvr++> z$(#;h48L?DAsu2sN;vRyJs>=lVmVV>s%zaDTFy?#%GvN4N{URW4o7r-9|oXL%r&w* z(kwR8-U2wE6COa?6F(ddY~p+1sP{i07*?^Gp8Kff)s@SgC+s=chJofG{m+U}vTSQ< zEw#>7Tp7#4Y|SD-1Vy;C@{lIAME9N!flZ;^MxV|`RH~^YR^!nI2{YghN)y-C;vpVG zTlxqr96&RWr08-vHMlNZR)CoM4Cj1UoiUj&&xAu>yIRMzKkfdCv|xtcxc046{x-G^N2NV-*N3Rv)&o_==hfV6&xQ6m7;^ zyq&ao4bX|E)r3GVh| z)moOsw07Y%+XM%qE))`z^1WI{oN_9t7%S%#ctRp`JNXm(IMBWlm-V=i3$i#^&+u>$ z!;#mMp!ra8@WzilY)?c!L(B-h=#1RWV{pj)L$I@8hPTgMV_W#4_Ex8;Jc)4O@uwK@q-|7$ zwAu#{90n{TCm{z{fhXS^TOG%ZL+DN`#3@c|o9zZHI1o2vV`O+Q@q(0& zAe8>T!(pA8CJdqtX*VMYPF_nH47-eSi<>WRl!Scj;C!Z~RmqXxwxV)7GlMV?9$)iZ z8Ix^DF#q@iRT`^H*ml$qYXD46>O{jYz6<4=;yaH~(io7ha$-A*n`7}1nw_1j72NnV zQ%yBvtacX0sle)(v}UGr3p9Om*Js>SNCdnhteWhM~e~gms+^Tm#(arq5>xYb%IW z;SH-*$o@nz607h3_Z}y+C08yBR!g|26Fmya$g` z?Z2Hz{`u#hfByOBpa1<{|Nr_wW7-a96fvN3xsjWD5O;>Ao!U}z!o*~ZAJT|>Vjis; zL=piAieT&k7~y4rOhh_p93=AZ8lM(>uG1X#*@1IBK|46$6NunWU(b;d#*K=q`>f0J zlhO-eIBZp&&5WAruZ*wmGAnTk04a(*8ClmHoZK=k~X!@ zJOdkLsueV|$sMWE^oICpd)G$W0+&n~VM*}~h=UxQ~==Gwzcip+m)u>VjH zqib>~B|c_1LJ4bFXyr}GSU^BgI&f>6@m>eu)<7{_M%G(WL!FSi$h8GtILfq;G=Z!% z0B`KN#>hz%isZsW?!zTwwX|L*OWdu{(w7=kNO;W~L3N@;z9g;2SBBXp?OhGUVJc%= zI9~}4@K|UsHx;6fN#e9;asDNDQ+gZO4Wj-C0jh~p)vU^in}whX>@l@qjvARiGNOh@ zICb~Vv>o}+asr-_B}SBD<9t4YwV@-vZj=K5@_<*NK#_q)OQFTK6AD(Uuhr@{ex?Pm zIxSVJFYnq-6&l{m`)Z-N`%uUhD=*nM7%dU#d8C-YWY}PtFr?~0K_sdROT?u)h3JF`2Y5x3 zChZVe`9|L)MR!TK-5A4lLOFsli5?K{;Kq4G8xJJ+!_P{Z#}q32wb!Jr5jj-0ARMiL z>saXDTC%GTjITX_MJ0-b3jj?N9R3g3b7QJY3q87D5CAEeOC351Fqcg=Jn&#Y zr~v$MTv`?6scTn}eAN`XKI$DsE?%LaKbwfMO2IIWVs`>e@#!}-1Z)@&9DEGHu$D|?}BjFs5HLIemYMau0 zS`8{6Fbk?XOu!SzIo#?*%iBx1ut~yHr^YBHoj5t0DxrM|DP*8tHR@d18f7UBTD8<| z!BKF5GR(QbG}pVRLe3(g`{E>+T(~6M^b4vvJl(dDb53~91@989_#M#r0OkXbN9Ay; zROB0LPM!4$<0;BlCbx4`G~}K&SscWcACM%tlr{mucU0@+jV;p@-U6Wh9^Z`QASQAW z*7vhYv9LvKLZ!Y6-f4&!Gyx;`crtk3{3Xmw$TZi`kR}N6l|;F9?3p)DwY#MpF{7{H z35mX#qB0HqhSzajZF5I4i-9+f%db?m=2t-mmEIS(AOU-A$|jGmel2P|>ny1-iXj%J zB7=(>>)22(PfzvcoToEUXOx$s1sU!o{n-X(N$?ovB%PmH+28+c1Vm#}-)NP=rKs@nqrd~V#bgo&N>t(6 zAn27rsyAk4;P#rUT|KjbwhmBWy(FzYS8nnC@(sQ`vWO>>QqJ0+z#Fx%(Ttw!ZizX8KB!*n%T40`}<|uxxx4HxLVwD4tRAc93BR<(RSEu z*HZg_i8Ogb_j=d~Gg86b_#=^h6BnTw6hfm}-y}gpY*+`chgjL$n@gV`Fi(G*gO`m* zD@WmY690X0_Y{8sy8IiUe%DfaI4k?rj?Gnsd}G|Q9p?O2cu#Ka4xp)HTl~o&Q2Xs2 zKE0LhGgNrHKU)bkjEr}T&@dybu97<(X(dbuUKh{am=>k>OXTJm9Hq9>NQ+661S zfBh%s`x^-|c={l8APSPryD3k-(2;|IsQ+ToPcHB$cK>Y0I|}&+c*Vv{tR3?sC1;_n z8L5lz&LuaUiF`7lHY%yxHYy$SfEl}$h7-JTGwOAhpQpq7ap!v%?>_-x=V$qTpPT%B z6*Sr&AD4dMTUS7^U{la&i6&@01`D?UZN{jjO_nj>^x^ii*lGEJ{|TVDPA3 zS~+M{zvuBpX76+TWGla34$r64M}8cBRVnJtncM9~>PPRFi7hm6H=fpD;LWM)yS^1? zZQM00yG&s2G<>{`kG>Rx5d9Np1|AUVFD2Xog14&kMYcD`U%nq2cq-N3`}% zR`q4(PV4KRhPcX$_uJX4WAqOX?fp+Bbo;E*)W=sdj}J%O9>p9#k}&$4b8zq@>CTTI zJpJU#p26G8^JCl}0eSlUyVH~N;jbI&&R1p6ryjlb(cI5oU1;zhc85Lc;t8b~Je=I@ z-}Cd+(Nkz{m0dL}kK3nl^SIf)H+9wGXOF5RT31CBEo)$Ww>;V|^bL&8;?kD1wN8VG zl1Ntr2(Uqmmi*F10}F8u%rPz|ZFJ@Mi58Bc3D>tys0-a`xRMnno~M1S(AaBm#pGgudVTY=R=&i?q9d%XL~Vn7Xy&T{W_fxDY?)AG8~ z)I;hX^%pt%4gL;;H7s$TwI7Ta=mF%xGzz-ZzAox;NfhR_>IZZ;buYEBm%|?49}B zA(W7{XE`wUu<`R%#}8k#uAP!q#6kv0P3lif+s!bxW_Cro>#7SzwBIhiXQZzh6ch{ck%ed@intE?z^2u{ zeBejetvsO{jR?mYKy=b+%{NS0tCoW8{S+ocU^QlC%5%{6Lc2AP6?T^-e>PK)52~+V zK;COjB<(g+`Y*?|(1-DSs&+*)jc%hK9l$8_@eO_C(FK^2^2@6rG68_p36~^X;tWn< zd=8!H(svZD^B%GCt8^1ak(~19wMd{5!dOB1H29A&!khYLQ#zrwD7uyzYHn0X4{Qs{ zhr_G(F4DtoX)PT@)fUTavl-DsS^n~0X4Mxw!q=>)|m>AS;BCRU&jHH&~U_NkQbmuw5-70*yZMrx0G&>B}A^xZ(C z(OisRl%-ZSEDI~CaDpl(2Bc=T^!T~9HuOJSCiK)VFlWb_^T^3GLuh-Z)w357%hs{^?a=}@>d zLb_X<{JEh(>SNBH^6N+IG%x`2gx=~e*(!_qP_=__YF${$(kSaViaV%lrcZHjYq}hz z%j(}h^f#!HS=Dr!O(vCjlRMBD8BxzuM*7>JNSx~<88`=$do(an^m|0BP)vIp`;=0n zU6X;w%4}oo??noKTvI`_`vn8)drK#kX)Pd%>#fU0^`(5Qui%22=3IoylbCHk&$k2A zSMEXm$jtE=#{mWcuqB5KR8Kv__LKrA?^2r=&go~g4$0#R!PDwdg(XR|;Hpf)4)%c& zd9~D-*n?zqG;6+K=<{3#aYr47PozaF%)SDEv$_{!eL26WnA8`t@tC+Lo6Ase*d9za z#Xb&FQdXjdWl$g&&~@NmTj@& zRk4_tTJ0?1(B#u4EeRGz;1*VfmFH>_53aK^H0krZ&e@(bLvR%4zWrnj=!~KBPPFHT z@Z%j9Xk|CDhmiS{6hToZf@+oKF>@9KdZ-aW+oQ*=rG*uU8(nCH&4BA~ENQV|-!&yi zcKbYCXL za7IpJk_#-PErK7L)#`frX0hL*s~qBJ$5P(!!qq+XaW*Ox+M&JDu!#}y7nN0++qWg$ z3i1538KS<}oI)A%iDXAy^GI_KERoDrzE{f6)kh&831eQo134>>T{zBOQ%OKFAURUz zR*05Ds428JUc>ne2!gcvY}kx}F;9Z;vM46L*eYu;pJ<%*qdw-5D6;SqYB(UQYOFVy zh>+CYYe{$;7p70D!EWSEC)#p{l>7Xx0#O~`_rHPNe}-X10o6Y2jm z_*7dudKxu*n~TTKRr#}6Ha?iR7;;pv2pfr)YM`4q+Vgh9pyD#R*i7$~n{z6tB@^%P4RC%ZUp3d> z8ZT_qBFLOt_qr@KjjDTXO)$OeSCV4A`9Eh3YEfwm;nbSgw??Mk%idz%L~)eULHsRV zKv{qrFT(!3d@~c=A)@<0Eg{!{Ef>o*mZHf3ryy;Aw&0po0qOwt0jXg-PC~HmwTB8r z=p2~juO*19W*^{mNJNtR#GhKW?70O}TEG0T9Pwt>-}TpKxI?a^x5h;<qq%ZZgU@@`-4+j$(X#s4nb5zf8i-k2w zp$}dZ!VW&j28UjFz`v;XIOP!-+@LSI^W{ZBuC{{R&1BB{;pF5IE5bX$*bUG8A7T;kNNx^k&WA01DKz~tjV(iO!S#pJ}E$nRJEQ1vn2UxH! zszsEC&~-Lao~S<%6p#%4ECs@uTy2 zK_-{bx)W|r@&>>FyM?jl;ZdK*0amaeCZYR;Mb2ziK&QMLw6%)SC1(eH!7t{JVB{O?*IqC4 zj{w>vI&tTO1_bO#AiQS_+}P(9ZZeK^ScE8o;D=*F6c7e<4W_P~7ZIs*8o0tnn-?>z z;811c)+y`X!Fct2I0vrdOm5g5rHW+lpB1X2p5%Z)v#Z~(WL_|1vs`2XiSYR$G{{h3v&?oJ1Zq1NhlC>B1H%=Wz$AANm0k;5Hr0x z_CBt>+}Gsbx%o{p96JygZ+E82<>l1g6>S&mR z-G#{#Oq1NRZCJ^b?)GPdY-z<{(xivc_zFwTl=|6!2^b*ld@2P`TZKr-Bxz@2`Cc1O z%WDcX*U}!?8-k!5tLP&-I26Rv$tJWVQ2#P_-07^vD;M^GIKk*yjz%Pd1X?b}DiY3t ztp>(HI7Qqm8bWG5F^$RU3^5%Td4m5;6+f-TE4vcQ{O{ zB2rcX2zPSk6%M_i$4&ML@+%<|g5yf4bX4&&g4GPdLci_bb9t8}Y0tQ?W>DdCtSxZZ z5y|;lb{})N<=aM%Jn7FhUw+<6jnKz%}A)Vb}8t(53DyoM&vi(`FB!kf0^ zl|BMZ3FRFZ?n2< zP5>x}^ZraZLPwHv7CpYpqI*V}e383GF+csoh7M62he0fMoW;z|+SYf_xirpiPT?=* z;ntp#-&^{{wDocH)&I0p^)iI!^4Qs$S-*raAM2h^zun&rA9LkR__-I}CO?zC!|K|* z-mj13{$8*SkLT1!>JQ(*Ugy!PZjRrF$;K#pKF{Zm+Enw^)77UN0w5g%fo*&O5+N#$m>3D#jRN>@$nSFB3**vLrc~xe6#{ZQ zq(W8`tqf*wvlpLJHe=Qi7PF_X19^1y5X#@L@k(p&Tm9s6e_zM<_gi~E=bsG>h8C{o z<&{|ZYm?Q}v!xYn?VOEJe)7%flcyxoVX+@t_5uUp+~twjR=0-w!s=@FmaPr5#%;T6 z7v=PEd;Ond&T5;f-D~(M{%d0EU2o~%wZhtuFSZpAYU*v%2>X^fU3HHjcprWAj?UyI zAp3?Hc1;5P(`lD&MQ@Fx-tuo+8Yl4Q+deAy)nC?B&qL6j)=Qsl)Sl&#oo9Y=w8?k< z`YdeYiUpS0*;;$Q*N?`>OlWR4|H`SiRP|auU(cA~ZI$G2fXIS6<~mV8YHhjeSyL4M z7TUNV{OT(tug+5u&LMO10K_Jk_7`3xwX3Yo6?lU67+e(CPl;P zAkfNe>dXmXs9~Ifd%RJ@X~6rtwl^j7QU;M$HDlJSeKU(}Qj00+6`p-|nm2AA`n=WU z{QXk}hj`iL%?9BW8f}4#F=*afM$9h*_HeYY$UL(o{*?#2E)GvF0}Ri4xPC3c4B^N! z6Qussu6EYKZx*73a7xIUkw4{@;yBs)qeMBF8L-D!h`@{=y#Ur0R@v95SJBxyi4vI% zsC3Gy3JOqE)`S?;WXX5A9Nh578Hv1-O3>Q5W%WNUD#X-@r4Ue9wXle6?XX!_`I1l0 zGbSL!OlEa|VmWL*G4-zqkOW8x=5yje)L!~fw8RMWnBs}DC1Me^xZ<~Zq;@_c*?o~> zvIrI;CXtiIoI#RFQ}YQx{UXo{I~|&ZxC`$B(VW!M9{pYdk)0UsNFpOQ59G3ZAs91B zAcsN8A;GCcyZ}6LUpP(hB7e&g_EZTz&eR)KWyMZN?81t!lDZN_j&kW6KoEIqSt)U9^ z))9dkKoMHDkz|6XCHADPM2B!m_NjO}31p1A9J{F?UE54)ga>#Psi=285O2g0WB;hl z1X1!zg;VP?tmkd@*9wh10?zMuz~N+W8d4N|jfva(6dR`=qSU_j1!q{svZxcufjAn@ zP*|JWUlP%BcnK~5;b#lW+j^Zvsb0<{E{O*M$SGCA6Kb^=rphrFBXAy#pf}thu7Bf- z)Cn3XdG6m5ca{>d!Fx-mV*sQYI~4P-O_R!$C3e|CK6_clq@5O z+RXG(pWp?n>G7nQXSE?>Gc#!&A>59^B~X=XG}NOGC}Xz)UZ(t`M~?SNj8zazLP%Ao z_EZCWU=p03IS)PNXK<`$wdBBuMqzkuH*R?)3dEH z@3~tD=?3ow`KL(C87C(EoHmU9Nz&iocTOBad3#k&2O7sPQ7~KDUgSg{CZ3s#UT*-- zaQ-Dy7q}Ale&@wEOUb-B(MC{LK>AjKyK38$eIw=$FR$&+v%v)&ccLZkK09h)m{e8b zq&L$pi*W}v#!4&wQxP@J1J{20Bx!r4=iZqTsxOmF?I6G*=j0^;7Q2WVH=~RZ(QHOAtVGz1`hZbCuFOr^$xvFub5UpC z)Ve7!@r+2C-xOx%N^%L8Q4@{=!-?Mw{%YVIgDG_`QZVbUaj3oXLp$t|#Ng6OF$O!T zz;?zT@Rj`+()RmKX!=)99k8vF>oP0{FY@YVYJk4X&Nj#}-;B zaCWKu;tborJBK4KF3we8UF;*AoMxe;7SZC&^ly-!HpYi%e|2d zv3~Qrju!9*`@F8m_hk6ZX5OU9^RJS}y0C38)Q&1EN=DC#>ySx#U!o$wC!EeL@~ zX$^1jzJY$trA$sPppZxp#XbpdPUxI~OD=jUBgZv&Tg48t-C)jQ$$HIs27P(bG)FgE zD7txOU3x(~t#m$70gy4>z%efJEU_=!%bOYrF1KwJ1?lFHOpTvf&WG`&RX+jw)UrG! zZ?qBke#ZPP4VXjrF<pAU82Q|9X}htXn(-pov5I=Y5u;SfvT_s_wP$$;od68_X~LR z)vwC5mmS_l56AoC)YDXbpNETQ{Ms3NI=;{4<@eLo^k+@7Ia z@e}?{v3c14c3S-BpMU=O=l>O3|KtAuwmps{VqfVZGk51THYu`pz27@5f?l>rFrZgw0dt^)tGE*XQ+eB@J^rHJwhq(4jrvwoU?cYn_#z^-rGD$c=o?dtDw?BeOKTN68< znR^{O`;o7)Z|z~v_meL^Wno(cA6JoE;qLuzHnux@?pK54p!aO%AICd%L0aRH8;ulghsiYB2%y;leDhw z6$o1%Dpqx~$5K{O_w`5W|Jmi_knEP^(=&0$5ZS3T${K zsgpR%C+W+=kl9}cq$3t2skE)Xig+f3ZEFZ^3r$-#EL~7Z8pM=IS{m-)X+g^aPsT-k z4K;$}@Ji|$pi>^RA|)c`@amcn9>j%foDC+NtxfWbDGEjRm}m?u#?1D}4|i(1kYW^7 z7@w3#V&U#-w>rgHVH`tojEs5|1|bo5=nD*5B#TL}(bi@^)onv@6^X1VMr9)!h9**= z!?MQ6Ezxz9b@R(>KY`~V?-IsjIi+NMRK6o8C=CVKfie;n5vrL+N!!6|A52!>%!trt z6_I?q(y`Q4L5!rN$Q2by&}GLq2UJQ91>r5ujbN8{0{NQ;R7sK5$X6PCD$wr11Ugn> za|Mnku=68pLSeD64+*LPsprcE95pD_nqDq2rt{Ov0V4*;BjgP}OsX1WTc$A>dl6;U z+!Enxl|(~{7G--FPkmV2ryUe(Jf0vJDsuz3Tl9&LH0BDFd&YSH$w@VV1~J@6cIwcH zDai$D!pqfjnpZKZ27uYaT)}o^hglp9RzvKB-3u=3agIYmR3*=9XRrVGx?>D^9UK&NLmpQu_D_HZ?Dcx(Dl%NhAA9EKNJjiWp;_c&&yp zmQPL-dy!r0;$rcfKb26sh{p=cg(YQBtQg2V&B)6l5hV1~qB37EOHvBhUSHfsKc=Y@ zfOh>ZYKl7FH@mWUEX@%t`2&^cC)ApxCTN0IDM z$`aiM>B8_?RF_E|Cw_GjDb8B?v_WPq!)7E%R@*TjTln7skNGop@Yp!3d!qUDa1?OxF1%pD0E`Q$ z5uJCI$;=yTJ@}PsaSk{KqewipM8XkgC-oz7>wzeclpqxzVhDmSNoXL)8OgqV9AXjAWX7|nn0PZ$O^OH z+XrO6Vn=q?Z2QS!dzU_0#Q5ACaR%1cn~XUdN$Qs$Z@HqbHfbEHj?82N0z;h(f{z0X~zubS>@mxr7r8CttY zLArn;=|?O7(p@22=}Kj|wn1z9M`mJb=Fy#NL@NWTpZru7KX#uKhq)0K`nF_Tbr2{eZN5840>-=ZqCwkBC^YXeCdUJip zmhVb=xu7=Z6L)V9kybPAB^Dt&gbBv#Z{FfD>#x7JBy|Mc9bv z2PI*lYL+OM^?eN$t@9~5`&$i}&=D5FolB4gCSl-Glns>p36(bnwL6w-3rr!gc-vVZ z3(8M#TxvP#AQ{!}MgB0DCT<+L|3t~s%s>lcU5vUrS^x^&V%}h8FKP-Uwid+bz@8c9z?#Q4)m`4{7VDiAn(Y(5*E#jnW-$47+blM4mjC$2<109 zKeG#MQSj)BC69_T`aq&LhdSGfAcmjwzGaE!Pkz6{jXd;4tK*Rsr~dabACU)QbZabV z8L5UF&3flB*%A~%ccN&K!v~R!Af%4z{V9m zOj@IE>uXRskw2JJ-FLyek#`Y*ZwS||2q;09hf(=AXY1ixE5+F*mm{2f7wYxV&0J=( zlbAW?17SoNasBG-Xgcl7yr*IA2C~0m;#0G1y!o}|q9jPecC^@`vc}hxV|a&H;pZgl zL!xbAZu)^3b6#F{^nGw8@Oa@neupRwD+#tfRS-}1Hn2rWF6ZviNVot~xJ)^9V3*0t zi|tueMZn`~H_;S(+hMKK8)(ht;@01{UZ1=aT4u+;IwiLymb!nEX~A)&S3>n$=KU5? z&Y{GOeXZr4&~}AOC_wo9>Ur&#H1F6Zod1_b2eK7!(U0N2_P2a8U|aUp>(-VZGPV2H zGn2oMyzz=li0v@{*q4_x)m)UEO_imfo(Wr;YZPb7Ew+*1jd-kOJFq@$qt2Z|gwy zNMG|Q&*{INvHtnzpMU=O=l?dg|Kt4sQW<9yvCloNd(->+TGF8|Kmd%SO66S`M-vEA zy?6o%r&NhbPV)ztBGZWiv5<)*x#)q=zk&bQnCv@EeD*3xm5zF1kjkZVl{YTuNA~rJ z4yM5--c>K>=ln^>{5_Yyw~Yn*m!je4{(POixA$XuJd;Lw-G`5#kB==oeO{dY#JMm| zmhPsrk=T7Rv)g0eE^FxJW>y10y$i;SU^6ZKU<{>ka8P)WKV#Z#HaGJN!KBe#Y|-}g zY@OM?HZHR2b@;NkOJuR(>h?tMrCXEPq5a%B47(V;(Qb;(CqJs)cna-5-8#bw@Ea1{ zD$M=2w(NtjvMBNn%i`wjJe#VsW5ea9e~YZsb;S>GsRVeh9~@({?MtE958~sON-Bfq zW)lCs34dMRZ}oZs=kIjl_^dm#>gFl8?q+A^oiFWm@Aob)@Nu7hKF(O4z*uAdWa4Bc z{jQI%ldDz7`fg;^=lc7wdM$lE$5`Y*6?OGAuj$hm&&aK>s;ZPMnOS%w>D!!H-bKd< zT3nu}p;yg#3R629Zr5}&UW`s~oB-23SFr;^X>}gA3Uc#8NuC)Cu#DQOA%Imw5SRhB zGxSZDTKTuHGdfA6jR15zb^34LxWgJ~0_q7f>J7glss<>rHPVe?skoY03SF9S5^jKW z+c@$?Yth8Q)m|CPx-t?P#nk~;4Bb3#*9@?dn<4}(iZ?Kp4Ry=YV)REt$CDM#SXCsO zsA?cO4B!LxQvg_zCdses`mF1p`RH=dVj>LJJ2k_VB-=jPj|w((kfEB0X&c6C;8*5$uKlbh+IumGX7j&f*E>@bAkv|BDf@WeYMld?sfjsj=rvwq6U|TEk-uL)WB}<@tUr zMxPL*GB?Oj6#jjGcz7b{_xee*cYgAc5Pp7*=n(uJ37}I1;Xot^VGP|E2-xh==$Gq- zbT8FH22aR8`MZ&_`SJwUoY6r0Vho__k~wh{AqW*N)9b1vW6GhEdhu<4c}9V!*@r*M zFDr<PuoA)T`H>g`b8h@|da5Qn9%eVQF5JnV+q?f7ZFK7K8>*k@LZ5 ztoASQW=>P*Mp5FoTKZsM@`AM62t0%?*JiPBL?kxtk%~>Z%}5CVPw;eI$3wfGcqDE5 zrFpy>c3=@94N3}Tl_D)>h zrZEtd^d%LRpUE1(qqLa`BWZB9t33{cvNwbmyaqr!A1W~#`WL*|-o5@@pzjr99a0#P zY~G;4p!_J5%fhiu&PJl}_S6i~2nOGb4aEMQ2_k(EO_u$&#@i-*Y)(#ZGj_jkqTnFE z7QW&i`ult9wB}iY2@1~A8rDEZzIo6Ye~sMRX8wzfWgKF%KcZP^<|D&%3BXlIwZU{n zF;<>*1vEoq+b~6Ao@!lW<|pdyr;O8M|8bIBH(k`G1bM82$?LO?5f8)9gWLv^sQe&z zbll>y_e&tmA4ZJjxdO{UjH17HkiSG74=*1}a|oX)8nhH`bl+WGUxr2;$3bO=es^I7 zt7y4caYETf0ZP@)uCfz3qiexh^*9cDays7yzs94s5?6e9!UhQEct)tJxc`cGkt);q z(tfYK+sN}IuUvW zCi!BL&Lt%6s_Rb~Tz>urnN4JUm2Y8v(L$fs5+R#^CrL*?@MZ3U2ha&0pX3tjfaFtM zaK|Fw^)KWm5KVl@TEqN}zC`x|J_gXb2OLMa;MY9`A7K>~GGNuu_Xk2Yn1d#Ipla;d zQYCfy&e<*(+vWzwr0Z`+erdGTCpK27;LB)cbHVa%z*ooYD$o6L=j~>R=89KZq_#&$ zQ!~b#Yat};^oYEBbQM$+bbHwUfOc|E145x;;nxaS70gyZvZoa1)p(|kj-LShxno>J zUD-dtRPRJ5KNBEIc2RZC{p%!NLrr_Rl1qi{05b^ z=xg>H(h!v$J)0$Y8O6h*vUsc_wWMm_uac$>A|97S)Fip>urQ( ze`By~J@TKhlfvOp#098WGW;2su`>fUetMH7I-QIw-1HOISqCRk%($YEPK)1ZzI7rO zhBN`rdK&6zF`#>mCo|koS@|*Uu`*4YXRCNcq^SVaOO<=M>%XoZ?HC9J5#&kfk;gH; zg9$M7)^4ms$Z;DxoXz9KsOq9=&(5TGT7Y@qr*{MkyLgGdtjx{shIJ_G##%}04R$FQ zh>@16vKG0YKi480{_gMFo|Klm z0Ri_X38$2r6^4X)1%9sDpG^gE26=e}GRufb)U>cIf-(pMU=O z=l}Os|D*rU-f>9+>Dg%a?Z&0o73Ic+C{Y%wP9_LrDT6GG@u(6fT1Ki&kSGK-P6{}w z*`_AoO!1~7;L5{bWoNym1O!IBvT)3E9s71lV3xJXHqrp?Z}H04`fSr6mrQ{7-RD^D z8*Na7_4@3E&1RS1@B8c=+2KYxI~yJgK_0}} zPDcqXJo@8=BhE0iXj}+BmvmHigOa^X_={yk+N9|sVhS&lYep_dU@9ixF5a(+Zm`fS zN2sLATfla_8(VepFl!@mn5C%8KAQ4E^}D0sN0MpC9N}vKeGiEn`)p*w37XU_N){5;x~7~;odIa=>oUpImAgmIG-~?u7_0yczrlVZpTqoR%LeF3b%Nw2cOZzxi zEBBlaCJ~S(?kTxE6g7Db7BG$z8KyD4#`{^nk0i9%~{SR5*AZ|zdCM+-eRY*ab|X}*Xa=e(f&zp zx=`;sToVP+YO+i~S-Aw40~O!icPmgsi4ZkAD=B;#<2?gI?`aO~SXvV7N{Pvz*4*qx z=)uf{90u~j5fFbVyuCjSG(d-XpnV2&5p#iMw#GHeM=*B+S}-BRv(}rE?vtagu|}>u zy?S`|&(-P5pahz#&BlKu3=wi)+ zbns3lxIUAoHijHbSG1~SBoMTU|EnWe_J1QC|Ie5el2viyRDrH#Sw|oWoV#uzS@JVdINtd z%ULacpojVwSw=|Qbrc2KdBUNWP|_^|=LdPH4}6%&<;d~U<}`&Cz|+?=K*XnMU;z(I z1m_r3xXg7q#gE6yWQc?OfyRsO9|{NA{sp*uHXl60Ky`5UBK) ziP76Rrh9a21dSL>xz^@eRv+aiAj$82GV4D68p*Cj9U2PGZPkEs>5E}y(50ZJ%I$4E za|b4<@{QNMYYE+Mpr7UQvPLGXt%z5Tgz1Nhqe*b+nB|?JKjEZf$o=l~p0&_dm^N@g4Gh{VA(UXf^&F zW)UW|?i3w_uN#}$cHCQ<&mL{cr7K0;CJ+Hpw}#Os8~bEt>x|Ln4W-rM9*+QOk24o9s-5BuB0sdi8oef&Y^jeWCb&#B?s1^#h+ICU z;qL?4&}gkJEw5QFvNN;9)8w95F+F9O9WIG7R$Ee0fTzWm9yrxYwwrx2>4M?J)JWhH6M+FVkvDj-a&2H4}{UehG>NjM!Os8~9+ zNJX9>$m$%Xj3p+8Ihc?|5@2^4DjfrVMF+M#B*twrNG_C~LzdV{x8A8FSATgnW6^qX?1i5lUUu;SFAI{kD z!6}~Js>>T~bRi&%KHIuWx9(}%>4R!6S53Le+j=J{Lnixt2gr!mY2oiyQGudUWaM?Y zT3d;12#cs+EwJ_wYCCm5&%dB*ovGG)>f(z3^_mO%Olb8C<2AtbU#9c{RgwR9?r|-i)G; zhafkLtxBp>+e?4t;!^k*^Pv{?)DO(9X?Vgi+;H^F$^+)T>yOQ#2kDBUjl7OZ_xTGJ z@p^?F|4~G|dbjvJhmO5fwV*U>oZ}HC`i>WNu`Lq42Yh9zD|HIYR z)~hF=bM$d>Hqi6FCgoHnI9raQ+|}xta`AlWiL#uXeLH%*f}#KqKkIp^nIckxFo|!l zVkK$3TtX2c;hK~~kWWB>V?Am9)8vUctI2}Gp!)RLO@qI6%TxlRPa zTIP<`JBc(rmv=AQDE^>oI=&ashvo$J?NJC(FHfu8-jBZxI~D|bxG;0t|5XQU^zr#V zpD(&@p;Yp5b}?ZA1+8qD8EyD2<4Al3?D{FO3c>R?qvU`lix_Vd-a8hNnq$TkGm&#n z%~$sK=_IV}`Lq4TppvLs2U3CFrpT1bp@(AeBc8;+JP5ulqFVZgd7GfDPqGvy%O-$Pkh7C#gdmwU9)D8n`3OztIJAVIq8`g*$SDE zhaDJ|)dulO@lDd0SCW|*pIKXr-&o>{{R;)fOKGF9{2~GboS9eymC8nqgD@S3nhKNff zr=hdc>L?~L^-JW`{qV#uWwcq*Y!L;(EgP8o$ZCV#KvB-T6l81CZMD%GB5{=#s2nDk zk5Gm}wb%*&*bDR@KCQwR5a5UT9gJ$;HH}!g=KlC`eR2e(8`j2OHK|Ga^it$C%C$Sd zCo7^>0W$vXm?KTF#Ic*eUUo8?@z6yLKpVm3s2?z9SCj|C?z2IFSQ{6ikQT1@9a&*p zH1Dy>2?#3S2vIn;SlmcS$`G|dB+_^bnUV&7Yy8Q)->U^-QA$^+;FcO(jFoB8j zZq%Z#TOfLDH9AaX(iJXsM`Xl~Hd$CtqGJVk-xDxpEYXdj`Ec-=r2ZwklnisgaS0K> z(SS{=D`Jo|5}lh-M0ANB^u3E+hwi{75x#2}ebUUn-7uwKymuazyijQG^} z%IBl*B-9LIbm~U-dkKgz{%e%w zC85^Y1&H#(jWd}nbkRO&OMEU{&oH@_=AS+TW9(WDs=?cdzx(ubP`e2+(_Ieg@X7pp zqDcAEeUf zl7l9#kkn>f%4et|p2rKWDMH=T!)>S@^|wZrMKXfF!O?B&_z7A+X>3Sa!J=V8aV&Q|u6Qa5*>oQI0A zPYfr0z%6se^YMZj-fGRf(ZdUJ%y`Jf^a>qD&#k=pEM7b?PF<=x@t~56??%R{sI^1L zC}4+JTj?u|f(Gpn&;s&6h)ilEWR9+N8$n_b-kKZae8T)Kb(2%GhlofduUD3lXlltY zYLWf4?NuRjqekur4Hr`bzmyHATZB{te1)R*`v>>sbhU9Z>Ew}~+bNx+Lki|P5(EvT zZGBU9O^v*oQna}IU~B$d+sH_jxs6}UM0vpK?lp>6(~To{In(@Ba;3)P2f0<^S{lSb zw!P;pVN{1lYiS_5iw;QXZ`~~bsk1$Erm8fdAqAX0rdQC=uyd*IoK=v$?qT9#eZN~A zP*EDZ{}yx47o7dOSe5b>v>JR3f%E!-mbKL)v#^q8@7B-n%iu1D1sjw?5P7gxB^URp zrQM(01a&1_(GXn0a~?6BT{rZaH?P8eS38k{$XD~CwSfY9rBp~4e5gZ)aW5yfiJEtu zwfVJi!@2|Dnh|l6j;S&A>Xg}%OB8EG;d$hONXH@`wZt1kHVuB@>T${(7_o@+;4rq^ z*l4E14Xb+jjDi_EYlI?;34nrm5|0HFD~;F_sRmZ*0n0A49-cH_p;PimQ(y z6%MeE=iqzaD-j(TfQjf=5d8yCLbKzv!btn*1iCk8pqfVB3v_4#>C(SqU_~Opp?8ll4r459{=J{OX?X3#F1CEYcLzT-_ZV9LX1d1wK`r6^JVqd<6t3{HRZ4;&Lusq`YMq=H~|7k2jqL za`AR#26FK8zJ2ojC~E#K$jzT7Ptac`pHEp-EXY?q{$flEH3a)_r>B4Z`RAX1{`vnV z(Et7aUuWF`PaLhzC845XRDUtgt9xjZ%UBvH8fnvb+=7yf0u_atWgnXk3!FAWtU)-) zYY)}ypdRTH2*ohya|pGxUAB&uKU$uSoTyk?^Dlp!E%)h4-GxWC2;1=4^p0lFwb)W` zuYaIq!e>&V=_F;7z2fafReunlUH8z3vmuY#tSft&{jN$zJm3Q)@ z1nV!7Eu|vM<^bU{ZC`$1A+0lR&qok6R=}QQ4Pfb^_*ET>MJbNpJj$>zM&5nMu}^g| zwzwto*x49{KS81=XqCUWCc?K>o;_ORhP` z5Ure^P;d$Hq`)=7a}lJ81G7?4nu`-rj^1OB6Y0%)#sA8vga;UwzI$Iif~YgXSoZ9p zd7+oufN@-5y8{O_xS!)%2fd_{uJ4Tm`|3TREWu|nP@vuE0=>|QE6+7c!h`O}0uSuK zqti~R(6qtSTDHrH>?e|5x8G!D-iKiQ36jJ;O1Nj%@40XvTl1Tt37WJPGc4YGWWhdX z8VBAzt?ZN`xK&#r#Vr3}pS`Ls3&5e&Lo%KK?xuoq@zg+f**+)-L28mW-iLtjfu0P{ z9lK0sLUw$m7eWytdgGE&Q6T|Vf$?9m1!7>chNWDaRi3Rso>Ln1pAy1l0!9r3%LQ6I zN@>TLxYEXUi8Q5__2;o*Tb{)80kovO?m)QGQt-8Smlv$0TI?$|6@eP_aHxxND%)v%rmv> z42&pjrrz|yvAjB0Ck>6~{hLCR1FS&+9T;b|As}zetu^gzMaJYdcuxF0WV4HT9?fr# zOhvr8^J?!rLitx#>QtDmkB#Y|B!oS511^We`Y_y}PjI_D>V#9)69U>OumDXS#VXBBPARMd)q`^R}8@C^&3$XNoS=5kE4~Fg}f_Ufpm}s4<5~7-r{a z&>W={KO5-M$a7Cv9dy4^YiGPr?n#p5^>L*wmTq58xiESjT5KNT><;fu1a7vtxs6{d zC8!qdUs1;dIOZ+ySC3|_3-MfsS@~H8mS`y@DrEzgXqdIN0 z{P&)xt$g~2K1b2>r*I94(2#ZRx(FY*pQqZo&H^C z8R}UUfgtu=tjxtIr^wDLg9BtF5Lz+1*+VhuX%`tj!X#-c`K~>6dG`sDrE!fgy%Mt# ztYm)5NgDWmxN7(cL*yprFK9DplHH`dIpiQiI1JHWJCLk9$*I7cTcNokQJV^aLP=Ye zr+V^!qVTd@OZCON^3jeqJQZ5Vv6QFm>5k^=_Osjlyw&*_y}PWbIgDMU8@~d z%0OQh0rc3giw(*Jd=a0-a+=s>#5>QNR0tIVZbEqH16p95w*ly9Rsk^z^3IH`Px^3C ziYC$)Oo0kRvC{Jz!B4?*XrrWhC(zwzXhq;Y4+`cn5kqBLVxp$Q{!Qa71lMCz_| zjWW}m5SRwFu+@MtRe<5aNjV7X$`7*CFIYL$AaQBgahZ|nK-)zsgc1hGM?5xeCt%Fu z=jR)-gru@jQap_&OW(>NsAE)5pV(%2<{(z2%PcAp{L7MxoSNk*t0>=fu%TaK8YE>S z1#l!~&r9cNT9dUF)w9J!l#R5cP0ZvjD5L&zap5zt$HQ?l!+Zryn5rhOHoyM7&;=4j zS}hprZT(<#KM4e2OziTZ2!?ZBB!0X*ek#Puu>t%Wx>~xHH-m>ENR|N(Hx2^A`3d43 z^(Q|deX<`FOMNeOAqhhSmk5RGOz@YHQK-h>NJq_C?=UC)dl^%@;zyj-HOq4>y0`#~X!rD%7{U zx@!Y0!K|@4H_OWuUnfDDZ-`p|o3{UU6#M6&fByOBpZ~`Y{Kx)3ZAUz9^xif{cTLCT zWrGce`fKu%#D?)O;E*P-Ze3@l1*$MYqv>V{S__moc#xsz|C#^O3?qgZg}e`-+jFm1 zderr=*MzOYGAmV=-Df&BU-IgBtZA0jmKXOKBQPbz`#zukmeqaoYs6U&J~9UQ{4HtX zl(BB<3v_aF^767ODLFhm?CI(8Pc7`n!`E$s1$k*VEz$RDJh?j?li=-o3QKqbQZ&&i ztLX8!MewliCe7A=S9rX=4hGH&Ufv%N;M>3vz$Y9)P4EtQxO%mkUGek?gxW>$yx%;3 zv>YvTxXKj}+-Gd4{&`)lSGX6F`5FMwblF`C^&IEmYjwdP9y-|V1K6M}v>H9+*Trpb zsdy7s+dO7A5L5dAzZhH}hppydw$hzi+S=!MwoaOIbTR5pJSWRsXdf)z^e!hDj_PSI z7-KTh%C^>bOv^sku|#_Tm3v&c!G7!x3V0d zE$*Ka_B6CE-qGuGr~-9W0_nDX$R>}2{70+HF5_}GwlSAO|72_x|HPF!HXlt(`Hyy* z#%I%ec7>+ry?kMG&vzPAv>*H6{XNW}1%BaCsdrs|D08?KzD3AlD%$od(xnLh`6~zt z+cQ#Mw5lZ2LbA-q-_`v-o-;cOh-fVjK&{#M9=@D4&=)x^I^b$$&m)UIk=3-dML}}! z@=(a}=(2Acx00!lHZe`bwZAI8c~O3Yrn&|y)v+~Ia*!LonM*WB(M?oHbjv8UB~NBR zu6B8ZCCz4r1>g6ZR`UFS%Vv{VE<;4{IAYVJfYR=e&K zQd%%c3g?$<^JL}YNd8*2@>Wk!Qd>CvvA&rlMf!O@1%0B$2uLXXvh7b<)Re=^iV95K zMz>!;C)pO~77+xu#!YBv)E?S8r$=BM*?({pX4XR6!y$W42Z8ypmp4TMGB`#Z2v|Lv zxW-FEaT5$11joGEVL{}(YQ59Gu=*0B!lML$Q;fi@6(}Gcw z@})d^a45s3i+PrbPw+^ayyvj>)wXC&0zwwx6Hchkf`3B)4kl4L+f0y$^|{)tQD@RA z#bk|d;l4!%0j+m?NQV=rMg^9F@q!X0@6`cEbv%(8PyKGCW^M>hPEzONF_z3%(CMEQ z)m_G~7*$IlPt@A1CR%k5_=NVRGwrO3rE&zLLMQ)aikMrTF}c5ID&W2*`Au7@PlKu5 zqxJILedrX5L-J_Po2n32I10>z>sDtuQ`d0=mFqq|sElJgr_u{`?}m|D4WAoYqgJa5 zIfY7$Rl3(p2!5kYipAM73lA?%<@8k6uZa&JOn<$#P~u#5LuhQdM;hrI%|}mFhbJ7V$3$<55uo26K+MW)*5He|> zWRKA6-9?-$2XQm>t-J+Aaz?O9EZsT=Gw4yjsJFec`yG!LK?5~E#XvCDU{S$PhP{)w z%JF~$OnE3iCC&p14#p=~=66}jd%%x(UP{ z+H4cK)dWh#O`T$_oxGJ_xW?E$?!NX<81$xO;$e2p!^y#;B5Mld(s`I6B3u@Z&%QAx z0#d?ofAV36W(bJkj8TV_dnh&*IhIc1{!de}NTk^64#l8bH^V7}ds$2+daUF|; z5)Sv#iF>}nK6yPO3Z_s!w;;wCZA&&GbVtOUtqe%ASF)ELT=W8#L>}BGGQcgqCOx#e zQuVHGY?0F5&zPht{v-Slzl^fJPf!rbtZo5YO?^40^Niu4eb%+N{ zP;Z)FEo{Al;c>39+(rEL7qv6W49tJP)qe+!p!Wc|a9LGMQ;J1J6BWffu@WbRu^K4K zPR$LmU~-rP@)vb=^I9}?Lhzi|wPa0GhA?wS2ecG5bTO-7L~5t;5qfosMj*-2Ni^hb z@eZKPrc7TzH&qgua~A4TBDlw?YchW+Hz9Q+H*7&^8n0oOu(E{o4}Ovg?g%*~3zFknv!wDxz78ZHs39`QPkw4`LJCN&SH^=WKwWR1aluSVw z;xV9g?NZW2(y5hu&h2B`@o9M zaT}S6D%HCQFf)LhtDR>J3aLu2$1kl>;HC2{pX*5{`u$swvYel|C4pZ8$}N4 z;%4Rj$Xv%>=t85uH=n@dg(evmNyL;NiAtp_1PUp+!$Ex(As*5S83&6oCF^}3QAOxI zf;>wm6r%bDeTRL6=Q&O-RZY0b3ZR!>3=1d2sLa}~z8GE7RNv+|GmPpTyHN<_`>sdx00)WblU?(HIUW83w)*e%$STJL(VIoRhBcLlaM^J>A~m z6MQ|~fA~tOE+Z437C$}@l)MlS{4tO@^43njaIabro1P@gQr#ub@(C3aMe!#TyURL~O&c@$nhzG9+ zbt103hT}r#?XXr|nk%=LC7VWGoeCYLZP0j|QVJ*%j+kE8-yQshqrIRfebZ%|;Vhc~ zWr5BT!Gw>>(OK~FHn3UURC`T|J6v^-Boh6x)5)LzrNo!+KJ8?O-_?AtOM#aI1a)~J zhPRExC)NqUHb9`o5dm|y%rj{ZzU~;*ZFLl8whUx@43GS3D04VVAEMqc0dr|TNJ?^S z=L~gbS7ocKwpgn0q%Qdl^JX-iete-`s_Kkx^H|0h8J0XJJibG@TSKZRj%$YK^o3P{>}Dk`BeJ|Y(5;;IMuixtvyNq}Qs>R^&qrgrYC zEHoj6Sx|s-EJ3;nQ^+=!sWzUnELED@?RW5t{#`~IJ;5%9i1M(wz$`#7HHt}pzNJaJ z@6JzQrMk!zq?&%aGZUVd0ia~TJw=Go$hXCn zM~qpi>6m^v>``E!_Sz?DjUN`12|%l<*rL0r$1YV~A|2|_H#YGdBk;6haR9FY?FV5= z5N+V-8G7>&ych&wErO0-B)dj5CNs3DxDGZy?0L|+nWfn_hC;22lS)|GH|bDDm*on( zjX(QND{dAHw^%?vXY-|NxVs_I7(^F!s}pZ(EH*8w*p4h*a|FTV9C6wiUV7L9} z#7E=IEgos9_B(266^ET8SJFN?h%{B`VQWXUNaST5^mh-_?LdHRn4V|`5Gzc%oQsq{4EF{oho3`5V9+G%5Yp}4jLgLJJ3qPVLY9l!MFq02%_RDe3;0A6=Z ztmqj8dol55tGY)6G9;$PK*ETKj8B@Pkj|Bz_;Dze&}6B`M=`|*?&10h`_f$8R*&~* z#^2>((RxT9bkPP0fr>tkLdxT`>wtnHf&~{onU+dfQFC-b%ycv_vo)HjahuO%<(>qZ zZH-ZIRWJLiwp;7NpEYMLa!y>vSt^^g!m=^sE+XS}Gi>U8lPr6T<>}N*!U=N$o}m^? z<;Wu^<|CFPvU~5&j_+ugHq3jQxz(h^*l|i{aSb(@$+REDVSUL|CK@-o#4ePZ`=vI6 zZPoN9o{x_U>45B2F}ecG=pT_;R5ER29tmIk=%JK~<};a%j5Yg{Q-ox}J<`Li?DmUQ zX-Ul^(M;jdI*3juZCyDyLkHfeS>0=EutXu8R$RGR+$wlx8n?BU++y@|SqTEGeh3J- z2&Nh#lJ^o5zaS((8mo;LNFS)#{ZvIT78#Hql+K>XAMVOSb|EjVNVPD(tu325S`Jn^ zyimSW8wM=MRn~t(BLt?vV*VGl_|n)ih}1P_`jNJWi_c`WlZ2#`f}NAJ2$g`MG!Be4 zxvh1@p`_U!Mdw-GAiIq&y?#~+lFH0P1AFo!trY`)tCncON7)6*c;MKa1aOK}9JI7q z1el#{zVuOhMGC!z=A!`shR6q0c8d2G*V^=Yq|56T-Xk{o&+LZNkK1|aCZDI%vTQ9b z$n8h})?5zp{AdFkJTOpKFV^otK?Ob|xNOuAAiD7oAX`{pLX4|`VQ}iXf%?n+aR!Q% zOaumn)jJ^dTAaSWT{GO*HIZDA_e3U#nBnGn>%y#G#yLc z>gftzqRuoAH0YRId1i8!L*E|3+r(a#vJPU-WL`b?0px!AH8F}bhz zldbEiz%e%eZ0CE=>c=Y3CkmVk^IY*c{&@q;A>bP%`eWhrBk=DdZE&D`F!DmUN;9QvI*|IOzu7i+g5 z;B|lJ8}fyK|NDAiXa4Dn7t$9I;W6+<%sKGK$R<)u@kz-o@TVs-vc2{P(lyym?!O&D z|M};ifByL|nE%iHfAM(3=%Y1y{ELgM+lxIGE0=kDe@#GHu#%$m_QZ^kK!&6wL~teb z>W#o?8P`lWl~KT<`-A~r;e6l;iJD`quQZxr2YySQnzs%>n`F#7FIP)%nt!VvYh0^4 z*Q=0JnLAs)58sud4-^Tv_!myU)nhJt{ti$U5cKs0Dnd~=2b7?t>~6n3(%YdO(Dsn_ zerp)6yeEHr>OOUlCR?QQ(+B)r{AO|c*`JL(8PmppUFUlE`x8yt)AH)|6(vZ}!l_LO z;qR>_z~^-^NG-sJqnQhtK#wIzibx1??5lBD$S~u85xXm5nno1>GXSQfn=0yfu}4`0?BY`Eq{iiE*+fxdph)7e9?-)_W%7<$S4 z2|=*jqCuBPmYMvr>6KQ!65g}CmW_i~B&3NJr*tZ&3Kh+utX3Xk&jhVMj$o0U>2%=} zdWE{auP?+j0SgmF49SBu50~zBi<||^Dr!4&v-;lSR44&{_5_~k3!=aS9N!lXf_azJ zUC(>b1-B`S1t}5)=f7A3Tse6*7v5ZyHX?ip^d4u=Za~vLHJ$)uU`@vQV8WoBK?HY) z6Hz>?^ehw$H;BCp!|g^XqQ)=OP&~yX!r2B{OU_+eaLIghwfWmC$Z*Uu_6eNf0|PTc zhKTzTkAdZS(>=3<553N>FQdvHjp7J_UEY~$_>$8!nR*w6Wg$6l3_CrXz%U~}0iFxxt&lqG9SsUZ|wtP)vXrGhxCfd@!6c&GVEY82KA6xx;h*rZpp{fel~sY*+8 zvub7VGJyP-ml*pD7t|+7$o9zZBIgtd5?+c_5&{~c7V(gnSh9Md1pM-aWJ4Idi0V1a zDTs4X(n`VP_!WW)X+Y5)<9BSVqM4Bl1YCM!bI znXv`aWK<)i`h|Y9ddn57o=Rq=AujwFQaTF}DSmf2+o4&%%AV|@XwY%7o%M#cg%KOB zBar&v!uavEBK2kBE?Kku1pt=ov6Uu;y}h;oc@t^A3t%&!M9vC2hQVk9b&sA(z(@&t zMWv7I!@f(DTXP?cGnzsx1>YxRgd0_Sm~ZNMx4j7_LKnG?f-Z^HP6LTC4g!5;CU&8S z)OIX>A04d-+2P1C2}=Qa5Wo45g=mD5jOx0kS*_Cm9D+3i-ZR^(m~;itrzI821F>M= znCcJx?c{QdLXaGqiSYb$m6yK71M8}kH<-UOeb&R3jMxp`09l2$LVQJqFgn({)&Aix5OJvCrXnU6uqNFM?H#}RN_<*0^-Ya74`6UK9 zU2IlzXl3hH77~N9!34RaGqndGc*&DdXrM!A_y?;U!%S&6TB-B;v9A%sd&2^vVpcep zDY&veM#3ikW`0Q7mU5Z%Ieg3%FcdFbKKbqLCk;$A6INE%OVZ7hu3hCY$xIA*ig&)V z^IPmCYwpf0V%d$8eGH&Zd{Jvbwu`?#qb2T$px5P5dswb`BB=Do&39Vpiu7ti*GbdO zqdUCwSBS%&l84n7l*jgC3j0Cf{3<9niDg$wtL_98y>+D-S+7vh*V1pKU|M^)IE$(u zurs|YdwRk~L#*c4ofyqq?h;6;&%#B6YS>rlThhE>iurFsN=o?rf!An7x$EC_Jkr z-i)}eA8Y8NeyTb#3;=FGk-x+g&i#ikz-HZBwh7Nwiyn+NL)+vE&^)R9ht;c&+m4)m zY=fS8?SC|pwA1Lkhk3PP9q0YXW8^-ybRN2Z%Sd2o1AtjMj5#YD37x&JWUHn!V;-_+ za^FAp`E#yA+!FK!gfz)Cj1c_Xb`*62@Fh6jIEH=hl68B@z>E_Wd9pF#x$$1B^rxYNiqQkYRc-ev9w zI&qL>EXL|thYK^UnP)>vLp%c#YMVnbxGLFZl|o3)lItEwUUIh~wWJ4oia1%IW!E^X zqNj`YZ6J)w>%vt2+^Km{bS0Df*hE<0ADudX1EDgP{m5Q?_t!GME3v&(e7eHd$3p%z zW72=7>7Gjbl_#nEYdZirsr`0q)D4*g9?(04?3fJu!}KHK**o=gZ8%nOTliSGdZg(S zuCRMzx!?IjaUu}G`;i0p7oqrp(2XK5%LY}^oruPX*}2=g7pDf^W#}vL_4KwFCB;)f zP=HH7i*SE(Nd?XEmhkqJ^MbVaza6ap`RAX1{`u$s#i0MA z|Ig5IOAKlE`hBJ&*5BiM>v*A5dXb8rT)bIa%AW)n_@IickGQw-fqi-F+7pa{&DKS_L`QPptI-&1l4N&{Ot5#cj z-ToBVnrtLw>?gPn^ch~T<6Uy{o=6AgQ$?I;-}|a>v6b{JFjk=bxs>0*8m?&!oLKB* zf&Ov&UW7Vo7O9Lj@8tNgL83GuwnP<2nqf1ZVfs~dd4zXRnQ#gRVvO8Vm83?(v#C@b z=_b&yH2O3$^kDeY1}F-ChsL2I7Gp%&?m8SSsW0HiA(VI1{ltrXru=|JEWi`tB|qRw zSBZZLnPS;a*C|t>F5Bmo=E3iQMevcf@EH-|NwU^4Vcr5AA;xky2&M8*>eW3%_eNmD zJ;)|26+)&(4) z3#Z4*wE>VSJDoeCBMey$Kkx{M)_k1%GefG&gpn9ChroXg6aWd&!XInJDE2=$OZSk( z)EOti#BJnEj2HmS3m)kYW{J};)!ScW{7YbpntU<(4Lg3oT8d9%C@fh*S}`IPqfw3A zuKL*x(u|}w`P}~Wf3bHDL81U#n4rtH zZQHhO+qP}nwvAi1UAJu8wrk!@FS>g-vzU1i6Zboj>s;o4;$&nV4R4i6ZqAfh&_swK zBBXN-ETbXPQb+iOhe%5gfnh56a?7ajOdN}Wqyg}hFH5-t!JCjZInhl8QBX45r__Rh zl!Yj&<475kYjOIv%#W3LM_ZT6toMshRL~PEQH46P14E#*h{i`t(XT+X;s9lYsRULb zX&bZ_rP2kcQEEgw4Qy2z27#K@#m%?dp08Up1QU6+BuoXvxXEsO01=|)^q{ZBuw^e) zBBg4EKI)0HLRCT?c7@s2fk-x9lfsn}X@CQ+r`2J3$_V0Ykd#S*Ew_zGTPf0av8JF$ zOc@Dz#FEwuwTCXkM4@UGV=ZxEv5%k*s*K-_(tsFMlm_gzmMY`7AHzCqf}hGZNO)C~ z;7+u7ZU)Op=E$&l8bxE?9W89_ZR!p`7pdkl*iI`n=%VuwCHAs4hd?`|?RM#z;+xnm z#0u_h-FC@tZOLF;=5ZTlfq1~03OvUs4QGx&^qLgEG_=kU>6W_OU#olwgzl>Vs*}i5 zQY#iJSca^LN%=x=;2#eNm&SbA?W2Fd20uz*G<)bE$Ma!KWO}b z*nmnni92VEdSeH2{36xOU2eR9F}1VcN z?t7tHVgHuqmn~>DX;5!;$!ME^459OQR~X~25!Qf}gf-aMt2+gVzyXO(TOQ z_#+3~GG}5WS%(0zuZq!zNQYobc!*}8LuZ(YIsO%*BX^4FhWQ8q3aMZfkelO%Ttz#1 zN?R_RGAPDgS-vE^$JHi6?$Z>p-!B7BwK1s)Z~OOb#v*s*J1j0u-K0pzRMH@yaDvVH zjfZj8%+c*SlX&b5y0xx2hc><+YteRsGL#P5sYwHDg@?&^*tB`<%dF-)&R*&jYFn4$ z`?;pIV&qg!^69+wkGFG2WK6|r)toKdDBtSvxvQ8H3?jfgWXTrPsh=JiX4{~|%$xvI zYO7|mE5-yBtNChD6J4jk^g_}Uqg5O`&eK8sO9k{s+f3~ri+IMi%_ zh>hc>K@@@*)kc-I2od3mK#5BhTC2RdjXA&oUx(E!&dZvXOr&?IWCj;2g?=Iho}{5} z+So-vQmB|t*U2IQ;Ev*Qe@`H!NBlJ*tY7Y7th^b`+WUD$cQ}@-*5ck2*IJ}xn->EDFc;uoB4Ht@obYUV$<;?Zd2Jc?6-XR^2iQOcr}f|b=ZlXDO{ z(C1Ols^;DLSm>pO>?ZyLf3%qwfOy>{x=Yuj*ze=~z}(a;j=?yFI-^oUP8;B#3H1a0>ID+f^dy2_{9MXd*9U0Ke4A zo#`{~JfQv9`jLLl?LSy+sa19Eq{ePhokp}pH&lsBUdY^I4e8(8W=b}3W4E?=d~(jh zLlAd9rIWn!+t2Wp{l1F33{RWO$G^nAkcB5u705rGzgc{#Wjg;td=+2r474Q+f5_Xs zRRvxcJ59IUFTH7zuHdf4?4>|n1Nl2mr!}`~nPVQGj4fGhhWuJ|8SF2b$wMZHXb#*Gx&*ruVh~5=lAkDN$;JJz2E;j zy4Romb@`gcu)f*tJKZkC$9?;nI|c78I7Rfs!^7KoTrb35K<=m<1LS9$-J#@e8}f6y z!2H0$`8W>#{tov2==6TQ!EJaL%H{6B{63yIg?BI-{Tkb4`YC(m9=#2j%|5B_t+(&g z-#m$?_VbtA?MlaWzMoUinuT+5DFxJb(&3#;1@E~E>0LFT7ab@{r2BmjhH=U)ihG3QNU+@|{+Tm1o;s9XW6!kZKh(hg@@wbG0rv$R2RxcV#e4`p zW`2s#@9pBl_bU8&y9INb&-Z;afr$erllQ5;!goaE$Rd44 z9#J%s(*gpW`zJ#XBMIQWXg|m{xuS1=yp1%B0>`y=VcuqVDag~LT=_RE$ueLm9;65Z zB32<~p|8}(bAA$ODHHHg44$&irmxInCKKn4=K(odr4T$+*kM0V@tQb-N{wKUW&|yu-y6CqKoB@< zuU>0K>3~L|FH%{ey-l$NM|D%>$t-55piQ-@pEiS<=voZ?O3IaR&*n@HnsPr8kmCkD zve>F8QENCYz(FN^r8ZwQs4DcquxvC@*Tuxd7$dM>aGcngfPC z(7yOW00mF$wO^8n%r$VqpvQVlD7G>Zp6k*H?l*&4E~NUBfU<*x50e)zwFE&St$T&$ zZ-=<@6JU7-b(q!;>W>$QIIiWq(1Mlq3^SEwSG87wNEaBn;|5Yc%cQLIrbrIBRa{0n zF53FATqz@Uz-2q@*gT(=hqS>mL70Da)d!p;+l|RV z9ZI%n6yR#Jyn-G8&m0$lAMHf|7ORxf1Wq{->sbUcZMz0G9AK7rX%-Hlk2p4>T^D!~ z7g~xWuG9ST)Qo*d_GmELUNd+_HCudEd5J@wwACbvzbROh}*20m9V4S*w1H5U$*NsWa7 zd88VZU?4=Mle!(s!`~6CS7=C%2?XWJT4FbBBXWxC1(BB4&rV$8l?=^s@z%ZQniiD?1-EKYB$CR z@#UR4fp>?+D*34rG`+l(Vb}-Ma06TpePRQ5}{g?K0xWPJsLm) z-!<@|LdDAb8?|$ALH8r6g9IcSe&Zr)%}D}r3TPm?tq3=0w*g2{an+;kr4;m)7lWK& zmr)`*@FMSu2(hHwri#K5YZ#YrC6D-cvxq}a+-X@19tLYP}C=SN#89|ELS zJ6MCTCjt)C9-_x}*NDf1>dFUc7Lvju zh|?aOkw7tz^LmdriWpk@k{5psHtJ|&Vfo&6{$gdUX|4XfxxQb|%K0z>`8Z!wQguNo zhT5pg^@$D7s|*s07g`?IgaH9clW1?v3(Za7g%20DxQF%uF45=UIZgNAfv{Gmu(fvs zssHk}!uI8_s(g@~^sFb-Vn_h|+aXbk+Ci7jW@>VxL0IBfQbq7^^Y&a07BUG5a%Q*r zc3Jj*T~ZRNPoB60WsjoPnh?R#OjMoF@)tCrmEcsrTvpO_KF{a|7mf4AxNpBbB0UuQ z!7scf3nON?kVe{g4ydq}t!FcKKNuSC{&+UgUmA2n?_t_8O#a8cTYbsNsjP`IhvA`J zt&CuemACmN1XHhDds+@60+yQo)kJ%bwB87bOkj_a_r2UkBkuUbB+?(=qwW0Dci9b~ zxx3bH_D*zp6Ow%x0*rF_*Y>@3O1^A&hF<#4W$k<+)Sf#9G_`b90*UcKs5;GfuqN8U z^32#IcK3)D<~KL<)o!AOKga)N{eGex zpV#;0b@A}=y_i1_kDqUOM7G9pu6Q~b<+P&Y-y6L|iyZ-s-pMU=O z=f6q_?0>ocZ-*_4GG^X+S=004#ZKymL{2Izxrk6v0Eym11pzpylt6`r*Kbv8M9QLQ zi$Fj(E`7(=4YjIs5=CvmaXNi<<8w_Gn*dZrJf@ZZ>+|#DY-XN295Yhm$naz5gVS*L zIYzGRco-ki!iO)P=g<3TR<563XRHhX~P{hQ7|5{7X382vu-W#q@$ zm!UsRe}Y~=F!K9tF5ItpE6#DjIEp5Wh96VbR4GwQP1P)oO=gT~#7DF8QUM@~k3V~8{5=vIt7Oa|Zh+NCe@DHsoN8Q81nbS0<{ zv>|q)6(F|AnIiPnBV0e@KB4`%uPnv_!RFFzXB;z8AQg+w+GL*|oI25^>TM)7JkNDFAPT&2if;9t|oPNIevlTQu?VWro9c)xPL0LH8y}YvY0<`oy zUSl;^4b{oqm~~V|Y@zt=Ivt2Kjmvy5f|Z zMcLZV(V%co{q|j@O*fccv5|@h6_!82rkxopBp)lWD+b@EV-=r+pSX|)6F70wXlX3Cgx(vOGQs-(^H{N z1umTP9j$1e&UDm|bEpBb!{GsIx=7Wa+HFlTn{3V+rVZ9$-(qVD6Tu2_Ua;Gzybl`9 zG_|hFNS`I7<|)le<5QS!JS5H~)=wHR9rQW)IbpV-1Vag!hxrtE82H%`-&*JK!miff zcyu)y7*h5fW$bVAl(x;QFc9SGO9ZD}M0s+< zPr0d2OA7p$azOY%tbz%_w@WvaztqWXh+f7ow^+Id%8cm3pU`?w2vmWh0X_FOT0sFC zLQlvDI*p}~zJiLb^uC*DO4;CsP+Vyl<7!b}is+fXuSDT&dEWwgw4)KOoHkoxKkhK2 z?eyjj;UzG(E=;3qD!gpYfPR#fZ&>k&?i+e<`aqO2v<*ImKt2^7)9T;rye;5}PU)R* zG|>KTpx&F3YwkSkbsY}dgs}#g?rM|KaMn+wokc=`x~QEZEI4gxED6 z)Nek79iGIuSWJ6IZ1XWO6WH(PHt7a0m&r5*xvy>6c@rGCJI9s15$vPExh;d&A5v7& z!>dxL`*4;RgTheyNterW9J6278hd8gB(!aYb8H@MkK_OC)Je7*KLEHan)g>qf z)5d$2Dr*<)*guez5ChHbt9t~kYsmOHQ~U~!Mwwab@EHEtp2=%?+?|y7-!B)Zp(O76 z^H^7?&!7K0c1%b;iI zek#3qB6^Ixd>1d??9e;yl>wh8aQeUkn2 z&p-eC^Upv3{PTYYH{}1;|Bs=Lne#})r5{n04!heepmbCq7h6PCIRFm1 zI^z-&Dh*iCh*%|}SsLsfFR1%wzhHg<_{Qm>=H|s`uD@$(i2|<)nj|oB{x&r=ox0Ct z!dp@etHj*Y|Fm-{7JWPnBr`i7>uW9b>EQambUo_h=Ry&NGU8h>zW+Vs-yRbq%**0+ zJgxs_`yBn+dl)(npMp=v?@h;l8LnoDQnzK9)ejZyRtom~*~XK(S&shx9n9_{{F&wc zfk)@T#~E<{-t7$}-O4wFBoA4u8h-kjUw^lk=jY|p&un~?ioTzf%kz17gF$l6D38u-vyYL ze_fDJ9rB}w=-~|j0TBcfi^xIQi)ZFsi;eS5x4nT%+1;Tf6kFFl7Aw3RUNVIk`uswA zaPtKD5k!Bn=^+A{8e@?;zk?a-j4|FGM@!bkL?j=mxK~Oc6QCMpdep$z;u=FWESWT{ zBXh@LHHpQx#sCPZJmXQgo>&4SP5=iZ4&`1GYSuRF^de=el0y?3w4m%NqcN0@giDO) zg`Xh&ULlc5u7c<#tFE3%C99ln%s09dV}#{hFB$rx3Ip~5lMEkyXTv?|bs>>_5)DNa zH;YxJ8=CMLi>=*-?unkjt5_{ z;*9}Ql*U>+$`++U#2lEyyrNwrB45^#rC_}UND?0=7_2!<;RJTq+plH)(NGPonnfT- ztSz?=GA_*zEqLg8fGj{3eiU95qHKbMeckcCSmMNS=I{7q{bDUT=^t51qY}2qE(|nl z=D3UzEZe~mX5wqACld;klw6omCLf6HgK1oXIMbH}KY+e;mHxI0$#pG!(!3@Q2cs~? zSm#-;{uFmoFVg^&WQ*o**ut*nIHIMDO`q42T`a?-Xv)c)qnKb%txSBO(Et||xH zlWeHe`haMOD)UGSr~F%9%nRjocnuT|mUEE<1a=qqT9M^!;G)yuq(OKN(b{o@K^Op+ z0K#j9_)rE90PO&}0j35w^@DS`11ijrHdjpgq7iI3`pEG{NqefG9WA67u3GQn7>+5a z^oP+*VlrzH4JXf3mYYk0L|aJ%!9{I(``aic*?Z5%1b7O95x&KLWe1fka2?T1Sob=+ z2;wkVD?mZf5aZ@wIrA09ly2rNd>#~_8daTwaiODya2RRl4!p;}V6VfzD_AXIZ}U&P zv8T8B$2>I^G1Uvxt;7bk1*8VWHd57oU0QgK7C@v!su%3jeaMkl(&tr`dSCJEHQesU zXvjK1I-9p4d)iCB@^uUD$v_81v8*G?ar>YLrXf2hc%<6x+9G|%2WH$|+-Q_>g8zVK zDV5jxdU2<>O_#@h*IVe;di6wiyPq*P5eDhPMaXGrbzK(J+Q;>0OHOFx3QJ425z){6 zIfa@t-R9S|7rTS=lm`jZRw^+B3>Y{LVe1A2cGh0!AWW6WUQJY40Gha>t)ZH)LZ9!( zbPmz>ifIGice6g@1dd#v1^ABCFkpR*&Ki9e7^M_L3&E7OJnY15$OQFJ9f;VEyPg2} zWcst=_PIY=KenDaqulm3EEDC|s)Q)9;IBDZH}Q)<~$c!A4vp2z!2tYYg|O1sv6nS4~&62^>=Jgh6>|AV+rXKd@oSPP#; zW7X`rXssDy!5#`j*3wcS>&2Y23;l4nmEQQL*Yq&xMuGdt!_Eg7xM+f5p>5_Xp_Bq@ zZ;FscK09ndwN#G$$1ow~?9eYIE)p5S8zyzJsRdk5(Lh79`AzwRjgM>P(Jizf#6_bB z1e8A=Sg>8=2-KHfHH;vu5~o{)XC&aOGa zywy9cq+LFG)t|eS-ZjI@?9KP_Ja6sZbqF+u1a?ZqG>0tPx8OgRQz#NH<^p$Qj$4?ldyOyHSsn$!R zSCAHjOegIX7s1`tO-X1q=gIw$KT?pKX9nQ76vtgM25x}UAVThj#FFHYy>|+94_UF| z;(cA!U-7bRxBwWLbXzA(WuoHTo81T}%kG0dz`Jxcz(gQ|DH$3x6hB0d?hV-yuiQ*ld#;Oo;d)7?U(hN$>ovin>lx++O_d?JhlXOg zW7K~-XWgQgommeao|*IoBxTO!fxq(I?IPl-9+mI!!=(+pJ`z3EdEV~He7-zD@Na1o zpMW2c9nBZJ=}WFpZV&Q0xGmh(w-UZ-chL*BQTLDUKDcb#eSEv>l@+5W!t?X-^YQCv z7|>fP{QO+}LdNw!_M+LN+Y#=cfByOBpMU-z3jqJ0 z{r~0vnE!KG*Y~VH*Cn%*MhY*LAhosj11lf^iIfnj7V!iuYmHc0RE-h{K+LD_IVN}j zd)X`Y`{y1+wW;>r;v4tXpo^5COGIJ{ueZIV$XZGHC(}m^F zoV@nw_^|nsgrI2k-WH|IUGH$*-VaMn8{y82L8#YUtO{|A3?a zKKp}XN%hwMCh~1OC0?izH zGlXRDW`UGDUyrv9e&KaA!3z1AS4)qbJLZOSiGemJFM(taq@MoBb%90W3j3(0TB@Si zO1rO@YIB$7DC@9Wspb{T69wy5jJO8O@_kH)=zSxpFU|Bf))A*;R8^?_W#ia(w8~V7 zZ~w*tGjQ{+f3&khlvJE}Tcq0ARiQu9SbbEx4DG}SP@3oEklN5S zWLo2~eBQ9+TzCUnTdR$JMj@WI280L`sQEz-O3~4_!5&NCj$jkfa5nBpXcVW_M(%af!K=|B10EdKUmld^%+s(?Bvss>XIbkcdY*3gY+sA_sl^eCC`fiBfp~fXctYpc3 zI+bQge`@qT)wNMeWh1>2DvN$jkw~R(F?88dN&azW*Qz1?JpOpt4V-B;BUL8Kqh0h{ z25e(cRk0EeSc%T0XAiCKEIw&BZJ0c{PIzY&k7)#R<>h}VB~Uh=BlfAZF~o{+r5cJa z{Y#n|!wlMQCz1}flm)dcXD2(tIi6-*>xHOqa_<(=Of|QqBYhj@UeSG|&WFc@ahx%$ zRjn?`76nzqk{NRHT1_?5q8UA%p6YoMf^C&4^d7U`9fQ+{PpX6Ceej8?Ur-$quo-Rj z+c1z)8)J0^zmqZU1;tTLjA0D+0Uw zJwN1>0^WhV+(Zc?es}G)qcwl3dQ6>!yp-s9^B{Dk%U`1xs_e@w2%ZapX*A_78NS$M zuvSP`7;SJQEr|eCnu|&ok6ObZ^PV*Kp%ZYRL;PvB2KU}tDO+c?cN8EBDS9Tgr^&a~f}wiquBY z$v}7yYliFKgRVD}0TF9&5Kz$dE!(r%8(EGtf6uNSseX6FK9G=DHuCYv#NRK5^3+#x ztv~%um3NVSU|G9+NZn6%uuQ)V|2s1a8|Yug!2fOKHtJtcMHdn6ZWfO( ze+qA(&-d|R(wVXSd1T`COXJUma-91T6;BFwU#x$El?HjCg7n3b8hJaCG`2Y&ai zk^c$Cmlxy(%10O>3jgy9?TDP>^WV-0|NQgMKmYvm&;P%G{LlHn*8lbY-;LRm1}e*+vRI3&WGopw0@Adc(BJn!Q6qOevFjCMfC@{Eix>o)7Iy6U#@A7T;llJv5^ ztQ(5NuaAdkUEarhoo4p3&HA3+*W_AkA&J6W?PaTL(``*%Z&P1e*!auKOKUFu9tT5X zV_@0y3lpaGwE%b>5(h^_K6HA!n!4VU=oR_;?-Qgr@?rcZiJac|4!sqx^ZSXzWbyZ- zi*Wawt@l&jp0}3hV{6p)fq?;VoGFQ#zMj6{9r1i0)4*5|rN>CU!9`~F+;O_w+u!qG z`s_c65b?JehqKiUa=SbNQF#kqG`+(GS;qT^8r|NPX|Y3`zL&La_`U3%y{<0A@VNO>xS-nm;-$=~p;1+&ZA!TtWI#2-H5q7HoX z)%v%8g2GP;@n8I=vD%>cLt~2)4mXOp(Ai$!d|!=LYkMo_M(!RHd3&CIEL(Rq*rIsW zxWbdH>jNF1nST;0R3o5c25XNxbGOn>%^-j_L5T?H_(16zuGg#=!e}T@Ve5R&!FTL_;rIhUp%YbP~a%N zdWI1u^rPDAXjUOX>hs;T(g-&P_DZ?+&mqf-6?`EJ%Ms_mO=vyPqn5rklJF7?Babxn z4~T0XTvjBZVQdBEk6VX$g!OVc|H;66Oak~Dkv%;72aBspP+$?6Nz8h;oF#mkN?=P6 zMkPFuQ$-+NAZyATp3s-c09&j{b17A{kQwvO4OEd3D0V?kc#2~!z*V4Hzpug7zN<>2 z>BkHY_I3bexRRPhU7u#U{Q0RV$ucl!Ne%K*pEL;VtMuq zaEr~vLeJC5t#5_G3(~v?Z-rjZhX9E*(ttS!hK*^yC#OV4f1SMne#t9v%T3+yKqH}8 zDimd)Faf>%VkJe8-|`*F#C7_)GG$<3TMjhumK3v5nV3)yG(ABKHd#PRfwmrUx$*J{ zaP)%phS6*ISZniM=^3fMo9RWiPtF5gN?@hm3>fB4JxJMrI(%pV7r*;oP@FcQGqoXM z)6AL6bw8%etpjCxG6u^?;eY_a+Ce|@98RW;R-8pcrR9+0yPW=Vm(;a zm{*xJY*7~~pWu}bmelCnHE)yU+Z45+`^*jc(}!C8_H z7?E2wFQY@V5(i}jh<0{WVFp!Q21yEomf7yd?B2Z;rC%c64U9!-)gKtdpfxzxWQSuS zBRP@T=kFI9B}$u?^GPLU1*i=+p(XVm+I)pbN=@Z(3y>}jb&_it*OSPARd)aALW)sE zrs9T51NHh^?QC=15l!1t30X3{K$+X$uq-XwnqCt9n-hyahD_nasY6 zvOM8HVh}tAkRElH^Vk90uM*pwUI_`08#gZF$74g{ne6xFU^hxx+HkL$3^UEeGmf_X zpj3biD8Q(ru_pv$y$GoKa!iz$t)=r8-Og=nb&bK8*r1D>?(HCKUa*-B4;*yv9T9iP zQLXFZJPHh}OqMCrBLVP((mHgW$|{s88)ipz*R4@^1HgSFJ5M2>U2Ulu59u-Y>4-wg zHfa#?H{0eGm?1X!v+dPC>b1i*bQdwio}t1o0>2P{Ph$nE1Ahvw?=tv}chSs%3^AtK4^aqn6#}3BEHGz(l;{ISxy|tU@n%-qO%e(f*!bZ^fVSfk_nPuJ zkc*~{KNNsXy0teW1^R)kzGSduN0nN&P-PyXp$XbNVmY37u`FB;xL;0>I2q{GJm0QXB7{>`O z-8(^}2j{Cd7-5A;PYCfJRxw7i*<%DqaZ7Qm8of6`Wz)|6!Y#NN>$wO&DE(WVo%%PY z)6b*D5^tn*aVC69NgB$+{MecPQWYKHLX2rVey{9#!>rW4}>thA&hDGNe-)AhH z@`GP=`WB1-b{6~RpMU=O=b!(t!2j>>|A``8%gxSQ#hAOVOmMj!ko1o1qal(X4A2XN z02oqAAcnvQU<4I@h_tNLcv<>4U@lY*>k#hZPqyt?Eo ztLpN)k&2LlwVCPveMuef?e%r2kpI?-cqm@q`JRpE+xZ`N0JJ0a%i()FLSuz|%ITwO z@%#fb~Rl_?9LI;Bev>8T%N{a~w{g{*{=1YXKi zyinRuxf8j#i-f^&UKs+YK*}tNA!u7=CE&ROoTV^(+KUqWAbg_xSA&dh2DGxp^b&-Y zmhBkLpTnA0XQV6?hTlPCL0|(AfOLisLPBy+rj;T6tuW&UHnqeqJYus489NNS4p|{f zUIvLeH)qFu%>kuIhY|1=I$sh-S83_0n=D&T^YkQc(iQ~ zUn8F6Lq-HB57M49*LLT)SaUF6pgi{2WD*nx?DLGn%xwy-jLKr1D;IpF~s|pC7w6|ZtVr^ zmhA#X(q0lonG0W(Mu!1S5S}8y6UyQR&LBXj%FO{84_s|ZLDLOG@iFcda4TRoH@FqF z6e?QFd@aEcEnNyyM9A)odZn`0aMI1*<^$mFRK!aqu`yo2mr#_kf_+tk-;3`-Oj6=* z9C(;3Ghm|e#yWH~{VtXO8^Vb6(q)*E%yGE@iLiL-t*K}LP*V~{$xw9r7McX4u8Y*I z9m}^^YC*QcrgF9^wdfM#NWf_)_l#1lQpQIczU_;=%+DD{A;ooG23DM?(kpLF@~$dQ z80iU2I1mDqJ*r^PrF@EN--av$-Si>98mJ%&Xd1G8RHR@O?Y*IZLbA#*W8YvZ64v*F#89NI=iJW;&8J%uk#)PrBSfQJZNe z=vFI$js&)13?YY7kYar~Q&Nc9T--iPpL&Uu=QCW8#M+p#`&3Ds>ytJP1h|V0^KIJW zyCsjo6?V$9FaJQcP!c@%PpXk3?{yyGBy-nKq1;>7ERz+oB3l*W7;9t&2R&1*(@PjK z8IMhsH{Tu{%oC-7)>Ljh4Z4;P26qVLQ{A%}8AS;m^~S`tzEE^G5o0?OU~4d|X~5Mm z=oCe%Qn5EU1vIKw!<*Kzo}ms;tTp2jBbLUe-8aLyv`3+yS*wPb5FQXPvHF1xgkJHN zBAcxxM#VToj)s?QsP6sb%oZZYqzo^Rsu)iI;^q>}N>)*$mw5My(}dH*%lek3JcHOH zr=<6D$Y8CkGf+xILaHYCi$S{o7)9!i44csvs0>^4A5tD+WI}oQTN|DEh`eRm6+>24 zT*uNC*Gr=^OMJ#grYEw56T9W%Wgs+?#IMgJWRnxj$6}J2bTwGym=x&tdDZ-qOZw9; zTeN3q_(FMO(afybY&QXH#?6gvUvA5fVn6zkFNb26ZkZbzSS{po+! z{lm>)zXkmnHBNc*n^!zCaVqL3fTuXG5B=R2@_jw~ruVgQ)^>l8?dMfjW?uB}Z3ZxO z;SRDjcWnC0gIJ2;cXwxTYhmvek*F7O^}SuZ?Jv^pfBo2`0qWVh_j(eYKdt}uMR8|; z=MAnu4R^jv7oKom)>&c=c%ED5tn4MoUz*IN+X(vb)SR&Zn}xb&dR7-)0D2?sohv6F z8Oq%>7VrLwx5MZ0bo_HOf3*|-+4Tw^ZC+Y&dv!f4Z4l7FQ{nypi%$3cLgf^0twpIuT5M4q$Frh$=3W>@j zut-BtMPaRkKtOweeLrgbFt%eT!|5#E=Ao<*plF0jwb{Yrx^ez3_t@BuOlnru!_CF! za-!mhJ3c>G>+F|W^~uokKDvIMkIS6~Wo?abms+wso{v8|cIwB(P4%k(`?g-2+wH^t z|5>~KYwEu@v*n(Lv*ur4UCi9pU*+GP^SAuBJajMLv(?Q0I(yamUSPjV*}n%abZ0H) zeLwcSFP3QE`oHemLb*@COOjHR*Fv(lcsTh!A8(Jr$*HwV@hw$5yk1Z1!NwI?D!QAM zdNgQm$bO2gbH4V{wy}+_#=G}swS|Jh){+fMuK+Ef;>)e`Aw&>vyJXI!!7fW?&9txt zh9Qy`b+*xcR_y~rz#pmO3$kMD`r9XV<>I3Qux%``A4XRUz(pCn?^0XuBf3{-0X zbg-I22r}5H%kgrShe{j}jJ>*0wS-_f9G5*`?9C|n;~V78*=2_Z?^A||QjQu>BMZbx zT`P22)6OE(gg0S>gbYCm1}VJoSb&6#k-_FNo;$|j$&Fy0Szs$s;v_s#20{R1mkrSp ze1-^e@g*6K32>pTK~RU1h>sCUW2%g`v~TE(40O zXDF9;p(LZYwg)rYfc*{Wrv==|PuLM4$?2Y4gJ~&twGEZJes$$BYF-r z!b1{GTo*uXVa7Q&ygz73oq_Ncg2~8?sfcCwh&D+6@)9bKZJ4!ovP>BVJAQ%(bTV$r zA;>WS_4FX)y79NONu{AN&gV?3=Y*Q_tl~6uBqW7StxOb%UEJl`bb5EKk5! z0Kp~~(Em)bB(D9^U^VW%Wwlx3gwnkG@BY}Q?=>ij`A?yl>?Ox$|X0iUsO zand9aBf>!MwQIWe-#fWF6K^_GFWPK>j%tAU2TzJD!RlOBZZ@8H+m;hwW*i6qyC;_| z(2GVMRg^B&*#HA*ec*BzM)FeWo`EjUPdk!l(ou8Pd`PD&fgv9_#st%|R%^1n&5U4K ztXmc1V&<~ke%E=#E3t!FbM@sZ&f>e8aO<&T9f3Rh8}lZl##*A&EkzR%xA^>CmLQc^ofsiHVb?$;?r7 zV>^Z5oqVopOf|afq7`0z00V6x6Le-M72&o#*a4N@CEceFZcn?JlWQH9hqTV>WeyF( z*!hhnpS%5AofD@c#a;|gJ6i43Ci9}PXRy38E78~%h4;s4fow>h_+iDm6A@{X2aP8qWC&&ZAnYtQ5i}-fV z8`w;+`Wyj`Mi{Bs^w5l~-NU>_m*_qf`+D5KXALIZBA4M)+0@a2lDKY(Vu3 z5dn;CAH<=_5ic{A_7o!J6N9R~37pm+G4=C9<7f!moGMHSdL)KiDLFo+V70@vw z37D9O8yX7*KIp4hS4MK-qR6a4*QKjE6;ayNBR?WlA!5ss?3i<4$o7chD25fO6!w^8 zsPww?nZJ7o*y9E;E=UNlHZiKIT~`yqkq}gTRtJ~z@0DF6=obKU1iBMP{y=21n{C3KF@)G2XhdH5hnp$o~ zoEdG#b3U-A*nvhd+`wKCpZ16`21<$w?RHjUV`sE3kkjlT#A?=Z=svJ?CzO7NC&|DW zJ4Q3BhW)Yj_pxXy@=nXl&`Ps17$q=LyM_hDUhWz%lS+_r+toIJh}Ae7}2Vd(np<@nS8n{|7tw(4A@6w(B~!ZQHh=*tV03 zRk3Z`so1uSif!ArGv7H@V}5^Njd#s8YU|#eyLTOX=R}NCC+>~0syqAMGe?ZQGrLv* ztNeBL-yUcG{PWL0|NQg+k~W0@(f{_k!|1u4FW0Rr+j^Hn@|UZ^WV7*LkPBd-^($j2 zODIF~B0oT|bm!#c;cZQdAmIW?<;ue<;1#NG>@_rR^)aB*#m{57$tUAc_wwC`#XbcY ze`?>_+*ah*D?}vax;ovCv$-F#9(YeCC)dG?VQ9Vv_I08#0q9>g-}Aq6-X+wJ{OZ~s z&*M@Jblm~vLUIZ#$H&L|-glpG4=1P@H@a2JK2opd)q^E?hC*oNXO@sQg)R zUi{u3O zw@f94*{MR8eC6@sL0WdZQDSHX+w^v9i?%{#rYt=*!`C)f)chRtFH^Gtr~;3)>PNp zVzmyW6TI4Ir3--6g7>g1Zon-GT@!uFcXp%7rypewLJxH;H!m#(0w4|5`eBIWe9hx) zggJOAaqaDtpYs3GM>9nDWkI;1lvqOg)K(Jy1x}u?am~Q%Z=JSxSlO^L8)nMDX!Q%mzIM@zwXGjB96^SJA%*WQno6K3n&AZDh3FGMiUEBt@|3w+du@)%6 zQu(16Ys~7L+~JY<@$wXy6{z`Rr>l`k{1V^+M8d)^X*bqsS8H(d)EO@Qw|JT-GWduD zxt(y%OF3PWi{Xq}+d~ng)^>s*-HpX4crrj{&Jj@%2VV~^ob}lVOC_pN2QJuGhN%4g zFyLksMv^o(S$Ic8uv1YcIVGY&-otS6g&ds;!jPWIYxHIYq7eyPN`%TBC z2b0DH*mFYPUR^NcfFFfjxtMTR*Eq2xLxiF=Xn;ViTK&mAdNf@GnWHcr1PLdQR)`pL z7dGQQnMD{FjXX}s2AdYft17OMfVE2)%#_bAYTq1_lHZhR#CC~Q;=8;~UX+m{6&y6w z*0^~GHVg^+)TxRx8~~T6h){GrI>~IsS_Z6HRx}(9+WBsQ#Itmex0m?r9zA@+8YM!) zkO#^C8Lnu^)xdXdLPpKiJNPL(L(0WuKcu84Xw)7QO{rgw7Lr(8#b)<4sTEqElQ${* z>l6wguX{Lve5_(UCH3xlKu`OlId=1 z+IuE&p|Vu0xQ=b{XGWBG#UZI7D9M`3rCJVjbxE>1R%MC@1i68Ycvybw9L!GM#7gL5 zF`<8&$l@!NmnyIa(02bMSNNL+@#a2r=ZW-NH@7P}=uL`4BLcZgbJ?^i0jVz`SAR;G z2C1$VCpMOAV(dlK^d(zJnB%a~jLDtH$55J9M`i@A#=VXe;@e{vFYJGt?CW2=$~TPu zRc+e*1{K9cPXt}1kmL#JZg=&AJ#+d0y!z z0!m9NDargU3sDB-2mB#YP-k+`ZRYjO0mCcBzIps?l45LJ0wE=EcD2H!#lL)FMJR1E zYEOIV2mzZx!X$5CLzqKI`U66hSQL_&y15@ z1usl_p(KX8y}MjcDba^_^_`ZDonk3DSnYVYBghR$*0?$LSUG5Be?kB13ceMK2@!G4 z9Kej_B3D74w2cVr)AcPY$jahKSl(=^X9j+}L{9Vi2~a%LFqMN!r>*@Qff3RTx(_ikZW zB4k{sxqovnhs0qnK&)^M8J{7(?ZILNDDPsz$Pw6m0(CTiIkDSQVK*d*U-MzFm`+Sj z-s$<7WtgE4Pg;f^2xR;y@K%A7cfzL_AT=r>;lWEhgleUu44twN3ocYdgKn<*9H{Bj z-$4v55ETnTD%!f2t>D%GlaI_sDn(c3%l$ndB94`fj*}qiCg6d6Jq8i49g+l~d`gvA zKiQiNhdluSTzbKL%MbA9y=B{|bg3C$4#nze#+K0454s}-bLFs@Pe%spN1qj#WJZc4 zTF4toM-~3*%wEjWocc&2T!GaPKUpMCEfzt&$s>L7MNGPzn#jZ$m5!A?Sb{wW@e0bCL6;w{mYlT^^Mhvu#6D zRtRFRGZzY^{LaBbL7CfHNJtpLh4dv&K$<*H+TRV0a6g4TK-(iO-FIyW=iGo+xIAUI zD~0E6=)^-wPnv+|VL6@TqHZd>ZxN<-F{O2fJP!|0kqk<= zwIMaeEMb_P9*G~3MUs6rl(}cD9_!UPxk?Sl(iIYJ$%;HI!^_1}Q%`+?DYGdh*%kwA zxdC=}O1mZ%T{o!bER0G;_PwiSZ2`Jc_xC^@91UK#R0KnM<9NcBr?Dcc)QuwRNr?@K zR@`oPWIUt?S8Ys{gdjAbykFb)9T~(3UOnHcJQ29ale(srEV$@~Bu%apJ2GCV=~5c|M_ zBqvDOyc?rQdTE4p(S)w5H?tF0xj*EHCDeaSl6Ak<5uwW{!kQ(989W1Ao(v$r$~{Q@Z;Ko*H1NHHM_ zOmAe&k|^WKYqAmpB@_xmyI~|IRj`t9< z?xW~6e~CkDZRN6FDQgOn*I+Ffo!=BhYfi7d`NRwEHu$$ZOm2QX?Tb?XNsdbm&|x{` ze51^HiF<3*HkwR_Rwr;HieQoV%K28znzU6)9u78pDf2MhN6lC4H(%jB&CBP-gv^9Y zR9e2LFo)<<$PxHtkl)I3y7ZYr8IC)pV@^^P5%W9l$8}o6J<>x zBW2&*K{L;T7R6Lj1q4&g`2mw7jDBvV|01L?J128MkO+>4LQKLyvNW|?l*Kf)XNGU$ zUN}s&mwJrCt%GNf#(#Enks}cmEjsnAFHY|H`^oKV#sGc@1%lDOKU}mC=n^GRoih6B zpPz8Q?*vfVnXwPZ-2o~0uoS+^cVH|oUM`46a8zn7hm6bEL6vHKN|_=xf{*w#V2q2^ zfNdPgUir$fInF1^-r^BuCI_2KBQ~%=$scTel}oN{SdCkR=m~$^*ade}AhXEFoizY^ zW@D9kaI=(as`BLS22Jo$+*z-`I|^L3E6sZ@(`2G|Wj48%6%@Jsx#_Lr(& zE|72;&<&yL)kfUs&-aN;h~Imo^V#31w7c5v#tt`seFxuD_k~`3$?||Sj2&+$qqCCVR##&E(?T)t7QX~DN`itV?G=m^l?JwAK)`G$Rc0d2$uJ3>J zzl@6RU-avV?nzMQ$;ps}*}*@+dlF))(ZOV-kA_T4##o9{5shQ94b&1Q!;V^qMro+j zccHln%^KR)iRm#KNSGIBD#HTccQjdK&eN5IZdgTJT5Y=M=$jia*$Z2xy*JqlKDDPR z6$(!b)!)WX!es>pTRyLnFQ5F?4X~9jJ3nXZ_u~@M;8q>wLPHn7C0#x!g9p0REp>H@I=b50+Epu+jYMtT4xKGc zP0=9u)2C%EOv${HIV9-cf+kaN@0Zs-_iW@c8-pLqCp+MUeXU0<%d zyz>kFy=ohq_q4q}J~r0{ zW*I+T^axI~eqK{A>ugIMs$;6FtNDGjGkGEBo8GsEgm%^g5N5Wz6m+WPGTqReOHomF zqC=@^@vjR@tP8y#pST~~?uGz)RiamNi{c5BTLQDCJii!k|01}X4ssuzxn>u|+&Q6a z^l5E0xwJK#XN}a#+k5tVzLqVgW(-slXd?xc>d$VTSaNoActQ*+buL-iW;|2S3{Bzd zMmD+CQ_8hhk{-;q#IEZ*-NY|?Zn6->R9x{t!>!t6Wt4ThwSB>Dm@(}Vs`#TJ0ezKp z!#hYjVcsSa_x8J2P#w^G_gE$rUh;S}$f+-Gt`>|IKQAn+|HO_WKFY8_d1~*y z3Xn%_Bn0$>vof-A7QbC;R{je0SoX9U%F@vpaWCEC&?mW?{|qfH+6ZUajxFQJP;?qh zXg1p2L?`I*w9@`^wVR0%ZQOCQy8)k8dLmHr^4I_|7D33A*>fQpWKKQq(u-mtmx>Hd`+DEqMwOLW;L$ZpksXnXDA z#&DMGS6SwBkywsqBE9J$Z8;%#g6-e&3qMeZ1<{V@&IF95zSBVB;{Y6+yrxNeIw^I^ z=pg9`5g%aQbMq5x&Bf&h18H8o=uq^Ys!mY-^;-C%zO3#d?USlr-b%>l{SqYM5UqaZ zTvKBJ?TmE}Rl|)B@%8nkh0p%vq6p!V0}b=ehW!Z9j;EQ>10((A2{fPWtoU2S0B}}> zK13#YLARdcv~Q-;D;5bCBa?~c4H5H4b+La;svi^_7!EBkir8|n4zj6L5fy@mB*b?R zHH^*|{qwlS`6}XxEzT^NTS1GWc=8VC35-?wu7Glu^92tq1cc!xricsP_?ab*6%f@e zn>7Q;#Xd#mb50a0K%FQNJ6F?*3C;&r*Fars_3iQlG-A7=! z6u`p`NvtzlD9pK;fawEKbq`dIf00QjV+g8gK$H-&CXLt+V+K{pQa5kNq@+YJHlq&; zYiukBN;r}HyW?+6Tpu~SyvU~epD1AjN9Re`82Ho07|-le)dn3s7k|NcM`+#`CN0Bg z1K^j+imVYtTR@ZXWx8k}(WK))B} zg<*4UmrsYebSWvZwR0po(=QPqKgfP-0_8$xuNhT+jDd*<9-ZuQTBa=j3Uhp)$*qQ`VgQkB{bCJWp4*T1pbjzzi~+8hl$$v**D&(f=11B(o#D!4*on%0}ah| zB(vkWH+0JH4uOGo!X@qcy>JUA0anP-jXX&^uBf1cdXc%w9$QRnqo{k5p^KH&h``hIE1e9f{9(;YMoF4^rHr#eUz0$oZKlcJz_qf^XJ zdy8PLp3f>^!Q%j)F5hWXhm%1C8^{wKAH;g|JL zSTFI#!~DHcSD(y8MY$g&GPU5@q{0*37QY)qS9ZdLF&+>ca2Xj3zONO_>Rl3ET&H^o zV(sCo?U=SG#Hw@!uP6`a4<^UGP8aH7Z0#PYIMUimiPMz9Cx%p@((lDMr1ey%6ky5zR zXUPlWwTXgf^q9v*b*2syhCVVU9}NFnVi9h>-LDc0Tf0q&7~PY$oPIQp;nE-`OYqQQeEd#F zO&$ISUlVjoqBf+}UV!MhmWY`l6MBVe5n#@HtEcb$nK=0#X`^7of+vIz37SWU@LEj- z7uA!1CaaQY7%9#L%CHPrhG);>)RlUEY+VC&Mxt z7&2_^=}enp&cW$SQl&yV4jFdG3#AK-Om{$X?|PEXi8TG!zdbvGvLkC_xiK}E_F-07nB&edcr;6m}(*6GU%uqg3I;cc#=Qu1!G$(OBeyJdq zNq~M6rp{7f;0~^*j+2zJhs3O17tYsr#12E9^6*_L0tKl_*9QO^V>W6@$tC31WW?ly z#+|r3-*z0%ET;|!T}|j81Wqc!r>nA8ig-yq8D_haNgHOewzrxhYE)I3>yPyGl+hIo zHN@y^W$%y0bu(`~vVEDoOnbgZ_l#!ej!}~gqhCl#PjWs$T;d<_3e*rLf!A3AHPvKA z$daNWGF=0WysRFJDZ4-|OMj2!ADrS!3YNwWopBF9+mfkjeS&h$Dv?K7Otb*~LG>7Y z9*CZme#Lei^4IWO0>K_lpiM61>$L}7PUBDV&w!OZB@-9&J(8hHaAuG2M#k=E6FPjN z*MQ0tw|Mbd8}uaWfO2t#Lt zr?drIw>X8(BfuG&D3LQD%yDBJ7B?0~LgPCsQ|JH1573HR0p2#=V-c#9KhMx9nK?E) zm8R>R4;)KR4@M(MrTli4R1Jq`N!eHEkhpzWC4Et2h@J&~kWnHAwPQr`vyaHuuO^)! z#K;hE*J(HmEOjrl)(*UgmGa^+5rtO@8ZzZ2$}Y3lDaTDsf7lQi}d3 zB{x1P@mqQHwa=L%FQ|jO-7-kRnUeY;swR>o<}XlpdMxi+U$%OP%C~Fb(vM%y1feA5 zlEe?F)lc>{@5|Z7w|DXV^`6id{mWM8qu{q}Mb-GEUz@An)%Q8+C^r#xrjC}*UaxD_ z^wim3DNOoPe>%?#YJAG;_!}$ zaP_p<{8P!epi<%m0qXRB>PPi&^wSW@;t~juGb)P*%D7Al&r|CN9d=uJi?%2WUW=H4!0N~eEVe9JyF=%ot+C>UR{xIh^pUN1)L8Y zYtTN$SGbI%n8bm3)(?azC9wMhTPr5eHJO3`eFbJ_L5-<=dXG#EEs%oY++cw36G&yD zDOwJgDli7>I*AKTd6({U$CAmbYIz0OD;Qf7GV`Zc9C}qrA2k5-011lNK#2d_1LBps z4obWY*hEbYd70@y-){u{PnZUxA4OW0k?(O~KDLFJRk*=N3jcj$h|C@sqQu8#Dk$~gR?dMcaett9m8a{L+WL==2~3rcBTda*)O z-}Xxu7_InryB5@ZvX)c-rSv%c<@TRn)PJ(S=N=jVZ+GdPDjCFLk8`i-{T% zW!h9F3*{DMedidP2%lfHl{GlI-*FEeam+uSUm1@0bq zCsCXr$lv?bS(O#HwUVklQ8G85rdJ=Zv?7xEff?NB(*~Kjy{lG6W_G@I-}A*X5BQ^@ z={XX_$C2?W{oarZ_kq71K?-OG@bOtqiU_voL(Tn9RIkYGyo6s+A!zCK&6N z*2&0C{kyt7n_eYLQXryxQl>OFAf>+ksf&R|-=`Av;$LTU!J7 zgBVzoVrwpM!ptzl+5?DMv)#zxw~&1c~$#*xOdtmy&(AHwH!U zcg)luP=5(bMJf>Tt*aNNzt5xb9}fA=d8O$m)%vCTUSHJYqAIKgb}pxWWa-JihVuKR zyfi?p24B2h7f$KP#=y21%IbbNnwWsXgt2CrH|&m0Pfyq2>|M9y4e}>#FoBBKxwX)J zaHuzbe~wY+`p=n;#`#osO>WEI@$~$Rs{ zOYH;HmD?205X_CQ_}a{8`09am&FLQe*l9OEC)vHNI0z;5`EM|EZr0>@wGN?Hg#9c4 z3M7WosK1e~8kj@aTVmeFUyJa~>}&X8grAi-8eidxXEq^M&U7*zNS<^omW8VdxMW^M z7TVQSYe&KMm$Hs4Mt|holz`*UF@ucW&lWwi%8G(Z{b0L`(+U}3$6=_s#X4Ws=}4ao zLbKj@`gumZu$gRl*hWd~2kwRkhfQg|z~HA$dcs}$N>3vctkcI!*)i6w-VbNZ?&v!$ zR|5<&LU4hnhmp%w7_B{H6@5iw8-B!m2rg%>o2VO2YLtIhvQ%A+Pww#!v@RKkoJi78$LCpq`rCdsOo8-P?6fKI3kO>kmV^CGA z@?1kfc9QB5_}Yeb6zQo@S}#?tZo6^Q#Hx_m^Hce6?7WWUYX!{mg-zIBhNfYbvObGp zFlkF#Rc4WM+I0lKb_co4%6aamLMA4xGKVCT6e(K4$~)Mf_;?YunUvA#8WnX^$>D>9 zbz zhH4WAMdr@Aca+V1eNqRPI$TI_C@&T1>B5SPS!ye`*hn4#1>OSu*>>Em{?Ia44_B~k)oJd3kckKlj-uTV z4M;b3KOYPSsa_@wbvUg4q+~FFO{hG9Cbo=08}6XSoi93`*ZG<~=Iuzh0)&z1tE>G^a`S2RP7{*ZfT?b^Na(-1ah;MrDiaXbeXej(U;rfd2XyiN&Ls8YIS zOzD^w^q$0Bkroe+mBFMZQ{0crIJw zw_XaTeiw4sIe3-T{%S9~u>3OWZqZ%Q)_4`^yX{A5**#N=7P({w){%wnai(ljxTN5t z=-_1eGhaWD;J)xv0P(lSyrs zlY_%-L+Gh3s(7Lc73GPw2M=tS?5bi@1@I?*u-Z;EgR^}q=F+?%2ky0E0%Vi3TQ{ec zd(3gvaI1UA3&3wHVt8d;g!AaC`&(2lR`I zlf_mee*n$)73-e~aWwn*JEikGf0=#HY9_$Ac zN%1^^5oyyirxfc@aP{m_Ci-LnBK zh0n_^7U6T|yuX&IcQr8eVw}*q1RY{HM137)S`S@i!Y1qx4Kp+W>giyZO(s)eW9c7uvm#*b)og1yk_8@TNtevXbPZQ-Y%B3jfBC zS-B?O5*&|o9^$&15b+5xMo@*}K$nZbmN2AJi`Jn@4f3SU-%c(`ZgD#!V^r}IZa|^{ z6%%D{t|rEmi$%~4%?6kWP6Q%uR|O15^)h#Dv5k@AAXUrxwR1FRL; zX{o4C5gIvka}k6%jV^GeUlGq&Od_9LxFl7|}099L-C|PS4 z1}nXcW?ev!S!*>^Cb5K}q*f5YADg0t9-5FN9E7tgx`i4f+>2$7B}8|^iJTzissa4G z$}VaL(HnEfTPIn3Y|MCO+Dnx~ybms1dWx$BI0zGOhmu@8wo<%m7S988Bn>mdbD|NZUhxhhBLH-M z*HAv~ZjQ`^Fww2IGA`rG{n3lLfq-eMKY=PL>*%cSM8I-#uXe*I;i&*$>@SuR?u-jB z*Pa_~l|wB{0dl;p!G-V5jmA~(_1=;G@)E3D4aDzMeM1q|`Wo6}XwrB5pl@5WAgr-A zEn2mOCYJB;?68#ApPAM-P%hCFUuw&r^Glu9GrtcBRnfO8x0Tf8R16K`P=AG0eN7z) z({C~y2Ptno+035{hrMjo+6dkY740MYJdzmAKnowo#N_FS`=aHw;wrFyt>4~`D7Y4l z>N?h+5I@0y9Of;h_xSW|peg8OzG#;aJ0-B`yhf2ksQ@m78L1s@)o+lR_C(ttbr405 zT--|`OgEUkM{6Y@k9>cML@U^fFTK2GCXU%Zp(TLH7J$jK)|^%A(uzE$CzX(8J`j$1 zAC@g}bQ69BqzFf*Vm-JpQYL}fCKW}KjuIwWtJs894k{`tI2AWrz;xfq$v#q1Q92O% zr-7^Fm+@>@HLvL&X2~nv0}}U5@5cGG0O1Dyp>wd$40_yk!~VMUBp&icBR*XPTa5I6P0t;o~v4ri0OxT(l8!?~qm>lI=Hv>#xy zb&1gbcKQ7C&p*L1|D*r^_x*qW&c(*Y&PHC|!LXqe)4Tk%1b{yu+)#svNWmo$n5mFZ za<*#;zO?Os-~IbaCnncX4F*Ck!?x3K z(NOSFTiR-*OQuo1d0w_}acv$a*!HNim;b7)4Hev4U;94l|C{9{9l-L|fxXEV zwRx`PafcOoM}AecGzOK!B|8R{^$A8?zHhlw$Adp>XL*{F<0Ugxe`)*Yy;m$~;`zp5 zOy?(NU?H2D-a(FAP;C_PS!l2wP)Z%lXGikn>a0M=N})24(sg z_8bls5nyYpdA!Chkfi$5+^l2bvU)cD(%=|`y9Qe^hh#BMDm;Og|0U6R8VG@R9Y?rwK$x zvi3-8RsNEB6w}kF@5KB@5CkLMiIKs^CICgcFo&?7FA}zl&H#aG8XT03QYD)Q2V5!| zn9cPd4V_)<+6-_3VI@Ns<}^{HNr?P{-3F$+hmucL4f;qPLw3Ux-Qxh~bRM5TRW*#n zloO;9z%RP|s6Z~n+uJUwbgA`&Mp^B=dYM6_%V=7JcJYN7rx9vo3sV+pkdl2-GO%c- zT}8J*{J|mJ`h;vIfG}ZTu#8cS5D;xh26&E;=Dyn6Xx50GehLx!_G)BWao>y$rcWUi zmN=Dei~e&X{%WalLcM7gSCaC2Utw6B^6bDb$+Tj(eMJ=Mc3whJ!*p#Q4uAJ4USXSf zxc_V;Q*5j3APo6jTw-x6eg)y-AnV&28X@c3bQNq=`f~2$NiIfV<%pS*>+GR)5*ToS zfimDlF(lk>5ymnslx-?9OF02+(`44-J{M34s4?gS@fpF;luo_{0@cZmF_!yPk1$W1 z0}{f7PvvCw)Wm1&CTBVQ&`&QT@I~;o8LfO(o3Q$%iPsN9Z zq9vs`XP7>sp&^;tKzfI9jk|>rZtR>@KxAXbjCXF$0izMnHzNC7>S@Cw@wYDF?#pWv zjuB}64mSL84pNjl)s4iG*Ui>_t`xFOV3o?Y)l@!ivn8o7{{=caSk11Uz9ZU23s$(! zXLav2JyM}EP6Q3UZrTNAFOnaA8pILhbH5+rDnu;0B&p#@m+Ajkf-+V%Di0wp z$N9SHY3om-a-5SgxK4h0vm~ZAw7D=1d41Dtf-_r(VNhYRruAV;o4-q9H%QJ~*Xo&Z zWHPIra8!vN36IrfY5{j>7<=B&&H2N!SCko3^70je935I$;%XoP+85$LPL$_3UY z6S9yZIDE9x;VrdBdT!~#1e+A^P*qBn;}_^+bo9BtsIG2M32!{~ zBMSINA!F$2vFiv?V4>{1rbfnjh78mD$Qc`xey%H&#y@0A!Q`)-z9HfX{bCPjWs5?2#ieqMI0nH&k+*UR(tL9n@*0F z!7j#U$jeH~^8l>`gvl&bEn(J=ma(}ydtD~5F?BOy4riHj%NGsszxIbj1&R+jBGvUnY_Kc(U@&!=*@CtEyOE($=%XsP_~l<)yxiz8Gd&BpV4y$hwLGe zg>_y&f9;@~Woj9&u@bRqGje(|wZsJd&4SY*RN8B?4XE5HRB1ly*F%O*vgYQIsXb#b z=+v9pc6KWd&OnKBO;CI4ho)Bs&=Z$jSB=8Ff(04c&1mSHvip6uH>RU)O>*{Bulq4G zL#?521oT(BRrNe8KGK2=hbaQiGHKj>Xi-QSYwsK=aM3#LV5E(7iw5`En+OQ-^78pqS@I2`gxjubNq5_K#@#D1(I?Q^B}FQ4j3 z8zvn$oeJV#KPR@|MDS|2oC8w^nno9bi)jWne$LR7>`$+IjN4i4E9ibU9X@$~j8_Ir z;|PymKQyXhdOxvKtZScoJny=OScjudX2jijy|vxfZtB&_0hhr%=MK@mcmir=J<^0# z)4fW*dTNoGweaJJYIzTgQZ(n!a5v#Q7f&SBUj=7+#TDu= zZ&p;;?wnlpEdRE^sEzB14(c9g(h5C6QguF_%Xr7 za(s(i{1YG3+x3OV)1TX0k&om3xYj@2KfNrFYCJi8IXD$0H#Wif_@K}n#?TY?bMrdV zocCL9D}K2)X_@`7(<~^F*-d68xe~@tu*GlXGzZo5B5xbZ?;SKJ2eNm4{Y0>ly;Qz@ z!L3!`$J^H2)JO z>)LL2TS_zs$%CT2$d>qI9Z4a%poJ(L>XdkCKYwtHW=UugyCrp>UCPID!TOo5CvZ#8 z;|A7~$r@q`$tIf7^`}3qtmenOX&Ek~!K0$K_Ky!129bwposePYLp$XbzN|QcpGNmr zw-HE0i(>(aZu%bGh4=mVUf6K1O@?&`_9)~oUr$lMG)jtvh-X5@ycK&jmJWyCQGpjWx zt%|HRPpl#~+p7N){XGK*1NQE^NFt-6re1@CV=oE>aFnEKn7yS1J&k@2KXb$c1frQ0 z@TX6n(k+W8@0O?ofC_mN)cjP7D3Mi4_@#{5nk6fCJpjMDJBzEf+zVB)D)jCzf_pxV z6MsuGsxDVy@^&6rCC=L9CPGa)k|n&@G7JkwHC8>Ij;RmPd}qe;_2Ui;a|7qI3S>20+T*{Q~>F?L(+XS5n>QOAG-nHjVb z#O)f2k5rRnrId499*Ak|#F@ttL(t@VfK!=MC3zI`o))KrFFR>9?nD$F&$_772ym^U zOriLU^)WEFr+UtcodOXQBM}oEW1ynR(Ok5ybOEcHaGb~iB1s24)`hPvS3Nrsv4)#F zvp9zPsNCT6r+-E)zu6rT|b z8$bq+{tf`9DH2K>HEg&#CEV_AEml$kKng&&oIOXehMNW*KNNyu(*b3${05E{Zm;;2 zZ^Ykb3hbG3uj@A9kLXk}Yq8EIE5)wOwgNGveHIyCO^c4eee@UTzyx}e9X?!VcumA- zs2uVQrTUI6YQSvwcH4gybwye$K3_a_6M$+OQ>1y0j{zLlp>t;W6j06D?H>HL8^Xhn zhGaXDg4ePfD|Zb0>j#}jSH5*)Nxy+SqN6Q@X6uf>_YUAeYu8CVS`eHG2m(7N$z@Ej z9C`sRZ5zq9%tk#*{tXt&y;r6(`Fo{8oKi?I4nhFcM z-4TRqjJzkhY1PpfyR{-N64UbY;0!PmFsnZs7@(9IMDY`?91DU=hEcPKf zk|lB0XBsSzfBi7~dWtG&s^wYPLPd-WsgRU!7#V7JW%f{o%FDNzD!OMW(2U7`h#dqf z$6kmizAr9iL0VBRr`g5rJ}(qkIH5C*v|!87)?Vza6`?kqd>cqg4jSDmRH6Yk2Ti(4 zIi2D6+I%Cf+L3Xoavk;ZeiG4pix**)BljB)V;h&aSnxQC_5ukSu6i?m+oG-;JxfZj zs+Wcy7;<0A)#WzV$quQN3b3XS_W`HGtizPlmQu%PAXKfK+0yzFwki00M*Ylh-!}cv> zWA}7{LezhGtrHri0B1m$zb5?!m0o#&>%`WVi9^)Pcly~c!S}-H-Oo={g{{Yv4_jfR z5Fm^EsBnMez~X(9(fW=2&M0^gL?{vV{1cO{s66H1<0_Kf!|D0%%;oF-vOA{mF*tVG zzw$8{7Iv$l(sUj3BC&WSH@8^eb?^~)+fMNfJWipr_TPSE|M};ifByOBpMU3;)zJSpV9&eoGS^X>yJFSmnLbIOFacs$0}-C%d&Y$9Pz=^|8U#;!cME@}08 zw?cO(GRpW@C`n0gkfBztKW`jvC@6^GGAe!@UL9U$c)4w(?cquG-8yPpIx4*t=a~^7 zB9CI8=FexBnh}S?loKjj9~umi2GhrJ1hv=lxiG{b%YswG>)n)$H+hQTg6FjRj6ZW4 z&D)&4FGKy{J!^gwU2h8;2Wn}on0u;M6Codq&PN5h9V9)e0Q(qH`$^)1zu=t@4DNUE z9!~m{+ZK{N*p%O#=G*x~-WLz|8{a!>@CVE0Om@)3uBdapto(Xk?`Lz)>6=C+#!21haNS_-}$Q2=wkVT5CIVVh{pXNj$FwNbTT;w(zNRRUOxD0+9^B<9m|J? zRg?`CkMXJ0$`oeU=@Y)ah&(2S7&`n_@us)H5h@3gku20ld-?i}w6yV_9HwA9u4S;T zoVcdTyC}M?@ydw1A=@G6^^2V#6 z7{dsY@8J0u%*YOou!TvlzbWtJsn!B%V?Z`YtVVFE;+;u9Deh)=_XcvCEpg^*cMIXK zic@DdX61em@tgNav}1wOmTLXpCM23Mr{T zWR(*ggKG5^5C0|{`E5Vtc~0krWaI|^XPLsV6#5BT7(#=J;R>lrEJ#?*mk?5E*%$j5Ze{&HogG2MgdHCEPZ4R|y-CGtMo< zPDc`#&uj^3@4ZMvXTE2S(VW zJ`}B-fkhOKW=^)qHNp;YF&7dJ7AFa{ur{Ym-KP|A)zt{*H`aff)t!~={XK?3apGT+ z#rrxr;vKK5YT;{(ABr0T7bY#vetP+=bLym8sqV0n|A1c2mE{7t55c|gN;0%UltA<7 zzFWc6-)JRC)sJatSz!INp={3qi(CVSQaGculm?1V-R}W@iiUu)U7ySYqHEiwg%R=v z$AHu?+Fu@i5^FA|BRR9r@=ECg+9f{&reB^gieX1VrK+s@#kE0={lJPJ=Ovn?n%3ov zUY-dSFqx;7kpD;%DsWUkB(WCBnZy-g7)4KF65JF^z7C_wqWwy7pF%{tBz+HB0k5zb zF~6`3MKle>`lJ8|rPhO`X!Na9>0MTT?7&dnZj%A+%WuKiXE4M1!Jj^E2r1nr$0r4s z1Z|y8H3+|kXgyGTHIjsraC)5<;>d50*S6LC6AWDfSJ8xQ^2qf2*Y8i)i$GQ)q9hAu z_k#&y+FRV^@+;&I@#dInF?7vc7j6+!L}BDQT$ld-7~6I+A^R4V!dDfV;Jq0my4rNO z0$8^H#oj$Ni2`(Mf-c*(ZQHhOSM9QG+qP}nwszUJ%{enSrzc`=d%o_D{Y3tUeBW3Z zD|J*5Yi(dW{|JJ)kE-x;2cQJ_-#Mx%9kNvr53{Q6I{oR(b~o8cW=ltgGm}M(%zD9G zuBXs|*=I$;qT$5`URqACTNBcbL(x;)zpm!eFchvIk2x#KFSk|5H)cpn4^WD+WO}Vy ztChe`MRmanhZ)UHWk(<*gU}F3+gt_0Y+rNG&|Zu$LNp6^`{igeab0N;P0jptH$8}Y z0uz)K^kq~gU)i+_>~}v@x9zN5Ti)y_rQC*pQ*ay>8X8#N%73x@)Ut8OIhe*}JF?$K zQ1G@5orDy`a?VO`ukk9k&!nB}XXVn?hovROib-+1(X9PzZ*eu18fm;8D;^p!5IqS& z=RqOO0KP!Cd;NhTrG#sd(jOR#X2%U+CWK5nYaGxBLR+&1?+Su0(TPqN%*iSF6nYd@ zYZxn`=ZMz1iSCDMqb`+$&GMruw#0J<)u_anoNqD~o55r?6>dX@+q}rDKpB*gd_N?Z z3l#}y3@xsLPbZr2NV+xdt4<}OA9a4vwuu=y7;M*Sm0UXKBwnBviYy_Vvq;R}II-Qo zDVDouG=9Fk5Cg&xy>DGBa~RFu;K|W(5CR#>Cj*>>8w#O6N?=4gosvh4`Bu7^my4u6 zeq@~vn}|={sCaHJ60h_p2k~o!liV`z=dufq5>Ofm(tUCvy7 zILrkIChHPKGt#v<nasn>I>j^Ah5fP&>N?G-4eAJTYQq71=VydEm|rBH9?!xHJAu!Pu?59Ql20BngIK} z_jlHx^FA|6KdR7LPF=db;8#H9Up$V`JXWYG`FkSyJT`lz`G3(uG`e~;X4D_oDR&-@ zh&otxWo7kxX811;_6~B~i}-(0-rTSsk0-8@e=J=&1D3#le%*!SgUPuf^u3H6{a&ut zoqOL*-k;v@omsg*M(&>${`^!T1bsdpW{7Tw?d)hH_q-=a`2D!Mc2bFWwrA$V6D1LK zxOMBG^0LH-fMgv%j#RE9uh*PUJT1WBBR0s6u(j31ST|sbeUi|!X;-eZ}?pVHCyE=Q_-`zVmaAnY{Ij<+CM#6gu;re;fcyiD{zYD#} z?X60`HN*Dt19$Zep1`L@oeG%FsLV|b5hr|`c{~{K9hSe`(&2A;aeZ$ay;PG=c0Gdn zw6k*O_M-gm*`T{_=1OQXvgzNk>oEB!(krfd7RuwF7m5IxY7@+TK8DH5-IM&%_j%%< z+_U1PWB!8W)oX^M{CuNJ@ezIfr$gdD|NQgMKmW%$g81+Kf7*69ZKz~3896zBW6hcu zYgejLXsIKDz&t1}3SErfMYT{-_W%G7z5oa{iv$0zg)bLEe$3}>we_a(qC2{eV-ohR zKwt^StDWLJ#P7P%ksK!|5vTBL{@VEbQF(c#&(&Yo{-slSFMA$o^XvWj`U+9fs!^lX z&R)A(Go$9_XgFCrdE0+`TZ2<`bvJ@$!boh@S>N)*ud#M@v}9K!Cnql}bL}3y{dDsm96 znXz?VRdv0g_0FU6)X8e}1+fBqeobm~dd)_~L~g-C!NSMY>{RfNRtYQWh3!&w{^KD_ z#T8QuI##OT6>vJ~TB9|-dOa;FXpG)srrS}WyFke$)=S_<#hn3pCs+>hqa{CZ2rtRH z47j49bp3YVIt#6v`XNojC;>pd2cw1Ljn%gQg3fGfNfsCbo7lp`URuH(*a`=oIkCYU zfbGH?;>|cj?0hQupI38s1H%ksXc;h$Z7~r{hYoA<`YbMn6?ZP!w?W)iwL^cx8o(6@ zu+8R^3b;GGm%CzIKahe53tgnfB)q|@)G|$O-bD4K6J`7tfDqURbO5KuKf~vXO)DZR z=Jn?rhIs+Ke-7R#W(gp>H|Po}!)Tpg0pylxol%*^i&a2G2|67F5g`0K48oKR2O=;L zEp8L>I$V%vjiEBKX|*m$M*l=-Lf&^Gm%Q;}h*yq(;Ths;BJsPzlhuJdBA|p0GtQ8> zN?y2g*ymf@0|b;hn0zpXP0zAePwgy#m0D(|%SJDQK2}7?-5m(RhnN$Ng!2&;B}YgG z#;9jblPlyHumz*0h_ggu8Wu`#W5`Fwncew@?a}2JQn)mj%>kFqVdP<;c-jazkyfKUlH%`Q2;sR2@}rJPc;&3IP?G-B^d~di|Y+R z2IR9vXHSRb#M75lnL9;&|v)#RC>rIk^lvKU!v3j z94ktMjO`zWsUTRE_bl|o3nUwBS&PN@X(#DhCrwk!j=s!MF-pCn^;hZNF!~>RzhT5 zyUY+R1PbgXB{RWGW8TM5!+;Yxf9~O*u{^cuq}-k2O9Ela06~rd520+A{AB_ZMGmb`BLo`zDS#jhZlTwN-X0xJ-2&0y6G$54iV?iU>L;=iNAR*Hf6p-PQ=wDFR9h z8efu?7~?#23A7Xj$0JXr%#23`w$lkpZ&@qzV1o{4TUbCC;mojpNvX{~xh5>D^4E(c zSAqe;;UowWOWdPm%I%L`x=sbJ$9Pe?YVAaSE(#%8fP=YRmY@oPtnJr@)tQ8B)n>Z4 zG0)?m#m%BJ&?7RRFyHlLEdm1Okm&~P#>T3$j8=D47eGc4*?dgPAcC<6e1ax;ow%B<~C{z^GVeY!7ZWL>` z*9$2T>pA%~yK+?ILX8J1lOUHdTQlU z{n{xy!fk(nkj0Cc zXq}vtmT_V)+4QfeCi9fDgndQebN>0=)R=v6$6(q3S#hcrh=sUfT_wHzt<^$6L`mHCdXpvowDyCuwl8Vj^)5`hz%@?f)*-S`7{5co z`Pmc&?R$il!qMuyaGci*JG-WJQj=oYcq~vuNG$RlGQEv6$EVMRBU;PsZdo8a#LJl- zYjy~RWb^R^tV&^R$yB9&@6IWDe396bdH0LoaQ7?gx1V2y60Ce*S8sc-hQ47f3YB(_ ze%|lkwAZiF8~Sb3sh_6)zMn?Z%L*;4Pv_6i=VR1uulvtIUE1mDrQMIa$IrFueV$TG zo}NxEXl_Y0oPZ*ZLP9_{vmIW0*27YQToHGG)!di$Msy471Of!x?EdDtH#z9N{e*h% zr&)XKxpcCsF7j?JbJp!iNXPynSq)`XomE}FeU-I0E;TAOV(@W(F5Z=@_m{7E+3V83 zRI1O1he>h1zCTGtWl{l+R$*%RYv=m|0|BgW&6i=|uCMi8hv1UCm;CVc%-fjq4@+Zx9uld^AIm#x=r5TqZF*PmUEE*Zn5}A=-Vvi<)<1Qc($T$auNzyx zRUPWtBfXUqs>I&!r%`yf{A&}S?230Oz6Nc-FMeHU&;h$fg!#!>=#{?i&aOXAW%zhG z_?rzMx)r1RJU$Nths-q4Dw-Qm)hn(bHdbQ>(57w%4fURuyLgE}dzT=Yqgdm~EA~8J zpsEsOfunMSFe)2~qYTyg$vu%`j{C_ow?bLrbjs+KHpdpA>uddkC#5*!d;rFUi`e-N z3dEh;W40_ydRYyu5>-|#KQ1ge(3TbojzL!{Ip^PN$GO(RhifchleWUxSa$Otu(a(! z>wbytTGX7@51RMVAUY8!iH57U0X>VIUC;$E)*FUE@AGVC#kC zoB1i*NUdVaAG`?h-8ucwU~|24<_LETN(&ZGZxh?4rd~ zxspS4OZ{}Li)DhA;uYMwV--&2&p*+;V@D#6XW^r!+cp!%H-|t&;H#!)p0z?eZ2idX zT-62u$9x2ZSAf-?kOc-&(~qk7MX37&iIgTgW%bDS2V|?m@w;)A%f7NAfR)@>F0+|s z6XOH<8n(y>P4PIo&W**?jELJ?_K}9cNwc6s0&-w!g9_dLXavfJ7}0YQi_#%+Tv8Zr zgi+AKIahiI13qUCxnOa!ulAK(hF?Cm8A2&$aC>~ltT8OE)a6~C5gI-=&RcX zygN!FAS9lgr9(ix>)?~0o!7%vfrCYg6lM}97olu9K*tMcA@?poRo11LIjC8u z5Ns?`{=`pmgAB~T;zxo{`is;g>~G6)HzPYsO{2M5uVo<|8O38x_n^jFVqgpj*D*&o z+5E|!@At3~Dn+BNU?^}v$3)+%)F@uc7d?9Mht0w(mkCb9Yg;;o&UJ67rgQ~)!j#}< z;yLZvuv{{ZV&2KW;q;z@+sQ`)_j{C0^W(}*wnf9^$D_-9>}<9SOrShxHTM83E5}1j zM^$GBw#VzwIx%q)#W(xrqPQZ_EMOz69XKae^8izh8*f%KpNDT6I{ zX`jt4vf$;QVAi2*iA&Eg(V8p;t}IU7GEZO25=#mA#g}fKOsC0Eo|W&_oGy9~2A>0V z8Lf+{xfJG+N)RnI2re+(Ak!;lX;V7Ay$4gPNq*3VdMc%7g)^Eml%5nt(2);tizj@| z{?KCxM?}5VY*$llP;qvs;3{5%W2*mY4VagxWF|}8Jc=CnT3szxrV4AhBAI|{0CsYL zM)F>53f6@&zrm>`;!sgj7aV5Pef9E<>D&OpN!h%tC`68JF`>K*6h>~$Dy?=EWhd1S zL4igZWl=aF7<2#0n^-t`0eS*G>X;NXslcAhV7hEB3QSb2)53l0FX4bN7z`TD17+3s zWeC&bj;p0_B-_*^jOz?xRF^C;U4*^#fx~YkK1bLIK9UTMAvvx5oqy>(&jDFMvqU*r zi*Z6EJC$p42mY?nOxrFZ$8hY-NH^n$`~j54C+@D1`kf93rzh*MUJUL#o6tSOFbtWF zO2hfB^vWF%*aX%S*?si9+B~l@(9~*|^Ny?xf80XHd~rmh#pG+{%Z_@r?zZq3oNj#r z>1@>S(i_h)B(?F@2~2L!GKbkS07oZ!zFOc!?!pc7bely((6uWIY$-7+pgJQ*LSfzR z>F~0P)46Rcp|Z?<30z90?{tWo%6D@&&;A;#vN&UoHYZCo_bAhb!sI1C$arnQv)+Rd z0r9WX*G-e+Zih=hNzGKJ2n9y>&0G+*w%scxE`j_5K@cyr3R-Dfp~wk?(1kV=-AmGF zpo7MdfJ~PL#HR*;U@2Mc+7?@u?OtZ8iRi=y_N&sbxL?gvF{5nKXPE)!2|N;H7#g3S z!>Hql2>lRi^W$swMUpdlh9i>wx2Mq)U5oLD;IijT7Uo1+wrxAlb6c|{M0`#R%2;}$ zI~=PRhA9#qKIE>zH1Mk29qkGR<*85rC_J_NArTMuCC z?GD8;T&LYrmCX7+(4;0?q-8ggJVcu9@9Fq-iUdMAEOo(`Tb83&>;o~V`e9}=7-Eir z%r6%eSk7=x+H`X+dt)G8%W9{<8?KozH|Rk~;*0B+D^z)yM85FucA)JvF~P-cSNQOH zqWx(B%A&gsZ%F%9!8OtEAP7dGQ;NhV$5X)r?aMhSWdvjceDvPsX76t*b@RWMb5&mi zT`DvBQ=xq&o)s@YwLc31KQgK>xX)==_1(`v2d!roQHH-^er9qPv^8Nm6C?y z=HzGPW9JwU5MK}W&c4n-iGRRL4yW|*k9A!je}k++tlJ+hcpqB6y~P*uq_TP5NA59y zAxnCkC1>z){T?P3CdO|0JwB$EiXIQ){hU3Y7Bt_hm6pWG%f^t_q*Rxm&W?h{%%7fb z`v8-YQHmZh_{ZMfGju%y@$(KZiNA*1)rF6rYfC-ldv=2I%a;8Bc;s-v|I^X%pMU=O z=b!(B0sRmCf72Fc4Dot#`sQl(re0kq5$mFngmg2~MkD;uBqJG5f(!x>lL6tFmOi+r z9&#bofJyK`Cw_OnZFrphNWQSG8{}rWq^zvdoB|>~xjz=hvbdu1rk1aaZd*8QG}-LV z;JxekkJ-bn-^bgu?uWYJXrE55_xDQNEI$@82@FTisN|r~{qBM=ef>51z#EnqhA4u$P2@A+}MJ z4oZBSyqw>UiPN!DX?7Mrs%iV*r+f3b*?OO>LVN8!DB!h8r}P;e$d;*6+cXw+gR4-z zs2My0C*|;Fr{qqWtPY^C;~Jo?O29O8j(v*gHwadi|EiKUx?zYhK#ep`Ne24;laboQ zF-9u(evNGbZIOt64Td z4YvNVgj|yVyLAOft4KDXd&`z!!^1xP*faU!SeQ$#+qi*X>F0O`Ltwu`+O>+ z-QcfmbG$1L@N3SACn^J*4i0)AxTYlHs}ut}5;eu{j6Ks&i3+0&*Ch@QPY?+WP(Z-< zB(}#wvXGaTXIfm?@8%skXXW7pzW7SP8Pvg0_}pAvT^HK%R2`Q4tswh)xd-9uP%|rC zu$U#0>6`KQSkwsM=ybA}vsJ4OkrLrd9+-mp1Nw&(4{E%U6xu_BYZZnEtE z7E-^%*WznkF`fJCJmw^fxp5#Qb4{@_h+-X=5GV_Fgrmr-hom#aqRFcagD-Hy)Wn*c z4N0$^IL-^KyTX(tv$Arc-x(%Tbb0R+$bjx_K=*rbZM;JhaS7mycs=E~AD#t-0~?j9 zF9!LB4KSeE8*lw>7A%!)C!H5;V?8Vjrzy^O)Rc%JS?qIkY&z;uY?uF-F-zi+243!0v*d#Rd>j3Np#}adKVyU89WgYBhu!BGi>drV4SJ) ztgu}ha=f62)^~Y9WnQ*l%G6gWulZu_6E|xAFrf{xL`l_2ltzZ)?r~N4OjDRq>1-Mu zkw&&ru&E}HA{hI#aZ|hyX){A8qC}E=uM3jb1*FbF8mHO`@fgi2=*KBxjWmIsBGKoh z5!Z}aZLW&zVoED2ERB_nqUZBO$)WIJ4AD3@iu%omF@ikt`Z@!Z#i*jNz@os&ilWQo ztewz9Y;`h0Z6L;G{lFQa8aS>Dh4uCAHLDW>!M5nsf+&@ctd=TB5}KIeqRzwg&^Q?T zx)1YQOd_#QYwr_8QdAfOUNDuHRPH9_ETT8;qSRmg(#(yu zlj(PZh$>LDA}g~Nv|%MwL@|~`;|+GFSSQ39%Omql89(5r^ea3lumcaoQk|gQQ6kj~ zr-to{<=%dJRkd8r_3R!)DYKesN_rOkjti&b@clzj`+}^y>0f}`SeS3swA{|c zx<6lBasJi?n%N3zb>GfQuwrr4S|=K*gw`z#%D0#pL`*_9gx%22_(?0|oKc0wP~bM&&b`XKEuzb*wXmvMGrBE~~T zng+3#VON#VG4|o{Ae1SbV^Nb_97$alGl!(ffZ!>7V>m->_n6#?gC%wDv|@%qzj zNXD8#dE#w>74prjjs2ilbTF0l#Ya#+5#rKuLi!$ICCdRoYT_MOMYqFHbm4_Iv!{rF zd~ZiV4u~p;o0P6yT1)btY8mQ6M3DQ|9OSrLqK!L`9#?Vu;|L+0oCqT*GvcMhNN=i5%NsrEyTUidCML2 z6FO-oq9FpC=HYk7znj^B`TceInDm%*jH!kSv-EZM_LUCwgbWo`}1_4w3~~UN6-H|a(<6)KJseJ z?Bnj(xx5@ZlP&@;&*v3<3;c**LDFcIr%^r);P(ri4AtWCpH5}}{PWL0|NQem7ZT+E z`2Js86k%ru?^EXrxeL-YyIFE05^Yk{KRDlJ5rPvCu|h&3*^S6jaCu%$R=^+Np56VB z{4N^gDaCJzeMiI0%x&)GigUI`1ytk+XOp>!yK9%7*-H|N5Ne^5^WCViOyuGC^Y!I< z8oy$EH|NUt;e5c0`!yuq$jM3BZS0O>EbD{rYc{rJV>#zORgTStZ)ameC<&+d&X8x6 zenO+I)fsBnxwB+5>rll6f9w5%%$0ih^&`-|IIV>bzvn!qD9X4A4^AIGUP$=qxg@9j-)nwqtd-q5!*5g}lL!ji zn=5>8_urS<0g<*5_6m!**Bc*ib9^=9gwhJVBrTU`F7K7qBMTPC-E=cZzSK_oPoJEm zCooN##P38YlDq~XNawA~bM@$btO=*&?yE1%bqt&c9b=WIy(EMjG-=mlz*;sI7>CwdX!!`*j11Nj<`3Iunhh zL3DehFrsNtiDPeDMUXMmDUc-_aD&_A=1WC{`ip5Xr}MQz9melF)p>)6X$J)u`<r?P_aSWkufu_j8|zflNjac znAK=jsrv_dkF7W8%s2RG?T;*y*JPLsvFcY`zk-Wf@=tr0g#`hzmhWtw|B8+#hX57wF_I=u`FFX)Gw zAa5m6hS2M>u6pt%i%r=fkM))a9)B=71~RoM>QfSrH^hv0xg}Q7RCv}xrldq>!ZwK5 zgpGGzpjufTdkhE<3fgOKNa4gAZV#f21csBZYwHdv>M7W6i5AJUf(;R}Oo}ug>B5`s zrinOk_*n@fs0WPz%U6cLJO4n$n8-Yyml9B1FWsr>3hRkDNT<|7PPN#Sl8m zu-6O;X}Br*hHGlyUZD=z0{D;*@Ifz8$c9*vPF%cRFucvWLg|PKVEwV7-zXE%S2i|t zpI^lya?gB@dGPi)AwUX>ij&8=z>tT2e@3Eb zMwKXcGhr`LMNwfuPIL+^l{zquB%!0QyzIceHY;@qx{1OuIBV^6svQEhK74oo1+0Cw zI~ouBPx;s$Yl7_Nlm)VLgeb3FY}i6!{&%k7o;Sj(y8>;#Rqq$&@Ur?98vJ>41|;_R zLWIX!dpy8iNwq`227s19`CIh|jjMHK~Gd1xZGzMTU7ySePe~~*aP)aa#3oZX5SfnoleTYE_IU!eg zdwR+ol=_vTl=ZuNThT1O2Q3H@F;~G@5XO{7(^2VSOFSi zQQ>#SOt`J+Nuqv8M4^-QWBrY5f0~sMbS?3@k@w)$FiQZ;jC7aauvZM!Z1A*X%3yiF zCVnjIKA@E0W^K<-1DewU;nYUIy-=@>EQ46y(2x0dE@y>Q zPR9@yqbI_;x^X0C&f@}Z)+x34ZO|X<#23tU5t2&v_v$uy;to=2S6t9hT&#lqgjxj5 z5h!%^F#!>?d`K{V?&VxUTGQ=yy2U}iK9Ie5?@N~oBlcNNp_lCV%xx zWlkke2L4Uqy43y9RuQT`sCrFJV7F;h4WD3p_OQ#`LzISsO3s5nGG2?h9oTf|wZs^~ zf3}v;1qR41urJW9zNnp4CUD!H!b7hiUjh{HY?x}$r+Tg7QmCkuorYv#?T2_tn`Q2? zFh1^b^%Y)}W;1%+M#*b*Dk;WT%ZV#LV^j+cFmC5786poBLn10=&IoXy1)Bor{z@If zHurQgfI+$Co!|*Z{p!mvAEDoehmPk4{D>v-d49n4 zjkJ#aLE?Bn*032g{H2Puyu)|@rg2Q@@p(0PHE?T;%gR$B(dGu{mZ$Qr|FH?j1h^vy zjpOs?gzu}GMS0|)xG@AJBCn&A7v&skw+HnO*R*c+I=*?zs<{`IyyHE{gQ z>B*6QS>ktE=xOOb35i~J4g9sA{O21GtJc0Ef;jl*F1V{(((Nv(fc(0J1hf^8d zw(j31X^liuYC&rnvsKlG><)kPOu8+ku~toL?Pr^7idRFt9r+-VW!)CP->y^wbL`6a3>x zaF=JcE9OPlVTVeKdiwXnFOBEs$ZsHLYkxtXL{-ferAYW4f-Z3KNz z-d^8LRrOu=PISNP&AAu2Xu-nMbAw+1l_f?$xF8R3c}_S{{RappOjtj^`;PRF`Fu49 zZs)BPmM&n{d!vD|bKEb#sj&(`41T=LjG3~@!a&A;@Y)%lEXXjXCx+wnxyA9k-JNTm zIosZdbt9ErILny^>N>_#Q(S4~bzmp8A%4)U)BI!mXb0mMD!pZ%j7iL;u^d-m;Ms!i zK7Es{xcZrS5Y^dTS8>XV zR#Xd(Lu^)ygsA3c#fdAir1NOTgTArDEPqD;ccO~y{8VL`3{6KaH&>?VoPxAu|M*@D zX6|)y#Eb^DN%~GnG}vs@y*9FXH-0naLR5~H_-26c@Wv*;zhMDi*!1ocEP+LW3oHqGK;+ZIMTXw6>^R%?FbNhtMTYU>1H zFxDZyK*N(%M)hZ;Xe(smsrX9`ROiQeIp{x(_#sHL2cdL(VBW3NE_H1|`;1g99F^vyQKV zzM&gVct@5O5h*L6i%el$I+0-S6C9#M+5syn_AQfuQbf~e00}K#M^7Xk$VYEI8AX3( zz_!5q^?`3kEgDmv4|Dwm4EEMoXJTh%bH&hE&4~760idqB=Muaz62{6ta^*YUqeneT zhm3wILS7ayP8oS&XIGg5W2VtDEq}nGiBsc%@iI-AgMlT#H{9Qs_QCj(2Sn1#HMET9 z=?*e6=T6em9B!&bjwZ{`o9l}h(T6gm#3ds2XRQ4yqCB0^bS$@vv!_qS6EVn=3GBs3 zL`(0oJ-Ug2YOdEVbV{pC^`*43Jl9|#tg=rvh|`JQS2%b*E~XhHqgV)qkYqE0E$R(m zaD;U;OX$W6)IVlGAxFHzfq}qSSmyc1(P}5`;(e&3t7)#u$`yJ zRT(nO7zxeQp*UL6ZN<=Vo;m;tvnCLOvk@?7Re9E(Ngh<(utk*-n9mq;H#b9)NRNgP znx+ou&+)QHq@)f$B8r|3{?WoxO;86v;xT(8Uc_u@7iQ&9yn=Q88P*L7qeT&xrWsA; z-FtjJhQMNwPACo=06KLX(MaA$z>z)sIa7zF6=>#Qg{XEWB&vieC_ZptsR&zKfs*43 zoB508Ivb@6TBI47nxgsg2+3hdy;6#o8m@7Q#wMw^T9n;!sZs|l>2(doF0oN|Qph}% zM7&$4Xn}m6cmYF6J%qqJqS?NKIj>Ax{?$qA!sYa zbBjjncvIhO{aQC+B!S_!O%iNJcIOoHJ1j(BRx5Aq0->D7hmkUOx)e-=@$(Bd1j&TY}=ZFl_FY4~Z?+p#j zrYGy%CBVL#gcf9y7M>-!)Z~?CZ!fJutiDOrBby9L)driAc5IUECb&mO0VTZSnhNds zcXK=w-(!mnRV5hR7P~$pO)UX=A!r(WmsoYP#ApEofCryWK#quHx4VrAc>hR#lVSsM z)GX@Q$xMESnB~hBa5#1W%*J&fn%OcU!MtfQSMENUwdO;Xe7RVGg}n29N$qbD1d7c2 z6|io?dka`wmju!Q*=<2OcQT)kWkxT~4#oT~&vrShg@vhVd-2`*xG7C2@>%%^kt`y& zrw}euT07hpU`^C~?~pd85vgmh%1jOeQ=-`hUtOknL6i2=^rrXi+0qu-5asC0?-%pHu4Dv@wHWZiUOvc8MM5DgaJhS>zGRP+?} zy$BcTuxvr0`G!;eLtyvE_K`@1iyQ2PXoqH~5_Xej3VKPxP``YoIaCkUrsWJc+7MWD z6*t`MqN_w!a?k()#kp=PUT-l_6kv{w7_H(4V^VQ&_%|vvnP(nWFjrQhcbh~Su%^Q- zoTHk^$aXNF*$2UJ2b38yqP&|xR$4P~C)eG`z|{aNo@zRYIlBc=JHfG5`}Ht&7}aH_ z6IJ)$;9&(0SdZ7kQ(@nD6862m_7cCohk;X;pLg_B65ns(-n&Pe4^sR^Z>mPvSE#(W zv-LOq>}ODmfjIS<*Vx^}0ROGQgXL&%-|Dz)C;_MUh8lc&E+V+(oBae7}r zcfqqZJ9*rvXt}t)k23=ct9gCy?_q~QOGET-aqzud6}{J8=jP&LVX0%imq};q3;%U% zTRgtQC&UR${ioyDKmYvm&p-eC|DqA+We-~>Lch`R%;l;hNBF(Zd;K}@=7t}3H#a@6RYQ5# zJS?M`HMHusI~|W7so4G3a_zADC!<-~H)(gcHnxTnXgb_kZ!YVpQ|!A6eGjs$>yGPY zhMxR=zg=BxL5zO(Y10YXjyDHSS=w;$=+nD*=TGbvZWF^+Roh9m1vPW>?XuU;&8x1@ zNnBjLn|7^bbH7$zAD+p*j^ayYuhV4m*S2#PRe$#&2Oe&9?A8Y+zq~XuVi>=-lHJ_k;Qa3IwsVGbS6T5< zOFut;g4}NK`?+i)3+<&_YjwxWY^Yn-RlK2dmk-zA@;Tjh)KaLe5!Ps&F!efJ z8B`0#8>h9vv2YhO0?H_jPoMR>M`LVROh8} zVPiX9iYf%sJJ8GVQ-!dJMlp>hqJ)+(<^-$^@C_*9#ZmOUeXw$^AOyS$P!`Ux^_@wX z&I8HX)CKs7qhtzQ*sWPGrkEa}mIW z)N6=QlE=_(knQ@;CY4N$a*hQAPu6TDGHJ%q0&NiWc5;=W#xx&AA*9q&%qA5@N9l?v zfxbmRz-PFAzz{X*q@C1N5RuIl2i=5VYc2G{(X;>zp@ZOlVJXCv*B&c2=wXAbA5mSn zA^qa=9ZCo-MW^s?fTL#y?rRR=8&ztRS?=7x^pugTr%STozCs=_0cjmg=oT1q=4543 z0R%orQmqz(ZxtOGgj0U%CO%URJ>H{r){b@{HEO0Usla6Z(R~g%-0W4piD9#M<>{w zu;?p%TOG!ylO~a6bMx;FMUoh!5Ya@LlrkVl&VLZHSk^7J5V@Cu`UQd{BQ&n{@1ggI z$&p)EPWDcC>oYic@=ma3TS0_as%Nh@m+5eWtl<)a5rjmswHIP*2Jl~5BZ3I15{lPL zcW>6KS~Y??hgR(^%g6rC+&8n#a>*jGeq|bvc+umyXXPxse4DPqA_NUgppRm5bbo8G zRt{Dp!W7}`3bSQ17;gU~Tx=wp&?EsWcY`@9^?(+=XhqCAz%pU!Us8o55~16PAWYJI z6;p01RAmTKvcSR|(I*;PrV<$iePf_&n7Ir&dNUT`RCyKI)X9ZNk`3DpJBLUx1503S ztb`WAM!XSI=sqo#Jc5=oAPSQTIm9R_nU5!kMQpZ38M@irBKUT>~kU80yPYb1{ zRXXXE37O4 zoDPZ#l>uPwNu-#&yQbh_ zXdx&kX;cXtPi2+zQvUuk;)CY40Czx$zt#*4T_G!OqC2{V6|9)@!^#F@8;Z6fdLGEIp4QVeD%m_h$R?@K8@zZR-?jXuvqGeORFz@p12b$A> z=43rY>m@ISWYi- zaum6tEe6RI&F#oaYpAXWf4TD+ax*gGAeOzX>F{{?rt>?4Q&E31O9H5=aHLYe?Wz?P z<%u2=N+lZ;sn|Ga7|NB*w3MPOGOhj4GJ$M|T>q55ag`qzz+)VZqa%pIgzw?ID!o%l z^#?aVRBMJQn+JfoW>VS-We_VO;#w;ZIZ`dn40KvLGg=AgMOiQM#xwouvzZ`neCZ^c z-ANH@8PL=i#-42DDiU{K#}27Pv&bXU4I?YNz?<5JnWPruSand4@>VM)IXg21RGam% z*^FPm-Wm9LM$&IdwlDB9`I!auv-a7u%>{G>l6#<%{R`=Wj=AaGbN1EwXWJkWU+NE` zkTQE{+Hk%q9;IDF>6X7<)eQM|3M-!Xm4DZv<|iepikHkAU@-Xb^Q63_@XN5L$B@n7 zlyN%gXN=qV2PSyMj`{C3_JH8^8}}qp-v^UEMa~~jnJGdxiSvCny&+y1x5jSbPR=0N zUV?K4_KBI!^7cO|zsyMAGxMd<74*^y^55G{pf?`sX%J z@L3kcRW2zh<5cM{bq=||->c5Ec2+*ayu!S?z|)nXlk9GAZVb+RE`vUIe=xpoDZSu* zd%XOAwCL8>QK_^m?=6uJe1#p zu#5Y+ja%6g=EV`SW!QLws5@S`C+^+5HSX17{kmS_=NCgx{>a)?$N&1?z3K1Jw(ISF ze>jKGF z$J3$F5%5u^8YDlP>vR8v!$oRZQ?muW5j|$B&~E&7y|b!%{197Rt6LhwSYux)*b18F zOR_38gkrx>EhR*I*s3^V!LB$8t~odjS78(Ir+&rZEELldS%Zxd#U2F1z8UNa zNn+rX?T^87d~gFTdHq|S%R0xhE)~;BU05;jE&IG=L}y1XB=)RTzj|%_)mc0U-xJ6H zmuEvxEdpJ_)zG+I2pfVJs%P~S=x`GDQadY#iBVdU{{BPY|Ha-t^@tiR+=4FKwry9f zvTfV8ZQHhOW0h^&w(Z{ObMc*|lfLWhoYioDS27;5 zsW>>w^!m)$AmKnX2kgp_msk7AuVWp6-0L)CtJo`rT{U1;J5`OLm*$g>PXy)7F|aS*X#>i^qsU>&FDs)>APdAp)NexQY@V9PsgqmzVZBp5n@aiDM>pL z(B8L=P>FA(1RXDH-{hA*mWKY|iFAiVUPv57vV3PNr|lqcfOSzpky5f&ivrsAP8zY@ zXbmjX@yesjlef847bPmDNl>>`yd-l7o^8mT?GNRTfMbY<=$pebJ@<4 zV8@I-H;-wHKXMS4N>g270#$#Rq0uYi&&aiNu7Voy=e|*@q<7`9&%bSK4Ljiq@3n}Q z8Xovp$>Pfc0Yll+cOHsk;#LeO{blejL3mJ-G+=lKR;adk;>lJSwr^!5rPQLbN*{1f znVZRoqlVWeMy=45E19`ckH6%oxZ%$Y?3uPZ$KB*Vbs`2r)Q5V0nIc{%YR zhGYi{>*={fG&kUu66=GZxkA9bS7>cP)deop9kSB`aPqNe<#dTFJ~`T+vM5;&Oyorv z!}6>7C|;rn984JDvp|3D%x&d%8ktn$18LwpuQm~>0Ll__)2=2kHfPZ@I5;%bD;?f~ z;!uUVE2-b5sVQzc3d_Lx;Be3~x2y`H-d#tEZ-!1d=i9vpEC}{vq+)Os2Lj$?i8Otn z%vUrUM%_Fu8p~P&)%s-6cLN>{f+JCJaK=%3g*^e()08`f`*~i6NSisuO8z7!{Kdh$ zxlbk=64M^rhfj5F+zSSS;{ITncb7swGUF+Yp|M)~NTGC$GIWTciocDFNL*kx))du$ zoS^AW2?c|&xBP=7tSX^Hv6}oT$>cv-*Z}F%Sv1afJ+B&AA@JU>ri%N6PGaJ0X=Niw zQSBCPv=Eb}a#(7juvMLS&8Q=WQh~@~^&b{og%OIlL7H?~j`n_r9Q;E!UFEHr-$4J~ zjfagtF59dN+F74O;Gj%$&YYPOz9&Tt^+WiS0qhh0*Q-jAW(-YSw?ui#r?`p7PoiWP%|~IWodIWa!69Z!bI=%LA^}6^+ms z_Lg3pH)R5w?UWH7m0&q})|x^c=_Ei-Kv7u`wcqE|5maD_OtQtqOA)x^!UV?!@{gV8 zDC~2EqKyosPEykvJC&CtTZ`Ar2CiaEo%V$Z=M(!m-k(+r;IR583t*!Jx#E@WcZ&3v(f_V%Q}z6Ho%Btfryjo0( zO3I_s`4z(t`4!rGTE|yCeafQ@tB}XTX2{`RAX1{{IIB3c#Nr_s?hUlWIpKoEgCn5d5d7$?Snh)18`I{NcO?-%HNaduvti<`?vgVDf0 zWnWoY_fc8tC3;1%tne(BL{APbN~-7M>uhcHYg_q(PyRWZEBDLdTav8$dduft-|~F7 z|I%7>YrPXD=DrbHW^Crf`gVqg$6fzS zo3(el5?|S10sGTql9km8=d+HsZ3B+_vvS;X*1D`*(~YjjHvmfU%-&UdmDxi4oND*m zzbXG6bW?Tl0{=3Z3AOrQ-4kQ#vhd9%w^xHZJ;g6e(i39g^T{JkjMcq>p3-*93%tjN zG?>Q_)pV|HIEU|e=3@Sb+h@-Shy&Hv;dOAh4I0Kb0OD_Ly<3m2`yRANCQgOt-$y4N zoAyh4t?ncHG_2F=eLAe#GI(a@4boIrFQ2laZ0QrGz1WRG}Q=<^a>;RQC1Cf}KJ@Mt}7M%rK?No1)6kpQ%`a0mYs;!2okxR}nd<$@XAT zRwSq)I3ZA-KQ;tnz92k37Js^PjS74w{(c3dO zC}BVS?BYB_mKo3!i|ll&QhU5sf3n-NDO>T8Rfz@zie{3 zQX|1eF-@@%zas<=OqRPsGoxO-Q=oR9Ra>WmjPJ$~cguiYcB`iwZGu^ZECB=X#5+V`7=f7w)fo|yJsf#!}ye!e3b7EIA| z5R|nnV#sZ$H15>htH(uS+B^T553tnh*+};lqu{%2~w@ewkm^Nc}|q(L!ogOWm4m0N;q2p4KjH;5@p4}AtbRxU==PhrAq!o zL;_f7UVnhD8baLO3#kG*dc~aQa$$LjU>ni!9P)(fuz=}a^?*VtWLI6m5w&3M$luWb z9e;#ds@K0we;8%56$G9Ggvp0H5EdcEXo|6h(}-7+C?Oa}x$^8eLFkub#HA;X92a5| zBYmV)I_crkq0jhEtIqU0CJFtiK<86Wy*nv%@lBUSY@B$ez@IJ6+YyRa=SY7`vZ1VbZvsRrG_3GJu*<&ayfr#?5y0+PQd!t0_ zK$8YhFN6!Ekj(TN>lEoux-rZA3RyIlzvPcaQT}iul zeVIL`y-0+OV3W&?o&kIHKx%GCGUX)*$*~Q6#zXZ&BQw6Q5e&@3rYApf_9^u)40dlz z1Vi(k;w>Yn0k-LkctS`_0TFycL(}1<5IIaooy{#t0%=`d6;P~B9$%ggCJwuEmJGR9!f#){%vE0lr`+^K%};XQ7q>I zv$pWcqv-M;lp#Kfg6#`(&^}R85A;!MA+0=rh71fNoF#_o7+@na%EHV^BiXW$E}0Uo9S-P4YsNtiP3N+Bu-YQoqgl3s`&DlW49RIY zd67{%N2MsWR}VLnigPBSam`8>N2G(L=(3$h7z57z5U>YWH%7EqLX61h#3`dhcJr_( zZ~G?dE?A0A#G6!t14KE0+Eep!eya1sk5Ufz&7S_-l;*};_Ir!JtXh*Zc>d$;=Lqu- z+5VeE9l<&;Rzo6&}?-2w^il#{-?hfA|4KH zJGJtfPvtpmmV9)vwenV$oL&OZEYSFN&%DygJpZ@0|Kx0%ke9u6lzw!U?2X;ql+$-b z_0emwXf>&fD@-mo4!(?@JWS~(E3@)BlL=f8ubeZoeKD9zhnlk{LKZrUZgZ;|tG)ib zX?n(jZT-(j2K6*~Bcr6BiIrc-=IY%O;Z|?JCtv@|tXP;`EaU0M*~;jroG$;u^71bL zILf}$e>qyYVB1G9r0F*fBpDO(wf6PjeMptX^-+GMp-e<0SPQRD-#)Lrxv0IZy0|F) zkbG9Te>kfXBhQ%leHqSDaysNIx%hrLd%NVz`M$ZUQPj++S?|G|etCVJwl{6`SDIK|*drbYX-AP-wpS3Yh)H7Y=Y0H=J z&8T_nAfB3HN2}IePGxwvWmaotn>F2>3K^-jc;u!|Yj6QgLeKKRhc2p{Oz((o7&|(S z(cWEBvC)REy~OM&thhBgS}5)5O>o2V?j<|H{BY2Eo2l--yetG{Qz=URZmB64h5z1N z>P!8BUt2KH2-1Gm!^_S6zQ0xrGZQN<`q8MIxf#!**UK9KtD9JWaal~)Hp|dhRZ;1e zbGNJ^AKahg28vmrF$X?irDoG8Ax~fdK34`OoZua9u)CP@4&Ek1-c=9G*`O&9U;$12 z`=Pwrf+?__uozD&;Tx2gCkSj#B#S9Sw(2U5Bx@JBojd&!lz84QU>{xPRD4Ghh%!9KG=BuuMwHA; ze9m(Uv1;5IE>M8&E_>?Sx6F4B)808w80?^2UZ{_FAi?$H}Vr-x>_dc7pdh9lH00qX=I1_*atZW6S z2}6Gl$QwL-6YK!{z2KPi>IcrNS${i| zNmP(!R4WjLcv6367z8b|S4I4$7hex9BGxqd(*b2Rs5Rn4*1R!Qf zU9~ry%Ga0a)+$Ub3RDaTU@=x`k}YAzi;S~;$#PcD<{`dNz1dfY=`b==g|;VJrw8A4 zZwz{Cnw@r2@#Qt8NGNZnZD_qA+uOGpMfy2`CpQvg7;HL%3t|z|DAXImQRlmiqW-8Q zxt#WCbbaR`3XqZ#thZ7UG+EH2D?V1NF^9(!V(2oz(uRX8wn^O zs4_rCM>{=fZ(mlL17cDIO;;8cLY_{Lvi6mn^ry7!QBC`J0hJ$cKlK&j2Z3Y^e^J?T z@v92`SP@hn0pP-DZ0xAf1H~z96a(J}Vsu1J_OnPYVk;psSpuKU=8P25h#AyhA^Z^l z8)Y=m))Ip+$JxjL77!VX+d?Bot)zmb$_`o3bf2+MbsZI8aDpz)K{q7r8*-^#XVuA9 zdL$g`ubd5NsiF^Vj+>(;6cvg|#Ne4yBeBsJ)n!^bvarq>o3HTUB%kqY&Scfp2(;ga z%RfwA3ee&R$J|N>y26tS$i9oA&_|5rsNWk$0h8=69^k9w#E`sN4+fS8@sN`{0m^8I z1y&s9RM()@4Mg48M>ILkSI(5HhcS^I3fTlBx}q~WfG{jb0<*otMcAMEtR(@T^d+3n zTU;s=scFLijDVjR!SftptrYIM_16*gH67#(S*k6skHAWuAIN@%R`Xg*atnSZjv%o@ zNXE1Qd}K|B&)(Bo>c`=HnZLe~nc&FN8V2?P%O8`(RG2r&n2Am{VDuxjBW5Rjapu%I z0m4ava?No=zCdA#64_Rt@X8-eTov57v21ghKn!Ic ztti2{L)TjCZMX|nq|MI*zo#%I7XenYWl;>;o7^_qyp2XlqZAHB(7$ru8+`#87&9!a`s+k1GLRC*6P(~{@hS~z9%3(VT7>ED z!Xc|MaiGd<;b5dOB(EpU{{Y|uFtX-Fr(f+ZV!K5LziV~P*r$IWDNT%aclFLz68@H` z^o+Cw)pKZl#t&;7$awH~Y{I>`#u`lOVp=4(XhGt*@j7YTdxO6rXom*GsPo=Y6$q3w zfX3OTLYR_s|B{|gUS1X|K#r`A!1ntlY}FeiG+lBJJ8#Qr;d*UbIUX4N){zId!ilPN zSZ*n(Ek=C1DVQLh4${3Yen2tV9LMs-QxAeRqW+`!@i0*qT&MKfhKq;BxtWwRfpi~= zL{D!#XaK5_l27bVK$*pW^{QN9ZPDKQFkDS7gW^l**v`(@T=&&Pg)kA)o?Hq=vtI0r zQl9ygk3U#tLpjjTi@;T1d$%;ow~wJzERH@Ks}eXJA5-Ui_7tKV`2?06SGY$c$vrJl zw*ApqVEe?_RN}7@^Ox+RLI?{U7^gL7rn|to#{$C>a!&Y|ugv9^v#qCjlGLF{n>YIo zzrIz2jq9q#*x$fLQlK2A{bYW0GyIKXyOJ6{V&@E;ZVu+Hl|PYZs+mmz2(}QmAgE-a z3ctVJWAMV+7mN5&-@k1idrqArW-{mSd=anD?`;SQgeqNSu7jH-6 z2Wv_^)}Ah3$5!t2OTPe!gSSTi?eO`}KmYvm&wouh&&yNZo`}^71wB99g8NRpC>?h&v=kL$$nqbW{dwEN;Vw9ju+)Qn)-|tgX(`8J} z(yo=t_rbx#BDtEpM@46A5Zg#9*2kLeE6-Nu`_@X055xl22F(6YFbWrtS(vnBe|W5W0nY zb&EZ}tj-LfnkBh4wiTh`TqP0<6QROpB-#j&gIrNxa44R#&^w+)>`zgvkGa$z17hww zR~UFk+B9R8Am;5y3g8~l^Cy-wh^9LzuulI0pk49$KT9oUP@?^HZi*H{>evs-ZhJe( z1oz+R{`&}5-PB0`U=0j7M%UL#z| z1(%jU_rb+rII_X_Iqm+1Z5$8|jaC@VC!DTvSO+b{T4hA{0Q5G`41J`ki1_IiLgnIS zsUMISz|JrYw)TM$ZRvAb@=)g!(eDCDX^AyviS{+G;Z#b7s};hF#XUiNMs?-Rbxw&# zyb)%}{t4N{izsIWZY(UODJKw@&jbFR&fRrgT97Hd>SLR$&vjr3`b*@P)tCrF?2&2P(onS zu4Bp~krBd5-qYhZDb>*FdSpH%i?nYR^VlJsBO0m+_>reTTk%~K4`5nl z4ROQ=dxEPJx2&WVYM2^HX94K>^e3{5XAIxzYbK>Fq}52h9AoGz)nxGo*=2ivtur_w zmZ8;{8z-I(bGqWPht+}10tK%P!kty)A#mm0(cM8z;un98K(awJ$6>X$0u`HkhsRhu z)a;o6M#|=XfS39&5RB-ipFs-8w_|pI7l~aTdg7@jEGgnqVWlrp(Bi^9?M+RBK3gcp z4;4LJjQgLH%f~y2-ym<2Vm_1T8rM!BMb+h6ZY?yb5?@l5pn$>T_V99R>+OIvO_aMW z(~LYd@HT8JITfEq>}X z4WgVw@thb4_dvW6k_rKUB~ogUF0)_K;RnuAMo3Kx`Q@1v5MT)+O`@~#v0Ml@LOb^q zal+3+TJWy9gG0bH&3LpC`b`P84<+toHy0*V)kVxhUp zML0)Ah~86QpxSp&nEG!GzM45Bgp!rYuZhwOAguKAxN$ukep#Bs6$;$#@H0Y6P&GaX z(5{iwT#!sOvJRV}8Hgk?x|FWz3)s^-7GfEbX2#mQHmGkz^Ene(0->}aAG;Wd4HIKG z{nGAb5%A4)KUU+%Qz)m1_-Q^*WMOJO_E)_e3z&%{Rp)E0E<;Q(9+7F0SmMvhF|c*nlC} za>iwoLQ6y%?72d7#%g%_Lc-9`?7uv6T%_ev@hc_YNM^?p=EuWxrLKz_-qCWn+8@dD zluX!N+=996V}-l6AtAa>kg~*j-hkWXF!Rm9#T1C|FTPNb@ zX){<;CNl*AHX(Bm@Z{VRH{`s#dk0-@aH;FLxblP%CAs1*%7`Iv?wjfZm~l&y3LT8_()a)F-6)b4KfX}W80;{k;L(GGRW^?#Y&it9RXKf@l zB|$28EVd{`6uYw7mD#-e5{&jj0;B&$**B*{-f#v3c!`UrC(h@|!AGOQ;)NOXH;?G( zJSagDaT`==b>7tF2}Queiy2b`?AYeO4U-RZkJz5bve~qBt54l8q}d!x&>{;vB?y$1 zpE<(d3yhe}@7^RRnX^W5v4$hEPln(^k_5#jzIhXm|5R~A;~NWwV>Jcb(1r68FA-ns zIIvWfI%nI63G(9$Hur|(b?71%h7@q(J6nkhjyMpAp9I#}_ie_i3LPHHEACeIG0;{M zEIJJuWO4?njpu+nzlzl5+G4J0!ErO%6cWskqu6vD zal6**HaaHEVf~773pyzWgm>~cvY1JoN7FCjQkEb86e}E(z@~Hq!JdZxnLLjKkAEjA zI|D&mQrdB7ycZrqw`#|C=Lj64BG#AT)zAEGp<#iyEd%6SbGSi}zD+=#?t(Gah^Ajl{Qlwio3G zcH;dQpIzk!@JIM}L$^mUX_5Qdrml2cu9++fQRXJ^jx*~S%)75S%uQJ@A!kuD z+v{>oJfw|zx7YY*(0-?dZ=S86XP<+1rE($hf|qhm^PeyG^ltMML$@D|Z-*T{h5JtP zqk3i!0zozzkcYFwkbjl&9!t6Bm&m8|rM}*|zqGRlqmCUTE#y*1EXsCK+S~(Q(wGJJ zNKbjAj>&n^rhE(mW;`B-C9)@vP9ulUkvLjtPJMcev2=Osr0~k9bDCxjNis_KX6ciX zPG2^T9`t_QLw2rs0cZe`)&dc8jEJvkP2?zQMT|MTH|?%n`qxCy785-XaN zJ~9{5DJBYMvwe}KMkP;3 zo+F)1&#XV$vORd%yd9@jwQt`{OXx5jS>NCewSs!^er5>ID;Fj~`kB&GBsxi?;BHfL zn*oA2wxvGkCZL$$YhdQ7hL`~;0n|>7&_9$9CyQNbyjEZ%`Z{(kjz*9$U;U`MuM0W^ zrJT_wbkBXGclcG~l@?S0!BUDHpdv9mWT6d0&fSc4E;WIu;F#OFp)mGH7e+l{$?XW9 zxgjjV+t}-&ygN(oK^Ab04M;@%t5I)hcZ0LHUSO%Ct&KHc*rJf?iPvg5k-!2v=AAdJ zF#$+{03#vHP4#;O{S|)v6T@r|2PRT`uw8cgs7=%XCBXGBH&u*AHN`-w*+B~3sq0Dd zOBdV;tLr?KS4h^xw}M!}5;IFj{R4_eGRP9p z?ZeO{tMVgp9WI>i~R&6JHBq5fxt&Ed#K{ z#SUi1f%|ZmI4>$Y2n!@T@8wWNKmr>B8bNHCCrJO%)Hgp~a2~JEdbyfXkUMT#5Z>?^ zsSg65oGRRf<}NudS&%GQOPiM#_Gtxy{QHOX}CG2;-&$=&D z?5g-mz}^@};?HQC)>C8%zD)!IV+?VhjsQLEmz~C#+bjV@6l;zjvw^w7K(ptmjyxpP zhu&P?79KIhh9`#ITz(l!dY#RL!b>;sW zJ$LL126usl6)05^RkFPlOkp4dOj4#PjR<|nXcFBMpLj(<}#ux!L!#KxGC`4t>EJ-Dt=_IsYU%Y&Xy495lT~3slDFXbEEAG3q2}529VHJH}D&SvBF;>)7uSEif8ry6vijf%;*9?3L+SZ%STw=gu z=u8sk+#|an^DsT%mAcoq=~$0;7N}ylj_iN#(`x<|1Gh5h6;cj~FsPUhJYpzrz*Y&< zH=(c{gNDR=a|wE&5u$z9v(7MYihcdU!4PMU$GwLWhv_oKIp_bn&z<;3KqNp_kPL}k z#-C(G-lEckBe(!$yR7YOwg3=@5x|avS*W2b7Ev!|M`AA@Zj%&zYj!M{Zb6ol5PEU? z8kF^G1SCy;vWLo&h7YG!Y?ZO$8|6{EosNPd!BD;w=FVBo5KmI%bmcGPq)b^9`)w&c z1+!@8LoBx;(D#2DsY26qG-qIaF!xodVe^vE*ws~{U67%`a|g0P{)~iFiby-eo47o@ zn-Jwmgw6%Jgid;@e=H&?>T^g(576yb>c)Y8^(f`|lISkxpERszcAcQC-gRff(gJQy zYOV>Hbf469#SHR%qvm;tF&f7|a|Z+j*jTf3ZdtlHnD;C^L9rM#k$d?EB2ua%i`dM6 z-%q>VOdWgXhb<@H*LAo+Za4QaBUU5a@IY}#Jam9BELJq5PM>L9SUGa*Q--CT)xl_`}5 z#_b|#%pYRM`FT?a9FPA9DBmnJWF6$8H2=x-;h^1Y@;{wFn7&l$@yDDm>*Z(r?Y~Gl zefsr{5Pa(Kc5L@*=i=&%oDq2$ezN}v%~1P6dK>-N{>C>2f8s;#vOgO~z6E8`Tyrmg z9F$>jR{YeZG!Oi|2*lXUu&*xB9AdOt!hqdmdb01BLG(N9)tD9>S zL-?LbUq$RKJL-3?s$c8(KQ!)q#JnC6@KHBknMiM!IzY3Nhp@(b>sFF`^+J9wi+dQ% z?(VUhJ}HN8__6OVVPi&&uVQ(llim2s-@8A;vD^Xdv`KB>W=cZSPuNS+g5eH? zm77i9LAUt3dAL(9dSAMcKj>XvuXr~?prjLxOD)y+C27V*&=n~Q$Q8+0XS0;teGEcJ z=EYvoRLOX46gmdrP;|9`jWj9#2tc7io6|^OB}2P+8kBG4Abt5wr2$#)Zcha~6<*;X z1;z4j*6|{=qffO2&;x8BllvoyVC%rym_dBXI3jhST7bqna0UPZ&H2@$Zw>q9uyHyd zexHPtb_QGo464M`8*r*Soh9t&6ZtxNBv%NH7#D?IHA}0&5WYbL>wEGSzA`dF>gr<< zBNCRFj5VsWkj9=GBAmJt{qBLyP*w4vIJGy8H+*>Bgva{_$bVoJT_!7TUc#NIR zyb@U<5mYiBDT+f2E;V#h(gzXLT!So* zS=9$#l5t&wNO7)gl>KwK0+}e)wFF6B0NhEt_;`}fG{HHj9MDsPIDv+30Zlho!YGxK zN!rZc#gFm6g_f;BP(9GxPh+MUV3IqX!>~i2EHbPsp9=7Tz1$U{m2MXmE=g(x#FXqD z&v_cL%wk-tTS5r0LA%SGI3>FpO#RY_wPtz3=5Ia%4=dS~Svkq$qpNbc(O%zpHh^$h z(7j&f&Phc{qZF;08-p<;6{6$esfxiHqMV>03Cx~qIUjI;bw5sUFExm#zE_SipNa-j z&M}Xn(x^aN$d;AFIxwWSVVJfCyH z+lP_~DqBBl1v6OsB|y@0(Al3>m1<>`NUgD>GeF?nm{?2d9@!eeId>ztp?dMyAxfHe z;Zk|Is0#${&ShV3<{Y{$s_^(8y?R_Jq&qanyReV)-7^(tlhJrF8P=vHDUx72%+}#A zR-UVxu=RK0m5}MAMtnhHL&!Sl450*S2HBWey-F;q8c1!`{})SaFufv7tIv&qX5;G zV@6v%WNSGd({hs0JT~2e;OGHs3`gEE5iP0w-rjrV%^QKLKv&#ud^D%C)+kROXCqxZ zZ{Sfv>+&u5wkHePJ(g~8FU)?lSRnzGo&*J14{=!9c+Hvkt+ge6PVO-DvhkA|ABeY* z>@)ot{)jjRQ62)!|U0fzsHj z6WMEWT%RxU5{ovXszfzOk9jI8lKBZ}PYhbA=UyTXez@mU>d*bN;ZO(hw89PSCy7L2 z0nWo#D6NpQ!j98Ev%#L|8){?|>zUsWeC=Nee%4KM;g-?6cn~{MR~xw!9*a1Ww1=q< zaPahdLxAx`kcE3CQeL$}?nwyD5F+_(PJ1l#`x}>RdIVABCpDGVI`h%o#otd-FvIgI zF>o$$u16njZ%GC3KV0eEN+)Z2K)-+nX1Am7yua{eoP;YkGkM$@*W8^=uWx1B>-}Fp zt6fdtpU1txjDNeDxL#dw!U5T~w>w@DdR~Y8!ojOs{@c0ZpMU=O=bwN6`R^$P`=9=Q zZHp|1k~3M$(`sbK?jY??LPE$72}wl)KUZm4C0d9C^#n*$UoIkv;84|i5%+-Pv;0%R z+5I|m<#{u;R`4A}6;0Iab#vvN?R1;5F2gD5qI`INRyMCu`jD5Gt(Q*iXSw`i%HsR} zeYClcUBZv~n4wxzR_E&>ov+xNMf-dg*E`k9m=zT@JbYm2(9o`~O+$xWY@B()UX!Vpox|tn5&+Iu(((=hwHQ#n$r{u8o*hqS zoY4U(VzA+!BJtI;tDJ=c6Zq-d1@#xW8}Cr&)!PVfE2NQy_QQ_Sy6^CX!g+fX5JHde zZ&2Kx@njy=1AQC1TWb-Y0sb0Dc)kxY>5aJVU~bZ&+VK1&dW z6x-4Xg@hYKjSx>r=KV-?t6Rh*Mvtk);IW6dWm8h%^m4|;Sus$L;1F8Gh;(ZrkO78a z;j>?2*!W0&s9`EwO|a#k?DRl#Uz=P4uI7zE@bZXVS^c#cnn(TRq`Zav4)<#3;^%0w zXIZ3H7CXU+M>IhD;WWc=n&ildMItI-Eul(_LMt`&;nqsYN-$qh5dfmi@) zMB0nv02N1D97shEH<9gHkeyl_$4JNG5F3urH6a&*t8K5*BhvxVB+yFS_4$A>?eL1j z@BonAf&E}8d(}IuhQRv+kx~)-D~GdtoYMeFpo0Oro|UTr)qfyaD@MI2Atfj(i;;+6 zS1-HA;w;z-qj?4nU84GNu6WNEH^A8nG`sjokb?92B}N@x{I6Q!phP&@Wuq=Y8Ddp3 zHvu1IyJ3(wWOk9G$>-`&9y#hzCpFT!!;`SmWkg8LHf=FgqibG*eLYOj6?qMEWIIf$8YkMa8hKSajzhVT*Hf_x zI0#ea3s_%VyP{5fA!bE-j$KT{jeH(OC0mYd*nEB16g=B+)|@51&Y@*w^bi= zwdKPMjSVkVQ9KGcnhnE=v7IJI!LYL2KeZi7zV8yy`pS2*XZ*h=E&7)kZ z8y7@S<~TB^0kIJaT50oG>Do(OaO4QpsLz;`Ju)kS2rm5HV5yiACW39+r>PK*kUCmV zD3|NlR=E-Xj@t_kW~suR1GB)9v=CKft77Q+(qpocPxuqUWrv0Y^q4C(kaB5fP^~7m z3}*H?Wm)B4)Mzr-JJnTMrfGUPz9Tn$_R>^utCO(suTa2Ut$eERKgMbqQt;D8AO1c$ znz(~fs%*$RSUGjbs#$ztE~zwK#F?`{SKp9?*9L5NR%<4BW<^+bAto>SyZvQy0{SfzQ8oy|o<38>3L7etU*^>k#?}FI z1NA!}&8jo+o`Bb_`cce-)clI{%8NZ}SlLCA%dw_WuG5esvTjE=xQ0cc^8w`Mt>i#2 z({^FOx!Fbxvn6|;c%K1R=BvqU{LMG43AG7a0usaXXiw)r*uZ(Rt=E^(?iDXyAM7Qq zq~4Co#vxws#20`YUgAl!gBZYR1`d3r_D+~p;}(y1>|xXL=a$ez(w)JNdINoFj=J*O z_vjJXNPrHkZT~fq*y0>sTM`TbnQHe>M(SQlUqZ_KJy)7}1bFNvB$m?B4LFO1bRmL( zV1`e`gP2Tf8c!qoeFw7?gJwY>{pk19-y&na{x;QKfha_Q=@a?10D?e$zkCSv zw%ek$#!>r#=S%Y3Qa7!c3xEE-SxIojI?Uw;+B_b=kc>}#Z}`OK4{a9WAC^29JP`0= zUjt`@-)5SwLa$eBN-)+@xv%{u@IwP$XNKZE3AE;aG3w#I7&dmSzS^3XD|NQgMKmYvm ze}cjP+5a>D@B9CwW}H@a>@V)uTUjiyg)&kIv=Wz%AmgbdY1pM56 z?0XS)6VQenX&KL3E0o*_@=7AMuh~t9>%Vq08O&L9kPRf9@MgQyu_+Wie$I}TwO_iC z7ftK)O?9)pc|9nCP)58IBDa&LeB8oC2z*(%4tJaQrmN{zX}@z3cWzw4}XdEXG<83=|Q2vYE6 zWoCNa-kdyH8MSW}DBE$da=F}mA+|EfB^qgxludwnK>_EgCqfLVCj{-e=|Yfcz>E8r z^XA6M+37t?reVZ2;M%4nEo`fTO&Y#3Me8AqqXiYzF^b5MD~bm^->CpaEbr8JkI~S4 zL)H4h=lw~8917wVoNS_t5GX}51t&p&p+y1P#``+q+aOUC=D#Ok!;)CEqO#TIBR-_C z7Ca1ykn5uCdHA7?lAA(vp;~H zQx*G}NL=r#dwPTE8J*nUQ1Lo>jZ*)vfbjXMXxR1Zi$$|ZrRp$h31*o^vF{bV2%5L) zuBvBtYoEFJYq#C01LhTGaf;gjHY;|z_q0M7FHC#h5z1Mx*@k!dvZ*ZfV*8$K^wd)YQ=)>v`xF3+xIHr^J+ zRP&0I5`fcfiG<`wV^j*qHfpub4VRw7`!rXA_EG=6YiL0)aHex(w{b07vIa5G%4j0h zr8Uq=OgbZKQZ<&*ga@{V^eETw*|qJ$om2*W9YEniv|vHnk^dQVs=d`O4d$?$$izaf z%q%y}H;z+ZNmbSwYPGUsv6bSj);jg5e`?%J!W|9~X{3Bt#U>4+pnp`&q8T;52sW0q zh{6vO@Ipe{=qZvSWj_hcAxN7h?K&Xr=TsO=f2(esq^??faUr&Eey7Uki~PV=M#}AI zw#aIqg0&P9{Pa@IKp2PRSDa9G6qSKhoSNUV)m%fl*Tok07Nh_(dRQc@1QNED4=qEc zt510hjdyr{Cl&z{?D}5m5JU^(l{F~ z!#M%2M`5KD|0gmsaVv5gF5G|+J+wtGK<@7$k^a_34y+?f3>>K7=NnT- z8T)NXh7R9I8zCynt$#Uo?xtw9wxeKWYz&q!^Fq+$X)jrWt_EfD+1oT8#hTI&nyX83 zQo3|Eo-slYznv zvzPD4d!3Pue(f=frxG59yu?rMTSYg+h+Z@0IH|vN0%(1={W9`=WXCEcJ?+n>C!1-p z5Z2Ag{GSgTc3&$Q4eTx1?Kaf?1Js*+-L-W)iP?LKU$lV+PIm90Ij@X1u7C6}6;JEO zXdBL}FGEK%cVk4&54b2eBE#xUyPNBN(Q#?smoVSZ|ITbjMr91y%5uD}vBlkRzrD@` zR;I;u;vF8275*`Y8%F>N|HUj1-hwX*bXSUAle_0B6&B9Ir!KlU zu5;(OZDX`pL)Q@ki=3Y!!dLMO`$X}+uBi>; zlBXvEvBV=pmk?(y;p+@7m5!JDz%1)B6Z2YvV?el`NiXi)Db6(+`sdm_v}nx`7OkKB z4%cJN2B7#NGl^?$uL?odhB^FX| zXI;;@AeaARi@ZHuYi!S30ZLx`RAX1{`u#h|0R(B$NT>+dt5QV^~?0tRgH)H*zQ}`Jz12C zQxRb(R1X;f$gs3{bnJVeS`&=AEba&d@IlaDUT^2d<%6MtE3Vr!k64c-Oy90$;A1rDc7%9CGe{lV{{EJf6PZD^@H<-`y zQ0%hK>fVqYc6wzDkl&K4UNjQ?w@1sQzl_ya90Ib~Ow{$ap4U+7tD_BO&6hcNJsle^ z9{$=PeD!!)DL+|@1KAt}3 zkzNNGmgAVCW>b-OE44+k!R%9tQ8HCn z=jU-?L1~(A*<6(j&D5DoaJj2{)#*J!x@y8%L(kld@De?`M$N-2%<(GlB$sHd7Z(5* z^F?@4?{hBDwKfFAjLr|za;(xl>Q?9+_xxix*~;R{XXyl{2^6*^odu4caN2#;d$*5U$_ZvF>BwR)dWNmw zg`hYbph0>|NH)6B8ih>~Tp3N$RgUkKX+bTOOt>MRSu?2Vc-%Q{W}jJ7E70~IvY1uL zh+{33!t%4mH^@9#=;Lza!yi~+nd_sPH8~tJ?Cfj_>@RGzq{Z1rRB9Z3!Wk&67Re*< zrB;h6pUsBI1jj-q#iAkkfV{)5g!!8C4=>zo;w-JW{HL|ZGXZ$iolp{H2g{U`5vABE zM%nGz133(()v^UAUgpwH^o80ZawR&n9Tp+hv3$l2YCDj@jv0xX3Y2mK!Evr8}bWJLtoov@Hq%JSe{O z7I@=7eZXk#oTb9V1?IXPP{%ovHp0`@qO#%R@w~OB2m|qa6~&-XNR}vmvmrGgUCU=+ zIqV?F!Zl+}0zhEC<{>Sh^`Quu$1$b4+nxg~d%Ke8nH#BY@0orPmePz0>*lm3 zO*UDty-a^r!QT~sjJSh8Y!oNCw@ul9nQn<0WV9{kf*Ga01Ae1xLy123r(-GUDcck$ z1UtFK>&SAFEU2WSb58GuTNq1(rAKV5* z%nlxXV(DgyTr3~Wa7VEfbTh7E8B=+WAUKo<9JP|VBA3(0d6prZc-P%4R~o_tg)FVw zHK-er3yhtDUPDuQ=$Q#jK6Fz~Q=9%+3x0Cj1WOPJB6}~xR06SYiwHAojzU{n1}$3> zLzXE^FyPK;*Nv+7jFpHjF}1}j!@zyZZP%BDn#|$d+yyEJkz$Nh@H)bf@PQzfY-5l( z?MPEuLNMj}b)wfL+QOJGoMiE%dSv16BY_sDX<3mZh`i)HrK$7e;t26CC?vANBl6O8 z^h&yfBXU+-=2vk?x)8%&L^!nB(tFAZ17gM5Hei`A!T>|zy|=SR^RkTaN(vIq{QRcq z#4*Yq)ZK$aX{tbnE8$LHJbO;U{U3;&`lsrAv?>P7np+ResL{qfX$tg(aVXq|`|^K4X2PmYy6esn@Xee&=}<`;6=| z9bQ|hnCL}BM)c}#F`pYjl;U~(C4=}4Y}YLRZlQN&u|L<@eK@MGre@{L%|sJ7i5`)J z4E`)~b4W2ywrls+VQ6qHMZoTkdtQT%I+Z-rM1Rj(#1giiSoffXZ{-XzR$s0)rNYHDHfC8r8UW;m7&W36rX0P6>ZCAL}2lVNxq!sZL7l3j6K!fIbDk=- z=u2@^l`)WrOBU@64nr#Jg=kpYS^~}+EYW(x!}$)u#*F?dr`A1 zSgy)aa7P<{F`RVe7gxnlu;N%3ZlV6?;i6opt;ANHQg|b+LA{Wo5CObC?U+ zQixuthPi|nyfBq|f01h|)oMYCgze%USEwl^lSg>I7Qey+8?)sf0gHFg%?gCCw5kt8 zMhpIOk537+s;`a1;@;xk38EvYGn4>se(YlA-!$;Sc0;$HcijlT!)#uJjk3>K^8fO@ zHW%L2_xM2mkw-We$j!2pp1GFK+`rf>i)W4I2t(pJdB7qkCAorczvPJ-Ig`8 z+}!E@fx1C?=Af#QWc^PslYjpC=bwN6`RD(YQmFrN|DS*=h8kFXc5{Bddy}=XlV#?< zfrFWJM_4e7iIRxPW*-b4^>(lYLEd3x2HlO#l>LU{d+=xP*G~k8LF$8URoA7e2Vwye z>_qZ^9p-oAa_e)ctRm8&)|i;tKy3b!91+;%=437ZmQ{NhvAx}GmoT{DSCytQ;g?tY zss2oGI1nlIXT!O8NclaT&U88UF%|9&PmUOXUytw`Tp&RxO)<@rxva<4GN@f(hB1y!EvS9<+)GQoI*_J30mNE-aK4v8&W1?)!WKkuh%)GRx z3NHo3=`w&KLEN2IPl# zW*R4C@_ZYS&K(&}*;|%bYub)($9D%f4GY1%g(xyUB|0OFOicDio3T?7B&f}>6ph7G zV8;tRfm>|xP%+XyLa1Jcj|(5sCUAx|l372lPcX6>5FcAi_JZh13o4KsI}NmkmtU)w zGv=z2o{iz;hM4v{tfE(jw-QK zwr<}Q(6t~sdJ}*N9zCvfLXSaT1&jD3lAg$uMeZ?}Dj4d7e2L!4;PI`$o=A2A2eiPv z685PA_Q9BpljIsslyGP~^CrS|0sJ8_!;Z8g_+wRfO6}KpYnHbthFNSqqhYr15ek{o zl_goLoa_Oom%Ka>3WwLGAr477I*Q30vW7Xd@-`cBG6s+~J9J%Q$pHgj30k2KXBt-r z1kR`t-WCYqbAMx`0#PQDMgs)R8j*g{Tc9#zMK!D7lWT> z+=|%h*U~U`C39DEJ0t$Pu`yq{S)vqpSVicBGeW8uA9kGXvAcY^hx>f0AsQ+8Dl5{$e@q+*=aYM+?U~UpJ0P^RxlwNdw#MJ zS%jKK9v2t5d8l`@F|6sbz14&NFBcv|$CPXhacijRrH73ez6miIVbPxvbP%A^stjA@ zM|zRF-j5>jV-PUL&Z1uA@_lfFRA=}gd>Zd@`ZEklPyWV0YU0}-UN{WpQu`143{gnV z19JmgW+zT#1fT#87BuE_Tx9RIV|2vvIeGhB9tj%zCw8mFfjYR8vz-o zW+{5*u@PoBw^mY^fl92;VGYwhYjYyiuk4}A<4-t8103-H%)juAQf*IBe{t> zC5(h&tAWncy7VDRGcXuSMZxE?EA7?kWUo z08y%R%H%TxTSM%8FV8N2Blgl=^=r5L*f9?jjZy4J7=9aw@A0| zFD0<$_W4L>4flBELqTRRT~!;jqF1S8(;(Md9xs4hOzSc+d~IE|demq=*}k4hT(;&p ze?{24Hibr?0kz&V>z>vfY~n%1ov6{`h%_to{KHb=4xtZIM>ww`TW>VgvE0vFQ2!M$ zisf;rDAaYWa3rz=Bjv^eQo#{yFgH)pN9mrHz@x7N92*0P4QkT^J&$JNfm}_A>cJ{f znl!X~yxAOm z!(Q$@77J=)y!m%sFMG-{_=uN4^%`$hLOtzuB)C-c08`sGL$_+8tzJByAHf*oy*CN? zWzTZqR4T}r0`Y|&IKCG9@fHja8UJzc!KCFnZ8m4y9mZ2i8*uB}=lQX>ljc&G#~Gx+ z;^Fb~67;q`_Eq0UKayCRQ)Ty)21bp$ox-thBh)5Q!_ycMZuo~-X_^9{1 zOtY&JuKaz}6|;a-+-?*;sY<~$s;IS2`i@7D0w(yHt@~|IJ$EMmEOvy3PlVzu9$I}L zc)W(<(3*Fgdi4(W>h>bB0WAo_6dM4H!=-vd1KPEqd8PgNG*imMK)*hf!$F2paFr58 z{h==~e%ca7)k=UvwP~VOZ~EK{iwj;J+zi{>HTIV}bijS6@Ez({N8NX>bNv%?)knY= ze3w@MzuKH9G=t|$cptxV)+%G%F|cg>vu%N3q42T#e5rFQHgCwe}aZ?N-_L{j1*uLKQdQW}PBBTgzI{u?y! zJ&&iTuy7Bt=N=bKum{)y9mDuY=W=iNSPjXDb7X7Y4cDJ@ZnZxer>bt(2%(sfvvKb_ zk0fMGzkmClYBGHBV0;NoBN}{OP7om8zz~JamUlJ#eRbU|sJ-4B^FylS+7*kiZ|#o$ z+L*nW-o3fGnJruGV)-S1|MFqW{_E!I>g@P@_6A??<>lpVi(a>7b0Niw-aDY{D*#s&|xsZb2yBCCA+!v#9-|N{JFW(4?)6YrY zn|cC<-tWG#HI>-RA$mA_ou4Cv*C+H{-@A==-$UBfV_;AY_rW%+B0W?CiUkZXyQm%X zC2{$8TY@u%H4mrhs5kq@lJr;xImmCV?)MX(E-t%m_YJ)o1%8g9pF0xFAM#y4YdLaX zzKhrOTS%yzB7ehRJ!JB-1pnU!wDlo(TIjAQ9^Ja$0!2& zJ}(9)bUj9RI?ra~Z+e_RG2I!6=Ul#Ep}&=>N?qQDf9*Haw*#j%QNr*63lwS)3tEJM zh3taJBHAQESc;(smN>@CNjnR+3nO08OM5ifT}0m)hrsIt!B=3pcL3#2^3KI)3!gs& zC`%SK<{eY$yj9fIN?D=~m+&m;NuLo3#X=YWS2&3}0w%y0%Al%~fI@U6!fudm;JOh5 zArL=wIpy?HqMe`&DJnUUvC)V;WyQ+C3QT{l;TlDpJ<c@NU3+ zpz2j1yxWEH5hGlP`^+JNnw{|Zn2J!FB8BBx)B+e>=?(Xua|k~zV5%XRaBf&yzQV!= z>8F#Q!K)@~u^L)*vt-c`1YT(p=3W&)LxL{~zZOQE8f{vKG(eC1uH@WghqBXzYW3bf zYC*pO#oc=-1QRicX8rF>X`(?S0Fx_!FsJkUbl{tR9;;F^m&G^XZlExY2{si|DcXMf zkEA*#l(QmmzR^j}X)5utG^TZ`I^NZmc`?7J7?I8qNm;Ew8SC~%$deiJS3xg7%nqhB z#KbVOqIR9=W8u^YQpBQEsj+sYJLLvg5QLx;TBg^5`l8I12>&dOpI;*@ab8kTc#r-z zoY=OkD3^$G?V)Xj7NqWxHMKgcP8w*gs-o}o{FJ7VWXfj+r&i5u*a%}hiuY=2L8W7- zoT?eJ#RLVR$L_dDuNu2scv+1hRGmCJl`Ne!5^ahlwOL{iJ45S3mmX}NQQ?&D!STmA zXLG~dirRvSZBZHIs)5`&dZnva*Yg}Tp$YglrfCY0|CN7x!%Zimp%&(1nt>O}W_OeE zE?q=w`E!Y6hhCD9k67H(_-G9c!qr+|wemg8O{gbAKD0XS?@GZ>+3|9PryH-Dco6;RHC#8ATBLWocLXlvkOXYYNG9tje7#Fdu#5 z*P2FWz?6_+wX66hQ27(84b35_Z*H8_HFxt^yTo8GV@wo+1BPWT_h-qxqz<9kY{2Ub zM3jff)t2>Ipy-lh`0Ap%H_iq}Q_G;LK*ZfW=^T-4?A1N;$dKWCs5pk7)E5G@ld7PM zLry42)h0(^FcSsK1Yz(iaob!m!MnHFcI4l!9+$9=_#lcR5a6PRK^l8BhC_GdIUOO_;Wy z<|`x?qgrjnkZe9Y+~wFtILQ7at4oyVGRd$?hJOa+SblRw=%1)DCQ;58rmJ$!N_L?8 zF|M5Lv^1=QsnT?^u6jB&hq%X`oGLrLydMM0*?hFyF3mMbRkM8=H(-nUlY+!wF`b)I zAFNi|M-ao=giV!*Ljg_bR&&U0G|2LVVScM+f_u%Rf>uB47RJq_u-XYvHpcj2nh=K4 zcJA)cAocCuxn4&gXeP1Q6?kbqhFZ{XRlGb;7$L(Tt=YK=_jgqQV11t<(`1*b>}(f#HehhwyDd_d+p z$cH}lhdurLsLU7VrgP8$HFmP!O#79kl+K21v~j(ITiIa3qT;>BF%CUBM`0Nh4OSD5 zFqo3a)=A33THrsw7fb;}6CS`59C{%MD$&-MuDIgmKp46b_fWpqa>2uLqovq5?yi>I zF4F-0*}>Ctzj=3QWjPo}oA#HjJEM^WFQ^gAI%`~v!SPhN3&SYJtYq-Yv4cUbFSK?G z?z|I)?}6$X_H9`ad$nJ&Ituz&vb;7d_5Ot)0FD@Ldh9gT?nGrtqNpb5V)a55ycoYm z>HT=B(zBR95-6P6!azvj_q10G&3)sD--o0~3wvF|fsW0M(~!8v!F12fdQ!~pq1rO6 zgFM(q3mbeAWU`1WaW{}YqEbr$#a6Gtss!U7;$%OhDI?vDR_+#p$Pj&st)#Ml#f8wD zj?lAQ_I)o!cY_s5M{I_%_$(@M4bH*cFQ4eOHn$j9=EI-UXwyxKAng>3uQ(v zD+H+~x7a)uK617^+UGT@s2HYG9w=KrmT1zveqLH3 z5EsbPm6?4FEt{nF2*M_*fnix%aF~vs zoiNwp)YC=?HCNGN9a4HXhQyn|6f@sbzRW?R&LhVkUQXY`V;+wmcUMQ|fag~U$a=if z*AHXQ%R5W_i$55CtUKJk$Lzkhkp#eu8ELxz=`HuqKmYvm&p-dSDq;V-|79F-$B=G} z=5DTL>Di_-@JYp_Q;$g}MeaqyaVHK28A}yO!H1Omfs9ZPh(?fQ$;XEfLJ7xkonZik zg3jvn+%duhJZpjeKpgXkk(4{mQp=SR9ts``3}T_oaG;GE&3w;ib#?VsUFPYXfX)iK z`Y+$>GSqX1-QTT+;ooUdCx~mS0^buSlNWYG$c5ymYFz~n?_psy85pW2eOr1R&c~C% zRlvR7j#yFWJymXhRFcKLG$y>#+%PaOtWw?8?5vO^nz~zBWb@y>N*F3Pnc=z_4+lZ! zHPqGj@P{2MOViS9920EzoN3nT^bWhjsx|7-m7~=%~EjPM7+6i8!;j>^q8zG)QR=F9|E<45Bd<=65jE- zn|CApnE1FN`s)yfLqCFl`(0e?P*aNNGrIVDcW1TkbIH%7knH)z%=(Wxh~_c}63p&- z#)h!eaGO%9Y6N#nZ4@fo(hbxJF7F-j;wCiGEo!Vk*DlpLk6+^HzDeZq+1cgyA13hL zo%(`y6k%L>vA&+J#`nW5f?E5!%C0wBlxGiz-H*Fb2v=|7DP}bVRqh(`ty=wK?FFJB$IXTkY_-rRCE@f;-DdY~SBJK+?Mt)3~^NSLZ+4+|;GMR{29fY&2svsTGYkAV4p^J`U6$*72)6H&F>n>)K znSJXWuWS!iVKo!;EG&)GB&mfYQlr8Ja^~ORI6UV}Rhgy*+;ETiMA;J9;sJ8%db4$8 zk`T>$bGHLP`J8?2M_q9oLJ#pFbh&%DE=g3a;|b4#gdjjsvE6lIA&SJ|NQ@X5kj_{_ zh4BSjED|yB%$8EoZPb+00$PJWqXWWc*dWfchk+0-cizNhs^#NEiDkG1tk9dBOIHQ` zsr*MJDO~{68?L)Vg zX_&`A$n2t)tO)jsf}SOxJ$FblrPXPM#~)ZUbKH#*T?;YgA|vn-nZT-`EWscjV|-G3R0w8=Wxm3F+QBIFiB zOSahEL%Jf16N2Q<_F}qfdjOi?>~NptWxoM$Ni#VvzK&;r5fMoU-azNc(*9043N_Sj z5V)vDDDJAjo1oClelM3zfg(XRGVcMw56ea%FIfxo+GM{#Nc(VM4Py)-6S1X zWXq6vj1`?8D;h`oj=2=EXFPIArYiqH?pmPIrtuHPtPW$-m1#=Es2smK1=jFi`VN0`u# z3pbXbj!6W+3C1g%p&?4h*czvE7FZ#320E0aQW5kfl-zcWTp0&Oh3TY@;VG^h=?_;c zI9h|>98`0g{UdU3;bmj8eP^381!>km(w><6+mP+$$I*vND9vCbAqmLzVh0D0Q5p3jCSBvq_r6_1H&J*a^ z*u2)5h(HQ~L=kOxU~bKQ<8)p~`+ z6mFurwBwP&AiF1#8VZTHJdc;Gz^NwKHsRd!(8~f0dyV_Dn6Y%e_c{vNb^(@bBKRzI z&sfwC9ws%9+HVyS-&sWoM*Tm8?MbDn2%%a~8sW3}hdDIh%*dX(hXrE0xCPQ461#B#F^TF-7h_nf^lirxN0GGGGXf37B?zZcg^Kp2MU0TtpPm zb0$V(EOP5|f|BHEB5u(p_l8SEZoXxP5HPv5d#x+8|*~ai=O1TsL5mGW2IVochfO@QqoQ zgnDdycs1V*lMq_PAA8Uuwv&~GUuTf@GWTque90rQlpB1dGh|fcje=zl>4m2En5B%x zh~yem6tAE##1pHH?RS~iTS|nLkg`^0BA@BP=4_NgT}aHXCR;?iUER{5@O0tJGs_A! z`K&H5@X76kbs?v;A{UBt1=ZWH%2p=d25QZ^L%oSz&AA2!zbMkd^)7N9BU7)SzRA`R ztV*JpThqu}RY2r39Hf{#F`&Z`8)s}Nu+4W4F_zYcW5nLNk5MD-v7v)+H{=pTt0hP! zl?6b|F)6I0Dwgh}Ii+zGvgQ28RM=aKSEtHJbag|#Sv}z_HyQT`Nj+Rr;_CA;`MuGU zkd~V!cBiph5MkWJPt9DSa{X7-$zVsLDHE`F8M|7Dk# z61Yb1mB~FA4oMHBWCea6!MKWhK)wnAyVou$)QBiFn6(R7pdzZpEG>aK9E6Za{47@~p{tnD@8Hx%F@P(8U4J@$Y6j()+7(4A5i$;^V#sXU|?Boa5^c znc0*UJ%wajj|=T|1}V9I1~^b-eb;&v2LSL4+a;&GKpefmmMWU=^$8Rd-F#dze{C;AlFPTj=ZacbSPBFS8^* z|M-aD*y|(zhFyAoTK-Q5!$1H0^Z$*J|Iz<;4me{-yU%zD#FZ#i(oJ+zZTdOvLP13p zIit~kh^32ACs_dnH;4daBDAYf@e*{qB#+K(cgOQis>+AiyZ^w?RMYoRao9FPM{gaCi@c=(RH?)%8nYs4W z&o6%6%96EP2YY)vyC;rSrIlNULU%tuxfO4}H2WaARh>%*`)5eUM~Lm!%i7w?5`lHy z>mbkOKPs(kUF(~h7uB|QD081WU;N`fj=Nhx6lcb0^y9w=1WRpP!Rtaiwy2phjy_&C zH?{R*zrOeXguhh?|5c%bVyj>FJ^FlldTPxcYCb$P;pg%8@>Nc)1iPYdr1kbLqJIqh zD6tmLdu{DHAV_%kbT$5Jw3wB+bTO)9k;j&Y$G@a9=v(C=$PMj_#Xpg7YkdIZ-ei_( zp_;R^*x7a|h2;BLTlSk+6a&%YfxcdgMo3H-m(S@l zpXG5xK9c!Ghc1;<1BYx3R!YYySPgexC~i$m|CI^e;pF9Zx1iuX+eadWRe(N?Jg41t zd0YH2;**XYQ_3i+$fKf-*n>xWOI5~@#~5xty@Jc(_j&m%$^%S4stb$94Z0Hzrv*6i zw65Ez1gE7KE5Dj}EGBt5>Wo|M@jRb*HT9lC4Mf)XC>s>w-vhfEN(#R^;8DQ+buZhT z&)JrDv7`~%f8~?K_9l-Ba*#(}DIGt(^xN?u8MI!$8i*eM&lS{+DaxylF(FSPwt+N4 zD%R+<0e~B0cNFwAA{Wr~yw1y~ic&-C>#v;TtP9O6vAYZWnz_K0Z(KAB-mGEaZ~L93 z``-D}T~(0s$>ZuQ90^-#iQw^q_PBUzBZo?NZ=NZtm!h7W7)cg&=H6{BHl+bm6e`9kxT(g`qNYQB zF?29PsAiZKtgFZNy4-bvQY?$&2#~8oZPBhoRvko{wrZVx)9XqASe(Y3${vI-%0M6 z$Gr4wwwUIT_&cIxvzJ;xucfR?BH}g^$&M|M!j?Y*$uHNJc-RzlDwPd|G0FqdOPKqy zgUQd6l>n>~a7A+S)G@%|%8E*FM3{GOjgkAFTAS)#O6zX>HBxFZL>E+J+ke@(fX1^; zgZ^;wOH|46S}w!}%|NL%h`New)pdo9(%mt_-mPRU7pzy5RNGs#ViyQy#F|B~Nm&UF zH;GUQ*w+xd8j+V^&JQ!dW4JbeI4Ku_m~f$`wV5W$qO;0ZcB@0>*$kV*Mq@?yi&6Ay z0|;e>6=R`8K*E=bQ&muNx`4@HjPxXUV42|L;8}-5*_k#Qibk;{Cm1Vd0Kv?G2-qyR zr99r8VN0VZcn3;gmYt!bQpy-jqJ9@6x8_f}5dj-ZD~gW%U{R%HsfwGxJQyAsJic?Z zV~~euAx)^mbmL`RxQ1q-#o(>#b%A^Dfz*^ak(OjFmBa4|eMt3sH>5q9?7nH_p+ex~ z&-h&TLvU`fER3kyx+KbOH2zYcty|ne8FpEu3IQD2$K~^^=}VDO396%0=6ODzrp_h! zk0GAGLaWam=1=_g7i-KJg{;MD3+|-!`#s|d`+C5ae0IXNU};?{i@JA|+_$7Fn0HMm z(MgmvX11IPl!^QZ84JfU$AoKJ-20*S=KL?>Eg)6HkKEDT$J26|EIfel16uKd8$%h* zhWA(u@I`-7=U-{b7_hwh2x@L1y-|hW5pr9gT8S8u$*fEnuHsZSL?PA-vFnblMXbgs znbGJk$o4e?x0i6T=70ZOj2b5oOi8}MT4g9l*pTbUJa>vLp89GmLYns zophOKh=Rv4pJ8pWY0~ShuG1MTcns!lN2pKeQUEpwe}bh`2_SRFO`T0NV4ktWul2>L z+5&i9>x^R$3#FHV4{10&`@$wQIq0TwD-H=S{7JdZgTV^(A`T+FK5oTIM1Azk^8RjN@J zD4A)!;vHLsTlQm@{k96h2XvD$I~R*RL0B6xx0kJReIMN%#Ky)x-jvfh*1IT{2dX>! zc0zV^;O;zvA)~OaRC^okCg%+sA{hSK6*^f5nhZk^IEwvmI8|_QD{{j8YFjvAm3!wD zRjNsk%%n1>A}*28l6lq{DdKt^Xk0B!Be?gTj5R7J(~TIIo2X$*V|K529a5Pw%0?etVdjA2mP`@`VmUs1T`#rFXx<#F6=RA#T@ccD z7NNaH3YBj%Y{Id$!ON`{IowJ=2-S`^w2La4-HV27U#ih3Dw$ZF zP;9sZ!_=f>h}wq}>lPV171*U)NH-ihzFGEl1JdT5Qg#d|J36`E1+r{zL9=rk@Nl^B z9v0KrdjyhgMhtrvZyp^9mu}lN?dYG0%!kcVF-W~x?N+C9vJt>oKC!X9N)Cdx!(l4j z!Ky|SClG9$|NSGSHucPmwz>RF486%YDE;^6QNfFt9WOZ-h1t^76PN}+fG@~?{cHvzwjPnh!$Cw0jx6bKp`#5wGaF7F1>2&Z$Z0^ zLTLIBdIX{E(3%L^a(Hqj0hwchAv|ZT$Lk)p--A)#aVblBW}`c3-#-|KgnYIGYfC2z z`LVZeT1fCrt3M}(w}uWL1b^BthU()WIFpCTZz$+iAv{kSl@_W8U9&-870 zyHJ)tWOzFj;i!l515UQ%iuIq4iGTk2=YN$_xc~0|9S7AlB!RKln>vr{o1b?fuFZ*G0}nvEh&X%oIuxWKb)U| z(u$4DRC_?Dx66H>vUaOQy?$?jZ?&kBD!%UfsYSfUVdSRXH=B{mjteudnsYc1G?oMfsyZ^hcr1^-gR zW-y$mTim;~3FC%gizYA-UK3X^UAr1G5eLT2?sgdGV;@q^536qoudUr4lBo)K0(+7} z$3~{{r%tpVUFAb5fA-eV**XFGWNAz&e6bo?%Zo)FkyvIQn_g2m9=Ko#^^SP1udRP2 zjFmbMm+~$lV2vhI_plxKFgJ~|Soh(ytS0dE&@mv;`_qE$^NXR_r`?D11l%UdA;_9B zAVA)utM#*K4U(bzbkW;n4`t&KA{D|$Y|}*nv}Szh4kQ`^DtQfdFvgmp}kiiFVe}`y~0m0vfvm)`)2kXH*!Ai!z zDX|-OWpD6FzoRZu!ZY057zlv*AvN(8!zbj5pF}sLTY`T<9n;G}QGH6q@1QQhvcs7nMCw4R$(};xQE$DMo@p?KiLbv(E5(_w3#qKe~OmUyb`ER^~9uP zV{(8yi&_m17#oFOjn5#F(O$*{u?m*CUf|Dz#z=Dr#cty-*uD#g^10b8;*!k$e)|{Krd2R^-S>VDgBfI~L2#B7QWm+b7OoIusyGCWJmA?W8>Ncm7$tN|~_? zdzAvobk{Hu56Tal6xMGDrt11(MkOqZ`mi{ zrC6Aw6$f-})ILH$Id9m1GszE@{Ji9YaW%e4bfK}Q96P8UwFSfXI4RINVm3e((;A_a zXduXj25hM5T(UDxN?$gXTi{hg8H5l~OovMVWI&t0kDz$9U=9kC8_?JGXNN`)ZMxY_WjRr`0pAnK5v%ID&}m-R12}La47*>2rmrwF2Aw8-dPJ&B+T^ zq`_Q4PRyTDKMWO<4@`_HWdg$viMr_VKeU#HH!*B8$n>gL3QU79WlZ62-Q94wwkbFk z@W6PVB1mZU$-8ShLrMYVFXK}W8^%Kw%B+mbD{5jUlbFPodItBuaFTt zs8skNEm5{TSNnmh0tAa>vmiOi4C&~=Aoie`BwmPIGiiX#WAg}vV9VZTjfaKO+ zl0QqRoIXS2(s`SJjXhl{`}vbAI>{q>?LRB1F%Rabl!Zm4;C@)tk(Z)FC18$7cWrYL zoizazrqr!uM(1TzQn7+MQxEVp2MEptq-dkKw)D^^$m%UM%mm;@6;jAJwAxb}xr#3f z$fCiqB`Aztx$R==YZ#n>IJrt2D^zXgy*#)x`oNBJl||N*OigAAze?0Pc;v|jrz-$YMnu-K_+P*Td_|?DZVRqWdOo3{EKh+eEQ!a5TYTl$7CGw0qB03>zBM} zcnq8e%PlB4wJ(vO58RPhejjwsibNJc?r%OJ)gaL-DMMy31L!I@7|Z?7Mg%wJ5N;EL z;Di2xv(3vP3b#G+0W7d}|BWiU^OO#5Kdsnjb0O|f zNyE(P+*nW|s>79-5fv8xQc+yjw3MebOM@Td_*1t-GN%Q@`0|23gTkk^zxhdi!=do!|z%P!@<+xLdtt{zq9VU zG*Df~XWk#UaZ5pN96!t*03vUbNc^C%t|aBqm*o}rBWNS^CT53r5Sz*^C9cQN{o+OL zLxN71`NAoRmSqiq1v4_ciO-@@WIVbXHe)|t+aHb{Qn~YD{||fj)Z+>CaEZFmW!tuG z+qP|X*|vXWqpQodZQHhO&zy7fzUSg3lg!0GGwJ6e?3=w-va{Du1mIYD!-&$ihAZq4 zD1N}4JE=-vNg8!*EDu7w$U?DIg-pu4Cn}$~@cZXM) zRpCwCE=E`fDe=3E{rhsKTa9hE=8Ni3p!%)FPAzuPKvmp~abFCbn(3Tt_Vsyn@&a*mq54_fQHKm&XHORSoZ4udAQ&MwUj70zPkSYrkf{n7ib>|wW% zy7JZewF|CCAbbZvz%TnvBH*v0#wuPS%C zJWW&jO@ZPl=P31Mi?R3!AQ23nFk_2NLCnRczS^gU3O@e(#!T8f6HfS!cuI67v*ZY5 zlaB5m=_IBH6`Zc$ZK$WA_y)%4hRtK|4LrOP*aO$2Av}%5>hd1p+j8-?+%R*{E*euU zVlPI#z!C2n!ER%n+4Z|@CL35_2Q{X((hcWn=jQKMbF;P6*L?qh`&#BcyO$D^CBq?bo4sj3a4(WHqnHmhG;ZudL5MD zrVVsd$-2`uf}?LaS{&8HWTIgnsL!XTrs(MPbo8~g(;@zL)HZf@cCrcx2$V=~c>-0_ zO-;?r#YUwaWAx^_?4jSSU0>pQltm;CZ9LE~_tj!qbz-Rv_8<|crR9w5KF6(u z=V_z5%%tLNG-;){b}f?FW@hpHjqU->=~jE_-cQy;Q2DuOdHji6u~X?r_pXm=;60=S ztLZbmS;`mIQ0OG<>~3&x#lZRGF`mZ0yWrDYd+=IP(|i07mnzWhxQ>a@<0~g|KC>Q3 zg2%Z#;ajS~wg^w*4XZ|1B97nMh5?D+kh z^I~r&_(q&asuWyL9D)tVz)n+QomIu)b0)<(*XeE}$ANp2YiwL1t1Xp@nSbH{np8!h z8<4Xv*iP0;Ei<~eF1OUnDfFAIl%Dn0B1xNjYi(v3K%UR1=G0ohTQ7tX74MGgi!1BFI-~w7o@= zXb=hgT?5xY(23bi)`(5y7CoC?LOODrRz4~1(zkH%7n@`1fFn3*KN5o7(%C382Lc$V zJc~pHr4G|^g4C!MH_V}OIGS-YFfwYMT+Jm_mi67^-TDCYq|J-&rkT=Xi-rTGWz+dz zn5%&}pzM)^`LD1~ETNVY!1x1ld7Rx+i*38t>8OvbVO>&&19Tjxo*=Mv@j#8fI8<@C z7FLH#l)Z!eo`} zh-EQLX_@MPK8$mU8e+vO$q{c3hSyDBQ9kd~z zEe@xlCB`ciq$;aOAN>=90!}^7X-}BUwD)%hZau~WkWx-Eys0oe3$Noe`B7@rAmJf& zDD;OdC}Y!f7NuKXUY0VhGShKSf}ntc)lkbKv7B-F_k_VlAvcjcquF0UefhfHgM`CI zrP-7nyjuKO7z4aR$dx6~_k%QM{`SM#_<6|Gc8tGuo*G?383aGdsv(MW^m7-3`(b$D z`Sfai6f`>1HmKu$R2P-EcmoY3C8wuOXq(rvJbbO)Isb#pND8oPtkMt*V3 z+Lc1B=d96O8QTQe`Wr;plD6fgyv&y*k~dlEFpGPMVfnCob3RHL+R#){Lg~gzifZ$B zBYtZ0;Y}k@io*yGbTtSkl2IId2ntr13YwJzuE}8ui$p38nOKm74YjKF#lP9EIluvh=}Ybf1neo|xvpfzzyM&K2l zit}XtHyU6SP!YKBTWpLS& zCcE@U@Ay)k$6PW6_9)GjZ{P(WZ{ccC7E!bST*%gTnZn!z%G$T(l{oMe#@s3S_Jw4zXk8#C zYv_v4?jVDpw4mEVzG^*c)4OgJn;2A1nxIYz8!26iTeeOdJO_*hJqV{d9yEJKLukiv zAX!Tu=-22LhDB#tYV@6`MqL_yTVMY^SDn%`P$%39TsB~u>I%0y0cEXmTdHz{YfD0I zp-uL?K)Y>K=w)`#xR7W{`IXy4vkg{|0J3Y)GHSzU$0yF=5d^sCuHtw4hX-3pTTE%_ z?POA*U)cxH#_-x{j*k*hdGdSNfNLUy{Bbl(gj@xf9qpCGCQljZg=-;HcpfN|^#v!Y zA&T+HzBp99t823v{^PI27#BS>~6E;Y~kjhyO^?2K&*5(vBdl843{4A z`o6p~?>_kq75ZMaW#-O?*ULz+X9ai4W*Z5wMcEq*E|IW8jf^^z3HzfLxjZ25>PnDkXb?|H8@4&dHeV( z-QS`FRCVofV9Ry*_K%krf=|<}pdfX(gnMB?`O8`63XRQxP9M!91KUzp5f`qN*%dAJ)IWH5?(r<6a@Z?eBGMy~%PH z4QWr>$7 z$bWV(rKRivc>Pmn=P|94WRm&4akU5Z=f%$-!;H!0D0r%As%Z(%r;n6aUw2KnFaIMr z;rzrHy#A?cCTvlJsbu35r2WPLwlVdayy-VqxHwSR?G^B;gq*mUDJ^`xL>ToJ-_a@ z4Ep8-k?RvX2AUL#AEbl0y9Kr{QSvfa-oGGvbVgMbgKaO1Ciw>bMJPs4b_=eIy3Uo4*Ac?JNCW_r}*D zZZ_LKk~V0vDsBwAx}2Oz))=DKW1BWA{Cbncu;e(Fw>z2wUFZFQ;2l84|I_8+pMU=O zKia^5+yApuz?DGGb(-m(?7y_V)PZQAHRKtm;*8AU`G8H=1p!ATm54$;fyg&a5ji%d zaV#NiM|eqk^T?~N(QhxQ@U{T{z|~T+-7{-0@2L3jJg*wLHq&CT;mi1RcCxMiEUC%O zTc!CqGabT6D!ln|dq3KXrVYM)$QkMI_HJI?+1@MR+gRJ#9v;#A8J)QXgxwxA`!^2r zHNV((;|W}?rSkG`H@$6tf5+i;${4u2HJgcj+E3-O@oc=lFyU-B==rU?D%5B7k8x|g zTv!MQ6o{Cv^;}t-YgFouO<&$u{Pc_IpFe1@yPJ>H%sp3z+M636)4o5QADeG*HOOr1 z8b7*fS6of9yVKXEy>+IDkr&glZFp;4OsQl0>zTeAvz++rTRwxxq}Bb-?V9L&t5-+X zNi(_rVRfSF*N>0IDn5K@%1k#pTe9u^yYX`_K7Hx%HIq0r{{xfyO*?VVd%?%W%k_0U zMtfWf?ZqO=*u`9 z_oZ1yb+@qUZpc{6$Elz*skyw$rM)?u&Lt@kBc)MR_N<_&#=cU_FGX6USFAPQ(P6SZ z&TGYO-=)CP>}=?;$ZfJAy#^c*4B7$2o@O_%tD-Pv6ww}--FL5xa{Nb3eXO3Y2WO5h z34RZ-^~+NX_V#&0yR(`j)a|#TSa7v|1kY@Qd@RkhoJWSua@AksJ!>(h!3|B3Tcje$ z^JK&i#^oBCCEmx6R-`^-=whyUc*5S*Q0%W|EQ};WJ0f%JI*w0u>hkshC=`4A>Zo37*|uy6^NuFVO@f<(vRz$y4FKYy(tDlDz>kJaX?Lj#0vV0 z_I$=j?PS$8;mlNYs0c)0FC>y4ua?#kBY6!T5q6bZG|E4ikWN-yd*awI`#03`{LlGW z*y~ePs}{_O!6$cs8IApokRo&G{eeQ=1!0MyEsPUOE(b*|8a#6yC>+?%%!W}i(_c|A z$cPv#*p?z(#ej+ht}@dnOKv>hQYS?mctW$9@Ko^-C4*UY)lC>!s>&N-6o~n!7;M)` zZsQ=())eaVX+qf&Bolsaj7I#Bu@+4qG*!leZ$a(Fpp;C0qR13sk=affA^mkSy)jX3 zd1sL#Kq&A66#zBr+eMbmlvbX1mXx8Ca}&T@2BPPD44$uy9ucc)WL$<_(SMd77q3%T_ zyAHOOxBemLkdvU{iot_aoJH_E4^%)gg!Q$wIs{u4Fp3EpgqseX}Jsh&E0&~vT|ges8v%s$aam)MeL8V zN`I89QUaKs^sa~kKHj{={vu!L=-LPEcoy;wM7`Ovbge6|g)BwVp8F%Ei;=T5#_{}1 zx3Q&uiHvEy6AHSfW8LwCuJi)l@ah9fFX9!*!Xid97HHD_U|L|gvPgO$c(X1DQ^>>GjGM9~-&e*_5vK$p| zHROe=^h-zQwJu-)!UQ|cXr6MvG)+w+&L$*m9YB2 z(T-}840CuWrz-#JftsVzk6t}SR9A$~Qus}|mm+wP(!UupriF;pX@?aco^uv1`w_x$ zyjqNCL}4EreS}_M>yk^j3p;@x0fo@OMKEgk+vA*yG%F}=71}yolPa~&3I@NAEVg-R z@|Ws`S6*UNWFXOvsi%43JW8ImG$cEBNU>WrE7uM%nr)QGx93$}pYFqnGN1+g<3L8C z0O+FAqJRVELR`_L!K@@(jnft(r4u7gwYCdEn%!lAaVh_1Y#-r zBJ}RbHTwzLE-5W>fKIphn}$y7cW+>z62q^`>lb6ftJb6yS$ihu9wrd z9SVv^f{w~ACo&xVoX^*Ty*UH}KL5M;gMo!H_m7eAojjLs9n%Me_&AEp5n>w2$H&tR zi`TA{FN9b|_=Nv-l=|nNfByOBpZ{YJ|F`|WE&EMT)Da8r?I*95IF2!HtE5INfF)#T zvog*g9we}F5wV&gzTr}}^x~|loM1rfE>i3Mod>Xe>j60C^hgZf0hWUbF=eQ#4n?jr zFU$AObVkjTVno5|R)#;DfFkkR`}H1x|HX#7KK}RvK|tW!<5?7vs?m=EEm(oT*BJsP z^i|&>dgrlu8Dj`x=JoBMKTl`>*vhZ%(cpB5N=Lwx<69kRx*h532rT?qW-)%~D(~r_ zlEC8YmE-w<09Qc&*?$8&Rdc5wSq8EW5V4oDHg{*CfIk^`($3H=Blgo3Jn#`8XV^zJ z&r0_wYF*?)F7q1SLsh1lYw@nfDuRXO`p1P@W`@FqKqVw@T=h6pg)hH8x3dgwv7S7O zofsd)Z|&CwMQjsA1vK7YT4*a@>PWEFV~UI`NVkNjChE!^$gByz9@Q5!Dn1E4#T$uL zSv@_imXfr;RqO1&i#KNj^{vvMKX3VGq*eX>W+1^{($2a6wB;`{Tfou zI|#Jm=t~|wOV+l+rN&{BM;mWv63HQ5O;UqLA#giRl;@NztHB?wR7(p<(}w>fM9hvN zwN?iM1_50h^=1|FS?72YEEQ42NwoEU0#S&}TyvX&Es}Chafg zRJ{QgRzfA?mDvLR7#*}ifeh`o?Jp7Ynla(&i@T8FA5-(nf}aE%lS}0C(IbrX$qI|_ zr^ITnRj~F&4mAw+O2zJARkZ1=3xPmiW+nV%c}u%T5m8DBAz~X!YhzDigeOCHkFN?3 zJ9Z31=iZaO>84|PSXnj?I{KtO;C#7z}yD5vY!Ad=HCHupeFN* zHA0qU8rOij2m&5Tj#N0G)sp7q+@!`(eu*(=EpOl+B^!4P3J&waXIn-PrzK+dtM(w0 z-+`#3&J4CQoX&ODsmSK9N7jjZz?U93sYeM1t8@{e^>~OpRwdQOpl?T6bu5*6akLG& zQLtC8nF-hEiW~lZhc&_)@bv7KliFBKJ6_YaSin4)3{&Vu>_6WS&;1;crSPdg(J2gA zwo1l?(p5%X&yjKH>#X4(kuP;s@M?knd~$sp(+;K5r*}Ksgkx-+MTR_Ykh+*KKnP1B zT!?uWiPW<`3YSvQWkcp7i1l?r1oT*>7Fd?a#?b*GItOm*0YQ=1Phl$-7O{k0?SJ)3 zh{-gAgiXsYWYynlN=pr)=o7S2Rz|LOp=y=z(!i_<=UB?h$cctPx(j^E*#NbmC%0#PE1B3MjH?!^r7p2j)_cQI` zpmkoBt+$n()~OwzSlb0COsWXcGtCRT&)&hU)K%V&0x^GOvgWd3X~I5WzH-YSb3tilO!?eP2m4qP&3cVVW5UX6yriwdMR5zG&iD@>L%c@3OJLe-2B=h zjpPz2PROs4^8iXg;K+P26U*qxmngA~azsO{tbM=uWW;2a(#Pyom#-3g@IlUqPI2Us zfMzV(qiOnc6<7-@H^p2x&2)_uml)VS1AfPgugd#T?H!qlu@|E*2U+8c)(=-65a~#w|L2hx zDhETP>Jp**PVF#13^w9;V8aJk4W@&n^1)b-Dtn0#UPz9BHfoV((jn(AlWREsAg}mr z1xK{?TKs0b+I2iQZ>GZe!G;Jc6*#7o7*7b)@z}ul!9EGF#+WZ(r|TH#x^UpsJ!r z#8Im;2`@Wa6M>ORk-7Y~sNCmh1dfzRt+uBPL1GcDyw^~{+rddSy@t}0 zLZ?EPd6}?s^h||a5^+RraBlAakgPB661ku?rLHYr52puKT{k010~c(?<{}Bm6G#fH z>UmQETNKMQr2@V`?DmZHz2I|_HA8DBVtxS;nDZJ5PkEj>#qDT!6ADvXH_A~c**zM77jHNRcn!)nXbRDFb?HWSK&a(kEnDos})6-IyTgTR% zk`Bh5PD#Vgnak{-1HRAhoh=SKyerq|jxGIoxYM1D4Gz1F!dN>zBOHObAbGvZvr?I@ z_V!7<4(@BbQ{ft$Dda9V z?#xAlhZj0ac4uux`U@RPM|52ESo5Hk~Awhesik1iR7nvy??*d%z8$J#)=OP(%^~RKoZRDy|W&?eq!->53PGZoolC*5)Yvp}zg+dBmO5$;?@7;4<= z9mx8y=OZzXHsgAm*~iwyB($UlRbyUoHDpRuE~$SCI)iZW4C!0i7}~^@sT#%VocmrI zo*;Xvlc4srA6Db7N;=UCnM4qN{9^a7K(KIn7@64T?Act< z)K5~4xik7$_A?05O8lL*w4yL}9CkZ@EP%0+M`LBr=3^e3nXi3VItWix1aabi%o~9h7ms+rh!NV zJvf}CgaJN}AJT@}0Bnpi#i-PoE+O&PQA6YoV&(ujzi-JyUepUZ2u>VDFvHOLEKy=C zaaIHtZ6JJk;&Ea2n75F9B{OET@HQg0Sfn75+GsL91R@K1Ck?7JA}dqWhNJ8IJKs%pl+)%PkI`->fFW?t|y&1#;epUV34za)I$Y=myK=A;S!%R zOEBMlbq-rOkhfl`%8lAogFkAeiRHGU&R3YBN*R%PkT6nefKD!JvpAth9&^H*!!pbu zvk0o~mO|w6^;*5U8N!Gttcj~fKaXCl{Es2>qKngbmo*##n5P{SH$B9ho zMXah|L|A8w@bQM1W{X?f2HsM(+lvWDyfty%{z~C1ne0I7IJ4Z*B$%;K*UUV|uksyH zvKMpCN-ArBN293zLuTgbD2k2tAlH>Dt}Q(==#&De3g|Pok}{YOWz0s(tGAUQHYyrp zZ!!9O!9%K`t-=Ck>4UYPj5Wa+JjV1w!!#OkWpVZ9CgP!PjMmS}rlz(s(uRnf+R*7! z3mg)EaSP2u7Dh3MN84Ttu>wY|O2tWjOC$B9PB(68c{X&S6WxG`5t+A(}z7Uv(bE zev2Ki>Pl&Vn8!BeN(vnA2Jo6I5CDs3G?h7HB{8}{S{xDk z=@h{ej$!%2j(g$(n31ya zpWU;0)e2m77>}dxfP@~G6og!0If#4$f+r{y%n|xbljZnx5TC*Ijy+4&3H1Snl)7Sbx|NQgMKmYvm&;KuHsQ>E!|L^`^ zK*wSO&j)dKTn5)!EsJuzNL00?HpJt(C29-=XApJ~wGZJ$7&#?HM= zqRDq$JXf1ayr1gJ<@v7UZ(K3WE2oZfgC{jL4FoPGb7S!MRDW%KEtRjg!jhHiWdR$O z@2C6wg`J(xem2a(Wi@*Eq z@(n*0)nho;EbmuIJ-mOQV&BHM*shzM-RoZ*w)$RvdVyDLI(OT0f9|N|p6`o&QYv42 z*w$pScYB@=+Qv?Xne(rozYwy2CzHfSs&~CxhfrrzD%*f;E zs~!AaE|a3Oif}R+Y*>6eo*oYAGws0kDm98+9t3c~uX;izUILwyK3K!2fe1pWoub&LY1=s%A0 z(ut;4iNLmxR%^DRqr|${D~vJE5Xwf|sPhcZT2gG{2|zy?Yx*5*7k!|7fyrGI2hJ(r z9Dq5Ab_N@ek!Dlj-y58a)ufhKdC$e*789(G2}yf1ZLUm5S{uaNa$@Q?mtayj@qq-=AMNuKiDq`0H>6^2R;1*!SKJ<}^GPSP1yM+|i^ckZ>y%@9Ic4Eqe34UFu@%teTAq)C|Z1Dx$hx z$CyL0OsRs}XOdhfCB)MI&i1A_lItW}iJR||Q0_ozk8ho%N?&yFGnkKD@sx1#_qMo(BB1@seQ*~AC zTbO!R$>$iv&qF9pc)BbU(HQOz#?}~2x(s7$Gy~i59c3mhVb)#H>Dnc8XfJVR3~|1N zOc~>vn^a1}>yDgk^#EF1AsN=k|WP< zQ{}uP2a+5V$ha#ynb70CHC(;G^oxh6g`tv;X_uvxyqdG=M!t3tP6WsmX^PFc0nfi% z-gpV8?(15<9CZ33-r}JeB}poQ3&J$#rjAD?)+?4gGeAC!&#X(u~uuwc{GB z$YlejpPj!ph-d3$YJoMEMnZZvD^qw#&oTL={z}d&p0yKBT*N*LwBy8>#`@NGj6m9~ zxA86ta7Girdm|MeT<6X23McfcX299qPnfQ{Pd9x{_=vO&K2sAP1IxZ@%_R-$8kfM` zZKECsro{IKzWzYHf+5t=oOX3?978hq2Ky;l;<`+`O8lXP(`49JJ zCR^g1N0^taCM>xU#hfIB2X5^qiVP-KM~4J?)UmPf0>;Nh*X_|xpEBD2G@0xS*2T9q zj=d~+&1;3jqbh03XM2*9fl=6XHDxlanvn1ozSG;KTrr}=iFxuy)1Fn|KmqbzSW61D zN!Zp)ERWE>tc8=%^y~WexlF^S!{Wao9SV#+`musdC6rUcxr0$Zp7ID60AeV)hmjhq zxra)a(#qh=X|L1=oCv~XTvAzo4iv+%O~i-f4tl-0A;(TQArT4=DvUK5Lbust$B_0& zD#xY;xFMCdlPJI!*k-wjjLGoTtre|btSUp6?tgU@oCJ@O?EhhS_|v-^r6PQ1pPM*% zc_Ua*r6U=MF6Zdf$hsv3!1et4dgk85{EhcQ>Mza+8V5^mermi;&FGq}O)RmieJ{qA z6CQPFzkn*zb^irv$HDRJH%O)+e}92CVoZ2mQ3fYTK4W+(Vw*dzlKPRq8}qfLBYz7q zcCJ6iac@?k^g>0z?eLXT#3GjFRA^_4+48IV`a5OD7i z7I#yS?aCPB<|!wa8F+)P%%tUcx++Ou>Y^>LEo!%t7N%ErjI}94FTWbJEhNJbXO&m=klh$qFEx>v86D^vwkf{NzN+3Ne>mEmpU8QTfxg zc26;SM$q3Voz(SIkgs$98TzwI$T@0%7nn{%(N5D#+U-!+7HLF^6=R|-wd0opS`f=Z zb05iIuKW1dp%kff@no!mE8dHWK0l6D{<}mfg7DX|nO1Y@5t0N>4WCb>T(BD?gKOtj{=({bThnA2b3)cHMxovNjL6`oMVgdB@|Q8iM=KkjW7L1MDBpa|nZliZ5mp zmiOC+tck3NBeqaAyYhzUtmriPV}fECgKif8uA&~H_j`^9wp}@2fu_$bAJFu)o-lu# zZ-RphUlIQr$G1m>37c;carcYV3;}(=@3)~N3j#jh=aGu&tRsq^_V(Au_HTPz^LU1u zRP3wOn6k6GqY;JMkKRuh)sb zV?j!_`(#MZ)vHUyS2X^CJ-sjjKtlSSg6ny;KfRuZU{TIx=iF*r2O+wHZ1vW>Cp^C8 z=O6Mp<>#%6<%&5M3;y!%G2{GR7thsvk9O7X{<-!$KK?fhI_}By)(e?7Sy@@^JGER* zU2+?CHXT{bEk;wtc((aJh}t^#w(C81hvhHRRsMP-`O;r2{6*JmNz1u@vIK5sZXd~B z`+B^&ao0NoB+n1|c)Ye80`%PudAF>7&0D;>p9Cuh10#Gz*X#oLJNXuFzh_61PLD56 z50t#T^WnAIKiD20etCFTTHVV0v=|#Xe{1)`+TK|gri)+_ADs2`&8 zn@Fb(QtR&Pe=R^|jwhlnA;Lfnxry-4ncZioYJAbYMHC&Be`Fd<87yv6dD@aC%uQ3ff45qY=!x!rwRfBQ(~5H#kekzQ7}xp7W?OI^;ygd?|Q-LNCrB8 z>5)LXv1dN>ierhW2x)^qthGY`S`FVpS0xa|XFXD7AGn+IgF?Gr@=q9)zvy zO#cF;`^50f(AM-Nm1AQ@JPh(5(LOss!r7MLt=RDvDdQjTGX`U!nau>{)l?%ou-^mB z7AO!PMZCZ}5!5;fFB@s;z|7i_uu$2RwDIMW3P__~wn55sP|Q;GgCEO;_Ds3x|A3ph z%wBbdNJFe)Y*bFV|HYVIpwwkEs_y?5R-|=Cl3rCBhNIDVB4Y?2VT%ICk3vUQZx*dy zG$LD0+nN5NW=>l%L#Usy z6h=5Kl>RLTCBxl}xvDgB1wE;9q{j^zHkkw?e}GIKt-i!W9``JR zImZP&0}P%7N}8fivbqvJEKT3JQzTZDJ77<(tgqevD`&9Jmy;?^#;N}sGJ;0{8fXyn zbYWfzEtB`@A!rgJubMDkx?w8f1!;^K9W7{_HW-c1Uv(sXQH58t{r%Fb7-C5M^09r9 zkVo@g8yDFgtjS8eG&CvmgGX>;|6t*q3Hv$-AKn)P?sr73!#Qf8gILJZt&RY${uvHy zO0l#wv}Rx3LZHI2%SwQoq#b^aaO{rK_{UqpEn!sImgJ&*V|ahA87K8 zFtc(AK{gjPbsE~82PvTJPa{dhSjnZmBvjL~sQs04>Lq!jZODanYQE``9GxWtwiay) zD!+uB1=s$4nUP0vvIpIYuwin|eo+kwNl6c<9ZQIXQ25vYS5G_Uy9Rs+6!6O7y-rS9 zV^`${O8-Pe3zVKiYymH~+m?^s6KIWCU&SuX2?tY3T*eLbH0_EJgU96(Vxl1=#RU`U zoKeqpeD&U;o3u9o50dM^!(SXW;9Ad@c_zt4;+N$s$Oz&0_R)X|X^DbZjYe8*km`15 zkhO7OkT084>^7oq+_m$b8ztBvnbeK!YlLtX2@M$vN~%o-)?%{)hs#02$X5qu=lnzc zy@&cv-+MJCPXt5!1E9lv9=2KujxW+kTr1zPGTHAo`V6wou3EZ((<1FD7J}S4>mhT^f8#Dh zJmSgLhe&yxtLo@>~)x5%$s}o%~$BO_b+j7?*{J71!@*+44Q2 zOovB_2F!NS2)a50(#RfsNDUm_LqJLU_2480(ioi!?zw=Dr3h*piZZ-aP} z<*WAc(uE(Mo(`)QjarKrq+;i$z$U+tzDBl9uurcUzp{wJkB|z1>hc+ZtG=|3yr-+9 z;sL+=K9;v2@kgK>-J({F#h-4<{H-7JUf;h;Vz<5@cne#w&+YGrkEK z)mp!=aL$uD?fTCi&8!zQeX}Eaek7s3Y~Hn0e3!f*g1fG|uFmLDjWsLQnyR|!bc+Pu zcKtR4pno6@Kc06=I$j~Xm+`s(qC3b6d^*~E1h?4lyp2pRZ$EYkT-k1IPW9YW?8RQ? zlr7fPyj!-{eO=SNZYv1@6>?-5{-;yhKmYvm&p-eC?;-hb{eLSCcL=R|{X8T0IwKc< z#mx}utrYNme@8pvav%HYfLiL5#JDuMAI{v&MlZwTG77s1gSOp9vq2yu%&Gj zMpP*oA|kmw79nPwzti_- zcKVA!V~C;n1g`;g7WNY75?jZ%I%Bu zb91{H^rdl)J-yAsVgsG0xg&Pq!LByMqT0)0`|A|FTCi+qL(bK9h1RDrZ^Vra&93(9 z;4S^=u8zkOq+8zQ4Ub#K$M40@@AVa(z^&`eN3=o0pTE0k=!EMj|Lab*m3!BCJ&nL8#}VD-S+j z;3TxGC$7NHLH$8$YtwFqK1Ys?HK$$^!7%q zd7M}1p5TeMQ)UPSwW9F;;a>c{)8xFkmmG*J*b}ar!uiy7w^@P9b_NNqA?84>;s>cZ-pLC{urP$MIPsJWt6SK8Aac+Gq7=U1^C-i6dpzITulm1mnB*_naqZe4RSaZV znDf%m&uS}?B8H{3xZi+EL6G)~3Y4ct-NTKm=9Oc>09Zh$zbU>NX0+(vyI++Ttk#g; zS$o)#d$s-W<;?KtBfpP?JEAwJTsNl#e*tI2&i+|3g_ojJ>Y}b2ISSrSOplivIjxX~ z$~OEom*q@7I%b3BB!j~V=Q%3#UbGTWSHG#2ScCaB=ne0EW%oK6io){Z>` z8Rw_Gz=B!{z6bVT19uc%rnnFL=&j1dD8)J+Hgf~-RFefW7uvMNsz=HYOHwgZmTY}D zotG$A&y0kUZ^4&0sHQ-PnUuGtTHUZ#1$K1P8qprpkBE}P!>h6cKyvSS}1n_Y(R7rW7)>c9gXr}QjzR1xMr-8BI}T`(u7W(tK@=JOB7ik@a#(G z$*B%psNlc?$*mm!OuS#jeClc?8##^^h-lUr!>Sv*S@PFHgKLMe&wzrhp86GUj%KX$ zXKSaSh>0Dw6thKwmh_YUeS8P3DhV(OQXNdmf{HGA$L#pi$p{! zHiP(ygELY+v>q%-5d==067NbHQ%@6~20(&cm;HiFXQ@gEk&!~r{{#9uBPg)q>*A}F zb;xTYee9bQP@AQCtzFvG6$)S@K&ytEUtoQeIDx-xCrYr-JdP!8XWJjy^?QkQ{(E_u&UV+Z!U+oots zzN1{-l{LnYaX0J`eKSrdZ@`G1JZ{5Y;Qd#;hHj2g_CnZ3zMJQBD#)A-30#B|0BL&| zeg+#vAChXfRcg#U^mo(=Tuy&vo4o;Q@NYUk@M}+sZmdDdt3Bvxs~W=7{BFS@ZUGM8 z`<_#7$i43<5vIK#iiQxAOb;oQ)nU(^O#g@UsD$#K;erSh$tZ{KqicssLH&zE)bq+@3Rqv zUeJY3+=EE{uFMlAPs^|4z?iurAYONvovEnF71gW)s8kk9b8te;F}=DrBUHnFzYf~v zL8-sd_ZkI`l-CDqomL08MA8LOI+F=08u7v-8T6*b_rtqj#IXlf(6YiJXLd(fS|NN4 z7zT-W2v}1F4WoIQ(AhO~5m3qMZOIe3#7v+CEuMvNgRhp@|6+W>)Ct~$j6?gYzY)?P zjU;wRXePljeI)9bB{&``tKLP@-^H7woMQv)r747MJYo8vgdyph0gE+8-1t3adPZ?$ zfn&+orj%o7sep|pC3K?P!HPWzdaGg`pAVb_CS&2 zxsk^ynGOb(@)I21+8ZTYlK);ec{%m(siVN?$%#^dFf`A3FP~7!n(w`IyZd9i8K!JDN znj|Y;^4M>?;b>TMtziR&;AF|x-IaaaDoA8^%|td~FKwKSmec5t3YZd(_QYh$Kzw&$ zkZ^d9&}j5^7Q<;h17GHuNowP8OD% zTrmZ5G5TR_FvB77uH!v%2!YjD0CZ6d0O8WMj2>rsY4w_fRhd7X!67jeB~xZ(%@t;i znN&nssT=7|(@zOQ?rASdQFG7%xxU?R)wRKgUrfL}o8RmLez0BPOB1bz@?5|Jjen<(u zjN3ggN8h)%+ekuCHLZGEo12Rht+uuoFRuD$TUyWeKc4u;K0E6-uNTUFy*c48@U_2R zNH6GzwR~hxOGphv|Y8k$YuHq5;iMlz`$<+bH6j1f{t1=LzN`W%?iAP7B zf}vgkN?IjA*ab`r;)aV-b6|~R)e3X*C7hTOpj7=j5mC-m7(k*2NWZ_d19KpM{Uxoo2{jKjNQ}#N=X=U&lFhuXD~W)+;$rxrO-dZ&IS1O2?u_N z408AVdvARh{?4TigigkSmjrx69m24c&|yF|LwXn#r(hU6F=43XL9@Mk?4f(^Jl=Uj zgz?aw0I=!c@a+d@I|K6yP7cjpLmrhs=HCI}(=1SBQ!+3UWnwcy}TJ*VlCLr_KH3B^Og5*a|1S9~6ho4vd*OLr^$D z=~3i_GaB9cJ?_@4TXLYATUSq_1LLWLU6h(KN>)3k%-TH67MH1%Eka)?nCW-GG^IH* zRc#Rs(*(m90~C5#H;k}gg9AHcmgBSC>abPwCxAY9GbG_aB}0+i6!K&q@(u_d4?Ap%Yw zA$Rlu+&Imcxg7#QCT9weLAvyFtiFpf@dXuVh~N@t#1g#dddGA9%J|UqB4yS2VJ95f zR&f~MCO7do5=}Z);7Jdv6HyPH%nfc0ui_r)xwa$Hd}gxZrGQr{L;BO1%;8{m{<#iz zqDp0SxHwmJL?XVDcy@iNm*xR}PN^kp>~ZF>6K^U={mK2ENLqBHuR^CL|j3SM|NAaj&5hAZ1^mLoKJ_lMYf`)o={ zBgK!479x*j$&2ITeN{k8Vs^IuijhKAn4H1;KhY$y`SMHN1aqk>7gYdI$VI{>rNZlM zK8k+DQwo?uFw~DLoO5nnNl>J#NILL}3H!U@@rpW}2BC(3hjK|7Z~x zO|A84XsWCh5_RY@l9I#diKf&8w_q(_hGriZ5X~U6Kt{sM(j)Q{D}a_wtBnMTt{6Hb z-4xlQnnoG+4wJR~z`(W&Jt^Se%A}%_37_5HL8eR2I-)&uO-iVm2sl%%OmyTzLMlZk z4F!e8OXJoN?kJyut0XH~@7ciO~uoz`V`Gh5n2W8i@p??u6t68w~z>8K8<34!nR8q#sZTj@(L)^EN)-AfB{PTrmis5?0lO zmSAAYD72ee&%~?&Eh~vkT#}-nH2Sf0-TfNk2u8>&@7qU z#MT7cVjZ!#L`^wL+@&UnCYg-XA)*t>*XiUDV?!PLLyHoJIJ(}3;?)jC^TR3B0ilSa zq^BItHfG2JBLcSI&eF|t0}^H^HGtW>G?2zxA7VOGMvNb(_liaTh+G36rQes1-muJ9 zLOHG6u?%xvdYt&qg*V}WeUi~vGyaQlUs=_0VR-cM+3T*<&Paq={7{90+b6d-!eYC$6sBdV`tqD62)5)Ju z_i42YWL+&O{E>un8`g1q+$zI&)zqbV_}Lh|Jn?^)_=T)|l4;rU{(5ii9o$(&tdF77 zZ{#u49U>C8pyaiIl8-w7dkD!EpKm{o^`6iV_gr11mVeZjRHNGGK%lO(7ac@}Y#ZLh z>JU%k7ezm+9|3zCMr=5@o%rk-Dr>VJ-z#JR`p3H;m#&|5`k*%lM|Qmi$fo*XIs4A|p zg)S65Zs?4gKRAokfqlWvQfz_T51Q-~DmJ!i3&Z4?eQn=X_UlKto0ryne%YN6+2|wL z3_BTpn?UGS4JPY%MM>KGjTn`CPtYwdIFwF=4UUiCp3=$d zR=&7}Ot8ti%o9NW7sZA_U(=rw6L{*cwb{Uq-$#Q@|7+fN6t;D^Dl#EBQBd+523cx# z|E9(%B~P~*KYgf}53=Jq4`2Yd?h(Ulh+b4R{{XKJ=DA@{{>SdOj34Hcin32T;o?G{`|IzW z@0|m@-1P|aC$|^3JMX(K7m){5`D^?`HTNb;I`zQ05hh5skx#DoA)S(T;?9q?yI(S6 z2kK#OpSl7+&_dbsvrStiZI-9YwYbBHUt8!eb&)Q1Kc?*>^>t5c85w=d-QJ$2&zF;| zwwvws4gB8ckC+@QuZgpYbDfPI#;1icBGHAEoqrPKL7bO9KpguujIY_p_wLgcd|w{$ zBkdRFf4T+y>tFx+|D(A7`u=~ViMy+bo7*Ttx>h8rI6H_|I>8#kBTx!}36e+v5Ju!3 zFu2Daf-#kVDHM5K=tm9io^nHheh%K-;e02+EessIcNU)_ z1NUPgAP?{3J|GV#)%4*r%&#Mk81s?cZ{`j6_VwpBckXM&sqd?9)CaYxd)atzk!A0i z*9V{G%`@}17`{7q%x~{k_gNwE7m9QpgPBss<@fyQFMJ$77nk;D!+ST&QBaaNJ|9m= zp!HXKl4gwe*U-^`3dF^#|!ma&b`$ zV^1t)G!SLfLR)%|c3;tL@}CalhWD)XmhiNkULJb2` zPkm=-?YuXb|pLTkm-_P+B;2E)XN6hMcf+<1$er`2ktpvDwCB4 zPdqEoR+rj|bL)bGjrASO65W7k-Lr;9_=DAUGCu`MSd8UZNqHitCm1{{a668vnE^^G zwLpCct|=s_@_BY0Imn*u%nN$WZ=&|0G|Eyf8o-Zx4&87Y(bl8sR&YpZ#U(5L6t~T0 zW_7W4Xk$>Ha}5)Rn-7fg-E_tpAa5Edo5~c|$h|XP+(*KJpK}OCZN&qag3g`(lS(rG z1lNrH!D0J}M5ASigq@uwI}bUGL|-d%vEwcicFQc{E8@}r9K1a^25;MB(tj(ClLxq|`2m?Dq?q#T$sAzTQh9SH@uA|V5m0JE zhHyq1VMWD*OO!vK9r#u`vZ=kt=cPhZG-yKdOwGbwJs^O9h_Tcmq9r#JC%*+{ja1CK z0GP&{21COnWvb9v2oQIWQ`1s1bVoH{;@wseG_YL~8`r=5t{38&fUrAx$5b=E zm-ww@wapMP7M;8t%x{Op@Hj&`Z+98t8#k0o0XfA`Y|{(MpWXT6XyWPv#@VpYkAVc%dE&FG#?% z?st#zAwYp#+FE7ll5(JBxI6~@gP{YY9#uNBj;n;DXmu!tn3bQOQWO<<$~TIyeKD$=FS+eZhe11$YV zga*2T;nPCMN0*U6Vql30djW&h1JmHcck7S!0PFE^TvzOCsm>8rsSSC1UvM_qCP91y zTu~Mckq6n;GxE~ByC_dNcgXa?yxe5knKB8ZK(5+-B}GA?looUp=@6lMvi(-hh z_vx)W#i0HWF?x@I6oe2UH0qb?&AqyZojDh63VL9A3NR>WXplT+Vr$EY&wXFXAw&$ zkG&#!NR7;Q6zS_UT$E`J9KU9$TAB+Y@l;PsHwmUD}ow5=un9nh7=#H zLb}`LVH=>eA?^@EXV!dyBl#l0gwOJ9v(@%w!=3-8w|5@ep`W6072ky|f$G_dRfk`k z$& z+Bhi0OY{zLDis z6(Wu=xS(v|E%XN*JS(y&Y=mtA47owBW}HZeE+Q~=(mr$m^YKEIH=k+B6#593ILaM^ zx#0*4fCh@y+|f%FLSCV;=_mVp)S-&;$CwXVWDYTi(3A%oh^t0mxF2MxiL%RzPDo&b z5~D;+kOP}kz@UbZSdrvC#Z(zZ2>sdlFkT0oZ$Sh5gH%WHR6GZDpMb;_04|d{3p;Pw4y#?L$X+NiPYsC(HvN#=iCn#19 zYykLZbDrMO{PmHL#$|iu3A7KnN?XSqqokF#Mh`&qLvM4nUV@T`2e0`e+(ao`5BTzE zJB_-$9`2YZwZ#s=Lbgt(1Mh8rjo0iWH&)PM(kVw+kNYQ1RN@N{!cYzgA}AD>9JfXs z$Lly%$3k`&5@IH`N(XR|mt;uC$pXzOh22r+@@&FeBirSgb1q{A1%VgroJ*PX?rvBx z{6t6#)DWz=77A2U-)~+CfEyPVpzZtM2@kl_r@?8YD>3npQ>vv$Z>yp-V8G2?CbAql#7e3B9d;{O-?}l(yxT@+_MMm%nvtp*{Uvh# zYq}24EA!Y*r>~ggT`KrPyqcK%lNPk&DI9FVGs9|`j^~#zdQR_sg#FvsR5E}U%&+)epM-86)c^-%Z}F%STQYsu>{{O6$Kn0G zRviA1rH|yF&1L;|gH-rc`CJ@azlVXMF+V;|E^WW3tfZni`Kh`x)1Un}V_HV}8I&wM z9KW|a6u*TZeJ^!8kpFZn{MWz!^{;>ZU#|WC=>Ph5sB4J*XZ2lfw>wu?x_9_=H9?GW zS6~o~Hi`qI60~dO5+ac(AAr@zky`D5BetT2d?J&|y+XMkxoO`15~ANA-xR)omF3J% zzp|WM>DvK8ML{>bt}{4)PuZEzvPVz_Ku5kW_DaDqkLCH@z02jl%Yp~+%Rb?My`O$| zkpVzGpJ$B=#oyA;IX{=*MbzD#?Fy&3J2U=XzDLZuKHC>Y>GGzZ57g3;dAg{dxw*7d zdAUhu?a>ze9u&>pD4zl7pR;nT+FAGvcvlZd=8k!uh~T3W^3Z?zJIHZt{x#IQuGHh0 zl@$NJ7xP?j|2-0@voxvuQ=UY7eN5c*wYeMpyg2V0UGUH0-;H@e8tT3)!2j$=jpg<< z=O7NgedJVrbBl}jeK9fSC9b>^)R#8@IW%w-hlhLk181UnXN8{^S%Yj}hm> zR%QoSLEXcqt*fS5Js0Ggm3dYyW^>TY=}zkAD;Xn3tODGMgk|j}#u}q%>{1~xG8xU4 zLmZ`=!lDv+#!PaeWxje|$dp-CJA&3`e<*trLSp|dvRXaQzU*#0%QpAaSZRedj%~7T zSt0$#CX2NOfEOXU-Df8(3X-diE?J6w}WMa}}8t%iV8N+4^3W zBF+e0&%`*;s+XR?KI<$n=svsB(HPnbGHArLBdpKIUwaGJnk&=vXzJY&Q&M27>7g*sBUxi{>d zJJLBiS+%%`HCq)atFb#xQ=PG$aBNvNK{NT}ypiRA$w%v=S294GP8245sXCWE0Zyuf zWy1n+kv8f8H!AOL{0q+&@J_?i0+!|5xg`CNizO(HCP4V5&-6D;rx0{gZ+uDPY!tEy z4F~OKyOYmAk&KdJ^$(F?tVJ*(W@9v^)7r6nJu1}%;f!Q4v_cMKs-ovp`89`FAmbgh z<*2rff&pQfr|4t+p(qu6R0F=GuV%|mZkFz>OM^{z;)d*BOXKS9wY?Na)Z?beEfZG> znIeL*qw#YZ92!ft_#|_C#7zsY939XBkNHrNaiO3>T7J z@v%oBrCTEa7M1Oa`Y5=d+^9;{d_1g%z4XUnFR|V5P@28t3=#M8p)1ETL--t{*O{$* zBLGc>By2_A)F0f@OC3m?ku1W)-FmaseU05=wvt~(-a@5o@ZHF!{WjV*tqc)=E9N8^ zHrUSBKUA#6^N;77PB%P8`@uPb!HsTxoOlI_Q*(XZfZ5y0SenOdMJwAZfa50AOT^0? zLG|HsN~XolCD$);C??hr zojgzbCpG%P3=|IFRMu>d=goB;{f&Vs8E-XedbG@&RG{Z9vJeQ}7(ur`6!%`=$vw;e zl1-`DtEN=qc7w=(*n#a+(=`aRj=ZyKtZk$q!Z@dC*j7p)aEgYDQP!Ee+O;r`n1gp4 zkxq5U&x8bvx74yeH4-kkN zJPwyFHwdH!qDqjS%xkzuaasu@4;C48Gy`JS0iZ?n^>RoEC>IeG;h~NQhL>W?BOqNd zEi2Ud>u7N49UQf1y6XRo00LoE5$rU8C@sm+`dheP0n2*(%t7mpEL`m;yeaAG=TFYybJ1@ z9hSW!IX$IELTcq=`AXG9|0r9%X0SEC^Mux!w1+PBl~J^(@OO@xc}Y!&AA6A&q7NKj z8(Qw>L}3FI)52l(b~mxk@wWASykU4PcDncVlA+_0DwaP(UF-;IH862S4r3j2c78Aa zV&kisl)3+D7|hiX%@QxI@t=c28*@Aoo!bP4jq4P$9!iUoQiimSH3RC!RqHXfWpOqq zpNE+mbi&yDWfL(2bQLhEr<=$M6NXtqzkc>y4fyu;0R&MiGtJbj(An8)F8;{k1a7YZ zw(Osghlz4sn$nT|HNe{S?wO^RVK0CC1^&)E{laTr^s8 zY+E3pWmSWHdv(JomKmdp$zgp*=lKNlyJd0Q@rKktu-o&Ei8I@Sd4g5hzDZw8yK4?h zdLL6K^RAk=L|qp0fvPd*^O04S8eZS*q7~EnXRo z-MFxCFc0Ci4T>R`(EXmf@ihgM{`CD0xghOpH30bDk&k_ednpTZ4yGi``-^+67~plC z^!fV(^Z}jxJ?58z_mG!-+^`E%3qlPv^&f{p(-<`q%$ArNjO2{;xd~hckj&w|R4sdz10< zwAp3qY7=B50R#agf^!FsFU50JEkaVvk=+xR(lj`L)&&?QlHdfi=M9qQ4cq&M!<~3L zkob%2EkaQ8(0keB^%WpUqEx+elUb|Zr~bTKx9g?aRGU({vOhBe&pu~L)pxhrVbgTy zQcJ!{7{OI?!UVK{S4F56=YMm}ROqe3oAdcCoU^=x9Fqlk=e+=SeeLAfS# zP}hXXmrcl&HBg33E;lU`o3mbM3fD6a0?CZ#c&I)fVwY<9w)Oh+L>4Pq5p^nQ@`CNe z(Yed|iFcRU>jlB}b?xAyKs{2EhOQD0>qX z-K|o2<)Hc_pj874U%q5_R(r?5l|6r)v16cW&Ky8Imltul^0-4W8WxYV>YdP-nan9!P5?x=XWA2Gt zx@!&Xb6KDwZnw2l9{m{M{mBrLI6dT~t7W<&%3qUJHcCryJW8&hqJ_tcuO1r%2!vP8G*g3-=cG(9 ziK)xwqj&{`3o34PMqXe)>djekE3Cw?9r^@}$StAgb^QjAlaM@Kyr2)<(kFANe|Ll4`^R04!%Z7qao0AO@>jmsW`8+&Zi zoDkU^Z==EmJy>Zol}mDcm}k|69zcvUDits*BAFcr?Y+a+l^u zRKH(zr3->lIF&~j)MlMFm}5NAdEwf5J|ZqljVy~MaTGH$h71%sUXYH!(mZ&3sfR08OO;4C#qRM3dLO=Eq|QoNCTLCKk`8H1d`AYVjRe%m6Ttc;#C z)Zn?$i~4>GMQi`3u?rDEKZd9@Z(;T-v46o1f_uCG#Z*SN6?h}fX399AA&{!tLT2gT z{u?qRL&CsyL@w+Y;2H)(jkGOy!%CQRz6Qo!(hxj7jH!Z%+@l}F3chnn(~O}_wegH7 zL$-!*(8--ofbaF43wHXE4u40^40ub_v48gb!;fivZ2^H}wgdx8A>o;6cRjI2Z8ypB zC?Y<6^V#Gv12qT9$hD<%v_mpJxAOs^{w2nLvl$WD%O4Q@_W?s;C&*K6kSRn=B7QmAd2N~X^ z3146#Ru2CF!Y&mKv79?AUFfjsDK3MdapP$kqFp`~tW^nxPPoDIpwya;?tFO+3__AM z@an{QWKy}%^!C#b;w`kXXx!F}MySFN|l-hw;K}1j=*^s!2cd3o;Z; zhVeo~@9CQ3=&NXqYf~y|;^_X`><@@_63Yd*Fl-a-U;gXqym@a=}z?_vQ z!LTBhlbJq|bkns1LR(N+QtFg8^>9*lW5o{9?uae%J|tvHNFK12wMAOPGc(&PV$A@3 z0Jy`_I#OW?;0e-l?BhLYSTih|SypY3Ljq$+Sc9Tt%WL7+jK{ zvn36N$0}-i;~3#%jMPY^UGHToM!7T`h;&i5JepWziPwLX(#2_;6z-t8APpt3=HqyI zt&i!*mi2Z_aM3DpU_u)Sm>Ou5N5&ZTAx0o8OGyJkZW4v@L>-B28<2T`nUHiwB`Xhv zWO%j((G8akRhNP_#)p`oWpdn=|+Mv^S$1@hsj#-v?L{n zbYw#0C@P6V9u;ENI9&me8OIQZ#Ia(PC8(T5(ocXOp7@1dV5fIUmMYRfuo>?NoBx)hcKw?{(6OJfbYD@x(rWBz2;=zYF&GC<2A(Lm)HN9(#mEZFEgNXi_u42^%7d&~Ir+qs2FAlE6D*ibKv6qz&f_*Tstgd)E=lY`$*iLygSY zhl8U50dmo5NF1Q{@Ettn4-?eVAGZq%6(FT=5~K0ymeS?qr#f#Dq@Znlb6p`FjyYzM zNYA%wawdk5+e$GPYFP+C2P!X=r%m+7-_0O#_lGc21?qIC091R_gI8 zNX(?zmSjBe#d|a;Fl*Xqu`QGz3Y^5(6*cu7;>QTZPFNkK44{aCDees@Fus}}!D3ODO?SUZWfuwb#8)}rCxVJoW(n%enVJk@w>VsgfxGNkQ$~%{X zCdM;UnlMn15ZF*AEww0Y1Xi~rf}_6T{*jE$AaiaAL3$`Ci(4`E4n>;=d{rrTtge}= zD1^iqD*(J6)lXhTdizj2`mg{< z`E3s+zYb=YyEEa>64Ags0p*&g^Z0q4VyeDaAQ|iYM=$hVDJdDuMr#WTosmy^`M75j ziR=WIUSl8~<7jTcgd}j%2D1_6_GG-PxlvN_ZU!ALj{hr+^MUS>=|L!%DY>&Ugbk zT>22lYW3=^2UqNfH?nevDuMR&S#qv%q{LE<>`gz>cNRHGOoV%c>F=C}lr4GN+VTumDn~DFMAJi$UhiH`{*}HPa>vXNj$p*C z-Ek-4lLp_@#Lz1%l$Y=h=9ICK=9ntQ0#dZ`HYPZeUW-U}dS68qPs#p{*Uo;8_L{;Q z2G7L>j?TdzrnzpfLO*s}tuEDp>)9!)lD%v#$t6}Mqh)k?fYA?G3YX&9$R-pCUdY_# zBxw98Dhy%U!qgg-`2n^AvT<2Wg4I3O?euZtc{kjmg?YZ*E@F%>uMd^D1+;andRO?t zgZdlB1zzKkIm{bf9H4ejkN|QSbGNX{NGeuTGUVoNMXa4%-x(xa{(gYY_c0#uJuNAh zh1z(%k@N56Slm(Eo0EvDC5M-vnU$H96Sk9E#RD=nH}>lU`0osVNM|R2ob7=6++bbk zUI@OQO5D$5%V1ypF4t?=jLiqW`5xUdnYO}I85{qbfzj1>+icG7(MC+pjN96*ZT1G; zuWrSCMNLyyfgQE#L6NfdZFgHt$(|p;NiEauf4U$4-;Vj8{;v`AKmY&xANT)jcQbZ2 z)@a0=%@c?yrBd}FfwUWZ=A%$1c1(!+!9X-#7#WOgPzEDOG@9{312{S)I^HSXkE@QO zW(#pS1mFNgfIk4q^7#$4#z+K~E5!RuP1O^TK|%u{rZzHaGb=AYDl4nJRzS>!o}ULs z1~MQHr^sh@=TrK~=ig2YuAl7I_B43m^9@Wy#lQ9HwyqZ1YG1r|ZoKQlgn4n13%cs_ zi}cj-QsZcy9m=xvRQqMDM-3IXW19xyMBy{v`|f_nh6Yfp@UKS;2SX1}(g` zF0JqJE4gV7zb>9F=hkYW{@h%zMS^+Dw-ljr^`z~PT;1F_?`Z-Q431U#R0}<_Lg%q$ zck+`8%eVuL{QfiR-Y*r1e9&$DE?5hAb(aZHdGm9*fY07^i)IH^soU2B)4oDwd}P^? zAj|inOXgkRXlJ8E(cTj9PWHE3hI?LypZ9D9mCGNmzGmTxobygUyOwX4Sz*WDoa^nM zHQOjI{8|^^*VnNWKKZYUEGHlS&KY%ulUs!r_}l0qZBd!{5Wna2*;lJ-mZz35^_eH0 ze%xoff!aBvvfQ7v!h~MeF6D=HZ0uWP&V3u3jRbafk2^5li`!^3%y$k)dX~2If3y~^ zm>DDl`e}@Kr-KjHcI=V&XGg`NU^4*?`@%GPkbWWN7|r znOQe4htKnD9o&$vt8wgNwMi7LZG1Rxp06Ms`zd1myTN=&U zzQNeA!7te#i4E=OcY&=IOQ%`xo>qpu(VCqdDsWG|*jO7h$~diB`&Rk={WWEIal-$@ zALeU0Ht+58Jouq~CSOwv?+nW)mEY=py4`iF+kXR>DAJ~qYVuUZj4Dbc3%`HWS?Qd7 zDRF_ZdELqvoE>4yM6LG}Jm~-^BZstQh|~@~axQ{lNkPBD$jHG3B^t`56d!f$@e-T) z6o^!k&TL3Jj^$`-39=_wIL1Mp9W~CSbQqyhnx|xB)ES_YV2^u(=}N=9bTsI1hv<<@ zgYUEqV`d>kt57dN&7ZqKQx%!|+hO3IC~oRR^k=cHXgu>=m&Z654|Nu@IaX|Z*W zAc_=VG689y3&qVDXQw!l7&##v_G@y$jzshrZ7lNw(~%R*|4~v^(ZDm5_x%mRKrC88 z81YQz7FvO?@?pOh>Ck3^=C!^=!&?>E>Uc?bL6lXt7-(}IQN^tir~IuNva}t-?7V$^ zXm}c2uc(kKntOV!L7=hN6;TP7TP?s3#f}0E8lEqe+W)}NKf>;hyRFkasP$Y0g33c# z#+9!~z#WV^xDx~3q{*@E%0)gi=EfjLX5bKON|Fmj*kQNu2}kcIenlV^fInz~7*#q%Qk0`?!IyFKI2R_EHKzmak|q|M zpp;nkr69x*l>7GORihk#IO(GO)6Jr8-s02zr3{dvP&p5~D=Se14gA*WO0Lruh6srb zLx`fopmo^fLGyKRTM!k@t)-^Co_|y zKIH)V?C+G)r$8;0xTb?*x{X!ZUlg5!Evz6rMw3UQIN++f8&`jtn~gJj?^1+@uti}G zoEDkEmLgyx_6w}EIfO89N4G&7$Zw+r{aMrg1a}I4s|Xx_NbxbHq~7N?LLVSn zpwqan3RuVx0j4tn>4(;bJ)SeUxN-DpRFfXUAZGby9PUQH;*!y5fsIjA)?Wxdl7)xi z9I=5Hn!}VF-q9c<6Aiw#!y1qvmkSB)q#6rlRl3O{F}O!i)KOu=j50*z(tGF=r5*UJ zwiCt0kTP>X?vqIAz~rA?DzsAV>rhBH9SB6(65S(hU^2`J0=s7hHu`(E!)1z8rAp#i zY5h@TBIeZuOS1Bea@azpm>n3gb0gs`*Q_}=+F$+PYMM?*%XXy#+02H8UelbTih9w( zYXL${z&-;FSr$zsRBq;vS1DRG$#!#Vju!iZV}mdnS76_5S%(I8ox@NPmExiTI;Vx+ zZTbtWzpK3Q!fm{Twniec0Q7OKxL(wR@!_B}Xp<2vi4!6n&5`j2a*5tR7zibQm@h!# zfIE{Z;u4_;C2%rhIf)?gsF_hDkg6|lhqU}CXWJS||B=Yy}ZR}hLR)!E(S zWPG%x7yu);FOE6~%~dNa@9Ed<8%~+~IARh)GVbaTMqw$g4#lJYSp{X*0*tir1_Jkt z9s}vRBSHo*l48_9`xhw0_hdG`OEEhW2GZTeHJ!GCs}*I42ITVBe5H0BIWt_49po!2 z7|GBi*@=V>v9?j{12YI6%SzJKCy7XbT@1U`)Rvaih=a(H(^|$mR+Cr789{)%ZamjJ zy|!N<FqreLe;HuAv=A4T5ZbYupDjMo9T~^QiG(oIlEz;n z-jGZ@5`=m}trAfdiZaw4BBl^MX9PEwzQ2*TIzwpK85@`|=m~U=LR!n7ge&Ozv(BOv z5BimSB|pe+vH-C%Vk$brOwv6CqH+D!VxD&!v-tF>fb9CncszUJqV@25CRPE?bKdxU z39u0y{=p+GnH!%9W}U`_WX56pP{y^H1c^yX>e7fgt=aiyAXUnT%^=fgdpRKD`45P8 z(&3^|nbCm~qIwGAdQnD#y(q_yA>w>-K00~YpL|V`$hf@i&qqSBh6^g|sXhBdv`K64 zR#UF`P)AX66bREeLTy09kvE9JpnQ0@YQgaRV&MAi(N&S~+8~s8l@OW4oeJoQP<^XA)aB* zS%ed@-qgEW*n-{oHeB~yhnMHTNP8j*ZM+j=u~mR41u|LkKx%44EUAd;?5-*I?bru>P%udZLf3v<5^@V)mk`U?v@7Vor=0eX9ek>bfX zUt_Vbh0}myjgPg{%W-k1I=;k%t9?tylmLSSN2j6`Obp<6FyAYL zXhF$kg}ifE;wK3Loru4Y;YcQ@v*BhwLw{-YCkl!|9HrLn6OUWU3%R_{B96fazKFlS zfUy*A^K|vK^|5vGTZjYN+d6wQrMG@}%urvKALHKx!VZ9a(FV`n(q_4 z)C>-f_rG7&*Jg7$+ZO{P#=a0v3I^bt(g`*j_37q6=dp>tTHzj_s1Nzb1{?paNQ8@a2dnW^z9?3Oan1oyk&Ilu8fv(Hk ztv+$Q)iIVxbdrDH%5iF-Ok)njzh|HlX+&RFb8k81SG2H`2cy@^=t=B16+y{-Wnp9_B;@`5 zy`)60tVsH;{)kRBJ8*0poTHmuJz&2xv&Hw1A|LyXm~{QbG`-MU{UiA^NM!nt#g{aUeE5sRnPnE;^HEZ`xPxc{gAR* z1$M-wyqd2MCOYY`-7{fB3A{OPn%@$AjA~3DE)pg__<>)S=C&Wku73FI-HYAJb?8;D z)_X+GppQ|1ZSHd>{`7~l;LS$LnW&d>dk6pNPx89$+t8PnYrc#3oZQmPECrtCa2|Ye zw+7iLp&<`BwbhHd+&BYh7RI@Ic??5~r+(8LkD{R4u~u&83!_8!jn)9Uk&dH&Sl zw?s0!`dVF$^&qE+NP=49M)k_2P^;EVX>NQcU9zoINpW^YdiwlXKgFV`X4OjYybUEu zG;%(86WI3hbhKI7aS0dZtkhGXvaP_3uUxTMs|-kw`e?)MjM1!D0U^`oaDGmr;CSJ1 zxF-_Ye4^6j9~i@a?%+1DP8dFC=wbt4t(r!*gx#Q}71CUmH${#Vh#(6SYl6_-5UOk_ ztt9k_|HjTeHFp-afu4?S+qT`Yopfy5wr$(CZT@51NyoN3$-FbOtM;D5shX;HrlzkC zunyMAbN}jD_X>L+`Auu9DikcuWUDcQmZ`}1AmWh;{irj^RVRvCOGG+DAuCuJ#4m$t zM{xnMA+ac5X|TFXG_tNurxaHJg2p^8mz@D)A+Z9klA2+uAsp;nIM|sW`?W|O5N^3` z>oh1k&@5a9zcvOf6K|Cc?i>RPd;^uvr0Dfg<&v4SIyb-qRScbpwT?bOqRn9{Jv}cQ zhh9{aW0;76O8G8PNeb5otsd3eIWoUQ&4NB-37CT3?+(=xaArzs27YFPo)XG1YfcT> zFowgsca?^b;X<)Kx09qCRZ96*lcvq4Xim!vN0)%A&j(Ee0yWeU7A750Q1{YEZS9h1 zgyDAiIwD#zN|6ps*@T;`It46AAB|PmkH<6(u9!(qw%}M<>&QYi)oE5uL}{nC8r3n` z4n>L*XO6lsW$fe>X2Lcc2fE8HBAtyTpao)4ESF?zwo$>b3FyU_B3XrKOXv0wN~>V- z2GUQmIZ++jlq*=VhARFV-EwQW32`H2Nj=#y(~n+kOJW9!AnU&;-u(nB|7 z4Y=Ockum1g)^CvuMev(Wh;5l1nlDr}pV_C4+mp|uLU}zgPGKR8!13Eu@r&Q}AW8T` zH7n9(pQ1YnIwod|nzdx?^MaR9YU3iJOpl!-xp6FilPoi-XuGS9n&OoT4!Ltyow$2VCI(6aUb}w`P zvpW=0_F;?No>N?A3=T>n!wwifdV7WY(6iy<1wgB}sK~s48zYTLLC=*Hj(IuJ^F2EK zv2Jb=PiZ)5$rGWCFXOm~K!p|~k5`i%5`-=gmX>sGpoA4^P_zBA5x=r3ycb^?w^kuWD$$b||a75`S?gqD7(g-rcKfze- z=WoQPcfXWV=1x-s#lf4&pajB1C*&KpJdg4w>npzaJ9~HQSyLMCam2D5Q3RX=o721; z4qHVOF1wy|WJX35#3R}-hG@LJBp{5Ch+qK`x1waYfA`Ybr4pk4vwNU0lz|N7DFpx2 z2^q8nrEBw}rQw@gf?UL>65xP6DacHl`UyP*N+3i)N;7r6!A-ui>NqG!7+_1d^$|l< zK3`l#HtgAJ*2eEqDvxGIhY6>cYBszQCd3ZwWwR1t%U)f^vMyFIYeJnllHV5t(OA|g zBLej&Tmpp;zJzOdv(os!K$X{!#MX7Q#gIy2Nt~gphhd7XtF18xd5~Z&K+B2!hCufw zuSBi~rQilSa7ju=EChGSy_EG;1BAoCx4=&38+pj4G7gC@0ca^Y4Yr86){+^XiV>Qp zjGKF(?*6L^-Kq&rw%o;sE1YY;%hs>!P&0=gzOZrc%FqY;4m9GJAbZ}V!XJyDU`+Bm zPCYpm;>sj2h3Q8=C~In8efpkyfF^|k2=#@sww5{r28NP4_7%deLVH0*9p_eu+a8-e zMO!x1GQFTmq}8B^qN~laRLYxpI-0uIQXuD+Yr=ue#eZZwn?M>(8U^De*<^DpH#2h} z!qwg;3eH!U<9!+R{jzYo?cI8T2bG^7K&_WiY>G~(ZEdu80utmexg!sz#sTO}Flfi( z+-9TD98O0Ua5RtmHAJ5|l%XvX^DGzcIIxg8ADO!u-}s~pZSch|+=HgnFU%9s04CN8 z39Of5lx#tx__<_$n~n(Iyg|BBfQ^x`z0);YPp9(td3J%lrzw)4jX`Dtn4%Mkl%R{- zUuAK{Kk60-^lKpSn-n^-jEF&cQf}Eh%UzEP$AG-(PULyoE0a2v(#E~~8=eIxhr`QAO5P@bK^3O_#bjMVx2H^EmbbC0Ip2>_mv1;E0gxr50S z!IFi;V;^oet3!*$MSmn%;qrR35$$Q*l5AMA>|AsR-6fen+it5UrB>Dghbn`?>Rr_A zd*XBg7S1>Z!l;m04V#ESNheq_RS+}6*t&k^ z2SudOT?gX=Q`HLE%WP97HFy8_RsFrb`{vMh&-Ka^_3yWn_&t6BZ6qth4q^orvG>^L z1qa_)S%I&wTfMKj{Jp<#OYvK!{XYkojQW2o9?RoT)V^Ww_p}I~7wW*=LTCHG@3CzJ z$e9-|>+9UYvx~nsTY)8EihB6Y>f`JpDuXKM_I9y!@pthCpp>o=K8kT)D%+TFp6hGx zicw-`KQ_ICW99DRNov{H7L3{jE{s2Y4g&f}PYMhWmh>tA&O`0jQ+^Fd&qj3)bHn_F z=0d}4s>?rjmY6R5?ft&ld`s)shxE4RA9l$Jnf>&WKnXKyq%;QZT{#@tTTuoBihW<}VNzIs4yEjeq|6=l^9w{+Ip#J$rl! z^fB|MZui@po##5;y)>S_w%=6J(pun~l2A&h#DW@N)G&dkTGy%#MmW_RNHi+!D13Km zlms6s?fiF(5(J7r!QZf7n3J$5hzSROGd6y)Hm^BKZi7XRcdxnknVZe#&E>o|I##Mw zHdR0FO~0b1?smF;&gZlkuh80QjbDcx@}olY{{E}n9EDG;a93C|`r-#@sHBbaS5`m2}^m zens$kJ|OTJQ4!#Oo{JtmeGtAJ_Kycs;s#J=M3m>lm*2hjf7>q&+?@Na|DrD4R7q8L zM~wILyPLgP*p6Agb!Pwg{=ROv#~;#@KK8WJ3sNve(OqlBz9f^1Dq>O>3~B<r0H%gp34Fwbg+J}MB1!y9DR?tB<@$QS-=&U<6AE4{U88HTVZ^Zk+yy?M4 zcir{lITns9{vEpOK65g`5c|0i<`GHMClnmkg;bg&MmcrC^6+pWB?TUA<)@4uhCggy zfCb3|9nZzzS8|yD^f?48T>ZRRsE+n?kT66>(a`$CtWc~AzzrcrBE1F~dEEdKOowI1 zsR`Ue0cR_4-C}4PU|zE#fC44z8>OZy>NnPlWbM;U#vik0vdj?~8(c0IvJxbGFl65eIm~uY@KOXMqVU~7YzjLch$Cy% zB(dp?4;07Hfo4}(QH{7_Ur@0=mgS1wqK{+0<0SdNpo3ofYU*`k+5?bkb>aWYgF>4kV)_Jr+6 zpAC1W2jBWUT+&G7;JtWS!$)XvGvq`K$DyGV_Jmaesz$04%X;`-3BuhhIG4~y;4w}- zPbdB#pD30umWs&Bb;r?-Ty>ANTLh%5W79qIBw-Yt4r&qD8KWPulDlRED1v!OmkP;I zDHsJtG@B*Pol+(^&h;t5fGQ{+W>kZRWP#ImZ~9N3NS1VLOB-i%@}C%sP^Lkd_D(Z%G*NT~-mMWypm{WH@L zvuBv|YUaY$R_?}&O7RVYr(wcS-3u+OwV)LI$|CopR>n$adwh;Ix9ag!cinZ9jKf%V zrbdO-Uk6E5cUZPl{yTX-43-))a}?RUrysg)8Fe=iGcSCfAAb||Y}K0eGDH;-E-w|; zLd9Y5kgsE9{ddNG>D%%2JCN;pQH<|{gAoeBPb3?Td;RQ)vSJsex%+}H&rrBHs+Ca< zy)1-j(fy#HB|W1jEJhshZmyMAtD-Z44x)zDR1@ZWvFsop0Bw8Va3othM3MaYNLpD)h<-u$nz)^bR6vFj zG2YrNj!2}+gH0?6E-Gr#YGl9jANu1k-E!f=GT*v@c420FB!2nGU0Ml=kmZ=>bpc1N z=u=PT*FQ7#OO}JnZjFd)Vxrj#!|EasU>+@!W9BW=4PiD~i>k-v=U|!lidLZ(hurs( zL-inMGSQNU6j0I@FmR)IN&Qph2HswN#047#L8h2433{a9ms(35ockd9HD0G{=rXYs zNE^tfbTcKYum0$PlgwEotlw2YR>uY$b~Y4nD!W$@F!@WohPCCZZ;Z}*EhCE|k8ID! z&ah~^9g9&RjxQHE@vy{Kj@Y1@go;j^ntBe1cFRBhc_)ZWO5|Us=CAF>lr`^=>?~Us z6guwvPGp1?`Wc)nso4(QZjg5NU(j}tg!i`EsU}^u0Eez_ee9G&`T#)Hi;hVtaz8SQ9qi_vXnre)%^=fs4OR`a4r*zCS$C zw*}nL+gCyeG6`CPa9+h?ucCQ6AX~Zf?5h;`!*R89B5!oQp;vl-GHaV_)Am0|y6}k0 zlPs4|zf``y&Jo9#K0Wo(t^N+X$G^nAoP=|spVE8{-YndR0RAd02f{4?k6h7rh#o+y zIM_;du+Z65%Q!q2(e4CQhhFAEoYc~v$(fp(^Oy_@^oQbYl#$Jt&S_)}rfw=w@)y`c z>zH4eQ&d}a=oQYDBRovKzsC&;z;1MZRlgH|#a?qw%m^g0T6r0N?|OH8-|BVy-d%p} z6u*e*kgnB589$X zBMs!89-#TXTG!x4zV$V_nYwC+&;JAZ;A)Ne-yR$P`RAX1{`vnnNvQwJ|Nq610=k!) zd3n2ed5yg}{m8LIN%9~gxEz9@fQOV5ije#QQfq?HlSLba0=NbQ_D61y#(@`?tIa=J z-4YW15J_aO$g0aJxcjQEtn?Dlva1DaPu-?Vh@%T^`}x=~erZ-+L?0gn+spUyc@(9n zt@`OyEvO^<_k_kue;L(Rz54x3-Dr9rhwAC5o*JTIV*cc9*`FGqVGes{hCA~c{h+%t zXQW#)oerilLNt3Z`RBwV`EUGOYgU~21zE{cub^4^T<*UeT~fXx%BQ(i_%W>9B^Qsq z5)g>kmQOCux>!SQBB1$Uvir2xvTw?kyJ>7>7cFigrv#POU2Y$qx zQ>;=8jZt3*Y!9&exYv7fF1Zc&)7l2_)C~_@bCGH+F*$3Kqhz3FfPi5;l7p^1S*iVY z{9(%72)}D-1V7&Zu?_5%vxov++Y+2JdomE?0lm=KsLTseBhJ+=qYNjhmNL^ptQThO z>ldU=TUIAw{ZC78uDLQ|7nW3sDkl%ZBUB&<{U(%!ZZ9%aSsGYc=OpED_o7E^6asN> z)Ul_SgTJzaX&w>hol@LAt~@JSU~`Sei3H(W9(ao>D$J^|f1r9YEDlkgALfa3J3Chi zjIMW#HxN;B7k>GmvI z>`T25Y%i?WqOkl}A2lTUq_@4h&AaQ^3gWkdr8 z45O-v>^^abP|*>W5v&pn7d|3$x*THIU+YO@)ikUZMg6pLNFAYWMh1@5C#c}c0<+KK zxHM@nNPfpC#)ZU<@iN$E#R*WzLVcjIH99Myw%C69qO=4R?xT_9gf7}S5ma!))`$Y@ zz#B{dwV5McK{CHnnRJlqtO4bYGVVlp$8zfmIMO0qHU`EYW>`oM1Cxb5lM>!~2a7XV zlE8qKJpvtfqJ42bc1mOuQf{d)b_a?6iSc2+dbi(0S(t zsV8QDI=7xsCFWRD?*ylHBbpcK?S`k9p*G6j9gg~`@v?w*Mcncx?R4J}G}+}~?V=|( zFVX^lP6O8#y2Et|rEmbx_8P(|hr&Z&;RNlQJ_0_ar*H+=^TsA|V}Z`M_Z}e{M>gW|;!PsNk#@8H+M;dj}xvZEO zFs5i?D4eNNaII^Qg=9zFu!Z2*qF^*YPlirtub8UPafa%riy=F1RIswSR|;MfdCS)E z>4=bMr*qeN6?dYw85WBz8im=qgxvY}J|~vVnc5SDkBLUqT#bgSL!4s}x*Q>}l6I6}twG%WPf8rUN2mK_z(#~Re7%Y`amg$#m zSP(Pa@3py+N$$7lHXwudo+R#cOK4a=#UQ4GI$@w&9o_U9BC4?=n!fsbZ0Gs z$U?%In{uXux*XRc->#@CkOw}I2~x$&wYy4^IW<+orF^F{8Js?F2k}>8>}%AxW@eh( z;;v~{4?)p3IU)VJ%I(ZF}*Iv4M);h!cQgX@{bEGBM&(l9h+T8_mnYQ;Qq^9odt%0$P&ES$kmbn zxE#OKFGsk>cTXkq%cTR8hIOkZr^`$~g|RSmS`l>oqjcMy+k0{DEpsso6D{}6G&B+} z^t4M4o;(WocF}TSxzp3hRMV$uNfniN_H_OlR>fMpM=*^122E{l87AT#Rv}Z-Amdo; zH@LxEpj|ultxOsIF7W9MS}W^bB3zI}4h?@wq71Ln4=#n6OJIQm#mMC#UzQP$PQjE% z%bCOzImc-KY8IbaOo=(gh?sTNa;A zWbakX6D)*C!wAJqYC`TPHC-RQBgl>l=CAe5uj_4C!llf7ebuEszToWmqaRqp4ga@y zZB?tMjpF3t&=#m9;+nODb7K2!87oKk_ows0gW|3Dd>?lgho+vN_l3dW z!w1dMGIzxIv_1uus-d#(@c$gJ#w0(GHN-A0pLg6rbCfUJ_ILMief;4H5svHuKR-aF zaULB1?NR5SfByOBpMU=OAFSYk0)j*T$Nqo3js$vLR@Y9uetWk$AHk`iw+$q(C=oJ8 z0_4k6%oeJ)v?v=E1{EDncWMh?UZWWgvM7?^UmzqD$*U%#VG3azMJQ35WHCRWG?Et~ zJ(9!@u6nPXzF*k9WXLFL-Jfo`^%p8DuPc?mSC*8kO0DMN^s()6Q@{4#cYM3=>UG!| z<0%>Y*nI6=WTM1o)vH1uO`kwr{ssy-ws9oauxcCML2_xk}ECNb^zRw=cH$jd$-eb*@K6sYsassA^3sNAt=ctKhdlpG?tYX%@$kL{ z^)~uGrG8fU_96|8^$z{zb=(*bj?|U3&n^cGh!Mw%Z(56M7 zUEB#S_L9O#DI)jkb*F|F`so5_Y2SmO@&%`u*5GuCd z8f>G21f#9B2?9`Xg>B!UD_Ybqt0`P73eVvhNC66zO`Dy#2VylqS_H8!3@eSAzip^?U(N z;F2nfMG2Vi@Vv*jgO?!h7zl-V%qj9aG*%j3{4^`jOA*mcA!B1e)Ie!LhJz2_oj`?? z!l$$$uTD@9IAICS$6MIj%X&&<>B;N7xUf!e8r;>*+Is399$wEdZPS#1eo>Sa57YXn zB+#$oHg8YWJCCNZm0;--2GvT6Vw%2&*_*`>17cyB+J8iDDLcd^%Z_+E+a*)2#bjDi z>2A`s`6j`de-sTLS?k2OSfR85j}Md3D-Js%K%*vyY84p z)BIN=w5})=|V08hm(K^kI1HAmiYCIOw{&B zS+AqSx(O0PT8ZdU3nBG}EW=CRPoP=r7AID=m(PL`dOA!I`Qati5i6p4F?`g4^q>hd z`YP$_*M$tbBVJ0QIn}#gzk#ix6yifyu$4YXT{u{EWC7vxEVXzb+VTlK<;<3LnQ56b zT)WuaEBLD$~$-@qM+bjmL&MU9Y*mhA|f`j6a0b|)HK%gUY!WMZ-O@zkCznX9|A(zc2SN|c8nF=sVO5E8V~;Hjy|QLV z5|1;$_iUBkq&+P#kijZ7sgG9cxd;VFDPlW5P{B8Cr>y6xNtFz4 z3;y6BSbH!Sd2mDTlkJg1#c-lqfs{97uk{wKGnki3(rE<=v^}d*CX;`L&>eGxM-(K} zpdVlL*Mvz@x0wW`S-$lcuEvnroSLSW6xfZ({(egU;|@=>h%q)N0>E0F4uXwg*9?d* z&#&KerJG=PhOlQiAX17*gaftUSwXPQ)v=?nWI5U#$Wo({1H1%$xzAhp7SHKY;gn^T0s|m5F<0p}>RG#0%@}bPaid{A zYCy$7V%(6a+>0l;T*Rpe<teQ;Olv-*&c>qPTFqBmFyqlD9 zY@Cssi~T zWkJxdcviHg$gRi{r8`ygsVZ_M<&u#44DYbUC1Tbzz@)&_T0MrxreWhbN{9)wf&d?W z;VMWZ-Z{zDP1_aPzw-APL6~HM2GGwi$UP0U^&bk4f=W~Y*9Ik$HWra7Dw~axZX8Ow znljWGGTBU#+s2F)9W2ud!qaz%f@PN}i=gmddwDMQOn1w%$gFgWPmBuUL`XD4cD zdzW%6CQ8!{W=J1^N&2sjClL#I%peIZfE0yHh$IYA87EvBOG$V|pVc$%gA`oiY9+L4 zrde)TVRea~ptVAd4doT2UHv9rWP>BjK!&ia3O{K3GNJa6lHL$ip_d$N52wdpQ56m( zV@40?9_RfPzmxHoZzg{ridsrHT}0Al+8+c}_ic~P*vrYtiSi+c*l#V+(KV@HVFhyY zQBXinOVTDP>~^S?*Xw>ItUH&pqEZj-4yP%FDF$3No(6n^gDc$8{7aVH9B(2>iBNX~ zH2%$Iir!HKrO;+-2e)MU)Mu3edg6d+nL&*PtW4qsyT|k_Jxk|=8%4BgtJuQ&B58F_ zMM_Zme6uHFy@q#jryiXgOT7-#a-@d=B1Byb580yF0lBdF9%g3et{@#OAf%lu+m6Kj z3LM}d`)X_|84@mK>mfVHiSNtL@v&tvpgXuR_X~+1EW;`o?Fcs{I7WGbS>1#ECQNvO zk$Lh!1?ny&l+;*WtLS{6mcpOHhXzX8z=toRnrhQiloCo;svRu}>Or{bbcSU`a%!jl z)xv29K0BTYZPJF#Gv1yW^QaSx|8T zl&&GjZ~XFAhB#RM!qk##7Dc*|Xp#5l+nFp4f$+xIccyf+*0_&!z*QZ1<-^=5pdL3f z4FY)hTM34p2}3?Ktpj(3sn3Y90UcHRfLXtwi6`6JkzkbK8Vp&#P9W$|u+pV?=um5- z-YeR)Ep!&U>0ScCV%?TXlPD$mEN3k8F&5$FqIvgNx!aCa$7c zh(Y9?4nkH6{cm#BpJu;Mv?KZ1yAvs0Dycwqzn(HvnYz?Q{`7I>ikfO3dv{C0!oAUW z_4U&5cqo}KzZ9h)5v{jfG;(;P9QkzY(|%CJZ-%k#!y~~67L+5zQ8$TfF!j@zZBXkQ z4Diij58`g=opwq+p)fo}WaE_|{rpo{E@k=;RJ5Ph;>!yJ$$UUXfYE?>t@nOh)<=|1{)nXfc1K{BCLf;I)3$-|P(6vXn~`9{r&ULe&6H_q>fQU(eGnyNb{W*Hry& z+<5!gR}7Ul?hRaRD4LV^oiCoEJ--82D28C-k;1_l-n)*1=?@bH|IW&bxodgKZeFnF z&W}sNbSwYQQP}uF(vI!T+_-ry(95Awb^m8Xs7Use4LnsvTe*69ySTzID}=G)bD0}$YhNCG-R?pCl`E)=y`A3ouZa#PpgnIw$c8}B zb-zP?$cFFmz4&i$P^KzxNB7gz`(6H)c(K)WZ~Wy;L&evbNnC-SrEQx5 z`0w%nrg`V8JR<&A$p>hC{oijAnaMlZhrT+49NKNQ(^;llal4m_R%g`1uQ9ugWW}fQ zPrCpoS)NV^i`>As05>kZ)qUcz@DHbt#)3FK{M+kT3f{TfT`y1X|2%$go1nKNf6umR zc4gva9b8uSD61+`Or3Jg?#h_wg%CWERP?`HeE4w}e2?zcbc4JB;MnJ3Ksw z=Oo?!PpF?Gun$ChytxfvV%>?#HO3EyUooqAj?_4N3x40@AZ++o{5XsxmxoU8llIL^ zHV^sZQRQ1zv7 z--D*02uCaxR_tBi;rrj;>78~|SN$22RB1;*xV<41G9)gdQpN-&FU3Jnp*qyC4Up5N z$s|!lOcIUt#$#SbaSh{JAyRb$vX97>=8G954&;FMBRrE|Cd)wCQiASzk*wnGB7;^D zGvmM(>|gR2g=(Dvq+PIiQQYr_;TeNCG*~~?6hqdBKpUK*?oZ_sT2tzvEXa=C51An8 z!{64RmjJs??FdqY;xbO4dd={Yvu4Za%|N=S$EiNrnL|N3>^~(1)rk`0Wg{0wK`LvP zf_qlx67O6K59Uq-5Y$zI$EwatHJ}@Wio_dnBjv zfK`e|GfJkZ-|(TgGsNa<+JcFD`J<&7(WtSg5___X2E;6dd- z$RglK!UfpYt_*bt7>5xIfVvmA6@_QOQJjo;i=)qG!lCrI0D*60L`HfqQZJDCHUNIxU(iqSbzgdzkXOurchtE~w zlu^)_moYJ{Pr%MTu;RQ&4R9y0Dr@zyh=u&6SNza7iYs@STqT5?1eW z$b53fE%>BD9@0C!z3%D_jYRFvbSBt3y{%Y#K=*f9`wVBTyD~J+W#pQ3@L4PFuRGsb z2)9ZH#H>-hLyLV<|IJcJH>}~l8bL6UoO$!z8EZ^>o{;xN3F$Jte1Cu@52wP`+!fHb5nGvcMLN|?g=$&!x20!B0*w2S!*Xy1n; znvkoaC|ac(9miLtOWIi%ih4TJ4er|WmqkH2r8Dbxf6uck9ksw7CgEVeUTML*QUfV= zgDRr+V~vBONckpfH+Od-ZFMZCGbu%ch9hQD12yhZ^hJwIVPuo1@l^Wp*b<#+XdYSX z1nD3W(mK!Nzoz;il^8fricr-p&I(G@=|oJSy40}u6mRS;E?AevN>hsx7&~=$5)oYM zrG~C)^yf{u89OU!;CxMo3ui&>9((%PsEV2sjqx){+&<4|d@O3=FXHT^bNUHq;nDO|$4(fB2+o z)ne$g8CHNVu+;J|V$&B|#u%JO#ix&UX|s1%Gt||t*A$Z^KZOC`*8YKiZL#n8oIgcR z%C{aQ__KiKioH_=nth{LB7@E$P9YAh*O+(7jANo;66O~XdH@NLSjjZ?WI0FUa`0ry zXE%TQ%yGnAdHi zjlU6hiAg27w?MJ{EJ>_5YE}>W12Pi`Y;Gon*bSeoSk>WT4jTEwqd<9-LCPKGS(aw{ zSJHfgq&@nkiM_sd1S{;(z^i1+648XX!Wwx1n!wkhM?nj4J6}2t|(r8 z2)>z~@sT5Jyr-8NkMEHO?eZL&C%LCF#-vI@i|eE+_n9R@g`&AR_WN0%S%9Tar#EF+ZoBB%#(Oh)@!SBzxvGcnk8Q| zH0}M%sp@xtV3E9k{=^R@fVRK<=QTb;?D{15u=lX{2Dt`#o^tyf&s`7J)DJa~`%{+< z_A$Sc`xBZ7)3nXsWhvij7?tZYSpO&N+lTtjKHEE7-#z}!U+#-W+X`#ZS!SgW#j+AB zFH*ZDHk0%hLtEI$dhSiJL~bu+J0hW<^E~&>?&nc~^AD95N;Dw1H<&?P0E0Q}=4xjr z{1*M5k@@IE_rE>C{PWL0|NQgMKmT``LH^JF*S5zMLmM;av94dc2goaL^_Es9NK1j( zl1D9Hd@;?5| zaI-ecX-BkKZ0G-F;#MSizaKnkUD&L#!!y|+y4qYWIFM7V)P(>u^@LZLz9({hsW>d2G>oLSXP;$ zb=-xRFKs_xKKb;XVXqNqi#yhf-CYDS=y3fsVoXdR8O0)^dihut$= zmPt}^O9Z4AWz}$T(z7*5QXNF9VJn}-%xOTq%iJ<>kA3@Pd#yua_47!@wSnbxK%#ux z+po7OD-C3@-0o_ZEu$9XNnLTWMZp$Os%SaE7<6?NLbb^Tw_+&wuXSzavXF>06BD$Q ze%Hk+iSOxtw_2xFL90L8lK3fx4D<$-aE%NebQ`Hc0AB2B_3p-LV|ZGiU!YZi_$qzM z(7R9oZ820fEcn=kY<%18K-ly+@GfTt#8ap8AqYKFvpi0E zR4(RNAUs&J+zWc-L(7=){+5!xPx(P-wjB=eR@#rpk`;8#=ig0_Ww}J@Xr#8#fyJ?(sPv1%n!J68_ zTQjp%$e50}C*Q{KoG;7_Z&O(`|E@qR^Nk3VU`aFZZ+X`__Hbm_bN!hcwZ`o&%54(T z8n9Ni#QqB|HcdFFAvA4O{RP6SCYFlXu-0 zO}~5x&PYNjQ5%T`sJfbws&O3f&;=Zf-kp|&KH-^Zi;CymtT2}bWC}fiJeXW*w8((l zetklv<_B)5otD5fofGb4BpbZI*^(qm!cB9$PBrh*V4nZiZ)A^^4x5WoaL|{Hl0-Nm z^bM%Ghqqx&+icq!Q(C7eXw85W9oCCwhpbJ z^42~BZJ0rCxCd)mWL}QX!U>`9PjAP*dFXx76*ds8O^FD{kJ7m^L{vuD&hi#h5YrGv zc8lEOmB7umG+JD93-i#mlO>utap0Sf*&nz@W=ctPwCvdu*u|9Jn8v8iME1Pv^ftQI zYG|yK(z;ojijgh43k7mGD* ze_7Jc>P`6oqb`*FeA4}#S)coU`1gxaXyyOPmos0QU?#)3lj6sp1IQ3Prg{{-j{Nf2 ztBdhYb5zi2#!q!rc#3&0eFJok!2H1PUeU$&!*sfQ?M+^`4G1u25cqL&pY*q=oQnP| z9F0cbKfMPJ7vCZRnkSOy5CIDDOX-T{_pGmiB*bz0V`UgRu)wNB0;_c|9MJ3TEvKh9M^Ki-K%1TsV_*GLqWpLg)R5Id)s%0TyOnDM1IAxSGFLj>yy;GX#W@?K? z&0y1ShPCV46)oCOo3>E$yeMP@{+!InY1Ls+dvzU5m85L4g;_By-*JuL=RdO-ut;aC z=6vSV3yLObP!Cl}8jJ(8{?fTZnPm|u6yF#i_%$RKxQU7)N_A*pmlVs7GPCV7a5p6v z8Ex;VNK5-D)H{3!9CL847LWs>X10Y4lZw%^FdZz=GHi9{ z>=&5pN?z`+cGxKE>aZeY-X*EtW=k8C6T;n=@`}>pKx-t{q@+-RdKyAfK0-4@6{iWl zA^Wn~uQ0-U@VZH4!BvFs@rN4QfIgnhF7!66MK~+Tl`4tWRfH=;CY9DpX&Mo&BFbkH zGZQIeA?rFvI!}g5r~nv}-Sjkun#5`~9;eGHSlh4?x9uv9^z<-l^cxI_)H*tkbw$l?EGwd6q;f^Lde%;G zm`zA<=%IWolO?(%!+ws{MgCb#$ZS*h1S4>jxEBrBLY3A=?gTkTMf=*O_dmi^x|Ko_ zd&V@>0-`DCtGPvmWef$en&_FDZt|?W0QpIxaKI`lHHYG=;3yw4u_SS&bOCrb{46GN zrA>?t*^}#<@U1qmcNCOXoGW)2Puhenf`2|lPNea+fq2xjcUX%sz~ZP~B8jD*6#IYcel z*kgHe*^sUt0BkL4*I!bQfF_MdVevk2bs;J?)33Kx_Jd)UV^$z`YeG4#2jO%O2ZrV` zu%ykPgS`@2%<^B3)>Y~G4Ze_R13QCQuf4KNFW`X$>xA|l+uT9CkG0@)F0Hx|hLtag z(ltQSm#o?vHD)nKojW2YU66bh-45}X-YrKE;9)KKguuJplz)Y9@y;UU=>ePSWjWT|r99tZsTgHB0b`Ds?Q z)e&|Jia%r)9%=c3oSIQsnq+HJrz?k)nJhp;89r{T#wqLkbv!~Paiob|Yo>6>(~&Wp zQx~%-W~qNMZgfO9yU_H-^npv>V{8S5`D*DB8)R>wYaw5ZU{O+6e30PTll>RxbbL1A zNcW(Gs3L`d;N~Ps|kU(TkKL{&_x%h`ek5Yy)*{dWQ? zGC`QTK8zKuy&WQMVKJ^cBI#{E(qUGxsjvs-bd+_%eOTe08`A|J7Cof_@F4cq!)C~^ z>$5s!F4#H;FTrLU_v0s2Thpg7Pe>jK?b1zMZbYEkPt%^Ue!QtPyLw&3jA+N3J=H2I4N~_L?*O z2>73Q-+PQo5wqqB=1UtcPC$)de@*h^%nwn`;=ai5=K7Yt>?t8%{BM@28y^fF{=R#B zJbiyR-@g2(*^B310r7|r0x%2SOgq_cd>BQ73&H2Zly^O3-(aTq6?*^e6Z)Tj{`u#h zfByOB|5@Gt%l-eQ-T!(2f2n)>(PT|&m%}0FB`3DURtbipj}(#Jpi)AU0@+7rqi}<+cr+xwr$(aleTT!wr$(Cvu@O&{_f~ek8V`Nd1ia^#g0AM>y0(| zAXB_Q^?wC&K8cOq$s6Aj>EZaZ`OKo2DR-yUKO0MTx5bE!_{Uvd9&;UqCs;N19xkObo6Tf#I-N|VGm~EpmVY`<5x(zwHS_^~ z-TVDE66ULa;zhEKtWg*Yf1mg7pU&dT!J9Fe@Eg{QcoVJG<;y1?g^CRP4SXCA1{hE3jK)0O z(;-~-m^oAHZ~xf5#!B)rr-&>Fs?iSioq9oLDY`@&rB9u#N2=@s5qRSuWGhx@+GREJWJ$bVWY} zm!oYb6j213Nu!@zE30Micja)#2EW$a0J`6Lum(}n1%=VjPhFi}&|#hfwJHu@+5=VW znZl&YCaYlfk1;l{HdmiS1UlTY29;W$7bLcMY*<=k>l?w43tmQZtGRM4xE|_{34;>c zx~D-NgM)Ii$ucJ{hM5G&UVkVXLQ|(*^Nfe}j?Ndd1tdue-Pdu81&~)KhcZYK z?-~nf0;Xlqvou0bNQ4{1GB_DP&=S;3%y8b6A~mwbqTG5E2$+brIEZW_hzM8y^*m%hcyHRm=xg(2HX(A-2h6fpH41`A9BG zPZ%~uCERt6fFASR(>Y&2vrq89?%E#0yT#_)ypB7GFGFXW$dt(v)Zzm=Ww~aeG1ni1 zV9OLr@pqbe63$hb!kZa^i@)vnEbo!;9)M62C_X!9SkXH@MlWCdd$C&EJa1M>`1dLM zNr=_BoMBahM@co;M?iCjTPQTn%bDrsE#x$z9A?l_Axi!sp&(%eIVrtccY8P-A-MqZ z!9}QZIB0=FDATd`qv)}DaS47#>9uUQ0W`tpkB*bt#}ZmP+BZlPYKf&f59xMKWqAGW(Y)GX_=ovNF zqL`;w3~sfEgl2gtUrqb5E%~-aGl)i{3yeW)%0y7SAnZm`2fA2hmICB~~^a~nlRN#!=S<2FYfag#mw5%nMsJN&FGCF%C zgjUvtmO1S@l!n?@gGJT0G7+cPWQBr|9-gjRIGI+PM!_WAK|o?V;k~F^GoXh6H_*kU zcu+{RXV{6S2kagA4{;D&X_Vt&el#govMyn%a@UB<8JoaOCbT#5nFz0m1z0x4-2C$9CU{DdC()cm-Zr#`FnB>#4kyN; z30LvwSBaZ!rI+k(r-kV0!@S3yZXJYoNyE8YfK@jUzF-&HA+s?w7gix+ib6-4SBJf} zU_0LAGR93uCJz%06Y}3Dq(8R|#-5`6MmygsbIiqY6`o8D$Ec>G);Hla+JpMsb5s2X zidC2?%>xC5p29<^S%I6%jC1BdOC>?5%ADlB< zaECBu27EPFhfIr=A(hw)hkao(%KIVd#qf?Ieb6SZdEoQi$o`N8*>r^_?#AWRmY6Wz zhOT8{eq&;LZn#r3GIMSgY$w8;6AS%JguH!ShrSCvC>Vm&`hQF_o zHlP08G{@Z1j?bpo{5>r?4Sv=6@6^7nu2vs^Pwe@6v?2DVUMDYnz2aHNjQw7ifXLDYqcN| zMr4t_6elZfCec#X0H8x4oTmJZLx|8PWg}`f|BGjt=O^$J`~}&4y0GJP*IpLz1I+4u z)xZ4ootE1v6`2HYF^|R6?0q}kwSH^1Gj+8=OQ>1!qW^ZeACEL{$LHx?W%iREc|so= zrswVPFd0NHB<}E9qx#ykF+YB@v%U9M^+ogA){cAjhRz$h_riG7XP(s!R*-AG(2o1f zb<1wA=SvY8_IWGSxrQx1QIES zeR&8{uZv^3(*6F+!#m(%y|TC0z5hcdt(D6wZN=nsKg{oL_;vU9TDexg)sL;k9z=;0 zFLj5s<$WbY;**>|5c07{M1f33Z;8F@&axOE<|A`-rq>xv8lWg)-plVr+$>hqtaS4S!Y{>xyd{P zE(Cab56&5upUQ9wV&m*)BI^qZh*2P1S8mr)aBVdb7EmG&6s}?0wo^d<&xP`N$5ey# ztRPq0(9z*Q#+rlSQWP+w182+tL5&6m!4`UOGeeaf(NoLo4+#IJjM1jQ!!r+$4|7{h z{L3wKS=`=dfIXxJ)4Q@BB&nRW7J3_{L~V^M^i&7SO2J>xIdtPxMoe`c+O^lvr>Hm6 zIq5`4SpKBct!@4?4t(j*1mu_BXIeL+}3tH7TS3y6g zO!kRlmu+*0PR$EvKRrpNnn@wbISh8g_SH7K_atrob2N-@VV~xS5`j(Zlj5Z8~ZwE2L!coK2O`kPRA*7RknM&+)+TqmS#pop{c#;*cVO zsI6V_L8P~i4nbh6&;u(?df-MR-fzLFVQ2EPvhh+sG6Sa8Zctc~%m+qPPoqRo?E9pn~`=RR04q2HL#wPEvpM zn65TmXb1_r9QxW*;=cpp0~}ZjD~-jVT&#w=uD?At-A&4ro1ISDDWck}osxQeEO4}I ztk*FJ53+6knA{BoHWfkFW`oS2)kWsh^SQ|@cut+^Hrf^F$ayLysnxTF@wy42(Ex;& zPFG~s46t>NCZl7FI#e9m&+%KhIJc5rrF-d+%(klje{EnVQ_J7B^Cbd}&1G?7wPsKq zHW*^K@D)*}w0K%j+xsx{w3v`8t#+oU1^g{pkHj%Mio{}Hd2eALs_)>G$|x|bk@_%C z8#flAB8aEPdzFp-rNB5$BV z(nC?R$Ljp3l;Q4bg4OD1mUdU=n=#w1RSydeX7Ao@T{h|qVb zc`y5l$nGqSqp45<8UORL)9C;UL-Oq07npz+5hW#r^Ns?DZQERN+xnWArZVY;*q^7@ ztufGfdZ_0N0kVA>GKp-gZ6ug=w4KbOHl!T!TTFPqp#-m{s0vxo0m7zVAS}EVTHQTD z`)hEOE;E~ijDOu*r=r#MAkA|5#0HLngvg!Y12>v(sN(86E7S5v`|Jx`PsGI`wyr9N zt<0Dmm9oXCt!@D5(4Z606!n+R=N>gr)Mwi|SWuv)|EwNk#8wM3=nce!J%&ieE%>8q zSLUqn-50IbPSK5_q>8Dh2xoX#;RH}Sr%WvHzB^M#)L*GdNm)tC1&t6F@12T`2E`m8 z=Uo_00#)O1E|=wPm?&cIyM#e|>MCIJ)4T>Mh0)6K!RXQY6Ns~_PQsY5^)(SiCpcsl z6G2^>T0x^V6BT$iw~NFu2S~QqgUdc@eECNQ>K2r@$(E@)a$$+DM{Pa%mW$b1ZdC~| z$Li?Obm}8;cDpNfwGLa$Pya2fyNfWc2_H$0SU262y%jp2Ul8rbL=_7Vx6GMWj8V`4 zZBm_+Am!tU5|lt=s7#z8 zRb;$bnnIKZ>=Yr(0%|p?WZurYEU}(+LYc}^9TnIqTg*A)pnfxKorydTzNKRsLlaz# zG9odZS)7q#J?V zc8-vl-l)1a^{$cAeF+G;)%|Kx9P8@JVRYwo+%Y;p?xlVleCQB%w;jg_r$Uyr(Evd) zl^`(b{pf&NYcR)vjE#iN6vX;)uKR!|NQkHiZ2m_&unO5aG!k_2gmn&{*b(vi;Dx(_h)~; zAAR)PLa7NK4-a-QVh%-yg_q~+3emeZ!Vfrpz?vcI&p-eC^Uwds1I+*Fe=R9H zoKeJ^m8l+6H;&0>3Mub!BvOqC1L63@H3j1cDW`WNltFJg4yGaAzFAYVTR4-d?q*;#lr^n3$=hvMO%&Tl>*x;^lY!&Q%@fKbWL zTev#n2^FriOkvVDHgyad|A2PRC7|z+5KwQScm2AC1|i3}EbP5iD{5+~xz63(%*$Hs zPFEWf3yI~uNv4RD)RTU#uL`8Mh9O?;g7?MD-tHJ?)B|`+&8td_V%f-1?%5?2KJWXz z+u5Ze#Zu7il8_%hT6H5$eQ>Ak?ZcLAogRMArpjcOK_j1CHS)tviThdes{~}*xr%6#-gZD2A(4i5& zm9@>kLV6GSf4rNm0v}Tol!SRakb?NP8q;_?4p&-Sj(>cx1LS^;4;zww-n-tez|R># zDy!FsGqp?hk;8&d7lK->L{CE>n-`)TRo5KCQqrnz+%xpWrxsUMUToLUyzY(R`*Muu z4#TpuyDfc(?verxZ)2m#k4yJ+uCA`kb=(^?Za198S-6exTOL!teaHK?CeO!zl&D{9Zx3!gA99ju4 zZnrwVf2LvA9wYt~<|Cz>q+hu%w^=vm{Z*C-^nXrQI$lbOY0xf?;39nF0Vhp~tpnW^kUi`LiRFxf(5whGVpUiA z6wWy@uO(N>sAP*)BFANwLY68<3(A(I0n4N~R`{A>Ih^DGf~ji|N+>K!R(%fP9uaLzpddX&Ol8s!ZRgH2czh}O-eG(s&_ zmMtX#!?<0{_`V`>u0{%PE{(eK91GYpEybKc*m5~cK`K?ONIEjfz_EA^{0|izK?t1` zs|JWklXOfYs-gpl6eM{_qRR}qYF!bxZwMi zMZ4=c*G1OB``WpqtL$VrgW$tS5`}?7$B?;;lTJ2^=)q4F5kMXz{2LGbV;OV=>RnmR zCmNyBs9evTxjOWL1IwJ|yVV7t11)=q-T8_< z(dAN<`ktQ^)eXq(h6Id~W>TRI_T!-9o6_+pR^Ek|El#!x55hKhYTFoUXc@ zvzU&4xsD?p8C*A}L|i%5Rm^-!fIQqRvC5g$b{obpu81QOzg`gxw^=saa)2rv+Y}}~ zFsVyg_Blu02s%Xo;wLJl>MU^V?=S{ndKiTitO>5s!pMAvKdI*9zA3ZV_%ZTQ47XjU zMgG>%%23nC`?;pDJtf}pi9ZAYNAIXIiY)*j;T`5Ybn2agMZfg(rc)VMxj6F(kp3Rr zJ&*9WC7i`)WEg>If&rZUiX*gaYGg@J`aynrTteA+t0aNZNdoK^c@1r#4z zfxy;ls4=}I<$cGYQ9*IpNQ+mEqu=c5q!&DQ@~iF2sblUu2^K&~%5ufrS>U+_^-tLG z50D#-IbhT1D5)1F<5DlVeBEusc>0+ssuA-gFKHSflY5jD3K&A(!GoBtP>?j+J@^j| zY6k^JWsFck7`Qja4VaWTfU>UI(a02MX+ASjG;m&)40k{YbKpfheW!DYj4hfvhT}>P zsGBg`=LV=1F~p5_WF$Qg{{r0H6;TkPX19j!kq28OgKUmSEI{p>3N0Dp_!Pa3B1{C- zH-OQqQKplNsnCZ;Jk+adG6QNlOf>BwLk@7m~_|=K2KzU|cYBqlyI4Uom1b(rha;+ z(`Xl3?L~r8i+XCWs>eM8S^Q8AQ^YnFppr?KV(|#CyxH5N?7~#_I+zQ1sXnnO@GQVyfyXud}G>p*&yj#M(R} zp^mmMM%kba&G>r9KI^}ZJ)mBFk>id~$h5h6wR8%gBMR^nF*j7=yNNjjDvN4KZTjTe%bIsk`(cIDg z(tl9B49|`=t6AV=^u3ZXo0MX1uo(UPYB%tj@rIrl0?hH>F0X(7`R{9n{-6E-|L%W( zFP2X3&%GOENzp;B*0(=UjQRyI6{%6Y0_~Z4sk{?d}N&O zmd68)Akbd0L%@Fi5NCLC3ykQEO0m9jx00?f7+^$kk7pG(7v;4T9cDuv2rdde_4l38 zo8=VWKi%9~4{Lr*3fR`xzHgV;ZmYLY@!`kE{rWZx>N?#W3%9RoHLss@3}@Ba|9QH6 z1zQEL{5DBHxSp8Mzy8oCkn+*c)z#``1MqoEK6kWpx!z#y!iM>noSf|bp$hk!B)NGO z=z@af#VG0B2;0n&R`V(YzwSOx)~#K|-=pA-s~LO3#b{huOy#{=94zmrZ4$yaS6EPq zTcDtJ=02;3)BscPORk!Pf=P(Dptt?r2jgo&@Qc^Em(EFc)V;dKALHy=^SC<`n2~HJ z$k`iboBF$7v#`F&kL8jd>gC8GR7eeV3S3*7K4$-VufPFJyanwkDmOzC$k-W(Kg?-m z)Y;iNq0W(C>&)m#_9=Fy!x{^|A3W8#)7h)lhQ(Qo?l#X+YEIJQbTX{>>x!>zdiQXf zYb8AQJ;jc|IV_Her8Z=cjV#Q1l{PNIV?<^^=Za^3F*v&6zJJj887oGxh}^Qcww(Rs zor8lH6B#!^lLTlrpFT8G2z*;WeG@h_-`H;Ec`0$`#3CWo+Nld!odeupEG2i~5I4zl zR3kygX%~A~jZQCwBwG2TZmpc@3LC@7U7&sE4qm@#Ft2*H(_NN1%Cnz1karmSsEl*c zB>){2Q>anaM{n!q_X`z zDM=)i=b^c|x+<*QI>ow>D+ngcTkiFWS3Ws=^<{mmChFMqTu}0#Xg+fL-pvZO*~d4~ zq6p^DKzhc$)Y|Or`t1LB39Sm}Hz|0Sx#qsz-3XK^7;BI&k;quNd~o5wO_W+v4zzk_ zw)Q9F!fh9?PE`q#=6;YdkGB&PrkYIj&Kysz+jP!L9;az1kt0VkZZ295)KWZ4bC{Iq zrb`0Tltq@e8joB_OvP=+Y*HW_j4m5!7fDgncr|7~i$og}+4hh(4@+0=Lw-m?JrJ&B ztPYGL*Ma4A1cS0iU;&z`NN7qJS}hOc=ns?B55{3RRUn^L7+*$w+KZ?wiQdP@ z#)^YC&Len}IAFFTW6WzeOfR{EP~nfx7(=Y`6dEior?`|1ilLNgU`VuawvO>F=hU#~ zk^>?w$k!)@nWNBbDoYPa#Z*r~5WO+{8zezgW@3Kr@=cJkMIrd7UjPO(DV1;W4TRYN z=TuB-L8;LFUXnwRj2je{c}mKtxK{tNh!_w0h>NPh?~nB}IB_xFAJNUX|;iV9ul&4l&uN+Eim5X^2TX%sh-D z091niO^Zsn+L~~tN_OBx+?p!g1BN3-$-b7Qr-AxGS$PoO5-T^~B1Z?i(bqHG_&Tp? zhNJ>W77divqzbpHghw%y6R+lmreZ`W|DqqI%QqPF3ORQ0NFRfCwcV^t5%fH2xT3t$ zCMf{DxF)1=UfB^iXl<3p@Pm+S&c|e7LV?ht{0(j%jb-_Sngr(WfD=((W|QM_W=n1u z=8_f$T1r*cRi*janMjt5^Ki2{ceWu<6J*8WeX>YVfOLvX9!<$A%WAd zq}{PeH_F;TK1GXnB;U~=3O4v5!Ucvbi)u&LATksz*kO;6gdn6Nnr=}K9uP@Ssce*k zzCA1Z0l=da#i$TLY-C!&WjOjEwpLmj?KjOjj$_MJVXPY=t%GV=xO@ABQdc^R<-8kx z^rLV_LyJ<^aZry;hf&rImIyYLd$`;9r1=&o&3skl%qvPR;LxE)Y8MGZ0+ubL+EAAv z4#LERa=8uVs0>9cOnAl}OWxuK9xd~cAua=o2Tv&j#(*8JLlrft6gPVE!LL8&;~Sa^ z!=SU;(Nms&d>fKWWqTVa&+bH385&T|V%b|@#noul5K?Hx>fMqghd!lUL`y^(r#^^e zYUKW-E3=wp4>pOpG}b}HK9p1AEM7bn;pfXjPJepdd*CJ6d(q@80D^d8?G@qjcx;uj z-iQSBv1N2!vIVy~sGJkbQ@L$yZCtS^70Yp2^`X927|Y$vudbtt+E54}iv*TOgzt$H zNv@=AzYPNVjF(<@z2@KRl;>=fNrjWO9~S3fZA1x+S7{IVtFQjiGU?W-!l0zQ1&_Y z)|)%X-fp*lmP^dys9fP55~coa(RWJDZnXPgD+g3WUe$_2+skg9_iGs=GgnF;wD*|SqsJhTC?RTM zO6I0n#Q#G?beE!Jh|*t9f#-eS2cQ;(b1Klvx!JRcpB3zoNmw&PUg~+N6J=f&Zs!m+Vsf6+PGpW0LPu_ z@@0O8!QFxq-Z4OdGV(U_d&{M!_}~UnyP~0D*6N1#I^j~Z6jt@*MKhwJvd%zitP`z< z1w$}2xaeY_eiI!cDHF9w{Op}QfCCK9(0G~x!e!}pzp8cCNO}Z?Egu}mnJ=6I9bQe$fvnR99k_Q^l zqPgK_a`_})VWjsgVbpwm+dClIFu#yt*?t0yVKI7tJkM+T>D_G8W*!LPNww3bAgU*}&=UQR~PQfj4>R99M88C(2F(fYEXq3Z(9==#nh_ku1w zhYpNde8$K2%p_QYdv(q5ekG-k(ykW>cN#A>ueee=^cIQdbE%2$Z}2-_-5ZBs?fzCQ z9vaMDcD_0N*~8zo-g%!MLHm(tNh&rvc$E|<|LK1jdz@iZ|ITIRPhtx< zQ#G`;6zl3>K{7~@AK+hrgkO?s>r!phQ(IJsf`NXzDi9&@iF_&*zKe@2Z_)NQaShSC z3m z9`Emx>rXWemDALe-OuNV;$dt_3)bGb9Db|mudS=EuVSfQe`@U9^z6*sZs+r-^TihD zkw1-Q){dU0rXzn!_kTI9OsmpEKAlcYXZLZrgwa!0N>YCra6;_Bp!DExhlI4v$}CKv$@M-JnLrDfRAOL-mO}{iCkt+^Jf;J z9IIJk)LQ9ERe-~Iu+}ATfWwNl?Y%XH2gJ$v68yNLA7%CLm5r7ZFVy!VN+VbH3^Lm# zT*g}bxn0$BZEdX`r%{#0?wAOCpFHDf|H;YT$srxJ8_P8F);bHMM(kmWqZFQs+ARe; zJ5~eQn)~w%uivW8>Z0~b_w_(!42I)-%fn(mVQy{hug&1(O-*%m{^QG@;e`GXZ#yw{ z1jn}bV*HXJ^ZNzn)Fi2=dA8G(Sio!_4g_JvmrcFF32r8lj)!PrFu3A7yK>nZW~o?PW*yq~Gx2wh%B2mT znR7%|m*QZs$e=&Um)0;fUG#~uWl#3O`|o|}5tL2I9)v&!X*l-?v@UkSh5}G) zF@KB%16~}S<*i*!V=4wEx8J>mtxd7n@sRnb{U)_8p_;(pYdNhJ2O%~hMi|`)TshPg(`pyjcU)PysfJ8lSt~UC#))14 zqX33n{bI$>T3XGMw&G-1R>CdKtHw9Ifh!Am;WJQA*{LRn-COn*O-vWLM45YyYDaYo z^L3CfAiWT(+|MSy!!yo=GsWF%B{L0Cv}Miha_QDq6R_k`{LzO?O0)R7L>&czy;3-g z@Uh4mh{@`#zCi6(-{O0whR8O7iCOn9Mt|&J;6Ucd?VVL6uOpOyhlew%dpquD4ki+4 z%jG63oKH5MTX%aS;+5z&1#P113$dsObcZ(5_%QO;n`(pFtigdiSm{MHtgq^1twkQ7 z#&-*R>tz>}69eZZ3@_iHmkf(ts=;hzms8Y{|1jjm^|_ZRS1#wlCYNO664V-UM}=Um zEHQy<5p!$g_}jw5T+qrYwFx(?r`v~eX$NtOOYiLMkBW4GOIsZb8DqL;_6Jb6)qofa zGX&kDjOl{#Uk0l(b8w6W5)+7@^-REyHeNRPbhiS~02E@2Dz30xGwK#p#kt(oC>L=; zz>cKMyRmIUg2^+m2qK-$Pe6I+|0nwUBHA#9q-t)3lvX&3jw1?p-Y#b9Al_jXhDeu- z=dkxMHhc8e5Qz$tZ$GJ8Ep${O=bJX`6zkpqJR{dQBsi1&*JCu+Z$?gZ@*u3>^GRHH znd4|SPqW$6@#_OnY=E*>Jt>`w4GC63ZN<^hV8KQJ8#UouLUH6gyB(7I$Dg_2fLIL0 zsHMc1&VrRlxGMsy<5YDQV^HeT1A!2zC?QAzKsd&!0{~2GHX;)&HeXOEan;%plWN-QUR zEuZ`>^<3u|7A5(v3|M8&8O@xSgjiwjUwWvWj`X`W{iAFWQS!5$S zqi)7YfHI8~u@WhQ5$6X&LGsNC5d_zsm;E!MJNlfJkV{}k!ApsQ3@`kmCS?NMD^TJs zBwe^>_VUZITE)at5kQ@ZH75lRut|!Vz`Y|@paF#nw+7%`^0}|_qY*C}cr}b!1$xDR zWq}1h#S!7(BXDEC@4txLM~b@e%^DYVy&*)7QenghxiyZOf;iwOu~70`qxYcHAtrIk zLb*BLKwQcgrW|e%KCCVlZEO3@NMdI|X zT|@OrxY^zN0eJ-8jvQm4@75h)Si6~1AsPB1xYXXPY4A*w9k`&8gLw#^9N6>AAnfTy z9stVZXU5?ak5~eGMIsg=CC%t8{&RNDEoHGzL7Eb{OZ~TK5kua&x$4>-oV$X+xhP){ zSxj;%W&?M!PRCkk%{kXm0Y@R# zxT@_&A)kr3O!LkhdrJyVi|@Dx9)pD|FhT;!88PC!P59V>xwa#$pg;i-A~A@nKndx5zZ)(0*di6G}ky_GWi;z{Zc@=CnqP?H4QOrR)G5IEK*e}>gc|TXG zTobS8j%@zGT@#;g7MscmI5^?L!Cr-Y1G15fra~U6w+A-afLH?$&K^Y{9IRMOq-zb> zUR8i;Vh%WUF#8N8tN9!uIsE+1i6=zQNTIZfq-n0-NPcz%{x0$D74iT^3X`^ZmHiZ_ zGoW=*30MP%`tenBI{@FR0PIowP$ z5?V${uS;5tUh5)+< zMoxA0He}`!jYXVc#H^&jPASOtAsr=u%&^#qK_6viUcNk8ubA`%ekXMYY>r_xRb>Z@ zb2~qz9LzM19~r&{WI$@;G|EkWcMi!l?jsidH7Q>P<~bu5VOAVe7WzP3bP04&$1WPv ziV0ub)eRI-R3J!@e?saz@sE)r;~gpnI7Chd(K?m4x4s4eHPQ$k!f`@>_8`%YHPtL+ znG-W)B^Xl|o4tA*c&jC|&9P~+xX)-Cv;E~fkvn}aHtPpGbkQHl%jS?)1K{;It zP7%-;HOAK*1H!~e>1UrS<}jgJpj5ztPCfGoS)G$+Wkrh>A4-9jgT3 zxaY$3aB~j5XEX8_IoU(Eeqq(+s+w;Fp(o`E^VwT<_e=WXr%bgz;L1xf${s^~1)TOO zKkX*j5HLZm(At|)=HYvb9kjtACZxeg_W*C)AgIgbUt*j-s9QRPB9ii7gJR%qc;5Ge z6s|^svb<#(`-SQ(WP#uUJu}W;*1j{+{YA}6`pwhS2vR_nXMFpGTpr+$9fqb*&2tf| zR?RmxpZ{jQG=R)Z^WVxH*zvKSFEFTEC9j~FaH`?~1P8W~_X11y{?C8%FW^~H-crdN zo>8kt+BG#oZ$Rjrbe@NX=Ny82QeXlTXt$KSx7i+Fs6xS4SDsJu4shLz$x`Sn=37*; z8i*&@&#T1j>=Nvm12jpQ2P$i^Suh&a8wVNgj$v+=*{ZKd{9HEK2^~lOLxh| z@ci1^KYI_)*uC8?Z4FN|SIxt(wkf&F%X`VkR#FB7sw$|NH8j27KQdduztCSf;kW6hc{$F_<)xXl)?$xFBa{<1y9|JpzF)dx12@?sA5JS{;WXPDDrf#`?$g(ST@yJeOxfmH2mDq`I};)srmD4XL0w4#AN=Z7WdXbDbsrNCQQ7PA@@J3-(kDratH(iT)+s*`4_^qko6FR)F8~7^KklvCM<>EzD*ir z@A}2=TOr36Vq#KtUweI9${|anQm^;BWmk84sqsq#xQ#hJ@!B_H z3<9pfB%<8A>CFgOmo2K8loZjCyY92*CmXe1+RCDtt74+R7>lGZIoy(wNSYu@l0rXlHv@G<`(VG5ZeAmEI&|JPBD5fBSE{Y&unoIk!DQZW$ZBFwHb$ewy1A}h-cRR2HXJ;WG?PWrNXY_PWs%Cu+LFmfYtq43;OpTC*|K8W z1Ukt8aX^m0B#H^PDkmN_iq%oPIuRXI=Vg~=n}*vxswLpcWFcGq3n(}>sV-?!b33oJ5Dlts%Ph`AMz(LtfY4ARPPn9TF=ojE^f3~w7*kizK z74Y-Kw+lG?=$i}~P{bC#6F&9QLIr$AZrT#Pbh=6jcb%)o@9|qLKT?i3~oo4kCo=hlV8c?R^%U|zre9Vd4_U(xJg=BHVA(6r8 zT^HeJGkim*WUDia0;_1zh!YG3lE5Kk##s~y4pk){(g#=Hco~kUXoCH1DW*v0(Evir z+G}oRb(3T4vjG+c&w|(d9zv=LU@^9SCyASdl#&ZfhAifmV5S}3P0SD1KXYCRmR+19 zhq8w42ZaKmJy!f9goBPyp>YubQOaTi6s$l95dgLh`VO7ruW+WIhS>BLb<quCX{& zgtt$hZ=Ki?zJP8f@86-EuQeD*sH6mgKwc#-JaU*8w69KXk8mc6Jm<|{?^K7mB{)># z&3S(kg_B%e7%_NDWRE7~?lFdow9!$~fWy9uA;v9+EcZUfs#qF0$E?h)K@vMtzgJnt z5_(ex3kg`QMBdA0jL4=r0fpxngc>P=0`syCFNu$V1}=i|J;K=6DNHk)W}RupLA508 z8{7)&HRWJTrZC!<&a9}?r8}b#VS)fns$TsiuAfu)duEB*mjdT1gqjE>8v?1zPC^LP z?+;|P!(R0mPk_RA7&K+7tnt_ndca~M%U#w;rgW?0bu9D53l%<~vnr;3D%Vr!3 zu)(z#L2V2%LKGFHm0Bzy@ zn9G@&VDT}WaAh6!4dPiKg#_W?IEOo|rvbvGY?r{bq=H|@tJfV?%6V>lnw85i zSbBG_3WL-_{`@^~;!Vv4paha=-LGJE-d!(xAHZydIAjT=l6|R8W4xhgPfFJ>0j@9M zQivFoVb;DxgU#eDAe>PJ2Er%&d$vFTK5gz!ZreM_X)8NFI{Q74fEk4vA zWk57MxzKK23*yzbV`9O zMeHdW8r)YbKlCsT0i|?NOcBKjy`cY#y?biX1njy5owjY;wr$&1Rob>~`$^ljZQE9* zD>dCS5!2tCP4vmzUqoGhV&5z79eYJdnnJihK0AfYrx_i5*AgBJpeq4B+_miw@gwlF z_)x5W4mG?h=A$JkQXgm0;YY_fzjT<~unol(jNH5w+<1t?tBt(Qg;{m zhQQUM6sbln!%0)B;lohvoi5|}&JI+EctJxybg!L8LA(Az-qP>CG|)3{NdFLDhO}muOcRs9*X_@y$UjSP$eJbAAOGqLI0b;aqTm zyD%4tI$0m~i}3h?nQ(*Qd1U^y&Qpb-bY7U3`>`ga2r^@=$m1)FKHHV!9A?&2F>jr} zC=a6kAgln6A{T~4POCa_0h1=vFPEJ5CKl7?RYZ4s#KUX)C$2l#J#l5Pb1og_^^BP# zRDC$Cj3Xuw&9X%NhmxluV)hp(ACMgixTMmNKR?}5gaxFRPny3!=0Ir=FZPHGzrV$H zFkTOSDwhnz7Hk8Pu6MS+^*=mGY)qbx=G?>hPdx7{)sv8t3h7$%|LYzWYM>a z_CK8>{`u#h|Bgl={@?tcxnqwjj@0k&eHPy}{PIkC(E_lBDWY#it`Wl-Q;@?Mi;xkI z67w9hsWD+^Q#M5+0{fam@`s=EJP9?oaI<%RnRUxiQKKo}e!Q99o}IO~IOC9}6Qh$s zgxrIF0Y&!fb9VsDekvm`SOy;~)k)^RBL0uG@BQJYIde0(76;Q=3F7Y1)wFcurf#hX zzV&){CEQ*mv*i-sR+zZ;Vdw7NwzgHW5QqKz1O>^Yst7ItdYI>k++WS_ta?*uLqMs0 zqb~LwZ7Ik%oC@=xQUm3xUQt!nOHgGVin#QwrLTOMwZCTCV%Dc1_)+yn^y}l9r~CeW zCcR<)w9LtkFB|luWG82JtJ-n;dbDh^@4L4uXUH*mF6E;l4(5AQzvG6EAfq^W2OksO zBK|~7F}cr&vToldYRJ)f?%Fu0c%!yy&L4)eEboc_{z>Qa>u7^p!~Ua>96UUL@BoP@ z1WE*1@R~5Tm(ORB5ME9DQw{kf_bYg8E^c3nh$c14Mh1PlN^##nA0*LBvecTQqCA=i zBxUxLWc#m#O`_P;BEPF}rBXS$9oo1UxtUgyFc3zCstk29nX;=-)GaKASrNQLshGYS zEsx}4*l)Ies(=ez`1(RgUbc5orJ|z{Igkuqv1}CihR`O#akK}*(OtesMg@>O!v?o;tB!riGeP^mIHd^QUV*osl+*j8#>KQ2xVj=El?I2Zhbu%ncql(ZNX&~5T@i>QaOqqy4%4vBGSTklz z0?I*l6_gY4jACMXMH9q92s6R@Y1&IrQfX{;y#k$7c!toBc5@UD4wDvtdl{7Fu%<4a zuxoQ2-$2~!B(bHq1c?>dCGN;}HLP+Ne(bKO6}HP16!|8aXFBUVOMK5!F@5V&>_xct zQcNY`rYw20;SQFFSU4`5C=c2C+iX1qhsBf*+YZ~4g;BBg`wfVC4bv(A4K#h=ee@vr zSzT?IgB>&-$6NHoEGTN z(f$Qc!b6sp7Z65Bzyj4=zm%GE_1!&;vzXX%1JJzLGl0Xwq3!oCP<-0@f2M(uO&Luf za_(JSh!rj1vK)QBNKW^kG0xGh3*F0?FOAqWr*9FiKP;lrPz-g_S!BHKHe)Q~t>xuA zOEdBv=(vlrO&Dj|`?u*tF-Em#x`yS~P)RGRK*Pu4IO#;g|y?_0*WsO+j&*^$(o4;f>o%efPGd zF3n0H$SwWipnr7(5L}9w0qK6CcP4rd&bZ1pV$}@SAxOrVGp_<4MR!r?ADWW(jq9Re zX*z!FCTbMDIu|hC|54JtMc+LvBgee5Fg`XOXMV{4BW)++rrYFa-%+e%C8n$MKf?PB zfXB=~NBjf%Zm0nP({1Qu-4KvdPpJ3QfpQPwC#R}L0LWhdizBdvOT|lTn{#*Iu|O|1 zdWjQ-;qiz0Fm0+NPLR{3kkZ8{u<6>I=kq~fKmF4Kp(Dr~eyHngpTi?2VZ*08vN>`@ zL{DqJENw(jMH42liYUx4m{N;D8xlIccj5)qi%@sVmhnlR``gci%ulT&?h+z_*8_i9 z@5V%l=wJoMvs@NCT*X&b&?{5cx3zM08U3`Coe@NV3UX?X>G!a2?Kw&r#*OW| zIn>sb^deeAgS3l-C#Ygl32F0&OI+E=avqY=!S?>+$Y0VJ)rSoa z9#ZlxyD|#O{iC=yJyT1H^G!7;Fkcgd@(mqA_pl9#Au{JhyFammSH(4 zZvBY$E^wdr_TxSl^rOvx73{my+v9#_AL<9J)=&BJ1iRth>i$sN|IO!a|9Faxm^xd26lo0+EvKxd1x$u19{(%)Meb{jKJ3ID2Jxu@k=bwN6`RAX1{u_Y*Fa3Xp z|4;t+vfRt{jhmCs0oY{;Hp}CDr?g7ThK58TiMP|JkWc>420$%n`4ud%i11#b=R`_? zAJ!x-VF)LgfyV)`Yv#sI*VYC_72Wi4lT3-=`QAAs%$;!-)P9=G2OcpP!C< zbK;H4?P`(PDLjdmbzi@8Cy8wK4a^i@pbDZ+C9^>DtB6#GMd= zh!Uca0M<$4ugVl>u~hV8iPu458z9zn+;J2SeB(^_-g8S`C})3={`zvOE0|Nq66;${ z0JU2{Y;`n(1I+^P&Cx2)l;ne#)F4Wd2wIO}tXrWrZF7>WG59mLi_RwIn^%d4!pUrc z^i~093_@uKoVvS0p0Y1ex~i(95{{91gIpx=Ni!WjEwpIkpbhCNn7_&IvR=Sv_M8J0 z&%_ivs#z0UQR%@85HcS~A{I*4YA0BY`Z4NBJ4&G_+FjBwr43Ohu;_^u#|uIWEs*0K z$Zcba-Eh~;!+CH-TOB&n@wbne#(=XKW-tzTU`tg67(#*8l#pwku=(nt9-0sJ8z+65 zH@Urh7L-wawvtbj9+WxM4pE(5A`5jYM2Kh8h=dMtg{BZJM2uONNmI zeGteuel4gK%x)k=%5~}ex-<-zHEPg+xXhe^Yd&UM z@*8_I<~|K~6GKi-=XZs9_=EU(PJb^DpAL0rgKpsbaj?3e_%sfhhQKIWltOY;u;MvD zCOnS?acXqBo=1Sx$S$3aM*>P*JWRrxBVll?DH7@af3L+LS>Db)3m2MYT< z74l%h2K+-=%@8rH{=|&DyfjUi=~76~ep7r9@vgaSr=l|$@tQI$Ha+nI)~LAZq-IC) z08&aJdI?6kfGe1X4PTlp-*dqFdfBX!RA%x#Tbb0Z8DraY>;EXt)PPgJ9vpK5t6%a|dc9M%;~0Kmnl53!PC4Sb1i>99rzJ(f#O zvzC=Ek9}3Twx4`6(JS?JKU8Fmy!;M7bIvPSR9*c6Fa1Ji9XaW$G{qzf_%?x1p#n{d z4BlDiS4TDtL$D}^#@i*E_#ra@0O|%=LEVVpdjw={rIV2c=Qesf**imz@Vk%V2VD$Z zp8SuIg%GC$q6J{mnMS}t>lDwqy!e^Dg~d6Z7swTr0(2H=hu$M4X>vfXxQ_Y?vqAtc zu6*R4Cup*U4GHQln*QLnbSXGibBpx2QeT5Z!WvEgYL$sw|4<4enZ!DMB@~(hYBZ~Q0`bWZpbF(%jGp5qbLXwE*AM+Ey?x;pbBO=BPmzU>xYIo>o&a6~(e6&*)5(&FVE4ny z(!rn6D=*?{*2>b#n+F*>@;2ty&a{i-8-mF3_>y3#1$K>CPqbYC1=ZWZ6Xfv+YK=LI z*_KoErk9~9yVPwjZKFoH>u&NI#a5FxuMXD#2V&#ThxUJZnE&(7KmYvm&p-eC|FHMJ z`u}va|L^<%8gsYTaPDprBS^78OcK=EA~YMd`Zg`YY;&>d(Y!GO3lX4liXJg~}WG zg#7%CXWyAshnh{njDG%~S6`Mg*5)&L`s=Qyt(LNaFE76j#(d^Z{jTpe0tuZ3L3-Ak zzVvyKOdHy|y1LS<2JG`bPl&VBE_J>2H)vPwx(7Yvb3fbSHI@A(f(5H13H^P(c0aLz za)~khfT9^KPeyL?cN9L3_9n)#;d&cmxe4vF=_~B@zn-}b^MjvZai1#Z{=RpU=Nue~ z&-4&CIjg>zqn=euoNCT&ecwfe?tK4Rze!cmE}abjkR0pteR=4@r+~d6bS=Y2VkK?ET#GBT8V}L1`dNT+;qN2#4!YQvbvL>$nY079|Bq z8%Ye7V7M}c^7M1ck^oT4WfFCS71DrLh1HkvAejx-GczG@Ev$4R*Q|Gvm28T49jJ1= zh9@!fGMCOf`JCX1*2-X1ok)kHXGS%_QFjDnig&JeRvYlOY6|qs@8e~U$pEhCF9Bo?|X!73R_akf5}$5UI0tO1xE0d>~tq{ z>A(x{q)*?hyiLTjuN$%1(>xaOR?L4!07}dDJi%Rl8hh(v!I8$q0xco193ny}qP$OCLE???~=U!iun8L}?l{~~pSOg8$c0m&q10fu>G zXX3*g6RR)bwMZWrsDMhUJoLmnxEi7Mn@q`LWbIT9jLQ}~(yh5{p7r-$yLO|B6Q2r^ zM6>3TPODQH4M-w|pfmb7GFDQyd%aY_BstauAC&x3>R35rVV)~}BI#ey%=P;(h&G8k z3Gl$*IE0Q%ad&^H=WR=MrB4R-OBW943S!B3Aj~g?gf%O)DGpxSk=)la;dU@PvWqtL z$0qitYxco1LdI`y#)Glg7bcNx|$3ih2OZFzv7(But zm>|`NI?GWM+lt7i(!nI>?&WX17CoSxpdN_=8X^vunF|Ve2iQ}Ys@O8Miu$KCf_uVVc}0N`RSv-V z3I1k)`hmOteYA2BzGscvEgCgY33i623o(V(E;_$W=vQhKl+EG5-^a_=J#0jnC)#o} z&JG%hIeVn2$Emyr$9HtC>N(kT;Dt<3V1NT1^HeG%?_EVlkwfk972sSl8n+8cU5rEU zY)L*;tzHI40bk^BVZnBqDDEW?<(e2(Wu zqOy->XH|Yena~wGnOewjx5oQCK%^V1hiZ!BRc{UM+ zV(pfS!I|_7&WlnDal$_#eqcsxVVgp8z2(ngCH~&h{goMooQbf>=wbQbb-4TnX0s08ZtBsoK1017)d&r zk$59KGF8X#m75~~P>Gp*v ze-M-~Kiy~m^#fK8281ANoGT6m+*KvmG0KR4L^OV`NS$~zUeTGT3MhfpA_COI!nT z!Pf|n^zD}WQ(S~I5MG(T*?AWZ&$v4ZPHc_&%{m#rhPbbjS3}!Ny1E%D^QK$GI!@vB zS$nIfyN7!7+p0(c?Hy&FXZwv;gcHWOD7j>`_yoRCN?x+ojAdmzx=$BDcCU=vA8?z` zcLx*J0nS0`W}~JL`LM{eaGFR{PZuiW*-Qryvs_YOMFwCBpukUb1CwQ=?D&Qqa*cNB zZn(gId+mrB?IgD*o})V(>WHeoe;z6P_m2x?{>G2rrwiAu?Cz~V`%t;6Y$*-{<>ZG0 zTk*+c-l0(|8TjqCA5prEQav)ql-p3AgBClx&Mr|r=ScbHA@PS^JVVFM>flp04fg@` z?ow#dP;_4xjgmq@WxwSAP2E;%JtQUZ;+NkAgRl4KSQjznp$Ne#}ui zl;RK5?^f=P(=F|HSK1!V2w{F^5B4tzEhL{L<6gG8+5PxFE~~zR843A)U&e;MjyBG` z!#@o1PWCWu-rn{dC-YrqAKdc6*!SHQYC`@AkjJiu!Clss>;j0tG$C?eJ;GL zT`#k@yCvw0gk8@?897Iz~05uN3Hmp{vbQDUEuM@NO7e>6#K3|}GV`UKxg zUuB@E)wb22L7i({)NNgA+|<1al4@lT)Hc;ug08*=TIKHvOs{<3P?X!O`nK2&m6GuI z*ouyckT2R8{X9cdkq!}CXqJmqa@#s6dIoFYc+n9^)N6ySnvv&tD3Ebd{8z{X;7mL&`^szRNlJ z-fvf$cBKu~N9-fZ1^9UU{+d8p0wt2!XjD>7F0;3r(sw@2HV~teM zh#F<<+bku`P|(#2K^huUt2P(FSz;gDWjxC(&nHmDJaK-ZC$4Kii>SHUpe(oskqtPQ z!>ekk7cVGzFIVcH(yKAI4YMrE9kEo7%w~#f;a6=Xw|2SZMEin{RW<=9xWS&TfLQb@ zmXMvOcPbR|(7UOl4#I6MFOV{G;C(Fr1<=G!Ic*>a*`ts1kj_b2)~BSfXG-e86D$*O zZBepc8AHv&opv0LRxxgvzq!4|Suc5|^GmiaSGtbGWj;r32IgyrF|GKnibm^P5`^2} z6=gEMcZC(zS^tjjLfX|^^!e=#Z;aqt1JVhE^jAy@Ggl=Y_>jApKi00eJ~m4-DHH%>j}%Yi z%k(=QV7x z6Y)HG)gtuci3v@5W#0r&Ag99&NLc6`VH|5fz_t>0IIP1guFh-}N1eChFLdUDXt-X` z^zpTbtguD!QVd6QW$z9YU==}g?GLgeiRTJDyryyIrM)1Ht6IBGg}~CM#FWt<)FVPu z#H7T8`$1pLf>1Zd3>Vu1K$SNsw4MqrE&v0_j z2E8gU+k~E1N1NfA*ED+Q%&cLV3W1p(D!&1V5Xa#GJ~)Vl38n2l)2c>G&Q82Fksq>! z7~3#Z=L@ox4Uc6yw$ox%DybMc3ZB<8R+DMPBmO0Nq8N7UG{30K%yOxHdQL%gp+@A} z3qV2IFo=&CmM^;Cily~{GzpZvCo%u6u)diBZDHw|)Y6V$y^}LIVuh()=F(4{y!a{| zZcl=H)oM>8tKUQ;df#68OcGx(Nb=fW)Tlsrsvi^@L~seNiiHYd6`gY$26bVb9vM__$F@#}b*PeLsT6+CGra(QGy6br^`bY~_xOAr((^ zw#XJ4QoHyl9)%LVeD2Xi#P1)#6)D4~OE2t6pm;pMQP2h=UcD2Cdt$nqczYT#0qm|7 zb8ssz+=bO%lTCa)ObZf(u-p{d3*4j?r$RGtXNdcAUJxoGsOE{5c369EW}RBWeee<4 zC4zO2Wsd-uuO^o5Kil1PPRVWz`Lsv~I_!_N@Xe!=^5~9u+kMAEAPPyw)RfcX7TCTx z3fA-r^-I!AkMllPpYl->f>J@Fu+kTzh-k!ILjNKFlf?TVf@PLpcue*id_GT(ua%C1 zkSemwF^n?dS;rt}x$YQQXLnF{&onY=<`+3dw-ogw(HHEe2sBr&F3WR>jO{ywTuYib z7uF+c%v-o=n5q%5843%s)g9Og zhWmu0B*++o1l=;m-eVV*J9m%r*`eimJ};xQ8|Wr-tc-^kBV|ksM{+mn zW@&{OK|n;pQyEUglDHihG5QmdvHST{yTNWQ9|Mz&lAizi4%`>P)3ZVN6ZzFMcfpr0 zC_eT5rZ4pznxW!-IK^%~;vMIq$+w&5^@IA8p06k_4}fG;grE%mM&h(2IkdY2ybf^P z{(K<6aW)P-Abt^lNn*R6M74hde*U`J-~V}ds3MH_qWrQn#DC61Oz!(t^kC+&eCAgj zi4&Cvm)DDBlJ*H%t$%>{pPt?S{PWL0|NQgMKmR+*{@49KogF*8Hgt-a%-r0a+}u<* zO@lA3G`y`Z;ox;l+ifzp1tFB*{oo+WzCgstDg$=E#cUS9Y8JA)MGOYw=fR+Yc5#9K zfJyB2chc&h8P6ed^BrH)KwJ|+;~2ZUjW~Nq<=ydyho^YSJgfPA>?=aP#!P;Hu6~hv zpYDay*c0IOetaD5T?;D7RPF5O^R6G2v3IrhSvKi!Z8hcUZ|!Ui#GBY#j=8zlY;1)x zqVu_3_w(0mG<>~f-mDuu(W$+*xeK<(2GcxqdJE^S!~bei{Hj08dwqus?ha_k^G!L! zeheBk`23_8OF81Zvnq?XVdhwC z+L+D?^o1YsO|eFcYi=;5rY)$bR5B{u665q`(O)xi2Qxtnx-sW(%Dh_%HoyVQcPfR6 zfNG>038nPTI#pyTD`}nKi58Iyu24iTj}J%)q*YfMORzg~v(AbKaj+GYnzLN3KGVriMy`ty#T^Dn zK$KMOgyE9Xvm$S}7L10$KNuJVB4pcOuCFHBkxaw4B%=zinp;}*dtN6>s*eRUizqFAzAKh+!4y)t6!@*-8z%xWu#Q#2ir#(;-8ymKs^Zt}_?i1O}uN&%0zo zenR0bh}Ax9E>+kG3&t(VrPGbt{6bk&QBB|=Rq(M($Dpb=R!4uw6e%rj=OiAfZx4be zIiPe74hS`9$%7Oeyl)a;cDNuQAeGavF`AWd9B%0iD8&(Wlm5|-GK0#7g z3d2BvnV#g+m@?kHmgoa^cu<+dXDT0t!fmC&25{w<>Jg1(B!w7EW=SiV3{vGd&QEfU zo67o%Cl$0%tVMiZaPsONIGf0o#<;m-)DoR*4^e0?iOV6g*|Z{lI1Quz(gK2LBYHq| zF_Jj|D9I<3fkzflu0L2Uku_`>Alu5n^&}CUEOg7=;7emh8Y8Z8lI4mp7Kr4NqB^?vs~pELgy#_BP2`&5KhAhmhs;8V_K4dR zc8|hvDWvaAymL*rE&D2Pix_Lm_J7p&cH?y@2aKY!z9cCSmkf8~o3@CAA^>&NoUx^G zeX}L(SM#n3AEK^nz>f>ACW;5QCx!ftQ*mf$Q^A||`K(k1mzB{j zjNi_ShPiSXeIV&?ICcifz4I65nUaSQUdME?7CL8L0Se zoj8NdI;0*(dmk$cYdzkmF?x=>A-y%JzKKsJQB^^cVDUby;!T{c7@jzoJA|@JuV#g83r65@k4B{OcZ|bpc z19S!@Z|W&+NRJ+S)t_tEWLs0ir?8d!+@H;~bK;F72z_u2{I z5azna_mtX1Wq!>?Z>MZ2m!_?$-M6_{=AQ{HAq|Is+ z(iig-{eT(H@WM4NT9u`8@V@3aN#^*PyEUUZNSFA}q+0zQ!Us@e&rGpW_zxD5MhxIv zm{f8nKHJ`l_fYYwO~Xny@G-@5mF1ZpJm^}RUNa2%R9oo}%ygHO& zav4xzxW|?a?=+L0$o+^UZ{k2aE+MmrK%oOX&ESRfX0R6N)!7yV){ENdn}+Lssbi+c z+xSp8c*D)=8N^u#PJD9B+el5+CrVLZnq5ydbb6j^R86d2JqnU23imSf0>{EiS0KwJ zee>b-4vA6oROyt#vs)^svv2I0k~&?_og+!eGGxQ}=3x3YpU>z4Q^vPY2IRc-&2`}5 zWS%HweYbCOW1ab#(6HRPbNhnr7FRQ+TZCUlRot4vOcXy~X}}XG`)0+6d^`&F+EsoY zzS)cgxt9w+)NDVLZ*)7mYWMB63j3a-j!Sjw@O$|j_Evur&}yU0)Gv>z{U~!`dPBq2 zMHm0Z^He;*W>wt?W+ALC)z%K7+I^yRc6RhD?%b+wg#(=as7*IPAV&B}r!y8lK>G+_ z3r(SZ1j1b9aza4)mGnBWR@}(D!sWkxL+ui7X)05y#=pt(vH!u~v#VrP_#s7FC3L^R zt@Kk9!IT=R{03P14`>iD*8hRf*-#CW5QBXK0<8-cE#%bl-VU!dG%10VB_V~#eY5#R zZ&gVlxD_`!uus|;idY{4F@Q!B=zTt9pt`74TDg4bkDJ^wvqD*q#e#5JTV>(4NamMA z1ZD^*%@X&=*zmcwO)3OG{bnCqwj|J7_ZG4=@{fb}T;ygyf&1RcuDEx9{d_6@;5N*! zRB?6R;}zf&;Nu!>QZ8)F{W|)xoI!Cm?C1os+l7HgtS|<<^LG=uG87Kgu`7q$wNzlW zj<_ukqZ?reP4=l}bM0+VIy$IWoWqpq&DxSd%UXJ4vVH6Ai$nYN-#Yjb#KSxAZ_@QX zjmg^O_W1ew8hYLB{MnCxeThfh-RNrjxmA8puYhnzxWktsNv#|%m7L-(~ zLcBxwAnfmgyo>+b-rIi$`u0ZMm3)(QlXwa%(yZSlUHIrZx9vakC#h?U{!b^1fByOB z|8(R3W&eN1?tkw8@8)f65WBZmoy;*vC+ev*qG^+%LOM;4D*z>@h{~`K5k<`r{}v%0 z)(V;clSu&Tfao~RDI3?v+&dB_5CZuFg5o2GU|d%Dx6aEVEsAb4DiCVfp|!HK^6y7w zrMCtSs)-z+?bW}>zg+Ck`D`%h&YLF1pWLrt?>???hr2=~mESfkEj>LoO}N<}Rmrxw z>svnFOWVz@Et}h$n~NJ9So8Wzd*=56u8mDyUD1RnZ}r}ftF;Ojey^)Fx*pkfiS>~p zHRlvNn;Sh9x^JJeGud7~$pW05d;WwZ-)5GSs5SY!KQp$|nh}EMg>QO{Ha%!xI8l?~ znq7Vsn6sk`upq;Iy@5!Uco)rBmS{HG-CU#E!<>$9&sUM!vCgZ^=|WDGg3_9q$@jqqH!SjQqgd`SAi)h&LmK+oGew)~R=(UU5GcW4!eA_?zkaUPc z(oVaOvnhGXP?M3Cezk31qvytI-n!BIiO_bv;7JfJc4oUhSn|?ngw&xjOcWQ+Yqr6C zWWNs}LFdy;0q+?5RUbkL+aq;Ys$RJ-AXz%FXETThc?3>Bkm{Ta+Rt-wx3M&Gd{t295 z0fT{YUC@|S+gN6DH>@rUL|YA49q%|@G~p`)eP1C|Z~z9Yf&I;L_RPO(aummJZZn#3 zx`-PVCkhd;RG=-X<&3?wMy!A?OK3(FB62rMlwC^IPiaMR$rS#+K%=vfI-al1&0Z4Z zr-IC+QIeRC;u?XY;SF5i_Kd4`)BU1Ca)~kliL6W1JNd>M7S@;9p6~du3?Et8x@;#V z%o{-XcRH@6wX0o04oI2KeKaK14GQw(34#nHiI^3ypn#Is;@-tGuZmqo7dze7HwAiF zj{zM2Oxi0iO&(h!cC5X!65n`qtX?BNH7*6ag+-JG4V2v{2u4q!o%$J7C6p%vSxlRa zM@g|J;($_iCgxd_>f}5phPTCjG>dW)o>TOcD=1$Vb*oa0{B8=KCs@< zez1OTKJ`JG0|+yXu?<)31GkA5uoGkxUP0O(Taq-HVYaAM%I8sjC0Ap*W#QzN2YZrt}U9XJQFXr*NTq~FxD9XoqMZQ zJ~&-0L$iJ@f-jzi#>xnc)ODW>U(4e5_mIIWKVp$u-Og#Lu32MS!mBM%y(n*?vHq3v z>$GzKiqi4si>IJWsR?hwVTNd!ZE%97Y%r9}!q&23;Rb+w`pe~s>Um0M{UL*kbqU2% z1lurc(6!$%9tOY7^a~%sc`Y|AD1u2ZLTsr~)Dz8NlV)P(n~QL%9@$tW8eg~vWoQq? zeJ{8P1GLE$$72@FWxtrQ%OfL$Bk&Vq-@-P~(iQQVs4^ra4ocaQ&RcI|_+)W8^Jg7J zu&~d5#{g1#Y~MpXEubV!=h$NoCF(IJRr$WCUE^C6k=%DXAU3}SNwAXP%tUE)6fa{& zs{*)%()OfMIbLVk)3Xk>{$$2Dwe^r}GcWx{R#s*Jv>HFe6~xf%erMkFS0UYWNCCcw z5`)p;yANEYuorOvqPSYHFFmn+hp4PHAR=+!amUCQT{+eKw`*$#@dAgi2ZAznaQt8B z^8 zSIN~srp$)rt^GxGvPC$C?v(EuSZ@$3G5qZ^No*vQq1^QG6#awQwAk=rG@lQ0)JJjw`c#8S#BqV9M>E9vzP(46e?g2)xr3Z#H(&<_5pxahA$xA=t z6?0jnm_>6^tc@L))YPTJ>>e7M9jqrD#G?~*1}am;fHfvNZ2B6bM6vxjv3h5@4++)_ zBD1X;(?K8gB!||1NTcVlvtZ7^h36qmBKhQN>*jvpfZ3Nt-ve~(0MuEnNTjQ{_Tf82 z5(o+z%REnQS_6P;_{9R0n@7prp%X=sY8_Hh*g&M@7GvF#mtzlPEw_i1AVZE58*m%c( z%xL`Lq79!HRcyL>$$DjJjVd*7I9|NkEncT31XNw52t3K(3n-eb?4-l#NEE zoix&PLB_GaJ{|2ZO5I!vex>|`6dMgsWEB)^kc%`+jde)|n-z&x4U-}ET!#EtfAbL^OzMse9b!B?az47G&nb56@KK@|Qf6Q@ldN!d z5=RAw&~4Pv<5qfa(=?~+V9Yqo1Qca;$V1HBhHcQ&M*4wys2fPqtXP?2u>)S#f)asK z^fTTgN`X5!&Lgt#`rI>ElOr64Dyf#J$xL%zy{tYnU@%#xX!rakZGQz){YrGeyK zek^%%EXL1|XRhG9qDjp6#q7^o)>_^YwO}Sz7~&6xd+l?aRwbu0e%54fpx*biquFm?>mn>|6HLTXW{Dp ztL~4j`bAXI0q6Be7=v>Ljas0(A@t%=?+f_e9>GVDAMmgJ0mj$(`@X{q!2!4Q^M)`5 zlpQ-V2YQ?Zb3QD#;isLiIe{(Sx2M_Q@IIbx-rb+$;GrIG$qi|SO?O0uSI^9263K;~ z;P^Yj1A%wKG(M-<|MYwEpMU=O=b!%`K;i#O{*Ol=L$0&1*uBo)@U-`sV)!Kx%h?cQ z%QVUb9IpTP5Ye4vstw~1os!y4|ytf4dbwk z!ak!SLO8eF=iv_Go>2>sf4?P=JIU?4#9W#2m$E=Ft2koe-PXcW3z}b5B>~{gSZu#` z%x2rebuV>MY0Gr&JtUQ%A+_tm6x4jLQ>N-FkcMz0!oK$WV0pxg;HYzy#*50=uxa)h zV*AVLvNx{i?xQbP3is#E>IgEx4rT;bHeGX0&&$%<6`S||1CNK2LC@!7XKEQjDDO-< z2}=&f^c?oKkkW1DnvNp*P1VFSi*5R=l=v)zi^q=LH%nzLV<|hII%ukh%ApH)J`vb2 zgt?T2`i%rT!6P-Yn4*wRPF@`y94M{S;+Z!FYYppoJ+wmB=met6$SN@)nS=&U)@|V} z>W0Pv*2o;Ck0%Goz_@b~=65MHIyO;^^cWY7NLi##@c9+4x<^turU&lI8}l=cyZTE^F`1u2S@Hb{!|VVh{4QxiGa>{F@H3J zAT2f#@_zVwHOzj?Mg-)b6mb?{p$UTrk-nlfq$O25S%4MSbM!nQ1i!g0*Ajkk>9CV+ z)*u#Ehf03O1aeu~7;2w>g@Ke?RFrah-S~)wneng0A{MHGDK^oITMyieDh5J?%Br*U zcnTssEC%ZYAkIuYeF%|r3?U5&89C@eFU0g@yhC0s3L>Hbjhx>Y6X6a=2Roiap41`x zIJTUQdYEr`843;I2^)1_#*ac(#chuOI|DnqVwOD1*dOV~`az4bGMyS!m{?eLJ|lza zCg5CLDxBy7sPOqCED4{Id|@SrZ#d_m*IsEHXbDW5JBT|w2_{`rD;9f!Xb%opfl$-u zFY>rwj!@6o@Pc^W%G-k@5qlZTl-xwz5l{i$mDQI$@Jx}Laj1FXddsA&X|S zOvMXuDu(`inn;=&-dYEAa4-=>)G5}81KqH!ysdIYfQ-TO7EfGRjg$%)J zy+18XK=Xy7BsS3~Gv$lU*cs3ZA#FGgWvlu($iQ~<98)K2%F#Ugpd3&iKlXiZ+(l}3 zS)Yi%a|5dpL5Ab7Je#G3h=?t<413ByN5O>a1jR8nmZQv-$+1`TP9Fnh66>mJ>XS?#l{Sewya|WO?>C)Ajw8MYSHCQl z{eE3zd0RZadD z7Y8xnvEoXP4B^H61^U)zP z&@3HEzjA~|gB@x0oO+hW>A1k0i=JZ{ zJ(KrYkK>=Jm(J?jh_{I7*?Y0_;wYFXvS}4LBkS+P87a?dnlGYwW0w`6HFV^n4ld7& zVhX<3qO53qEt5&(|DZfAi7+e{vLk#KoK?==@IRBh}xU5Ow#PNA@lh0T%Mb+5XN{1G0+n5xfP= zcVggEbBN|yTE7d-?ssvVrZ?&{Jqlax=kfWm(lm5n533j8x6|cu%}r_sYcnWx$H73) z<7OG#yVv0X(?o?+h!+}X&sQC#|LJ~B5R(zs;*}ooHAshX81sUk9c=Jo6d-dxh{0XX>H+;S*y*y4E_D-sp025s zz8vDk#_)M`p^+=rM5%cO#^w&4L?>*_quO>X+-J)yr41BIQ)Lwh~52i|kE=?2W|*5`$vhV(*M18`Y~n z8@U-;R{``oaY!PgK2}AT8R$u;)EQvy`?<{-;vRTyrZTuf17 zlG6gHi^x<`&t*YH5G{!0j?1BPOMJjc4tL11x*M}csE zJHKw1S7!;ZMVHA>{Vk*UBL+fGXRKl3GOjRuK6vg#9qr6xW;Hv(glCT;c@HF`YtFc0 zr8%aBPq7q4RZM`$50v#TyFXwwrG0_;MFj%Ock#zX!%j)>D3@rIAt8t_0GKncD*Ncj zLV6B+un*MmrXvmxSm9!wO=49cBQerTiaqq4-s8dRmgwgygjPD+)6T`j#pIpwS-Cl> zY^Y>~WOpdS2MsnJdbjX*?CP}cOWW6B7_=Rkkv0bLmtt7Tbu{3`oP?GihmqR>kXP!= zK+q#};e6ZuX2R><>&XfDP3~2d_Q&*{@fVWsuvCWL$MgOBHBEKb>+-N zEp=9J_IE2}Vu=bZb?EL)FioONZPzz#m+1{}CNmTEza5JG^Uwe5$o`N1|E>S2|6i~E zadS0ua}6b=P-rDiEKJ6KAPEiP7EVs-FAPMN2LMmt^RLGUi#PmV@Bbmab3H--fP&LM z;P(3w_MVXBR4VN(t@H?mx&DC^C59hbQFd{0%TY?ZF|m=hNxixGwfGe3^)ilTvGv?S>6&Qjy`H?w-gaH7#oBS@+v)k6xx?kQZN1jxQ^xpr zZ})dfr`2fM%ytU9OKR5U=T%SZgn7=$?LJtqEd4NJ&Uq42Px{%g^7dDG4!>HKZKN&p zEGwONhk0-HuqpTNWwjr8Qug52FZ0y-HD1?$;`yl9$!9X-uTi>wf^tlUG3qw7LOU9qf% z3#KWefV@U24Kgg|IY3oa1yEd4m>+HcDQ7x!^+z+^MIsy@K#x>c6j*3xJ=OkZ7}HU! z!h_f42MQ!)LW9U6V0>|8LSs_qTKvoH$Kh^~W@20xTAnVmkvWMyrpwkx90FSF@Fc|h z0d-sOh-_a|t3Am3YzUl%q;fknk^O%nH%cwWhlqp-q&cUoc_>#9)IwX7!%gPGp|SM>BDTvF;*AUG`gZ4^WN8fhe{^!o2v6KevbF2W<=KpLuT!S~uT|f~jDo!|z;l zz>_0FUGhpO|5Tu=|4o^g;#t2_GKR4L01LFB(Ues5Z<#+h?oK_J>Zmv1G&dh}?+BLP zlSMd2s5Ks^`ddp(4b;Qq0j+8CMBzX(d=$=Ns($!BTn0F@wp9M7Zm)h1WVK_@EO$pL zZe?gb}7K#hqH5d1l|*IuxMGg$ArovAh$va3vQiB1GF@M^v6# zm?XMMPsJRVRvcpr#1xT+MKyn0GXJRk)IWRT>*cf@CM9FD2@jmHH zWSl`T;@?u>zoOzO2#b#q5G~ALht7bS5=@}@*iOup8yr7y#zgNPNJw=R_^@xafoN8)J^&DmV!SESd4b~#DgfoNO}0B>GPWQYO-b%j zmvo5W8GVWR`+!ONc*qXKjrJil%&zJKlJBH39NYC6n2=LGM5U%-+7k$*F0c!!Qv05{ z(l*2OHYMUGn2JKs5d-kO-^-j}Y}Vo5I7vr;x#5F|_Ll2J5mSyrGsL)|PbmrAcuQqq zs~Hh2)tM|}%hg3+g)qrVX{cnjcr2Akmn%?%VK&rW(EO+8F zP_7I)9`FTuVC0z+ExcG_1ZRsq{7}sImxwUR;hQw9t`JF@%Q|4av@*Rnk5p~_%`7w= zIV9GWLnfg{6%7{fUNq>+`04N<#L<@#x+nOAs)<(N5 zmuQVaoTW#(sPeh(#SKfKqJgrs$W6h`@MkBSv61OWMyvUrQN8cP-vq1DS20MEn~Aq7 z?3v}&O~641LzY@~#*a?#leNMLE5NYOcP7qj6-=!zgYx0l0`OB_?9Yiox0A(nl49+M z@!1*>vOJPKnOI;?Y@&WCF_W*lz|`QB3BfGp3CP7wbRKO2AAQeXDc0C5Uck^&fz&uT zy3XU#zUFZ}8UI*>tk)H#+F6IbDMIUU22%oY5a4;DE(#P}m&>Wki8GY+qLd{Q)9ojB zQMB>NX5;Q}CkhF|lK`j0>zu>!^{m)~q07GUE>J%UWFxyeB-F?Ir)U>tbz8*oN%o~+ zg|Wt?vzAhPKr)fWw{YK1AwX_#qjwOSCoS263XlL1H<1Q_6JYOWy<$R{CazROQgKgT zP)2L302^+&!a3#adLwV^GftP3)9_!1gD{8h{_;Nqxyy}!+M{wHj0?Ez?A4YCmv6J^ z?E*AojwC;}v1_RoX*q6H75RcmPss-@BGxQR(DMBL(c%UL0(^aAji)22Rh+X(=Pt0aW(5_KsPNhIQ zs|Jf%QpJd=1NBYOTLS0;x9ZLhfp90cI}exA=^)0QU&gx>WyBP$ImT*2sv(KY0&{So z=Mi_pKJN@=fZ~LO-M>?AYYES|BOOyI8g%2HZI&D*IhkN6w_XD^S`yNXmrS{3DslSJ zrqgal?0>FHVz(27w{k$L&j0b$h|m(|sYZ*t0z#qW$dR`0PZc+lPE!WQHqO2c1s^yC zxyee^g$tF=G;dKP+KVY>$>^I8r&Ke7SGo#t2k+!C$gQ z+S{5_HX774+LNTBB-VkvR1Sb|U+3$BK*L1hfQMvC)*Xye!BSsxuNXZ|^wx6(BB^yC z4im=HbK@48YI}iiO)#i>@*EM9EEA=katUk(*U1DSy|bFY43R5DIFQW=BUCXS=t-=s zFaoXLQ(Y?F&~|K{LHWMldlUeG+i`vyogZ87RQv;;p09o=X(+#CTG8LxLD3J~@x7|o z?P1Ij*Cv?KME``vQx|^}_CB%t2-FPVLt8#HF1wdH9ZyP2DwdG5%Qubs8>7UMFNivy zjZBb79HoAeQzzoUm|n8o^2uL;ItHyryfJHXU3y9AJN1LRQN%T}!9gGeBO7xZ81_kZ z#4LkSr}$2kcNU&#I7zHRdDN9>U*r~80r0J!hF_!fVMTQoqIobKm3R6sM4o}^XAS?e zIG6r+wTA@G?C2af%gD3WWwQ)-OHnFTjcbyg2Um#K`UrL6Y;Di|B5OA>n#+OYVQBKn zOI@7L56|;`E$JjJPb&yoMp^c6Iy*njV0tG0KAfKK4WIXO$ge&-jsCs^`a4F&ZMrJe z+Kt)U(^KBk57KCh9F}XxH1eOXLGFTI-}m=m?hzw9L+lCzc#1FqIbciwUnPgC&oDgM zICjlkw&ikPdS4F^vlBO81iQ>ScNw{zxfwLM`gk&j_9mL#Z*sNnQ{53WjBj?uraTe2 zMqA6bIZeIexX74qdv}n=c46FyB&Hh_g}h9v8yJy&EubL%`!AyxuJ`w0>FKvwF)?s4 z@Xs)91uCVR8=UL=y${~kk#E0W^q0rGbF8ALb0zIl9@cuOXvH$jQ{hxpS`RD&J*%1Fb z{{LV9|Lx7>`n-&o=`D4#*jOMgKh#-R_$Mmn%U}kED;G;9s|kak3d1xL0s;a>%nh#b z_d~~dgT%i9LFjrIWbk=)HCb^cRzI6Pxwjx49`o!(Lcpw4);9W>v8W}_x6)<~nYv9-GGdfx4h&d#&0 zq;**CZg&3O^w_X-m2=P4ER-;qXl%x|j`kDja&=Z(L)&sWy_j%JryAFA>t_1-` zH`S42nlvrCN@Q5HXCrGWW@-A!f`>5Z<3_)VKbB_$Q+jPj7zDc^7vJmGL=^%E$)Y%K z>Q9F>&K)+ItH2XV)UsnKww8+t%MDpFF(9ugNuz}+8#MhC)1_WIBg)Pl3?&X?%RFj?6Q-*r!u1r9tSC7Kfo@X)iMn;{T&8vMkUgR0s0I? zt$(>*35O5Ha6nb^XB#eyTNY`B@Y|;V+(?PkHw@TESE5CuP?3o&R@zVAiKML)&|PL2 z^#^sv0kI6#w>`+zbkJeSEF%Y)%oh~PfW|oDsQ)LDrK1>F^09##rt~(-{bzhergim~ORWpVx)QH$;|Nutli2mI7?4 zf<>n@$KQo+m(@g;T8jXqOZ$$&S|E|t!~mp1C9;PUA6%F>O{dMtGC^`eUD)QGbK(lR$iloHaC0crO~Go+U4lS??tbf0fW>p$TwD>0XVrdt!S;J%$?6R(#_ zFVB`ew_W26e5T+KYT(JaGdT40C%05Tx+rk*R3^?XK~t->SUMw<-!^W5ga+hbSzm?< z*T^i~64RC~AwHhB>z56f3?Sw032R-Op1j-geqgB8J6?pjeImBI6xJls-hR6l9 zWp0dz2jmJ96#-45&Z2NXGHKJEO0j14Xb6=Hs3<)|b!64$oGj3cNA*`MH@8tvVdhHi zmx1HS!P=;z3d(X}F-Srh+9KARkJzWMU~;p%u-e2OGS*cPC@^Ih%LOeIn9}U#j?L08 zf)xLPj&?)e?LSCsK9a5*Qm+M#`{jPOjM0x4SFBx~G))$f>6x__>{lQJodMN(Uk#n= z6+L=t7sd(D0Dwn2XddG;2wO0DC`E#iJBTr5d(PfvV_Evs!c2^eU=q*7@{uSuSrFBL zJW)6pZr($RcLKD36K*|?EXO-_I%g?efq!zzdYW14g9Fxb*;Y$Vi90s5PkieCQk5-= zr48zlFEOT}GcFKY-{Aes4#M4oYGJV7P1{B&)COtN&!VDjiG&{1PGsb?IZVA;h%|6! z#7uJnAt#NL;jWOph;beG+%MhXbL0%t2Ae(837C?aJzr&BwxqyxgM7SFpCWH=8LG0s z#K?{tqM0(J=*2^slUX9m*nwYBTwb)48BZNol|kE=x-=e8t~e&32i`n)H&wt zcq2O8fAl1F*AcN#;}v+khJnM^8u<<4WIN~EZZ+e&W{M3tO6%zzfQ9Ux1c(C;e@LPK zI5G@9C~WNklq{=(ZUy4+tqe&KIe&1mMx6>xUK4lBC{W+q77!lfXh78Fwu*X>hqUrS zs)H@_E2Oq8p!m(lDRd^|X=^!xy3lEXn?XS@W&;N>m_b+&E>$SA{l@9ed({mZN1kd3 z$m-&4Qx}Bk`l3``0&a2{x!I;CJQ-n>mIYeoNlZ3oa*#WpXWu*KSIGj$pNBFLns7xv z0{9W*{I#ibkWqDlGGc%*?AnDId#%T;E|p)up9whnBB&3nuwOYa{BH$~m7wj9p~}72 zp9>N_>vxnC%NLU%GQX1X!SH)XCyzxpB+{6;xsY+B!pq;hA-~$HR?8Zn=BAD&j_puf z0E^U~&W5G~#4Eht?xM>3NWA1w=JNcqOZ=~0NW=o(_FuoPQ=1UK%kA#p1N*F>B4w{h zRz@x94eF+x3hK^HN6Mx>>58A7gE2fiYhUNnpCGwbR@czmp4OK8AJ-o>EteZxTNsj0 zn-$T8of)^=0Vknv7=2lC%K!Em>7Rf8`RAX1{=Y^G;s1{RwRY@K#!&L^uX?=PUT=1+ z$og3Z&=V`+&e56`m)4QD^_K`Sz$=b=R1ZtZne+K2G*u|l}-4xxISO%Xmd1s@{?6rISd|2I$CAdrEB>{w8*v*yL&=kOG-vWtWtHgO2MsA z)AGBoC=>Ij^BTeS=CquQ4Lsh5Baoz=oSYt6IU4H$8P=}00Z~W$G^U| zCnqNxNRS!Yy1TtEmM14Ksi;^rh8cOge?BBDIr;of+osC971ge!CU2TvMiAC)J_l#p zzArY#BKw&xMr-6a6}9_l>|QIapePw%otxw@-S`~j+&V9QMs4CjI--2$M?}|B@T`4t zd-}+HZk4d|L#g<-seRt>`>MuxTXfa`dOeJQXJzGafws1K_7=^QFUcq~`o=-wW8ck{ zPPx-a9yhxO8QIZ50TClM&8Ip*L;6k0B{4Jwsl+&3CoW^Ps^!T<#IB)vTIPd-; zSJ!FA@bI!$S~w#pe+t2gUOAQ|d-A*XtX9K4cWJ9dqpA(dn?K&nFkMT@R$x~bP zB$6ru>(oD^F>|$l>an>KgCf)`v$w7h#PJ&bO zQlX_kd5`HSf;Itkmw zJ5x0BQ{ac1jzn?2KV4Gu2S)1m@)xZBjJPid1Vvhdm{L!-$NfA8+O9@dv&rW9Q@KTt z%k5{zjaIO;a#7jJ28LRxlUfSq*%eWDi&q;A7=F2>4v0L4pLN7idkugY(})WsV8u-m z4s3@OIKPaW&T(sz+%WMXZ>g8F2;5vCU<=w;Ln@BI`j9Q4KuV}~XdiU>TYAvOa zUa+Y`7q%y8OTGa#LMbEI(d%bx)hCR8z=s<@Lpdl5PW_^b!#ob<9%MMsbBt&tei4jj zh5yzgraypP1-+&`<-i&brX^&iRbpD9H64_u$29S(kbsqQio!s1D+~|iJd(k3p-f{m zp*b;KhyzFYAAhh&nu#vR3U)Ms*Ff%hT?|K?$;Ok7zt#*^k`ENGa!277125q5Gsu5H zV+6+s@Ev<;$7@LfDjo2fss79e#h0-}LJp;qC`p^h>s>sv41Fj5hn&~0?x^8 z7yyEQnsiDAB_{SluuG3hh)d_a<1C8>o{bk%w*-zRl-bt`9PtDmBbu=!$3$f&G90~2 zcg9R+4c;v>5rj}Bx*jlN_^zyUe7X$BN%!R}%rli2oTeOOkRl?JPumXQT&K6dXF)Qvx!~tVoYCkHa|9L}rtk83>hL zzU5+^WiC!BnI{$CE5gSlWsE-L&o|T*!gOT%h#52l$Cbvungq+to_7IkL{TU0j!9Py z8+2xF!8Z|Bh>Z(BTxT~ICO;`$h>Z%Zw}DMq{?<;1ku+7K-4=vv)v%7AlIJQ{fcLUn zISZpDMoi1>VCi-gR4T>`>kFJ_5A@3i@p$y7{YxSn=s%!Y80m;mIzdL9 zY^qEeJopG}*M&%=c0;K|ujducn8Zxuga!u~KzO*1WX}Ircur|qsUa!wkxP(#zZ^PS zh?t={nIRTOID0LqVW%?$A}3c&*HS-$FcgXAg-Q&E(I0l3HiI1VFNH(oKyCmcNH|be zSbFntT?lgME=-c)q)0MnQSY@bIPbdM%AiKR#MB6Gx^I7y1{59wn@$aT2Ge-s6JP?q zd0;k^Kruo%#68H>eAy=Ri=Rd%I)j9i-58Og{?_Av{2|@Br(a^0deCfZQc5VpiJyLrnHc*jZIWu3%m8iRcuYJ3>Rh&N=<(U z4vnWv#ArmZK&Pat1(e}fwYS_&yv{-D(7Drh$U?l+=_UQy*dlp385x-kJdio1&7dis zH(aJLMtN!?N_hZq;H#lY^O@{uZ%ra$i5n5L<3YCSxU~^Q$Kq&0B`t3aO{F~h^c4rp z6-S)s!j*PZBuX0J;`MRdy65pIS2_Koego}u`&={->xu4Vgwq@&Y%I-4vcLrNi~Iy6 z7K(8#W?jqmx#00@scZvL*pt^il-oi+3aeza?A7CJ{rokeJwp^*J}~konkGsh0H=|b z%vSBs2|Qb86vRMpCZ()%ijNkNm~z&Ud+7yhxNdW$tr#;el=6I6R7pvD2W;Y6UMhe#MLN1~9h?bs~et zUH;9U7=Q^iF1h1TKWPcLHy7O1vnH*z;J5P$NgVdX6_sZ7c@Z@XWnwa9P z90Y28`B@AM>G4T1?^~Dc84dk81=aCmc?^D$^`G8Fwvw zl0i&-;mlQJagsE!S@aWWCN6Koh9?j3nJT4mTLl{&y3z=F+5L(kysf z{)t9~#89;Rd5W>wTSnr9(uF?p{*&>CBbQsc7~HfQE-2=pa}&JD`CZRb_Oj^h36B}M zu-oZR2@SIm+@~6N2|zfpn9E-|h_&vV^Q}%}QNpcICKTe^)y78p%pu5QgOQDrhA<)M z2TD``_wagxhQ}Dg84>IZo+j6S*WLBvA|TJolm|<&jP)q)YSm`ZWP@ zUcwADhMkKR?8eMsOq!qBs=Qw@h3Jk7X}br`)c6uYG%wAMLl{}2;RznOEl25x>`d4h z3;FUGN-^Tj*%HaZ^0Fr&lM9WGTZWUKF&2R#4kg50C?X|8*+>P76{(~Q?a4k0{7W0w z2}6d$I-hWqIBvrfsmG7sI@MX(cPWW|z>F}qPhuU-@gAj}9Gb(7pkw@osu-%VqV<#z z;Zdf*smqF$-Vmgr4|?L&I&SO634J---HT`4FpFp2cYm}9N3E>Fmd8izV7R>%+u+OIKZbFb>(o7WX7uz zCdkgGlQ@c$UojPtSJHr#Utya=j36YXr8aOlgDrgeHA3AIpM9 z6Jnh1!wm;VbJ>6j&bZVyPicS$g!LD4pUHGZ*OSJYkLk3HrTbL@SBeWiGY=wEgI3SN z|Hv8XD}rfLGmwp?wKqIxW7Et7!vI=5#da~UoqviZECF)ZIK=0bXhEAxF&Ow=wa&4l zN!W^Y6>agG8d^~PS=m-KKQho?F@i09Q>yxv?|<4qLWCakR#y?^5u!FRop&ZCQRYWd zf-~zzC#v|nANl!8Q21ab(+DKjMNr$x8W0fQdqhT3F{zFAh0vjxgw7OFCUV2uJ<36| z8PLAD+F&Q}9A1^44k>4Z?pHY$l!IF*n&GOUQh-&?Yr29UpoJ`bNN#@TUn0A&2_?|y z5S-RAVa|f9H^g;{J4C9$L~9mAq2Fm*c>5B{fhjdh1e#|K z=Ho|NXI0Y}I|3;WOp&jsLkr#`;7(&S(mqR)!R^w3^%xgDb8-93Tucj3=l(4IZLaJw z+brM9b;Y&3kutCNSiKNS$!k73)vLMCr`0L~@rj$pLu;QU>>W~f#=rcVK0q_d<{?9Imb=`zozfJ9b$dWK^gLXG|lEyyDI zs6;PRg9K6(=$1huNVkmmSuz)8xI{X%*?W-UD4r$Ic;)Y}cMjh^amtciLr0%p{vM`s z3J>FlDT{PPL6o9Rdc42<1(DiYv5{U#Vozaf9>BQHi2@>OSZ$HWUru1MjK zDIU>3kWMgS+MyxxD9k@nINWjiy(=jAcYI^vul}X|?M?RYVU?{IU*ONiWYlnwb&vYS z-E#-wLJ?mej=aino&Mc={h*R!qtKauSz{7eQjfeVSDnOPY`q}m_9dzVy&-7GM57K3 zLKdb8IF^wF&6DX5Xmbr~7l5n^LFRxej$4uImpnQVSv2tO5+MLGR^+v~8f57TZ~9ZW z2oKXO7k9f5^J0Nav$|MabL`X<4LSduGE)jYv=(h4V4U9}BjUx2#6f8^Fuk0&z8ygA z$u>O{GHzJw>Iw@%K8#K4^GU5^NavEltjR26|D|1@UKl&)>rI=4Dc*!VTobc5HrCVg zGXIL?bD~trDRHCA>2Y?wCag`bkVI9Zt2xXI7jUVZ_h*|g^|Ak+y3_j{U3xmI>X|mW z*nGZREBoCNdT;84$K?$PE4o0t`(>^^pL#)Q0eBU<^9K0gGWjJAFH+`$D;Kgi8&<$x zvt2|h4a=3l5g|piUsEoHHCO^dy?v2jt0cj1zTmNvI}Vz9wz^$9gCElqCoB9LVa zHBBy?+d|15b|{IS8CojeAsS@LUMwl@fVq>);SgjupvB023-~}0?uUkUu%^cUg|U5* zOiF4BU(lyLtW0VjSy>`hF3s~Unl>uxY$&q?bWuQwC;ZwyE_iBe;NhOcIcREMYaV}U zs-p7yB4v*+E=u(x^Sbi$6>r1AiYz7PYp>R~5O2HZbA+fXNmQ>o%6f-_rx9sk?)Lg+ zmF9)DX87C(dEsmz=+^v;;pS#nC+-`pvG<4ds`mEqZXif7a5AX(=0^U-&D*SqT?-#+ zN5(g`2E6u@`a{d4{^)zv>@sUa#W?ZnD^(%cJW1@YPQ)X{vx>7`>_KhR>P)v=AA7hV zMcKDQ2l?n@y0JKblH`$_c5Rfyc$`-jQo-DQgEaZcVQJKTsoo~3z|;5r3Y$_3y4Xzv z^Ez_e*!Nv0Z`8Zu4f~X@{Zhb^81YhPB#kQyC%GOQOg~1typ2`zpRSM5G1}}b(9#e6 z?8y0TkFLI12kRFkOc8jpFu>WALuu)9iyCj~PtFS_k8We*1*D7RwkdJ!Ih|MZie4tq zLuGrQ5J8Xvacyt-a4gyxay3b~N zd3Y!|e0W@bbZ&oqcL0XF{TU`^bhWiz8Iz|UJS)O4c?sm#n>sW^MQrKBS$F1jaz^L_ za!~neEC39MS$tc=j%d|#HhkUy2f#f!8uRvU4DjD<_5vJs?J!J zXml{izr(oaW%R{coO!m+RVH}>ryX!L_ZvUs6@}tE->&tgSNNE?(RgH$-j9FvSyx`3YZ3+S|YgdWgCG1*t#)m3S2NKj0u=woFK&n+RZQO`YO#TBX1354lEQ?{eNcIFFk)C*@ zWImCZpK1=)Qhou%z-~5&Oixpky_k*iX^e0P16$RZ#P&eJZ_-Ym5wUQwylekHGD zR~j)Nn-(mrr@21sEu#f_i4*XE8pwVb0= z!YmPan|%vPY6gBuh3>(X(sQF|16wtF3Mps#3t9Zo8on_DApZRDov1>IYd6s*B4xt* zy%FP{jN{*xaQt`^Tgeq5C4X>fF#RdlG-oe$N7zSAauBfnqXi&J^+FVF^B_&0RwKzj z&D*F9CDEN$V;ph-&H_ClH<~r;-~fB%4kQ8CuLZSNDkQb~;881|jwMQ0Mg55COw-Z? zC;yo!DDqI9j1jbRBNUE&(u$3Ney7eIXoHugv^3tVT0WS5B67PdN)(N402V=o6vC?K zz$ljt0L{06P-0I^?t*y(69#o1N{WM;U$5=nHyI8uf-?s&Z!o*giV$r`Mahyi3@+0H zQrSq7Y2qYv_3UX5aSbIz8i=FJ+AKel+MJFv3@RbF^peZQ9J)B>}Fl5>>oDmkFr_6RB$cl&p zC^ofHJZ`X{mXxxzobg=690SG{(UwLxydH@)h~(%MA6ur+LBHa!W7`OfUr4;DKmx>I zwfZieQNGG>FhYf~pFWc@BEc{dt&=4)XBCF1!^ls!`#N+SGe@`lgmI$&7^KOUrv3WX zNLZdhDuS~*Cw4V+k-lk=KGQ=k!%czPb&z=7V^0B{{yM2dg=%QZp_mao54Tn4jv<=a zHhb*C3EwD|_t0yukak;o&H;bwt#G_5m=!yi-w1T%-7CTo%{sa#2{Q<{=XF_fWTJ%= zB-lE}Ku&&oblJqGY7&%wp}KMMh4u~AdO)5;kTs&7TZ;eFVZOo9C<*0mBGe9GT#0Q_ zB*RD(knv>rbO4FhNId_9Av(+yXF;4|QOy)bwtZ5X4IbL-0Bi@Tt;&ZXpWu!uC7q>b z*pS3K6T4>s!4o@90#QHYR&`E96+4srG}S409<2t}1=$QH;mD)~YTLUqWtqR)F0BRQ z{(#*o2UfQ>YnG`lRR=Ow){p}0WW!g)5WGFif|E=70~Sp?OW-!YZb-D4%x>Db_sV#M zD?hwLd`Tm8;2;u#p=>Y7o_Egqxjr8*$+T%;sLr$gf*N=Q{^G2=(J@W}00lI~fwwLb z$IMP8l{;)CGwC7F3}cxP#@%>u2^=TUrd%vR+P5j=pk`&2x>Il(0))@U`H>}5Tmd-6 z5_naxteeK4Ft3K`xUBpo_i9;d3r_!`=Lyv)&aSY;UHvKsNnC-=T!t+ld&&0@F=WAP zcTUiCG-0*GEGm1ciD+xVicd=xj7Kz7O{8EX)Ja^I@dF^yu3p0^SFRE9x4 zn&PMT6>ldTut6&0=KUSr!?IfY24dynC)cPt(P2XMF0P6K+@cNrb`hGD$t>bUP|aQf zPsL?JQEB~3Y?44*V*et0M!L;x#6kuE735-RdN^?gf{@fdUNASJI<2vJLhl^L0r&+> z*mwtEfj(@Zxw1iyvrLX4z*jNd{wz44XF}>(yI(xe-7_c`S)on@oCju`z_xz23v1Kz z3yML^1A|c30VdJs@esJSBeyPJ7^<;+wNJ32p~#OwGXa>)B$BObPGDG2YcqQp{C3$7 zOJmr|qJh*_cc%h%9Oo>@*a`$Fyj&5Xl$OSej>1Labzn}&e1LaeJ(E(TGg#o}16syW zy-MU1he48_eS=Bhe6J{w*ufE>!xcjf0&;HiY;&#I@`09f?x;RGtj;eMZCdSs1{Xs= zf+z26h|b!8BGu>qC_h*LKAxp>=LA>}tijhcqoC^0!wXenq;zlHY)FvB*JL+Nfd^_u zh%beNe*ljX4!Pcu33)#Jw~`5Iz|q^zPqm33E@OB&h=u{WGs@+Uh{z@0-1}pk%Sun8 z=G#CueqW$Umhr>e>$64cZ;2q%;V4|>u-!)nU980nZ44C1P;HEak9vSdc5Q?Kt}T0J zcPQkK=nQfJ#b-buvCao5E1w1}lu)W#DlksFu%88r`DKu;6qg=ixcM;u96W%d%SEbE2kyp|}WnctAkz@&@tsRFX&wU>oTD z$-W94g)i^IKFfqTDo0aR1na@5y1!)P4>-I!NjB;K6Xt|LiaWq?R2l2-x~=u7f~p%s-D} zeRw2S*~}~7>G+TKE*CUfGf2WlpMB$c@QB{RjO#kkpR#fEt5p39E0I6ue&z#{!_e@<2iBW@fEKUICV{D4FOSECVY0; z2z=01DDxSheNIPCy4NGgZr60?4Uir~4B7e%C0^69ef(p3KC@{>hj(BjVQU(Yz}^a# zYr6sy6>RcT9HPOoTWcfM3n5rRMP?@LyTJ!wv8=trAij{X3mQlk_e?IIoj8h3z;AsW z$n0fW`0?Aj?r^qTu91H`-T>pnMCk;Lv*Dv{b!#^I-k+0B!|1y`bV47Ucc4J_Xf&~e zT47xC4gue`f&y9^@b#bSEwt3}1ne z#Bk69c2%33vvRL)#{s-u4Q6FsO!+tg^H|z#9-X>(2nNj29a5X2gNrkT3I%=CdW`mr zT2{A!aP34Q7;UeMqUKM+t0uHWw1kkjnY}1$(x_(OwjHgtSo(&=S?5oQKRv4CEXuJhvo<}vE&Qvx$@6$SmWbvZeTWJ1!2-bAu)y; zGD$GPC@K=kDR5yn+RM0|?SnWD=Y6mIPE~YPJnM9M-QKr1Nw~R-DK#{Ex-;!mt16{z zf@qh3*QHC}cWu;koz-RJqQG>dC_5qo=7+J5UX;wG#RSzlMz!#HFNX86ChUUl5Wc#g zp5B`C@Y3_a#z%>E+2iUtSXH7w=q;qA)hzIA{tnMGRk_^zU#Kjc?FGRPLRap*oY2Rz zX7o_<#VxW{NJaf!ZrI)WPFp>xVslF#oPUvULCDPsq%1itlnQVwI~VKnUyu{qj8@Sf}Y3-udz-2vUF)fN0(HN0ueACsf&b=|V!RF~UnfB*bgmA0m<%iHJq zqWDo>3nrJx)rYETrn7RtaPCCc;|STu{f*Y)+j!=6o)YCw9{8By3w^`2-wXEo=O#^N z&u;&PmHP+hrv6shYyVVl8GY38zn$v%=bwN6`RAX1{`u#hfByOBpa0(iLH^(O|Fx{O z$2@WmIJ~&J!n&46mP3#!CSwzjTTLWlmGq1wnTZq&RVGs&<(d7LgB?J-8sIBrHQ6b) z(75b8DGPbeS1zFUA|nN>#)>t8JZakl{d+^1^|DYieSb|(rZ;ppXf*L58$tORhi4?^9v}>JAHY00JWUGe>{FXoy*bE&d$jx zK{%bGJ2=6V^uyuQBfc?dgI zl-v5%B!un}eT3$T%Nml3M0&;^z>s0dk107t#cr_r;quOy(z$c(yYsXFGKy0&^%v(+ z{rTMXSfK40oTiAj!-uWCxS+;@Njiie^XYtPFP+{twAam56q3UL*Au3+$fMV}wIJtw;T~*sllK2O!a=ROah0m{k zrwo5P@u^j(@h`0Bt#Uh$g=a_Qs*OkDu;k4TT#EKy|54bdvgW6>O6I`e#ZqE-^Ttk~ zuiQ4E$_;@P*0Pj}$_l(LbC7N~3UW1{OA5@HdgT5`n%AAL-BQWXCvY)P;Me@+ADWmo z$9U8Ev!?uoIEJ}8H`iQoY}HEPY?K}#bA!y2dKNAB|U@jYc4o2&C5)A z@vWRsd0#H_u9dCe<4W2D{AwY1R?9hJ6B)b!3x$m=fEceHFNiEQKrX0ejlFg%Pq|Dj7c~~RR_K+4`X^ZD&F;OO zlY~Qur#&K_F_CA4!iu=HbQU)@+$Uw1Jbj51S8L%7!F%JStx%_}fx*HWn}&n4@HOn0^ufq^|JiR>0vrOoiq8r@lQf(IPgD_*Y49=W{XOc1>1)vjIwO64MO&Xh&8KO#$s(NFrhmKlMYj5wR+oz zBL7+TJl{|+8Fu=Mv1IUXoRBC9hY5EWG8sc-G5_7MV8j25eS7Q?1!$lI-L`Gpwr$(C zZQHhO+qP}@ZJW0_Z!*bFHk0|ZnY`KLKL4STbLvzr9}1d8sPV@WUb%nw4{JzY=pSVO z0ktS4)9QEn9rs%A_d6M*Ql2GeRnGaoFTU}0#0f`NuIj9sNz{kiB%RpRb2=2PT6MB7 zC_1Mq#gDp*cqh$R-q_?8EsZB@@uW z(#$CdNJJ@J_zwbrm&e5DilR53$P@Y>G32lH6``w0!C9wbEE;rXg&- z-QiXv^H(ioQ$9;T1p6&lE*wyK?0WN9j~Lkk>@9Xdc*7+AQ|)|9-0Hd&7ZH|tyrtc2 z+ZJNH819hjyEv5nxQ+HlP6D=x&OO?M0x<+4;9c1r%5s<@VS|i8nMJm`AAZoC-l`&c zT%;yuGNI$FlO0y1La~DhWUMq&sO+;tNgGHg%(LoxdE*T@li;s%rqIlzmYJk-+xvF6R&>j*1j#My~TZ$IM$lgM=Qf2kvj)$0Vc}fK& z=b_fGNBpO+pWc%WVrV{fQLV53aiHbCKnJ-qvIq!upOmKY8yhSMo<+c9G+0>sHixZI zwtNg&)=)wxI!)-(*vUi$&IojrkpZA6`5__FQOYq81ns0nqxPIKB038>1kF%lSczNF zc`w$HAHf(Ewo(*R2rKF)B(pU@>GoNWN8&ie17vunhS1=VLj0HyWJVuDI9?PBhdO&t z2DpR+jTGj0V!YFcv@g8=ZFH-H_)w-4+hu?jl1;n92xH-h;-Vfb2WXmVL(n0Mo(sBl z$Pt{p;psGy?_SzaWuT0Qql|XUl&nVM8h8$3ivu`gD^l1|hrEPfNjwn*cci)`rdl$O zR$NQX2o&{N2x*fF3RY=EpTupmaOC|;ov%#1BR9v3^rF|78p@ygZMlei>9-Dhr+rDK zm~RaJ@wII?@dA%?kqLo>x@!ki2;OMTPgp z!tlhP@so`CQi^NFB;nM=N-Q3QZlK+G3mTY#md>L+5V@xA`6~L7B0nu3(c(yi)6J}H_t>{qV@8xop;MgH^kbG)gsaSaHsiVud^gZ#Sr5i{h)*JS;N(h4EP{U zgkq=Tmipwk7z|6qsfB7g^9)ecQ#kEI`Pc2O0(R_Qv^gfXXzzqtYi80r?dv2V7gs2T=Oe-=Aj!oC2OQbGSP2QC&!Am}&1O5GX?B zt`idcWI9C4??Mjz8896>;daL+0u(4O=XY9E)u3T`1FOJbCB8%h&mjr6UDONqh zVp5GFIbvYB^SVRpi4pbF6p|@8v-}MD@%%BDZ&Rzo^;@@S<_E| zbc_v%P9>!fRiBSXHnB=pG< zCZ(ji|6B}o16&J5$v(rn*^T1H21VtW$}xBr5Gl5yF~$T2>RAraH%{Gqjnsn;n=&G8 zVGEp-IlqCbrFnY}`$P8X+hpLWs1c7XE}d-%r1%CkLd)W)kx{5(^C(;{`Y9%|V)6 zrXWz*hG|-Y$C{I3I^68250fh2Y>|HK!{f6~*fnOGJk4e6rNW+LHYFp^4KlOLA>s{2 zYUN;*B8m)X{7$J(r9{_2ain84CIr@GtIXPna8y~s?w7>Cu^Z1In<V7;S4vz(gi3XfW*xChRU#E~nk?oi06sQ99!CDs#82*CTYs{m~ z)0(2C-8-2evR~jF`P#DGdA!@4f}GDj3fW0e=J^hr#3)fong}GBWj4h~8EsT^N0nnB z|0YZ6JmwSqtNc1b}F)e-76p&=<7#pX2eITo&lek`H|Xft(Bnoc(CE za?VG_Pt{xHSkIVF@r*hj2}ID}$a(>5bN(s`foIeH*LIk3`;A#%SpuLn;!*`~;p9ZY z%b%cpDhe_?y-Cc;LAG7oulOo{%ZW-J*fj*orj$JE>j>)Xy;r*MOD@Y|jScubF4kk% za;&@ri&=K6(d(Uek&p`U6o^wQW77T<3I|_JGL*xQ<-$Ac zk>+nWb{WbF*4OHa^O6QZd1Mm;#v)1xj{mzndw z#YlEb0wuunysVQH$@$8D1^J0=>indH?A+IH|Nb9-oG_U&|6G(G^5B(gKft2HE7s;K z8EtH|_4U|h`SUeR&z(J3gC8#26W~dHRvrK(w{0g-assgZxQG~V?iDs$)l+ke2jjnX z%H^WmA5a_lX^uXgxcJ;AD|K<6(;f|^!e0eNj7oTa&b)%Nm_+Kj1^VjBJVYb!ZO742 zw2nA0wO{e#6&Tm3={AnE!xMpa=6~L5+Y-Z?3j-lF^}N+#ETto2M2vDxzRMC+VOW5h zFp#wPp0UDWcUF5ccO_IlP);G2wuCtsvG_kA zPsB$ui*P-&t}~?pcDg(y+1t07go%5FjPPNa!?Tat>rb?PXH2EVR}1p(te7X-Qqz*MR4n~8#~XauUJ^apPnPH!<2@XUKZ}EQ z$7_w%sNEkN-yJ|F=O8(CBTjh7(mkhvhUBTmK>!1lTD0S`m1naS=Mal|qG2#+6MSC# zC1xw9%L$&KkI~f76+9uu@UWWn8KZg7RHUN7JLpnBtXUtF@3{IS@80k*mCMB}&}5q# z{$Q}RvE9V{N&E{(<{$cHGl2}v@ZFx5{G0wOml0M;|8+mMimk3*zuc$Ce6g)=r&G8S zcROCu^$Xeejmh_`t~{58Lfuj9K0d?Rg>w@5e%OBqiAK#w-B%v)5w~oHmVfLcy6#?h zYw5E_&>emYxe~X0p2fi2fwz9;;=(U9{DXPI7dx+i@e&KfcT@(#A1qe>93sYNZx`S3 z=AkAfUounUxxFiVXNd)zM$YnB<{D0nd0WBJ6g2G@lQ(3tA3A6Mc)n~=36jWUYp3Zh zk&nY#pG>2}?GP18XD=|7e^6%yXXGgl9xjvR!shyGDAq%Q>z^DNNiMSFbp$7{5|a)1 zj?7b+l?^WVKmd+a*FkK7A9!5&j_DTm|v?`zC0-a{cK$PgwW$133K7y@C( zZ%*A9Em#g$$vq$Q4<<*{iy!D8_8Annt1k00Z}aqS872yaUhT}Qs=BTH`l~K4IWJ>Y zH9ZJFd9=}KI-D(e5}o@;X*ly^>-IDBaO{}IGE?kFYhHh5>FEj*8oQnFy)U}=PpeYA zpQ3%QAN=lWJ?<6I>3@>Z<<&m!jNf|nZi3Q3GmjT* z?#53h+J3%^80}lNSUOoDXQnYI7E8d$bYzD`ixuaZ^H&;zP~IsF{SY?c1z-mvlBg(n5 zSOpma4GDJO5bQrYLPVY7El{mg`_$ZHW@*p`SCInalHwt$A^dd7FXsvF7zoTz9$n@b zt(ww@je?yc!rT@}jyq)tk(0WiL4sgvrQ8Gt(#1-XwR+OgA}R)s;tzoXlEQ!n;uWef zUM(WoLnsnV9E%MTwoRgPMzIl_Wyub>2Lg?W>u6&h^iXXHoyG_!W945lqEo}PKLbVJ zZ8<~kPFN=gL6H82JkW-1FQ=w|74U@h# zRMS;=)}0~jNJ<)Q0~#47g1yQJW|ak-#%1Q1d0t^@uiQWf!@<4!1PWl0Jz-Q)F0z+} z))sX>U$8jqD*_KsXVHd1ob~dbkaXinp+DJy+G7gm(ln^hRTyW>|NDS!u%j( zPEeL#9of-Z<&o!bTXO>d-e-Z9h_e%wO8Te?C~211gsueGZK6qGl5W#&hiWInZGcb! z)P`BSEba-YdN7h!O(7rzlV01G9EMXnXB3%(p+f1kl75SN;w9>jni>3w%J|-T5Cun2 z2%AtlEA-mo>s_Q&3J`@=9=5@8Dx`XqQtQ3w2)9C3G_3{af-gipKiPz-EIP$iNSp5M zu_;|zDHlC};#%$Sdie0U8gf(V2ja(SQ<|0Og;=ViO>Jb>nJ}+?Q0q|N5za8L-bnWM zG5A29;pP%V3m<+78pJ$~5r-GHR2YB?IqJsrYIlf8uG0uhxI2-3>6DQ8WP*@Jv+bPo z9Pw7mmTUd3&9FFNFWgbbfJb}#j1NeK;qwGsQ0z(`AQ@S{3bS zc9Q5a1GG$BUwkBaF20b2a^<^r)KVjJ38b;4XG>&P(bjf3ZcqMfNm^Y7zh)Zn|c)@cYL_d)! zo*{U!2-2yj!Tpr6m;RM1?ZUPc^WK5r2C?xyZ|P6ytBGFI0tHKhuS0Z%PN~5ZA^i1j zsQM`>YGtNMNP&!P6ud>DC;;wYw%YtFjwhQvDw_m5>54rXsrSd`EPTSy<+FL_k^jtf zm;8O?MrlFMXRxoATHj=m(j)Qqmq6d(tsc9mdwqUVeY3Z_fMdNHRUg3M z5Y+XtWkM_Ag}L0hzJ4H6Mw3|Q;g=WY;z^edM^@lToaj08;g<{8wOr%Yr}p-;bn$j3 zjKL)4O$RUH{_1|-T)6r@mG&UkeN20wJX=`KqjdfvYE{mUDX{6u^~2qg-D zu1cSKD}A-41gb>$cCBR^jIt`&DhMK9kiMs&FYpx#d(;F+sXXuS14=&tNH3_B9vu2l zt=;R6D+Luusl9u-&SrCSe`h(J-In5%a96up->!OtMN08|o!=H>zPZ&$x4l2_evi(_ zyWdilE@hLS_jk7Tw)Xt2y+8jfl=vnOJiWf6@tF7~!`bcO*x1?H2IBEPvxjYKfAjG@ zv;RlfaBZLE;nEjvtFcULI5vT_shBtt__BO|(fxw$E zPWyhk8&kifR#EJ5cBEh37Juhcwl)WL>5qZh%4B7y$xIW|^pDqL$Tr{SIC8VeOqExR z|4y^|`;JcCYpouAaMJH`i7B}E^ZarY=K3SfD^az1CiaWEO%H_fi#5-Cr>#%qVE%rJ zE}|^;@n+cEZ&!R?OxsgX+0Z(;8zyc(8zEnNZF#wQeNOqJ2%glHXG~wfLWRtW;jxun z)7FaHEy%#-IQiP(>z|zFnA2i&?UxprS7rqrp5fc`FXSs;KQFe81scBE^2X%JBG~;`}{t`!|bulS}u`DLcF! z-?ur!6dI~|=jFv@GoahnHB(Kia~q`Hn=B>r$&9Q#Hg<{Hh2&(jIwH1g0%rAsb|&UJ zLiVSXrPmuM@UFNiN-aiRq*en0S@+D_mjMvVER(ICxGG2uZedo&3l!_3D*RRqULq{{ z870}lJ{_?51+e9-C7E(dIc$@n&?Zr*HcG~2+HEuH<>UU8=DRl>Qj*ZTm z70@0b@oW^-dsi|Cu`PHbrD2jM}ihXB@d^gVANPT}2t71GV8t zVptIV3xUs5Q*g;v3j$zLm~ZKX{+UsONjs2TG+*>Q-Lgf>79EQ;G$d(H&KXe&nvR5U zNpT|UlE`B&816T2OH9axn9K;VSpWdJrle|Do7=Pkx{ zB5|;|Fclp{NU}MyX;#7x;52nzGJDOVgla@=8^6`o`x$drK!BWW?G8V47e$l=zlCgF z@-B$l^D)hq9a}KffKLWsqZ9U}p>-H1JZ*w{}};ahbme8ZT0n9lDx&j?8lQquv}VuM`x@B!9dCv)4J?K?nnNsX&}G zf7RDIDmk?<=s-3gd>I#Q<^}?lL}FEzNAh>5YTe|a%!MCtV8#j36mUB zhVS{awixjWd?QJD7mCeIgF*^W=nhCzL)a#9oh5NR!Nr!oP*e~Wu4@m@)?8uN4>`l@ zq;hcZfSvWiNjkrJV~~bKxGN!_VQK9f^biP`o_rCQnnspXU&9C?0goIUQFslNW5>$- zaNN(FHt-n|Tf`laSjbOU1JWml*GK^F_^v7p*Ic`N03(i?) zyi2Tv2|?8DXcHGuBI&XCE#pxu+YoMWizUoG+BHc5@)P)86{AvIzS^WPJ2!7Rz5 ziwWy1t_3Fe5hn?W)2Gyu1%8w)O*Ar{LY@^?b|T(@97%=J+H(^xw37IGyYcB1XeCN+ zTZsbA4?gby!z&LHI7|SQ}qA4qyWdJQs@1 zHJ!#jL#0om82+R?T$J^Q0QS+%r#zdot;MAEZ=6;0JWX;I4<$)s>d~Fnc#pIPKiM7d zO|tlg$sx4gg_*V#nHVw-0TpV(c$+@WW`ztLR7Z$OHbz+28JFB%eWK@lH~9iHkCLG= zFWm*ZWitG{(=r~Mk28J99ddxQ>F_7JL$)JD4Zb81D~`rl+e%2;VpGrhx}qQqC%W%+ z7vb!*pTeD_GL3;2D10llEq`&^@M zNr-C*`gx|^RpbI(iw}#~Y-epok%$q3O*=0{-Gs*r~}AVhAA<@)Tp4QfO2* z?Uj`e)r&Ynyig6b8HWfioP@$>B`)3ojIuTkYs)Y;2ssdVAgIk9#VA ziSy>#aJ=#!3(i^ArEVPfUkoJBhy`N!Js^0 zDh#ty8fmQov^2!?Kx*Bn;HLSY6nOyu7|sAlAFWs)kjZ(Ul!UhsRMQmdt~i^>WWrKm zR-&#T^MXsUI*v@pQ_?kYjWwA>;cERfGnVU2rBGFL@IG~e;w#_fkd)JW zqhztKxGo2e_jkel2BpEif$&poDWL3)+q~M}KhwTUW@IW^J3J8-X2X88S{|f`DCk$T zGCHT)uN~m7J3Q$y|285Q_*pXqv!X47>X@CiPhuJCg}M2`KYps2i^_cNFMPfYcOt-k z&NP?MQNMqMGJmB0{7oME%{TnLrGJBK1Yq@-H=p&eLh2gw6|Xb4x_#XX$G^Sxzn|On z?&sRz-SW2gX!!gw^wX+{-2MdjK1`xj36yPr+wXOb@ILYfEK6}*hQsZZ@(0+rzW0UL zw|)0BAoBy)#~-@kKg32#uo}Gc2b6mBa{q7V_J98Q=b!(t7GMAZ(nJ5}{x2JYBaT{^ zb(w#$d6Bs{8`rG2eKisX5-HF`fB?kN{os|ZJE=%xoDkt;U=)9pxZb^XO9B;(4^CoUsYFii&u{vh)Ytld6DO(uijgA zSFK)OwToCpe8gOgF0L&lLZ7?4xm@dCO0VKPSfxhIrKhK< ztE*l5Y2xW>YisLj>g$VpCtsgC_6gg;U%Gl(`4S78YxHnQl~xv`2h6ZjM}%P|3keN- zzQ^>-+nW>hicar;1Jgw?GW}8U-pyC_g7^@e?emSO3m=W_{%aQLtBJ&Z*D75|{x(;* z6z_dGr?_}Bt$TXeMz;eizY+K?ZWM*Rdi81ZIY#RXQg6TPD*4st_B03E+fq-zdWHLG zqV0yK{%qLeecXO0>s;mcq<;M8=6ib|cKIW?$YrQYnN9WMRHydS`AII!I)5MPlba>vTSNUFK5)%Xb4uBGs=nc1uLhyVA! zA}rq1gOJML>ppK3r681f@c5*L~mT6Ity zm};fYIYxCfq_PCADx*UD0xzU7tg$w`v_p^ln$D}~E~0O~y@N-ZSTj7kA*_h!(b#l&j*r^0AFtjmHAcNAC7R4b_SVj=nGuHA%6!Oq22u zEmd43dv!F9`%xCoQ=9NJYMwbGcH}JezOJZ0MpjFg9=bfP! zX6?%a8ABa3pMhBwWe!=)1P&<$0E?qoLF=RLCiNwq2z- zMu11l>?(qdRgCFL@Y6HfPVy?j5DiK;cUZ1T7-G$UAyXK)2~i|_=JIo=p<~s2{J1(@ zv11&S8J+hO=C1$fJ=0lF(X>N4duMED*FDDVqm25xQT91Uu!dFh#^bCuok=Q@IOk+i}g}n5Q*n63Uoi#4O^qExZ8qXESs% z0~i?9n9nf@Al%2* zBY9J?`<$5KJ2+;uNgWZ4Yuh4-5vxE0Ir*Eb5`e#wK*<3C97Ei3t0g33IsXj-5gc*4 zF2lI_kS{fC7x<6n-Qmaxpy&>SBCy9v+Wb{AtDSW7Dy){prqJ{NdHS0P0@?v!J%;u; ztT@N4C)x3WBb!`ICohZ(>~}oq1p~-}jU-Q>(covel+*dJOE;#lX5RT{fE)rB$;>v4 zyR@LNtIU)NcE~Pih)=d;4af7dCG;AUge2&VtKdx`;xW|R+KQZ&5$c7dVW{&*Gg~g> zj5?#U!r~duSfc#%%BtWYPOdIYi7C;ycovi*DMAx9TFr5QY_A3LAk{HPyx~NW^^-b| zMUvR+%0ovE;Z+Phw%f)=x0&^#3A>EjtQlVfiP+-q!E_F*(2Gm2J$^Z#ybEBB#QwIht6(QEc-=NSIEm83y=mt%tU$Qi0w-$ ziy(1$3)j;Xqctq)WKT2X9K|0g>bt03osd^hDKs-!3e4Q{(cSFFfZ*3?EQdL(5+KkL zNi>{?yd(;5nn1I4Tmsr!-@UcdvPC(HlBf`3_-2eI`EYJk*8!W%+9=`GRO2-cF5v2L zROcU1#sK(y3cPv_Y@c@2TXknXKgg5dSuATklsOx&LW@Pzl!degp86pqW?GMLqL^g~ zijoi zKVtazB)8^|0=$@%!#JT2K%kOJI>}-q<+OiXrkl%oEsznP3T>ujHnzBzK;ki7iWW$V z$T>CVJ;9OLC4$<)-LTg{h@C7q-xfJMXlD7Ow6e@O))msu5mt(YLAoci%me7;<=;I(yu)y<)Ik!mN~>+( z=VvS<26!2`%_;&ER}o>Xj!$2n&%%5}`|&FTp(q7Yd|!kyo%D()Ey1hGbY5pZ zA9b{5q!!xmQ7&``0Pn4}&D$q)+)drLG~YaopQNpj8_=IW&l7LV-givS+)!;qmV-!{ zv_cBs!r+xBg+ohe4nhA0D-oU9 zHWheu05c(aVp(!V(M)}3+18xl)J~TB!h&K>hw>DE%ld&m!Qrb zPE)yg2#rCRcUGcKJ7rv3fo%`xS!`ufDC5@0&vml&xBbVlZ^3Vb-nrLN_ z0tK{EN_+U<6w378@k8Bzy*LAovtChgB}XF9%tq|5oQP|7cG3m8&Sy+5q~ z7xrCV0Y83d={^KHv4EK8hS2@Ilk*@ z{a`&%QbT=RXOq414?2E&LWBPIV{uz(`pDfxEcu9|&5`2FnZDe5Tz`L@4+MWcQl>?{ zt^8Q>gGGJtRRzjTd3%3D_tVg;=q6h2gJ>d8v-4@^Lj`Hk%fqe2v`j@aw>MU-EjM?x*2p+TQ%scwZy)+1zbkQ|`Yj zyuX=&H@jE+e}{$pKgRd-s@)!D+xNbw!>gl5wvAT?kAfdxd;R%-^lw$Dik62b8?fTG zh#dLtBA@r>iQm68cmN&_Gv3V8Tea(+F+|{h5HsQgc^0E$Vmi)x|Hk{|p}zB9k8!Ju zdAm4a&tJi~0Z#VF-GIUyzDu!7mZ0vAB*qb36(&8BNg`G`D)Zxuw)a|=YxKYEA_YGc z@9rLYd|uD3qPK-5FOI&{9zJ-1&6|^RNwPsE{(u#NYAH;Y!uOKO3av`02vPaoL8-A2 zkw%oLYQGfz1><=Uevy8rzSpX(@}_&Oxp|NS3KFR(upsxI!`y!Q{fo1WtR>VU@;!G@ zK3Ip;ntykDbJf_7oao28;raeOxc*HpBvJUQqrJbgv$0Uy`cgYPE8F2$xSA%nzQ*3x zX16aV@{}#!zca`k@~%rC#s9M?twoRX`C&8iVtVJl_@lr2((>u=J!&oQ<8VS>AOGEK z9Df+<=ebG3^%6)Eway$D1t<#c5OiE|>95GcuZa3(H)|@H69H6ae>>~Pw;ruU5BhRceQ67uD|=6{Zn6Vxc*FiofU$R%(~dMywCss zIvM;kD8N2qA8BE8eY@-50`E_n-b(hK<;%t)FOMrM)bE%U){lsh`?+*d7N~ ztD-d`f2i&YR#fsV)GQ;PR1ZouAYP6VNXQvlLXmyZh#mgXW1d7xQDvjp6^v8|LOij^5glJm z)HKLT`A$6{2#h0`B&!ZuaM>6@X0h)Oe80(U8sHjHJ&givjRHOlm!*XzO1~K0nB%Yz zYk(|EDz+8fii$FzJq`e>BLIx?XruBKA&seCA0vZ0AqI5O5GGX^#>t8(IRS|sx=Obc z6FcxJD;VRV6mSW`j?S@zq8+y)r!{w!DNqcB(w<7v;zVs5>Es<-LzDvPo+vmhH3^j( zPp(Eqn*s)AN)Ki0*ODegh>~TCD#IZq;GES`evZ$I=(OgZu zHQfD3c$_&}qq(UGD2Yiih}j&3US#%!9oo(Yd%hF|UTL^9Q)hQ(A@{EWr9)$j+3MQgW{J6mv zl9N=$O?I%YcBkf@O*+Wf?*w9YmYy!2M-(;*g7Y*fxj0m<#*~w3jVydAC}i^nsL{Ze zNLT@V<2sFft?zborjPk{VTyPd?j7b@09;K_{#%k~>iv-!sU}Gr+wd^iZPjrZF&dfi z@d+wiZ2-xAx^$s0JTDH$o>3cIUQHt9=4j-qa=l2lO0!ThG7KF6T5S$=B;vf%9xh$+ zL00cUSF*xPaxc5DY0n*m6A=19)S`MeR-a$WxMF3B%%Id(Yi{O%QKE4nC%$gZ8C7oY zc#viQRV%eOuE%5SjAHm|1IA*H7|7BMTmkjo=6bD?@rA|^COS+-A z0|sK{6h=y>TEYRE1_d*>GO#uFUV(IjxnHi3*Ey2~p1pXnAnpRdImHwGpxFLs4uLW!8%Hz<`^9L4*B6~-BeXk5c(Cg{xS83$jEhfC z85Gj)k29bluzZ(<%+riG`vp5_o{?)kUH*KZNJ+$28udSY#gTWk z7C?PMJRPw@sbv=Ttv21Dne^eWw`pp=db0>>0I~2iXMQQk4Gn1&qvR5lsfZ?$&>N4m z4}a*6>p09X3QNd?klE1$w+-Pm^I53}0-_T@OR@px^4i(X1n#LR+X^pNPO@q^Z0ws+8t zKdyk`_m9ZfqezJf!gYyi4Mb>gVjjq(ig1T{!g8Evksm{eOwxOS<2_ruWKo)&Eoe!~RqB+1lIM z@v8vx@oW}{Ke!C2Lc(Lgx2yWb>?7=&xY@=DW%|Ljr}ULkExJmrtgE7etEk#G74Qn) zYpAe6)DhJ7$at2g!>Wds)9Azay&raobIK6-t1KU$?ySTrpYA;J(eB(n7k>5@Z@jyt zdw(9?y?Lqjf-q?tnt^}m|TlsGX_2O4ptleVP2YXXF7}_-tJ*XW&(Dvk< zitE$nmG;0@EfmznGslg;^GKuyvE7*qnv=(P*T!=c&UC@Rv5siJW(KD@eK?Qu;-cD* zmZq`OYeK@<;+~_fyW-@!QrT%T(d-%M7n1wR?7;hB*#s>f?0?<$1|g5VISe5P=Tt=A zE1WkzzgC;&>Z`4e!1Y(y-r)24I6|Jn?tS^=RHcVTk*##R6j49}wa_EX!x%3Zqv?}F zWEl7|R7RV_a2Y_9JoB*97) zr;9bBU-ML6c zWgr6l%|93_FftzLYj(4Ut2!9rph1L_E9kY5w8Za;hPMOgn(3e?n366Dp_CjkmbF>K z!5jxo!Bpm~dw8I3*|QdXWz>U0IgUAd)B=cj;JGuG zZxH4(lP^>6lPnv2Xd;OC(s5@QEJ*?V_#Ei7ng9^397K`j*$Z>UKvB8@#^hOC8w*?2%=2R;1*gH?jd zFgs;srIOdi*`jWVUC@$hPf%sS%+SWQWwl`$c8D;=ITA&_QX@%r++E4)>Z+{V0ypO% zg)mw~R&;vKCbIK$rlF@mk4j_Ts3e3BRYLS6R!_pZkpm-Z=A=y~p+`YG77<6|fx`u; zFZ0)&A(_m`BG;-QylRFq!=%cDjX=dSQOmg%tK6En+4O?BejdnFOEl-NfSK2gRuWG& zB(6|YiM17d+Hg8aaW;jngU48rI*C4c?p`Sd9dnKcnL)+MNQYSYv<_l~Z$a&1KqyjG zCsZUK{C!wg0l40>H&q@1ojHVH9-q7+)MgQXi5h1wI>}|jo;r9*@&FkH2NCBnI)EgH zWo&OV!4tdzFQ1q~q#Xz&tZC#f2EabWQHCa!xi-9y0Z z#0r5Oqqt>5sFeZJ?e%=Z$h{g~^KP-a!eq|cR$bxbwVO_uWap0sfMmW|3@uCiEb|j# z=!sd=*qSDWz9Ar{78G)}I(3~(uxY=l?tzFtmGPM|%h(t#k*h&crR$r|Q zRY6t-c4>-Z7-G__G10twPN#AYQx+yv8a76k3)v}2yQKUqC6SY12#+H$up2hovm1-0^Ihvj{jCI)3*YuTJ1a=$sbKU<61Tq(ED=te3zHDayi{0GbFQ z<7QFfc_J28yC;=t~NOhLQ(wwg#HM1jYyzLY4W5Oi4}=$IGl7n^juf)Q$v?*P>l~UWT|6Wc;-?{W3+E-bmZt8nDs^oP`pjzA|~X=@GN1xCPytVbd^mObjMiYp4p@sKzC-j z^NgEPRj1WJrc|SCad?OLeiE}_vU9l6j4&a;pRVC8t6>u86*2@RtA|f57IpOwCrLm; zFFHq)(EgdCOv}i9iReC-rMHz&)l={AN;_G zyz3kH&g(!31h1yIXV4z?(R_S&{qFyEIQi$FfByOBpMUyTV|Jb4^RfqrS%dK zhdO3%^E3a0oqKA|1ZvcE9Vc&W+qP}nwr$(&*y-4|txnRhZQI70>uAoZb+)T^eS6jJ z>sLJY7^6n59tN=*RKneL4hxUP@r!`VT`66OcBQ+^?b&XB`C*gJ3;fmaO@(zY*J{8| zNKxDKHBCvX+%gCI2m9Lk_V%a`<>QBrj$$(#rJb!X77P_eYpaJXio?gXxr>XBg-OV! z=SIZGJ9mdi>$_|GOn1Z9&SpMDLvs&!37k#26fEuEFFZj;q37zWU){X@G75Vyg^hZj{)P%VKH{l;1gl|0>2pjI z1%rX{i0+?)Xm{R**c62R5jBVDdqI^$zfc@ic@7K;BT;F(9a#Z~d85ckMFr3ccaXT~ z>`5CSqHI@0>cV*u!c{+_FL3~W>1!TnHObw}y zs0_F(6-X2h_kH!%h9!?;IL<3dPmx!;x!l~I{{FbR!h^Hb^UJLC{@LCB-4)?@t!QPf zU|H0Xo7>v7zFNvY+Popx1zfv0UEl{{TQJ10!CdmZls{@CWTkvF&vND7#pv1+rjCuc z)O^L=au++@C~Ko5!jnO9S=pqMoY)bCAh(J(vK(4N*Salu!Mq%%goYkcv#xI&p)~Yh zc;=cffQortS}r`JPh%B$xYz%2by_G3>I6t9A8!Y$NoEewKpqas-p|K3eJ}Bb0oB7Q}w;%2g^4 z<<@S)m4}2;Kx)b2cHBKwJ$+8xi=z+~ltLE+d}VQ&QV1i;wn!8=JP*6}V2)phoz7+w zclcaXa|mMkK+|U3F^i-G&0%`38r2dVFCSBD{2C3BwgeUy1*Kz1ia}T72&fJMH`q3Y za5-xF0azNlg0D)%I`;(2&KQ!TQ8EJ=AC9M!^Vcz=4-7L94r=$6nJq7!WZ84p*qzGy zlq+VR9IlD^Xh$ZG4Y1-ag#2a6j9mKit|N^IoIT-V^=z<3))Z-vnXR2Qr}bF%mfj%N z0#?|9qWG~K^AA@>Ve)ilQBm~jRP4aAv+v>6yy+0*qG=NNiIqOPvW{E$CtH!G`WOTJaFnDP- zi72L07&c?rcHaFKO0`2(-Dr(V7jsEnqJPc2BbJ+BL1qPc#IR{S^Oo_AdsXNl-5Wfe zj~Q-pX$C61LyT16AN$^JHHn9A6vkIuqT(Zi^O_&IB1WY-~WaKUimEIS&5!BD9e*vBSRmON0C zb$F^xm{E28CO2>Hl4eGo9FNX~RXZl`u&kUpyl~1NDw(J4#MS7a?sES1&Z)*O6*sNK z!Hqme%uuCYruts#hD-rWffPmuBPqjV(x+FnJSnbI+A8Yie{8?B5SMTZuu-WPLiwiRj$sa z>4-FR2N_38dh%Lt;CSnZw{XZ}a7i7Uvr0~_xR}hsbgY*d-c^`$Av3^^9CRVB016OV z=Y6`1qtJV#O@0N8N~KF>J_?PB^vSnt;diE0;_qsi>8{@+Wb>AJA@?Xsit-7O`kU9h zvv{kQ{Pi-zXi8PcbBnfeO?60e=hwSzzPQd09rg63PJm+HxBODfO$Y6LlJ1l0!%V6FxJEkzp zW(0jp+77}`;M~^E*RRk7<R@cR;-~NLoCPe08p$MH{I9 z();MV9$QVZ6V3A{tVSDtt&wNOH@hUxeP|D+3pr%RpvH6|V6D44&5c$^!$m*Q5dVY6 z%>i_4d8O4~kZTV5gWXMEjxwNeIF>9e6A81ySURq0f7mu%jVciwWB^_{KPa%yQ+P-7 z2r@`gnp0SP+m|(Lm{_#4>RCf$_TlI;l;>6I#Zw{;Hx&~n`CE^>&}`ss<>zykn}hUk zzTj!Cs^(-Uvci}$-jbIVM&zY*hv6npxmR^JsoX0Ff-T>=cW}7D5Qm`rAq-My|*?+@tAMDd?nfa4Wc$(zJfB|1@ZPsQ?Y30 zXQo^>epJ_2zY)SoW9-#rMB z5sxjok4nIXYFV_Li^&YIA zH*q07F9-_)*_D1iKZb-Tg%w$rojn03^eHyy40=8 zbzfDJ;sp430q<*TbqIMDnd8qdFVD~JZC{2qJ`q3LcOh55^&DQFU)(+X8k%4R{gl1B zWS|8IMG^{A2`&r9YYBqB=(XOAXB0dPi%Gq7FyL5-g#U@D zMUG&&iq@mGxY4`32(HeGQf(}EI64z9q_F9d{-iG#*Elwar#QO#Y)kie!lOHfmU>do zoi-XEqnR_q{i^$^_FDb^0ow>jGh5)r5#ZvGN%-NC3Fj`K>-YJHniW({ zE7ND1^N`xGyfUieGqnTR@IaEF*~@*S2r3?h&yT6H!f%o7)#zmV5Ex$C6~|sk^r`!2 zES(Vs6aq!Wqq*9;&(e25+d=NH!c_z%Hl_e#@9Ys- zd_%+SMYRYfW1t$^poamtS0r)7vN~|*u>c~Df?$99D@V0?FMxSVl%!r=TynRSu?>7w zYjsY1LIEKD?Ailk1Rq0=I)`J74?t9G#zenJXcA4OH?&g`Z3#wDTVjS?#R#8FlNH-V zv%QO?L-gq{Bv?{?OgjrgDG~i?^$l*q**#rp5d%}h>NZ-(o{$aZF^sawab1u`yy@q{ zxneVdB|_Z8AMLtTHDr z2Wl88FcemU)N{ojSc>u+r~STzH7z>{lQ6E=l))RK%)!S

    }D4Z;y?z2~2l^bL6& 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%0A;o{aEX3iTHk=-*csb5#^blXBl=cJzJa}X zGBz;js9SoSRpYSMvmv8z#n4pT z4+QBW&vG-gmccBJasB+ltd1;JeOlU%hlGt&#a$J&NfC`r)o37MVgD!+L{q<-54_tq zGTWUc=XP}z&?_g163E~MIJAr&Y$d?j$%SfGnC9T4GI|->L!^N$MYbeCk*lTE3zi)Y?L+yctxhUqIUlsH@tVD zk<_6VFsFz8{^9+=02iCZrOt7FJmdE&=G}fm-{ggy<&Yj@5}oU0>d>#N>OB(p%KP4= zx_>JydJy7FA#zFfI$W#PPJ8(-SH6w^tlyd;=%AK94n7Y4C9VQwis1e4&3&C+VYz?( zE&N&j1|HAH_bwv-(M~3FgOB^|6umoqU&rIw9X$Mh!aU#a%J9y2@fAO@Mu+#E1O132 z2(eX{_uWP?F_qOX^x}~i+JC!4{qxWNU**F8KmA`@)&^G{weNMNhy8Zu(L+z~kWChc zTb2?95`o1M`FBKQnXwV2L?uPy%BnT35i6?#GBvPj63#On6}q0NQD7fbuhD`SrO}qy zb4eFl)JWR8UZbEY{n7o`Y;=~0615`r+vhZo`PJ{$XOH)EwueQXO8q)|%AQ_dQl-o7 z{K9qVgGad+da9bbzvDi+)LP2Y^v7wo1iB11{}CD*9j$?rzu&>n?_ekt+NH6fAs`Ju z+SE_)EBW0y^Wx_zR$qVQAf?MPj+)tW`k2_)?_r|c3vvQK2PPhNQ z*}9&7M}rObS+0zWzsu>lmAy`QK}|F5uV)=NaPqlG<%o-`W)|^BgQVCrJoO0)tUKi@7OVVmdrZN9u+CIUXBp>m-j03G5N3xaE zke-F{qeHWDm4U?R6AB9}H>ni|i*gis=?Y;P4w?bkIPldf=t&_d1Kqww(?#MzRsb@b zK>J3xxzHS25mkVK6Jw<)kXS)?bb$B3bO+pD;e@g?LK{G(BubN!}X)?@=WjTtX_KE5Kn4qCq4Zu3X9>FEaj=WShlzSDX z^)U(s>xfpzQRwODY$StQ1RUCjE>5u&(H}gJu(L7YG-fspvd&(21o_3QoJu7NkrNzWF8?%M&C8bKH2hNh*=vY=poqLOLDn#@XEK#QOBN*PeaeGhL z0ou-UDk(@P_Ct?~csX4hQA8#2Rv_Jvv*cxvB44Q8;XhI$&ACcTj{WVnW?0dO2*& zy2y!cQ2WRzXnd0{jA(rcLKdeLjzk7+Q@1mmP}G&hf`v}huXg;|qpJRG7WXH%MGxxQ0| zn8V$OQexQ;#uXh6W}e?OV)Ky;0lJ1VjNO86QWNIgW~@fsUC)w~Ri}8*bv&5o^s#Y2 zSSA&vEc6h^J+w+!cr7%RI(W5PwkbF5#@RF}CqCYTY<*!kpE`H9QqK+`Vse*#T4*hN zj10^2o5o%|{O=VBize-ALT*i+N1P~un`02pL*m|JYLlO_4v`%NI41im`G=Ry9t9Gz zXvfZW(LRi#NZ@j|->z0xOW9AIjwdtss&L!stt#dQ<)|PD+sheupT((lKFlZB9Ce$O zP3Ji8C8Q#80yyvlERKckk&rbXh*&=Nx$;RkQyO6E2IV+S&u7K2gG2 z#CgW99C0-!YJjbIK7_|@Rf37p@I}Xr4kK3uAtReh%v&Pd$=HUmT&EYcR%>1iv5*a8 zz4_!^HUCrAcP(TA0~DhKLp9+_=kr)>9CNa#je9&BOWJ}#fqZ9U9pW6>>faeZkHc7> zAl<5~KuXk3I(_{Pb=Wn_#YJ9R6kb0Ce?^E3dnluOKeF8zr}w+>2Q^Z^G%h*IfZ;|E zjo57rIFf5q2R(5p>K5!{KNHBY4tI8JpAxZ%`Q}E)(nKJ_V#HY4p*Zl9GmJj>$3fhX zyv#@ZoKn#An#9B_)gyqTE^VwHQxyTH`-(;>9?l-AYq%>KydCBOg+| zDTU~%tgJlb)Z6O)QCOA?waEP9Ha0uRn{%48V{_0^8p5)Pswv9HO7o3XNZAtoI8zw~ z#i_0oa}xRG1bzLK6XrE}%H}!CUuHz*Ii`n(rtA26N9z*l5^VjnEcX$|1FKVVXlu!Wz&)nV&;e3DMT@CD4_XrJKvKa1OugYSCrQpp0XbI%kTioiJM6QB_y z$mhjc=cPv-^gGMdcDoyO9NfGRkzDcqW++=aZzejzZ3xR-6wibLYiiSVa%xn(4J^>L zUqI>%^9aJLp`2|`fyb)_>Nv8W6y^2#?%d86_f!k3a@a2&jM-wxhF?|;2Zx&uU5@vj zO;M6J9cSs*COA=-ps3@Oc1lPLOGpUSuPH|9R}Qero^K;rN#R)}Mcv(j4VUK(77(gx z-g}(-B~NcYtPWkw$E$EuDq5W*(k3d@V1)Pmz!g8vAkyta+66i!-z|ghMAyC5rGNnE zuFCA;n=C-kPK1z029Rgw;Su})d<#`nb)IxT|p-Izz7Q1GNOzz!=px&qIEb{Qyw z(p|IJS60R&mq7X|oOF~USu5*4{0{dniKiqZJ|9qJrAYz%%%J3&^!q%GzCJAaeL!KE zdJl@8s3=_}6E5IGbOhZ<@PXC^Idu9n9o<+QWG_{{E6hA|lZl6&jI=zq!Dx*RTUC19 zKYk8qtI`jxh0!NgWdr5s96WgqHfg&=>oH1KH8CH?));g_QJ+wx=s{CDUtdHLfs@;) zDa~75jEHNBF`_xSrVX!*!;!k5QvHph+3u9A8g>x=SpZ)ckHQGituUt5Yn4*T*A9 zCh5(p{vn3l>s6Ffq-Y%$5Tz^+FQDHC7di^Gh`iI_TyH;Xz-(nJ6pbToBX4Z{DHjJj zj(wTQ3G27t+31Fu#qpvEW{k+GgD0;Ust5&B+~_L5b8~Qrq3jZ#A^FLsNP*siQo0W}0(N9)s{nlh3SRcKI*P>@dYyeqebP=99UKN433*}XQ0NY2)o(ytMU_6O*9Jj&AR56ijCmq# zt27RyPdIBCU@~ZHdkk`Oa{>-x_bCTqmlfz}p}Rydfd&qwhK4$?P4pvcV+}U04yZ?@ z-`J3lza;eFJ(8VR%@24%i9!y>08UCUgh#OH6_2?4y{|0P;R|jk%S@udGC2tRJfBdf zyB!R)1Z+%!#;U(l4gfXkYIRcpwqp<>?~o|UbNA^l_G0}n77 zU1fp^jOn)#g$VSh;ST_&mr~;^Y?7ZO5>l-2RPb%(y>-}|19V_F;5BWaiy#NeS~oo+Zz z*RDRxOtUQQ`JU3XBIf){%T3fu+L_crDUB>3ca8Ouz2k%RH(=M3v+sDoh}cVL#bmEQvn@WuR=#V zX%2)~$U1}>R^HcbsmwF3odV)c4c3@P88Znzecl=e?0CMMAP9hE`xiPut1Y&HWD6kL z|5>Aii2#>4r=d+;gKi%_2O6tDZJuDrTjV26An+(g^_?>#*MWc_uRdtJ6s-ajfn36k zwDcG=1Z2w(jo-2xHD}QcYB$+jA)@GLY56B+C5V83uptNJ74F_ID(s4)9X?!#-1-e- z;yol=DSEebUg3Sc(cghT7Rf;hJTH3636dOd z2-IhKap+vx@a>ZclTtYA)x%~4n%Qmok>~S->+YLJ6ogIeV{Y`vPQy`3H3A)BxyjXCE@c9x{UZjMReOsDxDa}Ki zFRSC!73!(NC-16o-TIoomr++An{W8jR-epHGp*l%_}Bdx^gGBoSt}gBUue{tkgxwQ z`v3a>`Ty5Cx5E)dxOthrxk@x-&o(h0c-fp4gc~A^xZ6xvzrVqf78D}l2|!gd_>%yE z4FW-k7rOU#$d5GXA9D;2FaizY0dQPa^>LGTk4Oj@WWma;tE#*5?7K1+vt&>+NYy@u zAK#9Y=J#;&ZOeEsK6+6f&%Wnte;OML9^*)swDR|FHal4Hf(3!q6uUhf7;z$;2q>Pq zC=*6pSanfjj91s?ivhr^k7q|0)OY%zLPB=ZO2Ipf zNQ@mg!fW;IVTU`W$TS{r(M_kdRTB-aa`DN*m;e(nya^AmYmFDKnlNBgSf>XD*ZR#3 z@i)TE8gM6v-iH_xtUx{TqfF=;FeU!iJyjLTdpOs#{j`$lJcrwbc=brHg((xfVFA8W zSiLSTZ%0<}OJzwEU8 zRdo+!oCoRT9D3e*&MAav!HvW{ z@25nQpu_IkwTo&U6Km^(v#*|4D!@|~yaJI7{KLtX;4(^dfpyskjZ5%_1`?1@%u(6Y znJz9PMr6!&YV4Oxa1+so(n}6dHJlA9}jfuy0NTf#tjpBn?b4 zHvz?rVvErN+*|6OqN%?xY8tdm9IJ?G(NUS5Hw_mb5mPqAo>awU0Hs=Zt_g2OeQB{s z^u~OKC6HcbyCf|to~Qqsy0LAp6gIhWobh180V>w@XCwMf+ryJ8jvzQMVCAxcy%Hm z=+_EKxH)gt9XIjhj7O^$?HYV#b#ubK9aD%(s}jeF){>w#_@`75?95Zq%7uEkWcQiM z1bP^RiXsgIn=&a~NFZie*y2dyV&U1NMo{gTc?{CLpR=0DJu2FSb`bJ!ZV8FdaB_UH zAh5N$<|KdI*cXtw_A{9}I1^+s=4;TC zqL(bT{<7E=ZmLDGV1hy&@;G_2v^tc}rGp>^C%oL@_M-`ARZ0dC)mhF?mTRNLB{wPA zC3In0OcE4m`auVnd<3K^BMo`UpmX2u@du*u-IGzGwSLP97=_*mxR5R%25gB6tPw{K za>>&U)r_1hHr{T|qNkH(kP0s(t0eQSXTc~#81Vp$4cbDcUs9bJ>C$D4H2RVhvS5Q5 z8^baV?3~~$2gibO^&uvf9e^3tQWg0^64rKaY;#2aE92x6nlg7IbKaV_v)cQ!_XX2yvO56O1W<6F@&&!P@9sleY^_7aB14d*4YH zMtbG8f0Afu^M*^nQo}n%ksV+t-RhVGJUOfjl)MetKAdZ*Qvw`&h*=ybU!jih%PWAn zYK!HKw^g?q^3Z9y-yiM;1`S=;5D(fhacskD096%{m?L3eV=`KLUH8ZZ&rS2Z@NCH= z>FI=-&Lc0G89cyu)oHW+mYlX3X(8l%(KCuWi%ggJj5J-M4$>)M){r4_%D&2gYV!?%Z1|`S z>L=!!^d*JVH7vImfke0Ak^;$`@$<<^r|r@k1ZpD4;|tnVz9%Tn9IKL^fVi@3szPm5 zP#97C^i2P#9r_~J&oRzPBv!`D5UsU=k_hHn%0J^X@Wf*CI22Ungu^J;f}*P&PwLPd zOS&#Izw!QI^sq8u*)^r)A{-?}C4|1PfAeFkLy6n!E++G`Xv`o~U3sX;0c4DlyK*FZ zuT*u|vPyFs@%<31^CI3-(4)kjRVW!5%5_!1V1Uc&sH%}`ju%dws#7}Jcz{Qmhm>%c zYHmYsHRQ&AFt&@ItW9!2oD_Pk$10g%)1@?~`*9QTF0(CCNSlX7ty=1+#!+w$Q0+}J zOlfHfg=XZP6Kn9zhnGKt7?qn(aA|6uSei(?WsId4$G7e%+YIN-xy02KPcW87Qe95I z&?8L@`H>mPk81t-F^a8R(naN6G)EAxe|LA^12{&opVGk}`cTBH0G)Vj2TkrkbbTkE zO>b}UZ~R|hDJz<`?*p@^v!@=|?2$30!LhlpCes+cBb#jxxGcR4LG&2>RuxK1#_t91 z-QD<6DFd(_H`viX#v||He|~1~?%gwAck%5P{!EcBLAn2!fA5E4XW)0c|MrV(V{;$4 z|FgQcH~(;PJDNLNUn}XDyQ1uDbbG^ZqP~(>C%PC#Ro6rnd0Xf2hC4?7KteP4%m3d< zP5<>@|Mg%0^jZh*J`zvFnt+2HW_Yj(GL zV_n6obb$UUu+R<7#awQMKT(e#_fNg;cwfAL`W4M${N3@BH^JcXR!u+O)qBYMHmu?s zE;YK(a(NET`TqRdpYQHsKDU?A#W3-mx0^?{j(Zq7NvqOD(=db#gHypD& z;a}64KlM-d8zo*d#`TYyvc&w=eX-5*WL9!V1}kQE-1AQc@*3VS*Ga9;_Zzdfwux^1~X&9Ty0Gj%xP1U~w42f%Kp6zj>Wcwt@n zJR(Xmp60;MzaMfdg_=(CzBwTI!SI8Ttv7mmWOV5GL5y2Fec{EYgL(p4#qWWNTtN8# zzZUN8P=idahX-=C$m{Abv3$njT}SJcf~R#f9(Ol z^8WE7h+rkzLa(E%H{5+4FRQD$wj@K|yytoyj!!e~_QsVUJ$m$0HfsbLqsN|h%*pFR zWRgjY8JU@lXDY;unHR{7F^!gXW0FI7NW2XbF}|uOv5cCpMtytYYaaH=+pqVr!+0h; zplqL7CDB=J!MzI;?)&f;VhwgYvY?)m27nQOv6=IHx%0uZIlLGJZUMlkbS zQNp8$09Vl+HMoobc^W5LBp6RI7+n}6P+ z#$hZr=|GTL;+EjL49{cXsM5A`^c^>?A zm<^VudsURpZkSh=$Ho@<$XAIw2^crunS|%xVug zg*k2#i3SlRCranoA!3(aN(k~SZ^eeXv4$asC8A6=9n!a>4(=Bw@s-Hqr#GJj#=x|CM{vO`!>nQlpIS)lnQ%lFO-NGX9GR4yZ*~J21W`<$yS1 zl!P3Pma8y@Ss1MTA!st_I-V*c_;EG9MPjwIolCrx?0B9SK5K=cq;TXzS;|w1K*~XM z0j0-&+6Iqm3CJMp#4OLT3)OG9Bs(R#m|bODUQfCX1(4DNYb556*{4Hn0MjE~#X`v| z?Qs4lX;r(4hzUEEg&)2VEEC_{o%na1dQNYr^9I)fe7l^5(LRZ)g@ZRlx;<5 zHT#;I3Ix?&0!%V9$3exN(4~IKD-E%R7THrY3saeG_1TAoQ|YL&Hd^=5UG%pR>{`hx z_UXAwI#jeXm}ApKSTj9tBj4e4OvDai`-6;71>`x5P6aT&1?^bfR;k{mqPg;VfyH8kNjbDlqZePT! ze~J0*u&vFkQjV-7RzirZOyt`p1YPQ0De1&DBRS>}Z+yw)On3~m#Z}UJv4U&DVdNIT>^6$hHVZSoqC$f& zl0;Ls9?Ub?EvZJBKwG6;jM6hjD0TzG0x02)hsF2#eMr`#?p}`pGT>2+U=Zj;2>6uL zQUp~pe^^K45x_PZGYJijVwzLlKpyB`nZ&rIS3j|zmDk?EnmR*%89M`{NtVp0#Lpgu$zTHF zI}6!SbJ>S?1n_+AtP?jqmB9P~xv|~_hy~{a^$VqAuU4x^!8!>>t|gNxby1N>vZGWk zwj-$~*MZEH2@8vYKoC}*91ljGY)gnev?EgueG2*!f6FYr%h%U)fe>-4wW17 zY9=#r@KRF>6i<-YA%(ay$O^iXoL@B8h+G+~*4VVLQ~*I& z3x(R@It%EiqzSX!D7JzvrZfn~4$-qZP?mRJm=Uws(1W^XXjD!J2`~GforjI25trsS{BtFty|$<7BeezMzN!s-dW=!jso!#D0Ouhd{UfvAwRAiq1hg1tkQe zW~)-%p%<*pY+R=jR+pxEl!GBweMgochF55ozWCr7V8};R6>)yTQXrOcgLocPLG~V} zJPKktA?RrXT*p2p5qR4-X?9qM7F$1JMH0CXQjKQ;XKvW-BD%;OfMQwJ69WDaG`!h`HZ2z${oqb3PEs^%CP*XB0(b%n zsu>Wcc?xLKuH5A!+*({|@>HQWVvS=QV3>bwvDDxl>2z=e$^iU?!j zETi$Gmez&k7>_p8rE!b=QjldySSqTYPN+*(LFPZEeM#kWOX2poLC`OnxLmP9Vdj-y>U4%LY56H@5EzYqOi0+xh_e7TOkWsr4hgdO;L z*c)n>u6Ca{DXMlfwD6(f9eU#@&GqK@!9xVj3HKAr?q;yp{SuZ9R38^~&sFOKx<-h< zovxrVeKKZ%XYq>q0`^CU6POo}tw!?Pane1`d=K{19&q1??KLh!bT@z3FD>w$CE#D0 z{LVwM7}O*WnVx)-#|mQFhVenMPmjU%hg)ASvvT)4-9*GCiF&;!VLAsq=jzWgs9V*@ z7)Q7j)gj|^H8JsD240{016DkI(MKd?WT~Q!v{ajbja_ZBp2-iZ6WIiE3Ul;oxK=hfGBy ziTPJ+9L+Wup0Iww8L1V)yc~Wn}^LdW# z?e}OG2eL2MmhS%b(xVMNLDn38c_Z&BK;$V|oR>tg!Ti@5F6uqW zwS6(gy8lGc&HKGI0Af1XI64Sn8cbFbX%?Dxuuioq{FS957U_ke}pBLKe6BY0yXFG!SrApGf! z9MT@#3+B?V^8+2f*l`4Z9*@u&I8qm>s3Mx>0Y$4V&U^@vu+?wqADmUMm;EYU@(WE= zRrlUv<5f=@?Je0$tGc0DCh*sE9fb-SY2ps%w@0Sb246{y#t)S$9#u)Xz@??D2GrF! z>3jKh#-`mr&(sC{DZGA8?c3~^{Hq$-aDz9dw(fenTz_(<+3kP+6Y_I!+S%-Ebh~!E zx5Fo<*6eM-EJkjy>$Eej*<_Grv0B-MbU;n3D^#6Au zLjUjizqGv01Zv&X&FSNLSvK3Kv4M?6wuf1ci4isfSazbP%hC=(EXo;p0Va!}+vuu5 z5s6d|P4hI%8dAz&p9DC%Y{@(7#VYzpR;^gETK$^! z)zwvNYN}ZEiq*1!LUrw$^%QliSoMZRb)u`St*2+tf<;X&Yqo4dum9igS-11G{Y@BKr=9Fh9ex}iO@W=ei3>3 zc|WLUbGVZF(UY%|J8R9G|8zp1>~*shQs&7+KswRSjGpD*!JOwf26xlqOE~uJ(w>1ZAs#SR~ z(^1au&OpL-i!{qO@Po(wi)5QggpC3$IgbV!JL0niAqVSSBO6>Q>VP7N;73l29vx+< zB}w6@APxff-wlXlbcE2N+=iA%dTJ5>~&(_xUdwy>Y?{Yv_ku0hg87Zn0;fnJ%&?_yv zD`*K?q%Le>r@8CWoj5zf#XlV{xomN+$)uF0$QWh(QDES1pThC_+z3`wA0|0h(^&r zNLoyHcrB=p&)Sd2Vo?@u;5GoLve0aS#O^TnpM5q=dD8TIj*F#1R_;<)WKNMp$v}H) z2!9%t2Y=pq9SpGyK!otn8qv_0N5lK{WOLtR2iCxzFf(_BO~@OW2Va>Pgc0RMfWG@RC)^?i=JLdX0egXeF9yOc(#em7 z^=Ki`kQl-tDr9rgDWzR$0+`7J#oum;UOYaFP;RaP?HR%zzLn_)^L{^K;Sf#m7(v+L z8UzSu64@`{rAQumSr!|atb@pto(pQ2B9I^~4D(4z#wU1On4lQMJ01<^B^UUXD?tA_ z3H15x*AJa^(s+0*dN3Tsf0nES(>A4mg850LjK-w4kE@ALT4JW;gK2}#p`Pxr9Ug1F z9BBLapr?+cp<@)_d4XdGwoXwVn?X7odW-gnLk43Kd*MOJWReKAIeZ^z%DjN<>zh6n zZD-RErqEM`P{1gx0VRnCk4$yGFAsXW1 zHGsrGQ7(@N)b>J*KoVEz+`T}0K&CFD)0p^v5npEzsey%Ngs(j3J|2&S9FK2qj8>)L zw~u^9p;IO@)qr?b9#TZ}YpS9jaW5i8>7Z@kN34rU67v$jOUs%$cZhvo+0a#5Rber! zm`+;Lui%}@cM$(XCY&b}LQ?odKI7G7RTzK}d9A5l$8C!p+9BLCjMO=HsX zlai9CoTX4V5oyGnG>;#4KIe^Px=@TWmW&E(Bpx4{sKgWPN&oT7p=$yOxv`qGN7%Bc2x!;lqFXHNCY5=s^$_{8yez?q3FP@%AOVOk#|rDz~D#X*EeoOHSh=w31Ba=ru=?hN;f=Haz|L0g!$$ zbJ9b`cy*zaV*Jd!yF+x$XozB$SC;WmsCz%@G3Zv}oVb?p!4+0-e%4eHlP{^_w4SZ| zH{Sy&%S{4Nr-BX)L&;E%-~hY^GU~jSo0Pb&(L?;6p;&5&nTFk@1~hC4^`H~y+N_=czrh=9Tb5jh5Zgx zp5+*j{*6=(1=MrGy38`c&Vn=(U3lA42V5h5KRpDKjnSI8L$A(zhkR&AcWvajRgEss z&sh7p4Nn|w&(gDzY<%vkGE-eik1r!VvrUupYDUxS^f)G|A9W{W?5ze|du75D|IGJ% z;urVu_WUW%90xedp2x)r0eF@u@lDTeU{y#inN&L}0w1qN0m9jmFG;z?UH7%5?gv@0 zt+dH0i#U76q*^r216#J50n!c=>fhMdH(;PH1iAsmm%>|KJ_~ao(w^8w$+eKkf8Nxg z*|=opLkpjsC)ltA=FrH~Ryj$$x!J-Q$m-n#WntsJLf(sa_=mk;p`;f)~^; zpFiPqJLUGSVH%+-Y{Oe%+pACJ&0iV~MglY1P#Yk)6_>~qAG}+vqBr#cs8K%Xd4x8RJtB@+W&kqNe2(z#PD2Gr>^E| z1j3<~hyBzVvT5nS7u_FSEssxH~nwtW8W z-96GP6oZ}P$6o)Heasqv?)_GOs_t#3dvkkpZ*{G2BByHaY;Fme@4{E;53bqsA|s2J`~k`LA+yt%VyAVZoYgq8jV^NC zo17@K*ODD`g~WU-lK1{^%a?liu5f|AnS^hAW7ZKJHK*n zpL}=Do@17)RqCm>b-sTNcN9eZGkV?x?%o;Ic-PR=dp~C$p9g(Qfmjz757td_g!GBt77+1T7pq@cs(WQMk#ojtr!d1B?|=K{|DG4^J6u<2W00dd?WMpM^GIH|r@xy}aXl z;VJ%}LFX8Y@cM`HiJ^R9De{jM#YCrH2lc{Leb2SO9C$J<^{#I&dOsX)jE++GkpEqt zxx6D4S`RL>I4jq>vV9n}!rtG$y41ft8C|7H0veKj^`r`^e4BM+m)}u7*n$j6!Q1DD zX{vKrjHB}u-%V#dJS7;d-EPrs{o7qnXgwJ*$aP=0RF1q;MGkSy(|VL%##I`AZ4>mU z1Js-BKtI(+7hti7qC3WpF>(0ALF6i@;F=?if~9Oc%jRmj zbw#`eyLYO6(h>Iwp51xLid8Ujn6_W1IikLLMG)-Tik9uoa}6a$2S*KO?HAy9lV5WM z@swSwzTy)30&Hn#Lx=}iAI6#%TNEP!e}K9=avfM$V?g@12M$w2X#**BCGTn|T=W4L zM43Im>awi2cRapolL7*}4&SskLyHX&>LMa(Qq4BHJr7467vrokrahe(2kV(z4zTDf zcpZMXb@N&UdCHAjch7oA!icAo8@G->+A{P32YmHqAllYX z?FiVA%Indqt*P0_4v)|4_52RG{$d;uFK9~CVhwP2MYiguE0AtC z@@QHPqazh?^NK~#WOnGg*uH7^=E@bcHJRKy`$jgZSZd*aK1R@|>-j#c!|(H43)^8k zaAP8DIkg!-$j7h`{Wy4&qA%bCU2xND&c$+GS96|lO|ft9y>j$&hK(JBtHZ~dj*HAy zwoxVc)(FUjTl4QyjDcN>e*5p$KN!ILncRXma963s%bt!$<9FqU9z6}+Rq=;YZG_tW z&e!n_kfn$!?q#4rsq$P4A(Xe6=UNL zrBD^dfX3IpC{ow~w1`*JGoa8n2Nh>5J`aZG?0uKe1EKcQGSrZlSSC}=ppIl9lo+KG z0fDj;dOscrH*{KA3+27Y_uMcbEZh=^1PlI8%V6KWUpzrxK4}Ps7?a3G67Tcg^EftC zT=V_k2s-Bc7*FMIj2+DK*$14O58jZ?W7LEW!Ha2Fp-4K&DZ(OFI&MpC5)w@H#E?5xevo}Yr<#{s@;5i>6<1GSy(z}vZ zlr2X;GX-gC(OlFHACZqI4FJ7`29eJcUax}`yNP8$<3RWfw_Nrt) zTRV}gINZ<0KDrbgE~m?q7(Cy9;ms?6m<|Yca)Q&g3wG{)e?o9kH0X_dM+3GYVFdg$ zl4zP6p5d#8hk&jR))wcje!OUK_XEaW5iy9@He$98?hRwhD0tgpqd<1(qHxm;#WY?# z*kh~#mD@**;4SD~9{aDMX;x9CG>(EO!In-Q$d!r#!J2Skk~mMN_E~iLq~;kg1Z31W z4q2rsqxCRkeOYtkj7ZWw4cZo(!8DkgsBrk`CSYzHFMM+djvxR>ERLj5w)$DREzq(> z-kJN%8`j#$@zc(MJCt)MQM!T)*`y;jVK2Z8frV(|2!uoXt5BYn-k2sS>RpjL(XmJ~DlctqDz74d zx!H02Kb1(2`^7*Pd2EMKOZf$gC<*o%y%^6|xfd=HiDSuWH8*zrm_YS?-zpelLy0s) zDhx6YiW-`<3>kAXohFhgYERc61pDC>E-aSG%P%vY{fz}OtD5^>IMJ|9S!nZuOUlZLR zm?DHC5GLu;k@GF@8qtw!ot=bnv%I$^v>Ildk|8pu14wh>-M&x{F#n`0FfWT4j-D~- z2qYQv(_zCfFRd-7XxtXO2G!DyRjAy@(QJjsq|mWHNhqxOb`~SY+$?5z9EMksdm{sM zV@p8Wxnsud(g|T4cf~QTM?$|oZdJVR1@Too78T>q@ah(p(1@>dpC74Nt2(o2B{C44klCV)5Mg0 zc*-m`CMo4enindLc*u9Q@3c2fN<5n$77v-EiJ}fzX86pqA|yy87X3tQDH=Mo(iAqv z&S;VVV8*to%SQgoAuO01ceKthzL0Dm!-Rc#M%AIi1xh7Yv5n!1*6p4fPfloV!lTODkTahz zm>qyN%C~*)zByY@dnEQUc^`e0<$%9o!Kw2MYzfA~GW`e!Yf~FYEdo;H zv7MXCEunNUD2Y?fKAG*Ws0Or=5fPTONPq+pp{!b0&^k$PtiWY}Av#My#pkfG)}s&6 z+5D`F=u~SwGp(>09k=KYVK4mA>&bf@JsOY^hXc$O_n+w&877gSKn%9~+_uTeUvIbz zC_iLbv)t<%Z@9&*3}f0#-WR5KjmGS>)dDDlEY7KhondC@sa7tx_TuOR#7Gq<;F_Lj z0gG)^$dpP7f%l52x=tEww0jIXjO?5ypo@!b-=|ZaMaqy#6NpTZEfz%gz*RQv5{aA$ zFE=%lX%9tS7m-djPlANs5aL>+$uVIwnVGh#>O~dMJ#Y_4#IInxcbQaZeUet=N;d_5 zmhRg^@TWddZJ)}NN*Gtp>xL9ylTHwHZ3F->C(%EgUSGI*q)0=j;$<0~!z!v97w6W& zeK>zo(+XvM2`A)_zR&Iew6=7^Zn$KQho6OlX}G^^D|f}ZnyJU4UEh_kPH>M@#F?>v8{ccmGdb>C5Tpx?c%?SB75qU?x+she_7nWUmc6L&`=72$|Mg%0zjFJ3&i|El#!zpoy~7Oy48sKB zr3qkRB+`=4L-QaKRM?F07y_uIUQ=W_Q&6N$C8#7x<@|(JH9fKGTiPBC?CIYDi=sl? z6+QtObDyqnz0C!r)2S5)wztl5_s(q*Zm%kC3i-nZ%h^F1MerS zaAVMIx9!@t*z_ue=UxvNjjAPiH(y3b5$FYxy=nZHgJz{`)t1O^QpJix(`wCzMhooQ zw4|k_YrTNEXy{wDYtgh;ucoN0si$VlmQJ;xUrtt5R4rJrVn4>>(F=OIJ7I1@Lqo?% z8YY~IHSK9=rki{9+W&#EcC1*?uv}Jz5@N5s&io2lEf6sRMK!Pa$ zhQUnOPJYnuQF{v!I=zu*e{YNXkScaavf*GID!y70brfMRM3Cvne2lN`AGGJlgG|n> zk2Vzt+m?jA&aZsnF3x1opJ+&j;U$Y11vI|g=aGdq8Z;U8nYy5d7hCf;3*X`9I4&h^ zh7oruvc>g^w|!HFcTB)~tsn@}Nw?#^?0Pz()pqeMID)KlG>LK*a4tK7rH1bd4eWqe zjC+H_STR1_*wYB>>JR!H%zG@r$X0-R>^Z7kIGS7BUV)^jdl@oWw$!AE7$}N2L zwc6seSYN0xnRDi5L-me_2@?cx`lb~vO~N$*KL>=po){l>oRH(_+pb00AW^Gi#shc$2G3k*1ii@X&bDT1)oX>6DDV5drICt>KW4vYL8>h%k;OaviT z@K{pZ&+C*8AkT@$Qc}l{3`PXq_Eg*2t^^P07A;an>{k)(8V9ARN?u3h1JrvsOj)ND zBUti9n4loqU(UN1_}6o-*f+J5v~Tc=*MW$0i&NF#Is;pJY%ZuV?IOsJ2Vq1RHEHTC zU8rhOo+<-=#9|5@H*ma)uzEmehEy>aC4xqrM4sL@k=f2i{74Sr$L5?12 zGaJYgHlG(%DB=hlz5|pJ&N5&YrwN2a123M7r1Bk+X@)dm4x2~>cS-~#ArAs9oY6Oo z-zt?F#n%XoDq>2GA{Lw5MMVxwp=^*Pix8URC^7&D7`}qYM1og7bcCd$cydSWm)Jxv ze#uFUN;zg7DCw-%+?gaIsxRvVgDT8MYfs{gXBi79vDlg=$5nX-Ku-RRAnsxkJY4v0);MlDBu-zgcn&@$-HSB0_Rj&X6tGtIT&?cM~Obw~$* zLOx;|3~{VYo$40Q)YY>%_m2VK$#?U?ZVc)Yl()$=j6mjPOCc!%!3~VT!cZ)r%A`YJ_$;OC2-SaR+Kd)n`{= zBoKo!C!5TgqJjQV3qb-ML3v%l+wO1~&ql!+9(&|KOm(6zVQ@}eEU3>yq^h{8j@C&d zCc}(zqFO$oeu5n6LBR}myR`(x1G#sv@0v^>2b>}yb$iP(oN)dvf9FX@Rwm5I^~xP} z4C%qF2R{Qz<7x+@6=o3cnKk_F-cN?KM+o-BkX4zxDGY)C zR^3_QH`&fwi1o%-fOLuEi&fU2T2ovfwLgW7&KONyYl7*8K*6lk$Xf&KJ4 zL0-AUfXpNy5qm@85@mt3_Zumt#s%G#l{zFARm!M|B*7_eT*-)$uOXhUNZXrw9%MN$ z?X|WFp`;{8AJF;29(lpX3kc_QI%bVhE219|_d!J>^gM8f?H|@{ksD_ckb8jy#6!6| zIA6F@Rp{LQ>YXU_63KZ7W4uH64(Un^1S&roCC=Mkoze0=3QD{2bfzj}6v8YNPiqA#V6OJn}0&4D5{>L`Ps zw`h~f2Mgw`oiJcq4II(;G@WN)#Os_{T{5UAT;>QdM{OGwp?WUl_IgY^Cw9G;!;v}^ zIqvn8SRYe9I)Ke)_zG?s%T8MX!FiZdZ#bQ=)C1Jzkn+76@J+l~=|UXUK=Az0Xy7<% z#SFj8URb3d^1!e$ajcI|w7{`CE$`@6h)MN7AwuRSSUiKgkM$X1xB#bRfX_Dze9&q+aV^Ss?S7`b5EHWh;ok$7*uh?i>uy?{p?VH zLq65uRjGKEA-9e>3eg2(#WC z-g2PKuTcix==522Pf6EPuJv|*S*dIEl!1qI>n+!p9$#q3lV{37D{Kk<2Hj3VXlfNz z1l!eiI~B(+RVLyLm`%D%P;I=5F{w4UwT>xl+R~dcB;uqveau!}x0@Jhr|Iaxz%KqH z0N3f=o97e499ZFo`$v0}i?$$bI_l_^MTzT`tdN2-q*Trskk(Bs3+BX=^{n91;(5LY zT=Vfa2mb-Qox%4Boc%>F$?qZax5Zy(;Dzts*4o(G*b8Y5@-BJ0*0#DkFzsGuhTngO zZYDz#PBYLKvugD&Xm4pcGdn0glZmsEs?%&Yn{v}P1DO=kHzt3jKX1)_&T2dvrpLPJ zA23i{9G1(R_>;#YvCOQ%vZVM2DMQlPl8uQRS$sEe4E@dSLfZfWZ@nB&#?`*CKConPDQ@sWM@pNx@D!=wM@!tAfX04&d* zS05g!!2pWFyYv2z+2VZKC#Wj`+^gyPbIM-7+P2!4<=^`HV)ol%0H$Zttp$(VXaGgw z)%b8CZE-g34+xg7Wb{8>QU2?{{_FoGFHrx-{eSi!uw)dru*`VciBf+6)Qw8eSPIu_wyC0Nx=l3M71|n&qu8&Qs^5T^lv{L04**v{ zsK4MUy}bBuUp)f_Z9=Nph+n(Tvt4gFdv`g`ci!^|MTAwsH+%Mb%0-Xi@^^Qa#((1? zKd-N|=zSYo>s|yQC_le9yEiW{uDZHiuGYxE`uH~eG6UzUr!(2?YwT=ngBPEp20d$C zwJWr>cCTyT_ZEHNldL&#U>tXWoEdd5U%@YY7Or5Ey=uHIE3vFv!s-GX8rnxM)YicR zrw02f!80>616ufa?;lt-OZYYgYSl0D22j0l{ZoLl2GR^$1*Uu#Z~eu7`D7JyA~)*p ze;oY|q3>eup=v|;FWswChjYaX?Q;f9;mP9u{2t%A**u@C^3P76PvOCqJq0gO9zXfS z&1cCA=k{hE4h{jGO|ZWsGjMR8;Rgst9HGSv7B1t(>b9$>;NrDD0n}R#-}cZK(F;p= zGpFLVp3i24P7Rawbuv?I1d=^vbpVjwhrQ+ zMmQYAeg^z`_dL5loF|yvOjftW_0BvGi73KSx=h&dHJuFi1}I=`CqOuPxAI={dGO^S z2rL&-ln=+4)KL$p-PmUCxDsI}a+>mSo^|pd zlbU}9MKu)bBfODQL2huQ3?jC|Y}sB!dOS=OLm0H%aG82Zc8;ru%zD0Pw$AmF4~oOF z0dq9i_uccTXhGLesjlnss-q3&10XH@hlqE51_OFAX3!uK0WIW#jZ}i2rU_NnD=BCnB-5~P5nfoFdR4J+IMgMxE}Fwyyhm&H2Kbb>x0Kl7{5gjuA57^7AQjQQf4qE;a$k#OEM zu{KHb1-4!2P#yc{`ADwdg#i>~R#_*v;pcT7r^_HD5)+`2n6w?liLKSn;lit3%uo~9 z2<(^ObTo-PECP?Ckq{qzatFnPA3HuVXG%4otb<=ZNDzSx5fz#hq7HqCU>fnlYe5lT zgJ5Q9`sa73Y@zQQRcJ%jjjxP!#R%GIZ6M2PW=yFCSpAsFP2~;XTlb5k(V@qop&JWL z6-ObqXaPAivL5s$f<;uEBY5Y=5EHMQDfOTlZAp9t=z%U!(F~T!suD2B&CE#w9D;bF z@%~A{0=GuZ<@FnSq8eEQ#dVR-&(o3kV~;G&7N||yg=>K#$w=a*M8`9eguq4VoOU$V zhpvaohoJ>g>W}DJmAkaw)W)zUBCaRAp|UlbipkBO0R$imVa|3bo(>i@H}~f>l>l?x z7k3EhiTMmS^awmlN$LZ_1AMwqTB?`u+-8o&(ld0)^pq)cvTrFf>BA@kzmQK-fCAXM zwH(G-a+Drhcq~GjONiYtkXU8mjCfs%)YhpTPp;V*fXb)e*LC>l24zT9g0x2yv^5v5 zv$+iCf2ici=OfmUgPP@_vSO80EAF1>H?VN92Gc=z4;JP%@xn`ronSfINzUv?rqzkH z2+PT}%#eEHVOBDfBLv%_JrPmhbw(ov7_2y%hdh;@(v}ic2USMC@~&GmO(WI|kvX|9 zC`)wn^T!0$C3+;3!83)@{y*&9L$feIlQ!sM+qP}nwr$(CZQHhO+qR!$`%L#@qQC9L zEIMZ5y((%`zaa0ZtV-wQS1kyjZw^e#-9;Wk@1@G<85PoAJp(g5QG-m;aZ`5foOUB; zWT<*FY7@qEH9AzlK0KD$?14z7XfDOr&rPD(Fx=5!MLB~ORVy~-(BOd`8I-#i$|4R? z1HN1)`xt5wDtBj+DhZ$XT#W%$T+upd`eJPz;k;Lw{74M>P{F_zC=#rMNTDK+Jnv%} z$nlbM_aIChJn|CN?WgKW$J5fC;#-{|8@kFsO7*sDv-FsAp~Y|Nj@b^1Ob`}^Ue1H6 zJf?r0R%K&nDN>oLFIP1kc&<5BtTEOub0N79YE2E~uh> z+ua#i?jgXaS$b8wCmJlPB*8pTB1hh&BgeC~lDQo^&SHvnvy6#2+r7Sngxj^CqmW;5m0?ZemCCRs?J5ve1fTjC#Rl!-{6Ka+rCzZ>!4c9Vq1TGE?+hdN@GM zSyCCq&6LAv%4vWhceD7q9I3o_o6d!>;*!}Aj36z=_MbS0tYS_~yC_LIFpu`7qs(eJ zo??VdXuY&Yv8$V#!w*7kCI_UX%iKgivt8|?W_}8?0}(rfpRH}(^T)W zWFkHW&%ENpqTkX{m#=mcpB>*gNGZczgH(QwnU*mj4pZUjFI^q<-EHn=8?q! zMQ$rgW45G7ptI2%q6h2|WRye*I*W+TVgoyCR8zX6MOvr9Ua`ZPvl6~FNt$fB)Q>eU z`P9xkMhSTK9^Da8D+IrH&6M!r5$47!vyMeDe^i8Wk<$WE4W zI`wL?!0v}Vs%2_8;1`^qW_61&kZ*1<4 zMwyXQ^=)o!f4nm`(WpPg9{H`|dQCu^j6kQ^7Hco!4_XLrq!j<p`%nVyS^1oet|Hps)$AA1UiiZ84{6B4nGmctonPa&%uCi7Fsa0Z(w9D6G*4lAM@C09{XGc3zsnkI?%-1WZ3Y7!nG4(Yo5@=IV*r zi#`dnAsb+71wLV{`m=lP-xvF&c16uxJX6BBymy|$HR+Q{S$}_YadEK{V~$t8`uqDk zt;`%2Pp?zz8-z$U#phi7z+mp%$Hm9TcJ4HchdTC{FXxev{N2HHMB*dc`)ds)_CA<1 z&(m`Nj=}Txa};xj?0@pdc4Q6q`+I*69yjpzQTPTwp)_(7`-3b-3-_D*%u}uRu+Uay zKm~X>?ytkECY5Q4Q}XUPc0vEhzyMLuyrXPI>u@ZLp_)t1tqR6i=Voo{pkRU=bGRa= z%YcJ-21$7|!(Src;fffC=z6}myxT8mh$YDD+4kn{ho|lxl~49=odlYPo2Rzbi9_Vb zW&M!zF0CWrvJ@!3GF(3Y*54YDH)z!s@#_6w`C4^ zJAm}=i+_VBs)L|;uOxC!rcz!ns28=NPbFT@Gh>`!@Gs~$`<&ho7veJ*|Df}>P@ZHB zqF;RxV3^9`!qNrZlhU*yzTyq#f>eP(U+KujfXESao0P(!yts-~-c;I7pUesFVEzb! z{LJ>73EcyX{5{}8)MSNW_K=$d@~1n>m7gLa8qpP!pyFp-wdHII*dkPsbQ z_37uO-f{F*gKnTtd;oLibGUhiTA&F2$%X4^Ynp15P+=dbh<#`g0S}|k~D64H~0KwBJ+xP zgIXX@w5#JPE;AS6s|Vu^Ed`K-F}(4p7n&xsm16~pA-_W2^nE7LL8qznyk!39&hfLW1u z8=zg0c!2LI9T^0Ro6eX(>9KOST5)c6x3(K{JHi?(FZ1@4dvgHsi4VSJRsb?q z;=wu5kO8`y;KUf=x_C`)KNC~~TIK~9AmOqapqX$rfaG_;r(_FHsE9=;J$3-<|L+8m>1+p-o&U>FZ&szB8>H6vP7H1KRhg6EK722%(kq^T0{0q~nI z{o{ZXt9=9Ew?rc9v*6|#neH{N(6EQV4vuijT?aZ}qnFqf`$eZ%Y94uU8!gO9rE&+R zfF5bl_U(jDprb;8Uj)pGLj)fS`_w*C+lX$J--86hT1!o5SH=}qiOEi{GNO@quxL6{ zt*|F6BWJ(|p#u@R&<0`NZAmlI8V4&RA%=KAk2FQBHeN31nC~ILJ1KAGyU*6S^kc5< zVeJn-V;11eAgZ3WGlrV$tYI%?gmJvP#_;U_3>ioL>Y@g6JoL z+LG0{DMY#b!cGHKcwFNQOGr zD0-D3;bahkTR&9D3m6>!>0)r^qVbx85WsvN-wArQ;8|GhAhQ%o7KPcD9v4jJW~&vX+Ctd+G(osYVY{3M>*bx5*iK!wk7tw16wbzCz5Xr$F-)ufSd zVLlU`cr2H?p0tL|a1-Irl<@*$dPBW91$9xa2e^(bKEFpYJb{lmBsj@Rm!T?mZx=o0r!b&Xbeu;){vfQ1>IHY<#&;!_|2QccxZHh~wE?jeg__RuPRI zKU>7MI2TWl<;V_Fa!yCS><8o0B)Aq+RFYL7DpKeYrAl};TBrlqj;mZBvlp33T&1RfWH7rvy9}(heeU3vna1ean_Ay>*NpNW2G@k zA(oe@%s3O^bH9ArOIB!KcNNrY!o~D_C>uiJC{Lipc`00w`8uKw9mkhrBxq*Z27q8D z_BvN_A_;P+pyu*0wiw{c!SRR;R`R?v@NfkU9put2L%7JB28<#UO(A!oX&kcJRJ}FG z2yOr&dSS`yo10gh)P6+lwu3BL-W4u!nR7rN?UUC<&KS@w-3Lts9}v-08m`sa?8D~m zQoyya^{lxk$2PI59M&4wqjK=!SB+Bxh^5eI5@p9~)v0Z%sOmAcDoCaS(Mh^CK08nt zPD17-lV5{4R3nJ}7SxmO#J}Gp-Ho-}n9h|cBOpkmx7Ej*g{~r(jPF3F9NZtTt)6-QzGh%DSj&fk( z7u5(EZ!q)Ryi!$T3zl)TGOQf;u&2itEQ*pdbEm+z$7Pv;};-FODUQcOWZP=n(n^ONM9AW zC+q7U$#tfk`uJ90IhyoO#KL0LuqC{Re3AlYs_y5dT)+Rs;Mkp=M?_87fqIm(;%@}w z;tw3VVlADsZG724AIyb6cF2<^F4Yu-cs5&2sa*qUzr?n>+haj|XsE7+-BXY)HLBu5 z~d_kcFS~_?%84! zZp&<+q}f8&3UF(gw`wT6P)J9JZ6!w-S@Mc=?iejG!zgAG8wZ7w=Ce$|p9{4m2F8D> z9ruA~&T9}~6cUY#k40N!mkTG>q2&>aKZeLu9gQ~Za4QxE6lWE>8F{e2d4jhq+ zh02`BbebT~2>b#Ab(ZXfe3<*dM&59rsbQq^CNE2srOhnzvEB6$h znt#8AS5;h3qi<$!X6MlAnlwVEvA3}$5HkKs%N{~e{AZ5-QD~o?{i!Vv6rLwH_I-Td zf5%XNFUQY<`(M}`;_G4~yHysx%%$tw+4wo04-WJ1?Qh)rbb0w7H`l(mlzFYQ-?{tr zSyzRr{>#qy=?krV=PwI~8Sd}=DL8%7RYa}X+WEcyg)2My1HeB+v;W_YivRKdLm>b2 z|9{r3v(6~ufH{kOe=ELL@XHTuMtuOIl8LcoTj{EnH73L0NgYrq1;<7x3PEMa5t`Ez z<57wiP!iqh3mHS5!*QfX@H`C!e?7KhW( z)YQ~9BoXS^(a}(9k4-CDdj0>}N2j6bbv+wH)-C#a8X6r9A)lqCU{~qs^f~+iu01I(ACfz3dZs zPUs7aQQ5Ii1{09FY+12jZ0C90!Rr?TENJKFX7hQRyv)F6hu@u^T}RV7Q~lp#_4LaD zsb2VGt9!Z_02vDU*SB|f!t|{BA5QS4JKqQN+}z#a4mbyft+uAx+UBtKzl) zmFKpD2m>5l6W)Ui0~mWQ?m>xNmiG!p9u{|heuS|{_m3!kJG#$v{SUM7eV^C+n{PTk zM?jY*AN*bO;f`MU;S2MB_PYKReH^Uu>mdK!YWKTSjQrZOFR+D6p0~SiUJ6frwyo1u zd7H6Z-_%9CSL?5Ov0%6}@-3dy_2hEwHzpU%UgoB}g=o(JL5VM3*i}7Drte@V@M=-E z_D+Z40O)C%=2zuCd zK?C`&36%7ub=VN7tw%fRof_yAL|gMuQ@M;aO8&fq>>9!!li-z5+;)tue}yjqw1Ak+uo5ivs(dUy#(e4!N6zGqpkb>3HH%e$-C)Ti{Hx`0dbUVUtWkYcH*qA zi_dfHHh^NDXfIm*Bx@fEys#9rMN)}Uu-qmSPfcDP<*rhekdwABRL|A`91M4uai z9=q*2NW6l`F(~&z=R>ZaI75h1u77>axhk-~-9`6bbJVuO$!$Ze7IyLb3qz3sfISfX z7M0wRiofc<7jO3vXSn36Y<4)p;iQg#J+eh$QftR=c!z2MS7bfw9~SxZzc|wGd#}9# zz{{5A{4M;+9syzffWiBBIJk*dd3d@SKc!;V*V@$ys{OE)H$ku0^?#0m;eo2ssfUQS zFm|a0WBFkiI{;U&8)B(;5?R5>6!n0)-neuuWODJyzM)0mfF&T4iiiRqcL9u7_%9i1 zB-9QoSI`KyML=E99l-LM0Bk6>mFuNvvz|mj5mTW6Nb(-o&x2Tjs$TaN5iF@zcp%5z zU_$8?LywA4W=kZdn{$Y`XqRNmMP9)`Hg{==5OYvAomVgq+!B?#mgG9HenBXB$@Q4 zO{9|0jUg{b*Qgh&!`Q@evcTa}5g^}lqYW{@VM{+WLuD%D69z%LqBuLwP^Cg~F%l$y z145EDG(9J9V4tuIh8}M*y7i#Q)-gd&mPP6R0JbY8p}Pb%K|IZL;4DA4K~ge{UEp3? zg^?>w?W9B?%lxb1oaCex0;0O)NtQtbM$ob}P_bLsg+vc~tU*d2Rbm9?GZ337DlqwH zm@5(yt$5C{>=~C|k;$;Ek!F%?O1mWjcJ9JznzCML$KV!2g}k+5TDzz^&1xzzopb?v zOi*5$FwR&gzSXC|XG1LggzczdoiQxHCo1F21qeUqNM1%h$V7H_-9l03kQhxKf{G+6 z?3>;gq9YqoCFTMFP^F3gkyR+VaUpPLcD<<)TVf)33;DE(jKGNpcTW*|rV67JQzGI> zVNOdb*?(zM;0i5n%mb;z4vj0rps+0-7PdABzf1|1f{aDkSb@72%)uLpJ5NR>t8Uxl zEJX=lzJVmHhvVQ&&O~WfZoy`L{fj-(eM1xqEJ#IaecJGNAcdC)cfjSvb0WvKYc$;4 z7tVMXmO&|?w?e9B%yBKuIrSLQgV8wh2q6?Lf5RF_J9wrblJ0`(GhH=jqv$@XGKzlOx9x zlTYZ%JlIR&^kL{`^+zWduTv&x?^!0{0)ueYB@>$F0E#c0rEqdCBCx#8JST&;P*%|9 zEJ$kJpcK781bNUM>9|!)Bb_XR7SA46ZW}UK(eUx9M-)*MC##i+i+PZy;z1B8=|F-t zw=A*=8IsO!)Ww+$a(n;X)*`wJdd?f|1)+fp%7Ja~isjN_0hGs30`idUa4J_UCbzIl zo&0isL+DhiDIr>^{b1UROf(U~g&H@BOjyoe;YGZm&6=iYj8(Tqv#QV}6KEa2ocEkO zbX$-RGFdK@6~|5!=P)SgvQcq3*&`h`aW2Znj|{Ts<`Z&$lWv=_ahz9tGG79J83RwM z`#@+LZ`!P<`Y0>NhGQ|f&WX}iIZtj68)oFh{N%DA6zZDQ9&ijZqir0xoW@e#l;t2? zmue90o}sa8|8~GqD?^(MVF>DM43nFwD$~Y-j9b5n4OB%=4$`zAm0W|b64;a1&5=vB z)W>6}oK)hT&=5NR&jgrTD0B~MOLj|BbJPQ<2sWIIl43E)9%mUD<+IV?WXNSLxrK;l zD(&G=?HUJvOnIz#NOsQBdyC+*#29h;xu#@m>XSkT%Vx!tE#r+PLbE&2X}fCpDv?~q z1{bDChK<)t@CvFg`82>|BtFJHBa7som>mtDvR?nb1!8Vfm=mFt(Y;H`QsMB`_Hamk zqbFkQ0H(AlV6;O3%-PUQJ~8CqMI{Tn*M_L)NHKQtduzR5H!dEuOIweT$&k}ZafFfD z@{N!dAXS<@TWCH0)AfXC5Bz(GW1#w7?RbcSqo$K(GETkpvxPc!_=plNZ{`Svke;TP zt4vr4EgcQ!iIYD22KrVyql5$zW)xo}>=VNh{0Yd?^Y z4laRII#~vw4FVCxgJz9dF*=_rPaSFXd;>2Y5V%n&Zvv*U zwu3*m%J6q>*Zf*WV>IzTRTZFkFQGeQDpNl#3<{g(I4`5NAE2gAfGc;)duPIDg#~@- zB24Mvk|4#!NcPBhQV&Wb^%G+LxwB(ReCZUcH%NB}M{Kiz8>@`*M3~Uz_!LMh4Z20B z>LcA)$W=^YFv**S8q_#4C7;RTKaTWV5_;WZWra*MK&s!ALYz^ASZ`?U#_=n-p9d|f zW#AfE8qU%lVl0PvHQ8SvFOjL`p)j5+>Aq6iS@L-WJoD%%`X;Y2P81n8JO=Yn z>!DhIn62iOSIv5x{Cb*c0M~3dC_ll52{B!fx)NYr?yEQ{W_mLCf%Oz4LbSL zNm1>*01;b|wBE^z1SdUiZBJ(@G)+>k*@D5OvZrCD@QK?CTvIiYCCDGF!Bo_?IPmD& zY73#{L|mG^oNK3?gXm>~8RkQG4_D2+rm*i!89a%l5b)l;-at+$XYy>2fA^>O=R0=& zroXK69iGA5`Kcf4{HrTT1~J~fiA!7S28r~XK7PZXe8c3CBJ8g*rYGoV1mjgJc=#07 zTXQJzyyPZ4OEprIRkyp)#k_}p!y-rue}5l*{s|FOkM)DQ_)tfh0F(F!{sU_{KsD8x zJa@o#+29K=uxntxsSnuweMXg^XVploeIHlGExk`4;qRS45BT@D@cX0jZ~Ei$*!;Oe z^Q6G}PUqk&Uo@_(dv|~rZE@0V$DE@-do#+<`HmsrC`9f;`YWho)s5ueLvRZ~{Aa7@ z`~Gcz?f!eJpsD&^&d$EhzP7<`p*c}l)!Eh0>*fAxEqN}3#ZXMz&qS6+Mn%wgitMaM zm4m?*Npf(jAlOTP$ZF0)v7|I(3fzN#qQv`87B|M8^H67#!RdHawY7dpwzi;4^C)_= z)GHG&vfCd$u&3xztG99KMlT?9?6&my#`gY2yW`#8k~VB%z+$OB1&z@2qu)&#N~|k6 zsIJ?5XBtub`NlSXaNu~qJ?Io2FWmwIoN?Ycyj98gJM$4m{nwiPztgR-pVamN71F#O zt~a&qYU}$wPCsMyb^ldM_OA7`eSV7FHWYN#*Xe6RliLcSO1QZGtg^FN^nb&v{Bl;4 z{VebW!0+Q9JV^4`9W=&_Z!_Gp^Y}!h`;QaLWtSPO++Nn~u3NpW8<@}Z1CU)vVf=5W z*Z=r`OYHx+|JVHQ`G2>2o4bc}oZg#V5{c4vaNCjx)O-}tDHM3#3UCGla(j^34iJ=S z226rT9AW)0x$=IkZ_TygQkJb&Q~!4L`qy>!w6t`! z_4V)GzIc&c)6*~8_V=&f*4OOzwe9=$VSJLk>z{S-pg}EoIv$Ke zdG}iR*B(Hx=B3-@jz}*zH8r(?aB*#2-JWJIaC`Q_`0ngr7-cOS8+*4ea_8$5m`o)5 z&un*N*84~Aet*1t{Ytu-U?!*W*|<)Arsf-{nsNQy)y0O+*j+F=xfvLCJRZKYu|yUp zYn3DQvg7so^5VsaOz}-+>_Qqj7Y9z%+2XO!zkA5c)>O;rN2xnu93Q2_f9$ZOa=UW#c%i;aoR~9KnKhsr!pMw*kL@Tk3TMlNt4@FB>NitTPmO!l-nL8xQ<=q6|Yu zX42=(Im}na>P^6hJu}U?;WQS@MhW>WP10i)EN!81^Hj|aVbJ6_uwU1J`*663Bi-gO zB?Ttr`O4sAO{<_<<2zh9T`wS7#5S7pK>jtv^5S&@5cwr$M@vbM|%`isFt5Yg2Ng0+ZB4swLjh?up1XP^IWp*qxG!e{c z$XPQ2A3rBy?c8FhEL(;jm zGAm4XRN;dtnyD4yBI-Um4?>$C2440GORiXIp1wA7g~`bUod`TTp42%+IYJ0}AeS-X z^HGSajaeHAI_Dg}oTP<((Nh}Ux*@;4$Bgg=s#8}=9q5(pn&4!HZ$$=}`AjpYi{Tt< z1X>&I#lol_;t~)U1@#BYIxBM^U~j|euBgTOrJ6V=bE8Fg7P_N{3K%#l6UK&dsfx&zez%i^5LtP0s z=DB8985DvZEUAw+4C~Kf+EEkCXu6PDXk8Oeuo5k zUiL`h4fW~0ak(Qb!a3_MBwYcjdC2ur8l(!PWvV(Na4NWzyy`e?={$)>@pSW92IHV* z;*`}OUII}F{Buv)GO_?V;C9sChW zB$m07NcAkG6Cz$XzI8+?N6K!TQM0VO2}R6_)r0~-!lEbS##P}J0l04HNtYi}l|6z3 zR$N5+a>Sw3s5wuPZlw!5i)xU{QmGLV`N!vm871m7It7|Cjg%@HErWB;1Q4yF?_JVm zBlT2(A?r(C+qn4oc;}?Dg>p{A+Y7ywwd-8-09x8Cbs>s&%LEc>0`c85I7@`^PNN4{ zl*Tt4L))?0eYnD8#K=szkf&m4_|PGiiFK_yxaM#HMTFV%17$JTZpq9vmsO+9X+lbP zgc6t8Tg4NGc2_n*y2xe20v+6vMU4jt_zV$gYrE?}BfPwt1Gd5)>y&I~M>d zV+6$2R{?=JQZ~D;G$){_4+lOdbcXyP#aD8u7U;;mnC@3lCm3~-j8g<0G0G&-bpcur zVM_l@^4A5H8(Pwo$6|z|L2h-%1G>&r##7fN>_iS5C-H?XUgX^i)yYtYfa%Qr&)OtnJ#d8dLFo*GWemiRTykZE7EOUcxaz(2y zj(J8wBLD_zQ*%Z(Zw3rJyP?5y8?jKr;oQFLKRwpKnrTp(+Pn-gR)T% zP#hVS7$|?1$>Dybw@62hD%|N2MFfhAN_FrjZ6L`R)_xg(6zNl9q1bUPp_nc!FtiKh zv6EDR$SWGX4F|#(VV(ocx5j>zFeKfhwdPDH!}E;0E-ul)s7ayL43NTnW{dQ((1o(` zl7c8285z^59*4nt7T)j<$lRMt#~B5wo{rm`OFTAd9|Jd$zptRTj1na=Aj7mEkMg!H zmmwDj>f{!*1S3VeC==bS+*?Jp!!F5Q*(L@oJ^LYuSft~MsrY$PeWFz5_r%vo!T@3}Uy-2rD26~{;%3R`?np#Nbv z!52?-1BK8_QTRd9uuKeup%L1JnS%T1u~-(MA@D8J#JN&LU;V zYC&|kEVb0K z0||4-oQm>ItzQaQOv8isBTMK~nJ7~Y07<3xG-oXt4oGHnc#w1IVnsLg5TD%;gV1*y zL^BF0wPmkB)(X|NS8|Z}p&uAhO5t6?&@h4<0d!{vX_^A27(^VA3<)9?7zJOE?*aO_ zBoCPm5dwOHaFwe-0P8Vp`GnOSd-rgC9P6#j6u8K3YwS-D8HB!%#p}VKKf203_yVb- zA6Q5t4J7NAGIX^h3@mVaD6P;QdYnqu-Q1%*f2-*sru8lZFV@&M2R z&D6Ey>{zPISiOzy=h8vpq0B*XqwFar2A&Vo;*6lDDbiG+AtbHY+(S1EbUo3l!U36M z9S?pc#p}uG7smpK)KSpW;&!2E1Iqc07GUWlJqd6!WRDE8$f-CYYy$?aNNz!0^C>-EF`JtaG#5geKBhn?mcy}mA3*DjNugID;Z>! zr5c+0Qpch|@5>FQE*vKAseo&y2$X!3lWSgK8@`lG4W=>~-6tG`)Q;#aL|*KS-;1mj zodjnN!NZ#5mGPE!GW!GMfA@(nq>p7Ry5ZheAB#?RhexE@E8Aff|NedG`|T+;RxQo9 z-QH~oe7d&+QqK?T51mfS8w`3qmqT{o`KSi|TimZ2R1M=))DNVE?*DR2sv|g%CKCHo z5LcGVP#-quG)JWPi*TR5Jvz~^z7u$)LGguaCt$W{AJHGgc}cm_)&R&~Y-iSl>e4>- zU$ofd9Z=e0VwFkiEX%jb8EyWn8Fc>CR6%8Je7M}3+nal(ORLd9U2lJF3%Sai*I(hO ziGS*NfTD{#_1P|j#(V0}bO1s31w@PZkQ0}=&;qap4{Q6Yl(#Bd3DEa8PH|Z%3fAqL z;5?7vUg#e_!?l*vD-SQiuBHN^3(cA_$45J`Kd5;C{dOO+AIhd52-4arH8q|Qpy;(_ zHAeL4c-@_v`JA_W!k!X)KuY?fBU=*XGXmyFWOzzqP-y_2233f0?xNQBqXK zzunn~>(o$0Me*%;TI|);iT;B$y5dav-%fM?@gM)sERuxngo?U^b~qwd*=(1HMCoT~*Fk8rUNQ82>T-$P zrvv5#ZBOtMZoHvw&yD%_wWsW$Stt~O^=`K_b2D@I=dQ1joe7;3eI1|9v(u3i`@WV^ ztE(R4WmwkO+Ub5wzQVEXp$SKij+X9^Mx%#IR}URJx_V;f|DlHux3;z(V)4||(AB~| zIO5`6YL-g>_i#XKszrE-AaGS(UB$_*rKQKm$1Mlc^6Jl|D!2!0SBb|ol_n2EQ&Uin z^oIVXrnat*2&H>K7oq+t$omSU3wT2sO-+5^NrTN#1yyvxuSceA*yi-Kfq+y~vNGxF z%!UzTitf!KEc!1LEzdWJgRI6?=cE%NBJEFwrdty^BGL% zUP!X*rUCg{&~^8i4DqVBj(T151lOd@y4};ojSy_k`7piZXTI53O5TS=g!ULs|K4hD z_iHBIyJ~Rw42-Sk)W%7=TWITLbZ)i1Joa{SKI@G<);nYF*RQUPQ9J>E={u-B;Q5Ay z+}$EuVp*dw%trHse(QBqt>?ywtwQhqiH)MX_r?z4Ud_VU2O4i6@4OvR{D=xnF>no~ z=I%yvy-K})(^hd=EL$A!jVpS0BJW0<=s-|gN3`b=r>Z0-gE_!8@-LS>0v0?>51wkN zuo9uSc<6me7I&=%wzpd26_}V7@;p9)-g^KoIYOb>aGw`mMa03pJ>whht*H5pD9i^` z?BmmB|H&-V{jB3(VNsDbNQ$m%?lB~816*aWhe;bwJ0w%l3rGLFxU~pSLLp+epx^HIaKKza?>P|R91l!RFm1B$Rm~KJ%*`gO!I`mRd)*(`Yzp9G>S<&q)3#m zlq)h4qLx&t6tu*uz(vs9+~9@a5x*=8s|b}4GeS2a9{uUfuC-QQ*z_DBCoDlT10bMWomv%;%1Y>t^j{L z6xy~A=rj0D(~LB5Y4%?LBVnW+&cW80Ng*kE&6)C*}3_6Msq2?~Zv}p8zVIiYhtPktrgFAIJ$TwSfwSzzpNrsTg zn`X*n65r?^9+!$cgy$NSAF+X@-8HVCaS}K*5-9NAi478;3f@C)SmNjQ#~Uh(Mi{Io(~Es_o&b%4M=H7B)*&hHcX9{&-g>~L9!1OCh!PSK(Ev+u-d@C9=nX*3 z>oenVjOjKLJ8}XCBRO6`(RXDfjd!`paPJ5RXXG0RIim!c`#{UoYZgtDLVDb6D+L&; z!V8!1i2GIDFk?ZZo_inrobSN&uB~1!Mnjx6DURy!Nr*B=3@;CW;hI<+#B`k=y-O}^ ziYFv#jAVola%cn8Kp4Q2^WXwm9KpNHTpm;=?3x!J5S)hK^YZa$ym^R^R z1=oc!&k}Rme^Fjk*tBYaN;JVyShPk-Tp9}CW;G(PqK%YbY0H@yD%5&KT*PW|4@iKq z94<6TC^tnnaR_9FBGL+ji)%8>84w%!qH7__yaYOK#9bL&F0kD?bhVg7!zaO8B@#x+ zf#n%OIF}2bhE4j3VgLdaw5ycEn8pom5PlcfB=X6*lC%oiL$`$sPczCO)XLc|Bh?CX z!?*?(1EFT|E+>W58jaW?Zf+ho%4k8`O}fw)2#2O~2893UAE6O331DN7ZKpIUD zDg3iKy@=>FNC;9<3c$Jre$b(wSalf!Tcj-IlcM}q9wycaC9zFF-dcheb5=s$+J7tB zzA zXf>_?Q*-lTJidHJ3|||~kYfr}cx|pf3zTwfK>>b1v6l?K_X*GrtQkIVNyyWlV8m8} zR0YoK9#`Pw!EJghJy!u#)U{)#7&nPfGV_t;%ecSe>?~Pc4tk&A6S>@d_^hE6lvVL4 zwD84PHlXhCV$2Q=geng~IXlBMTBa)Trj0-9P4IN>L4pVQn(%nR957DMVpY}$-hqeAC{%)g*JtKx7RBd%JJEQbmOLB1%PEAgWL@&0UsnB7m_xIGfU*#0UJk4WrOU$6JYag5GSzD%oTjW=OTh@-^HDn zf}=LFE8cAw0Fu_^lY5&}>hNCj#YY2xB6!p6v61AAODSf|X}q>DMnqb=(dBNGh#y!A z-`tHje}z6K8p5ue? zrpsR@CX0KQI~7I+HWKTm84&9aX+$u9^|51_?I~;(ap;dG8W(`B^^$=jo;C>t0R2+n zMTr(@J*W^uJr-2Ce53Jt3XjN4A9tjf$!_pnI7)7)vu35DOA(fSccI~!?aRRqGz3Q8 z=3w)MpWKPV+eR0_eJf@xI{b+QwQ-owdmWCMvy415U=a(La+#cVkH<*y696N}0=Aq# zkUR@84QJf6%N}+ef}R;CmYS0h8?I!Wz{&8tU_^;Ic_RIFfC#kx68;jzK>4Ffvhiy1 ziypEDFe1v}<*RF4JjfWjYH=`y%6I!D6~MWN;h;=0k|86@G-pY==&fWD^HF%(J)>An zb*Nd)wu+C`tMrs`G8j#WQestFmJc$ZNe?3yd|}iEfNjp@TNvw&t`v;TDMQ3PH=01@ zJ|kt<>$Kr;W>tOj?B$SQp|8cfa}SijHKbi(ldiv%icGPXFDeaft`lkS*B`(whlD{y zGn0z^^Y5F3x4}zX&exrl-vId~6X)xJHE*lp>DdKA^YDAVe`URjZ0m4-LS9B)=R2Vr zxZC27i2DpoXt=Q_8go8!Q=XAP@W99aGdb1frNDDbOPlKzAZpi-%D&=(5?*{8mv|md z`-Db1^wxXVKNsO9I^u~LS_hE`O#Cul0H9|P$wWmIG=c3qUv#mURzu+YON zEQ8G#h-y1yb%gDbgJWffUR&^)CqP?eW8y=^7ktwKHa{y19M7E4D!|Sd%!hoC%ssyV z!!sx9+CKbl%l#$95Fo1fV2GY;OY1&eK5;*UETeIFvV-;iSYT`8_nNSNS?MLC8-zK~ zJ~&fC^=AY`XQW2v6CbG_03j*R4>(&*@l!zD_$l=O^aubtL0-_2nBp-ZL_q7{R3y|T zjYCEyqdTyRcbbtPqZ`=Eef5!tz6!#9*Z2FeJmmkDi43dI_ptWx;_z_oPa|Jm(_gao@Natpvl|3pR3xK^O|a!nhXm|Na=x?fX>rD4B=$44wQsNQU3vbf9hznJCJGB=aM@H9@YEye*kGfmcPI8`=h)& z7uQnr@AgFT%cyHsHPuy>SFNeWs;Ca9jaye%Ww+(IbyKRTs4qovd_SIX-`UvozAUA- z`@4A>dq2gdPGhInnR&x9zCNy<%JL&%6$J{@+xPyG@u-jT118{u<95}3!{Xl&w#Lfy zq#T0${vdZK;c)+NC#V1TkN@vGga4oWziW>>ikjcqz5ccryY6lL2*}uo8=R$9L`w^c zk%X~5g1=sfq;yy*kEX#wL>f_|3XS?Kf0@5vZc+W*7?t=9zM-_@&h1HW;>CAv>|PK2 z3`mHYv)jwv&v`z>+0W^0c1s&WDf9M{yMMPcBl8>1Znx`}OYd#g(CK`&KdacvE)z1zmc*P3MuYf*e)C>$|j zXQyM0`A5I^ZG7FaW$b%%7L)yMr-qY@%jq2dX<*|0b77Vf;bCER&Hf3jzWIz6nePFW zMTtDMtKI#6f;Uzk92{KyS8{JxJ)~Pnt!`YQACs;8=u)c0LdDuerE?nR%HS zy`KMW-t2@GExda3aN)vlEj`%QwANYcTI@ivt}Q@dmD^~f*$tav>~y13Nr<=#4868= z!E&Zyaoa`O zOxq}EI1qSF8|ly$kfG>+G~$3~dKRF@(hhLmp&dgzhFw>us)7`eUa3S;#uCuOQpN`e zed-KjvPl%;2wZZZ8r?WX1CT*72q4XkX@yI{C#EL65>pCQMtZ3@0zjiu>c(+^LMod@ z2rDLB3S75(mq-$)%XX)2cZ^uVE8}I=#KOn&4PymOhX^j>`3~;|Vti+S5o^yeIab6P z=QnBV#gxjgj}z{7P&7esr^$uT@;pq1lGSKJyMSh+Op|%42)0m35+lG*XhMl^c!2VO z#`w^P{p=R5U9kNHngP$a)?{z#9ih}LS_^9y;01|^U{YmKEr%;%E%G`z()5I==VYN~ zCviK+0UPE@2nD;i92tzrF$pc{Koel-L3TJ>mMhq{$>rt3G9idM8v^XZ<;|KcUnNw+8i}~SSsJ3c&QaN8McM0YOV!;hMfR52{tX57CDh&>YVtRnhZUYu7)uj$@u8JYhVJQzx)y|?VWGmKT!b=`LiT^L>kcu#0DYKl+qUh~ zwr$(CZQJfXZM*xlZCn4gZQGo0Rx`;>?&@Y{aldC(wW*|%O6vFIeK&GYOavvqs8JbV zW->@a?Gxi>h~!BQLThhffcU_<&SS;+L5@<}7av0#_YX)&6xD%MX?S(Ywu{Odt2IUW z7bO4ad&W?)GBnUiM_LSfF;QzJTO2?30>gVDXO~@B>A(Dq=Jd`P9Iw(Zu}(@MK2_T{ zq;H-e)usl|Yle>H&Ea5HM#Qj3@-7SWwk&aUNG=mxp5?)xHO}>_U@S$3AQH3~yF;B; z9pkf-DI~uSwC3vT1ziN17%Z9mx8~70UzlsF+Lu#5IT0#KeoR7LR4~#MnU#r)T}FjL zA7faMQE!pdgk))Dfq+U&H9y1-p(#l#0WGig8NB+16ed#5pnlVSx8PzfkQyqwvj4Fy8 z#D3Z$l}>5va!Py5ZWryG#7NvslOR0rHeYv!uYgt*>=3$dRaWrRCs?ISJy;-ByC7YA zO`I_t?thWmK7=|PC4?)>s#1pW17lD>@IAc>iPD>Hrf$LikO3sUMrE8xAuoO#3g@rv z`j?uLC?A0YN08=Wf(b_8;ug3$k(;*K2EHoLLP!BfQk3mv&395dxk?*}4|4f6!I&N^ z|EFQ5o$%vZkWw3msH&K%s^*#=DQJ%%sw(d#)ZbNYpx)Fa*2(?*fR}T?+whjbrykMUcM|YkIKnL z8a|3tj@M8a=dq~;ZDGif#4#<~)O`N=`>6Sb-DbFcCG&&rwWzYl_=a zLZw_ZdLP){J$l=3sC5u6JBjQT=T^7DB!L7xHAcsv4SD$9Y`HMitC3EoGsHiC>k#cP zQ9MQd(Lonf%VTN2IV1YaK&R+T851?FO7ctSP;G^c$qz%6ds`fb*|Wt~oR9|@5XfGG zh><6v42V9BQ$@5qtk;kV1UpuGFqPzCWTtUGR7OosWukY{rLSVTF>2@)_>;nLcEriuxq$CV8zA(y&ZH+j4+|A+*D?idI# z7PEi%hX?y1@J@u1g&*6^ER~)NkBG=z3gXye5QPK}wIqFRI8xDL1b6A*z^GFwG7D$7 zVm1Cy(K!`-2j-xn>%alXZ5ShD1p#~skpyOAP+5r^9K&3d)IV&{%mGvArp;5hsZXZx z^LJB}fOsQO{4~WhLkG+Jnj}z+T^eqMC@!a@ZU$Sr zp50wPK%E?VeLat@DDhBZ3G1bpPJurU!Xsw66>#<|ZfepAz&j41_uqUZVZz8T)(h$WL zt_Hg#z7UEXN+&032$)wahbbqq%Y$ucwIf~ObQja*W|IqELfOFj%5V>?S%_oH>gJ4d zN*(uzHw3HxNa?GqbSO`2gAaV5L54gMl4cxOpca(?=Qes*D=jPX`?zc=Az!B-XM=LP z?>92pDzZh1*4q!?VXEN3TX)M&h;Q(Q)q7W4WLFznzgClxahWPO1&JxFOSgU5g{tBy ze0b65w(LY}GzH?y@Vy@dEy~!xZMyI+KeCQ)3kn>{q1sQp`_$M+k~C3_Ns5?XioxNQ za2^z+?+_^>tm-n1NZr$K3E}V$)XpiqouSHQz*vhn1 zH;}_M!QVg~lTuJjLoM}J8n8BOD{|A(M3t2!hDqnqlo8E|styf#^ZLN!S)1S>Kjh#e zl4v0ZoTOSbylw0Bl~41pC{=nvfsL3gJbkQKD_fQ28HJ}=*|2D`%99m22=kzyXJyhYEGZ7n(g z!G3(8kv$~Q-6CvQMjQRXJ(~I&7Jv{}wL-DhhJ_7Zr&Xju5jW6&pmzF;qR{K4BvtP< zxNU9)nhSE!k!tZ}W~2{wX<>67pFP3h+)O?UbDZOH@*A*wOc*+j_9R04+vVoD$%c6M zLit!9ygrC&L9mq@TC}hZ$tbj^Eo{-*P?EqWUz;vRp6`o!?YVpxaP7bJE~{?LD1&(8H) zb&tC}F3BYm?nC&->~PkbAJ)83brrfu?}R|naop-dQP|&GlMk=Xs$0CbcpjbFj~qwT zRi$S?oIB*D4F4L!x6m{h_hA0g4reK4BCeD5X4J;xB)f98u%i0SrKFMlt`nS}mcp@P z=C$MrJ+S$Y14~g^&pz(&MBrgvd>k|PyR*oByU&G(GB61@%{gpzdp>8~gKZjD32K$q z;VKry77aH1Ou^Gd>@-hdmBea=_A(i^dnm`7v~AB86{7SBR1|Tmq3tTr=MC!j@0-U6 zoNU1LHxI|n)>=oLj4$A5we{9^D%fdyw{M2GWG(E75W4x!a+?w&cj&f(RY$WQmT$&m zD}Bj}K;Yt-c_k7572QJ%NCxJ#MjyW$xp2Jcj#&kO=7eOojz*W|G>2Be)F@N+EiHY9*Lf+Cr*L_$=~I3d$UIZl;!;-E}Q4x6)yw0*ZXmF^LBeQcRc_&J44m)|LOmx|6Bfl>5Mjp zezP)tbye%m`fnK@6l6VGs(@%u252)-2qlR;v?38wah*m2oGG=mBw00@1dt-|6Q>OQ zyRLc>~_ukgQ<;`-x^##&Bu7i35m!;F*(b(A7?YrDNbb0;v zuZ~9D!zZ0*k6-pq-2hK-ZFOz!4$2o@{r{}?>y3PX^?IMq=Blv+On}!_)P84r1Q<;E z{(9TWS6p9X)=le-%Ko$WSj8KO$j#OGGAu*%;H!OsZMzL_Bl+m4+2Hf-vWVaJ+r_Kf zLD;oi_7^t7|E~4J;T7$A=>+_}F8(~;6rv+s^H*%K0j{HrN+k`8=;8A|I~+{7`!k$p zY9zal3RAqsN{Y})Fqn(-n}8lPx&T9 zW-o3h4%q#qhL@)m=pL({}gR=(+ib#IoK|r zsvZC8Z#fhue~Z6%^wLyo)3kZb?{+=Lb8`;aYH;D-t${by_SfNl;^l?K=}4<>*{@-0 zgaJw>q3i8?IH1UDwXi;Wb2CK2_MbxQZ~Ts|ro-Hn6H2ICc|gi1=jiu(9h`8~rQPKa z$M(t#i@k?B-!nqN<007xewJscyU*4~MXp7S$DtJ_De8TU?zpB%;WHF4AcvHPN6TZ? z*nK_abfuK=7|z{Fq6`Dx>l~W0*b_WqVVj2KfJ;V7ZWNp;@Mcs+941W5YcZSic*bwQ;J7-Rs&F%ywkFvQM@WaSzD%#p%N}QU2x`b zeRe2A?ONSxZjR!c&tNWM59g09ccVmFk<#95mpm!FbYKZ_>-fRBwtd+8v0+vgs|k?J zl3ADbIG)Sui;RRj6Q)6Mx}#BaTF7uG-Dz-*Vcx9A<6xJdlqlTT;9Fh1dS(JF8?vCC z(Nyt@@wHIGe|R&%h-q<3XGw=L5NNbc;%lp$eyB-pog0+;3M)={PZ+LJu;g|p!@ja6 z_B$k_qg83GnF}4_Wrley`1zg)0~L63n)W-z?6&K)%OpeJE_m}LlW9(PG6A!~07M#T zULj6+MLJSlnZHGol1m`PtGuqGarG-PjOXL4c_v>tKB9-T;#EF)JASId9+#0sTpWAJ zhpyAzD^WGA@G61T$P9K_=B!1ABV6H33b4UvPJw6w5#E5*$^Dp|NUDX*!RD&8q{lug zBpQsH$1rK=xl~PZvTvD#A~1@u0cEE$7N{3_{BhU_BSuq88pegfd;ahpZ$7s~TQHLj z4n}BRAB9BnGiW(<0-uVc0_{Kga#Yhsc%O*{x5;T47RHjFY%)aDv9FtXB0~*)%0YY_ zd|NtPwLLS_`s_@3S3dr-vZuO5oUxX`LfrS@?B~QDDo` z6g)gS!}GF?wc}x@;}Wq5T>G3bIadW_frybIL5(wj3akjh!>rYpVMCgGet)k?WEI5g z3@Kkhw;ZQbOJcesHzW`OcY9sWr2VgPoK43G5DJhkt_6TF1=b`11OPwuw8XZeSahdh zLdr5)QopH3vpE%iCHOBJ+Zb+^X-0-5j$k4(&ce><5}e916NU-HVgI~Q`idZE<}e>N zEkH$N#iPPBLu%L;39~Fw>SqO24huq!F@AiFNGe?Z6Xgz(+{{+o? zrXClYya-azk_;mADj1V1^_W%8aGLBGO-0UCuu8VYl%NpLvuNd;iqh2%-H8MkadFTZ zJTuv%8hQf8%$b?@kN5bZPIuxnrXv3CLnQ46RK|@SZ>gQXM>UwSfecZ~ z6Of{K=@7ao6&XPc@2S<)MoEXmX>P9i=O$9Z58TuqTa| zK$VDQ1cH%24>1O16DJsQ62MZrX)tLC_hkQ3r^WDk}W2p28=!Zg)I7_(+2 z5D<2qMWbFxD&*#rEq#HRXgDVbONeijD5u=DX;K(fIl+>sM4Jd#qARmRrmd!M4wfhz zEf6d^J`gjsWULt57Cb{e1|m!jh7=WDTjrFD{i%DC#nF z#PW;Ogeba{^X*pT0t#WJbS1n7oQHdQ__cA63kOntN$MDB!|_^HbSHfwOE#&UH)=LF&S zYlx38b^1&Sli_nWcgz4KiqQ$?x|e^tW$iHILtgo2cArTMglWBl&T1(wncCIrJ1^s9 z24rVT6E(IXd8~nKq87)Iz@vi?{jyBOV(-J5(-Kq463(}eu`Q?(hhgQ5OLUN#W0u7D z5JFIGCGNJbA}c(1xZ=!HiA)IbB|w$H>=P2K;?@U$Xre>Fr^}P#m=|$8azs+=*xqeM z9%-V;=pWA{z=q&Uj!bFc*1Z+0;hvJ_gTiwQiT63JUlxhmvQ&{Jyf+#Z!PObKZ7ULt zQ8Mjf?LHY-MFOCL9|)?f9+AaRpg=hK&G_!D=wu?;r9nBVdmO82-rAGFfOFuovm9rh zO}P_e(9tdejcEc#n6bsNa~@X?I0m84NLOOw&EWj?BcfLytUV-j_yXtWE&J&PG8 zl%^*~60bVb?>mgaGa!Q+!p3xf2h9~qW!>g(7*K5(tVd)56A*Z#4W#!;CJ=z*Mx^p+SqrDf@tp`s>&z=ub8Vf*GZiyr4>zq`W2_ z=9}H9Isx!J-G(K}3?uT4Vvr&|o-RuuIJ=vrKwcpz0qZ!6DzBK~&e7fCCSo0vY|5|} z0}njcBc4mL9U`*sXURz(6-J)3&qH9rs}SeUYe6ymW#*nvK0{)>Mku%JnmP>wp|&Ds zE8m_M|2w7>XeElAo8f3Gr>2-FAiF zO@U>_=l8l+_Ez>44kkHCHQu(?meBytsu}dR)44j;&AzXHwsb$uUf4yS-?boTFke1o zuK}Gn24N03KwDcf9Re`fy@PV!awEN0rJdr2kg9Hv&`%dhsUqu?zCP15Pe1$+;{sc_ z9w^Z}tZD+!9Hn;*?(76#{(h*xSR1^N#GuIm7A7erWyrXm_M;TRNDQmMZ0;W4mvyV` zz1n_vcZjd6tt)++?R_uD<{wps+8!J?brBa<6%ZKP+izb4-INzT8x4Q2|IeqJ|K-2@ zm;X1Q{`daBi|QD1e);PQs(P0;Qo-#qP7c;55~-04^SJPan%0IIx?1>_S}PGvWFhSc zrvbgalRf_i*D=oNAeS_h$7MfZVAT^O82YJdkyF65L|?++y(4Gxs_j?vPM>23jS{*gp7J<#CrfNz{)nOq#Bz4Lc^|f^ef&Yy|4x+paFyn0Mh2Km{TY!HUE^7;+3v@qT($lL~MtJM?%)!@CrsjFJT*C6jxAlnd zg}-i}p8Q-XCKw-P8eM4)(nkuK$X*j(y^=b}^3`-V^1Jw0o8P+a3NUKt-{3c{l>10G ztlY|PtnA9qxtd%6j?-0S+QJVmVRMGvlUJFZhyT6*v->_)Xnl5@XeGc<3wV)DAxrAz zUdC=?dOiycKB-W%$TIkyXZyYDu<=)CoSD#QFOB2ooFnzz1+_plG5H0O6sg$%r(CwP zS=({%vf7<@X*9FgbIN;*9Crj|62)@9P9TXe66Z3NkUh^nlI(C$WHMGvd_(Q1NQ=#yQ04nic7qMH_zAe3tst4H^F` zt%9HUQRZwuoZ2UC_|ht3y<4n~8j|+Zh+bDkcF0}@;d+K98@*DD5B8<2+h-#Q+9*!A z%{`fCUXY3k{#gHM>XB~OQE;}Ry25Fc?5Hfgk4k$qVdix(rNzEXNsFr#XHJ;?lJm*N z{G8M_?O4(f@0vO^LxS2`COpsf!bKCCOA5pOIENy!w4{o~(zRXMI`y?Cdb&BCwnt+$e^U`5^@^f}3+paBD-3DiaLODT4 zD^48)v7GR8mrGOW372ysIN&0Q#$&au)nVt?)6YlbbomyBrqAyIDlu~{C~-vaGr0rKdo)n|0PS5)0KXyuus zPJaL`D3+P32q=ZC=BkUkC{)(ok;0asYy?GJ^;uFNcu6R}gJ{stQ$_ zlJK5@1v&(%GrQ7{*i0&%M9T@G5*y2$XAH%NC~Kr(@W?zTX6b%I;AkVw0*dj7m3Lbo z?W_hG9I+5X+z7~hLnF>yIRXjSk0@QiMlnl}^X8Xs+`|q6c(E--1i#$wF%s->GL8%Hn&+h&_d%Z#bcmFO951rO*}=rWz4QU+ZO*(06Qx=k&r(DM;6|e=CkZu4 zOgmg-j5`V^kfbZaDmo6M4dSgWL9RBPy$Wf*M^=v|VvdVOi9joLS00XKX!o|ia6`tJ zGDOvshxLR*p+He)g8?BOBCqU!1k>cGTF#odWd>!ph-Pr`JSKx|mEH^hl%Zo1twHHQ zIo9UFm;?jC~xVT29`QGrrACobfb?J^++MZ?BstzVW!GF{%W(F>9ZruQc; zBl3iT7_J;n6Ke+>jUrP75oKg%78--d1FJ$sl8pmPBY&O2L!^k2PMc6#O!5|oqQJcd z-Z7D*7MYU491;Iv5sL4)lCkbLJcX8_vO6-o6ih891s8_r!aGHK@(4N6{U0W=)b3(Y>oedzS|L<#Jh) zbppcNAzRPHGSs!EiDDH8TLco`i77!aX2eG{b%5S~ERs@BIEFSjHL*0pT7(`@2$mS4 z2H3tax$)W6-zCD-7}X2M^Tw6U2USBj5yJEZ2_`9xGROGRs1fHoldW_lwni42H0f0k z(y$Fkq8>JM)iS(e1*S9zZY|hWs^4GC{K0cW*DZ68*C65Qwe=p0rqRD&d=v#Aq;iNZ zW?xt$J1=OfZ|E17M&XQNe5Zu22S=8l_5~|1J`H@H!VS*~&M7E`48kcjq}7J%hsd{u z;*(Yeu00}dG!NoectqgNg;;}$OKKpUNEH{)m}y7h;UTx?d`jVQ^#)+{4-yb2L3i-q} z;jn^pA_5h1#fV*L<=J-5z%`pA5Q*N4WXlg1T-cM8&i2r`^VF|MZOol7Ru?ABw90)O zQnF28;KZXF0!3i2SEOKthPwm({%AIFA zLbDNja2Vg(BOx3#Lj2)~H0Vzc-W!r5DA;4)`7$<$eEQCNtMpupr%{}8y#Ss5yqtw z-=dzWGBOaw&5H#$ao{L$@{J(iVxo^rd=$~5%q4Up#d{u6lV@Wki-r^4zmgfJLz|31 zM2Mhmm|fr>al52P@SMS|pHPMaGo5x4|Kuw`7fz{UND<+4!^u;aGtmfQs0MqM9kT!@ zO}%=O(LPydK#=j;h9+P>Q&5Rsgw>bkMWnLm*<=(~8G9wr1V{*HnLHn6pgKk(C_Ib+L!j zVi&Ti!gNlZ8)viRjkZaEP;^NVNn(cisJwx&U=B%|N=0W+x1vzzGd^w}7EhT!a!PGh zimj8R=S1tXV4a-}P|NCoC+Ng#lXhSXHj@aZAi9Cg2(lNYNlZEJU>faVNx=aekJj3{ z9(dy{4`8VQ4=VEIRVc)6T8Z0vm@)-eI}Y3ilRX5wa$|Y-q)f+T6KMnId^m^eXEL_u zM2PL7J(0B9L)87~*u7D}Gypcr(h@~fI+Jd$+0yzWc`74$ec(=i4k>;;~CkW=_ zG3{DkwBY|JZlo+c56m2=D>fQv!y^+Ra=Uw)GF68ii zbxdvA?O+OJH62OyYk-oBH_5QS{b3(_V2*=9{aaLfT|SwX1=Y1y@S22 z(EwFNMN4lFfk;^)$YK^|O_o0tpTc{@`8R5>0q4c7&<&ICZp3Z(n?JCDAz|>I$!2v_ z$6?PHD@TH>IUj`>bP*A41q3VZ8)!m1R)>g`&4B}LYhST-rO*k;;cy~XJ9~Ecvja!f zxrJ?61Xs*cz#@xY;f~sJc>t`8r|~r<2m76v=!}8@Bz{;Q&dd9Vj||`YEmNX@cRq61 zuR?>@Z91;b+h_BNQa(<1!~J>rWp=)9pU1Dpf94Sme*NAqf1iJjn#z<8wmaL2PI}7Z zWZP?BXR{dgoV%bzrY6h(w|(Tl{Fndoe-6C=)&JL-aZp`F?*rVd%4>?ubH2$XmbV8qyz z9&S6m^zY_ismP{^Ub5uvz0G^P`P_c|%yqf-;{-2-p;^=pX!d7Noll>7B|J;QY?$O& zz4d?CjNn-1*Pv0HIeETZ#pTwWGjjPE^(}VlnSXQi_wQZTwPklWt0*jfKRGxcX=d4D z-__OBwcN>AuJ&Ch-B~R=3~oT(|zVzTX%G(dDSsv)S(UYHFz{wrQBG@&8bRJ*`>F ze~$HDxjskLR`_@7tvuB7nO196T0Z@n>digb$CE3skUy;6wY|gFPh7S%Iyx$!klpHm zlBaleQ+QjlvB@w$H<3nj@6rmN+QW+W>m%)#t--yqI#&O!H_(zFUsa26eBfl%M5@US z0~2nlDGe;#z7HiQTxr2Af(fNUo%_r{@r}`642>wpQA!YG(Y||lDlj=9ra=$o^eRY* zKAvm8n(f;fRuL!89(F2x{>(1ZU)kU*D& z?O$F#kx#&7yfTHML#isd&mDVfLt6`g6^`{Zd0&?9v3e3Bd9Mvb0^)ZQd+SWcUm=F#)A$ zG&y(yYqWM9Gu#5xI0~5`BHGRa@`KpABE0i`Ra8U;L(TIl_|L^UY7gsndVzM?Sk|yz zSk9zrhVTr_5@lKSEmo0tcM3IesvQ%CKHjJUw}UGdmv;#S{0|ZZgr@8PGbZJmJdTfN z(5^Y7z|4G=;;OG&s|CB45!+rngq|V4Jf++aztzrX9Id`j3Hiz;(6@lpq3>q7A`T6r z&%E3b4AXymJ0&C%QLsY$C(X_o`RH-tqqM44yiDtpffjh$k@e~CNY~eP**ds7*E2J% znDgw%RYEI;YhIi)yd1v>!TE;cW#B4TWk{RRx4+D#CI*4Yw6T$>lEmrm_;W9`*v5ixn37*jLtn?U8B+-Vk_w`BZR;;$-0kUGZb^RH|$) z=@ASc|3xr8h_uIf$a#(m0ZruE9{KYIwOkrqdp3ZHnqXXsXVYM(Z@k2Zv@Ht7`%wEb zSn-~c7b0%bg8jDd?h^?UqXnu?c7QMML~LAdWOZ$}tT(hQZemK$bhmxtgjNu){i5+H zm4jk+Mvzix?XZ!%(<-fPG8F$@#CaEZPtoJ%&n{!s4jTn zo&D|K!T<|`P(kwfD*Kia%0xg=>E21;iT>?)jQgINe zfXwf_%~|&EJ|tee;GK)8)(kSQdG#TyIs+17Oo;2x^%Nh?U?7cvvz(T&A53C!SQd&E=XXgJM90W1ALw zzID#>c%UIsLsPSd4qZ?7iBQGFUO1!iCMG56qAAwh-mD3ra6XWy=u^NKD1#mUGbvKQ zI%ej5RIJkRj0=Xvd^+!+=14jD?g`4Fq{W`x_1NO8Ab%U2&cUaJ%R+*P;u~y+ltsk? zKq^zf-6Sf9_hqCuvzE9AbIE#_H3uowlAxQQD7cSBbssk;Sv-|Y&J&@%yruD51wzXE z^GZ1q*KoXW%kDOyZhVH`>yZMX{EFotHZ!8wgq`g>leA2I7#ma}mM_8>F_vor1VzMD z)_|N#s?MHT87TC*7(3Za>#2@t;Ob}VUEri9F5%RVRN@&AfdE2N$gx9biu^V~dZJZN zPr>a)a1Vo|7oc#XDnitA?yCA~Rhpu_3$VZ|FuS;`1=T&I>31*ZC1zA9>Jdu%S#N>( znQu+Hc}4?*tkbupL?!44$(tZgk8t|_$NSE)&j=VtMlCs1PuJn%Nx}{Jf@q@VRI6%} zgU&>GYOZ{Td#1{bP=huBlVJUbIqdwU8@(GN{C8W{zkINgNJX6mm*Kv=8lmqy=Zxn?uz! z>-RI@JK9d6bF)}C6$xpxrum}1wr5UOQ<-VgnKrJ|F}DFo+?MyE45O%65E z!2E}+XzsVCxi=MAy21x{MiRU?O4uvDSRnqaBb4U$rg)k`^95*iYIID^<#cx&)6G6M zffAhDAWDM9$gd$ggCuG&u%x_{GtA3W->|H`vp!NgBxhKe-=&ukxku=O@VN9lYKuF` z&>W#@pC5>zv=(>gqn#+Fw35%@$M6vf^wCL)&MjU%HJFFcJ~|tf9g}>b;0Mt;S(AT2 zQG9EUyiQfYOHJY3>hA4{mHxuAeU}}%B(YZyB4dPF&mb$r2r5xxJxIIGly4wo#YpZ~ z!V*OkX+V5vQj~+o5qzk*&<~B}t2KiiqOVL9UH!5&FAs0Q!=Ey7uJJndc6Tu@mFcxZ zQC4F|zsXdKlqiK9f?&&ts!vb{9y?(nBtiSl(ONZ`VM6Srq9s3!&#{l_td2mNC=1K( zv4`6ik%+(&1ngB3=S$FB2^}zXug)|A!w?CJS2lN34}u7fnjS`EU!|m_D|Pfu`nYM+ zCDT7)&F4A69=BU;U33@aD24kiK&^f+IjTczB`QZL6%Ro>tQ$q3IPBNkR4Xu)c|Kj1 zijqg_I;liaJ4*SwTE5JYHw9*-gOM|blVv2Qfay?sOO2#{lS4ca6_W(D4o;naB2`2| zkMc3-q{P5H@?dZxzm*QBYI3uRa?q`H&y_qH>D>P}MODt3lgu(8ml;P=?mC5K@h+d>W&z zmWSfny0s;xMp!mQ_V65pXkJ3uuAhgd&3INUVyq|+33uA{RY5$2gZdRqM`?)N1knma z37f-;76gu=Mc2Ri$kinI!vh@9+^4eaG}sH1P%0~CKT*2a4D(q^V7D&Rd*FM@^Grs8 z!OyA`c|{Swde7-V*@+{HM*+!r;G?7{X;RFt7_~TQRx!-BEk|P`kSc6j<-me+lkf*!J?Jp>{GAfZ~wZO%k6LZOjo$@o}1@6M8^pv zZASzUa;2!qLg5=y#*xygZ@C(qeU1-V>9#7HwyZYl)GL0ttVDNKhBqQN^P56ElmQbv zy|Rb`f9Jw@R>IPr+Z6;(MKPMU(ex4*Lp5ZQ#e!4l8({XEc2rb}rJ=KZpd>>ya#&9E zgp*xzj%npN<=P_O@d>B7h6)`j*3F{eiF=^Ix|hk`ALG76U zLyG7>s*AjkYT~^$6_4#L%z)I)!6FLMAwk25!4<#W?<_D$I!2;MT7Mo!8>esSul=AO z%xbmPZw~QWn)$03n4Ej|cuUf;B2r@JxF}(RfzQnmv%c83D!_Lk;H00^Qyi>UJDOE5 zW_7RxvgtvzvO9{94L}^A1_~AG*-%+nUS`Sqfcx%f%Br1a{^8|;Ft+beN>48PVi%1m zO-^TVr7dmk$6ccvXZXQw%^e9}sVC5WhNX$7Fnz(4vd)RNS7`5(&oK4;AM~Gid(g0lEo|SbH3`#o zp;wNn>@nl`H?H1Eh9_mlJSSmFN-x}1cx7~dW$)3;IS1%_&QBls^7h!xJjg_gKGw-> z;ulrOB7nn9G+D`#QgW2B-Ya-h_7=bX;bYB~H>G>;W3xZvjkuia<}}eSI1P-fbaMsH zm*Iz`n`YNls$O#b#T#W!lU?v82|A;*z}_u%v}18*LYo80PJd;^n%PH-eP@b68F3rr z2val3#`lCwBxPGzd{v_T+r&?(d1e^`TFN3MxlIs6rTTWOWjUrgy!bcf6P)~33dD&E z6%BQCtrty9g~_XX5^@c9p^spF)u#lZn(!p>q+M!`ZTpmU=3{Wcn!<1W;o?qS<5&{6 zu5{^3h#8+>67uH=@jAx;1CcwCR@p{JreXW-1in2;55_c30NF^ zwcg-Z{)*WfOE^TlUsv(^+x4U0pP~F~laZ00(vq$`%*kvfm5xP5kA% zCvlwbyHD~QcdbY>xPtxzo{u^A0Sd1;|JeHa=j=VE6J-F!RqPkrpMD4c>q~@nYRT$W z3e2Hy*#BqEODgs&Gi3fJj4!(U&;oP2Ar=Ov1SW ziJjoJswl!Q_a+b!U`r^Mar>bnO^cFz>$jW#QU32vA@XMDcl!hMD*&oFUVQ28KWfyg z+4Z^p@C^tEaJb(87+bxq@p~ZRAOF|D<8fQ_Ni+42*L}O=bH3a$SLqiVodX;2pOwll z==CMm=KpP5|Nowt|1JNQQPCYkzd1o*neOio1Vi!m%s>V?N;ab%Nv4H`eV^#>k4cd`64o{Cycxo74XuyRXA^BVE8{aJRp8B9Z8?cn>gIdk0NBW-2oJac?} z44%T8mX?Nzfx-W_7ZMg0E`{-*?Vfw(x-C7Mti6#{$GoN`eH|^wd979Q@n7^58zIQE zHEk_@eXACSW}Q9T7VW7S^UKjVTso}spjq+aWe^LK!gKnQ zRktT&0k#JzG|zLgRk?aB_S4j6@t>ElE^q>^9xpTV1x%H#dDq#bYxNMHQTWyuG4cW& zKP%XtK|{v>e&2Tp+>2h=WhJirZmCv(icB`k{gHCUKun~eaXRWM4FaemtuJ;oKrZ&x zC)hv0(K5D<5Zjhg5S|E8$rQMA^?HdB#g?HBATSO7GbzX4EiZk6GOeh7&bNlSe@^j> zH@~aRvrB_q?`ViY!V~P@uc$md&ht_67(6%HVvw5hm2r1vx(&s_a;i8QCm83qOsAYBFj#(4&L}ZAw&RXXDN#iaNA8LsuJ6m{XFA_;kX)GU23yAI>0~;)%fybZ`~&63?b5%N$q*H zD0$-FMHBz7KEvBfO}9he;y*C5z{zhaD&&G|SLuf*9o?YDM;=I!v#Z8K-&sgGvb2Ab zk;YW0jzt#`RU&`fpY|vs#7w`pe({6+cwZ?w-Go14PgE;A+yfrdU-@-6bveAAy@ZZ; zdtF{%#$J;egbNKv-Ab8F!<(fh%PRg*NHxnR6O@XJPlHD?QnGeV9XC>YwRMEniXy^i zV(YP+#krqS3F7j)n6^tUc7v0?1p!QMi&-rhrXAvqSdRINxk06{rm+O@Bxnv!)%LM0ctt1ii`au?2B`>; zPQ)W4%&oCDQ~6chJIz326q^^o>)c{hkgN>a;}4B__Z6n^$OscA%+?(KM%CVWZc;mGiL zjij)c>Xdw;FQxO3z)R#+xqMHaL}qB_nnW~bq%q=LGb;O^0!>Gc8j!(?h}R{WW4X1X zGnW<8bKJR22U#h{fk*(5!6RaW;apOE3_QU^^UCF+0ymU{;z1@r+l&$!E<)Uq`45Gw z@q&L)T+6`eD+S#yK+0pD)1rb1T-Gg+Z!w07@C67uOdCFF?<(DBBtwxka-G13K;7>P z2H6qIik_(Z7vbQ~Z6PetDYOVLl#-tnVNnBt;})WG`wOcbqQSw>=9amg&WsgV4b=lT z6XxRQk=~lQahdE|CYo5PuD_;LoFe0yfjJJX{uyBHr4&$wkQpHWMfJwk$1+&y?9}wC z|9ER}M9cr7oRt6gEBz!7(w$O^*GExS9bbXm5Edf4+4BzaXV@(nEeqi#xqDk=pPM>n z6C*ViF={_P8Ie49UOvql%~5%=EFQQr5=JkHksdE`dBl>s$y-&%rZP~`gx7B7ER^Iy zkKJ>{K|8ry2ce##yxKKQWvAJ2tcLUXtR&nlWV#{HSF`KFhN|)zfgx{y4+A666Sf_B zj^CXtITpI)C}17B?4Ak5hd1~V?#ygN_Or}QoH2RHMtQD~$Vl?23~r8LX*@*P8Di)-k~JS=n*OpoDwvjhYvn$(egwr?XX6nn9(7) zL)To-v0m%nT8@0SSCXD7&*7mZ?}ZMxr45QuNFt29e90^Khm2e!N#*JQ{e}lqO1e;APRmj#e0fh$@NMaju6s|6F6} zYPT@2MRkG!5z&z0Sr!Z{^CK^Pq90)G2mjlI_Z|DVh zkd0t-+1XiuGueiU_e4CJ>+VxbBPJB-o^MLI`IiK*+F2HLnp1v~W$HpN`4f#1zbFI5 zJG#ICGg+(I07v?|J?uXb^eqY^6Jmj>3v9IOMHvxt*IK-UaPRMli8MVG>B>1N zy}#LBZ+BFUg=7(V;70dGo(*iIYqrQRX%lmq)_D!8KwZw=7{7;shj&-063 z=xKgKrPB7iD-A=c#(qlgQo~=Z`vn@5pyJ@$Rsn8f>jQa<%hyS8BBOr6osv_|L#W&3~`(_$3%R?}5y(T_d z4yib$5i=m%lTnS&a5o6?{E-mTJ;?`OkY(w~Hu;b(0VhJF*~2FE$l_e=ekN7W=$O^z zS48%0)J*;Z^#_3@rOYJ=eJ|QqgYs6c$=Dw>U+c0O=!nrt4Du1q!B>2(=HtRCJXVDG z-t|MCiI&L|#)UYH3|-h~sL;_@cxe0bCDs@d*uRa2SK}I&_b#aA&pxw20UwVcb|{GW zUnwVPZ2*?%=m==o$fcov(~2ZKJLdY?>YCc5zf7F&-(;MTE?<2SD&c)G6V#Ia>;{>)_A(dW>S#VGZ!vGCSbc*>dpyb* z+9R@+Is#15Yd5a*chT4PR9h{j1`Is8Puo>y8z<_e%w7DmPwsv{rfl*G5h~dMXcKTM zvI70}=)L92hsM1Wj*qo-u90*_O|b^WNJkv*I8Pr2@~3q{Jl8V60e|FYr0twrx5?Vj z1adFeyeMhXfI{n|@4>2&L+t0@{QL(<=`5Q0U&hWp;Li!BZ-?KCq6?qfl$p4hxaZG$ zQ^EYLE}LwdB<4ly!S2$Fn^msiIg=CBp7`|GfA%}7sBZ2MJ6r-d9o~%7U8f-vwN+6B zx9{<{j-yf2;9t83r@fjNuIKy2CtsYqS^)_i!e>;&5M{<+SkI2Jbfv&2U?8j8g}${k zC;3Rn^}pb7zyj!xY+pZ_q&vY04(;#wzP>Xv{f&U!KIpNx%%3mm{d{cOt?%s*zYiUa zluM=JwiSVISG&WMmu;WEzNXfWpZ!md75+|xHHNAn9bAutskr#pXELv zOp1Y-|JzFRU;fMgZ*YSBU;eM-pgMtk;|_T993=pN+lDY;je4%LP5BY`hs%iqU3+%t zVP{KvwYb;BfosieL?u&2zd^r4d&MME=B4ZA8?|MlO_J;u`$8UN*Hv2useNyLaL9 zt=&9%^I_3nmTaFtb>`YzXdw>NFJ8NGch0SZ9lPV2I(Elyx%-Up?z4IZO8|7jBx*L= zKOUTYqB5$suWMbqu1m==u4}8ST{o}Y+nUCy0PMG~%l`)v)~_Gg%M8?A2_8Q}5q z9J)d|eA{Z&9dlTQ)q0eY77j`jcX)OSX!Y=V@;%MOzP|SB>Zu!ZY(I&MJ`(z;)i@$Wyq;e5E}lk1N-`HPb*7U4>3isU z-|AYc4+wbY-8ntJe!7?rTKN1PUD&lDn$mdu9!Jt@3gmEXQkJ`H-TvMycdf&WZa6?$ zt$Xqf=OW%h8%Y_iSYsKn_K&wPwC-tMHhujSS669Yg8;Om`hkFTy%*f zLT#m`N+=xh&Wk!*0v9QYXTsOccy@;p$IJNefP40OYi0Y3= zioDKYr5YQ5A|bq>E^!AxWxwkX6grED8Ys}(k;e1G_@GgAe?+7KwAffiU{=7heJ68qRVAQjkba?L`sD%nV-l~%nam>fb->w?U+}KVi0;& zKtVjPns)O+ew!+knUI%ciK@^fF00dXeeGnz8IlLz9s%pEd9j&Vkgf>(l z+N=`a4kRc=wHr`}{R`xS(g2r+TD44}3uuOWLzWzPYQ@lUc@>WXwFc3&UHW7y2SvmA zVo9F6J|w6FX40ymqQciaSbP2g>oGK@^n?nfmy{;^La59>97ZYU9#9i+NAZvj94P4V zLiOm75>AuBUiyLQRLGFMTKBvdjcHH@!`ZfvmU^x4V0H(Na=R zee4SKBsq2*uPMubWT!Yk#}WX_hz*NNi2+V1+@)Hnm@EChc9=LMr`?#UX)(DoE|AIA z3zcM7mN!UqJ!o-$fyhdBbW5EhgO&lEw-p@~xHxuOovsv~>&Usxec|GfJ+Oi?z5>ZvAgeNZx z52fd`E)#k)5@h_>x{*IZAs8i~kJpjAh#}Mr-^{Q)sjzowBY{tt6gqs&A_UtJ`HhSy zXTf4qAEX~n^w)eW$ZC093J;1gG842~%|tYev*cMpVcBF&Vy5sn^q?T+sGuC&tNKrn zH&2y4SErTA_dW(Jz_ENgK?j#PLNJ4&SYR_Of+Hh~jm&Cc{+SqDdN#x0_|kpDC4Htk z148YC0!eM$loTR7sCR+#`Vk048)p?2JCbcqOc{bT=dlWKj6@NQHw~gdUQisCsA{BB zm{MbMF!}e0BPF~JI1%8O>h^IC0of9;CLG*&XkrZ*qP(;}CNs=pr@7KfE(D#8&kOiq zj9DkSoYQ96GKT9ag{3t!bxUl?1skxyPXAHI_s7 zI>lGKkjP~AW=2n9?ismKL~*1siXHSA_n$!CYI?`f7KOqT?v>zZ{%a_Sa!ueQXZ_L8 zHx{D7V_SYe_o#$3e8^s5A}oNOC>No>O~xDYivuHOSWuI!en4wvC}@|}8te_kT`Up< zDyFP*wep0rCSD4egC>Cho783)%zZdR&08`j(vY`7f(T+kN+*#i@Br>q@vBruQNH6p z8k^RGii_lVS37X$svduAN1CB-GwK3gU{TgUec}_L^W(rL>CQ1eS|fSi@i)_)`7hw1 z00RD8=qvKdq5FB54zPt&=76&>yu)~mNnr2avoCauXg$Yq z4vMY3)rE8pS7_ZX8gX$-YH9^xK>iW?2b5QhF#@|!G1b&b`+X0adPvs+)MOgN+@{Go zXk9ElBP_*YFi>B$6^{f2*W$}jA$ibY&tNBF3$7>$0rt=wsxtV%tE?m$SrVlKayU-l zE8v0S0Q`}Bna{tWFkKcyIeKx2fLIK+Mk&42mCIvTQoKZJ-g_6J8~>EDjyLp(FYAWx zlZ*pZCSOWSA-t+)wZ8wJ==k@MBPo{uVqE=;UgvB-_kSajFuHzL*T&YyKFLm?50pDv z+gigWz6D{<@^KCfD1>$~9be!qXW);`hQZ|i+K zGq2M}CU#@Lt_%s%L?9*I+4=gx=S3gr=cn7>{=0+!fBeUP{Qus;|EvE?+UtxX-ky3h z6T^L&g`rT=X@y0bk~qPPYb9kMQAT2O5QU>4{7Zv2MusCCMUo+#=*w}MW$XmuyDDjR zUF79C2R8xu1w`rslh~-NZGSVP5QQ+nfMk5q>#w@3yZo%G>fUdtQc+E1bMtF^qENh; zzvJIy_Wi4=_-)PImG|%2-}5U9+muNunlF$f8WPQc3@Hq7; z=I!h2=;-Qb>Wd0deO0!j2bu`0Y-MlPx?Nq3osErs!^X0$t*uSa)7jZ6C`(||#=eE^ zu~}l)-MeR}zLI&z|2+yer&GC~P5CmV!&LV1xt#)4Uq2&iT!yNz?-nOF6T-+`wVXH> z9b8<&Se^HKGZAB4EF99loT2%!S8cPPj# z=XGCR!!-SH@B6hZO81zQ{a4zGm>wS=KmY!O3&J^GZRdr*_Y{D(%JcP`lfx}W*T-Q5 zOZcuQlnuS5PEg9o_l`>OisDd%w+90|4O}q=cS8lT)y+C`PxBwyuiAmvTi!;6DQ>!| z{7bVGfLjJRQ)%!dR3mErLJC%pS_JdbBTss zoHhOKL8rk}h`?Q;WIX4$oFXhASG;=#*r0FJB?xPrW|0NR1cfTY#OO{oHc@-Jcq6F> zA$emUs1s9LWteV2!ln{)DI8d@;XL6#?$8E~Lkkbc0=!1fa57Fl&QT`oC1y5LG%gvi zd9{Hrux{4XXt}Xib8rPSc@M;|qfXt!tjl>-)0-jI#$`@~;09k3G~BJum!?b5uTq1! z{(dC(UZ+zBV4Dk#?%(GXP#5K&2YQ%`^&k74f!~|-27hI#*pjNQ#@_b7VDfyMySt30 zPgl`YbbQ|5_d~qvQq}BW-(z4jWo@|#(?;M@*T)Au*6D$iVRGHj5~9>g4s%7 z=AjG^(xX|=feL4S;ozEhriMMpsoR6 zU`ABtq>2;e1{2-MBnA>*&WefBu`l;1f&#FEH0QzgiIvV zJS{rCA_Id&rg9S+aZ3~rT-GKJ$?q+T1j$Z@s$q<_^jMDM4Lt@qN+j?}HR&>?Rlg%s zy6Z-kc{>4b@i-Ae@<5%{;$jY%jj0b=>y%**=Rq-P*+Bha%k?Xso?3Os3QIUvJ%R;z z$k`5r*gNOanQ&&2Oxm!fZxzQ@hRbwKE5XE^4 zFeJhxf;NyI!o_%xdX=--VF5y^93DVTB^{K7pIS6=bvbCSuE2x>pQ@556^>%zlWAR0 z)87=*;!r_~T1(8s)(y0<>><(_??!2ju1`Zg$%cedP)3)r7CEoSe#%lH(gl_I;asXZ zY|Er85<|wF?0>{y(Fz*yWI*Y;&@&kg3Y{E;USWYlt)#AjK?LL_k^(_aGQwT65<-R{ z84?8uk9uSS21FYAR7%K?N{2NCYsxfMmCPMrzT49?U600ZY{N%j-9N*GO*GMIGm_Y~ zXy*ldY6JI`0jc2bIDMwwD*qlp&##p3kiA{c}PH< zwnlp}LMd(@5R}kw8EY_%3?;PlL|4=LEu+M8R7sBp0$hb!X{h}oGzpZD+4PP*1b2Ak z$u%2%-!|uZNRAfuvMQF%ELX_Yb zSVWigz&c#RwwXZd0)n8oh45%KAseN#qytg$!4`B%E<{tw9u7UI!M*%pRDi_qoVD0~ zJOc_BgT51rAwQGXk1@^=MB;D_^(YHgLI<^7B}n4hsJRqK2H0lbIDYDgYauY^p0gU1 z%sAQ2F?$;U{1@CdCj*iQ(I$ZsxpM7Y9C0d;+ntGr5!!okNk%|}VOq#>=4WYGfGf)J z0@6kc3jN$vW+Za9J>A6{V#jerWY!0Pc;+Tma!|F=GawO%Ji! z!iW1d^|%)Y#@Bg8gvONHJ2PuIpBB%`fMg&z1?=8~vJAFsJyL}=>ly`EWQGqbEI{Zz zB~IhumRZQVHQsTKbiYs0vTCAD!#R7(A#;jOw-Gs9S{8d&I%-Qf{qkE=N7C?Kzd+I2 z<4?@&Pc~zs-2bxD2A%>`W^=yLKwrqNk7$|nWeBwa^K zP!Pc0y)jwxprTb6JPAtC`Z2@Q4Y8Q$A`+i5bd( z0hjUes^_$iD=>g#&3^ezm>Ki%J4(cC21n^zQ=tLvS*-x)?2v`|sZD(Fs+NuT)idCy zp?bp0%&de3x-;HM*=Vg;<)HZ}RC)x38w}P)vEzU=r?dzYT9Tn$(hn?Zd_8k$Rna^GV0S#-- zdF<8Sd7HEQHY`)a%sULqm3z2wob7Tx@3g$s&PEEd+{M6g4nn~Td-1rm;HS+d7v3Ni zR@hEpy!_3pe*pg1P3t$}`d9Fpy8Yb$qxf?a3SBYsjFZs7W_!F0&5quRR@#-1tTouT~{(%Pn3Xky* zE(U0pdl%*d_1+JfseJx|ouriakifBeV)4)&n_@BW`9ZI3gK7|^}h z%>9)|T1qPV(0D=xcMK5eglwv%7Znc+NfD4Z!5`278IC{`mpe6APYn;1@v%!0vWwCYhErNb*mGA4}Ek@pLdGu z*y|O~_wlSx7WT)}*tAiO?hfYV_sQZG*8ij9=;v@ZeH7FE+wFX2nj7(Q$_NUMmx}^? z=;gwJXXO zbMceSk$CrA2?Zy-$)k|8T{Jh!*_zzx5@ z&Aqp-`k+Wvg&hvR*Xs^~O_EsFMVPvjZqmKGw(P)N7%u0fDK?~1f7FYhto$ka$xFp-l8ltBB30pqvqHMLgrmlIRrI*MxDSb$uH7B)dwfe%fIh)k3 z-YcQrIDZvrpy}4lm6&N4>|X0dp-OOLfbaU%BiW#6uxrC+xV-_IEnTRm6g(gj02<3g zn`OzM%-KxEX_lKogzbZpt#B9EC#TzbKy{dy38=gd8FoU(sY8q$J>KFCeCxAeHx?Lf z!HL6_$uhLbaFDmyvZ6|?=Lnw@2#%sCQ>=0n3~Wd$AAJ8DDTeVz8o?TiSOgdtQ3Saw z93TK4U`&&Qo2H~3qi*$fUhZ63WSjXjxbV_gB4@zo(?|II5vrG0MHuAT9GIsFNUMEv}!@5 zZb>ypqm%)IHYQ(UZ5AqmdmPSli2{rKgp$2L69VTT1fEJArbdchl@}Y&&o|PMp~Xkd z_h%7@2=ip1wA(`EF#U|((6m8b8z_htFylO3fzur!4?GEj9Tr)xu22N!;Rk@sK}%)? zr9meNxEQFm8=(;;(5M$kCTOO$h|z?j4h5ABdO$VgbljjyIkIk&;Gt1X9R@YiU#E-+ zQ9P`ZS?;mSl&UF}mI~V;tjd}!LtX_VF|u^&YPw|MIHTfiL{!Hr$F9Ia3QKmHsuW=G z+Zri3a2rly6?(6hGeJhgQ!l$rqArn6S+UCG#_IrbjlD-y<=YXUJ`nMuK!Qj}2bJ5j zV=UzAa}WdLGIc+@d~6n$8?~VcfylK!`!oqETf0{lb)-7gAr-7ObIcl`=sZEo!#}lXjPa z!jThImZ+J-B=e9B^;!ytiDt!S=!GQRYDz#lrG6$cauWpU)o97|wIO-fmAIv-)&d<( zl7@7Zh@8jHg^*1TcQ|NAiIi)qIe*du+nIUm_U=|`_tvS49(261MMnm6wDI4NOmYRw zE2$S87Z@VGUYx8}?%5b6rc&d(V>14RRs6uB<$@qUY?G3&SezN0U!U3ID{irNG>bxw zLF~Y6oPlqJiVsG}G|sBx&S64ilMRA}kZ^8#;9jG30$dzlMNOEgYCWQ&j+5PiJdg6g zilA7OTD5A;0!Iqevto2B5A>GG_N3@S-|hR>Wn$V;sA@8tC@GgDmx=mT(iLhmX)qnl zW{zgA!GG1J;wWw_kui-arZ{ydO6QZI9Gjs9?~=rg_JQ0I`@U;)RiWphnG#itE%)og z79oz)6>X7ed5F%i`-Mg*wtkz%wxC`Fua+pKaCR3GNpn0|%f12|EID6WHSDi*25>gFL zVkqNUk$=PV(VSN+84rlLLRS>@mK?mA6I?u$pjiM~0ugh6%rTRSkC)XIb=~S(aVRj2 zMFbd_hgk@LZA07uQ_KGXG)ryMa!VshJvkmH{DwR<* z*H$eS4Q$T!z0z=a6$k!TbCIeq$BYK^WA)1wZEzp80BLlXSQ0SJwH~86QO86vXtlUB zYH4(tLOOAF+-(^`kcB$l2PUg0I?=gT}fMJ zE(JjDWqc|~(L5Xr0MZwcnY0)efC@EB)^-2#fY+fo^z@2X2`kZZ;RqFqGLyhC+4f z(4nQc!3QyjJ&mliJdEQa=C_mYkJjF2G4# z=GLZrnI{~nRO!@YC1b#-)d^7S+F^Rt`H{46i_dPhe?LqR)6_u>zK z_m0F#^1^RP6$E}h;3a<%FXZK9<>zPo0EPuWZg(RiCnqZ_FETGCD;XKs*x2~^WIDDdC%ui21))Cg;$s(gH{P$WuUE*6i;M3xft6?G=4R)X zXfg6~aI$lQ$q&CSEYBw<%5DAF6i2<`{Tag*6)xRhTekLgecPJtziN3)^VqZJ^KMyf z@%I7@-l}tX`v4`MHqp*;hq$x1cZmiiO`*G2xC(#Gpl5w;@YLtuZm2zWc@MT)>W@b8 z?B9H~Y;A41;s+vYD`3sC2McxYa#?51j}}hjScy0a+id;Z?en+&+ds%=QNG`i%J{-y zJ+e}Q!9Cl6=@xLxQ&|}*@^^PXt<3pBZZi7;<#lq{1gpKHNy%5?L>4|k`%ZI=R24h-WLIuTlPcPSLSVVE?=z`T}G?Da}u&FbejPuON0u1jN=C9u3VkS^Xj z0OeRl*jxOXW88Nutr;u~WU@Z2?FIR-7R=OlxXsYWKGTUv%B^15@UK4pt|5Xd6Dfud$4%SmcFn0Zb~J{ zWvvF0TP>69`JerR(W(aZg;*g3F()eLI{(FvjmP8DuwS+n_@!11eN|h(;oAw=RwR)$ z>UQbSS=+|+*2sp>4vr}_r;D1zKoS*usn)6u^LqoL*sxFCXv>*FSN_WB)^0UZ%mgQt z@y0I+>Xv5S1SGF|)gBf`(jHV8Zv}lLOi4FLwk57AtcfP;smMJ;MS2OASiQ2rP6jh7 zx1qN#t=xP6z^dE{g734ivjLT9dfC>rxl*%EIPj8y(#e zz9UpM#S@MZM)AIlC#1NP9)W%!Jjz|jgYt^lLEOAPm^k(fK1qQJK`{gm#VZg(CX;m; z>94YdFCP(G#uVN>E6QJYrmVQE2t+-1%s8h{M?hMnXcujQBMl2fVm_an1%!>>(?qi2 z#bouO28uh380GnvfI=f18UmrU>p&N$2N8yJC-=lFbet$QAo6$`5+eIAfOii>IMwLE zm%t4i4yzm}(u@M>v~q$Kt}Am38p8k=fWm_}3gsF#c%!Kpg}y4_tk$R$Wh@t)8Trk8 z2uANcmyP-|0LRHQL{Tny{2sGlxytrzTzg*1SL}!PfQ#ouKb#Y)=)b+8u3#)JDn$y# z$+P(|hy;Yhs!7(N=0i1&n+O1@!-6&jDOe~Ra-a^O2(vgwN`^u8m^@mh5E2r=ae)3~ z00$9F6`CqZbUMK!5y>STQa-1jjBvu`14LM?G`UY{HFuzD7|!^zgkUOA-4jS^391N= zG14!xa9t!39NmL7K$R?(*#|9}34}@kk{H<_u1u8Zm@}1-o1Ym_&*X%9bf)M^3v3o> z>>`nDl4Z{ZJ}P)Y`L-V}$*CkVh>dw%;5NZ+p#+t3WiSR?EtCk`6noUk6uvfOAsh-& zkW&aTj}xc~t%YVCfDQz35Gh}_G9qzj(Cd*mRKY-)<|11IY&Yz~ru9Mqb3)OzSq;^u zz(Hv7VJYLD4YRNk!Cjd&ojvD%bSY=ag#54=#NM#mk0IzkdfB%T#YwRagk7H$SfWaZ z1=1~zNlH9;B#Lv;sN-~Kj7HaF2m4`NnuR=#pmxEcUu^m4DgMr?N#YI%y=jS2{|+#y z5zTNw4TA!4P6Rk)ID6234VF+xCUp=In$iUn1|&5QI)SN5SvK%#olVH=`u#lzXLN zf5FbltAat0sbz?<wyI~vIqixkpXF=kvvWkOv3>wJX2C65Y1S;p%Da{>H$5< z2)Zr2ko{6zxQ+$KUE)QFXd+>(3?JHwe4l4-VG!mi4OIUTAOR{v#sTa8MetN{S_=6y78qhC(j1 z``UgW)%x>19F~^+H@U!eS3)`L?a5dc^FUlAI~WV)jpSG+Wv5!b&xRrn+rT%YD%h{#UNCIk)xDrI|m5B9?&|jgwdw_LS<{LT18&HoTx{Yuao40gB#Ns;7|gG8K3wL68#&Tk1P%y~Q$E3yD(z#>yv);)*2}iIOLt zqw?XQ_t45XB>&#^{%jWu4^r{~>sT+$v%U!!0S3bxReq{TIQTlMn%t9BDac`W*RrJZ zpa;p2<3!;oh#9R^@kDYzPR&WGj(4gDNFOyJma!5gv7}*zj?)5tM-8*tl`QEZW+r~Q z5k_+``-6bop0f1<6C*?jYWz1PY-Q#dte%}fvp_gbYM%LgyjUVKqOA*Yu;Dt`Tf03# zeEJ9|S9Z#eSM*)cav{hz9ely0VD`XR2gv{{F=K=B#jA|r0C|BiQQKW4ePjf6hmo`4 zVUakR$R-YbiAbx+GG{BIP5};P5R`0?D54w5Pgsch!=a+G9t6=i)MC9z(R?SMgIWIL zlh*4_<k~@ zp}X=UCu^t%e0?85ngIG$>__Fe1yhJY9BCYFtR@EV#?)U|5@%Z8$}2XgUQ~<9%tus~ zyP6PGM69%$8K^yep9n(WxkxyaJ$@K5Dm=*SO>mjBX8J@yg{I9QH`zStgkwlxdxTI! zmJo*n0P%MD5nBX{G&os}!THc0{WU$u2JC|GwwoGI zN1s&xP(%<=PI|XOn^rdjw?Df!Dd8cx#WjZ#-%x!NUAxeVl`rdASX?y9KTE=+z(%Cm zFuuj{(-NWexC-a+^V5RdKD=E{{whKcMAju>*M#S#L%o$B%=;d*B&iKF@k}JOp$jkm zZA1M7LA@ksy1!iH8JC^sn`lt<=FQfR&`mH1h!G!gr+DsKY27hD4^U%o%#-;CVx6Ja z3gk|iDJVKV7Q~YdEKX1k6|eT3i|C%ZS%<>0y6Hs6F~TF%h?OD;Vc;g|J{!1&*V4;( zEpCvs^%#V%|BTR$vD4$yPaY^+{USF&9#1z3c&G8g!zE(gi2xmcT*nT<1G(~e4qQf) zjvvM`r~{+cP3q@|Z;U5w&rfY}nYn~3?v3~GH>}O+8dhr~Go6q92jN@3Kpehqt?8ejb|geq1&Jv*PXd+r@8*7O_xW9{dE1qWuVJcCbu-=KUS=ez!Q zkjSZ6diFF&&y~ZwIIPyYp?%y`Y}A9_%Ba^X7j&OKHO?<RP{Ld2p-kD*F2R zdY&x}ukX>T|HOUeWZR^K=nfcQW5BwtEtS@+U?qodqPGbnY{hesgm>E=Pa+@j-h6) ztHRdy-}6#XoYd#@?l2bftEl|kT6<0R-}resB`$5z($wrUr3!9sZ9Q}_=3q%p)o!({yXw;xF6G@=r;%+ zc0VPG+#fk3pC7fkGwnQ993LJY&iO&cx%ze#JTcnc_Wp>&mC}*t`2zHut5he)szRvc zkgM+Zo^Ln%EJ>aQdVPJ}+o0wS6lH_&)R3u0N0MQ9YwRC{Pq09rO3CkARr=4-9?dF^1>o-E__ z`+OvLH9atYJqqph==I;pk=IuOnxQJ}#~4*KkNbDO(1qL6c;Rf|Jf+`vpI%RC#8FH= z_|#=N?&EbICGP#LGqlx?g{>#pj6X`eJmZv_KTIw4=seQ@*!VGx9tG@`xCPS!_<|z8 zrp)6lKdBR6OhgBHNh`!B4LJjbG|c0166A#gHk!y|-JvBBT7YLD3^zFH?Cq%2z#Cfl zyb?(9ga|6w1&!USqAxs!BO z-MQa13@K+Q@K3y3hrJQ~`)gUWS%{clA7m)+4B_2*^x_m{*kR`(!t%`&$lLE*2Mr+T z@74bd_WI-(jGMD`Wm6>9-sblD_jM6HyIb2##aCImxE-J8`}-H}`bwo%joDVWQe}oz z7n5Zt!F_33b(~Qo`v}k=cWHrOGeBfbiT{f63bFEeldaRLa zc@b4M>nZCbH4(EpWH^`bf=1E+GdHeN432_6VirfLn{>?5%8Es4J)ZVa5vmOmQE;RH zgx^_srGZ5)zQ~ld_-f0?W@!&6>18ziDPd=Hv< z0M&kDqFgCx6HCMC(PXa5xNa#xH`nQOh^A5_#JWB?X$dciOnRE4_jcoagf-%Nr1k7V zif0=Gmmw%CT0>I{e1d`8wcIohI0iHHA;K1$PmOkpyd?zCp;eT$06?rP-5nX1dD{(O z+%p6i*%;5Tgf29Jc&&)$zDIT1hP3pOD|o`uDI|A|?gL;o=>%Y4C(vrrKXBcj=vDB8k=*lb7d{4oafCt%8UsmTAz+Eey zEWCXTOnER!7Uyn`+GdJQVnR!Kvd45Pb7nG-#Z@OfjT{pwO^xP?)Wr$Dt){uR_3>sX z5w9gnv?pDBsi^HEAf4#dc92}UsFO;UIU-8*^T}nzW}{eFa9mz$s`4WNVI0e7#<7Ia z5Z8G(e!ED^Iwf|1vE4Yh>rq&N8TC|2AkR}6nqLH06EB*IK|nLch)T|gtdq487>QMLejIkDmNmW5vJfOAm7n-z?5hY!x!sesPl-GxuuhAEF@QX&u>kd*ZdSr z+3}ddO(UgCss@mh*B;GrG?3+Cp@9M%4Y@;VAq!e0AvqpdFv7nG^LHcCTE=S35bjuo zwjhsl%~b8pQDzusExs7A2)^A&!w6yAQVT~-NO>DCCLY}{x={;|XTLEjiU+fBh~(P| z86vwQgNm z4UkfgGDq<=tzuFAEJZryhS0o3ki5Z|QJ@;s3dlqZch zbj-8VfT8Sbj_bcyyrjK`Hbzh4<8)LO$TE58-yQrc#za6yoT+)IA<(a9EXsdDPF!@9 z@<>)hNnI<;G}!45h`SuXbi`JgBfXuPLu>L31=vlBMfC7Q&jg_`I%%}E!|6knpcu0X zIIC<|u9gU>FOD1%wr1pwCtR>p*@@Y zD#EU)s?CjDvr)tYrtw1@3|J~U*`?$amHXD8eMr?^nkT=8J>$gC_$wpHH7->^rd(z3 zSlxu<8P*L#xU~F8xb~*G!6sMz~b;H)GkR7^r{c$v+2BO=hRn;YSj`L zsYj{x9*g2OG7lICuH_(n(-!v@5Q{H}0W?~LzpahX3h&7BQu+`J=$bqy2`qEXfeL+D zWb1(Opk|oC#!mJHkd4 z2$_1$k!7>Tt!M_D+TU8_N7pAMsf#Uc)Xyk4@wxq2>?4|E+#_lC0ukc-Uiw|4h-_qGC+ z0R57FPjAZ@p1eyBO%a z>MCbEU*1R`MOTH`9U;fG9^vdh5uZS2`a}2ccDNM&=C(J_hx6@6ApO%l`uy*)48UN4 z+YLh0D4T3rN%{$>7{B?@F5dFs{tEN=DZh)qUWfVZZVvv+SYkomrhRfG8iL~hWI&t0 z$;leU)BaHEvTo@@i#6rMRNnU1*7fb}{9iVQ#r?e+I=f#+4+c-uxm(>`S3BB&45(*r zx~huL_g>H54*RNpA=9`Hiu8KEho5G5Yv;S>+4=V?b5vDtE?%E%8``R?qKeA5^ZA0m znm+OLxbI5;ySu@E{KtR%f7{3Zv;RMPJ|0ILb-cRGtIOQ0ynWn_ZF9o_+Yr)`u#Mng zBRduu(1?^+bLiw+wTX#3+apysA(*Iz{RG=QzvJr&n!F~$A0P$WKkN-(BI>Q$&ploi zqKOEn*4wPS|E21)SH9Ovwb?S&YW3vv_RjqdOLe#3@ou2bXR%_F-tEoq@AN*M`%B8w zwA=cw&wRbE*ZL3i@6tLp>-Tbwd|k0{C6TxOn$vo|x2NyFj^FIMvG?mJ{L#M`Y&^4x z1@k}mU7zJYZgaznFJKy9smdy)o0r_+Vf{P*4(ASQ>le%7%eULTuY);2nvg0>n`+xo zds|TS(vPAWkxka##zw~c`5W#6;zGf~CNd=~;Mp5UT$gGsyD={1OR_H8)LKc-#pqF> z)-{ax-3__yk|%<;ShLEu*hc3Do*Lw0f_BuanDtFjk_@BrdpvQDvZby4uzlLz_%U#) z``FyVisJ29e+7)0S2mr6Vr7&TkId28L*VlQTkRHIW0Hj}Doi0mkDe-pMT-f0175tP z5lLz!*^WR7Ne3(hzJO^<^m|GS& z#A{T)J7UbwrLvR31z?4R5C+pmF*)kp zZL&f!F9L^-MWFF8z5uwGTW>N-M=RmR8X@4qrX(?k7ve0jEzLMm103F~6y88Yt8=&T zPp&xN)_t^b&_k~=aVs zs-pV!5t}kIF16q;L5wQ2?~#y2jRoy!2(>kZo(XshFi&6IvzE1?YlZ-+PVW>Ml3=o= z(CNrxCX9#Iwm3{v$EjZe`#1}^<*Z1ys0?9==#VKKMj|oK1}`%@$hokCUYGkW}UuO1%Ko zio4;o#|MtcC5uARYP1kAQOQ3b$tGf9)Lk%|Wf>zUha?H7&mEk7cWF@!&64vp<&aITEZt%uE*8q9oU0B^h=T_tWkkSzkxYj# zmO4wMuvvPTOmQW`TuC*Do%a!lwYpU_P))@k+at9~T_HJJRP*fA2{3rk809`}Snr|Q zaCaroKl6GvsW25uH`ElVg-v8#*eG~6N{%iW7L%Kn)6JroU2fKk;P#&_Z$X#0cVSFw zv(Zgk0hf)If_VQ$M3aG|%XEx+72}@Ao|`^OwYd(;O4Hv3V(9I47>01-AWJASi4JtrcO}7%DS8kD(F);SnQfd(`Re}__ zc|*K5yW$RodNn;9T*LS?!cOw%0vXoo zK8PicoB6;d(C6C>r9UnwJVDpB+7BQ`PQsBo3stcsNFuYJyRv~|kQ5sWkb7c`r+5Vv zQ6P3Bawp{jn!`L|SqS*ucKiIja=1zcrLF2J)+qP}nwrxyoTNB&1ZQJ<8 zo^ax1&z_6jt=ikI`qx&?=N3#XOs>N=%N?d#db?Wm&1vO}FIU zO2PdS(y(6%6rpuz%OWrZvFtqB_yA09*ryzZOH%<;K&4Ze*7Be`SA1O1RA5y0I|#~F zzR8vD;_w4n#T)l$YUF&iuEt>}=utOKmXzL+JHtqxt5|esC2UZbJ!R_g1np%o3kUW% zBA`8sLCIAWe^#N0qBBI7+v3UFQl>Ls>aysj3UY3m>5G%WuzchKu9V2*Y(m``iw3)9 z0U?)e1%5^GAq(CjJ)%m>ac>JnU_A(jPx6#;?i)CKwPw7rib z>8|`ox0jubi(M8^k#p|hTE+l(;wvolw}}L-vbn^)9*o1BUZvRCbWS=D);bYhIj@7) z5zT%$UF0YUHd_=22_1B}YTANQ5sUSyLP^K6OeQvpY;1W_x+I?CyJV^tSt|YkR!Su4 zP+&60;-)k$zDjx?vbmoKHa*IV*e~fj@m+sl2S{2UKS?`Z;bFHGeRznz>HpGTsCDy{_gHz{w z-ufGfJ9r%hw*RKeky{4i$I~q|p2kBJyX-}=NF!EJ_8_?0W_mI=)cXLsgsqNEsc9bl z!?iwzcUWxCZ{ks)FCuwasc~tuOS@}fzDZtbu4k@eD)@=2^%uMc_Hnh(-fF}TY;7L> zI5o1!^w^vw(d7g;q}@NFSaB&=4NI z5tb1Cv@0ywt6X-DM2$7;L=tB*iGY_tp=gBpGOA^*B+IrQLE%b%Ca>r7;;po-v)pmm zxiETSOUG9`y*UG2;v(zeFJr`5TCVlFINBodDt&iti?-reiU8xx?$4X*=sOG%-(SK@ zTaN4XbHg`uXzugil-z;Njq`IT3|X2&L3zA)Wl*DEHpW>WJ1A?XY&Z^kk20j0qgXa)>8zE3fx3KPf2ONGY=H(`WHA9B|E5EPJjt~ zrUsCpjA*u^`|Jg8VbDBsjnCU7NdOT~RcXKXQ^4VV1-M-8AFIr8OwDU__fNFFPFOZ? zUF}uMb;Z?tXGc!J`wD^b)#G2ArCUO$uTN>%-~EEW2R|ZS04{F0>R;adWsw!i#_2mz>p+Dl2^ zvg!5V4g}JiY*JYKz2Dr8pKj-+kb*nEJCpcAIXzC!k^POHP4B?_Tr{OKo*p9kKuK;> zBSuZ}dmSoqU-sJ_g+1TbLblEP3Hd|_@%ViP90`^~UgLQlC_Dc$&aXln0)x5btoe(Jl zRj$sf$l&$;@BWWnRo3tC>*C?w;oe=)nr2ZRX`2&dnwFl&%xwrwVhylU6v!gA+@p z?!yxc1c8c7c7@7Tf?`fLVhJ+kiVBdKdqZSS7X6k~;J(5Wx>%|1uC@$sD&ax|#`w#u ztG>&xYN+l$t5nKdda*C~`aGySZL-3$JZP@ zyS=Tuy6FHW=mNw~d%Wm%9{Jq01{ywaZwZTjac^wyg(rD!L=4~L;2pK%Z(w6(Xj zNdY$>4Axb*wRyU*eoh|k?~E@qpTc@>^0{K>=>GY3!8H7OM1d<~^qdUvk8A!hti69v z31}XfR{Xdo$Mha;?Q{9&v`VWVxF2Hwrmg(`Q}f(a-Lv!CzS^vJ`cxg$r&aY*OD@1a zSC$;ME#p0b?xXCd``ifk2d>T8RF0ALAwC12pn>gRX>e&(zb`x=k`?e3o0?vi4D z*Zb84v*s#p2miAdB4TVPT(JF-C`T6yCVY&3`;BkHUb|~1oyw31mPK0~)VH+NYL&Il z2$pX|dg0iQX;M~Amt}Gh%>UrNN}i4-2j_ICeH#8}>=A{uF`HyCb9E1 z8bp-pC76jBHg_+ZQgyU$5n(0Es6{&Cg1B&I0u8$e=y6enfo_vI*Ru6KcNnAs%{$7E{ii&226(%!jHQkcgky5!^( z;V1thU`fOPI@4FYj*)T@pP#?LLGd|-w3iu+^hnC0-$K(2zmGeDK%*a%zqYOkg|5Vo zPJ`33Ib+697Pn8zaIJGm+3&M&0cKP#vs2tSO$&W#UR34=|+f+y>d;bRAmm!n;gH*g}6Wl8H((r(&| zT~SkJnNgA`$|`7+EbT0yo+AfGVL)S*zBC=X)JlTVL43rZ%48k z5Lh$C0C0EUQj=97lF~6;*{ly8#%OYhN*vyE_o+GX-ta6Xl1`w!45k&skj&;wHb> zkt0aLNf{~%>&sXBBA9fbSezF*8jGZ^bn^}qfILv^vXHW2w-%sTI;`|4gRjJ%h2NfO zM+kd{IU=o0DykS%?X)<9H#1dMey)xj=}B^26cY|XRlL4)fmpfIU!BCL6t4TV-G-*e z!t0gfu|__x#PFI@LzWDm=y&kwP!oe5#|gHStquh%Y|_IyVlJ%!?%S%#oTI8&%T`$| zey^Z8hlIP4Jyh31A%Qx9hNDj?ERcGOD>%QM zX$~{+JKh>G@K!SUYixR4LrD_e!>C1u)EjCEB8~>dCq1geQF`ZGSO;==2}Nr?_#xVm zsl|?8X=^zZbP;T&&+=}g!S@dLM1PSP`IKE=OU|j=1$!?9K;xaA_P6rk(Nv1TtnH zE)<&Bfy{3q<;EPA#LvP!dvy#O^SoH*v2kJA$KOvCNeP=79U!>kdtV}}b{CUJt+m94 zB+xeOcT;G1F9snPP9XVltu4V`ISU4d^Z8Ldqn`Z~X%>G8_W#D)TdhWP@qncHewu}& z)Xdf?+S8oO(_jkAOTRyYSGvZv<&G{36>Tc1xkQY6FDebuLt>TC{8xZuINNTa3`K5B zq){&X{eWPTF^q*UBnxZskG_h_&W)CA2{@!5@ijcx23tPQusB36JNL6MAjz@%XbD6f5xf>~-I z?`QBXF4Ib>BSi+BKN{<4%lOo9f~_Ie{QaywkfBj>nslEE3X`RYatdc6c61}}y3mWw zY$V6@nbj-CiVEpf@pL=XdFbQHpf@>*o)bN%>W`zHqvJ$74+$IDX7zR%EG3&_USXv@ zF~^(#>gn3{4r%1Z|n!v5@^w4PmNKMTltxdIXDB1N1IGSLLkPUROqB&917&2D@yQ+=aG z8A~PdK}w%B&C7H3*yjP(Gs?n2Rgdlk53Ex5>>j$)5fC;G9I3Wpbi8(9LTr6_i(B(Y z3*D5u`!nZQe>EGl%Nd6g{`%$O<>KWO`%J;Px%WN!eKkI2IIHS3KM(i<(jNXOv+BEE z0P;A~cDLmerLyZAFj@WtB&?6zJ}%$5X?-n!axeG$ypLml4PO$zJSSwokNbSyhxhHV zzEXY;Q}*+5mHlMC_@4D~nWhsG{Cb%D28<)-@qMi>eoqcc3i53QxY_*}WG)U57lY#S zhfym%-Q5k3k9P=u!@|TCu>Plak^lVj&p-eC|0W*tfA_zw1D-h2c=u8>@5k@mNuD;; zaRn&<5d;r7Xu?+@U}7OH78SE0V2w!{EoNslTremyg+b;HV9iNvmp~y^_1)#|dhHM0 zz?xQ^KWeK_PoDwmUs&CwVv=ls#|2{(N+$e!0)7=S^h}9=Oy2{J92NU<_)$SZRS3_D zo}W|l|4vekI9~pK{YvYqTWRuo*}pRvf9<#I&3d+2%hq<>tJ&+>GnnaOy_)-};{AEf zzk<AEu=2=tK3cI~9^y4RpXPUPVex z?KSA$)yOYk)s)Q>mA2QM4%FyTGhf=;T2UfIJnj;^Povf3&i{K(wE{B6)rX<4=_CXV zdL4Z<`f)TVjs=%$=4)}SE7UuM+D6fyx~Txb20{bhOW#@fRbP%Xwm(n?=wZIJ8H&q5 zw<38#|D5B$`;@`Bgdm&@BH_T7j39^`p$SBE5K^G`%mv~Z-)@P`F2U}2I(>DKMVx5Q zq|jZ&fn%e;Sg3Vsy$ctL8=1k&^NMgino%a+?xT?AfX-{BRWOWIHr8u! zw(-ntL4}Fsw_EjR#N4{dA5^c!6Qsgg#U1RCCwOCV&`qdi2KuWv&{?VfwZW@68A#z+ zLpetrl=!!i(t=`kaTU2*>SuU_(gTdO$f9lRvY38bg^$1RZJ9hmZ}-zgde;15?D7o_ zI%&3{iIC#XSg8tEq>3j-ZB=CTS)CH2vWEq`L#|ZDU~H$uDd)4Ch6{XJi2=%xcs!L5 zBw6Yokor%OeDyCFu_9Rp`{y=WvbbE;=RU*(1TXNz+@-X}gKzLZBjknlOG!8pVtUt& z2zg_AjYLe?`u3ci5%xcYNfFAanDNx=r-3mF6kx4I^eYCtC*2I^(|-CV+-|$uq&El% zHNJ|yoZ?%0`ordz3!JqJRRxx1-0Q^8ft@z2d)Vm}+t;v5*`w;%{4yopx!gFw7zM{^ z632_%zuQ*n*3gd0O!7Fb8ZRxO`X@g6N;GlrZG#2j4>cNcdzO2*A0pD^C&vf1Dq!mPA@=zED8 zHGE<*n6)7yBG)hoiRinC(XIR&_gbZ-)mB)jwa9Y^qM&|PvnP9_CVKmHFPv7x*uDlU z(14wIQmUYdIhK@I?#0{tw4{@Ha@D8;ccZH?YsL9>LMT6=Wcl1SEDP8z8k5PtJSjQS zTF_dkVuRkGO60^RjT0f?ELp9A34@28xyKEsO&(TQoG^7$n?5%g1&T^>$^`6$!Z|7H zfR5&C(CU))@6~{9RYTNUdn0-oe9%+vBqzPoXRchqShu)zP8dCmVH|=R|5k@|;xfpa z0(ZobMnFfYOp-#Df$Xta1O6?IHsGmMrTh)CwcYsMMy5wvpUR2qQ8k~fz6MF-2)Yw3mhYY9TGP1K3|T{AdrtD9AHHX%{|HasjBZjySvLH zrctL=p4x8r@AR3gH3fYAt+W4?S2eeKlbbEL{V}-4D`Rb*QhIWdwrakut)s22t*_sB zQ)-@FQ%AS$W<5%gp_!gx?`rM6N?}{Qq0nHz#&9&+#O~DE*A||^p=}UdH}e3aU$;yi zsL8-cU#r*W685L2&cFcjervT_^L6e09X-_1ZUf9wzc<=wdsjnMd^ z-`B+k;hOdPsV17?vlrC2NW(Wbd<(T2U3{KefMDYY>eaG;hpYB(!b1i^Muw(~;;AWp z+3CJTFjoc9rL^I>hnM2#HG^MeKcC0-c?^+Vi~Ug@USQ23PWTa!FYqy>AV{@GqNrIg74wg0!=k^NJsBneRpdb+C zR%W=6ZdWuL(MjYn4`+BCxV;i9SoR`EAp$pDTXa#ZxSxEgFCLfBKmi+Rfjw%h9Ooq4 zP)o!h7JLUR{W(b8JH8VM3IuP;G_S9JvpeCr|I zilQpn zyW!2*!{$q+Ej3kiyiLLdC(T!1&esYQ0;(ovl8LS=u*J`*h*_QN;Qa*H8w+3HEn0T- zCQD%%Vx9x0k$b=i2Fcf?o;db>>PaE2jq1{kGp5VpCB+XOQ<>$SIB*ix0~0NHtKdP3 z$JTkPiJ1i&fGNbp8~=^R7!PF5XNF?Dy2(UyrP$W~D(&UB|Nz|)Q2;wI-F zEEN_}t-~HbBJ!dkih`1}o`DX>psb5kV5+JOA1?G01|d}ojG&>j>JoCM$wx+MaW?ui zk!g3;i5PNA^=+!43td93W;$}4P@3Tt>|slz+fE=B7A+(j#_#78r3qw2OyFz$%sgGmLPM}Q~tGE zLv=hIjk3IPYHkOLw zGs{C~&r)OQ=8U3jB$KLsXFe=V+OYLQk-m_fVbf?H0N*iVZ#ia23E868#Ze?0DM2%t zYS)I?_HOaj|T$ZKSLQtRfGkSEy}U% zD~5b#A{Uwil((Pj1Q)#6pQZ_ZGgc z(})QX{;>7*uZXbKgR^bo3+kPh9GBv0O9DlxvLF)=A6457LPr|GlII~QK<4<~(_Rh~ z94ZYs8)x@l1ydv9)AMGDfyo%9C8HnosAhEVEuHZdO-c&3xstOdJHTy6J-~}BWy-TE zmqCkIBzvg2$k`yL^r;T>z=<}){1q$GiS%fM6D$#l)=gbSq7kaPlqX8Ov!t051snYn zG=w-{b91AJDu@?vCr)Pb_HKqJ5kpyk6v-qPvxzdRCf5u_?uZGZl6o7;qcU*(#9}v8 zoj;-?`=%8m5_bb+6fFJ_OHrD*ih-PO!AF@urG|4sIw(#bAls@y`N>M9I}^L5xRH7O8#vK5`}OFO$Cy)v2bb z$P$YYVam@@k?Qgpju+2G)%dznS8haVV9?oAV#laW*OF?c;hdGQ9WjZpv%|JXH|{tv z2=8&MC_?jNp|0UkRIF$p1fHP;4AV(-J>&);*n9TRY*j@TS*g7!M5_YOao!(8$Q496 z(?YPfX}NDl7s7~vQBpaP>;+Fy;>QE-y0dd7B1i9Vdvf%xe zU8kMJ;-p`LAaqtVFh260N>#_`y|VFM_E{)SQRasneTvMO*l7!t?NC`hb+)6=R{%4g zDj9ab0xTfj&dbTdn^^~EI(1MfzwRh{OiPe4xs#|c@Ncfv>mXr5foDgSbm?PKCZR!& z?Vj48yw>(pg{v})+Xxm&He{Rmj)?c1Wal_8lm*FJN~jeJc&we3Vlv6e&4Cb9hE>I_ zZCI&7AeznhUnL=;d)e$o=Ue3Z%!2{Kh#Q$0Pq<(mMZ~ufifg9icaii1Tewr`aY9I> z_X#UL)OyvCxVMT~!$gC+BT(r+Tn)kNLQDDli^J#R>3ir=Yo=AYnG-{`a<^mvB56^Ujh%3GJ}4zA>>5msZ*`F8 zMTq8uh5T{ERw#9>EV4fW3^s4^4M>tgs58^Vd5l}#8*9T!J*qT!BIwvL*8bXX?&r8ZRkXamep_}VXOIv+pijJP_iqUy5*c-QX-Y7^2 zo<3_`YnGR!BZuE|=T8A-TO}xXC(L(D_1sTFfw$v6``|1^AT(eHjPXxm_I`wiu6-W< zR`cJD^HM!Fzo!%ERp8=TRnOTEkgfpe#X4=I1l}HRT0yhDH(8Sq2G7}7%>9P$xn?OfE zeeH_7B=;h6w=2$V2&h9zoc=*(D9gr?U_=aZAr)!Q%Nn*CGpo%={IH( z;@Y{U6gQHc0h*wgzDtK92L@2^pT{=kz%5uOh^ASQGUM<>g)0IhLH97Go>e)DaXsQ8iJ;i6gYO32hjwzEb27 zDnEv9`B=Gu`@F4K*D|^9vvno9p!$Vj?WR+3z;4q=T@XZNJKyadZqIyMG>)K&z&aM@ zJ&C*lOsWcsm_uxm$e+SW<|@1xaK*@nSnXI96oMN(pqJyB>>PfeBPZZfV5Td^EwmHz(kODgQDI5tL00`M z`n@}tTAhM<-b@Yp2<4>{79y;U%gFF&=nFkytg3j+*748H^^M&h6XW!%Ge z-eGr-mVb!#;jaGx+CyK9+>SUKq5QvL<_)9WKgs)EPrrYa-6c$UI{f_d&G_cs_92x< zu|2TTh0i8)%i^%Z!QUo(lZOg74~S!WNb#_;x>AVvEQSk=9=0%dcR(FPfq3zA0C=yH4aesG}19M(ls@FcGJ=jdg^Ox=;-Nd zpM3bKl6snVv~?~_z|R?t#mhk-Rt+5ArqZfqb8l5Fy(`uH zXZN}VySiGgm-bGduhu!&^|mga*ED>yvx#(X+`4iV9PRDl_c-hA?cBO{8J>F9u4*0i zx;^ZRo0s&1z7OnOkG4+7(6O)#c&`e28ylV7ow2uu$=236IoC8b0q&*SVJ|Oh>+Acv z`m;0V&x!%P;R;Nrhz@htgdNLsvj}{ig#6C)CV=W(P==i!lq!X!xxR^CgR_Tc06^jT zMu3g=TnF|i-%!x0ytkI%Z^C^{f?uOY?Qw1u=*Q1T3i(LgAnWS;Uq?ZI<}kaCVG;O^^(5ms@S4{76CKTE#wGaOQ}&Au zPpt)VBABn)K*;4=c#b5De-_A~H#u(ea9%}FZG}fql1Q>&UlXUTinZb?rrdghn5{iGsYovR zkp6rlByc+R?IaE5kCcFiTH)B;>^^LFTM4_6GP@ywQ5LzXpl@Z~0 zrN#AVv1t7Y`U}rs?v3nEcXz_Ci$KYx!F*1|mcq;Hw75v4OU8pf)P|^CV2en6Ml7G4 z6Tes)6L_^7JSX8=7zw@=8pk-x+y7b-(%6#2yPcO$@-;XeLGqC`Q|mQdZO&xH9bXMN z&R3omht)WCtPCZI@2M4rG4X6R{w5BA)Pv(gHxZUIFqrE*9dSRfw5>F zYd1?k>p677Y`)}TxbxV-nKtS(s{6iSppd0Li`na+_kQb4^>^F}6=TLp6;;FSF4vck zZ9@CqT@Urg?HRTDot|evxhK=HrFJ@56tA(c3H@z;SQyL(kPiKe1et;{`*-()#IU@U zrZN0FS(vtxRp)epv2r1RCQ$q^URklSG#=0WI62+dFOuMiQ<|osWI4SXj7E!}h>bwQnhdRDUM``ya7(~Gq?gCIIHQXEWB^VPQ}C?oYh+{XL=R&I+bBtTce^*%C6ROS-E>7U9SBOV)aU!=J;>9N_%J-U4Rh*8^|q{4>_KfsxD8evz@jD=+GXg5ZEk9- zumHxBwx_*V>RK3@ld=_<3QP(68RlYEncG^T zDb<{ard5O%t+32S z@IqwbnFMU)kY6bLI!8el7`9_r_W++?#UhOBABTJu`QnnV@jUE;U?G$ zSM-|E?0`#Hf*O!@rzYsRdp2nirJaJo->X#YTxT?*01ZC8B!U<6Xm^-lzYXb@WM$Sp zOKo(sD(;hYUK`^lC=uCi8CI}fxEXk)grlJgS0<1!JABbF2v3yS-$U>0e4^ioKnD&r z)WfcHun5lBlrX>!xW2TOBa4Rfa8ksoSZCn$c>xqSS=;$bqk3rm^H8#+gT0~TnL$*q z?oAeh4^?SIvenU{%kxahjTjDSM|cRp^6?Ys#*CB# z^e>_ys#+s3eB#8+FQE##a3<0ufsMuH{3H0SRcnbV@pUV!;&VRgqRJx26VjrXT1tUL zN2l}=YyQ-S```_cW%INW8@+50oss;ae9bV?hH~^K1e63lubD_S+DP~&wa~xS3PgJu z9tTF!?l5&0B>b}2z1nq!0x%hf0+LGEgZu3D<5*MFIIFr~BAI@(tBnBTan6ZlNr<22 zfgJV-CSs6Q>Zp(5rl_e6eMSr(evzU&aOhTzZ`NvpqF$a?$^BITAT|n}tDclzV?L{1 z7^e~#nGy0%3kmN3rVx`JyLHPvQK;^>HP*I|T!CVebQsi=?bh2_TKA)`ugDVvm4NcWTuv92P z8ArdMILs@P4ia+*_RKNLZRu)8K|(gk0|^|n-j5>5e?|tI)8TTQEi102EP^zP1d*JG zf{M3Z6y~#bBwAp%>@R==k(EG(Qlbq#L1E@+B*MdCqfG)*g99MY5l!yOr79E>d#O!Q zi-x|1?u17L+1-=K*`>mv4PnDqXfQCLS2Ph7EP9q63|KCfH4xcb4|lzCNSpDKN#{|5 z${Dq`k-2qjWGB%j2^m8|fgH+=1e$8d8{hHKJfnbL{=S%c^Adsts%ebBuoQ`+$KL1h z3RN!;gQY|cmeJZOCMq#rBT&M z=KqMt2yX)J>ag-dZL5(>oPfLEyh47+de&O05aD{TKohHi(Efe7Xw3meEx{3`xS zD?@9H@OL#9L9CKyQbA?HN>98m=5= z*-{M`?hGfHt_A5q(=Quj2bqh6K2#pG3p7;Z()H=S=1?LFz|mk6BbCp>V=ga@Nf0N% zVKxFm0*}o5EPqEz-EP&H;dfx?C4TB~$IJNqh@4VZT#Cmkmtg59a)98$2rGi%`v=K= zoC#9z*>EvhArl70Jj~Dx&*;RkWy5c!5QcCkaR{D`7-NSxlaK( zafrBb6@q$IQlMuI%S>uI*B7R?DwMZ%x-_>$sk!O7XXFu#?khfAUTz2yVu(!SyC*cg zC;+ZcK;9}?nH1r+PhGh933WyyM$uzF!!IUSk>919rANF#9(C5iOWj0^1b~gTY{owk zV}@$80H1rRfA)4Bj+$ZQNn=-EkJULXe{6=8$tJ5g=%$^`G^r9dP7Jn~6=bFfrY4UM>9L3QU5$q?ECF8w2cFJ|^OPoH0sTEPe${d?DWExgdxLB{GQ0RPLA>A-E za}TZ@6c0-k(3ZiaaFp|z3DJ~iNM9{ePBGM$#w@4r2Z4$57g44TJ+9^_<)k#j0Xy(C zq|^sm^EP*-r{)fE9+N+49n8vriR`+X>nr#Hed#g$hH#7GnvG;(*Qkdff2tT)<_5Nx z-ahY!>r*_b9T4j+-wH&2xJ(-fkS)dRBXv$Rd+re%4^^G;N1$F+KvXTHgO8Yv%_fv# zD3V9lCkTr3FoeTFXUTR=IBE$`wlG3BKM#Lps~X3r_$wvX7pWrMaYjhp7!5vqz5zQ9 zv4tb$#MdC9ameQ5%XasND}W!@-j*^`rsqgj0aQu)IHoD?F^}0mn^Amvab~=n+C|SV zP}h3pYC3uNPTX+y&Xdy%4*FQeG&w&-zNuz@ouk3k>zwAU7{Tqk32zA$Ykmc~$BG}Y$2DJXLKP3!*Ai$6=mvdst zx)6lDpNhA!P_$_ww37xi!_rPr*5I+)2L`@!b09%GU>2&|d9KoRP&@xFSds2H0(Nj% zLuGiR80*d`fSFu{-x_`~hWTxs>c#r3Vx!!ku@iqQxUW@1gH4$hLEhj>Obl)#ER@Gw zN6gLn^hfY#mT+Knn$ByY zso3tim89o$Zze3mF)kN3%J8VYAJ_H{(PRs>pYBJNZXDFPJB~1E4AtMZo0G_*HAF)C zJvH6czlGB{$0J`5PVoXaiyQ3+BB37e;z{(zD*J=M8$>mF*baEX)p)bbpYnXM+&b8Q z*zI_3zTtf(RLYT+oEiDp&JXBwKWdKCZ4dBwy}JD?InCKF(3!$tnbr8>xU&;~p~lKy z`aDIzA-k-CK3)Ft^iO{mjABpM(02QX-+cm;VJmb1Q>F%&>Pt~u@-|VFhnPc*H zNk`NA%X(=(DK$Ei=hKK2YzyH@(UQGUOiVO2Mmb}ko22x;y(~yQe*U!b^``l2 zw`stR7nhfsA)Xv;Y2xbLl#4GOP~_XSld3Xw?dU7CZh52rG+#FN2QpL#nIu zb#)o_K}{e>A~iwRW3WeAybjV^b?(gAQT+Ke15_Dy8h83UX65Nv+zQOjdDwdGP0kM3 zAI0vJ9X%FTT5VYLdgt9uHkM_sLE+bP{lHCyQM}ln1QzDg+t&EGkNB5jleu}(xW3}? z*WNj@&QEhCUuG32+uWfm=MdE3N*9}m+dO#9(WvW;Ax9HT)@$CFRopi0?KP8|Lo8d@ z15BAKT6g_Yd9y(VUrl2zchx)RPPY)(Rf(-|J+&q=imd!BS3S=yJNR^<*5bQzMs7E~}h$GsB??j^I$1 zwB5b&kOx!TWp0cwvP$6&)Iu#SgG34>XJvB(DpqPjd*MVJGf8+8Uw%+gv# ztQq;K#sX<3YOCi&@x!#ntxX#XF~_$+=RtHYTmzEj4^qKO5`O__0^{KX9Znqk|2kj9 z2;x!TD`2%c>_s5wcN}9A<07#ZwyR+S=1uKbXlK)v0^v840%u|3tXF0u-edBAqKyaE z4<IZ>(Yeel;*RUG0@a0ZrK{a*fPorgbk4*J=V7T6S!{$Jo%krsAZB!D z@}7gA--7i`Y3xFCk~;eki90Ale<5p&DEtaqgOEm9VK04gj$xKpj6yzz{~bioBn+xV zA}mX+hzb$Gq&INvT_5rJ&~nj~GEuLEx1uff-4wT#XBiKVFYihy5tkI}b}Ygzbgqx? zHV_?uQeT?TP!lxxhlyV+Hw+=I5S*k`_+=TqYLP@FrC=hcMXLO{0_3lScHlCyq#(3Y zQgT{iqg0KQ^IC|Db?dL_YnV!OsCMZ&kLmOxWml0Tdr{SNf7zl!r}**XcT4*5F9~CQ zw`B$#)0VixL1CDiaHjK?*?Y1~CPm8@`wC&;$}u*2ShguXu~C@KbtfSN5IV3VE)2|% zj*X!fyFVW4mr9NY_JtP(M;y%CLAX5<%<|0klNJTip!?)(4K<>K$Z8gSe-^Nk%4 z5F<+>y-*qC3TW*ztD@nG-xWSg}f?TVhTz)bFtQOSn2`g}+EDR70+(1;H4yf=ITh$l@ zN$8loU(8)A>{9$+O6cT`Kzif{K795YCF5)NWdx8DAB{8jEy6UO|AT#d2o42U8#El- zPEMSh*tTukwr$(CZQHhO+ji#8X8!H$?$p$I_FY}otM9Gu*4!aTGaGe6o*}5+G|nMG z^%7)=o-9|7Ujh(WJHa1r-}byJE)K#{U@X?oKtpSF0yQUx7_t7lYI}13+QyN5K{M2& zX$~xum0C_eHGeT?QndLzf6?BJad2w9G>8I`Rcl|)KRasWH_}o#CO(&@XtO!qmGph> z7OYAB97V=~rD5Pty3b8svV+T}!(L1bn^u-gyg#J@>E;50g$0@Oe*C>RpQ9Ham*`m?VL|!qQ3)(>2>jw)X{o|wz1Pw zSK3F~~zG z93=e9Hf&q&4|M!3bf6CG#3V6*0)Tct2jqKag5VUhab={Zfnlx+I9;FSWS)m>du_Kb z#0S+v@UodN3k7`nN;T;07ltf?`GlF$X?)nXahSzQBcn*rgD{xE;9X0*@J&?yY4Kc* z!DzII&I;FVL|;(D@l{Dvq4XGrWRk#OR`=CNjfo&g=c&}l85x0Oq^f^((>3_*kjpR3 zJGvbZN8T3tDH`ezv6}M4v&>W3u}=Cg6eW~ zt>`vzoNz)N35;TJaVGI~Bw8(Ip8q0R>_BGHix=0@q1UgL?=6j_g3((6H}|Uadm{G|ra?lz)RBVc zhA?Z3B=-?tn26t^$_@LgLf# zMPBI}g|c>+Ej^B2KJm@Mx1UN4#E>6VKz-N?Peq-HW8;uHw*#X915_swe?!41CdytMtATgNqWZ~@SxG<@4E?nYu3I85x^X3v7t$b zcKH$Js0KTM5ym*K_NPi?K&oZGPljXnmH;rQgzE*0h?-s*r^Svi#XXx3l3oiSNn3>J z9SV-8b$8YljSz_t18`1Cg;53cjGno1gA$JIR1X9$-RsE;8$s4>jv%Y&O;W8L_mZdG zv+uv-PgsZBDaGhl>flGpA!RuWkX!4RS>#R4z^||!8JSCOnHN2EBjU_#H@mS}^GSgx z(QJ2#msI4v6%OIh#D%Cl2D$a{avh7nGYCsHWq%Y;^!UXyXrhxmz%s75n^Nu!v>hg=nPwI}z?2 z=+BzENjBeazxgrw*Q6u4RAbACv8-~^U2WxrnyH+t00Xm&Gm7f?+=4nR7yIUY1K;3d z?F_ZHyn`()2Ub@W{HH&&AS}QzAnj&P(xJw-#frK5%9V`Pm|e70tFt1|)a*D^3@WQlw$0&V-~h8AjS zV6he7HmU~#ct@}K!#jWj4=GFsGtkU-n9nUC}ZIuX$0Ue&X{IJFU}u+W69$a;dq5Z7|)+b189@G#^M)zFkI`RPn=2n~s5VSr{Er3<6z=6?)eJf?iH~rjNenujoYS5RNf&udo z6Q@9#ZHu>QbAWuT3(mQ$`PA%ui_6BSZJhk%Md4z`HIIzW?8qz&%P$v8J$}?MLOJBH zyc0U}D}jNzz5vNmzK0X+rK{(e#54$3FRNitxu50^AGnE@XI|i*plUtuceI9>ZzevV zXKQfcr?-#UySC3zmNfg%Ry=|CMMo)zN&$`Y15)$LzJvoPItI;SjyF!{xPY5Z-#4Z! zz$%*zT8WGDYI&91>+$6!Cu8tOhLxnxOcj3D(mKx50EhgGqPjb0HMPPsAt)_0m%DtS zedv1eIP9sZk?HwLB@k~`4Y`h-I!m$TCJw~JL=!GjhEZtcT6iWv%9lnNjOQo|uV3;< z-rx1ojSA-1o#aQ=8Cu;DZn1)c^Z@y`{@Tm7f;e#I^i-`KWEM*jfAZ=DW z{(S(YsX1EZ0K}F^Oy=NX@+2x&PN#x6v9!yf)e0pNi|s;uMrWAWTO?H=Q>bSCATSfdNSvc3WEZp7PdPg1e+=lhp-SRSDn#@@FC4-nn>n#eHGz ze7)W7hQ9r-{+XG9>#^MmL`!+y@9qSIea-s>KKsqv?6#dQVTKojvdzrY)pJ5{(#rNv&JZHUA}y2X=%N7^R+}Sx%Kbvrbz>C0EhQ@UM zv9Kj<$5SKE3-nNWEA$o zz7EUOc3M?7%Xn>NM(qy5jFoX<3=NTI?BVL?AMnO^Rh#j$-#M6;zPbq{c%6WRj}`AI z==t~v!tE~Gn@cQk{|f^jJESbSqrBXbRK;;LALw3Kg}B(Cq_-=1+rw24KGnng{LIJZq+}f8 z>5%lp+QzgXJ~-7+2Bs;4!EwLx8k)A1)?++^jf=x621fc2lx|j&B+NHc{iCmRg6ZtZ zJ{FkMDqsZs>eoo?*fe#V+hZ*66{)!MI{l-}(;pHtaCDk~x<21(JiNMJlC+9#!s#H* zPz__JqfW$e=T`Hfk>dl}c;e;7o1o{pA9(%dtUr+Yd%fgFJ$q&9M1q~Dhk59m?=>q8 zZAcZ<(d&WZpUA40o-K(;IOza8+4PnLn^s(|zZb=(%8UnBhrrrJ^`}mXZBZ{&l+<0Z zpoGX&AkD)LNyF#r_k>!>-#36lj(k~aNyzr~y}y?C*XUJmHl~tyb@`1pm*?|s+_4N& zxm%|-e1_q(rp1}DM5)wp7p|Ijab!(tQ$rqP8ktOUXtJqAyhzV-L%=ey2D&V+9~2dZ z(ro+MB7p>dj=$DF6^ndOZB|7z5KLG1Lru;q-?v%(E^N_ zqs$X)*FD{aEW3n!8V3HQp#_;P8bdi&sJvTW)_yQBY;p~In-n!}vY}#)r2R0|994<^2 zy(wi)vV4)h42yv}O-x#xFIQ>~5%2_C(HYYI1R%rzM`TW+4FilR0b!%G4iW_0if|qk ziJ!TUd?tC$W|1QDTH6dBL@$gJkWmXnU-PdKUv+pqcv43eP@A?IFQU9~9~2ITkCIKi z1K>gfRzYpHg#l2Z!7^Wx)mfQ8DIK$YV$PmIWD`4d7+?XE4;_hfbV``V;4nBwP`%{* z@J$KKnKJhSC0P!XkiCNGHg>#0awa`O+LkHA+j5`#0+>u+Q#O$H5UKTq4m!Io2GbtH zLK*Z+0AyAhnSIgHBT+G7HdYa*6o=kqdmeHKqC!_O_a8Zv+N5z1C~-XoTdt6{g#dd? zM8i0(k#E`x(mWe8=!dZh7qm zG7yd#_m(m?jG4k{UHyu{d0e^2L&nb8=g>A38q$UXCWXi!pK9R4K9zTt&5Q#lX~aFj z5U^xZCkld3r+_D4__J8A95yjEVV634$_V(F4^OmUJ{Aecn*crNbTVsSR@(zGf$UMA8ty4obm^> zw$y;5L6)e(9x4~{K&eilji@Q9OtK7cJ4+ThtA=e@_LME_ZhcB_Irq}&?I=|HJnnej zq(deteX)elwIMHk;>D`1nxuXJ|L-u(fETj0c!2U56K#>CVyRjrKz>$hUUsA5#CW-7 zO@<|Vxf~VDObjALfMUmsH@O2e2xl!UUMi)LVxgK6?Ii}8oQPGFIN4uPrfh!kcaOQu z1F!jqd!XUkvf(Y1P`X1TR!dOSI8!YdEPKT}SjK4h0G-8U&GaRJ=Fmes_;`J+|}|A3mTHeq8W4j^-QplJM`#g13@o= zQDiyvSraF&yC=TF+O{laS*M!#KPN%lN%LDHW8sA-?vF8-=@J|D{xtLTRv@Be^$46m zxkHZ8dB$d=Xa;j;;WL&?nBq8rGUA{uWpq;Uf-#r_1QltI5{x{i%JKt%*B3nvF~DxY z7i;5Wfj!gUwul~6sOUm~Pbk<98lmypU~IrPe6mAje}*sy(5mdgHQ!+zX#iqJOI(ad z&^JuQ{V%)>#C0a3Mr(P+=7cIx(wmX5*&Br|O9)M}D4LC?FSh_?PV4*D8UB35ho{$u=U~| z1!nz*E!-~W)_?*vZn$tteeSeEcsPe6lcfpqvx^42VMz9U6#$(L++1hHFEeJO!5Ygx z_wdVVz=JuOP3ccAci1S50NB9aI*i;9y3vb?4Og4NFSWsdUbvWSl;Qn94(PN9{qqo8 z(c=?5VtX~fPCb>>EO`|2bZ!!9ve>P?-E5=!#7hNofj2=BE@Adyyy>CvOe~{BAV=X^ zcMpOvd(Ig`aCAPZF?g2D&BRaGKxqj|LHDD`DWOqSWJ(1CrxKj8;Ur&3H0c>C zTcJ0o6XsLSy5lSZltfH)!_GG5v^5II#V^Lt>#S5H_uk8>^TM$*cnD9Jh(8F)GCP2( zSPAonk|~^OH_>jTtA=bYl=8>t#mrjAqAj~%VpByMr*&}QS)7=B^Q0G-aJIH=QTgt< zhjSg)-Kz_{!rl7~h4d6oP|b0rQ|8)U5?qtPW_mXK9J$6s-P9(ofhWeY$D>*a6x5>00#kc5UsAUYc+k8>s$ZIXH{vwinROW@ z^>_&-Z-Z5BOT|AaY4o;$yRehH1@Z> z3I>2l(VQNNJIsmz`P(O^0tBX3t#-Ih8d`Nyj$_Ma@((4|1%=%~8q(tUKtO_*u|^UH zZ{cmRGQuqT7d8v1G%pG;wXo(4e3@E-cs1nfM70V=GhF45*^OrRdIFoGZMmTkcRkK(7SOPVmlvshouuyt`f3 zw}v$UUc53GaID7G{ol}wX?nA8nu6zSjhBIA`cED$_26OO(w|8;{(I^+nn)~dXpi9h zk%Ro7@K|HcksqSoy;%-wDvkH+0!kZnE&I%^L{z4pq!oDR4c?tx;b32q=HIJU&)Iw1 z(`xCFrK`hk+Mc!T->dz`S>IQuSH0UrPgz%9Zyn!lCB@j++?!!y%L)<}?w#K^$gb6; zUVyhCZw=!|X->>vx7T+WsRoyYk&;+f-fy5D)&yU`ccn=D|8~*+^UwdiaG3w;|7lyz zQN-QT*D+BApDziN$ppj6hC&u;D$XB^EGGX%7JqSd!t#z+i0}j`dqX0X!xjjj-K)YF z6+fVkjIn;xON4D|kRM9#IATMM1fy5UHD)sm=84-KndtWC@96 zrJIWdbjejg)bC>N!xWx7!Kw(=loa0g!-=f}>0%(}%`S)Hb*mm;&dR|Rt440m;(0Ts z%-d#-Y_wTth)0#uMRR8T3P;$ZX8i`b%0n=&zZYoR)5A_i`EnU_jZ@g#T%!LM?SEhWcDOJ zVCl)_{i>J~O*2(R(Z(mL3&2ADnn1}`K3z(c;9cL3)yg)*;+r$^X8MAcmz?uK4Lrr| z+U3OS?QU&v2vbW-3uF^du1;O0i}LhrIa!z2p3P<2IXlnKdQ2M|@4>-Di_5&I4sFRz zkB=x(&#oEq=I(Azv%JxJM{p~m?`@>0c(4%EWn}ty9e#4m-Qat;XxX;g?prl-td75f z)3zTN$0Ai7uaBNui(WX&u6=ODq;_t|(|!B&&YUUp=o0>CY!{Ng*IuTu>+j_k)u<}Z z^3Q-5KRMn{_C9_OJ-U7!xJ0+6J^jswz)D0co<{ZaQYyI0*RjdXgsfwr-phsn+}Dk6)jJP9=7}$noCXKUZ z;FsjlIaZDOHckuapjg@Du`KxVW?bbfc%|$H7)QLS@>&K}zj?9jO828`g#@^&m)kdm zr6X~ne~PFXU#Pr`jJV2gxXuFR6b&yZ)J%ck)c+cPyX%tILxRF^Bq&~LkDLc-c;bg` z_jv!tTX{V9he?qvPjALBho?lI=lNPoqopaqJDXXvf}>&`WBMY;NZXRGXq{YLV{YDZ zYz`lpH)l3~<*YFk-)uih=~8Zc_l;tnwVkTzeTge|4V$Ty>NvCUJle^8^Eu z*ZaLoK!!BGo2MKS*o9EOusp0u>D%@`e=w0SQ%P%>?ECr=4bR&R8r>LSs0}$l2ji4> zmg<)`a0lSEa{0kU_s2L}?WG^T>H=MFjN#b>=l61vN)>LvZ%E`0P*&zton&PeRJ=g4 z58|0XDL4R}N>`Q;oR}o6hDhfJh1(+vEqK`w<4j9#9yAGzye}%aLJx>b8*SW6PCQZ| z5^>z)TZqy>#_W+<9mz$$TE&0bfxnEXp+^AP;L!*jTUva9G(5#zelFTGoj_gIam(;#Gh6;{ksH)QbUp_Ds@$hJNNliUSP5Nc&jZ zjtODu$qeQLyDu4+01h*r0#i2lj0w60H9;+mPAM)Lmsu+cBo7_<(&BTCUZYtoH{3bh zo?3M7M{7>Q?$U!Ekic9|9Ert)&Py3eaLa#~oglUZME7Bj`3iafAC%<;19J%FD*U{1?t@_6`0!0l9XP!OF++M z5XkCQ7%5FiWqcI){Nt_eXv~qcI(Wsc-5`B&CS(F&ECGM2;JCkkJk3NZlXL(^uGg4$ z9^*hQ_vGFEP{Zk}l1e6SDf}S7#?*rk8-BugtwFLrQr&Mt!4xoeHLDO7s4lRJoRoKhsiqoyXMvqY z%@oITq<>Kou}`6hf=p6xQlHE@2}%rdU+fUntFEI65yD!b+g{vG9WKIB~i} zey=^L%bm?`m}E7uZ|(^L4am;|s1!TqX{uAJDBIVx!SCK3aS)R_cnR0>$c>9#ma_cz z9Z;bmhMb;#EZ+i)H2ws?Oc?juj@GB%eOQZ-=S5AH7>3q7Hcuc-nlBt^1Q`=lv9 z2LvIiBfx#iqYqNn1BEp0AQxh1lL;p^$9c~|eGi5a`K{4bPC;5&P92TocM)*$fMtOgwpeExjVN7J9WQmtxj~L;1!mgPVjyo{A8@n(Rwc7CB z^Q!i^```h6BENWUs1-+=e?Vm^!cM~t3kZ0?s(1rz?FZ`e`?lWz79(7eYd0YEz=wdSbnbYu-mQMTwAp~bEr5d(kBlcR;88DOtvH58sA%z|3{t?`Ze>BL` zqkkl%El*VUkJo>HPLib_NN#Gmbo{(+`aoe;{6b~_9U)BZKgp`*=P+}C^)c6^do9E zz*I$7>1|1o0RS*0c@I>8N{#$Dv3((HcR2g1z0t^$oeM{_Dla`ZV|XHuAF6$)8a#D` zX;2_7c*+Nvzo*xaTOpWQihNzxj08xcf**5#8oVF5DaDV+$h<|yuCj@MNH|WTz}JOR z099D-j5tMRlc!9vy0C!-*HQj1ogesT0t@LmJq#4rl)z8opoP<=^>_YkfEshQ#XqHFrDzc&qZhhQS!!sfN8%aP5 z!JS%iO5IQoxzbwvT)nSM#(69aEt5rXj58)WE`OMk^Z5BWl%&6iGLrKg#2DJ!9w$9z znb(OpbTSBl^T2}1n;g8ctc!On_l*3&NAsTGLtQ+{9NcP8S0O!8f<7J0#F_=c@L10?o)%xw0XFWa|cEFT2#iKYG6qnX6K1 ze`Zv_Whi9;uuDznMnY1{t39d6a4pa*lJEN&z;`}M7V??LJdZtSD`^+TfC2M z(8byFjO)T9_rYNc|IShRC|H%>ETKe!Ard#2)ytx71A~?V$zO8RoMDFmVzWGdYK&D^ zidWu;f`#KiavP20#DxZX<+EdzE@P*;j<(+LccW}UCl$$Mb@BvtIeiTV= z+pRqguU`K3^_ju*6HPvQt$&&Q^l{1jY4uf-N8S0fGIlq1KSxt3RTJ*j)KX^}`x4Y% z*{u-&Zpmo)4OM@oWOnbH_QCLYN%Z}J4A~fGO!F$fLFwD_40);^Q0MmzH==w)lP{dS zv&SS!ea@`-Xe4^b{rS?~-{qp(eOp|h{<74sE(ErC+E_TvrKRy*>9K#DT}4+-;qmzW zI3R63Fco&b+jw~X%L@=u5msb5iRT0LnDv2v6-SE}A=c6Tu_H=1TkZ?^YQZ)0-wvdI z{`vn{Db)Y;zox9#|Nj5aIEZoAr*Coahj~zsvqcc~4-5<#rv+mU^we7X#ScJI9?E)j zHD6_m!!p-X=o7mvS8Cbuw$cGO#yGq;^SxuSo2&NAcNT#)>Uf2crI$%=^U99p^{u95 zw)Y4wnt>WhXJ+rZS3=l;Ew6h=HCPX2c>c@D%4zS`xiuHEK!i)@>)rmKPUp5wvxcRm zWwlD}Yu&1*ZKXgfuxrKKWsPemyoa_z%Zg{-6_49p-lmSGu5M^=*)8{(%jUI>Eb3|| z#rcjc(_Gb}IcugJe5-byhOT1pjCV3qU&Z2iRjsq$mX*tj-jaXwTMKMO$RZ2xPusko z9>=vvVR6Lt=W9PM6;`!LBk1HHw@k6;noy&^W50dpvm!#%9xh1si$*E2%=g#*ZAY6k zL61Uea7USvbQffg4o)TXoA=#AHAieuMEM5`} zCxA~qF(v$bbZs%!V7Nm|969N$jcHu0QJ1?5wvA@Ey#}{Q_WDZDMHFWp;!bRUDpZgo zK?C5mX-wllhI$MbEf{c-qQG=CeJXjW#Q^z-24ZBt>EUfFnhO-V9ymteC!3lig2e;p zm&iy%ku>91c&8cmR27uvetX^3|7?-g`Vqo?L5rS#KjS%G;GL%G9uh!CZ7}@mUTnZ* zqazwf#K^|N(qk*?DMOP3AR33+^3<^NN+;|5>o{~NQ`TyTzCBxV;G>k^E+Q(gwC*N_ zp_=D4^A2P&s?TPxL<+;Oc0Ek*zAYbmV8_k1dyN+r3f^%*Q|WminFvf9 zmH8dmQ`1WtV5p6_o;7DvTCcuvqT97{BV9%dQ`zBysXf)O8e{1NW%(&3-vv3mMuDIfw03w|~3EftE37Fs!R;ps)B zL$>Pf&>=>YIjMp|ocxj9nzjRCXwgN?}rR@pajzqXJQJ0(oQx>E)zW zLA2Zfj8Jvbpw>g7TEZ-EsK`9GlU<-{{7Edvp5D_IsXtVg)X*VTGhz5;2W-2JPLK8K z;>kenyhCn({6YG}80rc@_QjWr)o6^{VS?&u#Dl_;tBS)#!1cv4zyWs*ffSgk-1h93 z9CKXQ6HDx-L{ED>~sQ&=+iw8GNT^c-<%gaR-k0L&fr!q=;bk)1fs_Vi`9I zD%){lmz~h__TejP;Y4;6u*Lp%J8KHj|tbzv(6 zIdWjN2;#yYhG{#&Ox=sX=5fU#)I2zSW{|d0+|noIBfT&d|rLtY-0pD*Swd$4WgnF#g zT>0h$pkgpnQ|!^il93L?M8tYq^7}-c*_#8~8$@zws(50S%3vBqFu-kVjsSUg`R;hE znlXHmWo>-L%!-I(jV#FD>WNXA4sGq=cxFCB)d__ihk~M^0=j_}h%3Z0jR%$|T$rZ| zp-7n109GDQFV%H^k4ATL;)3CzYxwOKhZY+MSG171-wm}CeykUhfL;AX>;be@fB^`d z-UPt95%}7Zd^%T=mV}}PdhL;2vEr&phDfdoPH7dda(2tOXl!_hOHjE5qk2$R_5+rL zk6&e#gNE)==uyolb6F6Y;I7;0wmPjA=CW?TknmqDd#(D_T6M6KhJYIt`+eMS&`xxp ze6N7XLa-3YtXy-#eMt!BeBqSY*cw7~s}<7fwQV{1ny*2HgZ<&m75y#Cn0Eefw3rn$ z7+3batxY=H_EBeGc#cJk9{rO1(N}adcGLp{`8J;G0x?^_*|^j3%!9DSv2AK4TDz+g zmWZl0F5t53*jdY-Je&#P1DbX`xg) zuoi=&182|aJEC~G9!CwnDA9bkZVGtiN+d#!_v7 z*^pnA!M*YsxNgDE!{+t|i?Ve?lQmvwcD$Rl|E(+Ybj%K?W}ngk@jv-ji-D;Ia=Z1Z zDLl-o&*bZf1_BQl>|&D1+$zm|96RC#s^K#Y^hZj7xN;usnM)Lu{lx_Ks1541?|w9F z0F+G%(Chss@gDqF3hJwLt-7>#V{7C$q*O_tPl{{f>tQmwnwH1?<7!ow#f62}l4t$R ztMkc4EX$|q*=Vsgn1DX0KvXlAC*-r>4ISX%)ZDw-_wBf}cK7RH`RBg>^jY;&7aMhk zbm$m8v=;75BMkwW%)|a|U9xR9(ibp7_Ko+yJzxLx&p-eCzbXv!fBJvZ2746oT4mPZ zWnjN1#lR@>z}Q?oCK;rIIEGBYz)ihIj2{q2&1Vu?9~q8d1WAfSEC6Jz_XzyyhWO6Y z$PW(z@B?uC1F%ss^(Lohs)lThA7N;~!nCBKqw+JW;vyqCLx4&6`e*0%1ukjK=eNI5 z(EB7)i>c-Hh4=e;p4Jr)nqXKv8@7do_4E7ZrQ7rM25!ZbZaLJmx@F$T zP%zf|1w615f7j2nngu-Y`ue&bEDS6#dRp2Iw{M$6lAmr3X#9gitQjb<`sZY11B>So z!cA*+J)=G})LC1zko=BCSFp4L6nJIZ7@M}k?^bJx*Xu3xvkji$rvQEEzVRSAXWnCH zn>x&%pEdHOfL6)-l}{R-J2Fsb-x!z1(QW>5d3RPrl z{*n886;koz2-@Y?f8R!govnK^l~z4N3a{YzlUM#)d@`&&#m6f$5ivr z!8NbAP7>=fZZE`vqmI}6llj%#5+`@^;26Cdc1(SzJB!CH%W=gQuBeZpN$(e0+N)hk z`U6xvG&?;bhtqYEtic)O7kuOuZa-@@YulH(FJx(qMQmXHem2b>j@pe=T|j({=trw6 z4Y6QW1{7{PWi3$`962_T>Dy;u)a$8bzTQ0FV#t zqnI-noR?+=X7cHdC^g+zmz+?cBt3UA-8ckX=TPI+#ux`_MXaW0l(Z%smx@Z;lsO}| zudb#I8@?q^)P{MtR%3EC*g`g-DnMw(5*jk&g!yw<7}=s#_q@sH&E%ybl)kwt0QUW= zq(i=ik?b1E*(`DeK)Ng^x*=4G1$&t@y!bZ# zAvm3aYwg;e)OHDQZAvtx4@CuGwq>)Aagc?2f`_fW(h9e|A^^TI&jc>5j*8|a9H_V; z>*Y8Yq8Awo1- zieSeg8=<#TwG@hD)i1#fP>)$oIj^JH`+1y;yrVQCYGbL4LmI^(E>|4Dr(#eo=@i+} zL`6`36UwKiEg+{ew~@qLQLqy(epr6AlPUnSR7rh(Npw@mX}M$QzrwNcv!3BX!yvhw zDx9bELK#ae@RjMv2}36fq6QONa;gJ}j5_<{zQGVu`OeF976fc)~fYt11c03MVU9|R_~?L zdoKy7V^)F8&xK9Vr9h!YpPP@~6xvAl9I@8NDB-HMUcy7BIIeq^81o}sPu!_ zdLV`v3|$H-#%qFy+M=v5p9WLr=yr>~sYaGCd8s`cg6{rYFN?)=BR(Xv5X{l1XuWeW zxS(5~7rF+iaYnFsj2`;@R9Rzsmqnwh_`w~?SkOiBP(-k(s$8A;uw>LzxTq-|mNZ*W zm_->)ez7cuc%USxJw9;*>n7J^=;jhG-q5Otdmes=SC#p&cwy?@WE*~zmGOf(M**T< zqHJ(v<2^wo(-|f$GGI=7T)@(fE>9nZpbZjqB0=4iW=0)`=f?NtdXS=V{V_-i^kum| zJst`=54t->v66!9F=Sky@&C|SPl)Tiw{Wl_AqJpk4zqo|$yD2;=hK%mr3Xeb#rr+d zKhxuyynuj2!oOaY{yB#aJF?+8j{ESHvCa+M)LD1qJ;lZfNCx=d+=$boJPz3$%5Hc{^SV*_&QDuU9Tut@H=OmA@c~+KO zweJhOgWpCM@4X+>U5L^Y17tA$!(NZp(V8bwGFXuj}c*9gUQY|G=m{f2-0C;Mo(# z{GwHQ*^U#tDAj!u=(@C;!2q;ls%%^Q;_*xt5L{^H;#}ih-{J_+`|(YEbc%M8fc#Pz z>G_B{O>OgT;qcS+1~z;BmVbRo?DgW@@_tP35d6TiRW~vkT=egp=HA};zVsK4_HwUr zZ+sfr)qS4p`z#;Lsk@Iu!iiUjrKp}~IA>2?+!U`HtN-{+%L{bCPMhltJk0OcFX#)fQL)x%hN_s&E(#y9Y&*T?;wIyx zqM|eOifmav`f@YZW_L>Ir}R&&%k)rdu!ZjC&ikILXYa;`8hN!;dsl-2$-d#RQ;IZ; zhNiAA>w3j_%07}!O?7Q;v`T8~e})4R&0d%5jgJki-Ix_o{Ga2G4T|krKGQjj_y%&7 zyic>HhAtq%Xg#MnZ9M;=OjWh0*R`I8C`Ch24Ac@v>o$yiVN-W!SP~&e5xTDjiY5it zcOC8E6oF=+@BQ4`Lql@s%`8QeowWC}$Gf}m^ub8cmxG<3LDCbcr6ZajeI2RZnX>Pi zf_{_bz`#K9b}uJ4H?maO93JnD!%5q#<1hOXHE6VDRx7b+@#d7RYce^+_A-IR;%1nH8~d>%OT)%iV-S+4R$BFK_iRY%@B*nMP80hlck53Q{ASu zI!tGxW`%I(`)&Ic^=NO)L{u)ZJ$6qTn*isPEXT^tUf3#6oG9ulXH><_6?|9E-2g&B zy}ua^=DYGWd$yC$d3m$lDvxb-W+muKcfF;(gOg6XN#Gg3I4P4xniUK$gienx_}Jf~ zr%Yw6D+9j3$n=J~HGv$JtHaC)=bIDfp7)xQw^{Y(JKHsop-hKI9B+eaj4)Ka*&xOP zj6kgY=qK+JrDok->|oGw^b-F_f|vN{(thF7x?pAB^kppjG-8<#oJ<2vcq@{t%>fiF zX9O%~ViD;eRub2AL@dM5+Ldm46YdIXaejMgC@}Cg>nLfrkvLREr0=2!5M~PMvg8Bh z+e6=V$n#hJhwBq*(DSeJuI0#&GqDkI30;jr`jDT^-)VlPV_*MkQsPge8jjUgm)D)| zx9{q1>qVtp)Qb1W%+{SxJ9L)93Nk54)AV!8L{p8|X>y2RD}x;^P3%z%;ppVz4&8@I$@n@ z3_WRpChNXtu3gn)*)^A(!mTFi>z&8?=5Zd%{RLK1foJj1w!oE?9LBb$n8w2)aiof1 z`0N7^>PSVuPQQ7zbTwlv5sd@`1&0VkYHVWTn-XUCbG?8TFv4#o*A1VYTf}D}i$iSX-xJ`6zqdmuN>vBhf97F%{K)1e8z7e5N0FCN4K1WTjwn!(sQol{8;nqclIA?>pm^4iHdv&9t5B0zdgBU%3KAq8 zk}z+BGrc*FaI1LDC>7FZTL_3Y7;r0M1WOt))vg4)**bUYfE2Ahv7cx;pk6?qMgVAbfd)F`Ct$x;gZOd;MvhkWZ} zVFaLw=osxdqEW7lEiwIqiCE)VIgm=$w`){&9u0ml-MwVLdQLacT3T9VkftpSS%$Wj zoi)EE3Dtdd>2@Sm%vFPYh4PQ~+0aR#jLCT;SZnG@ho&ykLFQ)3SqYyI$Dy~;)LoV8 z49c>Yn3%OhT~c!Pzmdu*OL`ad5N-nY(smXz(@-**!TLmPlz|as(m9y7Vdz;lGdUn5 zd^cWW4r<`AxW!S9$tpYLaU}+?jfwcM1katxN6RW>pRZ*`i-9ignvgtaWMP#Q+NtLW z)%5DMiKRni)y}%4Muy4-#G3}ox1?2W=hR_Wkk<{g%N+am0lkK|S)?W{>EEANCx&~Q zH;(i$4A0XTdE)xY86FL{I7-gybi?JQ^ui1k(2HZN2p0%>L*8SuA`mTDH(?1BOjbaS z-6+gkXlA{`u&CEq?BN-8_JGUuf`n}`S5X;2G1I5Pe-Gazi`&NchFK0?6toX5@4J)c zg>zS9NVDxc_YNERUkPqlB-UnLj6@7Q{M&jgg^X)HI))nU6 zsQztWmEt(>dv6fTI!aO|aH&<1dvZE!oE}du%WiH+LvZnlN6`p}@SdHfPYwP!Nx{9# zX*qP<sh6S_pYNn{S{`x5@`pfLm04q)EPkzq{Gk>R`#yJQ>WRL5{bFe1u&kRJ6 zyVSAs+~s;=^KgK#lBeyIn>ZZ+`keO_^NoG@B50NP~g zQ*^yj+<+0#2EGUKk*7kAzdL8BbO2yh@)SpBqZAV_iiiYGXSmd7i*OUdlE%|C=))lp zi3AnpXDzaQjw65M$5%@fKBS)%`WdIUeSLut;oJvyLV%h_hVjK>Ux);c!}4ZP%%ud{ z;j{F=*t@3~U4VaG(Cx2n+qP}nwr$(CZQHhcwQXy)?bY39&tx*$bAL{DCiy>iby;=w zzDd=ugyVlyU^|f>J0uzk#BXjBqv^fC3tFXBT-xZZ^bp}5!~=0GQR;I4T}n88{S%BB z9@jBa`}B*=W{Kyf?jB|%G@qUxIjrcH$el`bd znt@1LCdT5to+D|6u{q{J_NO@u@-C2F>`^jPU}j&vNE_AZ9V5Y3HHc~TD8Of0upBc2 zmyw5}{*lxg7jcT)FJy@{UBAer9!Q{S3(KBJcyAWdp0ecaUDzZUQrWkq-&i|vgRMj! zZ zoXw7k$h1j&bkUb74s%1((MkI^)GMkEg%*F%QZyMi!t>lBTAMYQ9!$(K0p5CN2{tP{ z^(o!eiS#=PW_~IcU4;UIFAsKnNXj)fm%zGnoFbedTtUJU+t1-1?(fDzn8v!83G|bG zg__Izk!m95cgcdXfCTK5lcSrflEtTzws7m4-Z*9kM=kIhZBGC9B+Gu1r$#H8Jw$E0 z^7r>&q5$G)waCDgdqCBD$oBKVcga?D+w0=q+}_+Pefp;GX-Qol-4Bkk9e$AGjSDhtsCho6-Z$f@Q5Zm?K0&Nw~7KeY$^BdcK!25aruz>Mq*UQ(9 z-e-z+ibADI&US%sbKBEmoDRY7;n~{W>(>=W2mc0L{Fb$|%lVl*rkmaBc=>GJ8~@H& z*h_(7fr!mUYxl#?%`CkC_)O{#>YPC66GX0#mKApm9$l21nU!Fo(33OpT_X;^Jrl~<5fuy&4E+&YsnU3JoxhcaG9H9N zH0rvpugbk{LBoDb3yk7w<{ zjj?~bftnhV7lXmzzIB74@A;9&t`A!+U-7-;0wdu4llEF%ceIfm22;rGajT1C&a0=( z>v0R`cnY3Ft83Y@FQxWcli>eL&t10y$5Vp8xx6M{1Bi%-AbACYuj5kX<>ut9oOTQd z2+$1QwSSYrmaojv@AdsoXY&b2;~MRBck%G>a8LkStJU4#{3zbWOZIX$`&z^6Tpt=T z;gLx;;^Wlz6HqORa*1G>l{bj4e5579u;=Av}gy^psej~!Vy@}dhzI@u< z9awNwuB)xpop*OX2nrk7?s$E*X0Ef{AGQ4KbcpDABiP2m-K$4S8Y~OZb*O5%#efeu zM$A|8h)9d=);s^O>rL|D@VM13vA@3drCz34rO{Z5yUD`~3IP44Gp@QdBn`V;)r&2= z`fgw4I}xWk1*0z~C#ksALJ?!G;7r^;`Th~%iGbe|>hN+7=H((fM2uqv!N{A37TDgd zn(0`+xw$d4Pr)M`6*GO(Qv*x91MWiDEv*SweEc51rN3_v_#K22F3`Sod3>GoQ*K*{ zV|Z0P^mRZ?p>E3JT-FDkP$^R;3zpHSKCmul#@J!64b*F!UM2^*mbHUWpd+4oEx|gm z-`7$Rs;?PI0+1-datsX8s=Seg$LZXQVkrL->OTtgc9sUh<)AVN`4cJS6XaY^U1I`m z(gi1linVgZBvb>~&$*G|2sXiA@s`y7>x{07GL|pRUqyE)R{r+BeVoWZ_s$&J^M`LM zhNpsd=uzQ{6^tois`r&dAlPDmVEkq)BBc7Ef9v{0Tfi&d?Be7_z}Vk;y)Ee3IDSX= zM0MMs+^z8Ga3vms>KGMdKi>oAA9~2>_0uE#bt8ATrFFih(VsfX8ag7)m!&#~j29Mo zPwLx$SSA!Z&wu_}z^Cv)%N!a?x!w%b*?-lYknBIT+6Pj7AUX&TwArd3uuMvaY!qF_32)0WV72J znws7!zl`h)Jm#jBFByy^U7w!Tz6!^0s$kujjwEg)#BQPx$>OVzYdStWC9N7(X~TON z=AtASS7${$xMROEMX9z0M~<}i-RYN4m*eBMj#H863d>uPpPA3O&qmT~SieEMIKb)7 zAEHOCfeY7PH8pOWrvSAj|I1(1F7p@O5VQq$#hqMvgCLxfb0DI?O!jJ>y(M+ za;V41T+7Bb35vTcB79Wlm5^VsNzLAvBW3Nry5M$vG|s6f+T?F!Y1hI8~XD9}SAmTLd3K zya+A|Vj+ZOW zG0k5*Z-=~H&DoyGGCUavP}-MboxY6*5a3U3ER)?p9F zW9FZ2n1mrGd1D3m(}DF-xSDy!M0RCBQq?(}q$Vw~qCVY~G%fpR}3g(mA)8r~lYd%^)tm^r4w*+p83I*^sIzahtl_Qp+JIV?dj_I4?6+uss#I~9kXX8K6 z4g!rqCAWYrWpIdD+PRT}qkQ(($MhE1h~$>}T^YArkCy$^`tT;otj8r94q#`qkDV!@ zMCrByhtCL6<-7V0omJf%Q~o8lXW(KA@zKjZCmHbx6*fy&1CWMgXaDLKgXxQ)6%qkv ziu8>=zZV{M7(cUo><%xS{$5SC<0pgljo;x+!M?SDK{lr?zcwJ`sQrDNfU5Sk(#wM@ zGdBI7KG^8I7S@%<5dQE4@r_o~*KpqC!m7&=;tnD`w!D2ZLi zG)@hykgdBz3<0ikjqtD8D6pN-0x_c*`hr$sz07d8Fj`ylk3T$|rO90-FOJIygm)Js zCmaV&lIoBi{gVcbjTv2f6-asWCOq&8-{ZxJJB6Qe?v`Kjs$X$%E^6&q8^kPcq& zcvdW-+k1B@o;9;X;ra$JG(T~Gz;o_AH%t-bOKxtQN6#?2`BE0<0QH5eK^|*B?>-eH zjmUnX>aIA!+9 z(uhJa^xT6JPT$;W*|UYz(^NoeMrmKIi+?756;iW>8{dqjS01knOftHdK)Lf~)X1lU zD4cz%Eg~}-%WQwR>iVf=TeaU^rOabq=9+))TmD+U+Ah z@rCf(jbkOX=n|8qJPVYOhMxyD+UEjiV#Ahut;DxPUYWb^F$M2?n=t2iX2Lh!9&>d> zPxd)bt%mxD_0#eGxu#+S7E7MQP9rNUzf}eEU7G???|Xbj0I$NEUR}P4H$p}@d;fL{ zlA6pG02TLXd(05jh*-p^p%Z~Y$Mq-~2?02?cpi0*)FQH?tV{M(?Nv@n)OM6%Qo88NM`24O~ zS+-vt0#fFH0?{8rr|zj3G87xE)-&5|->3PYxBBQ=;gS#2{@{L|&?)m+6MC4oV2`+awHwXO|eufO~A(EO8A zVYSmnLx;$ z*Smhm9c;fqo8NC}!@SWuo$pAn2HN{KN5hqU(*JZb`;Y(lKd<5c)BklQ(DG}D#FUW7 zXr$ATrjgCq64v6j2k%9kX(QSsrCRj{1$XU`h>(}^G>7tyT}^Fr!-V?DOEXzJ>K z+}4eOzk!ez2oSI8b$q<_pSnv;*z~}_jTcU4xGc=)zWZI~W^{cNtAx@9n%o0!;?=tZ zc6xh^KJ`&moy_dMQ}*qDoL};lqq=>&)NAM%7;yR^2WT=d8atYMcQkcJAzU-kHPqG9 zap3-Pe0BGwOPj|)f_I+#(SRLuw=#7XdGCv4X#)3X>M!`{2o`v zE7z{3TZyw@iLDXC45H4KFFxSpf8JC@Ub73(NeBM!wtE!ei zFXM`ebJxM%=J{fnEoEYHB0aL<{qI_r>?VubMbnlwr{6jQ=Q+2No3nLnvf1|R}f3CM%R#EEy5CZGsf1& zBYJ~E4gTvM0s6~W>alHiIS$jV-E8P_tkdff$7i3bih#;2nZMK9fWQ4(_hk)m;+>+m z=fguD(}IL{yhtoas@UIbn!naj$al8EzV;v!wY}ON;;rh(7rnIXLLfj*dpaHgBoqjP zIh~(<+g%-^8ru0~i|>3d%@s%_c#NH|wW|sEu8c?#Cu(CxAt$O_I)?gf?=d(XKh(QC z?yW1N#exXN6zRmCqaN7l9OOSaTt$uEQoYFb{yx$;u{!_P(yf6EhHE1B_I^~nV=Sz0 z_psegz?b`E3jv>Iy`O{dw!~p`4Xm_kYAAM2#c_rBBTZ!K3#0S$;mY}?k%VlVher%+ z!lVNAlN#wL8mXABiV{UGaLLjY{fuycfWP_5r($?*u3vU7XB+fxou7++DxRv$6hzy) zd79xT-D`Xm*fNdT>k2($U#e6Cf=gnfR0A4JZG+5iyK4~!?`jM&jV7G0Eum0d;$`ZsFk@$4e zu_4Lr?TT@qaY{_%B({jNe}&v;snDkvWG_$>~5wYQ1)6IQeQYQ$1tSZ z%Z+)smg#L7t$=znc(PI=ktpzqM7!O*nq3{@xys#Y*=EP$$OuF)b9QwMmGb`kJrB#6 z{e^<-TjUsbvT_i&8aHdO|K;iCGW%RJ4^#bnnb$+GyBBEENR66Ix~QF#Masry4M*x{ zzDTnd69IkE9C`yNgrIV8VqdaRmtq7 z*xs^KN|u;vsO>GzIC;q738!*GeFh?raK<=vKrE_>JiJavshby?D^Oir9Gqng~ zfglRw4|)?4Jmx`!5Mw}>A7@_L11sh=Wi0n0FJHhV3Dwdbvk*%T6fpTPiFYokr7Fb8 z?@l6=)~u5oL*Y2m%S7M;F8H<#MCiL1qn+R-gb^;p3R!o?c&OQM1*#%cLCY>y*;0rm z5u#|{!amRH0C8cBrE<+(U)SbxSA1h%VB8qfg4V4-5+G#AP*Ey9$Rh|=A<2{1Wz%TR zy5xi)tN@wfq%H6uz8M6cd(3wmPEB!=O{P4cA*`h+uy2Ghl3$9}n`If>Q(l6UF?{q7 zpIMG&H{KQD!Aq>z6vrnt&d!Is=Hx*W;Nze4G9U+}6oUjapA=#alg51nVG2&=1nH*d zy=?`q2x>7}BbE8d775UN znJ&wSZ6g?}8|H8%kd04S`j5RMwVC1f@Yyww+t8p@pn_vdV-jCSt~LwT__lwDbF&bWZx z2pC5z9F?WsTjUKEDNyijSfIl8rl*usW{#1QtLv?{cVz}49<7+}ed<=|HTlPxu9|whoR9GaY&=u3vC)WzuR4E1Lo`j6l2lbL!GN@%G=y~^4X=Z2J1Sw;Q4x4w z%Z(uDT9MannesP;{it@}ouqd-H8UY3W6Z3R+EeBLIeH85K)fi@F+{}=a4pGb+ea+x zeLf~oSr_fRYdo4HT|8D+<%GN^TJq7l0b&w92$kQnZ%iL3tz9pg~3JIRG(3x)r9$oxPAs&JtBJgvEeZ<4{sk zgOlbkhTul%Jj4kqP1f;ig6Sa%Xr)5W5%4$lq8|;B1b~Nn{tkgAN@b9Xn{9&meftVV zO|S>VN}%EuJs7!g8({~SRlbZ1R|r|)g7F>-`|9LKxpK%~CM%nTnSb9Si?#Wn99M86P-?1;O5Wj z{*%8PUjf{mlO0_#8Oq8mu+`UbWYfa~IX4vuMiPv*suvp8PSgX1lfqV+XVpTY`$<>FQt8tvmLw%mWt`HH#2a0|^HeSHzMD zdx1BwL54DvWNTCz6Q?ku-E?8-D%g}kvdh^sCQ_yUXWTYBxYs|$SdI+0+G&$nwG72o z^bl$VJyOK~3bTI>4Rmk8$<>kK%br!dnS2M~k8k8XbnL2>tMxS`Si$WUF^nogv0mcz zjpHz?v9xpF>Q5f7ChLb{?h@#RYM4!o55QZ=xr)jmAR3rWO(DP6|Bv!EL&F-x-}}6_ zLRhRehqX%TkX=W|qiSw%Sn{3prs8T9JVLOekF-C4xzF3!-ae zd*Mkk_i~26U7noTGtq~%Siy?|t9(xw?74LxT$&0o^o=@6BTB;)*Yj?F_OscA4sJq&~e_tW` zQ$7()m688b&i~^-{&y()Z}b0l6?7-i3Jz~?!@|rmz>)hg*2v@a0AuW&?#CNya4=s+ zG|Iaf{Ags9V&zR}maFPkXfF&GE(M+)st@@1{{S1wzrZBFz;zVoCjEDMvb&N>Tg0z> zJmEg6x+1pI!j4G=$R(M5H6yA1v=jt*Z|DDUsa?``(+Q4t@8(?niJ77N5ZSX$Zb?j_I z=HuXC>$Y!p`?j~hZpI;6w|4Q{t2o}NU45uGM~l{tR9of84jAx%nj%tAk8oB|DJZPf ztH_GZc3;x6pX}vZAc?#A{GzBm0v>N*FjtY(A<4~vhxl{WY<F81wJSK0m zkHCHSSZ@pb5$s)huapw<`)-ftcMNhv-#Q*~!S0iBe(0{$dxijbnec8f&?cyk5I=S+#1^b7jTZc`Pe;`s9)>t_sA?kgX5Wk6Hf&}ZL^1`uX4E;x7% zspZ}-@OgNBjRyxq5r+9=o+u(OQTg#ms{fhRJ?nn%wp~39o0GvbL!Lnx`7(&`%Y_Z` zdX?MFl8PRogu|qqCH@q!&_AGlO%E7O7remAjNMs*LjYrczQV-kdS<6=NhO znv)^(HYQc1+F~b-1x;!R!vRQWp3NPQ$GxDH02Y848N8QrQ=l%xP1#hdg+V%l0@DQ3 zv0fqmqJVP3D%CyeLeD+9i8_g?TZKDH`Ic%JwI?a=&IQ0PyjcnTwYm2aAO(nF5aTC$ z2y#jR;iq}ZV#Zd@B9>^isf(l{<(SSi14X;za7wQfub>YRW>*$SicTW{8H$fpqtZJm zr{^tSU=uND0f66IHUA=M3hQXW;+;j-{Q=g^M{)#Fjr;0DQc!!d!~`S~)q!png1JHn zF@>$6Em;DsnAtkTTN%!XLT_C4s#_3+1q%Jjd$PfHQY{r!BA9|PN)#>s&i>UtkaPx?IL1B<4JEIwL#A(mG@Uyk73T_D zS!T>|S;%PO1n{9EVQp1`UKY!%5*b67K;C3C7hZKAdYdw`vf;8)_T~b&jPe~Q&!AtM z#q(8Sk?DfLu-+kRDhG*|p=+WKV8l2Ymnnh}Dh8(U=Y$yKQ=+tR!W$W?vc&y4{Y+e8 zV#yZz2+9T>OLxSa5|(>JyTr}_4R>A55mOi5UH4_RWaI?1#;3ZnmUCoXY{WVhdrjATz?{3#OZW~pjH^dl zb-dub1_gg&vua$Qu`~$JhRBn)e4}(}H~A&p*07A5*0on>-ZmjJpNx#8EWpVBR~B0e zTjRHp1AkSmx*Yx&^04t)a`YYM+j0;^y}rF(osSJsm(?Dez@$E@oAx5Ja3-k|KLMzT zMy71SQMQb+bTK;<{#{#mku<$3(O?1z#E_GOAaw@tCWi8D~S#9&F5R4g35sEi{mOXh+Kau(6mwPL-L8ko2yJ%W|#uayfiU-f7+~Y?ASXaG^01 z+bS`!GER4+>biZf&mLSso^G6!LyG4INA zUv<_}IqYOJTdA-dQ|hoq$m8!~CSRu*ps&#ay-98l18>*|fmCF=%7I^&kqX;uHQ#BM zAXF3NF#lMMuus?#H^3WQ(O|QZ-@+y5a`d6AvUzt`x|i2qsSwh&?Apw7LQ_$~;DQ!W zm8v9FT#_Y{1kB;}UHd|>F&8$N7QRk;ud6J{2h7&DX5*IaR4-g?tXCv5my~o-|M82u zh^eVO%7mdKtXUYYNR&re=Z!b-&GKAH-LcYDuu#s{m`3`R4r#PL1&b0N)Z0|yRu$o+ zbMJHCDFWHc><}`#VI>J#&REMF$Tg#qTRCuqDE+jy zPTETkn4M#2uiAL8+V@gp(IyZN_9Kcy#2Q}zJJD7!s; zbu%vK19s!|ox*VPjl5`~0^RgAN60&yjjMl0Bd6WrHULd80E5+Nh=nT|bu83;j6!dG z;%2Pr+%c@-D%0*98NC=71@qYAHtZAK)+ZPzexhkgM}zkK7|#c-Xia1y{zH2nqHcu; z_)Nr)h*Wg)S(TxAYc#XZnWIS%h7be&@RxMRYIaj7)<|qtVO!oj)|IW$GsbDDY^Wq> zAH?%z_F}7664?^VQcN5U#ybs&!Z0n}s52=4(DuS)M6YM{J=`<%Y%!|kUk3=XnKhw{ z_H^U`wxP;-trS%U`AOJpO^`X1V6p^GY$Mtgg!AXxKT}d$_N6Qj{Y-T4@)xc3tW7#>rGjWn6o$9(EFJ!1BwY6WTHl5#if?_>;=1i~91ag|C@-ye zKS1%H#bj%VU@nR}>j7O(p1vxz)z(4Wn8EvN%k>FAx^m9<2rRl0iqPBqZ!j7Y&3(gp zPlA6>OTsT~)sHp$D;P|JUB(%kcbZ zZSNK1>*9)t>Cw=`VM1Z||C;;<=qcdanUFi+f#mMfiNq9IoX%q~xH%-cSBPex#`vF3 z&j0Zr|M4IH|3--L|Mq_!9S7BQw7rS*nb`AzZEClyp|#lqG&?PQM6jfv+t{$Z4PO*yZLq<7%hQG&pGz|pSTZidTvsb4iQ8?(jS zb=&KfO~ajzjluQF_({3D)7RN++KOqwzxzu!o=3kCR-f$*fsdOw1A9FdawZIR4vw$B zCmI@>-L{vu+vZtzpPKXef(|PWFR!+BfRTrr+iE$^`Fz7xZO7V;I|sWr4$k+g{rcKk zH%^~^!~UJHKu*1#@4{E%z~*kR($#jJA;02XIFne{N=qFifMbheM=jE z{P$3|oDaL6fzI8FVWS&1a_S*Zq|d*djg3Ys$WK4T%ft1bvoQXDpu76}$wx_fHrVAGy6T69xkH@F5JQsqP zv(xzrLnjCWh_Akx9DqqrPtW}OH#{qX>B&Th#Vch$uisCufvM^HkFFi>_TA})3)Xp9 z9vpwJ2!e;$!_OQ_c3Vmj2G5bw#C3N^M32I&biNeqPGL`vwT;F3B1>B}C|`2M#L9L6 zzi%@}kMm9>n%!T{i1@6E>yd9fHV#AndS{pW zVU+lP4^GrR2pb7rEcOu5 zJ0>r2U24&LwOme65bpR4?jsI2C?vNz?_Z+gA|8H|)VCj5sZtz(P`{uLaQu#8QJ5#I zHQnkFpnqGt;Tpzl-Z@=wWA>MOQ_B@ToFeY2LFNK9&pl6u1fR1(eewq;s!-;$ZA#}W zuXb7G^yIYL7Z*;6io%Y6>}5CjEJKB1iwEvmYtJ{hn9dd#Hy%#}0qT7n)J z5acomfPMItjy$}(?LMEqjscD-&LP*Qh7we$&*pCcWR9iYXPjq;rn@YN#)D)IV18KP z5&mkKwueLU?e^|-VRv`4DB3;MZ#GHdU)f1*lH^=gxQjz%${dB;jn;Lxs>186*j(4E zBco&e?mnJJQcnwud2UWXj|Ho%l?}PU-U$$huc198Z4JjtAPe!mc#=t%%|szcC{#C%5UL)RI+coS!*rUWEtFQYm1pVY$G1vCWP( znLNy{NFh`uiZ2~L& z$6A8P`C!pf3;f^Y4agW<%sa@dEj2ACSPEq$MQ}19Ey-kx;4#}c9%3DUB)1&N|A>>w zu{>OCW15L55PPyK5wU2A8O1sr5Q@0rwHm~fgv896jnP0DZXs=l$pa#2Bswz4MW(WV zlW2`{%F>|uR@md^Jt+JVm3$V=hk_I;!H_ID)z84~Kvrf1#(;ZDM=VGCjDjz6M91io zI2=Yzq@MY0m9HXALWQVoOz4X)=0#fwfeH@Gf*BGDN?%5{6Yxj)UaS%g63HMP#2-!p z1`bmS>DxPv&7Fx@P>zk*KX$n@4%wbs45(LylXk8jt|dU=`57;2J5^zu8|Muz{Cf#f zAzf04Y(41EJVCUkdQE1~IvsX7ylQAtby7s{`4Fv)&K#0AUUf3@&>Fm-5W+CWsxUr9oTyjUYNPl- zje-{1I@W}acixnmO-r$+R7(1CCM@v=VZIo=T0hVOPk++#HoBY-CQMq2G-vs%#xHSP0xhsMsye26Y$QwnLb-|e%o68HR~OK5u?jf>)wTx8 z&fr$|d7iL8wQ)%+dAwWXH4*F{>YW?2hRzjn1s;kEkh@sDXYQ-n?4bRsOEemd55WR1 zjTJjzo#mUOHl_7vH%3(LI4o}1t~>b#jS`GpoM8s2NURU}+SG=nU~ORY2?tWl6v(HF z89oGzAstncBmGYQr)VV^3KOtMA0e9<@dlSSmQtbxgE9*o34Fy~21HRh6??v1$7oaEYPkgn<(W_u3ctBsaZN=&@SWOn*>lo{GgBbGGV zmK|DQF}aV_Terz`8;-(F!7F;^le(P{TW`L2*{)ccB8`3Zv1XGRUKK$M&j&%{_G3hZ*!Y)j$CI?0&%K6$x~7Njoq!)MtHWc-xY)T zXIUC>-VA5!sLm?O%MV^f=iXsD9It+a4(1~{mME$qZq0l6$9_09@$W^}6Ag-5Dg8)O zPdiLG%h~djCtocPR$eUnY~LmB_^c&*mgF3SG@K<-7HtLM+f3%;VL@p86YzmNBC@C| zYpU1=2*&2E%)pbP*Yay%kSDaE8cd=}D?h|{oE@DLv9jRQ#`dG6U^q1{m;-xqWjC`T zNj%)?q{m^$PS+W)Fz((f!_q@T{)Rjes$uaALKw16ECK42J5@uw)WJ2hRwIS4ytUxz z4-i$%YSuR8e}?VV64twtyk!RQ&mCo1BGQ954i9K?R42i7B{L=5d_ z0St>ud@C-QMEzJ5xdOC{Qy_eai9&7L0#dwN*V?nvdbG904D(d74w1u}j?Fdj`=R`0IW7D;l88TdZax z2VY*^sInwFap5;~f#=T{rZH7$Cl~cSd%0Z(GO=5r4$gT2m!?fI;)4lfy$~>+(WL?b zi3x zJn)9#vT7my;WiY83R9@ghjlZAW9xSJF+r8%L7^x@=GIw>2+yC@Na|vU#x^yYNi7dC z36i7Pq3OiBR*A{tL6LeXsvhd3Rpd?B=17`pEjz=BzZ~+*&F;;EV2Vc@01!$HkV^3f z^EN~@aTNsNTF2ypFWA%Y`a=~qA`(Cj2TC;5T)2CO$US%IOWdRIk&Hx(3Oq#N4e%7f zsFCWbaUJHek^>E#e;j&Qv7H(bu)&2X*3adG8v^>SD%f@$r5M`^Em!u!mQqkG61Q|y z9?h}j0K*1Cm*%xi%?^1v{`2?aJ?U&vqxD9|2lsNvAjaU2oxKxbej1uUcMX{$H!MSF zcXbe8Mr?>pfw%e&LNYOz!~4M@Pje?Jj`x5Ic?VSlE9IMqL|9`!%UDe8wo#|bv}(uF49S!w6$S8*x}QOREAn$$i7oDFrjs-}>4c~EA{yd`uVIs5t*9eZXbphC`n)$ajwe(Y$X+LWGjr-5^>dyyrTk|8wSsA&G z{on7^V60xrmmw9{LekZRl z?(~lEskL@{TPfu4k=BP}nRiYLGjKRw49c*imn_pblexts$OWpxjbk|DL_uK$c0SUODpxx7&f$jeIUybP9 z$@{x=>@2*z=C&F3i_OetH}CFOU+QUQ9{KsGs+oR1Hsf*zyMUjMwbOb2UhkVXjsMz4 zK(CY8RmxRdUpdx*>&G8=$%}F;L1zMK zZ#9`0d8|Z4Dcv`PHmaZfVl3)rv}07>NTy736XNm*=>NI>Z@q|4w@|PY!T&OKM-M%) zjqn4EUMN6FBv82MPVXZS(X0jr8LV13XJ+AU;ohIMxk;8I%qr&B_!IFmA-(eRelS&z z|G|!8GN8Tx{@9^YW1|q3Xza#_xq}0%?q;`Opnv-Yc)Q)z(bK!R`g9Ixlr9DC6FfFt zxO>ycTmsnZUD1hn)P2%;+`W2#>my7oUC!xwg0JDjo9jn)dpkIu&pkdaEg`#tM|p#M zUio^tEi7A$B@A!>`2!@%ny&HrmZ5Iw=zIHiw_o9Y-LYig=NN#tk&&+cIkYpPX(66`)OysyIfF-CobhnW zIqhfdhLICmHzyq8FUtEp9QN8yZCVYQ=Xmh^;Qa&*nv*g$cn$!Y75z(o$)I;rVYI)Q zj_iZ%9ESI~@zLYe^By(4`6Z%L7c*Kr*g;39t(0M| zwEy3L2{u%_fbe2DNG3Iu*`ckoHHUovruMdaoFj%T%YTm#Df0w&!cY{=vKMcM^seL= z#Ve3IY7zmGt;@{wZh4rOf+@o7+uh^3dGY}Eyte~KwxW#VUG=6Bah1i2&hw3YV{%9${E)+HL9cuNNvB{PK=@2{x_Awq>c zBAs{s-2RnWu|u_heHI20yU_J653Q-gF?aOjwW8HBkufGowvjfVbTgl7*IVcLBzDgt z4zlZ(CqXhCd!SdYXj!?4v~zHMW~jtlG)237Q2k?=JVynRX6Q|i9}^zkIS7(;weeqB zNiby3&|e(2m19_FZVV{19o!`eEOtUL9TDQp9f--Ov;i6bujq)r3Tb@K-Wd>GV3CO} zF9L>CT97ztGYMySDRq#>3`|cEAf`zZc|g>cpAT9AF|8h486ZtgP(!FDm=O$uYZ;y@ zaDXcMQudEsnl$C1`W;T)~ z-?vL5LCGWp15gpMI1}*Kn@4*rM!#)^_objfGxDuJky%On zEm9g-lyf?eva;(GD6ypzmG~#@F=pZXH;ls@>S>Z&l3*n^YWmNI1(`! zN%>A;WIhE6X4VaBwch#ZLZBv4XyMo?W)5sdCJb63R-kbwcROSae3x*zTfR{rq6)7( zoieV|j2BW2-MlFZcl`BQJ^BYA5hu7d$#vdRYWOto5A*@?dq`rktvq-l%V_7G4m)!Y zDf*w$SpF;)QIprY)>vY8LT_qw_Hc1x$O15D;3_D;5fi1B2H_1^cb-rRy_V+}NGSWB z^wdL**sO(_ipiM+m$I=EDYfdXSV}ZVS$?aj5k+Hb7V$wr)~ne)CL0$ZdY{Hd)YuiO zsc^9p8fqA?g@n*5??lOm6l4LIh;E3XRY+;y7qBfcgVfU;P%hqs|8Aq@?fj)g< zuAZR{2}ZJa4PO;G!)$>tfF@~#PmfYDYfPovrgD+PyPYovN*a|5BO>!;5H+5upcGkfpfK$jONQXB( zc~Y4gwI>_F(>>2~lBXPV zPbmolSwNR7mc-UhOnw}EG>lOJJMGjeMK(p8d7I5A6pGWcU!?UVJ7DG*5ChPK|DE)m z7?TR&p1-dra0!4KMyXBQbkR)I8xqEW6|oi7tkzHPNDMXG9nCHZN=aTfY#VaRZ=%G{ zO%#X1E#*G>g({Vo3Z*dzqEuWV6`JMIVV97d5KB33kwZ`LGB=*wCQ4}f08z52&cPZ{ zhh8k@DiQ?eU94s8JUvONuOw+8h4CN!D3$M|Jg)AO*O`Vo2KXW?234NX>Z(3{2)B~E zD9_%vT4EtE!wuR{4{sJGElwx9m;Fs7r`SY{OA?Ofl-gU6!fOm~Jjd6KE!?pe-Khn6 z-ppjiqkvS~EAGJ6K`u}g4=;rrcha#O$BmvwljA8H#W;JJz`sLo1M8$pz}quXMWgu+ zde#?|NbkzcXNO5SLbNAIE^)skpS&{7X@>=xP|1aKPJsd`hk^}+bOKu!Rk)RoLOj|@ zv4{xNl^R1Kw7s1i1il{MN2ZW#{$K3f)3PY*+9m34+qP}nHb%E?+qP}nw$0IP+cs+c zb+XqL>{U@UpFGaYh>Y*xZK(#)&?bs$u!(tt>m6T9m4A#>L@YZD-RI&>-TktKBp<3RoFlG&*Tq*yvAbAo?<)t}vZL@`+}Kt(5bv@?z<9e@NNZcMnBQ^7)FM zW;Z;>2|cn(%l<0u-5jyn30@XR@FT|DptN)%MLmK-fU?K*v^tIOm&wk(Nu%t(NEwQ- zw<+Hm>Y?eVYdQJV5gSW0+V8J-9=^XC%Q>~_>rm&dP8t5Icyz?yE)DMJETTvF28Kd@hcxWM81_|ktS)EFzw9$bCBD>XPi2OJ`eh-t2KiQl2JN<7g!^Zy z0TQL}bwZxG-*+Z!r@P<`K2Xml{Sx%_BIq06zkd1a@wT6)*|zAYms~nB+%xIp&JE14 zw33O31!u>41Se=rTPQY8*NNN0Ltg^?W1v6n#)lKPEA02+gPN;i!%sucb$z;`mW{e?8mp-Fcm-7#Txl;o158nj^g4e}RBQlEBI8FW*09q< ze(^(ka*O`kLE&Hj`q%$;X8-g1e`W14)SHu?3~pwIOaqX__<8|}$RjChUIDm9;x7t7 zLyYm7Z26&r|%>^fdemQdQ^Y z=UQzWPHi$a8^dp$9^c<_vP`^-w(>i{x2|2h?7Khqo~Ev*o}Q+qyt^58ZX0??9 zyXQ1?&ZcI_s_)l2!oZmv{-M?-BeE(i=+zV_fM^|oukw3<*vIYIiEM88`ODtF957u zLCk#v-IMl>qNy4=i(Wh;uWhikL}>}mQaE#Md3SeOXR7_UySlpAY=PhlI79R3+WhsLt~g>A#-l7&gmWT1>REviQ5>&x1~iVs7&WmB;G8bI`$iBa_U+i<8#$ zPsQ|6%kHhlI$yE}oakbplEB}CkQY&~v271x`tj`#B5d%_$~eaO-fvfBR;*mj#oMdG z1d+IowbyrkW@nH;fFf=-;PE`)iElmkQjLW-Vg~D+w~#K#8=cC&-GiGHKJV3P=F3p{ z*hqHzOM<*P$E#rPkJKkUn>#d|c0!_gUjU>zKpmd*xSav?ENeqFUKqtA4GQ?c^v(*p6|(tqz#uBjjP4HRIx zeydem<{Y;?cfs@N>FP0>Jim&h@OQZVHr1`{h1Vnw%bZh0dQN|?)mm~~znq6so|`V> zEHcEuTnwuy>{elGUV8S#g4vsfcaIcf0x53893+vEfpYz2T0MIQZl+}xyhzF)uaI40 zIy~E|*vhU5BX5MtT-2WWpg_Xg)fS%sh_;qH9ge8Y!jjEg74<}71mNxbQY+}yjU)0$ zfdQcJcM3;STbLDe#`!P|Ll(6L|8{KuscIIgM-fh!xVOgSBPR2TE%2l7(;bjK+(6CA5-;7O8=XE)F< ztt_+-WR)4R0t?4j5s*4y-U~TbWy2;sFjK}zO=iPKMOZMhEe@|&q&Uom;gF#9BchLd z%I-);O?q+!Jb>T~NIEf4VJ9>Js#-KBMT+i#)DVIClaOjqD~YCw^?_@S00`E&4-pgz z)<>$1y+`D&(irLj3t5s)*pD;h$KcN>IRlY5CWpVa(%%6;4hw)w0L)YMW)E=$fThe) z6{JGCO^ihZ9|*vt;o$#le3Z}_Fc!dPUVBl^fXTuR~?5#_GgA^w0!&fhMla4WL{g z(sd&Ofmh6Ox>k$~yc8jqB(NzBa!@`NM~MX4ms)&Ia0eHz0?^o?49 z4+|kbCM;?h8c{QFCMc7E6g1AMoHAT@3L89W5W&wa++ngqdd-2lI=t-p`lno?AvD1! zcTz~TEL=#X;w7a7>{*GcW!h^{Sqf7${f|Su!yhAiVjS_Pit1rhQUqWBr#G3*2OI%h zfw@@6=}ya$1vN%^0b#L>gZ>1S#|Q!mos%-`5t`JH!U%!@B5+=2@$Nqa2BP0*DvZpr zOp*6aBi#lWlT=!QM2MgWRQ^?zguuo~3<6+d3F$z`tQ+8gNvvpsd#9TAGC6~1W@}l_ zN<&4`C@t1DFGN}|yHKQpp5|P<2<;X@=?SYUKBI3ehE`(yM1pU+caZ?Dy)Z28(~fs9 zhyK-7gUPDiH-+W0L`Aak@Topiw2df}L0{)3hOCogM#nV9x8k_N$n&JAsTdCV()nJ! z2m9Mk)Gp`0MXU` zXn%rxw$q50;|kqC9y-J%!i<3LEEH~v-QWJ00sTPX`h5mEU8$yl6T7#j3DvK{*{+)(Osf!GdKb!3%b%d+ri-N0tQZym z%Q#{>2(ynYEIx2!1O!8-6h|{8iWoWI4(;P^Pp42J>_R|an0OInHFZQeov?W~_7|b% zQF-30Ni4IQEM*Znlw%kg#tBTsYYkZwyXZzSkIKL|DNn)3Es+^7X-OzA6l1>>SjPGf zwd1U0+}*X%%akM@J5Z4eTRv_f>Gcf^B}0{jA4#2o?&wrUjt!JTrNDZ?G9I?= z^Y#%}%8n&EDzC#gXCyBvkhfhcgibF4a-vN0TXoT~tp`j>Vv(v2DM>Udgp*V)mNpiL zX(2t9q`3sEx<{2`&P$bmCMFWGWLGdnKJ+*Po2UL1jHrIclC86=HKr{BlKakJm#5O5 z-+`W>boeOR?jpfY;H3=yc1ECE)wZ6eUCWgP-f6!xS~y72eQR+=1gWxSeksuj(M9`M zUods$*)gHJ0O<= z-a^?IfZu~x$J<(_v>o5p=a}|swx0I{ujd0#DyuQDRbefkZ;8JJ2v-x}%p;0L*?6bj z%vGXUcW(5iM?eLgJSt8lawN+cHmOV0$C#&#yyvCd*>xx*MK%Hst#x-L2GX_|D<(R~ zc6E4YJxRg=LM-Ev=wJ5Vy8Mx`2i>3NA`VkVbHea~11_y#dK7F3ZisMG_Z6lNdrB3s zh@lO8(%kq2XH1C7B~~GgOH`EP3M-U^GD@;NR*#wix~fbQGBDDPA2x9n52n)1DsPlXGl1cK3Cw9 z*Th|q3BKPaC@})ZXTo|C;yFT%wH(njp&!v!eJ@uim2XXg5V$?=znDgf;CK+xg~%$` zg9(H9V490cp;NOJwPiV=((lca>PmzzdOHbU%~c}GqdaEElh~y|L7@O#9BS=(^QHqeaa2G81H%yuD>IN!&6Ik6_+%w?H zDT{Y2ZR`#jOq1GZSaWnpHRUedZ5)pF5_plsqTaW#=%QM0EA=fWT#pyYIrHb#qk2Qf zmq}Or{e9>3BQQ{j@eMiuNxd<9J@@+*S5-CnxO`rIUQS`%B1J~s)z;Pfp=V%*;;y~C zsw!3Ce40pQ;iGNVGdn+q$DRyH_I z`*D)m-vz7Q`8}M(`uVP5bcnr*M)nMFoUMBwfGmiPds7QLi$%cI?DVE5CnqN6d1ht?*1N~;b_XtYd=Jk55?ib2 zx~9hEtQU63w$3iPwXN+QSB&-j!`#XX#I781SEd(q+}t?QZPk?|CoI z%^^|B$3ktXDJktFka6nb{O>CL3=p5>Vr1j%;t_9;pAp*q%U7~qUeDgAI*Z!| zweGJva~>qow3M@|zcjOaygu(#%Dkc-9%_z`ql@Zn`#BsknVpumtMDA*T{^!P9~T!dh*Z3~@;`2MTwbb;XLFlq zo7{+eQ$XH7ps19AQ~52!YnKIz{QRCT-6}o{e%l~?Cw@V&IUx=OYd757;Nkqf-xjxr zco$XVp_adnhs5)EIQkjrBZ0cpGgxy>H2Ul|Fh1@$3YP56ZMnJ&0K5H#N|#C`(yh&F zgThxJrZZte(Dv7zT{Osw%(*A!0gUDiO_4UWC>jEZ*K30_F`4u=vPy4(Vh9$Qr8iI{ zt?JUo(M^_c z1!W+0*Yf%y|DY)v;=)xjuS8oXa|C$ni}wgQQRSrRl(o%Q+KznY!-k#}yn@phVAk8t zDCA4iiNFIZALzM8#Q$YhUh6@W;8+$G2(O2Wgb5Gh0FhvQ0s&;MVRjt|ZqX-jPRA!T zCTQ@{krn|Ikx}Xc5R0lEVc?*_Lr!T>R=Q9QUSo1vt1o8E5fZA4A1WOTM)Kdcf`hzSDFP51MC2r6Sy$$Qk|p%@Nl4Vx zj?0$0IEq-~fkq3Jq)UY!zkvo>up&vL z{F~vg{n!L0PYa!;6&z4E-95#)AjguK$NlC#-?M~goCXFmL<5A<)3_&2cPV)-Or$a& zt)Tlxr%Guw5(GuF2nt5)H<>sMQcH%JrI2=n?m9`zlo3x;h1)N^#>yK`a)Nw%s;{S) zy-1T*YfHmjhP*4KmdPa~Jw@@cebk;fO`cH!B$cKt*Nz{ImJ)^)xf}dMZ@;!B%tyUS zE}V=to=BfGfg-9~mKptg@ewB!EcJb?^aKsyk-0FMRY8QeGu= zW(Ep6t@7s-$?PICOsViO`c*E60U>y~5r!gPC#21iE}vBdwT5MtI9CYM2)*c%2Wo?f zGRvp;AkorEM{LrZuqiu{U}YtAyZ#+!xEb8-xqBIlJ%nRU0qSrx0=4;`Ifp?*ok#S~ zD-hBEM85sX0S*{pkUwygnO9Nb+{DreKK~*%e&SPPHk? zZB^-ZsRfLhESs8ZF6o8i{8#d*Rm3kYpoRbd-r;b1a!~yNKiKGA_v9jU)b1?nJ68*g<9+3nn?ssX)5|bWf2GO90To@)QxdA(( z`K8Lcvxu>91N?!=jKfB)Ml6Ql<#qGEj?JRdJ!Z@tgpVcwMVX_QCvma7nHM2*+(fwm zop|#+NQ%_S_*fB(k;O_PqXrortQ4cN*pmJnDY{;*&AYo8I;yeb*HYBE`=woJeEbT(!fC+ zz+f!$-6nn|>=|7t`FLr5XA}7#o6K_x|DJfrDcP+=?})5_qLW_v?XZ?=%4Xf_rp%N-;?aRam21rFhl7kbi! z*RL3WTvN~XHtDKRoC6Qc;hHq16b6e>A@5NFB49;vxc7jj=FJlLvW2pJcXI5Y=*3$3 z+Ad==sfsCCy17R|f)?s%duRRaW^BYftLH7#7lnvRo(sUKFwJuWBBtW?c{c;Deozs_ zqXsz<=aUQSwyjzPZ@Es-*pT7UnS311(H6qj`qR+Xjobu;7Qp!`$4jGO)H&Un?8EYc z2(_HX%$IqCxZ108AJLMebJ&dhPZ~2$TB{Rzal~Dn`9Su(y%fphKQK=5-6bYd{S9Z~ zI1plVa|g`cX}tx^Tryo?l!kqz?>OQye=L1wdQp+K7n{EJ)6IutE722UNTYxQK+c-e zk3J!?856aQF;yi$66lLakQuQ&Tmbt{vLnFHZ{n~Apc)itFHEeXiOZ`{aS7X=U!)Y*f?}U^s9TOh6fN!&CMxCy;dP z98nm*0dimu3+SKvP2@tEFMj)0-+{SQvwj%YzA?9~+Wv`_Wtx_b-;YDzL*G5XGQ~p2 zZm#fddce$ns>mm;nsRjEJc>TuK9sUm&I5jr^^QFKZD?aa_1&G5L}~~ivF_P=!G~ps zJc=7%m_O|KA48f}gS)$uiFqF<_&h)GA8qA#bF44;->$a+zc8yP9h9M^DOscQGRN(R zuyxm4M=x9{Lpw+G@4=ZpeXk?vU7vY=UuXBXcsF=AKArdWuT4P*Ceki9xBOesMKvXw zYtDYZN#Nk_5+CS(o_I?^+v3~?%`Ga>dc14jPy2Xyi9fKirql=j?OFd{|N7Uz{!`Zf zm;W>WcmJP%7iSZ97s=~Lo5aNBnZZOOjZ^~#1(-EPs!4FM%uQkyzQ9_rutWn$5@cdO zLt<7eS17yQP|~cS;h8P2Gps()2QbnTFpkT`a-7GN5)Y;rQG6G#D(m+0v#QH03~TjL zJ=ONs*WpQy#E9R;);62)ucXRzTb7pIkL_twjF*%}%fh*{8XC8il@%^BeQmX~np!GX zPK&MCgh*6ghPlba@RqKwE(>I9YFgJe9edX{t9fdgnz}lA*Sxr!1>}`Fx6b^NXHUxw zQ!{s!PW-E9n*zW!-T2C?SDWqjMUBy>NYy2;QeB;(mxsrCvghSI9ev%aOn0wX>~! zDaL@v6xl_8JelrI|5=rNiwJtYjEc$kOP<}qQ}RcZhq4Ws)b;P%)-=YV8gI$c4!olS zE*+d@-P=K;5Oaq+GHcy5qcwY2vZsY9taC|;OJtuM^^f<%5#$y}hQ-bGzJP|s{81LX zezwJx<11pivNR41miz?z?{~Uqh7@aq-R9(bilgZgTa-?-Zvwkrh1t~-@afJFKC>?G zSHU>;1^40V%?A~TV@w(wlt-NR<&V#);@;NH%?)w8 zRp9M!?fhx9H0Ibabo}^h6#7?=OXYY^f70jcFI{eSNPm>HZh9m}JNtZ@%EAeMl(*Cf ziT-PUOkW?rl6eDuzZagV$z(;L82>NDn}+$wOizzE-y=Tk%dp$$N9`K`ud^HfnhUT` zoBERXRp@I?+8@CO7c?oG$~f_FoP=O^JRV&;op7+19p`^~>`Jm&kWmve0RPfrSS`saw> zk19sKl3aZU-bw$mo9t=7 zqjRVaMp!VZ4Y9Mgy4h}j8XB1`CNHx`Q2BYE-ki3z-Jd0sNXm*QWGsO3jTK;KFpZ~# zp2TBe2jM$mPFuEMWsM|YI+An=^gar z7LB)_If*diM(=o2J?QS+M6>!%P)NGmziSWv^;3!nDT=b2eR8;zpuIV@RO*^+pT z*!Hmw8;#xS;T3MFk}+>6qeUj zcvhmQsJ%@XG|Ujv(2fyZCzcBD_PXOnILb3ux zF&285WaeG4QD_5VX>r9~%usOls%oUsQRPP?>yf-bx+IWYs(X{a&NiJ53SBi+O%ogI z33kaM!6cCwmU1{F=B4{NkpoXe}WGvV`I-iI9QipG< zAW8(|QhoQGGLTyaYgbLAA)_)00Ym+;Li%UPEar965pB0BClp-;wRGk4;yr7DEz+ly zboQtSbq)#h%~6Gsev~Hq)Vvt;4Kv)R?Ijxcu}0 zVb>3bcbm3EnX$^jRe-h%XdW`}_JX$d)V@mY`~Kj^dId2EfeFF$?`!)ta(7VHNfgt; z;g5us_rC1sY50%JIlsR2QnW7JRc>b zjzBM67_(_;3>rPkcbuc6c)C)_)!6{U95$1}tTv4-C2Aps%qh<=STxtLTU`Dov`O%! zfv||S#WZBiMY5a{dX}3Egn-{BMA@A(QyEkO`PY* zK<5laFMzaG%R8~_sBl&ul4puKRY}fWCiVr?-_*q8b__1HQ4FyM6a5qizBba~y0z*@ z4QMq-6+6tnN?*$hheQAXHVSXv|PZV(9IaYC7K1b~bIzTfr&47v0By z4pQcmB3yc@xSAH0vru|hbQ0l^Q_szXFAMvDR437eQwgQqUh=poJ)6c|I$4m1eIeE! zp#U%I$9}`H4VjVA{2d|@a9XgQS+>pNz5tbc)ZLlx1u_SE_EnwL<_tQ&Rq0Q9+8iv` zye<5bZ<6H->9##Bfy*%MxBk#-SZgxYes zQ21~dsiziJ3D#1bPAxW~&d&HpF3|bc zPPwZAmYI6oG}LDOJtY-4^BAijzG<>BuprA&_$l|6IT)vT?e|Ma)}2peMQQ~Cj51Q_~x@|Dyq6) z3k9G_P=lk;XR`x?;4WEmFNNN-XT!YN$cOYFk=Y|RPkIPema92dR%<5+U!~eDb&|{y ztfviba4r?|n9+G*KRb&m3FsD`0~j3>X!?L)?X>;GEALA?I8kUplX+0(O)iv8P(uE#HD$zVDL8H#1-hPl~@_Q2htY zemIsUXc3u=c;4Dlz(BNN0^7C^fdY0g*&I>KT|xtK3}k*nIPif_oBd*TCsqAH@^pXa zqaw7!kvEPUqKE5hp9fM+Jla(CgWDX0;%J41?c5GCd9?ln{p0 zx5U1GPfx!BsFa4D*tK8vE__|{e%kz0R8?)gTblmaI%1?{3J>JjT-k!BElOtEDkn-e zzMy^INBb(`rsZ!g8X|r2>h=!u@;?xK``pNi=bxa1M)SWROm-`i=8yEuAO@38f~ude z%k`0(=*)PNkx#v5zrK#PiYa}~&7^?38+VuTO7*Byy?Vqw^=!%ODlMDaT+Endaw;ne%iEscZQAK7 zet}NW7JUEP5#e9|`q%%Z-2UVJ{~2ZNF~q#}_2UNUDLM%We-Q!bv!O^E9|BQ)M#m1K zfkx=ThzD?lEJq5;)JX*OWFwV={)!DR%YLG<5Zy-}g^yXlQ-;LQg-3 zPhV{G>ZQ}xf?Qi08(u#Pcr7m(8?7edIQo~D7u^j+@2^=rSX=s+E5yX@?O(juOa=JQ zqx~pxOYjqnk<+=~YCL|A-l!&-a(S=iA@Mm^kIAwMLix7b+i*g7H`iaXxJ?12YSs%!#Vg36XdP$`zBn*<0}PF8>fQY*-qI;Mu-NN z!JiLh(pfnS41O?4O?h6xcwJnryEO3mJz6i_uRD3*bqr@^6 zEG&%$*btX?7QrqX3v)!2lb0UZ3(dT>Bo9?nRNkD4#tRW_M>I(eDP}JB@NmzjTaR09 z$?%c`@(Ys}T=Eg}gAQ-i2)$U77Qj990f!O1M;qpy(3Pf_2#;09L?8xGvv;J_!xiJf zGtm+1ea&l*SOELq(A=et0^qrYJv>N*Te^a>+!nDwK%UqG&YhXWMnON?Q^haUzpM`- zkCvcD4SCvHqhrFlz4F9Gk)z)d;C!S-W8-I`u79Uu@klQS!Gqmc8UmnyYBq!LAa9RZ zMkT>SaFF)Ul?5Q5CO1ixhJ$fH52eQC0bs(wXv>4I5VfI>)+|u; z4;&9R*@4(HxG4PHi)B=i=Hj}tk#K9(i51RN#X~02t>2J=dfX*BVtHi%F$h2m06Xv{ zJccdpD;zCAA17n+13^4gjC+AV*%0ibCKB$ZcyCGcV+m{GhXhd8=lCk>FIKMV+hJgg z%wC{#>7FC6Nc-(ELMUhm1|(wBbV*hl{q;2+Qr-$xSYdXPjFs`jQ0QCXsw=^>i3mfc z8=~bkaD$;t^cDn9w2S)5F1dC)_~fnbvFi5olS`;jPf#+Z8D=2hkvdr`A<5!7C8TiK zAo}je2XQvhxzgP+*cx#NW1Rxi_C-1}QJqBUXD{r938Oo#S1hlFumFS;@1Qg!8wpoP zXB1Wo_8fB{2yKaszyfZ}VAl6l)B~n`0zxGx0r6Z6fYE&rnQ=$S6Tm%%@vwk1VyQw7 zr@%$2mb&9_>~Z5t;7fP7uQ-rj5@G5CDWWd~us!gs?E$)|>CL^lfH6o?3oo29iG@Fh zZ)1Wv4p`F`4JHd9RFQb_irG>12K&SS%=TWfc)#=k#-HM&!F8>Nu8|~J`vJ98pcKIE zGiAqklRoH1d1^rEmgO1pky?Fmte)(#ahY@&o{}d2!X4rE#i^wXWVFWkN@W!>o&q4s zmuiM`Q2uSKu+CPoutHjFWDS}GhQNt6BHZR5qe#{7mNU{PiUHiyvHvtBBtrk2Q-n1m zx44+bdS;;QMp3xjJafL!mvpm7&(;|{WY26{sO9MlP-h(UhLffOI;;$ceH<`)(rqcP zTy)6Q!~zeW51I{H$o{Z_X(Nqm904fiuq1s1B7{%K9$5o>U8#rzu}03UvVP7~&1VsV zDO~-H+yAlil1MO-fFKt&+#HFJK$CUU1n$NO`cf5U8GIfYN5Bh*G4bq8V+A)v_=#5F zKRWHI9~9vl8`u)WQ$<`zb^ze!4U}=xBb5(1NQe@ABq@U?a04%n6BSP!TX0jY7tgv? z?xh!z$19@kx^8C7IjQLf#*q?xDHJAR!8Q@-dku$`R#M1%el~gL&ZOp1uM5CKH{hDQ zgcp4$edVQyN9sS(-|wFeV3KCY)(<89n6;IE@B-3V%H0N-GxYQmg9li*yZuUvB7rxlvHHP9nA@ z@QWkmB-D88>61DQ;uWx2gc&?MCF7O5eg;3ZH8nn(bM^%SnovXE+0;{rO-7uT-uR&nNrboCZ_Gz)62Ty$oFE9vz=4CxK0# z8f@>D5*b*S$J{K|LzD+aLP?!FS5`d~YZAP?8o(VI7(*#OY|Hfka`r$5jfd~*;BWaJ zoe=>Xi}j>a2dz5Kah6}VP)l7^@&a*#KO6Bn>D6t`HAZmmuI{?k32N6t=_((6xw5fHj9ge+oTT z+Ti$9DOpJ3BH=24Cz9vqN`1+_a^|p~61|5w;4(i%Y*SicN%CAW&e#WFB?N-J?aV+% zB9sy!;n~Sb`|;eHFAcqf>fY43CDUpZh3MuU=#eaL5hyBzehbw<7HP`ont?%2X_VhiFL# z6;i1vgHPEF`S9~E)~VOW=AoJP$#ZSIz^&rC7BROGYIt)4+_I|rBjASm(e>ml4vNw@ z%pVYXq}lT=Z3yMcfG`@v2Rd9~u#iINbR?9+VSE`xC`PfyqE!$j@ZO-#lSFks1y5e1 z<{1U-F??{(b{!Ou5>8e;VKTiU$AqF(P zp|PC0IA4x6h8l41Vh*D=xdQ- zJ*8erX9V>^rEQWNo#TYo9puzKB>X!#n<$5HR9Q5s7b$2Vga{FUy1N@u6x?v~?yQ}$ml(hUDr+%~ZdHp{< ze(-i%8sFx`9vW)j|GUR;KwHg(WLxuhkF7gxi65X8iM08@9e@7yum7j*{zw0xmNL#5 z>W!(XhN}UlfF=pa`kttEuuB?(5)CJ+DA)>3mp_4Lsr6(*@gFK-r3h+O$z%1SzjGc7 zPVV))HQ>Gitx|phD1QAH*;=p8b5~Ne!*prXiZv&Wv*&zeeYa2NHwlwcDXIkxk6}6F z36a0;FV1sM-s&nP$2r?`zFmEt-!hanD=Ta(t1?TP8X6i}VPi2dF)c06te#=q<@>F@ zvA49{LB*t=-C6D>%a*LzF{wEjyMOgBL?7q31RM zo$Js-U>~E9(w0-mKPTn9}j{RzT^0cyVDOr z7eIp_*3LHz3(z|KHlb^Jgr}#xVt`Z*d+|ML+Mdu@d3GpkTwr~T;|x7yL1DaMkof)B zeV^zuGXAatxeMZWuv?_^ifZMC`v;Ur+8ws+f>jgZ$DlaqmbKoWy@p(!F@$H6j ztrd#@F`}e>+%N_F&Uw!NPQZbrjlloPuL_LaL~meJnv4~r+R@O{*7tn1c>RsLSoNc= z(({_f^L=!WXT7M>@F%)(T!lsZqa}j)F*nvT84DAWQC%SFK~Qn91&v|`#F9+1wAxxx zcSiMU%NwNbq*OIJ3!8*iz%HUAiVH=6zCjKNH=O9P->+jrQDgx(GLq|WP>?Aat4TWt zswL86EgqI(2W0}9QMZ^d8#$qWWCRPAbHjq>>ZR!#RwLr(JgS%l5#|$xreF{u<39@z zdE;fDf@sr9UsFio9npH7$@Pa@@Kzsh)`B5j+Ri9M&qvdiPzCiKW`q_nOE2L^c%%)yO7#^4$#833Dj zF;uA0$?f38GZRNadcjwM)(&jZpL?-d;{yW>Q}b+6gl?r#9#CAue7Ade?5mQE@c~!~ za(YtbI{GSCB1M$(ciLyCS2zZ$BK`y6y9E?enTYb6IS>G+FBKuqTj)YJr2HFN-x&II z$@lX%nD+7N;izZL>|t&s9Xxcj^jg%TKb9YD^c;5pRChdIG;a}LmgR8mo$Q!F0WZ(X;?2x(9wd!NJoGAvHzCB zt5GuBoVx4MMT~bSkyfAJNNqjVF>YvK_Rr?uwNCqg8bE`=t-{kx;Sq=mxFd+;XFLW+ zy1=TyEo>YIs4uwa)@FlJAawrV zfdrW~qe(dFWpQV3st^wZMYNl9X=@{%j~wye!i4Hiz;p;6nYMF9aFr}A!kxj{eA?@z zFARI5O>vC_998fXVj_&qU(xW19;6->a)>7lv*nw>xKWCl(7h?78Kif&3xF98;~kX; zeU#FmT5z=EHgsaLW7j#Rl8DgDZdw6#8SSaFNk;%}(QqVxx`c*gL)r;J;bGIULlfqB z4A+^q+tbz^qu`dlCek{qH=0|5jhP$)j37i+8fVy#-@~1z%GZwa>H&&jDsE89uFKcY zG8g^n8x75Br{>4aF5rLAVJ3NNEQq zEC?B4K1v)(yy~`dzC@8V3bYy>^X?DSHVnrNHqlHttQKnhB%Pk%%()?ffLZTi39rgGzvNPF}^__7=y{GDen0vxbT8 zXqfE_8Yec49?vWLH`l3REI$tE-i&$V9A%x$V*I_M`mK5X6bh>VM;#*%8}rGCkZvD} zX(@z{PFw*wJ!C$mRR+i5c;-a)U6wSFi1vD>Tf5~&<(8j2@M0$4mU6BaGTBkko0Uxreoe}M>I zs2LhQf!lL19dD%u!CS!A+s_h z__Vk8R6*H}+TTdWJ&5p8xH1>c+W@vBmIH%~c zCxA3F9Lmvt#xgY;dynzy#il`aDkO=7eJ2txk|hv( zs2SZzd~i&0Z}?8@Z`}%{1z~2RQ-D^phdYYN6{rDkrZYIy)kDGPnMv}{B)-#hN}A* zkLTe9*m9J+_l}l9)VIN`M;Jzb{N9#*4S*<`e2n40{;K&tr2msvD~mt)KD_>cP*Npi5sWas6QcT}<*giFw`cKwcDaoX@Km?A-VdU#x93)K`98msuD^5S(eteRTGhRE zlz_9kk%UxkWH!1=COC35U|D0x%A#t7kRSP==Y9}_o(oh` z7fz&c&_a9+zxD<$z;@YcXJ)#977T^-*Z3s6Wo5_e`c}*9TAC?;$)Bpt)wk1$U$G>w zhTq-%<0ql=Vqx~i>!0Yb{-Z!yBV%%ZGE;Kg!tHjuqr*B;D7k0zJe$MqrjCw|E(^J% z*|zVJqL-SQWtC;O4K`(JWnxm&^7OJZ8R$u@`fbN*Q1}EU+3@T8)R# z$2c^q4KM@9r>&Cbb3c4EI$iFg{LjS>JmYVcAFBzn-L)}ii0FOg&do-`hl7KUo95u- zAH5^UXT0j(o=qO~pIG<6aLF>vP^T+SCN*0!O4>+|onBfD+-URN9 zMA_{*x0B|H!{faGFcZ^|cE3OzLo7P+=0W;xk{UciiXR3X&l1A`od@%0WEl#Pz{`q+ zJr4IeM-pXBe_0hMd873;P5HgKnc?K6`MB`rD&pf8sFHL0tz2xqetiV?B>*BLN?^Wl zmV)FI1b7^(ZtVMC?EOQNFbuFQ=$38Uwr$(CZQC~AvTfV8ZQFKL@7XzbdMCRh`g?vv zMy`m=Sn-_CwSKl_8*w#DoTRt%a*z0im*A&;gHg7mEjd}d9|FmC|>{v{9mPI`p5k@MWBfq48qL|3w|=ga{53}X+|f@dOR z@+K&fMnbsd0-n}BI~?N?(GfqTzq3Pg7Wcs|O5MSGOkIz?-kdSQ1D#XAJ7X(FV@sf@ zo~3!tQIHYhJgWD&@xgs1OPCT|W{4l(Pk{WIn(k@hJQl;7AJ-1L%MuwD(xnkqO$?S} z!R~Gv4pUbP2(?*9jujW@J-!6UjYkK}?80yys=WlD-+YXJSN@}bnTzxWRbbGsB9gGp zt@yV)ANM;qJ-Et>_+^z&N58@DyZ#W^?5U-t1<4}TIi_R_o_13AQFmZ{2R)Tl^&?A? zd7dL$S($7lAu=*ympCh^D-3gil4eeeFa~`lWgD|t|5S^Xmq2y{DAebW@l(&nD0VCsL?Ff-kubC|Sp@5P|ZJD+} zxHR_|>kjB`d86mSI*bGAZg80tm&xdu6&joMCuf(;)B+|6;CWrJa^@iY> z*9b`Q=8kZ11!Z~3-f=v}^KoP0mg7uFTJV&+Y)V^Xb~@uY`A

    @hoi)nP-wk9WeoD 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 z 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

    5(F6VQPj8-{wbIg{T(VahQKc#o>P5dI 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 z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK zfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5 zV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM z7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b* z1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd z0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA zz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEj zFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r z3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@ z0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK efB^#r3>YwAz<>b*1`HT5V8DO@0|pEjcn<_LquSE| diff --git a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d.cpp b/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d.cpp deleted file mode 100644 index d8727b35c..000000000 --- a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d.cpp +++ /dev/null @@ -1,2390 +0,0 @@ -// gdraw_d3d.cpp - author: Sean Barrett - copyright 2009-2011 RAD Game Tools -// -// This implements the Iggy graphics driver layer for Direct3D 9. - -// GDraw consists of several components that interact fairly loosely with each -// other; e.g. the resource management, drawing and filtering parts are all -// fairly independent of each other. If you want to modify some aspect of GDraw -// - say the texture allocation logic - your best bet is usually to just look -// for one of the related entry points, e.g. MakeTextureBegin, and take it from -// there. There's a bunch of code in this file, but none of it is really -// complicated. -// -// The one bit you might want to change that's not that localized is to -// integrate GDraw with an existing state caching system. The following bits all -// modify D3D state in some way: -// - The rendering helpers (set_viewport_raw, set_projection_raw, -// set_*_renderstate) -// - RenderTile*/TextureDrawBuffer* may change the active rendertarget and -// depth/stencil surface, -// as do D3D_NoMoreGDrawThisFrame and set_render_target -// - set_texture -// - set_renderstate and set_renderstate_full. These are the main places where -// render state changes occur; -// you should probably start here. -// - DrawIndexedTriangles sets the active vertex/index buffers and vertex -// declaration -// - Most of the functions in the "filter effects" section modify D3D state, -// mostly -// pixel shader constants and textures - -#define WIN32_LEAN_AND_MEAN -#include -#include -#include -#include - -// We temporarily disable this warning for the shared interface portions -#pragma warning(push) -#pragma warning(disable \ - : 4201) // nonstandard extension used : nameless struct/union - -#include "../include/gdraw.h" -#include "../include/iggy.h" -#include "gdraw_d3d.h" - -// The native handle type holds resource handles and a coarse description. -typedef union { - // handle that is a texture - struct { - IDirect3DTexture9* d3d; - IDirect3DTexture9* d3d_msaa; - U32 w, h; - } tex; - - // handle that is a vertex buffer - struct { - IDirect3DVertexBuffer9* base; - IDirect3DIndexBuffer9* indices; - } vbuf; -} GDrawNativeHandle; - -#define GDRAW_D3D // this controls the next include so the cache gets declared - // with the correct types, which makes it typesafe -#include "gdraw_shared.inl" - -#pragma warning(pop) - -// max rendertarget stack depth. this depends on the extent to which you -// use filters and non-standard blend modes, and how nested they are. -#define MAX_RENDER_STACK_DEPTH \ - 8 // Iggy is hardcoded to a limit of 16... probably 1-3 is realistic -#define AATEX_SAMPLER 7 // sampler that aa_tex gets set in -#define QUAD_IB_COUNT 2048 // quad index buffer has indices for this many quads - -#define ASSERT_COUNT(a, b) ((a) == (b) ? (b) : -1) - -static GDrawFunctions gdraw_funcs; - -// render target state -typedef struct { - GDrawHandle* color_buffer; - S32 base_x, base_y, width, height; - U32 flags; - rrbool cached; -} GDrawFramebufferState; - -struct ProgramWithCachedVariableLocations { - DWORD* bytecode; - union { - IDirect3DPixelShader9* pshader; - IDirect3DVertexShader9* vshader; - }; - int vars[MAX_VARS]; // it's unsigned in d3d, but we want an 'undefined' - // value -}; - -/////////////////////////////////////////////////////////////////////////////// -// -// GDraw data structure -// -// -// This is the primary rendering abstraction, which hides all -// the platform-specific rendering behavior from Iggy. It is -// full of platform-specific graphics state, and also general -// graphics state so that it doesn't have to callback into Iggy -// to get at that graphics state. - -typedef struct { - IDirect3DDevice9* d3d_device; - - // fragment shaders - ProgramWithCachedVariableLocations fprog[GDRAW_TEXTURE__count][3]; - ProgramWithCachedVariableLocations - exceptional_blend[GDRAW_BLENDSPECIAL__count]; - ProgramWithCachedVariableLocations filter_prog[2][16]; - ProgramWithCachedVariableLocations blur_prog[MAX_TAPS + 1]; - ProgramWithCachedVariableLocations colormatrix; - ProgramWithCachedVariableLocations manual_clear; - - // vertex declarations - IDirect3DVertexDeclaration9* vdec[GDRAW_vformat__count]; - - // vertex shaders - ProgramWithCachedVariableLocations vert[GDRAW_vformat__count]; // [format] - - // render targets - GDrawHandleCache rendertargets; - GDrawHandle - rendertarget_handles[MAX_RENDER_STACK_DEPTH]; // not -1, because we use - // +1 to initialize - - gswf_recti rt_valid[MAX_RENDER_STACK_DEPTH + - 1]; // valid rect for texture clamping - - // size of our render targets - S32 frametex_width, frametex_height; - - // viewport setting (in pixels) for current frame - S32 vx, vy; - S32 fw, fh; // full width/height of virtual display - S32 tw, th; // actual width/height of current tile - S32 tpw, tph; // width/height of padded version of tile - - S32 tx0, ty0; - S32 tx0p, ty0p; - rrbool in_blur; - - F32 projection[4]; // scalex,scaley,transx,transy - rrbool use_3d; - F32 xform_3d[3][4]; - - IDirect3DSurface9* main_framebuffer; - IDirect3DSurface9* main_depthbuffer; - IDirect3DSurface9* rt_depthbuffer; // non-multisampled rendertarget depth - // buffer. only used when MSAA is on! - rrbool main_msaa; // does main framebuffer have MSAA enabled? - - IDirect3DTexture9* aa_tex; - - // scale factors converting worldspace to viewspace <0,0>.. - F32 world_to_pixel[2]; - - // cached state - U32 scissor_state; // ~0 if unknown, otherwise 0 or 1 - int blend_mode; // -1 if unknown, otherwise GDRAW_BLEND_* - U32 stencil_key; // field built from stencil test flags. 0=no stencil, ~0 - // is used for "unknown state" - U32 z_key; // same for z-writes/z-test - rrbool last_was_3d; - - // render-state stack described above for 'temporary' rendering - GDrawFramebufferState frame[MAX_RENDER_STACK_DEPTH]; - GDrawFramebufferState* cur; - - // texture and vertex buffer pools - GDrawHandleCache* texturecache; - GDrawHandleCache* vbufcache; - - // mipmapping - GDrawMipmapContext mipmap; - rrbool conditional_nonpow2; - - // stat tracking - rrbool frame_done; - U64 frame_counter; - - // error reporting - void(__cdecl* error_handler)(HRESULT hr); -} GDraw; - -static GDraw* gdraw; - -// not a real index buffer because we only get quads via user pointer -static U16 quad_ib[QUAD_IB_COUNT * 6]; - -//////////////////////////////////////////////////////////////////////// -// -// Error handling -// - -static void report_d3d_error(HRESULT hr, char* call, char* context) { - if (hr == E_OUTOFMEMORY) - IggyGDrawSendWarning(NULL, "GDraw D3D out of memory in %s%s", call, - context); - else - IggyGDrawSendWarning(NULL, "GDraw D3D error in %s%s: 0x%08x", call, - context, hr); -} - -//////////////////////////////////////////////////////////////////////// -// -// General resource management for both textures and vertex buffers -// - -template -static void safe_release(T*& p) { - if (p) { - p->Release(); - p = NULL; - } -} - -static void unbind_resources(void) { - IDirect3DDevice9* d3d = gdraw->d3d_device; - S32 i; - - // unset active textures and vertex/index buffers, - // to make sure there are no dangling refs - for (i = 0; i < 3; ++i) d3d->SetTexture(i, NULL); - - d3d->SetStreamSource(0, NULL, 0, 0); - d3d->SetIndices(NULL); -} - -static void api_free_resource(GDrawHandle* r) { - unbind_resources(); - if (r->state != GDRAW_HANDLE_STATE_user_owned) { - if (!r->cache->is_vertex) { - safe_release(r->handle.tex.d3d); - } else { - safe_release(r->handle.vbuf.base); - safe_release(r->handle.vbuf.indices); - } - } -} - -static void RADLINK gdraw_UnlockHandles(GDrawStats* /*stats*/) { - gdraw_HandleCacheUnlockAll(gdraw->texturecache); - gdraw_HandleCacheUnlockAll(gdraw->vbufcache); -} - -//////////////////////////////////////////////////////////////////////// -// -// Texture creation/updating/deletion -// - -extern GDrawTexture* gdraw_D3D_WrappedTextureCreate( - IDirect3DTexture9* texhandle) { - GDrawStats stats = {0}; - GDrawHandle* p = gdraw_res_alloc_begin( - gdraw->texturecache, 0, - &stats); // it may need to free one item to give us a handle - p->handle.tex.d3d = texhandle; - p->handle.tex.w = 1; - p->handle.tex.h = 1; - gdraw_HandleCacheAllocateEnd(p, 0, NULL, GDRAW_HANDLE_STATE_user_owned); - return (GDrawTexture*)p; -} - -extern void gdraw_D3D_WrappedTextureChange(GDrawTexture* tex, - IDirect3DTexture9* texhandle) { - GDrawHandle* p = (GDrawHandle*)tex; - p->handle.tex.d3d = texhandle; -} - -extern void gdraw_D3D_WrappedTextureDestroy(GDrawTexture* tex) { - GDrawStats stats = {0}; - gdraw_res_free((GDrawHandle*)tex, &stats); -} - -static void RADLINK gdraw_SetTextureUniqueID(GDrawTexture* tex, void* old_id, - void* new_id) { - GDrawHandle* p = (GDrawHandle*)tex; - // if this is still the handle it's thought to be, change the owner; - // if the owner *doesn't* match, then they're changing a stale handle, so - // ignore - if (p->owner == old_id) p->owner = new_id; -} - -static rrbool RADLINK gdraw_MakeTextureBegin( - void* owner, S32 width, S32 height, gdraw_texture_format format, U32 flags, - GDraw_MakeTexture_ProcessingInfo* p, GDrawStats* stats) { - GDrawHandle* t = NULL; - D3DFORMAT d3dfmt; - S32 bpp; - - if (format == GDRAW_TEXTURE_FORMAT_rgba32) { - d3dfmt = D3DFMT_A8R8G8B8; - bpp = 4; - } else { - d3dfmt = D3DFMT_A8; - bpp = 1; - } - - // compute estimated size of texture in video memory - S32 size = width * height * bpp; - if (flags & GDRAW_MAKETEXTURE_FLAGS_mipmap) - size = size * 4 / 3; // not correct for non-square - - // allocate a handle and make room in the cache for this much data - t = gdraw_res_alloc_begin(gdraw->texturecache, size, stats); - if (!t) return NULL; - - HRESULT hr = gdraw->d3d_device->CreateTexture( - width, height, (flags & GDRAW_MAKETEXTURE_FLAGS_mipmap) ? 0 : 1, 0, - d3dfmt, D3DPOOL_MANAGED, &t->handle.tex.d3d, NULL); - - if (FAILED(hr)) { - gdraw_HandleCacheAllocateFail(t); - IggyGDrawSendWarning( - NULL, "GDraw CreateTexture() call failed with error code 0x%08x", - hr); - return false; - } - - t->handle.tex.w = width; - t->handle.tex.h = height; - - gdraw_HandleCacheAllocateEnd(t, size, owner, - (flags & GDRAW_MAKETEXTURE_FLAGS_never_flush) - ? GDRAW_HANDLE_STATE_pinned - : GDRAW_HANDLE_STATE_locked); - stats->nonzero_flags |= GDRAW_STATS_alloc_tex; - stats->alloc_tex += 1; - stats->alloc_tex_bytes += size; - - p->texture_type = GDRAW_TEXTURE_TYPE_bgra; - p->p0 = t; - - if (flags & GDRAW_MAKETEXTURE_FLAGS_mipmap) { - rrbool ok; - assert(p->temp_buffer != NULL); - ok = gdraw_MipmapBegin(&gdraw->mipmap, width, height, - t->handle.tex.d3d->GetLevelCount(), bpp, - p->temp_buffer, p->temp_buffer_bytes); - assert(ok); // this should never trigger unless the temp_buffer is way - // too small - - p->p1 = &gdraw->mipmap; - p->texture_data = gdraw->mipmap.pixels[0]; - p->num_rows = gdraw->mipmap.bheight; - p->stride_in_bytes = gdraw->mipmap.pitch[0]; - p->i0 = 0; // current output y - p->i1 = bpp; - } else { - D3DLOCKED_RECT z; - hr = t->handle.tex.d3d->LockRect(0, &z, NULL, 0); - if (FAILED(hr)) { - t->handle.tex.d3d->Release(); - gdraw_HandleCacheAllocateFail(t); - - if (hr == E_OUTOFMEMORY) { - IggyGDrawSendWarning(NULL, - "GDraw out of texture memory allocating " - "%dx%d (%dbpp) texture", - width, height, 8 * bpp); - return false; - } else { - IggyGDrawSendWarning(NULL, - "GDraw LockRect for texture allocation " - "failed, D3D error 0x%08x\n", - hr); - return false; - } - } - - p->p1 = NULL; - p->texture_data = (U8*)z.pBits; - p->num_rows = height; - p->stride_in_bytes = z.Pitch; - } - - return true; -} - -static rrbool RADLINK -gdraw_MakeTextureMore(GDraw_MakeTexture_ProcessingInfo* p) { - GDrawHandle* t = (GDrawHandle*)p->p0; - - if (p->p1) { - GDrawMipmapContext* c = (GDrawMipmapContext*)p->p1; - U32 outy = p->i0; - U32 bpp = p->i1; - U32 width = c->width; - U32 height = c->height; - U32 bheight = c->bheight; - U32 level = 0; - - if (outy >= c->height) return false; - - do { - // upload data for this miplevel - D3DLOCKED_RECT z; - HRESULT hr = t->handle.tex.d3d->LockRect(level, &z, NULL, 0); - if (FAILED(hr)) return false; - - for (U32 y = 0; y < bheight; ++y) - memcpy((U8*)z.pBits + ((outy >> level) + y) * z.Pitch, - c->pixels[level] + y * c->pitch[level], width * bpp); - t->handle.tex.d3d->UnlockRect(level); - - // prepare next miplevel - width = RR_MAX(width >> 1, 1); - height = RR_MAX(height >> 1, 1); - bheight = RR_MAX(bheight >> 1, 1); - } while (gdraw_MipmapAddLines(c, ++level)); - - // prepare next chunk - p->i0 += p->num_rows; - p->texture_data = c->pixels[0]; - p->num_rows = c->bheight = RR_MIN(c->bheight, c->height - p->i0); - return true; - } else - return false; -} - -static GDrawTexture* RADLINK gdraw_MakeTextureEnd( - GDraw_MakeTexture_ProcessingInfo* p, GDrawStats* /*stats*/) { - GDrawHandle* t = (GDrawHandle*)p->p0; - if (p->p1) - gdraw_MakeTextureMore(p); // use more to upload the last batch of data - else - t->handle.tex.d3d->UnlockRect(0); - - return (GDrawTexture*)t; -} - -static rrbool RADLINK gdraw_UpdateTextureBegin(GDrawTexture* t, void* unique_id, - GDrawStats* /*stats*/) { - return gdraw_HandleCacheLock((GDrawHandle*)t, unique_id); -} - -static void RADLINK gdraw_UpdateTextureRect(GDrawTexture* t, - void* /*unique_id*/, S32 x, S32 y, - S32 stride, S32 w, S32 h, - U8* samples, - gdraw_texture_format format) { - GDrawHandle* s = (GDrawHandle*)t; - RECT rdest = {x, y, x + w, y + h}; - S32 i, bpl = (format == GDRAW_TEXTURE_FORMAT_font ? 1 : 4) * w; - D3DLOCKED_RECT lr; - - HRESULT hr = s->handle.tex.d3d->LockRect(0, &lr, &rdest, 0); - if (FAILED(hr)) { - IggyGDrawSendWarning( - 0, "GDraw LockRect() for texture update failed; D3D error 0x%08x", - hr); - return; - } - - for (i = 0; i < h; i++) - memcpy((U8*)lr.pBits + i * lr.Pitch, samples + i * stride, bpl); - - s->handle.tex.d3d->UnlockRect(0); -} - -static void RADLINK gdraw_UpdateTextureEnd(GDrawTexture* t, void* /*unique_id*/, - GDrawStats* /*stats*/) { - gdraw_HandleCacheUnlock((GDrawHandle*)t); -} - -static void RADLINK gdraw_FreeTexture(GDrawTexture* tt, void* unique_id, - GDrawStats* stats) { - GDrawHandle* t = (GDrawHandle*)tt; - assert(t != NULL); // @GDRAW_ASSERT - if (t->owner == unique_id || unique_id == NULL) { - if (t->cache == &gdraw->rendertargets) { - gdraw_HandleCacheUnlock(t); - // cache it by simply not freeing it - return; - } - - gdraw_res_free(t, stats); - } -} - -static rrbool RADLINK gdraw_TryToLockTexture(GDrawTexture* t, void* unique_id, - GDrawStats* /*stats*/) { - return gdraw_HandleCacheLock((GDrawHandle*)t, unique_id); -} - -static void RADLINK gdraw_DescribeTexture(GDrawTexture* tex, - GDraw_Texture_Description* desc) { - GDrawHandle* p = (GDrawHandle*)tex; - desc->width = p->handle.tex.w; - desc->height = p->handle.tex.h; - desc->size_in_bytes = p->bytes; -} - -static void RADLINK gdraw_SetAntialiasTexture(S32 width, U8* rgba) { - HRESULT hr; - D3DLOCKED_RECT lr; - S32 i; - U8* d; - - safe_release(gdraw->aa_tex); // release the old texture, if any. - - hr = gdraw->d3d_device->CreateTexture( - width, 1, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &gdraw->aa_tex, NULL); - if (FAILED(hr)) { - IggyGDrawSendWarning(0, "GDraw D3D error in CreateTexture 0x%08x", hr); - return; - } - - hr = gdraw->aa_tex->LockRect(0, &lr, NULL, 0); - if (!FAILED(hr)) { - d = (U8*)lr.pBits; - for (i = 0; i < width; i++) { - d[i * 4 + 0] = rgba[i * 4 + 2]; - d[i * 4 + 1] = rgba[i * 4 + 1]; - d[i * 4 + 2] = rgba[i * 4 + 0]; - d[i * 4 + 3] = rgba[i * 4 + 3]; - } - - gdraw->aa_tex->UnlockRect(0); - } else - IggyGDrawSendWarning( - 0, "GDraw D3D error in LockRect for texture creation: 0x%08x", hr); -} - -//////////////////////////////////////////////////////////////////////// -// -// Vertex buffer creation/deletion -// - -static rrbool RADLINK gdraw_MakeVertexBufferBegin( - void* unique_id, gdraw_vformat /*vformat*/, S32 vbuf_size, S32 ibuf_size, - GDraw_MakeVertexBuffer_ProcessingInfo* p, GDrawStats* stats) { - char* failed_call; - GDrawHandle* vb = - gdraw_res_alloc_begin(gdraw->vbufcache, vbuf_size + ibuf_size, stats); - if (!vb) return false; - - vb->handle.vbuf.base = NULL; - vb->handle.vbuf.indices = NULL; - - HRESULT hr; - hr = gdraw->d3d_device->CreateVertexBuffer(vbuf_size, D3DUSAGE_WRITEONLY, 0, - D3DPOOL_MANAGED, - &vb->handle.vbuf.base, NULL); - failed_call = "CreateVertexBuffer"; - if (!FAILED(hr)) { - hr = gdraw->d3d_device->CreateIndexBuffer( - ibuf_size, D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, - &vb->handle.vbuf.indices, NULL); - failed_call = "CreateIndexBuffer"; - } - if (!FAILED(hr)) { - hr = vb->handle.vbuf.base->Lock(0, vbuf_size, (void**)&p->vertex_data, - 0); - failed_call = "Lock"; - } - if (!FAILED(hr)) - hr = vb->handle.vbuf.indices->Lock(0, ibuf_size, (void**)&p->index_data, - 0); - - if (FAILED(hr)) { - if (vb->handle.vbuf.base) - vb->handle.vbuf.base - ->Unlock(); // does nothing if we didn't actually lock - - safe_release(vb->handle.vbuf.base); - safe_release(vb->handle.vbuf.indices); - - gdraw_HandleCacheAllocateFail(vb); - - report_d3d_error(hr, failed_call, " creating vertex buffer"); - return false; - } - - p->vertex_data_length = vbuf_size; - p->index_data_length = ibuf_size; - p->p0 = vb; - - gdraw_HandleCacheAllocateEnd(vb, vbuf_size + ibuf_size, unique_id, - GDRAW_HANDLE_STATE_locked); - return true; -} - -static rrbool RADLINK -gdraw_MakeVertexBufferMore(GDraw_MakeVertexBuffer_ProcessingInfo* /*p*/) { - assert(0); - return false; -} - -static GDrawVertexBuffer* RADLINK gdraw_MakeVertexBufferEnd( - GDraw_MakeVertexBuffer_ProcessingInfo* p, GDrawStats* /*stats*/) { - GDrawHandle* vb = (GDrawHandle*)p->p0; - vb->handle.vbuf.base->Unlock(); - vb->handle.vbuf.indices->Unlock(); - return (GDrawVertexBuffer*)vb; -} - -static rrbool RADLINK gdraw_TryLockVertexBuffer(GDrawVertexBuffer* vb, - void* unique_id, - GDrawStats* /*stats*/) { - return gdraw_HandleCacheLock((GDrawHandle*)vb, unique_id); -} - -static void RADLINK gdraw_FreeVertexBuffer(GDrawVertexBuffer* vb, - void* unique_id, GDrawStats* stats) { - GDrawHandle* h = (GDrawHandle*)vb; - assert(h != NULL); // @GDRAW_ASSERT - if (h->owner == unique_id) gdraw_res_free(h, stats); -} - -static void RADLINK gdraw_DescribeVertexBuffer( - GDrawVertexBuffer* vbuf, GDraw_VertexBuffer_Description* desc) { - GDrawHandle* p = (GDrawHandle*)vbuf; - desc->size_in_bytes = p->bytes; -} - -//////////////////////////////////////////////////////////////////////// -// -// Create/free (or cache) render targets -// - -static GDrawHandle* get_color_rendertarget(GDrawStats* stats) { - // try to recycle LRU rendertarget - GDrawHandle* t = gdraw_HandleCacheGetLRU(&gdraw->rendertargets); - if (t) { - gdraw_HandleCacheLock(t, (void*)1); - return t; - } - - // ran out of RTs, allocate a new one - S32 size = gdraw->frametex_width * gdraw->frametex_height * 4; - if (gdraw->rendertargets.bytes_free < size) { - IggyGDrawSendWarning( - NULL, - "GDraw rendertarget allocation failed: hit size limit of %d bytes", - gdraw->rendertargets.total_bytes); - return NULL; - } - - t = gdraw_HandleCacheAllocateBegin(&gdraw->rendertargets); - if (!t) { - IggyGDrawSendWarning( - NULL, "GDraw rendertarget allocation failed: hit handle limit"); - return t; - } - - HRESULT hr = gdraw->d3d_device->CreateTexture( - gdraw->frametex_width, gdraw->frametex_height, 1, D3DUSAGE_RENDERTARGET, - D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &t->handle.tex.d3d, NULL); - if (FAILED(hr)) { - report_d3d_error(hr, "CreateTexture", " creating rendertarget"); - gdraw_HandleCacheAllocateFail(t); - return NULL; - } - - gdraw_HandleCacheAllocateEnd(t, size, (void*)1, GDRAW_HANDLE_STATE_locked); - stats->nonzero_flags |= GDRAW_STATS_alloc_tex; - stats->alloc_tex += 1; - stats->alloc_tex_bytes += size; - - return t; -} - -static IDirect3DSurface9* get_rendertarget_depthbuffer(GDrawStats* stats) { - if (!gdraw->rt_depthbuffer) { - HRESULT hr = gdraw->d3d_device->CreateDepthStencilSurface( - gdraw->frametex_width, gdraw->frametex_height, D3DFMT_D24S8, - D3DMULTISAMPLE_NONE, 0, TRUE, &gdraw->rt_depthbuffer, NULL); - if (FAILED(hr)) - IggyGDrawSendWarning( - NULL, "GDraw D3D error in CreateDepthStencilSurface: 0x%08x", - hr); - else { - stats->nonzero_flags |= GDRAW_STATS_alloc_tex; - stats->alloc_tex += 1; - stats->alloc_tex_bytes += - gdraw->frametex_width * gdraw->frametex_height * 4; - } - } - - return gdraw->rt_depthbuffer; -} - -static void flush_rendertargets(GDrawStats* stats) { - gdraw_res_flush(&gdraw->rendertargets, stats); - safe_release(gdraw->rt_depthbuffer); -} - -//////////////////////////////////////////////////////////////////////// -// -// Vertex shader constants -// - -#define VVAR_world0 0 -#define VVAR_world1 1 -#define VVAR_count_worldonly \ - 2 // number of constants to send if you only changed world matrix - -#define VVAR_x_off 2 -#define VVAR_count_world_xoff \ - 3 // number of constants to send if you changed world+x_off - -#define VVAR_texgen_s 3 -#define VVAR_texgen_t 4 -#define VVAR_count \ - 5 // number of constants to send if you changed all per-batch state - -#define VVAR_x3d 5 -#define VVAR_y3d 6 -#define VVAR_z3d 7 -#define VVAR_count3d 8 - -// Fixed-location pixel shader constants -#define PVAR_cmul 0 -#define PVAR_cadd 1 -#define PVAR_focal 2 -#define PVAR_rescale1 3 - -struct VertexVars { - F32 world[2][4]; - F32 x_off[4]; - F32 texgen_s[4]; - F32 texgen_t[4]; - F32 viewproj[3][4]; -}; - -//////////////////////////////////////////////////////////////////////// -// -// Rendering helpers -// - -static void set_d3d_texture(U32 sampler, IDirect3DTexture9* tex, U32 wrap, - U32 nearest) { - static const int addrmodes[ASSERT_COUNT(GDRAW_WRAP__count, 4)] = { - D3DTADDRESS_CLAMP, // GDRAW_WRAP_clamp - D3DTADDRESS_WRAP, // GDRAW_WRAP_repeat - D3DTADDRESS_MIRROR, // GDRAW_WRAP_mirror - D3DTADDRESS_CLAMP, // GDRAW_WRAP_clamp_to_border (never used by client - // code!) - }; - - static const int filtermodes[2] = { - D3DTEXF_LINEAR, // !nearest - D3DTEXF_POINT, // nearest - }; - - assert(wrap < sizeof(addrmodes) / sizeof(addrmodes[0])); - assert(nearest < sizeof(filtermodes) / sizeof(filtermodes[0])); - IDirect3DDevice9* d3d = gdraw->d3d_device; - - d3d->SetTexture(sampler, tex); - d3d->SetSamplerState(sampler, D3DSAMP_MAGFILTER, filtermodes[nearest]); - d3d->SetSamplerState(sampler, D3DSAMP_ADDRESSU, addrmodes[wrap]); - d3d->SetSamplerState(sampler, D3DSAMP_ADDRESSV, addrmodes[wrap]); -} - -static void set_viewport_raw(S32 x, S32 y, S32 w, S32 h) { - D3DVIEWPORT9 vp = {x, y, w, h, 0.0f, 1.0f}; - gdraw->d3d_device->SetViewport(&vp); -} - -static void set_projection_base(void) { - F32 m[3][4] = {0}; - - // x3d = < viewproj.x, 0, 0, 0 > - // y3d = < 0, viewproj.y, 0, 0 > - // w3d = < viewproj.z, viewproj.w, 1.0, 1.0 > - - m[0][0] = gdraw->projection[0]; - m[1][1] = gdraw->projection[1]; - m[2][0] = gdraw->projection[2]; - m[2][1] = gdraw->projection[3]; - - m[2][2] = 1.0; - m[2][3] = 1.0; - - gdraw->d3d_device->SetVertexShaderConstantF(VVAR_x3d, m[0], 3); -} - -static void set_projection_raw(S32 x0, S32 x1, S32 y0, S32 y1) { - gdraw->projection[0] = 2.0f / (x1 - x0); - gdraw->projection[1] = 2.0f / (y1 - y0); - gdraw->projection[2] = - (x1 + x0) / (F32)(x0 - x1) - - 0.5f * gdraw->projection[0]; // -0.5f: convert from D3D9 to GL/D3D10 - // pixel coordinates - gdraw->projection[3] = - (y1 + y0) / (F32)(y0 - y1) - 0.5f * gdraw->projection[1]; - - set_projection_base(); -} - -static void set_viewport(void) { - if (gdraw->in_blur) { - set_viewport_raw(0, 0, gdraw->tpw, gdraw->tph); - return; - } - - if (gdraw->cur == gdraw->frame) // if the rendering stack is empty - // render a tile-sized region to the user-request tile location - set_viewport_raw(gdraw->vx, gdraw->vy, gdraw->tw, gdraw->th); - else if (gdraw->cur->cached) - set_viewport_raw(0, 0, gdraw->cur->width, gdraw->cur->height); - else - // if on the render stack, draw a padded-tile-sized region at the origin - set_viewport_raw(0, 0, gdraw->tpw, gdraw->tph); -} - -static void set_projection(void) { - if (gdraw->in_blur) return; - if (gdraw->cur == gdraw->frame) // if the render stack is empty - set_projection_raw(gdraw->tx0, gdraw->tx0 + gdraw->tw, - gdraw->ty0 + gdraw->th, gdraw->ty0); - else if (gdraw->cur->cached) - set_projection_raw( - gdraw->cur->base_x, gdraw->cur->base_x + gdraw->cur->width, - gdraw->cur->base_y, gdraw->cur->base_y + gdraw->cur->height); - else - set_projection_raw(gdraw->tx0p, gdraw->tx0p + gdraw->tpw, - gdraw->ty0p + gdraw->tph, gdraw->ty0p); -} - -static void set_common_renderstate() { - IDirect3DDevice9* d3d = gdraw->d3d_device; - S32 i; - - // all the render states we never change while drawing - d3d->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); - d3d->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP); - d3d->SetRenderState(D3DRS_STENCILZFAIL, D3DSTENCILOP_KEEP); - d3d->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_REPLACE); - d3d->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL); - d3d->SetRenderState(D3DRS_STENCILREF, 255); - d3d->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); - d3d->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, 0); - d3d->SetRenderState(D3DRS_DEPTHBIAS, 0); - d3d->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); - d3d->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, FALSE); - - for (i = 0; i < 3; i++) { - d3d->SetTextureStageState(i, D3DTSS_TEXCOORDINDEX, i); - d3d->SetTextureStageState(i, D3DTSS_TEXTURETRANSFORMFLAGS, - D3DTTFF_DISABLE); - d3d->SetSamplerState(i, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR); - d3d->SetSamplerState(i, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); - d3d->SetSamplerState(i, D3DSAMP_MIPMAPLODBIAS, 0); - d3d->SetSamplerState(i, D3DSAMP_MAXMIPLEVEL, 0); - } - - d3d->SetTextureStageState(AATEX_SAMPLER, D3DTSS_TEXCOORDINDEX, - AATEX_SAMPLER); - - d3d->SetTexture(AATEX_SAMPLER, gdraw->aa_tex); - d3d->SetSamplerState(AATEX_SAMPLER, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); - d3d->SetSamplerState(AATEX_SAMPLER, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); - d3d->SetSamplerState(AATEX_SAMPLER, D3DSAMP_MINFILTER, D3DTEXF_LINEAR); - d3d->SetSamplerState(AATEX_SAMPLER, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR); - d3d->SetSamplerState(AATEX_SAMPLER, D3DSAMP_MIPMAPLODBIAS, 0); - d3d->SetSamplerState(AATEX_SAMPLER, D3DSAMP_MAXMIPLEVEL, 0); - - // reset our state caching - gdraw->scissor_state = ~0u; - gdraw->blend_mode = -1; - gdraw->stencil_key = ~0u; - gdraw->z_key = ~0u; - - VertexVars vvars = {0}; - d3d->SetVertexShaderConstantF(0, vvars.world[0], VVAR_count); -} - -static void clear_renderstate(void) { - IDirect3DDevice9* d3d = gdraw->d3d_device; - - d3d->SetTexture(0, NULL); - d3d->SetTexture(1, NULL); - d3d->SetTexture(2, NULL); - d3d->SetTexture(AATEX_SAMPLER, NULL); - d3d->SetStreamSource(0, NULL, 0, 0); - d3d->SetIndices(NULL); - - d3d->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); - d3d->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS); - d3d->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); - d3d->SetRenderState(D3DRS_COLORWRITEENABLE, 0xf); - d3d->SetRenderState(D3DRS_STENCILENABLE, FALSE); - d3d->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); - - d3d->SetVertexShader(0); - d3d->SetPixelShader(0); - d3d->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); - d3d->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); -} - -static void clear_zbuffer(IDirect3DSurface9* surf, U32 flags) { - IDirect3DDevice9* d3d = gdraw->d3d_device; - IDirect3DSurface9* target; - D3DSURFACE_DESC desc; - surf->GetDesc(&desc); - - // here's where it gets stupid: we need a rendertarget that's - // big enough so we can actually clear the full z-buffer. - // we don't actually render to it or anything, we just need to - // set it... - target = gdraw->main_framebuffer; - if (surf != gdraw->main_depthbuffer) { - // tile surface could, in theory, be larger than main framebuffer, so - // check if we have at least one rendertarget matching the rt depth - // buffer created and use that while clearing if possible - S32 i; - for (i = 0; i < MAX_RENDER_STACK_DEPTH; ++i) - if (gdraw->rendertargets.handle[i].handle.tex.d3d) { - gdraw->rendertargets.handle[i].handle.tex.d3d->GetSurfaceLevel( - 0, &target); - break; - } - } - - D3DVIEWPORT9 vp = {0, 0, desc.Width, desc.Height, 0.0f, 1.0f}; - d3d->SetRenderTarget(0, target); - d3d->SetDepthStencilSurface(surf); - d3d->SetViewport(&vp); - d3d->Clear(0, NULL, flags, 0, 1.0f, 0); - - if (target != gdraw->main_framebuffer) target->Release(); -} - -//////////////////////////////////////////////////////////////////////// -// -// Begin/end rendering of a tile and per-frame processing -// - -void gdraw_D3D_SetTileOrigin(IDirect3DSurface9* rt, IDirect3DSurface9* depth, - S32 x, S32 y) { - D3DSURFACE_DESC desc; - - if (gdraw->frame_done) { - ++gdraw->frame_counter; - gdraw->frame_done = false; - } - - rt->GetDesc(&desc); - - gdraw->main_framebuffer = rt; - gdraw->main_depthbuffer = depth; - gdraw->main_msaa = (desc.MultiSampleType != D3DMULTISAMPLE_NONE); - gdraw->vx = x; - gdraw->vy = y; -} - -static void RADLINK gdraw_SetViewSizeAndWorldScale(S32 w, S32 h, F32 scale_x, - F32 scale_y) { - memset(gdraw->frame, 0, sizeof(gdraw->frame)); - gdraw->cur = gdraw->frame; - gdraw->fw = w; - gdraw->fh = h; - gdraw->tw = w; - gdraw->th = h; - gdraw->world_to_pixel[0] = scale_x; - gdraw->world_to_pixel[1] = scale_y; - - set_viewport(); -} - -static void RADLINK gdraw_Set3DTransform(F32* mat) { - if (mat == NULL) - gdraw->use_3d = 0; - else { - gdraw->use_3d = 1; - memcpy(gdraw->xform_3d, mat, sizeof(gdraw->xform_3d)); - } -} - -// must include anything necessary for texture creation/update -static void RADLINK gdraw_RenderingBegin(void) {} -static void RADLINK gdraw_RenderingEnd(void) {} - -static void RADLINK gdraw_RenderTileBegin(S32 x0, S32 y0, S32 x1, S32 y1, - S32 pad, GDrawStats* stats) { - if (x0 == 0 && y0 == 0 && x1 == gdraw->fw && y1 == gdraw->fh) pad = 0; - - gdraw->tx0 = x0; - gdraw->ty0 = y0; - gdraw->tw = x1 - x0; - gdraw->th = y1 - y0; - - // padded region - gdraw->tx0p = RR_MAX(x0 - pad, 0); - gdraw->ty0p = RR_MAX(y0 - pad, 0); - gdraw->tpw = RR_MIN(x1 + pad, gdraw->fw) - gdraw->tx0p; - gdraw->tph = RR_MIN(y1 + pad, gdraw->fh) - gdraw->ty0p; - - // just record the max, but then when we texture from, we have to use - // sub-regions -- alternatively, each gdraw gets its own rendertargets - if (gdraw->tpw > gdraw->frametex_width || - gdraw->tph > gdraw->frametex_height) { - gdraw->frametex_width = RR_MAX(gdraw->tpw, gdraw->frametex_width); - gdraw->frametex_height = RR_MAX(gdraw->tph, gdraw->frametex_height); - - flush_rendertargets(stats); - } - - // clear our depth buffers - clear_zbuffer(gdraw->main_depthbuffer, D3DCLEAR_STENCIL | D3DCLEAR_ZBUFFER); - if (gdraw->rt_depthbuffer) - clear_zbuffer(gdraw->rt_depthbuffer, - D3DCLEAR_STENCIL | D3DCLEAR_ZBUFFER); - - // set our rendertarget - gdraw->d3d_device->SetRenderTarget(0, gdraw->main_framebuffer); - gdraw->d3d_device->SetDepthStencilSurface(gdraw->main_depthbuffer); - set_viewport(); - set_projection(); - set_common_renderstate(); -} - -static void RADLINK gdraw_RenderTileEnd(GDrawStats* /*stats*/) {} - -void gdraw_D3D_SetRendertargetSize(S32 w, S32 h) { - if (gdraw && (w != gdraw->frametex_width || h != gdraw->frametex_height)) { - GDrawStats stats = {0}; - gdraw->frametex_width = w; - gdraw->frametex_height = h; - flush_rendertargets(&stats); - } -} - -void gdraw_D3D_NoMoreGDrawThisFrame(void) { - clear_renderstate(); - if (gdraw->main_framebuffer) - gdraw->d3d_device->SetRenderTarget(0, gdraw->main_framebuffer); - if (gdraw->main_depthbuffer) - gdraw->d3d_device->SetDepthStencilSurface(gdraw->main_depthbuffer); - gdraw->frame_done = true; - - GDrawFence now = {gdraw->frame_counter}; - gdraw_HandleCacheTick(gdraw->texturecache, now); - gdraw_HandleCacheTick(gdraw->vbufcache, now); -} - -#define MAX_DEPTH_VALUE (1 << 13) - -static void RADLINK gdraw_GetInfo(GDrawInfo* d) { - D3DCAPS9 caps; - gdraw->d3d_device->GetDeviceCaps(&caps); - - d->num_stencil_bits = 8; - d->max_id = MAX_DEPTH_VALUE - 2; - // for floating point depth, just use mantissa, e.g. 16-20 bits - d->max_texture_size = RR_MIN(caps.MaxTextureWidth, caps.MaxTextureHeight); - d->buffer_format = GDRAW_BFORMAT_vbib; - d->shared_depth_stencil = 1; - d->always_mipmap = 1; - d->conditional_nonpow2 = - (caps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL) != 0; -} - -//////////////////////////////////////////////////////////////////////// -// -// Enable/disable rendertargets in stack fashion -// - -static void set_render_target(GDrawStats* stats) { - IDirect3DSurface9 *target = NULL, *depth = NULL; - - if (gdraw->cur->color_buffer) { - S32 need_depth; - need_depth = - (gdraw->cur->flags & (GDRAW_TEXTUREDRAWBUFFER_FLAGS_needs_id | - GDRAW_TEXTUREDRAWBUFFER_FLAGS_needs_stencil)); - - unbind_resources(); // to make sure this RT isn't accidentally set as a - // texture (avoid D3D warnings) - gdraw->cur->color_buffer->handle.tex.d3d->GetSurfaceLevel( - 0, &target); // if this fails, there's nothing to be done - if (need_depth) { - if (gdraw->main_msaa) - depth = get_rendertarget_depthbuffer( - stats); // @TODO: is this right? get_rt_depthbuffer doesn't - // seem to do MSAA - else { - // if tile is smaller than frametex, then trying to use the - // tile's zbuffer may not work - if (gdraw->tw < gdraw->frametex_width || - gdraw->th < gdraw->frametex_height) - depth = get_rendertarget_depthbuffer(stats); - else - depth = gdraw->main_depthbuffer; - } - } - } else { - target = gdraw->main_framebuffer; - depth = gdraw->main_depthbuffer; - } - - gdraw->d3d_device->SetRenderTarget(0, target); - gdraw->d3d_device->SetDepthStencilSurface(depth); - if (target != gdraw->main_framebuffer) target->Release(); - - stats->nonzero_flags |= GDRAW_STATS_rendtarg; - stats->rendertarget_changes += 1; -} - -static rrbool RADLINK gdraw_TextureDrawBufferBegin( - gswf_recti* region, gdraw_texture_format /*format*/, U32 flags, void* owner, - GDrawStats* stats) { - GDrawFramebufferState* n = gdraw->cur + 1; - GDrawHandle* t; - if (gdraw->tw == 0 || gdraw->th == 0) return false; - - if (n >= &gdraw->frame[MAX_RENDER_STACK_DEPTH]) { - IggyGDrawSendWarning( - NULL, "GDraw rendertarget nesting exceeds MAX_RENDER_STACK_DEPTH"); - return false; - } - - if (owner) { - S32 w = region->x1 - region->x0; - S32 h = region->y1 - region->y0; - - // allocate a texture handle and free enough texture space - t = gdraw_res_alloc_begin(gdraw->texturecache, w * h * 4, stats); - if (!t) - return false; - else { - IDirect3DTexture9* tex; - HRESULT hr = gdraw->d3d_device->CreateTexture( - w, h, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, - D3DPOOL_DEFAULT, &tex, NULL); - - if (FAILED(hr)) { - if (t) gdraw_HandleCacheAllocateFail(t); - IggyGDrawSendWarning(NULL, - "GDraw D3D error for CreateTexture for " - "cacheAsBitmap rendertarget: 0x%08x", - hr); - return false; - } - - stats->nonzero_flags |= GDRAW_STATS_alloc_tex; - stats->alloc_tex += 1; - stats->alloc_tex_bytes += w * h * 4; - - gdraw_HandleCacheAllocateEnd(t, w * h * 4, (void*)1, - GDRAW_HANDLE_STATE_locked); - } - } else { - t = get_color_rendertarget(stats); - if (!t) return false; - } - - n->flags = flags; - n->color_buffer = t; - assert(n->color_buffer != NULL); // @GDRAW_ASSERT - - ++gdraw->cur; - gdraw->cur->cached = owner != NULL; - if (owner) { - gdraw->cur->base_x = region->x0; - gdraw->cur->base_y = region->y0; - gdraw->cur->width = region->x1 - region->x0; - gdraw->cur->height = region->y1 - region->y0; - } - - set_render_target(stats); - assert(gdraw->frametex_width >= gdraw->tw && - gdraw->frametex_height >= gdraw->th); // @GDRAW_ASSERT - set_viewport(); - set_projection(); - - int k = (int)(t - gdraw->rendertargets.handle); - - if (region) { - D3DRECT r; - S32 ox, oy, pad = 2; // 2 pixels of border on all sides - // 1 pixel turns out to be not quite enough with the interpolator - // precision we get. - - if (gdraw->in_blur) - ox = oy = 0; - else - ox = gdraw->tx0p, oy = gdraw->ty0p; - - // clamp region to tile - S32 xt0 = RR_MAX(region->x0 - ox, 0); - S32 yt0 = RR_MAX(region->y0 - oy, 0); - S32 xt1 = RR_MIN(region->x1 - ox, gdraw->tpw); - S32 yt1 = RR_MIN(region->y1 - oy, gdraw->tph); - - // but the padding needs to clamp to render target bounds - r.x1 = RR_MAX(xt0 - pad, 0); - r.y1 = RR_MAX(yt0 - pad, 0); - r.x2 = RR_MIN(xt1 + pad, gdraw->frametex_width); - r.y2 = RR_MIN(yt1 + pad, gdraw->frametex_height); - - if (r.x2 <= r.x1 || - r.y2 <= r.y1) { // region doesn't intersect with current tile - --gdraw->cur; - gdraw_FreeTexture((GDrawTexture*)t, 0, stats); - // note: don't send a warning since this will happen during regular - // tiled rendering - return false; - } - - gdraw->d3d_device->Clear(1, &r, D3DCLEAR_TARGET, 0, 1, 0); - gdraw->rt_valid[k].x0 = xt0; - gdraw->rt_valid[k].y0 = yt0; - gdraw->rt_valid[k].x1 = xt1; - gdraw->rt_valid[k].y1 = yt1; - } else { - gdraw->d3d_device->Clear(0, NULL, D3DCLEAR_TARGET, 0, 1, 0); - gdraw->rt_valid[k].x0 = 0; - gdraw->rt_valid[k].y0 = 0; - gdraw->rt_valid[k].x1 = gdraw->frametex_width; - gdraw->rt_valid[k].y1 = gdraw->frametex_height; - } - - return true; -} - -static GDrawTexture* RADLINK gdraw_TextureDrawBufferEnd(GDrawStats* stats) { - GDrawFramebufferState* n = gdraw->cur; - GDrawFramebufferState* m = --gdraw->cur; - - if (gdraw->tw == 0 || gdraw->th == 0) return 0; - - if (n >= &gdraw->frame[MAX_RENDER_STACK_DEPTH]) - return 0; // already returned a warning in Begin - - assert(m >= gdraw->frame); // bug in Iggy -- unbalanced - - if (m != gdraw->frame) { - assert(m->color_buffer != NULL); // @GDRAW_ASSERT - } - assert(n->color_buffer != NULL); // @GDRAW_ASSERT - - // switch back to old render target - set_render_target(stats); - - // if we're at the root, set the viewport back - set_viewport(); - set_projection(); - - return (GDrawTexture*)n->color_buffer; -} - -//////////////////////////////////////////////////////////////////////// -// -// Clear stencil/depth buffers -// -// Open question whether we'd be better off finding bounding boxes -// and only clearing those; it depends exactly how fast clearing works. -// - -static void clear_renderstate_acceleration_cache(void) { - gdraw->last_was_3d = false; - gdraw->scissor_state = ~0u; - gdraw->stencil_key = 0; - gdraw->blend_mode = ~0u; -} - -static void do_screen_quad(gswf_recti* s, F32* tc, GDrawStats* stats); - -static void RADLINK gdraw_ClearStencilBits(U32 bits) { - IDirect3DDevice9* d3d = gdraw->d3d_device; - F32 texcoord[8] = {0}; - GDrawStats stats = {0}; - gswf_recti region; - - region.x0 = 0; - region.y0 = 0; - region.x1 = gdraw->frametex_width; - region.y1 = gdraw->frametex_height; - - d3d->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - d3d->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); - d3d->SetRenderState(D3DRS_STENCILWRITEMASK, bits); - d3d->SetRenderState(D3DRS_STENCILENABLE, TRUE); - // fewest states to force it to always write: make the stencil test always - // fail - d3d->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_NEVER); - d3d->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_REPLACE); - d3d->SetRenderState(D3DRS_STENCILREF, 0); - d3d->SetRenderState(D3DRS_COLORWRITEENABLE, FALSE); - d3d->SetRenderState(D3DRS_ZENABLE, FALSE); - d3d->SetRenderState(D3DRS_ZFUNC, FALSE); - d3d->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); - - d3d->SetPixelShader(gdraw->manual_clear.pshader); - do_screen_quad(®ion, texcoord, &stats); - - // restore state from set_common_renderstate - d3d->SetRenderState(D3DRS_STENCILFAIL, D3DSTENCILOP_KEEP); - d3d->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_EQUAL); - d3d->SetRenderState(D3DRS_STENCILREF, 255); - - // make next renderstate reset other state - clear_renderstate_acceleration_cache(); - - // reset matrices et al - set_render_target(&stats); - set_viewport(); - set_projection(); -} - -// this only happens rarely (hopefully never) if we use the depth buffer, -// so we can just clear the whole thing -static void RADLINK gdraw_ClearID(void) { - GDrawStats stats = {0}; - - clear_zbuffer(gdraw->main_depthbuffer, D3DCLEAR_ZBUFFER); - set_render_target(&stats); - set_viewport(); - set_projection(); -} - -//////////////////////////////////////////////////////////////////////// -// -// Set all the render state from GDrawRenderState -// -// This also is responsible for getting the framebuffer into a texture -// if the read-modify-write blend operation can't be expressed with -// the native blend operators. (E.g. "screen") -// - -// convert an ID request to a value suitable for the depth buffer, -// assuming the depth buffer has been mappped to 0..1 -static F32 depth_from_id(S32 id) { - return 1.0f - ((F32)id + 1.0f) / MAX_DEPTH_VALUE; -} - -static void set_texture(S32 texunit, GDrawTexture* tex) { - if (texunit >= 0) - set_d3d_texture(texunit, ((GDrawHandle*)tex)->handle.tex.d3d, - GDRAW_WRAP_clamp, 0); -} - -static int set_renderstate_full(S32 vertex_format, GDrawRenderState* r, - GDrawStats* /*stats*/) { - IDirect3DDevice9* d3d = gdraw->d3d_device; - U32 stencil_key, z_key; - F32 depth = depth_from_id(r->id); - VertexVars vvars; - int vvarcount = VVAR_count_world_xoff; - - // set vertex shader - d3d->SetVertexShader(gdraw->vert[vertex_format].vshader); - - // set vertex shader constants - if (!r->use_world_space) - gdraw_ObjectSpace(vvars.world[0], r->o2w, depth, 0.0f); - else - gdraw_WorldSpace(vvars.world[0], gdraw->world_to_pixel, depth, 0.0f); - - memcpy(&vvars.x_off, r->edge_matrix, 4 * sizeof(F32)); - - if (r->texgen0_enabled) { - memcpy(&vvars.texgen_s, r->s0_texgen, 4 * sizeof(F32)); - memcpy(&vvars.texgen_t, r->t0_texgen, 4 * sizeof(F32)); - vvarcount = VVAR_count; - } - - if (gdraw->use_3d || gdraw->last_was_3d) { - if (gdraw->use_3d) { - vvarcount = VVAR_count3d; - memcpy(&vvars.viewproj, gdraw->xform_3d, 12 * sizeof(F32)); - } else - set_projection_base(); - gdraw->last_was_3d = gdraw->use_3d; - } - - d3d->SetVertexShaderConstantF(0, vvars.world[0], vvarcount); - - // set the blend mode - int blend_mode = r->blend_mode; - int tex0mode = r->tex0_mode; - - static struct gdraw_d3d_blendspec { - BOOL enable; - D3DBLEND src; - D3DBLEND dest; - } blends[ASSERT_COUNT(GDRAW_BLEND__count, 6)] = { - FALSE, - D3DBLEND_ONE, - D3DBLEND_ZERO, // GDRAW_BLEND_none - TRUE, - D3DBLEND_ONE, - D3DBLEND_INVSRCALPHA, // GDRAW_BLEND_alpha - TRUE, - D3DBLEND_DESTCOLOR, - D3DBLEND_INVSRCALPHA, // GDRAW_BLEND_multiply - TRUE, - D3DBLEND_ONE, - D3DBLEND_ONE, // GDRAW_BLEND_add - - FALSE, - D3DBLEND_ONE, - D3DBLEND_ZERO, // GDRAW_BLEND_filter - FALSE, - D3DBLEND_ONE, - D3DBLEND_ZERO, // GDRAW_BLEND_special - }; - assert(blend_mode >= 0 && blend_mode < sizeof(blends) / sizeof(*blends)); - - if (blend_mode != gdraw->blend_mode) { - gdraw->blend_mode = blend_mode; - if (blends[blend_mode].enable) { - d3d->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); - d3d->SetRenderState(D3DRS_SRCBLEND, blends[blend_mode].src); - d3d->SetRenderState(D3DRS_DESTBLEND, blends[blend_mode].dest); - } else - d3d->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - } - - // set the pixel shader - IDirect3DPixelShader9* pshader; - if (blend_mode != GDRAW_BLEND_special) { - assert(tex0mode >= 0 && - tex0mode < sizeof(gdraw->fprog) / sizeof(*gdraw->fprog)); - - int additive = 0; - if (r->cxf_add) { - additive = 1; - if (r->cxf_add[3]) additive = 2; - } - - pshader = gdraw->fprog[tex0mode][additive].pshader; - } else - pshader = gdraw->exceptional_blend[r->special_blend].pshader; - - d3d->SetPixelShader(pshader); - - // set textures - if (tex0mode != GDRAW_TEXTURE_none) { - if (!r->tex[0]) return 0; - set_d3d_texture(0, ((GDrawHandle*)r->tex[0])->handle.tex.d3d, r->wrap0, - r->nearest0); - } - - // set pixel shader constants - d3d->SetPixelShaderConstantF(PVAR_cmul, r->color, 1); - - if (r->cxf_add) { - F32 temp[4] = {r->cxf_add[0] / 255.0f, r->cxf_add[1] / 255.0f, - r->cxf_add[2] / 255.0f, r->cxf_add[3] / 255.0f}; - d3d->SetPixelShaderConstantF(PVAR_cadd, temp, 1); - } - - if (tex0mode == GDRAW_TEXTURE_focal_gradient) - d3d->SetPixelShaderConstantF(PVAR_focal, r->focal_point, 1); - - // Set pixel operation states - gdraw->scissor_state = ~0u; - if (r->scissor) { - RECT s; - gdraw->scissor_state = r->scissor; - if (gdraw->cur == gdraw->frame) { - s.left = r->scissor_rect.x0 + gdraw->vx - gdraw->tx0; - s.top = r->scissor_rect.y0 + gdraw->vy - gdraw->ty0; - s.right = r->scissor_rect.x1 + gdraw->vx - gdraw->tx0; - s.bottom = r->scissor_rect.y1 + gdraw->vy - gdraw->ty0; - } else { - s.left = r->scissor_rect.x0 - gdraw->tx0p; - s.top = r->scissor_rect.y0 - gdraw->ty0p; - s.right = r->scissor_rect.x1 - gdraw->tx0p; - s.bottom = r->scissor_rect.y1 - gdraw->ty0p; - } - d3d->SetScissorRect(&s); - d3d->SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE); - } else { - if (r->scissor != gdraw->scissor_state) { - gdraw->scissor_state = r->scissor; - d3d->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); - } - } - - // stencil changed? - stencil_key = r->stencil_test | (r->stencil_set << 8); - if (stencil_key != gdraw->stencil_key) { - gdraw->stencil_key = stencil_key; - - d3d->SetRenderState(D3DRS_STENCILMASK, r->stencil_test); - d3d->SetRenderState(D3DRS_STENCILWRITEMASK, r->stencil_set); - d3d->SetRenderState(D3DRS_STENCILENABLE, - (r->stencil_set | r->stencil_test) != 0); - d3d->SetRenderState(D3DRS_COLORWRITEENABLE, r->stencil_set ? 0x0 : 0xf); - } - - // z key - z_key = r->set_id | (r->test_id << 1); - if (z_key != gdraw->z_key) { - gdraw->z_key = z_key; - d3d->SetRenderState( - D3DRS_ZENABLE, (r->test_id | r->set_id) ? D3DZB_TRUE : D3DZB_FALSE); - d3d->SetRenderState(D3DRS_ZFUNC, - r->test_id ? D3DCMP_LESS : D3DCMP_ALWAYS); - d3d->SetRenderState(D3DRS_ZWRITEENABLE, r->set_id); - } - - return 1; -} - -static RADINLINE int set_renderstate(S32 vertex_format, GDrawRenderState* r, - GDrawStats* stats) { - if (r->identical_state) { - // fast path: only need to change vertex shader, other state is the same - gdraw->d3d_device->SetVertexShader(gdraw->vert[vertex_format].vshader); - return 1; - } else - return set_renderstate_full(vertex_format, r, stats); -} - -//////////////////////////////////////////////////////////////////////// -// -// Vertex formats -// - -static D3DVERTEXELEMENT9 vformat_v2[] = { - {0, 0, D3DDECLTYPE_FLOAT2, 0, D3DDECLUSAGE_POSITION, 0}, D3DDECL_END()}; - -static D3DVERTEXELEMENT9 vformat_v2aa[] = { - {0, 0, D3DDECLTYPE_FLOAT2, 0, D3DDECLUSAGE_POSITION, 0}, - {0, 8, D3DDECLTYPE_SHORT4, 0, D3DDECLUSAGE_TEXCOORD, 0}, - D3DDECL_END()}; - -static D3DVERTEXELEMENT9 vformat_v2tc2[] = { - {0, 0, D3DDECLTYPE_FLOAT2, 0, D3DDECLUSAGE_POSITION, 0}, - {0, 8, D3DDECLTYPE_FLOAT2, 0, D3DDECLUSAGE_TEXCOORD, 0}, - D3DDECL_END()}; - -static D3DVERTEXELEMENT9* vformats[ASSERT_COUNT(GDRAW_vformat__count, 3)] = { - vformat_v2, // GDRAW_vformat_v2 - vformat_v2aa, // GDRAW_vformat_v2aa - vformat_v2tc2, // GDRAW_vformat_v2tc2 -}; - -static int vertsize[ASSERT_COUNT(GDRAW_vformat__count, 3)] = { - 8, // GDRAW_vformat_v2 - 16, // GDRAW_vformat_v2aa - 16, // GDRAW_vformat_v2tc2 -}; - -//////////////////////////////////////////////////////////////////////// -// -// Draw triangles with a given renderstate -// - -static void tag_resources(void* r1, void* r2 = NULL, void* r3 = NULL, - void* r4 = NULL) { - U64 now = gdraw->frame_counter; - if (r1) ((GDrawHandle*)r1)->fence.value = now; - if (r2) ((GDrawHandle*)r2)->fence.value = now; - if (r3) ((GDrawHandle*)r3)->fence.value = now; - if (r4) ((GDrawHandle*)r4)->fence.value = now; -} - -static void RADLINK gdraw_DrawIndexedTriangles(GDrawRenderState* r, - GDrawPrimitive* p, - GDrawVertexBuffer* buf, - GDrawStats* stats) { - GDrawHandle* vb = (GDrawHandle*)buf; - int vfmt = p->vertex_format; - assert(vfmt >= 0 && vfmt < GDRAW_vformat__count); - - if (!set_renderstate(vfmt, r, stats)) return; - - gdraw->d3d_device->SetVertexDeclaration(gdraw->vdec[vfmt]); - - if (vb) { - gdraw->d3d_device->SetIndices(vb->handle.vbuf.indices); - gdraw->d3d_device->SetStreamSource( - 0, vb->handle.vbuf.base, (U32)(UINTa)p->vertices, vertsize[vfmt]); - - gdraw->d3d_device->DrawIndexedPrimitive( - D3DPT_TRIANGLELIST, 0, 0, p->num_vertices, - (U32)((UINTa)p->indices) >> 1, p->num_indices / 3); - - gdraw->d3d_device->SetStreamSource(0, 0, 0, 0); - gdraw->d3d_device->SetIndices(0); - } else if (p->indices) { - gdraw->d3d_device->DrawIndexedPrimitiveUP( - D3DPT_TRIANGLELIST, 0, p->num_vertices, p->num_indices / 3, - p->indices, D3DFMT_INDEX16, p->vertices, vertsize[vfmt]); - } else { // dynamic quads - assert(p->num_vertices % 4 == 0); - UINT stride = vertsize[vfmt]; - S32 pos = 0; - while (pos < p->num_vertices) { - S32 vert_count = RR_MIN(p->num_vertices - pos, QUAD_IB_COUNT * 4); - gdraw->d3d_device->DrawIndexedPrimitiveUP( - D3DPT_TRIANGLELIST, 0, vert_count, (vert_count / 4) * 2, - quad_ib, D3DFMT_INDEX16, (U8*)p->vertices + pos * stride, - stride); - pos += vert_count; - } - } - - tag_resources(vb, r->tex[0], r->tex[1]); - - stats->nonzero_flags |= GDRAW_STATS_batches; - stats->num_batches += 1; - stats->drawn_indices += p->num_indices; - stats->drawn_vertices += p->num_vertices; -} - -/////////////////////////////////////////////////////////////////////// -// -// Flash 8 filter effects -// - -static void set_pixel_constant(S32 constant, F32 x, F32 y, F32 z, F32 w) { - if (constant >= 0) { - F32 value[4] = {x, y, z, w}; - gdraw->d3d_device->SetPixelShaderConstantF(constant, value, 1); - } -} - -// caller sets up texture coordinates -static void do_screen_quad(gswf_recti* s, F32* tc, GDrawStats* stats) { - F32 px0 = (F32)s->x0, py0 = (F32)s->y0, px1 = (F32)s->x1, py1 = (F32)s->y1; - gswf_vertex_xyst vert[4]; - VertexVars vvars; - - // interleave the data so we can use UP - vert[0].x = px0; - vert[0].y = py0; - vert[0].s = tc[0]; - vert[0].t = tc[1]; - vert[1].x = px1; - vert[1].y = py0; - vert[1].s = tc[2]; - vert[1].t = tc[1]; - vert[2].x = px1; - vert[2].y = py1; - vert[2].s = tc[2]; - vert[2].t = tc[3]; - vert[3].x = px0; - vert[3].y = py1; - vert[3].s = tc[0]; - vert[3].t = tc[3]; - - gdraw_PixelSpace(vvars.world[0]); - - gdraw->d3d_device->SetVertexDeclaration(gdraw->vdec[GDRAW_vformat_v2tc2]); - gdraw->d3d_device->SetVertexShader( - gdraw->vert[GDRAW_vformat_v2tc2].vshader); - gdraw->d3d_device->SetVertexShaderConstantF(0, vvars.world[0], - VVAR_count_worldonly); - gdraw->d3d_device->DrawPrimitiveUP(D3DPT_TRIANGLEFAN, 2, vert, 16); - - stats->nonzero_flags |= GDRAW_STATS_batches; - stats->num_batches += 1; - stats->drawn_indices += 6; - stats->drawn_vertices += 4; -} - -static void gdraw_DriverBlurPass(GDrawRenderState* r, int taps, float* data, - gswf_recti* s, float* tc, float /*height_max*/, - float* clamp, GDrawStats* gstats) { - ProgramWithCachedVariableLocations* prg = &gdraw->blur_prog[taps]; - gdraw->d3d_device->SetPixelShader(prg->pshader); - set_texture(prg->vars[VAR_blur_tex0], r->tex[0]); - - assert(prg->vars[VAR_blur_tap] >= 0); - gdraw->d3d_device->SetPixelShaderConstantF(prg->vars[VAR_blur_tap], data, - taps); - gdraw->d3d_device->SetPixelShaderConstantF(prg->vars[VAR_blur_clampv], - clamp, 1); - - do_screen_quad(s, tc, gstats); - tag_resources(r->tex[0]); -} - -static void gdraw_Colormatrix(GDrawRenderState* r, gswf_recti* s, float* tc, - GDrawStats* stats) { - if (!gdraw_TextureDrawBufferBegin( - s, GDRAW_TEXTURE_FORMAT_rgba32, - GDRAW_TEXTUREDRAWBUFFER_FLAGS_needs_color | - GDRAW_TEXTUREDRAWBUFFER_FLAGS_needs_alpha, - 0, stats)) - return; - - gdraw->d3d_device->SetPixelShader(gdraw->colormatrix.pshader); - set_texture(gdraw->colormatrix.vars[VAR_colormatrix_tex0], r->tex[0]); - gdraw->d3d_device->SetPixelShaderConstantF( - gdraw->colormatrix.vars[VAR_colormatrix_data], r->shader_data, 5); - do_screen_quad(s, tc, stats); - tag_resources(r->tex[0]); - r->tex[0] = gdraw_TextureDrawBufferEnd(stats); -} - -static gswf_recti* get_valid_rect(GDrawTexture* tex) { - GDrawHandle* h = (GDrawHandle*)tex; - S32 n = (S32)(h - gdraw->rendertargets.handle); - assert(n >= 0 && n <= MAX_RENDER_STACK_DEPTH + 1); - return &gdraw->rt_valid[n]; -} - -static void set_clamp_constant(int constant, GDrawTexture* tex) { - gswf_recti* s = get_valid_rect(tex); - // when we make the valid data, we make sure there is an extra empty pixel - // at the border - set_pixel_constant(constant, (s->x0 - 0.5f) / gdraw->frametex_width, - (s->y0 - 0.5f) / gdraw->frametex_height, - (s->x1 + 0.5f) / gdraw->frametex_width, - (s->y1 + 0.5f) / gdraw->frametex_height); -} - -static void gdraw_Filter(GDrawRenderState* r, gswf_recti* s, float* tc, - int isbevel, GDrawStats* stats) { - ProgramWithCachedVariableLocations* prg = - &gdraw->filter_prog[isbevel][r->filter_mode]; - - if (!gdraw_TextureDrawBufferBegin( - s, GDRAW_TEXTURE_FORMAT_rgba32, - GDRAW_TEXTUREDRAWBUFFER_FLAGS_needs_color | - GDRAW_TEXTUREDRAWBUFFER_FLAGS_needs_alpha, - NULL, stats)) - return; - - gdraw->d3d_device->SetPixelShader(prg->pshader); - set_texture(prg->vars[VAR_filter_tex0], r->tex[0]); - set_texture(prg->vars[VAR_filter_tex1], r->tex[1]); - set_texture(prg->vars[VAR_filter_tex2], r->tex[2]); - - set_pixel_constant(prg->vars[VAR_filter_color], r->shader_data[0], - r->shader_data[1], r->shader_data[2], r->shader_data[3]); - set_pixel_constant(prg->vars[VAR_filter_tc_off], - -r->shader_data[4] / (F32)gdraw->frametex_width, - -r->shader_data[5] / (F32)gdraw->frametex_height, - r->shader_data[6], 0); - set_pixel_constant(prg->vars[VAR_filter_color2], r->shader_data[8], - r->shader_data[9], r->shader_data[10], - r->shader_data[11]); - set_clamp_constant(prg->vars[VAR_filter_clamp0], r->tex[0]); - set_clamp_constant(prg->vars[VAR_filter_clamp1], r->tex[1]); - - do_screen_quad(s, tc, stats); - tag_resources(r->tex[0], r->tex[1], r->tex[2]); - r->tex[0] = gdraw_TextureDrawBufferEnd(stats); -} - -static void RADLINK gdraw_FilterQuad(GDrawRenderState* r, S32 x0, S32 y0, - S32 x1, S32 y1, GDrawStats* stats) { - IDirect3DDevice9* d3d = gdraw->d3d_device; - F32 tc[4]; - gswf_recti s; - - // clip to tile boundaries - s.x0 = RR_MAX(x0, gdraw->tx0p); - s.y0 = RR_MAX(y0, gdraw->ty0p); - s.x1 = RR_MIN(x1, gdraw->tx0p + gdraw->tpw); - s.y1 = RR_MIN(y1, gdraw->ty0p + gdraw->tph); - if (s.x1 < s.x0 || s.y1 < s.y0) return; - - tc[0] = (s.x0 - gdraw->tx0p) / (F32)gdraw->frametex_width; - tc[1] = (s.y0 - gdraw->ty0p) / (F32)gdraw->frametex_height; - tc[2] = (s.x1 - gdraw->tx0p) / (F32)gdraw->frametex_width; - tc[3] = (s.y1 - gdraw->ty0p) / (F32)gdraw->frametex_height; - - // clear to known render state - d3d->SetRenderState(D3DRS_STENCILENABLE, FALSE); - d3d->SetRenderState(D3DRS_COLORWRITEENABLE, 0xf); - - d3d->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); - d3d->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS); - d3d->SetRenderState(D3DRS_ZWRITEENABLE, FALSE); - - d3d->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); - d3d->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); - - gdraw->scissor_state = 0; - gdraw->blend_mode = GDRAW_BLEND_none; - gdraw->stencil_key = 0; - gdraw->z_key = 0; - - if (r->blend_mode == GDRAW_BLEND_filter) { - switch (r->filter) { - case GDRAW_FILTER_blur: { - GDrawBlurInfo b; - gswf_recti bounds = *get_valid_rect(r->tex[0]); - gdraw_ShiftRect(&s, &s, -gdraw->tx0p, - -gdraw->ty0p); // blur uses physical - // rendertarget coordinates - - b.BlurPass = gdraw_DriverBlurPass; - b.w = gdraw->tpw; - b.h = gdraw->tph; - b.frametex_width = gdraw->frametex_width; - b.frametex_height = gdraw->frametex_height; - - // blur needs to draw with multiple passes, so set up special - // state - gdraw->in_blur = true; - set_viewport_raw(0, 0, gdraw->tpw, gdraw->tph); - set_projection_raw(0, gdraw->tpw, gdraw->tph, 0); - - // do the blur - gdraw_Blur(&gdraw_funcs, &b, r, &s, &bounds, stats); - - // restore the normal state - gdraw->in_blur = false; - set_viewport(); - set_projection(); - break; - } - - case GDRAW_FILTER_colormatrix: - gdraw_Colormatrix(r, &s, tc, stats); - break; - - case GDRAW_FILTER_dropshadow: - gdraw_Filter(r, &s, tc, 0, stats); - break; - - case GDRAW_FILTER_bevel: - gdraw_Filter(r, &s, tc, 1, stats); - break; - - default: - assert(0); - } - } else { - GDrawHandle* blend_tex = NULL; - static S16 zero[4] = {0, 0, 0, 0}; - - // for crazy blend modes, we need to read back from the framebuffer - // and do the blending in the pixel shader. we do this with StretchRect - // rather than trying to render-to-texture-all-along, because we want - // to be able to render over the user's existing framebuffer, which - // might not be a texture. note that this causes MSAA issues! - if (r->blend_mode == GDRAW_BLEND_special && - (blend_tex = get_color_rendertarget(stats)) != NULL) { - IDirect3DSurface9* src; - HRESULT hr = d3d->GetRenderTarget(0, &src); - if (!FAILED(hr)) { - IDirect3DSurface9* dest; - hr = blend_tex->handle.tex.d3d->GetSurfaceLevel(0, &dest); - if (!FAILED(hr)) { - RECT drect = {0, 0, gdraw->tpw, gdraw->tph}; - RECT srect; - - if (gdraw->cur != gdraw->frame) - srect = drect; - else { - srect.left = gdraw->vx; - srect.top = gdraw->vy; - srect.right = gdraw->vx + gdraw->tw; - srect.bottom = gdraw->vy + gdraw->th; - drect.left = gdraw->tx0 - gdraw->tx0p; - drect.top = gdraw->ty0 - gdraw->ty0p; - drect.right = drect.left + gdraw->tw; - drect.bottom = drect.top + gdraw->th; - } - - d3d->StretchRect(src, &srect, dest, &drect, D3DTEXF_POINT); - dest->Release(); - - stats->nonzero_flags |= GDRAW_STATS_blits; - stats->num_blits += 1; - stats->num_blit_pixels += - (srect.right - srect.left) * (srect.bottom - srect.top); - } - - src->Release(); - } - - set_texture(1, (GDrawTexture*)blend_tex); - // make sure we set color_add, because the shader reads it - if (!r->cxf_add) r->cxf_add = zero; - } - - if (!set_renderstate(GDRAW_vformat_v2tc2, r, stats)) return; - - do_screen_quad(&s, tc, stats); - tag_resources(r->tex[0], r->tex[1]); - if (blend_tex) gdraw_FreeTexture((GDrawTexture*)blend_tex, 0, stats); - } -} - -/////////////////////////////////////////////////////////////////////// -// -// Shaders -// - -#include "gdraw_d3d9_shaders.inl" - -static void create_pixel_shader(ProgramWithCachedVariableLocations* p, - ProgramWithCachedVariableLocations* src) { - *p = *src; - if (p->bytecode) { - HRESULT hr = - gdraw->d3d_device->CreatePixelShader(p->bytecode, &p->pshader); - if (FAILED(hr)) { - IggyGDrawSendWarning( - NULL, "GDraw D3D error creating pixel shader: 0x%08x", hr); - p->pshader = NULL; - } - } -} - -static void create_vertex_shader(ProgramWithCachedVariableLocations* p, - ProgramWithCachedVariableLocations* src) { - *p = *src; - if (p->bytecode) { - HRESULT hr = - gdraw->d3d_device->CreateVertexShader(p->bytecode, &p->vshader); - if (FAILED(hr)) { - IggyGDrawSendWarning( - NULL, "GDraw D3D error creating vertex shader: 0x%08x", hr); - p->vshader = NULL; - } - } -} - -static void destroy_shader(ProgramWithCachedVariableLocations* p) { - safe_release(p->pshader); -} - -static void create_all_shaders(void) { - S32 i; - - for (i = 0; i < GDRAW_TEXTURE__count * 3; ++i) - create_pixel_shader(&gdraw->fprog[0][i], pshader_basic_arr + i); - for (i = 0; i < GDRAW_BLENDSPECIAL__count; ++i) - create_pixel_shader(&gdraw->exceptional_blend[i], - pshader_exceptional_blend_arr + i); - for (i = 0; i < 32; ++i) - create_pixel_shader(&gdraw->filter_prog[0][i], pshader_filter_arr + i); - for (i = 0; i < MAX_TAPS + 1; ++i) - create_pixel_shader(&gdraw->blur_prog[i], pshader_blur_arr + i); - create_pixel_shader(&gdraw->colormatrix, pshader_color_matrix_arr); - create_pixel_shader(&gdraw->manual_clear, pshader_manual_clear_arr); - - for (i = 0; i < GDRAW_vformat__count; i++) { - HRESULT hr = gdraw->d3d_device->CreateVertexDeclaration( - vformats[i], &gdraw->vdec[i]); - if (FAILED(hr)) - IggyGDrawSendWarning( - NULL, "GDraw D3D error in CreateVertexDeclaration: 0x%08x", hr); - - create_vertex_shader(&gdraw->vert[i], vshader_vsd3d9_arr + i); - } -} - -static void destroy_all_shaders() { - S32 i; - - for (i = 0; i < GDRAW_TEXTURE__count * 3; ++i) - destroy_shader(&gdraw->fprog[0][i]); - for (i = 0; i < GDRAW_BLENDSPECIAL__count; ++i) - destroy_shader(&gdraw->exceptional_blend[i]); - for (i = 0; i < 32; ++i) destroy_shader(&gdraw->filter_prog[0][i]); - for (i = 0; i < MAX_TAPS + 1; ++i) destroy_shader(&gdraw->blur_prog[i]); - destroy_shader(&gdraw->colormatrix); - - for (i = 0; i < GDRAW_vformat__count; i++) { - if (gdraw->vdec[i]) { - gdraw->vdec[i]->Release(); - gdraw->vdec[i] = 0; - } - destroy_shader(&gdraw->vert[i]); - } -} - -//////////////////////////////////////////////////////////////////////// -// -// Create and tear-down the state -// - -typedef struct { - S32 num_handles; - S32 num_bytes; -} GDrawResourceLimit; - -// These are the defaults limits used by GDraw unless the user specifies -// something else. -static GDrawResourceLimit - gdraw_limits[ASSERT_COUNT(GDRAW_D3D_RESOURCE__count, 3)] = { - MAX_RENDER_STACK_DEPTH + 1, - 16 * 1024 * 1024, // GDRAW_D3D_RESOURCE_rendertarget - 500, - 16 * 1024 * 1024, // GDRAW_D3D_RESOURCE_texture - 1000, - 2 * 1024 * 1024, // GDRAW_D3D_RESOURCE_vertexbuffer -}; - -static GDrawHandleCache* make_handle_cache(gdraw_d3d_resourcetype type) { - S32 num_handles = gdraw_limits[type].num_handles; - S32 num_bytes = gdraw_limits[type].num_bytes; - GDrawHandleCache* cache = (GDrawHandleCache*)IggyGDrawMalloc( - sizeof(GDrawHandleCache) + (num_handles - 1) * sizeof(GDrawHandle)); - if (cache) { - gdraw_HandleCacheInit(cache, num_handles, num_bytes); - cache->is_vertex = (type == GDRAW_D3D_RESOURCE_vertexbuffer); - } - - return cache; -} - -static void free_gdraw() { - if (!gdraw) return; - if (gdraw->texturecache) IggyGDrawFree(gdraw->texturecache); - if (gdraw->vbufcache) IggyGDrawFree(gdraw->vbufcache); - IggyGDrawFree(gdraw); - gdraw = NULL; -} - -int gdraw_D3D_SetResourceLimits(gdraw_d3d_resourcetype type, S32 num_handles, - S32 num_bytes) { - GDrawStats stats = {0}; - - if (type == GDRAW_D3D_RESOURCE_rendertarget) // RT count is small and space - // is preallocated - num_handles = MAX_RENDER_STACK_DEPTH + 1; - - assert(type >= GDRAW_D3D_RESOURCE_rendertarget && - type < GDRAW_D3D_RESOURCE__count); - assert(num_handles >= 0); - assert(num_bytes >= 0); - - // nothing to do if the values are unchanged - if (gdraw_limits[type].num_handles == num_handles && - gdraw_limits[type].num_bytes == num_bytes) - return 1; - - gdraw_limits[type].num_handles = num_handles; - gdraw_limits[type].num_bytes = num_bytes; - - // if no gdraw context created, there's nothing to worry about - if (!gdraw) return 1; - - // resize the appropriate pool - switch (type) { - case GDRAW_D3D_RESOURCE_rendertarget: - flush_rendertargets(&stats); - gdraw_HandleCacheInit(&gdraw->rendertargets, num_handles, - num_bytes); - return 1; - - case GDRAW_D3D_RESOURCE_texture: - if (gdraw->texturecache) { - gdraw_res_flush(gdraw->texturecache, &stats); - IggyGDrawFree(gdraw->texturecache); - } - gdraw->texturecache = make_handle_cache(GDRAW_D3D_RESOURCE_texture); - return gdraw->texturecache != NULL; - - case GDRAW_D3D_RESOURCE_vertexbuffer: - if (gdraw->vbufcache) { - gdraw_res_flush(gdraw->vbufcache, &stats); - IggyGDrawFree(gdraw->vbufcache); - } - gdraw->vbufcache = - make_handle_cache(GDRAW_D3D_RESOURCE_vertexbuffer); - return gdraw->vbufcache != NULL; - - default: - return 0; - } -} - -GDrawFunctions* gdraw_D3D_CreateContext(IDirect3DDevice9* dev, S32 w, S32 h) { - gdraw = (GDraw*)IggyGDrawMalloc(sizeof(*gdraw)); - if (!gdraw) return NULL; - - memset(gdraw, 0, sizeof(*gdraw)); - - gdraw->frametex_width = w; - gdraw->frametex_height = h; - - gdraw->texturecache = make_handle_cache(GDRAW_D3D_RESOURCE_texture); - gdraw->vbufcache = make_handle_cache(GDRAW_D3D_RESOURCE_vertexbuffer); - gdraw_HandleCacheInit( - &gdraw->rendertargets, - gdraw_limits[GDRAW_D3D_RESOURCE_rendertarget].num_handles, - gdraw_limits[GDRAW_D3D_RESOURCE_rendertarget].num_bytes); - - if (!gdraw->texturecache || !gdraw->vbufcache) { - free_gdraw(); - return NULL; - } - - if (!quad_ib[1]) { - // initialize quad index buffer - for (U16 i = 0; i < QUAD_IB_COUNT; i++) { - quad_ib[i * 6 + 0] = i * 4 + 0; - quad_ib[i * 6 + 1] = i * 4 + 1; - quad_ib[i * 6 + 2] = i * 4 + 2; - quad_ib[i * 6 + 3] = i * 4 + 0; - quad_ib[i * 6 + 4] = i * 4 + 2; - quad_ib[i * 6 + 5] = i * 4 + 3; - } - } - - D3DCAPS9 caps; - dev->GetDeviceCaps(&caps); - gdraw->conditional_nonpow2 = - ((caps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL) != 0); - - gdraw->d3d_device = dev; - create_all_shaders(); - - gdraw_funcs.SetViewSizeAndWorldScale = gdraw_SetViewSizeAndWorldScale; - gdraw_funcs.GetInfo = gdraw_GetInfo; - - gdraw_funcs.DescribeTexture = gdraw_DescribeTexture; - gdraw_funcs.DescribeVertexBuffer = gdraw_DescribeVertexBuffer; - - gdraw_funcs.RenderingBegin = gdraw_RenderingBegin; - gdraw_funcs.RenderingEnd = gdraw_RenderingEnd; - gdraw_funcs.RenderTileBegin = gdraw_RenderTileBegin; - gdraw_funcs.RenderTileEnd = gdraw_RenderTileEnd; - - gdraw_funcs.TextureDrawBufferBegin = gdraw_TextureDrawBufferBegin; - gdraw_funcs.TextureDrawBufferEnd = gdraw_TextureDrawBufferEnd; - - gdraw_funcs.DrawIndexedTriangles = gdraw_DrawIndexedTriangles; - gdraw_funcs.FilterQuad = gdraw_FilterQuad; - - gdraw_funcs.SetAntialiasTexture = gdraw_SetAntialiasTexture; - - gdraw_funcs.ClearStencilBits = gdraw_ClearStencilBits; - gdraw_funcs.ClearID = gdraw_ClearID; - - gdraw_funcs.MakeTextureBegin = gdraw_MakeTextureBegin; - gdraw_funcs.MakeTextureMore = gdraw_MakeTextureMore; - gdraw_funcs.MakeTextureEnd = gdraw_MakeTextureEnd; - - gdraw_funcs.UpdateTextureBegin = gdraw_UpdateTextureBegin; - gdraw_funcs.UpdateTextureRect = gdraw_UpdateTextureRect; - gdraw_funcs.UpdateTextureEnd = gdraw_UpdateTextureEnd; - - gdraw_funcs.FreeTexture = gdraw_FreeTexture; - gdraw_funcs.TryToLockTexture = gdraw_TryToLockTexture; - - gdraw_funcs.MakeTextureFromResource = - (gdraw_make_texture_from_resource*)gdraw_D3D_MakeTextureFromResource; - gdraw_funcs.FreeTextureFromResource = gdraw_D3D_DestroyTextureFromResource; - - gdraw_funcs.MakeVertexBufferBegin = gdraw_MakeVertexBufferBegin; - gdraw_funcs.MakeVertexBufferMore = gdraw_MakeVertexBufferMore; - gdraw_funcs.MakeVertexBufferEnd = gdraw_MakeVertexBufferEnd; - gdraw_funcs.TryToLockVertexBuffer = gdraw_TryLockVertexBuffer; - gdraw_funcs.FreeVertexBuffer = gdraw_FreeVertexBuffer; - - gdraw_funcs.UnlockHandles = gdraw_UnlockHandles; - gdraw_funcs.SetTextureUniqueID = gdraw_SetTextureUniqueID; - gdraw_funcs.Set3DTransform = gdraw_Set3DTransform; - - return &gdraw_funcs; -} - -void gdraw_D3D_DestroyContext(void) { - if (gdraw && gdraw->d3d_device) { - GDrawStats stats = {0}; - destroy_all_shaders(); - gdraw_res_flush(gdraw->texturecache, &stats); - gdraw_res_flush(gdraw->vbufcache, &stats); - flush_rendertargets(&stats); - - safe_release(gdraw->aa_tex); - gdraw->d3d_device = NULL; - } - - free_gdraw(); -} - -void gdraw_D3D_SetErrorHandler(void(__cdecl* error_handler)(HRESULT hr)) { - if (gdraw) gdraw->error_handler = error_handler; -} - -void gdraw_D3D_PreReset(void) { - if (!gdraw) return; - - GDrawStats stats = {0}; - flush_rendertargets(&stats); - - // we may end up resizing the frame buffer - gdraw->frametex_width = 0; - gdraw->frametex_height = 0; -} - -void gdraw_D3D_PostReset(void) { - // maybe re-create rendertargets right now? -} - -void RADLINK gdraw_D3D_BeginCustomDraw(IggyCustomDrawCallbackRegion* region, - D3DMATRIX* mat) { - clear_renderstate(); - gdraw_GetObjectSpaceMatrix(mat->m[0], region->o2w, gdraw->projection, 0, 0); -} - -void RADLINK gdraw_D3D_EndCustomDraw(IggyCustomDrawCallbackRegion* /*region*/) { - set_common_renderstate(); - set_projection(); -} - -void RADLINK gdraw_D3D_GetResourceUsageStats(gdraw_d3d_resourcetype type, - S32* handles_used, - S32* bytes_used) { - GDrawHandleCache* cache; - - switch (type) { - case GDRAW_D3D_RESOURCE_rendertarget: - cache = &gdraw->rendertargets; - break; - case GDRAW_D3D_RESOURCE_texture: - cache = gdraw->texturecache; - break; - case GDRAW_D3D_RESOURCE_vertexbuffer: - cache = gdraw->vbufcache; - break; - default: - cache = NULL; - break; - } - - *handles_used = *bytes_used = 0; - - if (cache) { - S32 i; - U64 frame = gdraw->frame_counter; - - for (i = 0; i < cache->max_handles; ++i) - if (cache->handle[i].bytes && cache->handle[i].owner && - cache->handle[i].fence.value == frame) { - *handles_used += 1; - *bytes_used += cache->handle[i].bytes; - } - } -} - -GDrawTexture* RADLINK gdraw_D3D_MakeTextureFromResource( - U8* resource_file, S32 /*len*/, IggyFileTextureRaw* texture) { - GDrawTexture* h; - S32 width, height, mipmaps, size; - IDirect3DTexture9* tex; - D3DFORMAT d3dfmt; - width = texture->w; - height = texture->h; - mipmaps = texture->mipmaps; - - // discard mipmaps on non-pow-of-2 if the hardware doesn't support - if (gdraw->conditional_nonpow2) { - if ((width & (width - 1)) || (height & (height - 1))) mipmaps = 1; - } - - switch (texture->format) { - case IFT_FORMAT_rgba_8888: - size = 4; - d3dfmt = D3DFMT_A8R8G8B8; - break; - case IFT_FORMAT_rgba_4444_LE: - size = 2; - d3dfmt = D3DFMT_A4R4G4B4; - break; - case IFT_FORMAT_rgba_5551_LE: - size = 2; - d3dfmt = D3DFMT_A1R5G5B5; - break; - case IFT_FORMAT_la_88: - size = 2; - d3dfmt = D3DFMT_A8L8; - break; - case IFT_FORMAT_la_44: - size = 1; - d3dfmt = D3DFMT_A4L4; - break; - case IFT_FORMAT_i_8: - case IFT_FORMAT_i_4: - size = 2; - d3dfmt = D3DFMT_A8L8; - break; - case IFT_FORMAT_l_8: - size = 1; - case IFT_FORMAT_l_4: - size = 1; - d3dfmt = D3DFMT_L8; - break; - case IFT_FORMAT_DXT1: - size = 8; - d3dfmt = D3DFMT_DXT1; - break; - case IFT_FORMAT_DXT3: - size = 16; - d3dfmt = D3DFMT_DXT3; - break; - case IFT_FORMAT_DXT5: - size = 16; - d3dfmt = D3DFMT_DXT5; - break; - default: - size = 0; - d3dfmt = D3DFMT_UNKNOWN; - break; - } - - HRESULT hr = gdraw->d3d_device->CreateTexture( - width, height, mipmaps, 0, d3dfmt, D3DPOOL_MANAGED, &tex, NULL); - if (FAILED(hr)) { - if (size >= 8 && ((width & 3) || (height & 3))) - IggyGDrawSendWarning(NULL, - "GDraw D3D error, dxtc texture dimensions " - "must be multiples of 4"); - else - report_d3d_error(hr, "CreateTexture", ""); - return NULL; - } - - U8* data = resource_file + texture->file_offset; - - for (int level = 0; level < mipmaps; ++level) { - S32 dxt_width = (width + 3) / 4; - S32 effective_height; - if (size >= 8) - effective_height = (height + 3) / 4; - else - effective_height = height; - - D3DLOCKED_RECT z; - hr = tex->LockRect(level, &z, NULL, 0); - if (FAILED(hr)) { - report_d3d_error(hr, "LockRect", " while creating texture"); - tex->Release(); - return NULL; - } - U8* pixels = (U8*)z.pBits; - for (S32 j = 0; j < effective_height; ++j) { - switch (texture->format) { - default: - memcpy(pixels + z.Pitch * j, data + j * width * size, - width * size); - break; - case IFT_FORMAT_rgba_8888: { - for (S32 i = 0; i < width; ++i) { - pixels[z.Pitch * j + i * 4 + 0] = - data[j * width * 4 + i * 4 + 2]; - pixels[z.Pitch * j + i * 4 + 1] = - data[j * width * 4 + i * 4 + 1]; - pixels[z.Pitch * j + i * 4 + 2] = - data[j * width * 4 + i * 4 + 0]; - pixels[z.Pitch * j + i * 4 + 3] = - data[j * width * 4 + i * 4 + 3]; - } - break; - } - case IFT_FORMAT_DXT1: - case IFT_FORMAT_DXT3: - case IFT_FORMAT_DXT5: - memcpy(pixels + z.Pitch * j, data + j * dxt_width * size, - dxt_width * size); - break; - case IFT_FORMAT_i_8: - case IFT_FORMAT_i_4: { - // convert from intensity to luminance-alpha by replicating - // all the pixels - for (S32 i = 0; i < width; ++i) - pixels[z.Pitch * j + i * 2 + 0] = - pixels[z.Pitch * j + i * 2 + 1] = - data[j * width + i]; - break; - } - } - } - tex->UnlockRect(level); - - data += (size < 8) ? width * height * size - : ((width + 3) / 4) * ((height + 3) / 4) * size; - width = width >> 1; - width += !width; - height = height >> 1; - height += !height; - } - - h = gdraw_D3D_WrappedTextureCreate(tex); - if (!h) tex->Release(); - return h; -} - -void RADLINK gdraw_D3D_DestroyTextureFromResource(GDrawTexture* tex) { - GDrawHandle* h = (GDrawHandle*)tex; - h->handle.tex.d3d->Release(); - gdraw_D3D_WrappedTextureDestroy(tex); -} diff --git a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d.h b/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d.h deleted file mode 100644 index 1c413f523..000000000 --- a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d.h +++ /dev/null @@ -1,125 +0,0 @@ -#pragma once -// gdraw_d3d.h - author: Sean Barrett - copyright 2009-2011 RAD Game Tools -// -// Interface for creating a D3D GDraw driver. - -#include "../include/gdraw.h" - -#define IDOC -// idoc(parent,GDraw_d3d9) - -typedef enum gdraw_d3d_resourcetype { - GDRAW_D3D_RESOURCE_rendertarget, - GDRAW_D3D_RESOURCE_texture, - GDRAW_D3D_RESOURCE_vertexbuffer, - - GDRAW_D3D_RESOURCE__count, -} gdraw_d3d_resourcetype; - -IDOC extern int gdraw_D3D_SetResourceLimits(gdraw_d3d_resourcetype type, - S32 num_handles, S32 num_bytes); -/* This sets how large the memory pool for a given resource types is, and how - many handles GDraw should allocate for it. GDraw keeps track of allocations - in each pool, and will free old resources in a LRU manner to make space if - one of the limits is about to be exceeded. - - Returns 1 if value successfully changed, 0 on error. - You need to call IggyPlayerFlushAll on all active Iggys before you do this to - make them flush their resources since changing the resource limits - invalidates all handles. You also need to call IggyFlushInstalledFonts if you - have any installed fonts. -*/ - -IDOC extern GDrawFunctions* gdraw_D3D_CreateContext(IDirect3DDevice9* dev, - S32 w, S32 h); -/* Creates a GDraw context for rendering using D3D. You need to pass in the D3D - device and the width/height of the content you're displaying. - - The width/height is used solely for sizing internal rendertargets. They will - be allocated to the larger of this size and the size of any rendered tiles - (with padding). In other words, you can pass in (0,0) and the rendertargets - will be allocated to the right size. However, if you draw multiple Iggy files - or tiles of different sizes, they might first be allocated too small; it's - best to pass in the correct size initially to avoid unnecessary - allocation/deallocation of too-small rendertargets. - - There can only be one D3D GDraw context active at any one time. - - If initialization fails for some reason (the main reason would be an out of - memory condition), NULL is returned. Otherwise, you can pass the return value - to IggySetGDraw. */ - -IDOC extern void gdraw_D3D_SetRendertargetSize(S32 w, S32 h); -/* Reset the size used for internal rendertargets defined by CreateContext. - Flushes all existing rendertargets if the size changes. */ - -IDOC extern void gdraw_D3D_DestroyContext(void); -/* Destroys the current GDraw context, if any. */ - -IDOC extern void gdraw_D3D_SetTileOrigin(IDirect3DSurface9* rt, - IDirect3DSurface9* depth, S32 x, - S32 y); -/* This sets the main rendertarget that GDraw should render to, the - corresponding depth/stencil surface, and the x/y position where to draw the - top-left of the current tile (to be used for tiled rendering). You need to - call this before Iggy calls any rendering functions. */ - -IDOC extern void gdraw_D3D_NoMoreGDrawThisFrame(void); -/* Tells GDraw that no more rendering operations will occur this frame. This - triggers some end-of-frame processing; most importantly, GDraw uses this call - as a marker to detect thrashing (and react accordingly), so please do not - forget to call this every frame! (As long as Iggy does any rendering, that - is) */ - -IDOC extern void gdraw_D3D_PreReset(void); -/* Call this before D3D device Reset(); it will free all default pool resources - allocated by GDraw. */ - -IDOC extern void gdraw_D3D_PostReset(void); -/* Call after D3D device Reset(). */ - -IDOC extern void RADLINK -gdraw_D3D_BeginCustomDraw(IggyCustomDrawCallbackRegion* Region, D3DMATRIX* mat); -/* Call at the beginning of Iggy custom draw callback to clear any odd render - states GDraw has set on the D3D device, and to get the current 2D - object-to-world transformation. */ - -IDOC extern void RADLINK -gdraw_D3D_EndCustomDraw(IggyCustomDrawCallbackRegion* Region); -/* Call at the end of Iggy custom draw callback so GDraw can restore its render - * states. */ - -IDOC extern void RADLINK gdraw_D3D_GetResourceUsageStats( - gdraw_d3d_resourcetype type, S32* handles_used, S32* bytes_used); -/* D3D only: Get resource usage stats for last frame. - This can be used to get an estimate of how much graphics memory got used by - GDraw during the last frame. Caveat: This counts the number of bytes that - GDraw knows about. 3D hardware usually has its own management overhead, - alignment requirements, allocation granularity and so on. In short, this is - not an accurate estimate of how much memory is actually used by the GPU - it - is a lower bound, though, and makes for a useful ballpark estimate. */ - -IDOC extern GDrawTexture* gdraw_D3D_WrappedTextureCreate( - IDirect3DTexture9* tex_handle); -/* Create a wrapped texture from a D3D texture. - A wrapped texture can be used to let Iggy draw using the contents of a - texture you create and manage on your own. For example, you might render to - this texture, or stream video into it. Wrapped textures take up a handle. - They will never be freed or otherwise modified by GDraw; nor will GDraw - change any reference counts. All this is up to the application. */ - -IDOC extern void gdraw_D3D_WrappedTextureChange(GDrawTexture* tex, - IDirect3DTexture9* tex_handle); -/* Switch an existing GDrawTexture * that represents a wrapped texture to use - a new underlying D3D texture. For example, you might internally double-buffer - a dynamically updated texture. As above, GDraw will leave this texture alone - and not touch any reference counts. */ - -IDOC extern void gdraw_D3D_WrappedTextureDestroy(GDrawTexture* tex); -/* Destroys the GDraw wrapper for a wrapped texture object. This will free up - a GDraw texture handle but not release the associated D3D texture; that is - up to you. */ - -extern GDrawTexture* RADLINK gdraw_D3D_MakeTextureFromResource( - U8* resource_file, S32 length, IggyFileTextureRaw* texture); -extern void RADLINK gdraw_D3D_DestroyTextureFromResource(GDrawTexture* tex); diff --git a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d10.cpp b/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d10.cpp deleted file mode 100644 index de1289445..000000000 --- a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d10.cpp +++ /dev/null @@ -1,145 +0,0 @@ -// gdraw_d3d10.cpp - author: Fabian Giesen - copyright 2011 RAD Game Tools -// -// This implements the Iggy graphics driver layer for D3D 10. - -// GDraw consists of several components that interact fairly loosely with each -// other; e.g. the resource management, drawing and filtering parts are all -// fairly independent of each other. If you want to modify some aspect of GDraw -// - say the texture allocation logic - your best bet is usually to just look -// for one of the related entry points, e.g. MakeTextureBegin, and take it from -// there. There's a bunch of code in this file, but none of it is really -// complicated. -// -// The one bit you might want to change that's not that localized is to -// integrate GDraw with an existing state caching system. The following bits all -// modify D3D state in some way: -// - The rendering helpers (set_viewport_raw, set_projection_raw, -// set_*_renderstate) -// - RenderTile*/TextureDrawBuffer* may change the active rendertarget and -// depth/stencil surface, -// as do D3D1X_(NoMoreGDrawThisFrame) and set_render_target -// - set_texture -// - set_renderstate and set_renderstate_full. These are the main places where -// render state changes occur; -// you should probably start here. -// - DrawIndexedTriangles sets the active vertex/index buffers and vertex -// declaration -// - Most of the functions in the "filter effects" section modify D3D state, -// mostly -// pixel shader constants and textures - -#define GDRAW_ASSERTS - -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif - -// We temporarily disable this warning for the shared interface portions -#pragma warning(push) -#pragma warning(disable \ - : 4201) // nonstandard extension used : nameless struct/union - -#include -#include -#include "../include/gdraw.h" -#include "../include/iggy.h" -#include -#include - -#include "gdraw_d3d10.h" - -#pragma warning(pop) - -// Some macros to allow as much sharing between D3D10 and D3D11 code as -// possible. -#define D3D1X_(id) D3D10_##id -#define ID3D1X(id) ID3D10##id -#define gdraw_D3D1X_(id) gdraw_D3D10_##id -#define GDRAW_D3D1X_(id) GDRAW_D3D10_##id - -typedef ID3D10Device ID3D1XDevice; -typedef ID3D10Device ID3D1XContext; -typedef S32 ViewCoord; -typedef gdraw_d3d10_resourcetype gdraw_resourcetype; - -static void report_d3d_error(HRESULT hr, char* call, char* context); - -static void* map_buffer(ID3D1XContext*, ID3D10Buffer* buf, bool discard) { - void* ptr; - if (FAILED(buf->Map( - discard ? D3D10_MAP_WRITE_DISCARD : D3D10_MAP_WRITE_NO_OVERWRITE, 0, - &ptr))) - return NULL; - else - return ptr; -} - -static void unmap_buffer(ID3D1XContext*, ID3D10Buffer* buf) { buf->Unmap(); } - -static RADINLINE void set_pixel_shader(ID3D10Device* ctx, - ID3D10PixelShader* shader) { - ctx->PSSetShader(shader); -} - -static RADINLINE void set_vertex_shader(ID3D10Device* ctx, - ID3D10VertexShader* shader) { - ctx->VSSetShader(shader); -} - -static ID3D10BlendState* create_blend_state(ID3D10Device* dev, BOOL blend, - D3D10_BLEND src, D3D10_BLEND dst) { - D3D10_BLEND_DESC desc = {}; - desc.BlendEnable[0] = blend; - desc.SrcBlend = src; - desc.DestBlend = dst; - desc.BlendOp = D3D10_BLEND_OP_ADD; - desc.SrcBlendAlpha = - (src == D3D10_BLEND_DEST_COLOR) ? D3D10_BLEND_DEST_ALPHA : src; - desc.DestBlendAlpha = dst; - desc.BlendOpAlpha = D3D10_BLEND_OP_ADD; - desc.RenderTargetWriteMask[0] = D3D10_COLOR_WRITE_ENABLE_ALL; - - ID3D10BlendState* res; - HRESULT hr = dev->CreateBlendState(&desc, &res); - if (FAILED(hr)) { - report_d3d_error(hr, "CreateBlendState", ""); - res = NULL; - } - - return res; -} - -#define GDRAW_SHADER_FILE "gdraw_d3d10_shaders.inl" -#include "gdraw_d3d1x_shared.inl" - -static void create_pixel_shader(ProgramWithCachedVariableLocations* p, - ProgramWithCachedVariableLocations* src) { - *p = *src; - if (p->bytecode) { - HRESULT hr = gdraw->d3d_device->CreatePixelShader(p->bytecode, p->size, - &p->pshader); - if (FAILED(hr)) { - report_d3d_error(hr, "CreatePixelShader", ""); - p->pshader = NULL; - return; - } - } -} - -static void create_vertex_shader(ProgramWithCachedVariableLocations* p, - ProgramWithCachedVariableLocations* src) { - *p = *src; - if (p->bytecode) { - HRESULT hr = gdraw->d3d_device->CreateVertexShader(p->bytecode, p->size, - &p->vshader); - if (FAILED(hr)) { - report_d3d_error(hr, "CreateVertexShader", ""); - p->vshader = NULL; - return; - } - } -} - -GDrawFunctions* gdraw_D3D10_CreateContext(ID3D10Device* dev, S32 w, S32 h) { - return create_context(dev, dev, w, h); -} diff --git a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d10.h b/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d10.h deleted file mode 100644 index 65fa8024c..000000000 --- a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d10.h +++ /dev/null @@ -1,152 +0,0 @@ -#pragma once -// gdraw_d3d10.h - author: Fabian Giesen - copyright 2011 RAD Game Tools -// -// Interface for creating a D3D10 GDraw driver. - -#define IDOC -// idoc(parent,GDraw_d3d10) - -typedef enum gdraw_d3d10_resourcetype { - GDRAW_D3D10_RESOURCE_rendertarget, - GDRAW_D3D10_RESOURCE_texture, - GDRAW_D3D10_RESOURCE_vertexbuffer, - GDRAW_D3D10_RESOURCE_dynbuffer, // Streaming buffer for dynamic - // vertex/index data (handle count ignored) - - GDRAW_D3D10_RESOURCE__count, -} gdraw_d3d10_resourcetype; - -IDOC extern int gdraw_D3D10_SetResourceLimits(gdraw_d3d10_resourcetype type, - S32 num_handles, S32 num_bytes); -/* This sets how large the memory pool for a given resource types is, and how - many handles GDraw should allocate for it. GDraw keeps track of allocations - in each pool, and will free old resources in a LRU manner to make space if - one of the limits is about to be exceeded. - - Returns 1 if value successfully changed, 0 on error. - You need to call IggyPlayerFlushAll on all active Iggys before you do this to - make them flush their resources since changing the resource limits - invalidates all handles. You also need to call IggyFlushInstalledFonts if you - have any installed fonts. -*/ - -IDOC extern GDrawFunctions* gdraw_D3D10_CreateContext(ID3D10Device* dev, S32 w, - S32 h); -/* Creates a GDraw context for rendering using D3D. You need to pass in the D3D - device and the width/height of render target textures. - - The width/height is used solely for sizing internal rendertargets. They will - be allocated to the larger of this size and the size of any rendered tiles - (with padding). In other words, you can pass in (0,0) and the rendertargets - will be allocated to the right size. However, if you draw multiple Iggy files - or tiles of different sizes, they might first be allocated too small; it's - best to pass in the correct size initially to avoid unnecessary - allocation/deallocation of too-small rendertargets. - - There can only be one D3D GDraw context active at any one time. - - If initialization fails for some reason (the main reason would be an out of - memory condition), NULL is returned. Otherwise, you can pass the return value - to IggySetGDraw. */ - -IDOC extern void gdraw_D3D10_DestroyContext(void); -/* Destroys the current GDraw context, if any. */ - -IDOC extern void gdraw_D3D10_SetErrorHandler( - void(__cdecl* error_handler)(HRESULT hr)); -/* Sets the GDraw D3D error handler. - - This will get called with the respective D3D error code if GDraw encounters - an error that it can't handle by itself (e.g. running out of state objects). - */ - -IDOC extern void gdraw_D3D10_SetRendertargetSize(S32 w, S32 h); -/* Changes the current render target size (and recreates all rendertargets if - necessary). This allows you to shrink the rendertargets if the new needed - size is smaller than it was previously. As with $gdraw_D3D10_CreateContext, - the width and height specified here are only minimums; GDraw will reallocate - larger rendertargets as needed. */ - -IDOC extern void gdraw_D3D10_SetTileOrigin( - ID3D10RenderTargetView* main_rt, ID3D10DepthStencilView* main_ds, - ID3D10ShaderResourceView* non_msaa_rt, S32 x, S32 y); -/* This sets the main rendertarget and matching depth/stencil buffer that GDraw - should render to and the x/y position of the output location of the top-left - of the current tile (allowing you to finely-position content, or to do tiled - rendering). - - If your rendertarget uses multisampling, you also need to specify a shader - resource view for a non-MSAA rendertarget texture (identically sized to - main_rt) in non_msaa_rt. This is only used if the Flash content includes - non-standard blend modes which have to use a special blend shader, so you can - leave it NULL if you forbid such content. - - You need to call this before Iggy calls any rendering functions. */ - -IDOC extern void gdraw_D3D10_NoMoreGDrawThisFrame(void); -/* Tells GDraw that no more rendering operations will occur this frame. This - triggers some end-of-frame processing; most importantly, GDraw uses this call - as a marker to detect thrashing (and react accordingly), so please do not - forget to call this every frame! (As long as Iggy does any rendering, that - is) */ - -IDOC extern void gdraw_D3D10_PreReset(void); -/* Call this before D3D device Reset(); it will free all default pool resources - allocated by GDraw. */ - -IDOC extern void gdraw_D3D10_PostReset(void); -/* Call after D3D device Reset(). */ - -IDOC extern void RADLINK gdraw_D3D10_BeginCustomDraw( - IggyCustomDrawCallbackRegion* Region, F32 mat[4][4]); -/* Call at the beginning of Iggy custom draw callback to clear any odd render - states GDraw has set on the D3D device, and to get the current 2D - object-to-world transformation. */ - -IDOC extern void RADLINK -gdraw_D3D10_EndCustomDraw(IggyCustomDrawCallbackRegion* Region); -/* Call at the end of Iggy custom draw callback so GDraw can restore its render - * states. */ - -IDOC extern void RADLINK gdraw_D3D10_GetResourceUsageStats( - gdraw_d3d10_resourcetype type, S32* handles_used, S32* bytes_used); -/* D3D only: Get resource usage stats for last frame. - This can be used to get an estimate of how much graphics memory got used by - GDraw during the last frame. - - For the dynbuffer, this always returns 0 in handles_used and the *size of the - largest single allocation* in bytes_used. It needs to be sized so that this - allocation fits; make it smaller and it won't work, but if you make it much - larger (say more than 2x as big), it's just a waste of memory. That said, we - still recommend to make it no smaller than 64k, and the default is 256k. - - Caveat: This counts the number of bytes that GDraw knows about. 3D hardware - usually has its own management overhead, alignment requirements, allocation - granularity and so on. In short, this is not an accurate estimate of how much - memory is actually used by the GPU - it is a lower bound, though, and makes - for a useful ballpark estimate. */ - -IDOC extern GDrawTexture* gdraw_D3D10_WrappedTextureCreate( - ID3D10ShaderResourceView* tex_view); -/* Create a wrapped texture from a shader resource view. - A wrapped texture can be used to let Iggy draw using the contents of a - texture you create and manage on your own. For example, you might render to - this texture, or stream video into it. Wrapped textures take up a handle. - They will never be freed or otherwise modified by GDraw; nor will GDraw - change any reference counts. All this is up to the application. */ - -IDOC extern void gdraw_D3D10_WrappedTextureChange( - GDrawTexture* tex, ID3D10ShaderResourceView* tex_view); -/* Switch an existing GDrawTexture * that represents a wrapped texture to use - a new underlying D3D view. For example, you might internally double-buffer - a dynamically updated texture. As above, GDraw will leave this texture alone - and not touch any reference counts. */ - -IDOC extern void gdraw_D3D10_WrappedTextureDestroy(GDrawTexture* tex); -/* Destroys the GDraw wrapper for a wrapped texture object. This will free up - a GDraw texture handle but not release the associated D3D texture; that is - up to you. */ - -extern GDrawTexture* RADLINK gdraw_D3D10_MakeTextureFromResource( - U8* resource_file, S32 length, IggyFileTextureRaw* texture); -extern void RADLINK gdraw_D3D10_DestroyTextureFromResource(GDrawTexture* tex); diff --git a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d9_shaders.inl b/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d9_shaders.inl deleted file mode 100644 index ce13993b1..000000000 --- a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d9_shaders.inl +++ /dev/null @@ -1,1075 +0,0 @@ -// This file was automatically generated by shadergen. Do not edit by hand! - -static DWORD pshader_basic_0[36] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb00f0000, 0x0200001f, 0x90000000, 0xa00f0807, 0x02000006, - 0x80080000, 0xb0ff0000, 0x03000005, 0x80010000, 0x80ff0000, 0xb0aa0000, 0x02000001, 0x80020000, - 0xb0ff0000, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40807, 0x03000005, 0x80070001, 0xa0ff0000, - 0xa0e40000, 0x02000001, 0x80080001, 0xa0ff0000, 0x03000005, 0x800f0000, 0x80e40000, 0x80e40001, - 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_basic_1[48] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb00f0000, 0x0200001f, 0x90000000, 0xa00f0807, 0x02000006, - 0x80080000, 0xb0ff0000, 0x03000005, 0x80010000, 0x80ff0000, 0xb0aa0000, 0x02000001, 0x80020000, - 0xb0ff0000, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40807, 0x03000005, 0x80070001, 0xa0ff0000, - 0xa0e40000, 0x02000001, 0x80080001, 0xa0ff0000, 0x03000005, 0x800f0000, 0x80e40000, 0x80e40001, - 0x04000004, 0x80070000, 0xa0e40001, 0x80ff0000, 0x80e40000, 0x0300000a, 0x80070001, 0x80ff0000, - 0x80e40000, 0x02000001, 0x80080001, 0x80ff0000, 0x02000001, 0x800f0800, 0x80e40001, 0x0000ffff, -}; - -static DWORD pshader_basic_2[41] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb00f0000, 0x0200001f, 0x90000000, 0xa00f0807, 0x02000006, - 0x80080000, 0xb0ff0000, 0x03000005, 0x80010000, 0x80ff0000, 0xb0aa0000, 0x02000001, 0x80020000, - 0xb0ff0000, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40807, 0x02000001, 0x800f0001, 0xa0e40000, - 0x04000004, 0x80080000, 0x80ff0001, 0x80ff0000, 0xa0ff0001, 0x03000002, 0x80070001, 0x80e40001, - 0xa0e40001, 0x03000005, 0x80070000, 0x80ff0000, 0x80e40001, 0x02000001, 0x800f0800, 0x80e40000, - 0x0000ffff, -}; - -static DWORD pshader_basic_3[51] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb00f0000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, - 0x90000000, 0xa00f0807, 0x02000006, 0x80080000, 0xb0ff0000, 0x03000005, 0x80030000, 0x80ff0000, - 0xb0e40000, 0x03000005, 0x80010001, 0x80ff0000, 0xb0aa0000, 0x02000001, 0x80020001, 0xb0ff0000, - 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40807, - 0x03000005, 0x80070002, 0xa0ff0000, 0xa0e40000, 0x02000001, 0x80080002, 0xa0ff0000, 0x03000005, - 0x800f0000, 0x80e40000, 0x80e40002, 0x03000005, 0x800f0000, 0x80e40001, 0x80e40000, 0x02000001, - 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_basic_4[63] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb00f0000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, - 0x90000000, 0xa00f0807, 0x02000006, 0x80080000, 0xb0ff0000, 0x03000005, 0x80030000, 0x80ff0000, - 0xb0e40000, 0x03000005, 0x80010001, 0x80ff0000, 0xb0aa0000, 0x02000001, 0x80020001, 0xb0ff0000, - 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40807, - 0x03000005, 0x80070002, 0xa0ff0000, 0xa0e40000, 0x02000001, 0x80080002, 0xa0ff0000, 0x03000005, - 0x800f0000, 0x80e40000, 0x80e40002, 0x03000005, 0x800f0000, 0x80e40001, 0x80e40000, 0x04000004, - 0x80070000, 0xa0e40001, 0x80ff0000, 0x80e40000, 0x0300000a, 0x80070001, 0x80ff0000, 0x80e40000, - 0x02000001, 0x80080001, 0x80ff0000, 0x02000001, 0x800f0800, 0x80e40001, 0x0000ffff, -}; - -static DWORD pshader_basic_5[68] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb00f0000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, - 0x90000000, 0xa00f0807, 0x02000006, 0x80080000, 0xb0ff0000, 0x03000005, 0x80030000, 0x80ff0000, - 0xb0e40000, 0x03000005, 0x80010001, 0x80ff0000, 0xb0aa0000, 0x02000001, 0x80020001, 0xb0ff0000, - 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40807, - 0x02000006, 0x80010001, 0x80ff0000, 0x03000005, 0x80070001, 0x80e40000, 0x80000001, 0x03000005, - 0x80080002, 0x80ff0000, 0x80ff0000, 0x04000058, 0x80070000, 0x81ff0002, 0x80e40000, 0x80e40001, - 0x03000005, 0x800f0000, 0x80e40000, 0xa0e40000, 0x03000005, 0x80080000, 0x80ff0001, 0x80ff0000, - 0x03000002, 0x800f0000, 0x80e40000, 0xa0e40001, 0x03000005, 0x80070000, 0x80ff0000, 0x80e40000, - 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_basic_6[51] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb00f0000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, - 0x90000000, 0xa00f0807, 0x02000006, 0x80080000, 0xb0ff0000, 0x03000005, 0x80030000, 0x80ff0000, - 0xb0e40000, 0x03000005, 0x80010001, 0x80ff0000, 0xb0aa0000, 0x02000001, 0x80020001, 0xb0ff0000, - 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40807, - 0x03000005, 0x80070002, 0xa0ff0000, 0xa0e40000, 0x02000001, 0x80080002, 0xa0ff0000, 0x03000005, - 0x800f0000, 0x80ff0000, 0x80e40002, 0x03000005, 0x800f0000, 0x80e40001, 0x80e40000, 0x02000001, - 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_basic_7[63] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb00f0000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, - 0x90000000, 0xa00f0807, 0x02000006, 0x80080000, 0xb0ff0000, 0x03000005, 0x80030000, 0x80ff0000, - 0xb0e40000, 0x03000005, 0x80010001, 0x80ff0000, 0xb0aa0000, 0x02000001, 0x80020001, 0xb0ff0000, - 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40807, - 0x03000005, 0x80070002, 0xa0ff0000, 0xa0e40000, 0x02000001, 0x80080002, 0xa0ff0000, 0x03000005, - 0x800f0000, 0x80ff0000, 0x80e40002, 0x03000005, 0x800f0000, 0x80e40001, 0x80e40000, 0x04000004, - 0x80070000, 0xa0e40001, 0x80ff0000, 0x80e40000, 0x0300000a, 0x80070001, 0x80ff0000, 0x80e40000, - 0x02000001, 0x80080001, 0x80ff0000, 0x02000001, 0x800f0800, 0x80e40001, 0x0000ffff, -}; - -static DWORD pshader_basic_8[56] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb00f0000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, - 0x90000000, 0xa00f0807, 0x02000006, 0x80080000, 0xb0ff0000, 0x03000005, 0x80030000, 0x80ff0000, - 0xb0e40000, 0x03000005, 0x80010001, 0x80ff0000, 0xb0aa0000, 0x02000001, 0x80020001, 0xb0ff0000, - 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40807, - 0x03000005, 0x80010000, 0x80ff0000, 0xa0ff0000, 0x04000004, 0x80080000, 0x80000000, 0x80ff0001, - 0xa0ff0001, 0x02000001, 0x80070001, 0xa0e40000, 0x03000002, 0x80070001, 0x80e40001, 0xa0e40001, - 0x03000005, 0x80070000, 0x80ff0000, 0x80e40001, 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_basic_9[68] = { - 0xffff0200, 0x05000051, 0xa00f0001, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb00f0000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0807, - 0x02000006, 0x80080000, 0xb0ff0000, 0x03000005, 0x80030000, 0x80ff0000, 0xb0e40000, 0x03000005, - 0x80010001, 0x80ff0000, 0xb0aa0000, 0x0400005a, 0x80010000, 0x80e40000, 0x80e40000, 0xa0000001, - 0x02000007, 0x80010000, 0x80000000, 0x02000006, 0x80030000, 0x80000000, 0x02000001, 0x80020001, - 0xb0ff0000, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40001, - 0xa0e40807, 0x03000005, 0x80070002, 0xa0ff0000, 0xa0e40000, 0x02000001, 0x80080002, 0xa0ff0000, - 0x03000005, 0x800f0000, 0x80e40000, 0x80e40002, 0x03000005, 0x800f0000, 0x80e40001, 0x80e40000, - 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_basic_10[80] = { - 0xffff0200, 0x05000051, 0xa00f0002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb00f0000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0807, - 0x02000006, 0x80080000, 0xb0ff0000, 0x03000005, 0x80030000, 0x80ff0000, 0xb0e40000, 0x03000005, - 0x80010001, 0x80ff0000, 0xb0aa0000, 0x0400005a, 0x80010000, 0x80e40000, 0x80e40000, 0xa0000002, - 0x02000007, 0x80010000, 0x80000000, 0x02000006, 0x80030000, 0x80000000, 0x02000001, 0x80020001, - 0xb0ff0000, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40001, - 0xa0e40807, 0x03000005, 0x80070002, 0xa0ff0000, 0xa0e40000, 0x02000001, 0x80080002, 0xa0ff0000, - 0x03000005, 0x800f0000, 0x80e40000, 0x80e40002, 0x03000005, 0x800f0000, 0x80e40001, 0x80e40000, - 0x04000004, 0x80070000, 0xa0e40001, 0x80ff0000, 0x80e40000, 0x0300000a, 0x80070001, 0x80ff0000, - 0x80e40000, 0x02000001, 0x80080001, 0x80ff0000, 0x02000001, 0x800f0800, 0x80e40001, 0x0000ffff, -}; - -static DWORD pshader_basic_11[85] = { - 0xffff0200, 0x05000051, 0xa00f0002, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb00f0000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0807, - 0x02000006, 0x80080000, 0xb0ff0000, 0x03000005, 0x80030000, 0x80ff0000, 0xb0e40000, 0x03000005, - 0x80010001, 0x80ff0000, 0xb0aa0000, 0x0400005a, 0x80010000, 0x80e40000, 0x80e40000, 0xa0000002, - 0x02000007, 0x80010000, 0x80000000, 0x02000006, 0x80030000, 0x80000000, 0x02000001, 0x80020001, - 0xb0ff0000, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40001, - 0xa0e40807, 0x02000006, 0x80010001, 0x80ff0000, 0x03000005, 0x80070001, 0x80e40000, 0x80000001, - 0x03000005, 0x80080002, 0x80ff0000, 0x80ff0000, 0x04000058, 0x80070000, 0x81ff0002, 0x80e40000, - 0x80e40001, 0x03000005, 0x800f0000, 0x80e40000, 0xa0e40000, 0x03000005, 0x80080000, 0x80ff0001, - 0x80ff0000, 0x03000002, 0x800f0000, 0x80e40000, 0xa0e40001, 0x03000005, 0x80070000, 0x80ff0000, - 0x80e40000, 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_basic_12[89] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb00f0000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, - 0x90000000, 0xa00f0807, 0x02000006, 0x80080000, 0xb0ff0000, 0x03000005, 0x80010000, 0x80ff0000, - 0xb0550000, 0x03000005, 0x80010000, 0x80000000, 0x80000000, 0x04000004, 0x80020000, 0xb0000000, - 0x80ff0000, 0xa0000002, 0x03000005, 0x80010001, 0x80ff0000, 0xb0aa0000, 0x04000004, 0x80010000, - 0x80550000, 0x80550000, 0x80000000, 0x03000005, 0x80040000, 0x80550000, 0xa0550002, 0x03000005, - 0x80040000, 0x80aa0000, 0x80aa0000, 0x04000004, 0x80010000, 0x80000000, 0xa0aa0002, 0x80aa0000, - 0x02000007, 0x80010000, 0x80000000, 0x02000006, 0x80010000, 0x80000000, 0x04000004, 0x80030000, - 0x80550000, 0xa1550002, 0x80000000, 0x02000001, 0x80020001, 0xb0ff0000, 0x03000042, 0x800f0000, - 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40807, 0x03000005, 0x80070002, - 0xa0ff0000, 0xa0e40000, 0x02000001, 0x80080002, 0xa0ff0000, 0x03000005, 0x800f0000, 0x80e40000, - 0x80e40002, 0x03000005, 0x800f0000, 0x80e40001, 0x80e40000, 0x02000001, 0x800f0800, 0x80e40000, - 0x0000ffff, -}; - -static DWORD pshader_basic_13[101] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb00f0000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, - 0x90000000, 0xa00f0807, 0x02000006, 0x80080000, 0xb0ff0000, 0x03000005, 0x80010000, 0x80ff0000, - 0xb0550000, 0x03000005, 0x80010000, 0x80000000, 0x80000000, 0x04000004, 0x80020000, 0xb0000000, - 0x80ff0000, 0xa0000002, 0x03000005, 0x80010001, 0x80ff0000, 0xb0aa0000, 0x04000004, 0x80010000, - 0x80550000, 0x80550000, 0x80000000, 0x03000005, 0x80040000, 0x80550000, 0xa0550002, 0x03000005, - 0x80040000, 0x80aa0000, 0x80aa0000, 0x04000004, 0x80010000, 0x80000000, 0xa0aa0002, 0x80aa0000, - 0x02000007, 0x80010000, 0x80000000, 0x02000006, 0x80010000, 0x80000000, 0x04000004, 0x80030000, - 0x80550000, 0xa1550002, 0x80000000, 0x02000001, 0x80020001, 0xb0ff0000, 0x03000042, 0x800f0000, - 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40807, 0x03000005, 0x80070002, - 0xa0ff0000, 0xa0e40000, 0x02000001, 0x80080002, 0xa0ff0000, 0x03000005, 0x800f0000, 0x80e40000, - 0x80e40002, 0x03000005, 0x800f0000, 0x80e40001, 0x80e40000, 0x04000004, 0x80070000, 0xa0e40001, - 0x80ff0000, 0x80e40000, 0x0300000a, 0x80070001, 0x80ff0000, 0x80e40000, 0x02000001, 0x80080001, - 0x80ff0000, 0x02000001, 0x800f0800, 0x80e40001, 0x0000ffff, -}; - -static DWORD pshader_basic_14[106] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb00f0000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, - 0x90000000, 0xa00f0807, 0x02000006, 0x80080000, 0xb0ff0000, 0x03000005, 0x80010000, 0x80ff0000, - 0xb0550000, 0x03000005, 0x80010000, 0x80000000, 0x80000000, 0x04000004, 0x80020000, 0xb0000000, - 0x80ff0000, 0xa0000002, 0x03000005, 0x80010001, 0x80ff0000, 0xb0aa0000, 0x04000004, 0x80010000, - 0x80550000, 0x80550000, 0x80000000, 0x03000005, 0x80040000, 0x80550000, 0xa0550002, 0x03000005, - 0x80040000, 0x80aa0000, 0x80aa0000, 0x04000004, 0x80010000, 0x80000000, 0xa0aa0002, 0x80aa0000, - 0x02000007, 0x80010000, 0x80000000, 0x02000006, 0x80010000, 0x80000000, 0x04000004, 0x80030000, - 0x80550000, 0xa1550002, 0x80000000, 0x02000001, 0x80020001, 0xb0ff0000, 0x03000042, 0x800f0000, - 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40807, 0x02000006, 0x80010001, - 0x80ff0000, 0x03000005, 0x80070001, 0x80e40000, 0x80000001, 0x03000005, 0x80080002, 0x80ff0000, - 0x80ff0000, 0x04000058, 0x80070000, 0x81ff0002, 0x80e40000, 0x80e40001, 0x03000005, 0x800f0000, - 0x80e40000, 0xa0e40000, 0x03000005, 0x80080000, 0x80ff0001, 0x80ff0000, 0x03000002, 0x800f0000, - 0x80e40000, 0xa0e40001, 0x03000005, 0x80070000, 0x80ff0000, 0x80e40000, 0x02000001, 0x800f0800, - 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_basic_15[64] = { - 0xffff0200, 0x05000051, 0xa00f0001, 0xbf000000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb00f0000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0807, - 0x02000006, 0x80080000, 0xb0ff0000, 0x03000005, 0x80030000, 0x80ff0000, 0xb0e40000, 0x03000005, - 0x80010001, 0x80ff0000, 0xb0aa0000, 0x02000001, 0x80020001, 0xb0ff0000, 0x03000042, 0x800f0000, - 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40807, 0x03000005, 0x80070002, - 0xa0ff0000, 0xa0e40000, 0x02000001, 0x80080002, 0xa0ff0000, 0x03000005, 0x800f0000, 0x80ff0000, - 0x80e40002, 0x04000004, 0x800f0002, 0x80ff0000, 0x80ff0001, 0xa0000001, 0x03000005, 0x800f0000, - 0x80e40001, 0x80e40000, 0x02000001, 0x800f0800, 0x80e40000, 0x01000041, 0x800f0002, 0x0000ffff, -}; - -static DWORD pshader_basic_16[76] = { - 0xffff0200, 0x05000051, 0xa00f0002, 0xbf000000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb00f0000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0807, - 0x02000006, 0x80080000, 0xb0ff0000, 0x03000005, 0x80030000, 0x80ff0000, 0xb0e40000, 0x03000005, - 0x80010001, 0x80ff0000, 0xb0aa0000, 0x02000001, 0x80020001, 0xb0ff0000, 0x03000042, 0x800f0000, - 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40807, 0x03000005, 0x80070002, - 0xa0ff0000, 0xa0e40000, 0x02000001, 0x80080002, 0xa0ff0000, 0x03000005, 0x800f0000, 0x80ff0000, - 0x80e40002, 0x04000004, 0x800f0002, 0x80ff0000, 0x80ff0001, 0xa0000002, 0x03000005, 0x800f0000, - 0x80e40001, 0x80e40000, 0x01000041, 0x800f0002, 0x04000004, 0x80070000, 0xa0e40001, 0x80ff0000, - 0x80e40000, 0x0300000a, 0x80070001, 0x80ff0000, 0x80e40000, 0x02000001, 0x80080001, 0x80ff0000, - 0x02000001, 0x800f0800, 0x80e40001, 0x0000ffff, -}; - -static DWORD pshader_basic_17[68] = { - 0xffff0200, 0x05000051, 0xa00f0002, 0xbf000000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb00f0000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0807, - 0x02000006, 0x80080000, 0xb0ff0000, 0x03000005, 0x80030000, 0x80ff0000, 0xb0e40000, 0x03000005, - 0x80010001, 0x80ff0000, 0xb0aa0000, 0x02000001, 0x80020001, 0xb0ff0000, 0x03000042, 0x800f0000, - 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40807, 0x03000005, 0x80010000, - 0x80ff0000, 0xa0ff0000, 0x04000004, 0x80080000, 0x80000000, 0x80ff0001, 0xa0ff0001, 0x03000002, - 0x800f0001, 0x80ff0000, 0xa0000002, 0x01000041, 0x800f0001, 0x02000001, 0x80070001, 0xa0e40000, - 0x03000002, 0x80070001, 0x80e40001, 0xa0e40001, 0x03000005, 0x80070000, 0x80ff0000, 0x80e40001, - 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static ProgramWithCachedVariableLocations pshader_basic_arr[18] = { - { pshader_basic_0, NULL, { -1, 7, 0, -1, -1, } }, - { pshader_basic_1, NULL, { -1, 7, 0, 1, -1, } }, - { pshader_basic_2, NULL, { -1, 7, 0, 1, -1, } }, - { pshader_basic_3, NULL, { 0, 7, 0, -1, -1, } }, - { pshader_basic_4, NULL, { 0, 7, 0, 1, -1, } }, - { pshader_basic_5, NULL, { 0, 7, 0, 1, -1, } }, - { pshader_basic_6, NULL, { 0, 7, 0, -1, -1, } }, - { pshader_basic_7, NULL, { 0, 7, 0, 1, -1, } }, - { pshader_basic_8, NULL, { 0, 7, 0, 1, -1, } }, - { pshader_basic_9, NULL, { 0, 7, 0, -1, -1, } }, - { pshader_basic_10, NULL, { 0, 7, 0, 1, -1, } }, - { pshader_basic_11, NULL, { 0, 7, 0, 1, -1, } }, - { pshader_basic_12, NULL, { 0, 7, 0, -1, 2, } }, - { pshader_basic_13, NULL, { 0, 7, 0, 1, 2, } }, - { pshader_basic_14, NULL, { 0, 7, 0, 1, 2, } }, - { pshader_basic_15, NULL, { 0, 7, 0, -1, -1, } }, - { pshader_basic_16, NULL, { 0, 7, 0, 1, -1, } }, - { pshader_basic_17, NULL, { 0, 7, 0, 1, -1, } }, -}; - -static DWORD pshader_exceptional_blend_1[72] = { - 0xffff0200, 0x05000051, 0xa00f0002, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x03000042, 0x800f0000, 0xb0e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0xb0e40000, 0xa0e40801, - 0x03000005, 0x80070000, 0x80e40000, 0xa0e40000, 0x03000005, 0x800f0002, 0x80ff0000, 0xa0e40001, - 0x04000004, 0x801f0000, 0x80e40000, 0xa0ff0000, 0x80e40002, 0x03000002, 0x80010002, 0x81ff0000, - 0xa0000002, 0x03000005, 0x80070003, 0x80e40001, 0x80e40000, 0x04000004, 0x80070001, 0x80000002, - 0x80e40001, 0x80e40003, 0x03000002, 0x80010002, 0x81ff0001, 0xa0000002, 0x04000004, 0x80070002, - 0x80000002, 0x80e40000, 0x80e40001, 0x03000002, 0x80010000, 0x80ff0001, 0x80ff0000, 0x04000004, - 0x80080002, 0x80ff0000, 0x81ff0001, 0x80000000, 0x02000001, 0x800f0800, 0x80e40002, 0x0000ffff, -}; - -static DWORD pshader_exceptional_blend_2[111] = { - 0xffff0200, 0x05000051, 0xa00f0002, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x03000042, 0x800f0000, 0xb0e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0xb0e40000, 0xa0e40801, - 0x03000005, 0x80070000, 0x80e40000, 0xa0e40000, 0x03000005, 0x800f0002, 0x80ff0000, 0xa0e40001, - 0x04000004, 0x801f0000, 0x80e40000, 0xa0ff0000, 0x80e40002, 0x03000002, 0x80010002, 0x81ff0000, - 0xa0000002, 0x03000002, 0x80020002, 0x81000000, 0x80ff0000, 0x03000005, 0x80040002, 0x80ff0001, - 0x80ff0000, 0x03000002, 0x80080002, 0x81000001, 0x80ff0001, 0x04000004, 0x80010003, 0x80ff0002, - 0x81550002, 0x80aa0002, 0x03000002, 0x80080003, 0x81550000, 0x80ff0000, 0x03000002, 0x80020002, - 0x81550001, 0x80ff0001, 0x04000004, 0x80020003, 0x80550002, 0x81ff0003, 0x80aa0002, 0x03000002, - 0x80080003, 0x81aa0000, 0x80ff0000, 0x03000002, 0x80020002, 0x81aa0001, 0x80ff0001, 0x04000004, - 0x80040003, 0x80550002, 0x81ff0003, 0x80aa0002, 0x04000004, 0x80070001, 0x80000002, 0x80e40001, - 0x80e40003, 0x03000002, 0x80010002, 0x81ff0001, 0xa0000002, 0x04000004, 0x80070002, 0x80000002, - 0x80e40000, 0x80e40001, 0x03000002, 0x80010000, 0x80ff0001, 0x80ff0000, 0x04000004, 0x80080002, - 0x80ff0000, 0x81ff0001, 0x80000000, 0x02000001, 0x800f0800, 0x80e40002, 0x0000ffff, -}; - -static DWORD pshader_exceptional_blend_3[104] = { - 0xffff0200, 0x05000051, 0xa00f0002, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x03000042, 0x800f0000, 0xb0e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0xb0e40000, 0xa0e40801, - 0x03000005, 0x80070000, 0x80e40000, 0xa0e40000, 0x03000005, 0x800f0002, 0x80ff0000, 0xa0e40001, - 0x04000004, 0x801f0000, 0x80e40000, 0xa0ff0000, 0x80e40002, 0x03000002, 0x80010002, 0x81ff0000, - 0xa0000002, 0x03000005, 0x80020002, 0x80000001, 0x80ff0000, 0x03000005, 0x80040002, 0x80ff0001, - 0x80000000, 0x0300000b, 0x80010003, 0x80550002, 0x80aa0002, 0x03000005, 0x80020002, 0x80550001, - 0x80ff0000, 0x03000005, 0x80040002, 0x80ff0001, 0x80550000, 0x0300000b, 0x80020003, 0x80550002, - 0x80aa0002, 0x03000005, 0x80020002, 0x80aa0001, 0x80ff0000, 0x03000005, 0x80040002, 0x80ff0001, - 0x80aa0000, 0x0300000b, 0x80040003, 0x80550002, 0x80aa0002, 0x04000004, 0x80070001, 0x80000002, - 0x80e40001, 0x80e40003, 0x03000002, 0x80010002, 0x81ff0001, 0xa0000002, 0x04000004, 0x80070002, - 0x80000002, 0x80e40000, 0x80e40001, 0x03000002, 0x80010000, 0x80ff0001, 0x80ff0000, 0x04000004, - 0x80080002, 0x80ff0000, 0x81ff0001, 0x80000000, 0x02000001, 0x800f0800, 0x80e40002, 0x0000ffff, -}; - -static DWORD pshader_exceptional_blend_4[104] = { - 0xffff0200, 0x05000051, 0xa00f0002, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x03000042, 0x800f0000, 0xb0e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0xb0e40000, 0xa0e40801, - 0x03000005, 0x80070000, 0x80e40000, 0xa0e40000, 0x03000005, 0x800f0002, 0x80ff0000, 0xa0e40001, - 0x04000004, 0x801f0000, 0x80e40000, 0xa0ff0000, 0x80e40002, 0x03000002, 0x80010002, 0x81ff0000, - 0xa0000002, 0x03000005, 0x80020002, 0x80000001, 0x80ff0000, 0x03000005, 0x80040002, 0x80ff0001, - 0x80000000, 0x0300000a, 0x80010003, 0x80aa0002, 0x80550002, 0x03000005, 0x80020002, 0x80550001, - 0x80ff0000, 0x03000005, 0x80040002, 0x80ff0001, 0x80550000, 0x0300000a, 0x80020003, 0x80aa0002, - 0x80550002, 0x03000005, 0x80020002, 0x80aa0001, 0x80ff0000, 0x03000005, 0x80040002, 0x80ff0001, - 0x80aa0000, 0x0300000a, 0x80040003, 0x80aa0002, 0x80550002, 0x04000004, 0x80070001, 0x80000002, - 0x80e40001, 0x80e40003, 0x03000002, 0x80010002, 0x81ff0001, 0xa0000002, 0x04000004, 0x80070002, - 0x80000002, 0x80e40000, 0x80e40001, 0x03000002, 0x80010000, 0x80ff0001, 0x80ff0000, 0x04000004, - 0x80080002, 0x80ff0000, 0x81ff0001, 0x80000000, 0x02000001, 0x800f0800, 0x80e40002, 0x0000ffff, -}; - -static DWORD pshader_exceptional_blend_5[73] = { - 0xffff0200, 0x05000051, 0xa00f0002, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x03000042, 0x800f0000, 0xb0e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0xb0e40000, 0xa0e40801, - 0x03000005, 0x80070000, 0x80e40000, 0xa0e40000, 0x03000005, 0x800f0002, 0x80ff0000, 0xa0e40001, - 0x04000004, 0x801f0000, 0x80e40000, 0xa0ff0000, 0x80e40002, 0x03000002, 0x80010000, 0x80000000, - 0x80000001, 0x0300000a, 0x80010002, 0x80000000, 0xa0000002, 0x03000002, 0x80010000, 0x80550000, - 0x80550001, 0x0300000a, 0x80020002, 0x80000000, 0xa0000002, 0x03000002, 0x80010000, 0x80aa0000, - 0x80aa0001, 0x03000002, 0x80020000, 0x80ff0001, 0x80ff0000, 0x0300000a, 0x80080002, 0x80550000, - 0xa0000002, 0x0300000a, 0x80040002, 0x80000000, 0xa0000002, 0x02000001, 0x800f0800, 0x80e40002, - 0x0000ffff, -}; - -static DWORD pshader_exceptional_blend_6[73] = { - 0xffff0200, 0x05000051, 0xa00f0002, 0x00000000, 0x3f800000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x03000042, 0x800f0000, 0xb0e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0xb0e40000, 0xa0e40801, - 0x03000005, 0x80070000, 0x80e40000, 0xa0e40000, 0x03000005, 0x800f0002, 0x80ff0000, 0xa0e40001, - 0x04000004, 0x801f0000, 0x80e40000, 0xa0ff0000, 0x80e40002, 0x03000002, 0x80010000, 0x81000000, - 0x80000001, 0x0300000b, 0x80010002, 0x80000000, 0xa0000002, 0x03000002, 0x80010000, 0x81550000, - 0x80550001, 0x0300000b, 0x80020002, 0x80000000, 0xa0000002, 0x03000002, 0x80010000, 0x81aa0000, - 0x80aa0001, 0x03000002, 0x80020000, 0x80ff0001, 0x80ff0000, 0x0300000a, 0x80080002, 0x80550000, - 0xa0550002, 0x0300000b, 0x80040002, 0x80000000, 0xa0000002, 0x02000001, 0x800f0800, 0x80e40002, - 0x0000ffff, -}; - -static DWORD pshader_exceptional_blend_7[104] = { - 0xffff0200, 0x05000051, 0xa00f0002, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x03000042, 0x800f0000, 0xb0e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0xb0e40000, 0xa0e40801, - 0x03000005, 0x80070000, 0x80e40000, 0xa0e40000, 0x03000005, 0x800f0002, 0x80ff0000, 0xa0e40001, - 0x04000004, 0x801f0000, 0x80e40000, 0xa0ff0000, 0x80e40002, 0x03000002, 0x80010002, 0x81ff0000, - 0xa0000002, 0x03000005, 0x80020002, 0x80ff0001, 0x80000000, 0x04000004, 0x80020002, 0x80ff0000, - 0x80000001, 0x81550002, 0x02000023, 0x80010003, 0x80550002, 0x03000005, 0x80080003, 0x80ff0001, - 0x80550000, 0x04000004, 0x80080003, 0x80ff0000, 0x80550001, 0x81ff0003, 0x02000023, 0x80020003, - 0x80ff0003, 0x03000005, 0x80080003, 0x80ff0001, 0x80aa0000, 0x04000004, 0x80080003, 0x80ff0000, - 0x80aa0001, 0x81ff0003, 0x02000023, 0x80040003, 0x80ff0003, 0x04000004, 0x80070001, 0x80000002, - 0x80e40001, 0x80e40003, 0x03000002, 0x80010002, 0x81ff0001, 0xa0000002, 0x04000004, 0x80070002, - 0x80000002, 0x80e40000, 0x80e40001, 0x03000002, 0x80010000, 0x80ff0001, 0x80ff0000, 0x04000004, - 0x80080002, 0x80ff0000, 0x81ff0001, 0x80000000, 0x02000001, 0x800f0800, 0x80e40002, 0x0000ffff, -}; - -static DWORD pshader_exceptional_blend_8[92] = { - 0xffff0200, 0x05000051, 0xa00f0002, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x03000042, 0x800f0000, 0xb0e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0xb0e40000, 0xa0e40801, - 0x03000005, 0x80070000, 0x80e40000, 0xa0e40000, 0x03000005, 0x800f0002, 0x80ff0000, 0xa0e40001, - 0x04000004, 0x801f0000, 0x80e40000, 0xa0ff0000, 0x80e40002, 0x03000002, 0x80010002, 0x81ff0000, - 0xa0000002, 0x03000002, 0x80020002, 0x81000001, 0x80ff0001, 0x03000005, 0x80010003, 0x80ff0000, - 0x80550002, 0x03000002, 0x80080003, 0x81550001, 0x80ff0001, 0x03000005, 0x80020003, 0x80ff0000, - 0x80ff0003, 0x03000002, 0x80080003, 0x81aa0001, 0x80ff0001, 0x03000005, 0x80040003, 0x80ff0000, - 0x80ff0003, 0x04000004, 0x80070001, 0x80000002, 0x80e40001, 0x80e40003, 0x03000002, 0x80010002, - 0x81ff0001, 0xa0000002, 0x04000004, 0x80070002, 0x80000002, 0x80e40000, 0x80e40001, 0x03000002, - 0x80010000, 0x80ff0001, 0x80ff0000, 0x04000004, 0x80080002, 0x80ff0000, 0x81ff0001, 0x80000000, - 0x02000001, 0x800f0800, 0x80e40002, 0x0000ffff, -}; - -static DWORD pshader_exceptional_blend_9[177] = { - 0xffff0200, 0x05000051, 0xa00f0002, 0x3f000000, 0x3f800000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x03000042, 0x800f0000, 0xb0e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0xb0e40000, 0xa0e40801, - 0x03000005, 0x80070000, 0x80e40000, 0xa0e40000, 0x03000005, 0x800f0002, 0x80ff0000, 0xa0e40001, - 0x04000004, 0x801f0000, 0x80e40000, 0xa0ff0000, 0x80e40002, 0x03000002, 0x80010002, 0x81000000, - 0x80ff0000, 0x03000005, 0x80020002, 0x80ff0001, 0x80ff0000, 0x03000002, 0x80040002, 0x81000001, - 0x80ff0001, 0x03000002, 0x80040002, 0x80aa0002, 0x80aa0002, 0x04000004, 0x80010002, 0x80aa0002, - 0x81000002, 0x80550002, 0x03000005, 0x80040002, 0x80000000, 0x80000001, 0x03000002, 0x80040002, - 0x80aa0002, 0x80aa0002, 0x04000004, 0x80080002, 0x80ff0001, 0xa1000002, 0x80000001, 0x04000058, - 0x80010003, 0x80ff0002, 0x80000002, 0x80aa0002, 0x03000002, 0x80080003, 0x81550000, 0x80ff0000, - 0x03000002, 0x80010002, 0x81550001, 0x80ff0001, 0x03000002, 0x80010002, 0x80000002, 0x80000002, - 0x04000004, 0x80080003, 0x80000002, 0x81ff0003, 0x80550002, 0x03000005, 0x80010002, 0x80550000, - 0x80550001, 0x03000002, 0x80010002, 0x80000002, 0x80000002, 0x04000004, 0x80040002, 0x80ff0001, - 0xa1000002, 0x80550001, 0x04000058, 0x80020003, 0x80aa0002, 0x80ff0003, 0x80000002, 0x03000002, - 0x80080003, 0x81aa0000, 0x80ff0000, 0x03000002, 0x80010002, 0x81aa0001, 0x80ff0001, 0x03000002, - 0x80010002, 0x80000002, 0x80000002, 0x04000004, 0x80080003, 0x80000002, 0x81ff0003, 0x80550002, - 0x03000005, 0x80010002, 0x80aa0000, 0x80aa0001, 0x03000002, 0x80010002, 0x80000002, 0x80000002, - 0x04000004, 0x80020002, 0x80ff0001, 0xa1000002, 0x80aa0001, 0x04000058, 0x80040003, 0x80550002, - 0x80ff0003, 0x80000002, 0x03000002, 0x80080003, 0x81ff0000, 0xa0550002, 0x04000004, 0x80070001, - 0x80ff0003, 0x80e40001, 0x80e40003, 0x03000002, 0x80010002, 0x81ff0001, 0xa0550002, 0x04000004, - 0x80070002, 0x80000002, 0x80e40000, 0x80e40001, 0x03000002, 0x80010000, 0x80ff0001, 0x80ff0000, - 0x04000004, 0x80080002, 0x80ff0000, 0x81ff0001, 0x80000000, 0x02000001, 0x800f0800, 0x80e40002, - 0x0000ffff, -}; - -static DWORD pshader_exceptional_blend_10[177] = { - 0xffff0200, 0x05000051, 0xa00f0002, 0x3f000000, 0x3f800000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x03000042, 0x800f0000, 0xb0e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0xb0e40000, 0xa0e40801, - 0x03000005, 0x80070000, 0x80e40000, 0xa0e40000, 0x03000005, 0x800f0002, 0x80ff0000, 0xa0e40001, - 0x04000004, 0x801f0000, 0x80e40000, 0xa0ff0000, 0x80e40002, 0x04000004, 0x80010002, 0x80ff0000, - 0xa1000002, 0x80000000, 0x03000002, 0x80020002, 0x81000000, 0x80ff0000, 0x03000002, 0x80040002, - 0x81000001, 0x80ff0001, 0x03000002, 0x80040002, 0x80aa0002, 0x80aa0002, 0x03000005, 0x80080002, - 0x80ff0001, 0x80ff0000, 0x04000004, 0x80020002, 0x80aa0002, 0x81550002, 0x80ff0002, 0x03000005, - 0x80040002, 0x80000000, 0x80000001, 0x03000002, 0x80040002, 0x80aa0002, 0x80aa0002, 0x04000058, - 0x80010002, 0x80000002, 0x80550002, 0x80aa0002, 0x03000002, 0x80080003, 0x81550000, 0x80ff0000, - 0x03000002, 0x80010003, 0x81550001, 0x80ff0001, 0x03000002, 0x80010003, 0x80000003, 0x80000003, - 0x04000004, 0x80010003, 0x80000003, 0x81ff0003, 0x80ff0002, 0x04000004, 0x80020003, 0x80ff0000, - 0xa1000002, 0x80550000, 0x03000005, 0x80040003, 0x80550000, 0x80550001, 0x03000002, 0x80040003, - 0x80aa0003, 0x80aa0003, 0x04000058, 0x80020002, 0x80550003, 0x80000003, 0x80aa0003, 0x03000002, - 0x80010003, 0x81aa0000, 0x80ff0000, 0x03000002, 0x80020003, 0x81aa0001, 0x80ff0001, 0x03000002, - 0x80020003, 0x80550003, 0x80550003, 0x04000004, 0x80080002, 0x80550003, 0x81000003, 0x80ff0002, - 0x04000004, 0x80010003, 0x80ff0000, 0xa1000002, 0x80aa0000, 0x03000005, 0x80020003, 0x80aa0000, - 0x80aa0001, 0x03000002, 0x80020003, 0x80550003, 0x80550003, 0x04000058, 0x80040002, 0x80000003, - 0x80ff0002, 0x80550003, 0x03000002, 0x80080002, 0x81ff0000, 0xa0550002, 0x04000004, 0x80070001, - 0x80ff0002, 0x80e40001, 0x80e40002, 0x03000002, 0x80010002, 0x81ff0001, 0xa0550002, 0x04000004, - 0x80070002, 0x80000002, 0x80e40000, 0x80e40001, 0x03000002, 0x80010000, 0x80ff0001, 0x80ff0000, - 0x04000004, 0x80080002, 0x80ff0000, 0x81ff0001, 0x80000000, 0x02000001, 0x800f0800, 0x80e40002, - 0x0000ffff, -}; - -static DWORD pshader_exceptional_blend_11[49] = { - 0xffff0200, 0x05000051, 0xa00f0002, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x03000042, 0x800f0000, 0xb0e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0xb0e40000, 0xa0e40801, - 0x03000005, 0x80010000, 0x80ff0000, 0xa0ff0001, 0x04000004, 0x80110000, 0x80ff0000, 0xa0ff0000, - 0x80000000, 0x03000002, 0x80010000, 0x81000000, 0xa0000002, 0x03000005, 0x80070002, 0x80000000, - 0x80e40001, 0x03000005, 0x80080002, 0x80ff0001, 0x80000000, 0x02000001, 0x800f0800, 0x80e40002, - 0x0000ffff, -}; - -static DWORD pshader_exceptional_blend_12[39] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, - 0x90000000, 0xa00f0801, 0x03000042, 0x800f0000, 0xb0e40000, 0xa0e40800, 0x03000042, 0x800f0001, - 0xb0e40000, 0xa0e40801, 0x03000005, 0x80010000, 0x80ff0000, 0xa0ff0001, 0x04000004, 0x80110000, - 0x80ff0000, 0xa0ff0000, 0x80000000, 0x03000005, 0x80070002, 0x80000000, 0x80e40001, 0x03000005, - 0x80080002, 0x80ff0001, 0x80000000, 0x02000001, 0x800f0800, 0x80e40002, 0x0000ffff, -}; - -static ProgramWithCachedVariableLocations pshader_exceptional_blend_arr[13] = { - { NULL, NULL, { -1, -1, -1, -1, } }, - { pshader_exceptional_blend_1, NULL, { 0, 1, 0, 1, } }, - { pshader_exceptional_blend_2, NULL, { 0, 1, 0, 1, } }, - { pshader_exceptional_blend_3, NULL, { 0, 1, 0, 1, } }, - { pshader_exceptional_blend_4, NULL, { 0, 1, 0, 1, } }, - { pshader_exceptional_blend_5, NULL, { 0, 1, 0, 1, } }, - { pshader_exceptional_blend_6, NULL, { 0, 1, 0, 1, } }, - { pshader_exceptional_blend_7, NULL, { 0, 1, 0, 1, } }, - { pshader_exceptional_blend_8, NULL, { 0, 1, 0, 1, } }, - { pshader_exceptional_blend_9, NULL, { 0, 1, 0, 1, } }, - { pshader_exceptional_blend_10, NULL, { 0, 1, 0, 1, } }, - { pshader_exceptional_blend_11, NULL, { 0, 1, 0, 1, } }, - { pshader_exceptional_blend_12, NULL, { 0, 1, 0, 1, } }, -}; - -static DWORD pshader_filter_0[77] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40007, 0x0300000b, 0x80030001, 0x80e40000, 0xa0e40004, - 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, 0x80020000, 0xa0ff0004, 0x80550001, - 0x0300000b, 0x800c0000, 0xb01b0000, 0xa01b0005, 0x0300000a, 0x80010001, 0xa0aa0005, 0x80ff0000, - 0x0300000a, 0x80020001, 0xa0ff0005, 0x80aa0000, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, - 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40801, 0x03000005, 0x80010000, 0x80ff0000, 0xa0aa0007, - 0x0300000a, 0x80080002, 0x80000000, 0xa0000000, 0x03000005, 0x800f0000, 0x80ff0002, 0xa0e40006, - 0x03000002, 0x80010002, 0x81ff0001, 0xa0000000, 0x04000004, 0x800f0000, 0x80e40000, 0x80000002, - 0x80e40001, 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_filter_1[76] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40007, 0x0300000b, 0x80030001, 0x80e40000, 0xa0e40004, - 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, 0x80020000, 0xa0ff0004, 0x80550001, - 0x0300000b, 0x800c0000, 0xb01b0000, 0xa01b0005, 0x0300000a, 0x80010001, 0xa0aa0005, 0x80ff0000, - 0x0300000a, 0x80020001, 0xa0ff0005, 0x80aa0000, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, - 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40801, 0x03000005, 0x80010000, 0x80ff0000, 0xa0aa0007, - 0x0300000a, 0x80010001, 0x80000000, 0xa0000000, 0x03000002, 0x80010000, 0x81ff0001, 0xa0000000, - 0x03000005, 0x800f0000, 0x80000000, 0xa0e40006, 0x03000005, 0x800f0000, 0x80000001, 0x80e40000, - 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_filter_2[83] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f800000, 0x3f000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x0200001f, 0x90000000, 0xa00f0802, 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40006, 0x0300000b, - 0x80030001, 0x80e40000, 0xa0e40004, 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, - 0x80020000, 0xa0ff0004, 0x80550001, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000005, - 0x80010000, 0x80ff0000, 0xa0aa0006, 0x0300000a, 0x80010001, 0x80000000, 0xa0000000, 0x02000001, - 0x80020001, 0xa0550000, 0x0300000b, 0x80030000, 0xb0e40000, 0xa0e40005, 0x0300000a, 0x80010002, - 0xa0aa0005, 0x80000000, 0x0300000a, 0x80020002, 0xa0ff0005, 0x80550000, 0x03000042, 0x800f0000, - 0x80e40001, 0xa0e40802, 0x03000042, 0x800f0001, 0x80e40002, 0xa0e40801, 0x03000002, 0x80010002, - 0x81ff0001, 0xa0000000, 0x04000004, 0x800f0000, 0x80e40000, 0x80000002, 0x80e40001, 0x02000001, - 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_filter_3[82] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f800000, 0x3f000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x0200001f, 0x90000000, 0xa00f0802, 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40006, 0x0300000b, - 0x80030001, 0x80e40000, 0xa0e40004, 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, - 0x80020000, 0xa0ff0004, 0x80550001, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000005, - 0x80010000, 0x80ff0000, 0xa0aa0006, 0x0300000a, 0x80010001, 0x80000000, 0xa0000000, 0x02000001, - 0x80020001, 0xa0550000, 0x0300000b, 0x80030000, 0xb0e40000, 0xa0e40005, 0x0300000a, 0x80010002, - 0xa0aa0005, 0x80000000, 0x0300000a, 0x80020002, 0xa0ff0005, 0x80550000, 0x03000042, 0x800f0000, - 0x80e40001, 0xa0e40802, 0x03000042, 0x800f0001, 0x80e40002, 0xa0e40801, 0x03000002, 0x80010001, - 0x81ff0001, 0xa0000000, 0x03000005, 0x800f0000, 0x80e40000, 0x80000001, 0x02000001, 0x800f0800, - 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_filter_4[89] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40007, 0x0300000b, 0x80030001, 0x80e40000, 0xa0e40004, - 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, 0x80020000, 0xa0ff0004, 0x80550001, - 0x0300000b, 0x800c0000, 0xb01b0000, 0xa01b0005, 0x0300000a, 0x80010001, 0xa0aa0005, 0x80ff0000, - 0x0300000a, 0x80020001, 0xa0ff0005, 0x80aa0000, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, - 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40801, 0x03000002, 0x80010000, 0x81ff0000, 0xa0000000, - 0x03000005, 0x80010000, 0x80000000, 0xa0aa0007, 0x0300000a, 0x80080002, 0x80000000, 0xa0000000, - 0x03000005, 0x80070000, 0x80ff0002, 0xa0e40006, 0x02000001, 0x80080000, 0xa0ff0006, 0x04000004, - 0x80080000, 0x80ff0000, 0x81ff0002, 0xa0000000, 0x03000005, 0x80070002, 0x80ff0000, 0x80e40001, - 0x04000004, 0x80070001, 0x80e40000, 0x80ff0001, 0x80e40002, 0x02000001, 0x800f0800, 0x80e40001, - 0x0000ffff, -}; - -static DWORD pshader_filter_5[76] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40007, 0x0300000b, 0x80030001, 0x80e40000, 0xa0e40004, - 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, 0x80020000, 0xa0ff0004, 0x80550001, - 0x0300000b, 0x800c0000, 0xb01b0000, 0xa01b0005, 0x0300000a, 0x80010001, 0xa0aa0005, 0x80ff0000, - 0x0300000a, 0x80020001, 0xa0ff0005, 0x80aa0000, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, - 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40801, 0x03000002, 0x80010000, 0x81ff0000, 0xa0000000, - 0x03000005, 0x80010000, 0x80000000, 0xa0aa0007, 0x0300000a, 0x80010001, 0x80000000, 0xa0000000, - 0x03000005, 0x800f0000, 0x80ff0001, 0xa0e40006, 0x03000005, 0x800f0000, 0x80000001, 0x80e40000, - 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_filter_6[87] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f800000, 0x3f000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x0200001f, 0x90000000, 0xa00f0802, 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40006, 0x0300000b, - 0x80030001, 0x80e40000, 0xa0e40004, 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, - 0x80020000, 0xa0ff0004, 0x80550001, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000005, - 0x80010000, 0x80ff0000, 0xa0aa0006, 0x0300000a, 0x80010001, 0x80000000, 0xa0000000, 0x02000001, - 0x80020001, 0xa0550000, 0x0300000b, 0x80030000, 0xb0e40000, 0xa0e40005, 0x0300000a, 0x80010002, - 0xa0aa0005, 0x80000000, 0x0300000a, 0x80020002, 0xa0ff0005, 0x80550000, 0x03000042, 0x800f0000, - 0x80e40001, 0xa0e40802, 0x03000042, 0x800f0001, 0x80e40002, 0xa0e40801, 0x03000002, 0x80080000, - 0x81ff0000, 0xa0000000, 0x03000005, 0x80070002, 0x80ff0000, 0x80e40001, 0x04000004, 0x80070001, - 0x80e40000, 0x80ff0001, 0x80e40002, 0x02000001, 0x800f0800, 0x80e40001, 0x0000ffff, -}; - -static DWORD pshader_filter_7[78] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f800000, 0x3f000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x0200001f, 0x90000000, 0xa00f0802, 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40006, 0x0300000b, - 0x80030001, 0x80e40000, 0xa0e40004, 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, - 0x80020000, 0xa0ff0004, 0x80550001, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000005, - 0x80010000, 0x80ff0000, 0xa0aa0006, 0x0300000a, 0x80010001, 0x80000000, 0xa0000000, 0x02000001, - 0x80020001, 0xa0550000, 0x0300000b, 0x80030000, 0xb0e40000, 0xa0e40005, 0x0300000a, 0x80010002, - 0xa0aa0005, 0x80000000, 0x0300000a, 0x80020002, 0xa0ff0005, 0x80550000, 0x03000042, 0x800f0000, - 0x80e40001, 0xa0e40802, 0x03000042, 0x800f0001, 0x80e40002, 0xa0e40801, 0x03000005, 0x800f0000, - 0x80e40000, 0x80ff0001, 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_filter_8[45] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0801, 0x0300000b, 0x80030000, 0xb0e40000, - 0xa0e40004, 0x0300000a, 0x80010001, 0xa0aa0004, 0x80000000, 0x0300000a, 0x80020001, 0xa0ff0004, - 0x80550000, 0x03000042, 0x800f0000, 0x80e40001, 0xa0e40801, 0x02000001, 0x80080001, 0xa0ff0005, - 0x03000002, 0x80010001, 0x81ff0001, 0xa0000000, 0x04000004, 0x800f0000, 0x80e40000, 0x80000001, - 0xa0e40005, 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_filter_9[5] = { - 0xffff0200, 0x02000001, 0x800f0800, 0xa0e40004, 0x0000ffff, -}; - -static DWORD pshader_filter_10[83] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f800000, 0x3f000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x0200001f, 0x90000000, 0xa00f0802, 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40006, 0x0300000b, - 0x80030001, 0x80e40000, 0xa0e40004, 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, - 0x80020000, 0xa0ff0004, 0x80550001, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000005, - 0x80010000, 0x80ff0000, 0xa0aa0006, 0x0300000a, 0x80010001, 0x80000000, 0xa0000000, 0x02000001, - 0x80020001, 0xa0550000, 0x0300000b, 0x80030000, 0xb0e40000, 0xa0e40005, 0x0300000a, 0x80010002, - 0xa0aa0005, 0x80000000, 0x0300000a, 0x80020002, 0xa0ff0005, 0x80550000, 0x03000042, 0x800f0000, - 0x80e40001, 0xa0e40802, 0x03000042, 0x800f0001, 0x80e40002, 0xa0e40801, 0x03000002, 0x80010002, - 0x81ff0000, 0xa0000000, 0x04000004, 0x800f0000, 0x80e40001, 0x80000002, 0x80e40000, 0x02000001, - 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_filter_11[55] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f800000, 0x3f000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0802, - 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40005, 0x0300000b, 0x80030001, 0x80e40000, 0xa0e40004, - 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, 0x80020000, 0xa0ff0004, 0x80550001, - 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000005, 0x80010000, 0x80ff0000, 0xa0aa0005, - 0x0300000a, 0x80010001, 0x80000000, 0xa0000000, 0x02000001, 0x80020001, 0xa0550000, 0x03000042, - 0x800f0000, 0x80e40001, 0xa0e40802, 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_filter_16[108] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40008, 0x0300000b, 0x80030001, 0x80e40000, 0xa0e40004, - 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, 0x80020000, 0xa0ff0004, 0x80550001, - 0x03000002, 0x800c0000, 0xb01b0000, 0xa11b0008, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e40004, - 0x0300000a, 0x80010002, 0xa0aa0004, 0x80000001, 0x0300000a, 0x80020002, 0xa0ff0004, 0x80550001, - 0x0300000b, 0x800c0000, 0xb01b0000, 0xa01b0005, 0x0300000a, 0x80010001, 0xa0aa0005, 0x80ff0000, - 0x0300000a, 0x80020001, 0xa0ff0005, 0x80aa0000, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, - 0x03000042, 0x800f0002, 0x80e40002, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40801, - 0x03000002, 0x80010000, 0x81ff0000, 0x80ff0002, 0x03000005, 0x80010000, 0x80000000, 0xa0aa0008, - 0x02000001, 0x80120000, 0x80000000, 0x02000001, 0x80110000, 0x81000000, 0x03000005, 0x800f0002, - 0x80550000, 0xa0e40007, 0x04000004, 0x800f0000, 0x80000000, 0xa0e40006, 0x80e40002, 0x03000002, - 0x80010002, 0x81ff0001, 0xa0000000, 0x04000004, 0x800f0000, 0x80e40000, 0x80000002, 0x80e40001, - 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_filter_17[107] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40008, 0x0300000b, 0x80030001, 0x80e40000, 0xa0e40004, - 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, 0x80020000, 0xa0ff0004, 0x80550001, - 0x03000002, 0x800c0000, 0xb01b0000, 0xa11b0008, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e40004, - 0x0300000a, 0x80010002, 0xa0aa0004, 0x80000001, 0x0300000a, 0x80020002, 0xa0ff0004, 0x80550001, - 0x0300000b, 0x800c0000, 0xb01b0000, 0xa01b0005, 0x0300000a, 0x80010001, 0xa0aa0005, 0x80ff0000, - 0x0300000a, 0x80020001, 0xa0ff0005, 0x80aa0000, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, - 0x03000042, 0x800f0002, 0x80e40002, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40801, - 0x03000002, 0x80010000, 0x81ff0000, 0x80ff0002, 0x03000005, 0x80010000, 0x80000000, 0xa0aa0008, - 0x02000001, 0x80120000, 0x80000000, 0x02000001, 0x80110000, 0x81000000, 0x03000005, 0x800f0002, - 0x80550000, 0xa0e40007, 0x04000004, 0x800f0000, 0x80000000, 0xa0e40006, 0x80e40002, 0x03000002, - 0x80010001, 0x81ff0001, 0xa0000000, 0x03000005, 0x800f0000, 0x80e40000, 0x80000001, 0x02000001, - 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_filter_18[108] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f000000, 0x3f800000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x0200001f, 0x90000000, 0xa00f0802, 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40006, 0x0300000b, - 0x80030001, 0x80e40000, 0xa0e40004, 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, - 0x80020000, 0xa0ff0004, 0x80550001, 0x03000002, 0x800c0000, 0xb01b0000, 0xa11b0006, 0x0300000b, - 0x80030001, 0x801b0000, 0xa0e40004, 0x0300000a, 0x80010002, 0xa0aa0004, 0x80000001, 0x0300000a, - 0x80020002, 0xa0ff0004, 0x80550001, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, - 0x800f0001, 0x80e40002, 0xa0e40800, 0x03000002, 0x80010000, 0x81ff0000, 0x80ff0001, 0x03000005, - 0x80010000, 0x80000000, 0xa0aa0006, 0x04000004, 0x80110000, 0x80000000, 0xa0000000, 0xa0000000, - 0x02000001, 0x80020000, 0xa0000000, 0x0300000b, 0x800c0000, 0xb01b0000, 0xa01b0005, 0x0300000a, - 0x80010001, 0xa0aa0005, 0x80ff0000, 0x0300000a, 0x80020001, 0xa0ff0005, 0x80aa0000, 0x03000042, - 0x800f0000, 0x80e40000, 0xa0e40802, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40801, 0x03000002, - 0x80010002, 0x81ff0001, 0xa0550000, 0x04000004, 0x800f0000, 0x80e40000, 0x80000002, 0x80e40001, - 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_filter_19[107] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f000000, 0x3f800000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x0200001f, 0x90000000, 0xa00f0802, 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40006, 0x0300000b, - 0x80030001, 0x80e40000, 0xa0e40004, 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, - 0x80020000, 0xa0ff0004, 0x80550001, 0x03000002, 0x800c0000, 0xb01b0000, 0xa11b0006, 0x0300000b, - 0x80030001, 0x801b0000, 0xa0e40004, 0x0300000a, 0x80010002, 0xa0aa0004, 0x80000001, 0x0300000a, - 0x80020002, 0xa0ff0004, 0x80550001, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, - 0x800f0001, 0x80e40002, 0xa0e40800, 0x03000002, 0x80010000, 0x81ff0000, 0x80ff0001, 0x03000005, - 0x80010000, 0x80000000, 0xa0aa0006, 0x04000004, 0x80110000, 0x80000000, 0xa0000000, 0xa0000000, - 0x02000001, 0x80020000, 0xa0000000, 0x0300000b, 0x800c0000, 0xb01b0000, 0xa01b0005, 0x0300000a, - 0x80010001, 0xa0aa0005, 0x80ff0000, 0x0300000a, 0x80020001, 0xa0ff0005, 0x80aa0000, 0x03000042, - 0x800f0000, 0x80e40000, 0xa0e40802, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40801, 0x03000002, - 0x80010001, 0x81ff0001, 0xa0550000, 0x03000005, 0x800f0000, 0x80e40000, 0x80000001, 0x02000001, - 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_filter_20[112] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40008, 0x0300000b, 0x80030001, 0x80e40000, 0xa0e40004, - 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, 0x80020000, 0xa0ff0004, 0x80550001, - 0x03000002, 0x800c0000, 0xb01b0000, 0xa11b0008, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e40004, - 0x0300000a, 0x80010002, 0xa0aa0004, 0x80000001, 0x0300000a, 0x80020002, 0xa0ff0004, 0x80550001, - 0x0300000b, 0x800c0000, 0xb01b0000, 0xa01b0005, 0x0300000a, 0x80010001, 0xa0aa0005, 0x80ff0000, - 0x0300000a, 0x80020001, 0xa0ff0005, 0x80aa0000, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, - 0x03000042, 0x800f0002, 0x80e40002, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40801, - 0x03000002, 0x80010000, 0x81ff0000, 0x80ff0002, 0x03000005, 0x80010000, 0x80000000, 0xa0aa0008, - 0x02000001, 0x80120000, 0x80000000, 0x02000001, 0x80110000, 0x81000000, 0x03000005, 0x800f0002, - 0x80550000, 0xa0e40007, 0x04000004, 0x800f0000, 0x80000000, 0xa0e40006, 0x80e40002, 0x03000002, - 0x80080000, 0x81ff0000, 0xa0000000, 0x03000005, 0x80070002, 0x80ff0000, 0x80e40001, 0x04000004, - 0x80070001, 0x80e40000, 0x80ff0001, 0x80e40002, 0x02000001, 0x800f0800, 0x80e40001, 0x0000ffff, -}; - -static DWORD pshader_filter_21[97] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, - 0x90000000, 0xa00f0801, 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40008, 0x0300000b, 0x80030001, - 0x80e40000, 0xa0e40004, 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, 0x80020000, - 0xa0ff0004, 0x80550001, 0x03000002, 0x800c0000, 0xb01b0000, 0xa11b0008, 0x0300000b, 0x80030001, - 0x801b0000, 0xa0e40004, 0x0300000a, 0x80010002, 0xa0aa0004, 0x80000001, 0x0300000a, 0x80020002, - 0xa0ff0004, 0x80550001, 0x0300000b, 0x800c0000, 0xb01b0000, 0xa01b0005, 0x0300000a, 0x80010001, - 0xa0aa0005, 0x80ff0000, 0x0300000a, 0x80020001, 0xa0ff0005, 0x80aa0000, 0x03000042, 0x800f0000, - 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0002, 0x80e40002, 0xa0e40800, 0x03000042, 0x800f0001, - 0x80e40001, 0xa0e40801, 0x03000002, 0x80010000, 0x81ff0000, 0x80ff0002, 0x03000005, 0x80010000, - 0x80000000, 0xa0aa0008, 0x02000001, 0x80120000, 0x80000000, 0x02000001, 0x80110000, 0x81000000, - 0x03000005, 0x800f0002, 0x80550000, 0xa0e40007, 0x04000004, 0x800f0000, 0x80000000, 0xa0e40006, - 0x80e40002, 0x03000005, 0x800f0000, 0x80ff0001, 0x80e40000, 0x02000001, 0x800f0800, 0x80e40000, - 0x0000ffff, -}; - -static DWORD pshader_filter_22[112] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f000000, 0x3f800000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x0200001f, 0x90000000, 0xa00f0802, 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40006, 0x0300000b, - 0x80030001, 0x80e40000, 0xa0e40004, 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, - 0x80020000, 0xa0ff0004, 0x80550001, 0x03000002, 0x800c0000, 0xb01b0000, 0xa11b0006, 0x0300000b, - 0x80030001, 0x801b0000, 0xa0e40004, 0x0300000a, 0x80010002, 0xa0aa0004, 0x80000001, 0x0300000a, - 0x80020002, 0xa0ff0004, 0x80550001, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, - 0x800f0001, 0x80e40002, 0xa0e40800, 0x03000002, 0x80010000, 0x81ff0000, 0x80ff0001, 0x03000005, - 0x80010000, 0x80000000, 0xa0aa0006, 0x04000004, 0x80110000, 0x80000000, 0xa0000000, 0xa0000000, - 0x02000001, 0x80020000, 0xa0000000, 0x0300000b, 0x800c0000, 0xb01b0000, 0xa01b0005, 0x0300000a, - 0x80010001, 0xa0aa0005, 0x80ff0000, 0x0300000a, 0x80020001, 0xa0ff0005, 0x80aa0000, 0x03000042, - 0x800f0000, 0x80e40000, 0xa0e40802, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40801, 0x03000002, - 0x80080000, 0x81ff0000, 0xa0550000, 0x03000005, 0x80070002, 0x80ff0000, 0x80e40001, 0x04000004, - 0x80070001, 0x80e40000, 0x80ff0001, 0x80e40002, 0x02000001, 0x800f0800, 0x80e40001, 0x0000ffff, -}; - -static DWORD pshader_filter_23[103] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f000000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x0200001f, 0x90000000, 0xa00f0802, 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40006, 0x0300000b, - 0x80030001, 0x80e40000, 0xa0e40004, 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, - 0x80020000, 0xa0ff0004, 0x80550001, 0x03000002, 0x800c0000, 0xb01b0000, 0xa11b0006, 0x0300000b, - 0x80030001, 0x801b0000, 0xa0e40004, 0x0300000a, 0x80010002, 0xa0aa0004, 0x80000001, 0x0300000a, - 0x80020002, 0xa0ff0004, 0x80550001, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, - 0x800f0001, 0x80e40002, 0xa0e40800, 0x03000002, 0x80010000, 0x81ff0000, 0x80ff0001, 0x03000005, - 0x80010000, 0x80000000, 0xa0aa0006, 0x04000004, 0x80110000, 0x80000000, 0xa0000000, 0xa0000000, - 0x02000001, 0x80020000, 0xa0000000, 0x0300000b, 0x800c0000, 0xb01b0000, 0xa01b0005, 0x0300000a, - 0x80010001, 0xa0aa0005, 0x80ff0000, 0x0300000a, 0x80020001, 0xa0ff0005, 0x80aa0000, 0x03000042, - 0x800f0000, 0x80e40000, 0xa0e40802, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40801, 0x03000005, - 0x800f0000, 0x80e40000, 0x80ff0001, 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_filter_24[108] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40008, 0x0300000b, 0x80030001, 0x80e40000, 0xa0e40004, - 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, 0x80020000, 0xa0ff0004, 0x80550001, - 0x03000002, 0x800c0000, 0xb01b0000, 0xa11b0008, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e40004, - 0x0300000a, 0x80010002, 0xa0aa0004, 0x80000001, 0x0300000a, 0x80020002, 0xa0ff0004, 0x80550001, - 0x0300000b, 0x800c0000, 0xb01b0000, 0xa01b0005, 0x0300000a, 0x80010001, 0xa0aa0005, 0x80ff0000, - 0x0300000a, 0x80020001, 0xa0ff0005, 0x80aa0000, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, - 0x03000042, 0x800f0002, 0x80e40002, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40801, - 0x03000002, 0x80010000, 0x81ff0000, 0x80ff0002, 0x03000005, 0x80010000, 0x80000000, 0xa0aa0008, - 0x02000001, 0x80120000, 0x80000000, 0x02000001, 0x80110000, 0x81000000, 0x03000005, 0x800f0002, - 0x80550000, 0xa0e40007, 0x04000004, 0x800f0000, 0x80000000, 0xa0e40006, 0x80e40002, 0x03000002, - 0x80010002, 0x81ff0000, 0xa0000000, 0x04000004, 0x800f0000, 0x80e40001, 0x80000002, 0x80e40000, - 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_filter_25[74] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x03000002, - 0x80030000, 0xb0e40000, 0xa0e40007, 0x0300000b, 0x80030001, 0x80e40000, 0xa0e40004, 0x0300000a, - 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, 0x80020000, 0xa0ff0004, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa11b0007, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e40004, 0x0300000a, - 0x80010002, 0xa0aa0004, 0x80000001, 0x0300000a, 0x80020002, 0xa0ff0004, 0x80550001, 0x03000042, - 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40002, 0xa0e40800, 0x03000002, - 0x80010000, 0x81ff0000, 0x80ff0001, 0x03000005, 0x80010000, 0x80000000, 0xa0aa0007, 0x02000001, - 0x80120000, 0x80000000, 0x02000001, 0x80110000, 0x81000000, 0x03000005, 0x800f0001, 0x80550000, - 0xa0e40006, 0x04000004, 0x800f0000, 0x80000000, 0xa0e40005, 0x80e40001, 0x02000001, 0x800f0800, - 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_filter_26[108] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f000000, 0x3f800000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0801, - 0x0200001f, 0x90000000, 0xa00f0802, 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40006, 0x0300000b, - 0x80030001, 0x80e40000, 0xa0e40004, 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, - 0x80020000, 0xa0ff0004, 0x80550001, 0x03000002, 0x800c0000, 0xb01b0000, 0xa11b0006, 0x0300000b, - 0x80030001, 0x801b0000, 0xa0e40004, 0x0300000a, 0x80010002, 0xa0aa0004, 0x80000001, 0x0300000a, - 0x80020002, 0xa0ff0004, 0x80550001, 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, - 0x800f0001, 0x80e40002, 0xa0e40800, 0x03000002, 0x80010000, 0x81ff0000, 0x80ff0001, 0x03000005, - 0x80010000, 0x80000000, 0xa0aa0006, 0x04000004, 0x80110000, 0x80000000, 0xa0000000, 0xa0000000, - 0x02000001, 0x80020000, 0xa0000000, 0x0300000b, 0x800c0000, 0xb01b0000, 0xa01b0005, 0x0300000a, - 0x80010001, 0xa0aa0005, 0x80ff0000, 0x0300000a, 0x80020001, 0xa0ff0005, 0x80aa0000, 0x03000042, - 0x800f0000, 0x80e40000, 0xa0e40802, 0x03000042, 0x800f0001, 0x80e40001, 0xa0e40801, 0x03000002, - 0x80010002, 0x81ff0000, 0xa0550000, 0x04000004, 0x800f0000, 0x80e40001, 0x80000002, 0x80e40000, - 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_filter_27[80] = { - 0xffff0200, 0x05000051, 0xa00f0000, 0x3f000000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x0200001f, 0x90000000, 0xa00f0802, - 0x03000002, 0x80030000, 0xb0e40000, 0xa0e40005, 0x0300000b, 0x80030001, 0x80e40000, 0xa0e40004, - 0x0300000a, 0x80010000, 0xa0aa0004, 0x80000001, 0x0300000a, 0x80020000, 0xa0ff0004, 0x80550001, - 0x03000002, 0x800c0000, 0xb01b0000, 0xa11b0005, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e40004, - 0x0300000a, 0x80010002, 0xa0aa0004, 0x80000001, 0x0300000a, 0x80020002, 0xa0ff0004, 0x80550001, - 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40002, 0xa0e40800, - 0x03000002, 0x80010000, 0x81ff0000, 0x80ff0001, 0x03000005, 0x80010000, 0x80000000, 0xa0aa0005, - 0x04000004, 0x80110000, 0x80000000, 0xa0000000, 0xa0000000, 0x02000001, 0x80020000, 0xa0000000, - 0x03000042, 0x800f0000, 0x80e40000, 0xa0e40802, 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static ProgramWithCachedVariableLocations pshader_filter_arr[32] = { - { pshader_filter_0, NULL, { 0, 1, 6, 7, -1, 4, 5, -1, } }, - { pshader_filter_1, NULL, { 0, 1, 6, 7, -1, 4, 5, -1, } }, - { pshader_filter_2, NULL, { 0, 1, -1, 6, 2, 4, 5, -1, } }, - { pshader_filter_3, NULL, { 0, 1, -1, 6, 2, 4, 5, -1, } }, - { pshader_filter_4, NULL, { 0, 1, 6, 7, -1, 4, 5, -1, } }, - { pshader_filter_5, NULL, { 0, 1, 6, 7, -1, 4, 5, -1, } }, - { pshader_filter_6, NULL, { 0, 1, -1, 6, 2, 4, 5, -1, } }, - { pshader_filter_7, NULL, { 0, 1, -1, 6, 2, 4, 5, -1, } }, - { pshader_filter_8, NULL, { -1, 1, 5, -1, -1, -1, 4, -1, } }, - { pshader_filter_9, NULL, { -1, -1, 4, -1, -1, -1, -1, -1, } }, - { pshader_filter_10, NULL, { 0, 1, -1, 6, 2, 4, 5, -1, } }, - { pshader_filter_11, NULL, { 0, -1, -1, 5, 2, 4, -1, -1, } }, - { NULL, NULL, { -1, -1, -1, -1, -1, -1, -1, -1, } }, - { NULL, NULL, { -1, -1, -1, -1, -1, -1, -1, -1, } }, - { NULL, NULL, { -1, -1, -1, -1, -1, -1, -1, -1, } }, - { NULL, NULL, { -1, -1, -1, -1, -1, -1, -1, -1, } }, - { pshader_filter_16, NULL, { 0, 1, 6, 8, -1, 4, 5, 7, } }, - { pshader_filter_17, NULL, { 0, 1, 6, 8, -1, 4, 5, 7, } }, - { pshader_filter_18, NULL, { 0, 1, -1, 6, 2, 4, 5, -1, } }, - { pshader_filter_19, NULL, { 0, 1, -1, 6, 2, 4, 5, -1, } }, - { pshader_filter_20, NULL, { 0, 1, 6, 8, -1, 4, 5, 7, } }, - { pshader_filter_21, NULL, { 0, 1, 6, 8, -1, 4, 5, 7, } }, - { pshader_filter_22, NULL, { 0, 1, -1, 6, 2, 4, 5, -1, } }, - { pshader_filter_23, NULL, { 0, 1, -1, 6, 2, 4, 5, -1, } }, - { pshader_filter_24, NULL, { 0, 1, 6, 8, -1, 4, 5, 7, } }, - { pshader_filter_25, NULL, { 0, -1, 5, 7, -1, 4, -1, 6, } }, - { pshader_filter_26, NULL, { 0, 1, -1, 6, 2, 4, 5, -1, } }, - { pshader_filter_27, NULL, { 0, -1, -1, 5, 2, 4, -1, -1, } }, - { NULL, NULL, { -1, -1, -1, -1, -1, -1, -1, -1, } }, - { NULL, NULL, { -1, -1, -1, -1, -1, -1, -1, -1, } }, - { NULL, NULL, { -1, -1, -1, -1, -1, -1, -1, -1, } }, - { NULL, NULL, { -1, -1, -1, -1, -1, -1, -1, -1, } }, -}; - -static DWORD pshader_blur_2[60] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x03000002, - 0x80030000, 0xb0e40000, 0xa0e40005, 0x0300000b, 0x80030001, 0x80e40000, 0xa0e40006, 0x0300000a, - 0x80010000, 0xa0aa0006, 0x80000001, 0x0300000a, 0x80020000, 0xa0ff0006, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0004, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e40006, 0x0300000a, - 0x80010002, 0xa0aa0006, 0x80000001, 0x0300000a, 0x80020002, 0xa0ff0006, 0x80550001, 0x03000042, - 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40002, 0xa0e40800, 0x03000005, - 0x800f0000, 0x80e40000, 0xa0aa0005, 0x04000004, 0x800f0000, 0x80e40001, 0xa0aa0004, 0x80e40000, - 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_blur_3[85] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x03000002, - 0x80030000, 0xb0e40000, 0xa0e40005, 0x0300000b, 0x80030001, 0x80e40000, 0xa0e40007, 0x0300000a, - 0x80010000, 0xa0aa0007, 0x80000001, 0x0300000a, 0x80020000, 0xa0ff0007, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0004, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e40007, 0x0300000a, - 0x80010002, 0xa0aa0007, 0x80000001, 0x0300000a, 0x80020002, 0xa0ff0007, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0006, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e40007, 0x0300000a, - 0x80010003, 0xa0aa0007, 0x80000001, 0x0300000a, 0x80020003, 0xa0ff0007, 0x80550001, 0x03000042, - 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40002, 0xa0e40800, 0x03000042, - 0x800f0002, 0x80e40003, 0xa0e40800, 0x03000005, 0x800f0000, 0x80e40000, 0xa0aa0005, 0x04000004, - 0x800f0000, 0x80e40001, 0xa0aa0004, 0x80e40000, 0x04000004, 0x800f0000, 0x80e40002, 0xa0aa0006, - 0x80e40000, 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_blur_4[110] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x03000002, - 0x80030000, 0xb0e40000, 0xa0e40005, 0x0300000b, 0x80030001, 0x80e40000, 0xa0e40008, 0x0300000a, - 0x80010000, 0xa0aa0008, 0x80000001, 0x0300000a, 0x80020000, 0xa0ff0008, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0004, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e40008, 0x0300000a, - 0x80010002, 0xa0aa0008, 0x80000001, 0x0300000a, 0x80020002, 0xa0ff0008, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0006, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e40008, 0x0300000a, - 0x80010003, 0xa0aa0008, 0x80000001, 0x0300000a, 0x80020003, 0xa0ff0008, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0007, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e40008, 0x0300000a, - 0x80010004, 0xa0aa0008, 0x80000001, 0x0300000a, 0x80020004, 0xa0ff0008, 0x80550001, 0x03000042, - 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40002, 0xa0e40800, 0x03000042, - 0x800f0002, 0x80e40003, 0xa0e40800, 0x03000042, 0x800f0003, 0x80e40004, 0xa0e40800, 0x03000005, - 0x800f0000, 0x80e40000, 0xa0aa0005, 0x04000004, 0x800f0000, 0x80e40001, 0xa0aa0004, 0x80e40000, - 0x04000004, 0x800f0000, 0x80e40002, 0xa0aa0006, 0x80e40000, 0x04000004, 0x800f0000, 0x80e40003, - 0xa0aa0007, 0x80e40000, 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_blur_5[135] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x03000002, - 0x80030000, 0xb0e40000, 0xa0e40005, 0x0300000b, 0x80030001, 0x80e40000, 0xa0e40009, 0x0300000a, - 0x80010000, 0xa0aa0009, 0x80000001, 0x0300000a, 0x80020000, 0xa0ff0009, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0004, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e40009, 0x0300000a, - 0x80010002, 0xa0aa0009, 0x80000001, 0x0300000a, 0x80020002, 0xa0ff0009, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0006, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e40009, 0x0300000a, - 0x80010003, 0xa0aa0009, 0x80000001, 0x0300000a, 0x80020003, 0xa0ff0009, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0007, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e40009, 0x0300000a, - 0x80010004, 0xa0aa0009, 0x80000001, 0x0300000a, 0x80020004, 0xa0ff0009, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0008, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e40009, 0x0300000a, - 0x80010005, 0xa0aa0009, 0x80000001, 0x0300000a, 0x80020005, 0xa0ff0009, 0x80550001, 0x03000042, - 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40002, 0xa0e40800, 0x03000042, - 0x800f0002, 0x80e40003, 0xa0e40800, 0x03000042, 0x800f0003, 0x80e40004, 0xa0e40800, 0x03000042, - 0x800f0004, 0x80e40005, 0xa0e40800, 0x03000005, 0x800f0000, 0x80e40000, 0xa0aa0005, 0x04000004, - 0x800f0000, 0x80e40001, 0xa0aa0004, 0x80e40000, 0x04000004, 0x800f0000, 0x80e40002, 0xa0aa0006, - 0x80e40000, 0x04000004, 0x800f0000, 0x80e40003, 0xa0aa0007, 0x80e40000, 0x04000004, 0x800f0000, - 0x80e40004, 0xa0aa0008, 0x80e40000, 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_blur_6[160] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x03000002, - 0x80030000, 0xb0e40000, 0xa0e40005, 0x0300000b, 0x80030001, 0x80e40000, 0xa0e4000a, 0x0300000a, - 0x80010000, 0xa0aa000a, 0x80000001, 0x0300000a, 0x80020000, 0xa0ff000a, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0004, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000a, 0x0300000a, - 0x80010002, 0xa0aa000a, 0x80000001, 0x0300000a, 0x80020002, 0xa0ff000a, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0006, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000a, 0x0300000a, - 0x80010003, 0xa0aa000a, 0x80000001, 0x0300000a, 0x80020003, 0xa0ff000a, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0007, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000a, 0x0300000a, - 0x80010004, 0xa0aa000a, 0x80000001, 0x0300000a, 0x80020004, 0xa0ff000a, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0008, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000a, 0x0300000a, - 0x80010005, 0xa0aa000a, 0x80000001, 0x0300000a, 0x80020005, 0xa0ff000a, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0009, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000a, 0x0300000a, - 0x80010006, 0xa0aa000a, 0x80000001, 0x0300000a, 0x80020006, 0xa0ff000a, 0x80550001, 0x03000042, - 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40002, 0xa0e40800, 0x03000042, - 0x800f0002, 0x80e40003, 0xa0e40800, 0x03000042, 0x800f0003, 0x80e40004, 0xa0e40800, 0x03000042, - 0x800f0004, 0x80e40005, 0xa0e40800, 0x03000042, 0x800f0005, 0x80e40006, 0xa0e40800, 0x03000005, - 0x800f0000, 0x80e40000, 0xa0aa0005, 0x04000004, 0x800f0000, 0x80e40001, 0xa0aa0004, 0x80e40000, - 0x04000004, 0x800f0000, 0x80e40002, 0xa0aa0006, 0x80e40000, 0x04000004, 0x800f0000, 0x80e40003, - 0xa0aa0007, 0x80e40000, 0x04000004, 0x800f0000, 0x80e40004, 0xa0aa0008, 0x80e40000, 0x04000004, - 0x800f0000, 0x80e40005, 0xa0aa0009, 0x80e40000, 0x02000001, 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_blur_7[185] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x03000002, - 0x80030000, 0xb0e40000, 0xa0e40005, 0x0300000b, 0x80030001, 0x80e40000, 0xa0e4000b, 0x0300000a, - 0x80010000, 0xa0aa000b, 0x80000001, 0x0300000a, 0x80020000, 0xa0ff000b, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0004, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000b, 0x0300000a, - 0x80010002, 0xa0aa000b, 0x80000001, 0x0300000a, 0x80020002, 0xa0ff000b, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0006, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000b, 0x0300000a, - 0x80010003, 0xa0aa000b, 0x80000001, 0x0300000a, 0x80020003, 0xa0ff000b, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0007, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000b, 0x0300000a, - 0x80010004, 0xa0aa000b, 0x80000001, 0x0300000a, 0x80020004, 0xa0ff000b, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0008, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000b, 0x0300000a, - 0x80010005, 0xa0aa000b, 0x80000001, 0x0300000a, 0x80020005, 0xa0ff000b, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0009, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000b, 0x0300000a, - 0x80010006, 0xa0aa000b, 0x80000001, 0x0300000a, 0x80020006, 0xa0ff000b, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b000a, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000b, 0x0300000a, - 0x80010007, 0xa0aa000b, 0x80000001, 0x0300000a, 0x80020007, 0xa0ff000b, 0x80550001, 0x03000042, - 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40002, 0xa0e40800, 0x03000042, - 0x800f0002, 0x80e40003, 0xa0e40800, 0x03000042, 0x800f0003, 0x80e40004, 0xa0e40800, 0x03000042, - 0x800f0004, 0x80e40005, 0xa0e40800, 0x03000042, 0x800f0005, 0x80e40006, 0xa0e40800, 0x03000042, - 0x800f0006, 0x80e40007, 0xa0e40800, 0x03000005, 0x800f0000, 0x80e40000, 0xa0aa0005, 0x04000004, - 0x800f0000, 0x80e40001, 0xa0aa0004, 0x80e40000, 0x04000004, 0x800f0000, 0x80e40002, 0xa0aa0006, - 0x80e40000, 0x04000004, 0x800f0000, 0x80e40003, 0xa0aa0007, 0x80e40000, 0x04000004, 0x800f0000, - 0x80e40004, 0xa0aa0008, 0x80e40000, 0x04000004, 0x800f0000, 0x80e40005, 0xa0aa0009, 0x80e40000, - 0x04000004, 0x800f0000, 0x80e40006, 0xa0aa000a, 0x80e40000, 0x02000001, 0x800f0800, 0x80e40000, - 0x0000ffff, -}; - -static DWORD pshader_blur_8[210] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x03000002, - 0x80030000, 0xb0e40000, 0xa0e40005, 0x0300000b, 0x80030001, 0x80e40000, 0xa0e4000c, 0x0300000a, - 0x80010000, 0xa0aa000c, 0x80000001, 0x0300000a, 0x80020000, 0xa0ff000c, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0004, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000c, 0x0300000a, - 0x80010002, 0xa0aa000c, 0x80000001, 0x0300000a, 0x80020002, 0xa0ff000c, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0006, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000c, 0x0300000a, - 0x80010003, 0xa0aa000c, 0x80000001, 0x0300000a, 0x80020003, 0xa0ff000c, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0007, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000c, 0x0300000a, - 0x80010004, 0xa0aa000c, 0x80000001, 0x0300000a, 0x80020004, 0xa0ff000c, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0008, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000c, 0x0300000a, - 0x80010005, 0xa0aa000c, 0x80000001, 0x0300000a, 0x80020005, 0xa0ff000c, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0009, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000c, 0x0300000a, - 0x80010006, 0xa0aa000c, 0x80000001, 0x0300000a, 0x80020006, 0xa0ff000c, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b000a, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000c, 0x0300000a, - 0x80010007, 0xa0aa000c, 0x80000001, 0x0300000a, 0x80020007, 0xa0ff000c, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b000b, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000c, 0x0300000a, - 0x80010008, 0xa0aa000c, 0x80000001, 0x0300000a, 0x80020008, 0xa0ff000c, 0x80550001, 0x03000042, - 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40002, 0xa0e40800, 0x03000042, - 0x800f0002, 0x80e40003, 0xa0e40800, 0x03000042, 0x800f0003, 0x80e40004, 0xa0e40800, 0x03000042, - 0x800f0004, 0x80e40005, 0xa0e40800, 0x03000042, 0x800f0005, 0x80e40006, 0xa0e40800, 0x03000042, - 0x800f0006, 0x80e40007, 0xa0e40800, 0x03000042, 0x800f0007, 0x80e40008, 0xa0e40800, 0x03000005, - 0x800f0000, 0x80e40000, 0xa0aa0005, 0x04000004, 0x800f0000, 0x80e40001, 0xa0aa0004, 0x80e40000, - 0x04000004, 0x800f0000, 0x80e40002, 0xa0aa0006, 0x80e40000, 0x04000004, 0x800f0000, 0x80e40003, - 0xa0aa0007, 0x80e40000, 0x04000004, 0x800f0000, 0x80e40004, 0xa0aa0008, 0x80e40000, 0x04000004, - 0x800f0000, 0x80e40005, 0xa0aa0009, 0x80e40000, 0x04000004, 0x800f0000, 0x80e40006, 0xa0aa000a, - 0x80e40000, 0x04000004, 0x800f0000, 0x80e40007, 0xa0aa000b, 0x80e40000, 0x02000001, 0x800f0800, - 0x80e40000, 0x0000ffff, -}; - -static DWORD pshader_blur_9[235] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x03000002, - 0x80030000, 0xb0e40000, 0xa0e40005, 0x0300000b, 0x80030001, 0x80e40000, 0xa0e4000d, 0x0300000a, - 0x80010000, 0xa0aa000d, 0x80000001, 0x0300000a, 0x80020000, 0xa0ff000d, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0004, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000d, 0x0300000a, - 0x80010002, 0xa0aa000d, 0x80000001, 0x0300000a, 0x80020002, 0xa0ff000d, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0006, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000d, 0x0300000a, - 0x80010003, 0xa0aa000d, 0x80000001, 0x0300000a, 0x80020003, 0xa0ff000d, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0007, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000d, 0x0300000a, - 0x80010004, 0xa0aa000d, 0x80000001, 0x0300000a, 0x80020004, 0xa0ff000d, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0008, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000d, 0x0300000a, - 0x80010005, 0xa0aa000d, 0x80000001, 0x0300000a, 0x80020005, 0xa0ff000d, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b0009, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000d, 0x0300000a, - 0x80010006, 0xa0aa000d, 0x80000001, 0x0300000a, 0x80020006, 0xa0ff000d, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b000a, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000d, 0x0300000a, - 0x80010007, 0xa0aa000d, 0x80000001, 0x0300000a, 0x80020007, 0xa0ff000d, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b000b, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000d, 0x0300000a, - 0x80010008, 0xa0aa000d, 0x80000001, 0x0300000a, 0x80020008, 0xa0ff000d, 0x80550001, 0x03000002, - 0x800c0000, 0xb01b0000, 0xa01b000c, 0x0300000b, 0x80030001, 0x801b0000, 0xa0e4000d, 0x0300000a, - 0x80010009, 0xa0aa000d, 0x80000001, 0x0300000a, 0x80020009, 0xa0ff000d, 0x80550001, 0x03000042, - 0x800f0000, 0x80e40000, 0xa0e40800, 0x03000042, 0x800f0001, 0x80e40002, 0xa0e40800, 0x03000042, - 0x800f0002, 0x80e40003, 0xa0e40800, 0x03000042, 0x800f0003, 0x80e40004, 0xa0e40800, 0x03000042, - 0x800f0004, 0x80e40005, 0xa0e40800, 0x03000042, 0x800f0005, 0x80e40006, 0xa0e40800, 0x03000042, - 0x800f0006, 0x80e40007, 0xa0e40800, 0x03000042, 0x800f0007, 0x80e40008, 0xa0e40800, 0x03000042, - 0x800f0008, 0x80e40009, 0xa0e40800, 0x03000005, 0x800f0000, 0x80e40000, 0xa0aa0005, 0x04000004, - 0x800f0000, 0x80e40001, 0xa0aa0004, 0x80e40000, 0x04000004, 0x800f0000, 0x80e40002, 0xa0aa0006, - 0x80e40000, 0x04000004, 0x800f0000, 0x80e40003, 0xa0aa0007, 0x80e40000, 0x04000004, 0x800f0000, - 0x80e40004, 0xa0aa0008, 0x80e40000, 0x04000004, 0x800f0000, 0x80e40005, 0xa0aa0009, 0x80e40000, - 0x04000004, 0x800f0000, 0x80e40006, 0xa0aa000a, 0x80e40000, 0x04000004, 0x800f0000, 0x80e40007, - 0xa0aa000b, 0x80e40000, 0x04000004, 0x800f0000, 0x80e40008, 0xa0aa000c, 0x80e40000, 0x02000001, - 0x800f0800, 0x80e40000, 0x0000ffff, -}; - -static ProgramWithCachedVariableLocations pshader_blur_arr[10] = { - { NULL, NULL, { -1, -1, -1, } }, - { NULL, NULL, { -1, -1, -1, } }, - { pshader_blur_2, NULL, { 0, 4, 6, } }, - { pshader_blur_3, NULL, { 0, 4, 7, } }, - { pshader_blur_4, NULL, { 0, 4, 8, } }, - { pshader_blur_5, NULL, { 0, 4, 9, } }, - { pshader_blur_6, NULL, { 0, 4, 10, } }, - { pshader_blur_7, NULL, { 0, 4, 11, } }, - { pshader_blur_8, NULL, { 0, 4, 12, } }, - { pshader_blur_9, NULL, { 0, 4, 13, } }, -}; - -static DWORD pshader_color_matrix_0[50] = { - 0xffff0200, 0x0200001f, 0x80000000, 0xb0030000, 0x0200001f, 0x90000000, 0xa00f0800, 0x03000042, - 0x800f0000, 0xb0e40000, 0xa0e40800, 0x03000009, 0x80080001, 0xa0e40004, 0x80e40000, 0x04000004, - 0x80010001, 0xa0000008, 0x80ff0000, 0x80ff0001, 0x03000009, 0x80080001, 0xa0e40005, 0x80e40000, - 0x04000004, 0x80020001, 0xa0550008, 0x80ff0000, 0x80ff0001, 0x03000009, 0x80080001, 0xa0e40006, - 0x80e40000, 0x04000004, 0x80040001, 0xa0aa0008, 0x80ff0000, 0x80ff0001, 0x03000005, 0x80080000, - 0x80ff0000, 0xa0ff0007, 0x03000005, 0x80070000, 0x80e40001, 0xa0ff0007, 0x02000001, 0x800f0800, - 0x80e40000, 0x0000ffff, -}; - -static ProgramWithCachedVariableLocations pshader_color_matrix_arr[1] = { - { pshader_color_matrix_0, NULL, { 0, 4, } }, -}; - -static DWORD pshader_manual_clear_0[5] = { - 0xffff0200, 0x02000001, 0x800f0800, 0xa0e40000, 0x0000ffff, -}; - -static ProgramWithCachedVariableLocations pshader_manual_clear_arr[1] = { - { pshader_manual_clear_0, NULL, { 0, } }, -}; - -static DWORD vshader_vsd3d9_0[65] = { - 0xfffe0200, 0x05000051, 0xa00f0002, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0x900f0000, 0x03000009, 0x80010000, 0x90e40000, 0xa0e40001, 0x03000005, 0x80070000, - 0x80000000, 0xa0e40006, 0x03000009, 0x80080000, 0x90e40000, 0xa0e40000, 0x04000004, 0x80070000, - 0x80ff0000, 0xa0e40005, 0x80e40000, 0x03000002, 0x80070000, 0x80e40000, 0xa0e40007, 0x02000006, - 0x80040000, 0x80aa0000, 0x03000005, 0xc0030000, 0x80aa0000, 0x80e40000, 0x03000009, 0x80010000, - 0xa0e40003, 0x90e40000, 0x03000009, 0x80020000, 0xa0e40004, 0x90e40000, 0x03000005, 0xe0030000, - 0x80aa0000, 0x80e40000, 0x02000001, 0xe0080000, 0x80aa0000, 0x02000001, 0x80040000, 0xa0aa0000, - 0x04000004, 0xc00c0000, 0x80aa0000, 0xa0440002, 0xa0140002, 0x02000001, 0xe0040000, 0xa0000002, - 0x0000ffff, -}; - -static DWORD vshader_vsd3d9_1[143] = { - 0xfffe0200, 0x05000051, 0xa00f0008, 0x3c800000, 0x3d000000, 0x00000000, 0xbf800000, 0x05000051, - 0xa00f0009, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, 0x80000000, 0x900f0000, - 0x0200001f, 0x80000005, 0x900f0001, 0x03000005, 0x80070000, 0x90c90001, 0xa0d00008, 0x03000005, - 0x800f0001, 0x80440000, 0xa0e40002, 0x03000002, 0x80030001, 0x80ed0001, 0x80e80001, 0x02000001, - 0x800c0001, 0xa0aa0008, 0x03000009, 0x80010002, 0x80f40001, 0xa0e40000, 0x03000009, 0x80020002, - 0x80e40001, 0xa0e40001, 0x03000005, 0x80030001, 0x80e40002, 0x80e40002, 0x03000002, 0x80080000, - 0x80550001, 0x80000001, 0x02000007, 0x80080000, 0x80ff0000, 0x02000006, 0x80080000, 0x80ff0000, - 0x0300000c, 0x80010001, 0x81ff0000, 0x80ff0000, 0x04000012, 0x80040002, 0x80000001, 0x80ff0000, - 0xa1ff0008, 0x02000006, 0x80080000, 0x80aa0002, 0x03000005, 0x80030000, 0x80e40000, 0x80e40000, - 0x03000002, 0x80010000, 0x80550000, 0x80000000, 0x02000007, 0x80010000, 0x80000000, 0x02000006, - 0x80010000, 0x80000000, 0x03000005, 0x80010000, 0x80ff0000, 0x80000000, 0x03000009, 0x80010001, - 0x90e40000, 0xa0e40000, 0x03000009, 0x80020001, 0x90e40000, 0xa0e40001, 0x04000004, 0x80030000, - 0x80e40002, 0x80000000, 0x80e40001, 0x03000005, 0x80070001, 0x80550000, 0xa0e40006, 0x04000004, - 0x800b0000, 0x80000000, 0xa0a40005, 0x80a40001, 0x03000002, 0x800b0000, 0x80e40000, 0xa0a40007, - 0x02000006, 0x80080000, 0x80ff0000, 0x03000005, 0xc0030000, 0x80ff0000, 0x80e40000, 0x03000009, - 0x80010000, 0xa0e40003, 0x90e40000, 0x03000009, 0x80020000, 0xa0e40004, 0x90e40000, 0x03000005, - 0xe0070000, 0x80ff0000, 0x80e40000, 0x02000001, 0xe0080000, 0x80ff0000, 0x02000001, 0x80040000, - 0xa0aa0000, 0x04000004, 0xc00c0000, 0x80aa0000, 0xa0440009, 0xa0140009, 0x0000ffff, -}; - -static DWORD vshader_vsd3d9_2[60] = { - 0xfffe0200, 0x05000051, 0xa00f0002, 0x3f800000, 0x00000000, 0x00000000, 0x00000000, 0x0200001f, - 0x80000000, 0x900f0000, 0x0200001f, 0x80000005, 0x900f0001, 0x03000009, 0x80010000, 0x90e40000, - 0xa0e40001, 0x03000005, 0x80070000, 0x80000000, 0xa0e40006, 0x03000009, 0x80080000, 0x90e40000, - 0xa0e40000, 0x04000004, 0x80070000, 0x80ff0000, 0xa0e40005, 0x80e40000, 0x03000002, 0x80070000, - 0x80e40000, 0xa0e40007, 0x02000006, 0x80040000, 0x80aa0000, 0x03000005, 0xc0030000, 0x80aa0000, - 0x80e40000, 0x03000005, 0xe0030000, 0x80aa0000, 0x90e40001, 0x02000001, 0xe0080000, 0x80aa0000, - 0x02000001, 0x80040000, 0xa0aa0000, 0x04000004, 0xc00c0000, 0x80aa0000, 0xa0440002, 0xa0140002, - 0x02000001, 0xe0040000, 0xa0000002, 0x0000ffff, -}; - -static ProgramWithCachedVariableLocations vshader_vsd3d9_arr[3] = { - { vshader_vsd3d9_0, NULL, { 0 } }, - { vshader_vsd3d9_1, NULL, { 0 } }, - { vshader_vsd3d9_2, NULL, { 0 } }, -}; - diff --git a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_wgl.c b/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_wgl.c deleted file mode 100644 index df2a78e90..000000000 --- a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_wgl.c +++ /dev/null @@ -1,219 +0,0 @@ -// gdraw_wgl.c - copyright 2011-2012 RAD Game Tools -// -// This implements the Iggy graphics driver layer for GL on Windows. - -#define GDRAW_ASSERTS - -#include "../include/iggy.h" -#include "../include/gdraw.h" -#include "gdraw_wgl.h" -#include -#include -#include "glext.h" -#include -#include - -#define true 1 -#define false 0 - -/////////////////////////////////////////////////////////////////////////////// -// -// Extensions (we map to GL 2.0 function names for a uniform interface -// across platforms) -// - -#define GDRAW_GL_EXTENSION_LIST \ - /* identifier import procname */ \ - /* GL_ARB_multitexture */ \ - GLE(ActiveTexture, "ActiveTextureARB", ACTIVETEXTUREARB) \ - /* GL_ARB_texture_compression */ \ - GLE(CompressedTexImage2D, "CompressedTexImage2DARB", \ - COMPRESSEDTEXIMAGE2DARB) \ - /* GL_ARB_vertex_buffer_object */ \ - GLE(GenBuffers, "GenBuffersARB", GENBUFFERSARB) \ - GLE(DeleteBuffers, "DeleteBuffersARB", DELETEBUFFERSARB) \ - GLE(BindBuffer, "BindBufferARB", BINDBUFFERARB) \ - GLE(BufferData, "BufferDataARB", BUFFERDATAARB) \ - GLE(MapBuffer, "MapBufferARB", MAPBUFFERARB) \ - GLE(UnmapBuffer, "UnmapBufferARB", UNMAPBUFFERARB) \ - GLE(VertexAttribPointer, "VertexAttribPointerARB", VERTEXATTRIBPOINTERARB) \ - GLE(EnableVertexAttribArray, "EnableVertexAttribArrayARB", \ - ENABLEVERTEXATTRIBARRAYARB) \ - GLE(DisableVertexAttribArray, "DisableVertexAttribArrayARB", \ - DISABLEVERTEXATTRIBARRAYARB) \ - /* GL_ARB_shader_objects */ \ - GLE(CreateShader, "CreateShaderObjectARB", CREATESHADEROBJECTARB) \ - GLE(DeleteShader, "DeleteObjectARB", DELETEOBJECTARB) \ - GLE(ShaderSource, "ShaderSourceARB", SHADERSOURCEARB) \ - GLE(CompileShader, "CompileShaderARB", COMPILESHADERARB) \ - GLE(GetShaderiv, "GetObjectParameterivARB", GETOBJECTPARAMETERIVARB) \ - GLE(GetShaderInfoLog, "GetInfoLogARB", GETINFOLOGARB) \ - GLE(CreateProgram, "CreateProgramObjectARB", CREATEPROGRAMOBJECTARB) \ - GLE(DeleteProgram, "DeleteObjectARB", DELETEOBJECTARB) \ - GLE(AttachShader, "AttachObjectARB", ATTACHOBJECTARB) \ - GLE(LinkProgram, "LinkProgramARB", LINKPROGRAMARB) \ - GLE(GetUniformLocation, "GetUniformLocationARB", GETUNIFORMLOCATIONARB) \ - GLE(UseProgram, "UseProgramObjectARB", USEPROGRAMOBJECTARB) \ - GLE(GetProgramiv, "GetObjectParameterivARB", GETOBJECTPARAMETERIVARB) \ - GLE(GetProgramInfoLog, "GetInfoLogARB", GETINFOLOGARB) \ - GLE(Uniform1i, "Uniform1iARB", UNIFORM1IARB) \ - GLE(Uniform4f, "Uniform4fARB", UNIFORM4FARB) \ - GLE(Uniform4fv, "Uniform4fvARB", UNIFORM4FVARB) \ - /* GL_ARB_vertex_shader */ \ - GLE(BindAttribLocation, "BindAttribLocationARB", BINDATTRIBLOCATIONARB) \ - /* GL_EXT_framebuffer_object */ \ - GLE(GenRenderbuffers, "GenRenderbuffersEXT", GENRENDERBUFFERSEXT) \ - GLE(DeleteRenderbuffers, "DeleteRenderbuffersEXT", DELETERENDERBUFFERSEXT) \ - GLE(BindRenderbuffer, "BindRenderbufferEXT", BINDRENDERBUFFEREXT) \ - GLE(RenderbufferStorage, "RenderbufferStorageEXT", RENDERBUFFERSTORAGEEXT) \ - GLE(GenFramebuffers, "GenFramebuffersEXT", GENFRAMEBUFFERSEXT) \ - GLE(DeleteFramebuffers, "DeleteFramebuffersEXT", DELETEFRAMEBUFFERSEXT) \ - GLE(BindFramebuffer, "BindFramebufferEXT", BINDFRAMEBUFFEREXT) \ - GLE(CheckFramebufferStatus, "CheckFramebufferStatusEXT", \ - CHECKFRAMEBUFFERSTATUSEXT) \ - GLE(FramebufferRenderbuffer, "FramebufferRenderbufferEXT", \ - FRAMEBUFFERRENDERBUFFEREXT) \ - GLE(FramebufferTexture2D, "FramebufferTexture2DEXT", \ - FRAMEBUFFERTEXTURE2DEXT) \ - GLE(GenerateMipmap, "GenerateMipmapEXT", GENERATEMIPMAPEXT) \ - /* GL_EXT_framebuffer_blit */ \ - GLE(BlitFramebuffer, "BlitFramebufferEXT", BLITFRAMEBUFFEREXT) \ - /* GL_EXT_framebuffer_multisample */ \ - GLE(RenderbufferStorageMultisample, "RenderbufferStorageMultisampleEXT", \ - RENDERBUFFERSTORAGEMULTISAMPLEEXT) \ - /* */ - -#define gdraw_GLx_(id) gdraw_GL_##id -#define GDRAW_GLx_(id) GDRAW_GL_##id -#define GDRAW_SHADERS "gdraw_gl_shaders.inl" - -typedef GLhandleARB GLhandle; -typedef gdraw_gl_resourcetype gdraw_resourcetype; - -// Extensions -#define GLE(id, import, procname) static PFNGL##procname##PROC gl##id; -GDRAW_GL_EXTENSION_LIST -#undef GLE - -static void load_extensions(void) { -#define GLE(id, import, procname) \ - gl##id = (PFNGL##procname##PROC)wglGetProcAddress("gl" import); - GDRAW_GL_EXTENSION_LIST -#undef GLE -} - -static void clear_renderstate_platform_specific(void) { - glDisable(GL_ALPHA_TEST); -} - -static void error_msg_platform_specific(const char* msg) { - OutputDebugStringA(msg); -} - -/////////////////////////////////////////////////////////////////////////////// -// -// Shared code -// - -#define GDRAW_MULTISAMPLING -#include "gdraw_gl_shared.inl" - -/////////////////////////////////////////////////////////////////////////////// -// -// Initialization and platform-specific functionality -// - -GDrawFunctions* gdraw_GL_CreateContext(S32 w, S32 h, S32 msaa_samples) { - static const TextureFormatDesc tex_formats[] = { - {IFT_FORMAT_rgba_8888, 1, 1, 4, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE}, - {IFT_FORMAT_rgba_4444_LE, 1, 1, 2, GL_RGBA4, GL_RGBA, - GL_UNSIGNED_SHORT_4_4_4_4}, - {IFT_FORMAT_rgba_5551_LE, 1, 1, 2, GL_RGB5_A1, GL_RGBA, - GL_UNSIGNED_SHORT_5_5_5_1}, - {IFT_FORMAT_la_88, 1, 1, 2, GL_LUMINANCE8_ALPHA8, GL_LUMINANCE_ALPHA, - GL_UNSIGNED_BYTE}, - {IFT_FORMAT_la_44, 1, 1, 1, GL_LUMINANCE4_ALPHA4, GL_LUMINANCE_ALPHA, - GL_UNSIGNED_BYTE}, - {IFT_FORMAT_i_8, 1, 1, 1, GL_INTENSITY8, GL_ALPHA, GL_UNSIGNED_BYTE}, - {IFT_FORMAT_i_4, 1, 1, 1, GL_INTENSITY4, GL_ALPHA, GL_UNSIGNED_BYTE}, - {IFT_FORMAT_l_8, 1, 1, 1, GL_LUMINANCE8, GL_LUMINANCE, - GL_UNSIGNED_BYTE}, - {IFT_FORMAT_l_4, 1, 1, 1, GL_LUMINANCE4, GL_LUMINANCE, - GL_UNSIGNED_BYTE}, - {IFT_FORMAT_DXT1, 4, 4, 8, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 0, - GL_UNSIGNED_BYTE}, - {IFT_FORMAT_DXT3, 4, 4, 16, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 0, - GL_UNSIGNED_BYTE}, - {IFT_FORMAT_DXT5, 4, 4, 16, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 0, - GL_UNSIGNED_BYTE}, - {0, 0, 0, 0, 0, 0, 0}, - }; - - GDrawFunctions* funcs; - const char* s; - GLint n; - - // check for the extensions we need - s = (const char*)glGetString(GL_EXTENSIONS); - if (s == NULL) { - assert(s != NULL); // if this is NULL, you're probably trying to create - // the device too early - return NULL; - } - - // check for the extensions we won't work without - if (!hasext(s, "GL_ARB_multitexture") || - !hasext(s, "GL_ARB_texture_compression") || - !hasext(s, "GL_ARB_texture_mirrored_repeat") || - !hasext( - s, - "GL_ARB_texture_non_power_of_two") || // with caveats - see below! - !hasext(s, "GL_ARB_vertex_buffer_object") || - !hasext(s, "GL_EXT_framebuffer_object") || - !hasext(s, "GL_ARB_shader_objects") || - !hasext(s, "GL_ARB_vertex_shader") || - !hasext(s, "GL_ARB_fragment_shader")) - return NULL; - - // if user requests multisampling and HW doesn't support it, bail - if (!hasext(s, "GL_EXT_framebuffer_multisample") && msaa_samples > 1) - return NULL; - - load_extensions(); - funcs = create_context(w, h); - if (!funcs) return NULL; - - gdraw->tex_formats = tex_formats; - - // check for optional extensions - gdraw->has_mapbuffer = true; // part of core VBO extension on regular GL - gdraw->has_depth24 = true; // we just assume. - gdraw->has_texture_max_level = true; // core on regular GL - - if (hasext(s, "GL_EXT_packed_depth_stencil")) - gdraw->has_packed_depth_stencil = true; - - // we require ARB_texture_non_power_of_two - on actual HW, this may either - // give us "full" non-power-of-two support, or "conditional" - // non-power-of-two (wrap mode must be CLAMP_TO_EDGE, no mipmaps). figure - // out which it is using this heuristic by Unity's Aras Pranckevicius - // (thanks!): - // http://www.aras-p.info/blog/2012/10/17/non-power-of-two-textures/ - // - // we use the second heuristic (texture size <8192 for cards without full - // NPOT support) since we don't otherwise use ARB_fragment_program and don't - // want to create a program just to be able to query - // MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB! - glGetIntegerv(GL_MAX_TEXTURE_SIZE, &n); - gdraw->has_conditional_non_power_of_two = n < 8192; - - // clamp number of multisampling levels to max supported - if (msaa_samples > 1) { - glGetIntegerv(GL_MAX_SAMPLES, &n); - gdraw->multisampling = RR_MIN(msaa_samples, n); - } - - opengl_check(); - - return funcs; -} diff --git a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_wgl.h b/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_wgl.h deleted file mode 100644 index 5669624fc..000000000 --- a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_wgl.h +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef __RAD_INCLUDE_GDRAW_GL_H__ -#define __RAD_INCLUDE_GDRAW_GL_H__ - -#include "../include/rrCore.h" -#include "../include/gdraw.h" - -RADDEFSTART - -typedef enum gdraw_gl_resourcetype { - GDRAW_GL_RESOURCE_rendertarget, - GDRAW_GL_RESOURCE_texture, - GDRAW_GL_RESOURCE_vertexbuffer, - - GDRAW_GL_RESOURCE__count, -} gdraw_gl_resourcetype; - -struct IggyCustomDrawCallbackRegion; - -extern int gdraw_GL_SetResourceLimits(gdraw_gl_resourcetype type, - S32 num_handles, S32 num_bytes); -extern GDrawFunctions* gdraw_GL_CreateContext(S32 min_w, S32 min_h, - S32 msaa_samples); -extern void gdraw_GL_DestroyContext(void); -extern void gdraw_GL_SetTileOrigin( - S32 vx, S32 vy, - U32 framebuffer); // framebuffer=FBO handle, or 0 for main frame buffer -extern void gdraw_GL_NoMoreGDrawThisFrame(void); - -extern GDrawTexture* gdraw_GL_WrappedTextureCreate(S32 gl_texture_handle, - S32 width, S32 height, - rrbool has_mipmaps); -extern void gdraw_GL_WrappedTextureChange(GDrawTexture* tex, - S32 new_gl_texture_handle, - S32 new_width, S32 new_height, - rrbool new_has_mipmaps); -extern void gdraw_GL_WrappedTextureDestroy(GDrawTexture* tex); - -extern void gdraw_GL_BeginCustomDraw( - struct IggyCustomDrawCallbackRegion* region, F32* matrix); -extern void gdraw_GL_EndCustomDraw(struct IggyCustomDrawCallbackRegion* region); - -extern GDrawTexture* RADLINK gdraw_GL_MakeTextureFromResource( - U8* resource_file, S32 resource_len, IggyFileTextureRaw* texture); -extern void RADLINK gdraw_GL_DestroyTextureFromResource(GDrawTexture* tex); - -RADDEFEND - -#endif diff --git a/Minecraft.Client/Platform/Windows64/Iggy/lib/iggy_w32.lib b/Minecraft.Client/Platform/Windows64/Iggy/lib/iggy_w32.lib deleted file mode 100644 index 3c6ad976fbecdb6d732a80868d7ef6766af3282b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49766 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 diff --git a/Minecraft.Client/Platform/Windows64/Iggy/lib/iggyexpruntime_w32.lib b/Minecraft.Client/Platform/Windows64/Iggy/lib/iggyexpruntime_w32.lib deleted file mode 100644 index 06905e7cf6e1675ef2a86f6cb50e38b2e9b1ee3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2430 zcmcgu&2HL25FXn=!R-OHRnJAoE$;AMLj`~sfPymI0Ek=yL@&lqEQCY&L~$&tnr7wT=&)8d%X`PATIHyI zSTpTT=iC|%owHA_-M7roS{6*RdSVzsTlf+*9-G$Ro>ceE@@{<>%nB~JHyV~4tLa*L zrhv=Y{UN#z;2bGir>-+N*Krl6xy#HNoPB zY6lpXZ1;MgrUbRQ>1}J~HSfF(NrCG>_iN83!L! zVxwIaLM;-1f{HXHI@Q>@YiO04=W6fTKX>t@R`=e~jQEWGqr zu1hT~Qr=KSUH(Q7V;0QM;6Lgz&y&TNPIWomrs^^$aN_hYp>VmbOfQq&EsS9uOf3|> zI~7<>8xq}tDYoa(!Y|T-8)D^io)k)g{y^wX8T;Qx{}P^7@XPlHqg&wl~1 C`T!dM diff --git a/Minecraft.Client/Platform/Windows64/Iggy/lib/iggyexpruntime_w64.lib b/Minecraft.Client/Platform/Windows64/Iggy/lib/iggyexpruntime_w64.lib deleted file mode 100644 index 693fa9a25552b898013ab0e860b395524a193402..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2386 zcmcImPj3=I6#ualT8Iat#&~IhrfQ7_C@d5cW41yQNhxiBdfifXfsG)9ZX@l*8z*nx zJ?Y(#(1RbqqlX?$Pp0uZ)Hk~`z?Q{A8YY>Yd2im#`!m1yW*@w)bgPY5!D!go*5p_s z{$gF0lTLn&lksGl&-Q}=0)TW5_|ky?1X!x^enunp#S7L|HMhOHQ!K05%~GbA+b!=D zRij=%)_a}q(RFS4+3{@@c<@4jR_&6?XiW*kd1M=v#uo}a>ZE&*vDa6&|F2{@yE zv1o-Aek{NT4OX>KoiC6L#mFd@*nA2i00 z6w#VZ1fv47T=cp#lZoNoXnilfefe5?=ph`_J+T(i^n;`NO39{xJWW0cf{zM9uOo(5 zF)J%^v2>Rvzo`G^3@?oeVy9d##o4$|lOX96a*VGad`b|(GD|dS_uQR*f;%BX4Srfe zHhcoT+uKI9+dgd9%Wrw0r`87bQtL|=s(x4&GrQeUrP)h^?+B_Ag2_L|)2*&*Xj!f{#pYo{^p=%By6{JP@0bhqV<} zZfkv33!huQFSx%#6UxNQHF(`!_aoBnq1u#lyz&Wy0ZFHM;J)39o0d;FNRN<*#U IL7SlVA8;=JI{*Lx diff --git a/Minecraft.Client/Platform/Windows64/Iggy/lib/iggyperfmon_w32.lib b/Minecraft.Client/Platform/Windows64/Iggy/lib/iggyperfmon_w32.lib deleted file mode 100644 index 25ba046eebb48a9d8615fd06207b62e00cadf590..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2436 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%0DF+T5kV%t!7H25w?Ed5W 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 M{hB%Q(Ol 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 FK|PcqgtPpcWgZPG+Y73Q<;bJ8m|gUtr3 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

    Qxh4stk!?N(2X_!6<>s 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�o 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%0D^jS{-# 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 z

    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 -#endif - -#if defined(IS_WII) -#include -#include -#endif - -#ifdef __cplusplus -extern "C" -{ -#endif - -#if defined(IS_WIN32API) || defined(IS_WII) - #pragma pack(push, 1) -#endif -#ifdef IS_32 - #if !defined(IS_WIN32API) - #define ASMLINK - #define ASMPARM - #else - #if defined(IS_XENON) - #define ASMLINK __cdecl - #define ASMPARM register - #else - #define ASMLINK __cdecl - #define ASMPARM - #endif - #endif -#else - #define ASMLINK WINAPI - #define ASMPARM -#endif - -#ifndef YES -#define YES 1 -#endif - -#ifndef NULL -#define NULL 0 -#endif - -#define MSSHIWORD(ptr) (((U32)ptr)>>16) -#define MSSLOWORD(ptr) ((U16)((U32)ptr)) - -#ifndef NO -#define NO 0 -#endif - -#ifndef TRUE -#define TRUE 1 -#endif - -#ifndef FALSE -#define FALSE 0 -#endif - -#ifdef IS_MAC - -#if !defined(max) -#define max(a,b) (((a) > (b)) ? (a) : (b)) -#endif -#if !defined(min) -#define min(a,b) (((a) < (b)) ? (a) : (b)) -#endif - -#endif - -#ifdef IS_WATCOM - -#if !defined(max) // Watcom stdlib.h doesn't define these for C++ -#define max(a,b) (((a) > (b)) ? (a) : (b)) -#endif -#if !defined(min) -#define min(a,b) (((a) < (b)) ? (a) : (b)) -#endif - -#endif - -#ifdef IS_WIN64 - - #define PTRFMT "0x%I64X" - #define SINTFMT "%I64d" - #define HPFMT "%ld" - -#else - - #if defined(IS_PS3) || defined(IS_PSP) || defined(IS_3DS) - - #define PTRFMT "0x%lX" - #define SINTFMT "%d" // (GCC warns when ints printed with %ld) - #define HPFMT "%ld" - - #else - - #define PTRFMT "0x%lX" - #define SINTFMT "%ld" - #define HPFMT "%ld" - - #endif - -#endif - -U32 AILCALL XMI_read_VLN(U8 const* *ptr); -S32 AILCALL XMI_message_size(S32 status); -void const * AILCALL XMI_find_sequence(U8 const *image, S32 sequence); -S32 AIL_process_WAV_image( AILSOUNDINFO const * info, HSAMPLE sample ); - -#ifdef IS_SPU -#define NTELEMETRY -#endif - -#include "tmapi.h" - -#ifdef NTELEMETRY - #define miles_context 0 -#else - extern HTELEMETRY g_Miles_Tm; - extern S32 g_tm_log; - #define miles_context g_Miles_Tm -#endif - -//############################################################################ -//## ## -//## API function prototypes ## -//## ## -//############################################################################ - -#define check_hardware_buffer( S, flags ) -#define hardware_stop( S ) -#define set_hardware_position( S ) -#define hardware_spin_until_stopped( S ) -#define set_hardware_volume( S ) -#define set_master_hardware_volume( dig ) -#define set_hardware_loop_region( S ) -#define set_hardware_low_pass( S ) - -extern void AILCALL InMilesMutex(void); -extern void AILCALL OutMilesMutex(void); - -#ifdef IS_WIN32API - -#ifdef NTAPI -extern HWND AILCALL AIL_API_HWND (void); - -void AILEXPORT API_timer (UINT IDEvent, - UINT uReserved, - DWORD dwUser, - DWORD dwReserved1, - DWORD dwReserved2); - -#endif - -extern S32 MilesCount; -extern U32 lastapitimerms; - - void AILCALL Set_thread_name( U32 thread_id, char const * thread_name ); - -#endif - - -#ifdef IS_MAC - #if defined(__CARBON__) - ProcessSerialNumber AILCALL AIL_API_Process(void); - #endif -#endif - - -#ifdef _DEBUG - -DXDEC void AILEXPORT AIL_debug_printf( char const *fmt, ...); - -#else - -#define AIL_debug_printf(...) - -#endif - -#ifndef MSS_SPU_PROCESS - -// -// Global preference array -// -extern SINTa AIL_preference [N_PREFS]; - -#endif - -extern char AIL_redist_directory[260]; - -extern S32 AILCALL match_suffix(char const* suffix,char const* file_suffix); - -#if !defined(IS_X86) || !defined(IS_MAC) // use mix rib on x86 mac -DXDEC S32 AILCALL MIX_RIB_MAIN( HPROVIDER provider_handle, U32 up_down, RIB_ALLOC_PROVIDER_HANDLE_TYPE * rib_alloc, RIB_REGISTER_INTERFACE_TYPE * rib_reg, RIB_UNREGISTER_INTERFACE_TYPE * rib_unreg ); -#endif - -// -// High-level support services -// - -extern void AILCALL AIL_API_startup (void); -extern void AILCALL AIL_API_shutdown (void); - -extern SINTa AILCALL AIL_API_set_preference (U32 number, - SINTa value); - -// -// Low-level support services -// - -extern void AILCALL AIL_API_sleep (U32 ms); - -extern S32 AILCALL AIL_API_background (void); - -extern void AILCALL AIL_API_mem_free_lock (void *ptr); - -extern void* AILCALL AIL_API_mem_alloc_lock (UINTa size); - -// -// Process services -// - -extern HTIMER AILCALL AIL_API_register_timer (AILTIMERCB fn); - -extern UINTa AILCALL AIL_API_set_timer_user (HTIMER timer, - UINTa user); - -extern void AILCALL AIL_API_set_timer_period (HTIMER timer, - U32 microseconds); - -extern void AILCALL AIL_API_set_timer_frequency (HTIMER timer, - U32 hertz) ; - -extern void AILCALL AIL_API_set_timer_divisor (HTIMER timer, - U32 PIT_divisor); - -extern void AILCALL AIL_API_start_timer (HTIMER timer) ; -extern void AILCALL AIL_API_start_all_timers (void); - -extern void AILCALL AIL_API_stop_timer (HTIMER timer); -extern void AILCALL AIL_API_stop_all_timers (void); - -extern void AILCALL AIL_API_release_timer_handle(HTIMER timer); -extern void AILCALL AIL_API_release_all_timers (void); - -extern void Container_FreeAll(); -extern void* Container_GetPreset(char const* i_PresetName); -extern void* Container_GetEnvironment(char const* i_EnvironmentName); -extern S32 Container_GetSound(char const* i_SoundName, char* o_SoundFileName, MILESBANKSOUNDINFO* o_SoundInfo); -extern void* Container_GetEvent(char const* i_EventName); -extern void* Container_GetMarkerList(char const* i_SoundName); -extern S32 Container_GetLoadedCount(); -extern S32 Container_GetMemUsage(); -extern char const* Container_GetLoadedName(S32 i_Index); - -extern const U8* AILCALL MilesFindEventInternal(HMSOUNDBANK i_Bank, const char* i_EventName); -extern void AILCALL MilesClearEventQueueInternal(); -extern void AILCALL MilesRegisterRandInternal(MSS_USER_RAND * rand); -extern U64 AILCALL MilesEnqueueEventInternal(const U8* i_Event, void* i_UserBuffer, S32 i_UserBufferLen, S32 i_EnqueueFlags, U64 i_EventFilter); -extern U64 AILCALL MilesEnqueueEventByNameInternal(char const* i_Name); -extern U64 AILCALL MilesEnqueueEventContextInternal(HEVENTSYSTEM i_Context, const U8* i_Event, void* i_UserBuffer, S32 i_UserBufferLen, S32 i_EnqueueFlags, U64 i_EventFilter); - -extern S32 AILCALL MilesBeginEventQueueProcessingInternal(); -extern S32 AILCALL MilesCompleteEventQueueProcessingInternal(); - -extern S32 AILCALL MilesEnumerateSoundInstancesInternal(HEVENTSYSTEM i_System, HMSSENUM* io_Next, S32 i_Status, const char* i_Labels, U64 search_for_ID, MILESEVENTSOUNDINFO* o_Info); -extern S32 AILCALL MilesEnumeratePresetPersistsInternal(HEVENTSYSTEM i_System, HMSSENUM* io_Next, const char** o_Name); -extern HEVENTSYSTEM AILCALL MilesStartupEventSystemInternal(HDIGDRIVER i_Driver, S32 i_CommandBufferSize, char* i_Memory, S32 i_MemoryLen); -extern HEVENTSYSTEM AILCALL MilesAddEventSystemInternal(HDIGDRIVER i_Driver); -extern S32 AILCALL MilesSetSoundLabelLimitsInternal(HEVENTSYSTEM i_System, U64 i_Id, const char* i_SoundLimits, char const* i_Name); - - -extern void AILCALL MilesShutdownEventSystemInternal(); -extern HMSOUNDBANK AILCALL MilesAddSoundBankInternal(const char* i_FileName, char const* i_Name); -extern S32 AILCALL MilesReleaseSoundBankInternal(HMSOUNDBANK i_Bank); -extern char* AILCALL MilesTextDumpEventSystemInternal(); -extern void AILCALL MilesSetEventErrorCallbackInternal(AILEVENTERRORCB i_Callback); - -extern void AILCALL MilesSetVarIInternal(UINTa i_System, char const* i_Name, S32 i_Value); -extern void AILCALL MilesSetVarFInternal(UINTa i_System, char const* i_Name, F32 i_Value); -extern S32 AILCALL MilesGetVarFInternal(UINTa i_Context, char const* i_Name, F32* o_Value); -extern S32 AILCALL MilesGetVarIInternal(UINTa i_Context, char const* i_Name, S32* o_Value); -extern void AILCALL MilesSetSoundStartOffsetInternal(HMSSENUM i_Instance, S32 i_Offset, S32 i_IsMs); -extern void AILCALL MilesRequeueAsyncsInternal(); - -extern AIL_file_open_callback MSS_open; -extern AIL_file_close_callback MSS_close; -extern AIL_file_seek_callback MSS_seek; -extern AIL_file_read_callback MSS_read; - -extern S32 disk_err; -extern char MSS_Directory[260]; - - -extern void stream_background(void); // background service for streaming - -#define call_fetch_CB( ASI,usr,dest,bytes,offset ) ((AILASIFETCHCB)((ASI)->fetch_CB))(usr,dest,bytes,offset) - -extern HPROVIDER find_ASI_provider(const C8 *attrib, const C8 *filename); - - -// -// M3D services -// - -extern HDIGDRIVER AILCALL AIL_API_primary_digital_driver (HDIGDRIVER new_primary); - -extern void AILCALL AIL_API_set_sample_3D_distances (HSAMPLE samp, - F32 max_dist, - F32 min_dist, - S32 auto_3D_wet_atten); - -extern void AILCALL AIL_API_sample_3D_distances (HSAMPLE samp, - F32 * max_dist, - F32 * min_dist, - S32 * auto_3D_wet_atten); - -extern void AILCALL AIL_API_set_sample_obstruction (HSAMPLE S, - F32 obstruction); - -extern void AILCALL AIL_API_set_sample_exclusion (HSAMPLE S, - F32 exclusion); - -extern void AILCALL AIL_API_set_sample_occlusion (HSAMPLE S, - F32 occlusion); - -extern void AILCALL AIL_API_set_sample_3D_cone (HSAMPLE S, - F32 inner_angle, - F32 outer_angle, - F32 outer_volume); - -extern F32 AILCALL AIL_API_sample_obstruction (HSAMPLE S); - -extern F32 AILCALL AIL_API_sample_occlusion (HSAMPLE S); - -extern F32 AILCALL AIL_API_sample_exclusion (HSAMPLE S); - -extern void AILCALL AIL_API_sample_3D_cone (HSAMPLE S, - F32 *inner_angle, - F32 *outer_angle, - F32 *outer_volume); - -extern S32 AILCALL AIL_API_room_type (HDIGDRIVER dig, - S32 bus_index); - -extern void AILCALL AIL_API_set_room_type (HDIGDRIVER dig, - S32 bus_index, - S32 EAX_room_type); - -extern F32 AILCALL AIL_API_3D_rolloff_factor (HDIGDRIVER dig); - -extern void AILCALL AIL_API_set_3D_rolloff_factor (HDIGDRIVER dig, - F32 factor ); - -extern F32 AILCALL AIL_API_3D_doppler_factor (HDIGDRIVER dig); - -extern void AILCALL AIL_API_set_3D_doppler_factor (HDIGDRIVER dig, - F32 factor ); - -extern F32 AILCALL AIL_API_3D_distance_factor (HDIGDRIVER dig); - -extern void AILCALL AIL_API_set_3D_distance_factor (HDIGDRIVER dig, - F32 factor ); - -extern void AILCALL AIL_API_set_sample_3D_position (HSAMPLE S, - F32 X, - F32 Y, - F32 Z); - -extern void AILCALL AIL_API_set_sample_3D_velocity (HSAMPLE S, - F32 dX_per_ms, - F32 dY_per_ms, - F32 dZ_per_ms, - F32 magnitude); - -extern void AILCALL AIL_API_set_sample_3D_velocity_vector (HSAMPLE S, - F32 dX_per_ms, - F32 dY_per_ms, - F32 dZ_per_ms); - -extern void AILCALL AIL_API_set_sample_3D_orientation (HSAMPLE S, - F32 X_face, - F32 Y_face, - F32 Z_face, - F32 X_up, - F32 Y_up, - F32 Z_up); - -extern S32 AILCALL AIL_API_sample_3D_position (HSAMPLE S, - F32 *X, - F32 *Y, - F32 *Z); - -extern void AILCALL AIL_API_sample_3D_velocity (HSAMPLE S, - F32 *dX_per_ms, - F32 *dY_per_ms, - F32 *dZ_per_ms); - -extern void AILCALL AIL_API_sample_3D_orientation (HSAMPLE S, - F32 *X_face, - F32 *Y_face, - F32 *Z_face, - F32 *X_up, - F32 *Y_up, - F32 *Z_up); - -extern void AILCALL AIL_API_update_sample_3D_position (HSAMPLE S, - F32 dt_milliseconds); - -extern void AILCALL AIL_API_set_listener_3D_position(HDIGDRIVER dig, - F32 X, - F32 Y, - F32 Z); - -extern void AILCALL AIL_API_set_listener_3D_velocity(HDIGDRIVER dig, - F32 dX_per_ms, - F32 dY_per_ms, - F32 dZ_per_ms, - F32 magnitude); - -extern void AILCALL AIL_API_set_listener_3D_velocity_vector (HDIGDRIVER dig, - F32 dX_per_ms, - F32 dY_per_ms, - F32 dZ_per_ms); - -extern void AILCALL AIL_API_set_listener_3D_orientation (HDIGDRIVER dig, - F32 X_face, - F32 Y_face, - F32 Z_face, - F32 X_up, - F32 Y_up, - F32 Z_up); - -extern void AILCALL AIL_API_set_sample_3D_volume_falloff (HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount); -extern void AILCALL AIL_API_set_sample_3D_lowpass_falloff (HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount); -extern void AILCALL AIL_API_set_sample_3D_exclusion_falloff (HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount); -extern void AILCALL AIL_API_set_sample_3D_spread_falloff (HSAMPLE S, MSSGRAPHPOINT* graph, S32 pointcount); -extern void AILCALL AIL_API_set_sample_3D_position_segments (HSAMPLE S, MSSVECTOR3D* points, S32 pointcount); -extern void AILCALL AIL_API_set_sample_3D_spread (HSAMPLE S, F32 spread); - -extern void AILCALL AIL_API_listener_3D_position (HDIGDRIVER dig, - F32 *X, - F32 *Y, - F32 *Z); - -extern void AILCALL AIL_API_listener_3D_velocity (HDIGDRIVER dig, - F32 *dX_per_ms, - F32 *dY_per_ms, - F32 *dZ_per_ms); - -extern void AILCALL AIL_API_listener_3D_orientation (HDIGDRIVER dig, - F32 *X_face, - F32 *Y_face, - F32 *Z_face, - F32 *X_up, - F32 *Y_up, - F32 *Z_up); - -extern void AILCALL AIL_API_update_listener_3D_position (HDIGDRIVER dig, - F32 dt_milliseconds); - -extern S32 AILCALL AIL_API_calculate_3D_channel_levels (HDIGDRIVER driver, //) - F32 *channel_levels, - MSS_SPEAKER const * *speaker_array, - MSSVECTOR3D *src_pos, - MSSVECTOR3D *src_face, - MSSVECTOR3D *src_up, - F32 src_inner_angle, - F32 src_outer_angle, - F32 src_outer_volume, - F32 src_max_dist, - F32 src_min_dist, - MSSVECTOR3D *listen_pos, - MSSVECTOR3D *listen_face, - MSSVECTOR3D *listen_up, - F32 rolloff_factor, - MSSVECTOR3D *doppler_velocity, - F32 *doppler_shift); - - -#ifdef IS_GENERICDIG -extern HDIGDRIVER AILCALL AIL_API_open_generic_digital_driver( U32 frequency, - S32 bits, - S32 channel, - U32 flags, - RADSS_OPEN_FUNC dig_open); -#else -extern HDIGDRIVER AILCALL AIL_API_open_digital_driver( U32 frequency, - S32 bits, - S32 channel, - U32 flags ); -#endif - -extern void AILCALL AIL_API_close_digital_driver( HDIGDRIVER dig ); - -#if defined(IS_WINDOWS) - -extern S32 AILCALL AIL_API_digital_handle_release(HDIGDRIVER drvr); - -extern S32 AILCALL AIL_API_digital_handle_reacquire - (HDIGDRIVER drvr); -#endif - -#if defined(IS_WINDOWS) || (defined(IS_MAC) && !defined(IS_IPHONE)) - - -extern HDIGINPUT AILCALL AIL_API_open_input (AIL_INPUT_INFO *info); - -extern void AILCALL AIL_API_close_input (HDIGINPUT dig); - -extern AIL_INPUT_INFO * - AILCALL AIL_API_get_input_info (HDIGINPUT dig); - -extern S32 AILCALL AIL_API_set_input_state (HDIGINPUT dig, - S32 enable); - -#endif - -#ifdef MSS_FLT_SUPPORTED - -void * SS_execute_filter_chain(HSAMPLE S, //) - void * src, - void * temp_dest, - S32 src_bytes, - S32 is_stereo, - S16 *dest_mono_sample_buffer); - -// -// Internal FLT services -// - -void FLT_init_list(void); - -FLTPROVIDER *FLT_find_provider_instance(HPROVIDER provider, - HDIGDRIVER dig); - -void FLT_disconnect_driver(HDIGDRIVER dig); - -void FLT_call_premix_processors(HDIGDRIVER dig); - -S32 FLT_call_postmix_processors(HDIGDRIVER dig, void *output_buffer); - -// -// FLT services -// - -extern S32 AILCALL AIL_API_enumerate_filters (HMSSENUM *next, - HPROVIDER *dest, - C8 * *name); - -extern HDRIVERSTATE - AILCALL AIL_API_open_filter (HPROVIDER lib, - HDIGDRIVER dig); - -extern void AILCALL AIL_API_close_filter (HDRIVERSTATE filter); - - - - - - -extern S32 AILCALL AIL_API_enumerate_filter_attributes - (HPROVIDER lib, - HMSSENUM * next, - RIB_INTERFACE_ENTRY * dest); - -extern void AILCALL AIL_API_filter_attribute (HPROVIDER lib, - C8 const * name, - void * val); - -extern void AILCALL AIL_API_set_filter_preference - (HPROVIDER lib, - C8 const * name, - void const * val); - - - - - -extern S32 AILCALL AIL_API_enumerate_filter_sample_attributes - (HPROVIDER lib, - HMSSENUM * next, - RIB_INTERFACE_ENTRY * dest); - -extern void AILCALL AIL_API_filter_sample_attribute - (HSAMPLE S, - C8 const * name, - void * val); - -extern void AILCALL AIL_API_set_filter_sample_preference - (HSAMPLE S, - C8 const * name, - void const * val); -#endif - -extern S32 AILCALL AIL_API_enumerate_digital_driver_attributes - (HDIGDRIVER dig, - HMSSENUM * next, - RIB_INTERFACE_ENTRY * dest); - -extern void AILCALL AIL_API_digital_driver_attribute (HDIGDRIVER dig, - C8 const * name, - void * val); - -extern S32 AILCALL AIL_API_enumerate_digital_driver_preferences - (HDIGDRIVER dig, - HMSSENUM * next, - RIB_INTERFACE_ENTRY * dest); - -extern void AILCALL AIL_API_set_digital_driver_preference(HDIGDRIVER dig, - C8 const * name, - void const * val); - -extern S32 AILCALL AIL_API_enumerate_sample_attributes - (HSAMPLE S, - HMSSENUM * next, - RIB_INTERFACE_ENTRY * dest); - -extern void AILCALL AIL_API_sample_attribute (HSAMPLE S, - C8 const * name, - void * val); - -extern S32 AILCALL AIL_API_enumerate_sample_preferences - (HSAMPLE S, - HMSSENUM * next, - RIB_INTERFACE_ENTRY * dest); - -extern void AILCALL AIL_API_set_sample_preference (HSAMPLE S, - C8 const * name, - void const * val); - -extern S32 AILCALL AIL_API_digital_CPU_percent(HDIGDRIVER dig); - -extern S32 AILCALL AIL_API_digital_SPU_percent(HDIGDRIVER dig); - -extern S32 AILCALL AIL_API_background_CPU_percent(void); - -extern S32 AILCALL AIL_API_digital_latency(HDIGDRIVER dig); - -extern HSAMPLE AILCALL AIL_API_allocate_sample_handle - (HDIGDRIVER dig); - -extern HSAMPLE AILCALL AIL_API_allocate_bus(HDIGDRIVER dig); -extern HSAMPLE AILCALL AIL_API_bus_sample_handle(HDIGDRIVER dig, S32 bus_index); -extern S32 AILCALL AIL_API_install_bus_compressor(HDIGDRIVER dig, S32 bus_index, SAMPLESTAGE filter_stage, S32 input_bus_index); -DXDEC void AILCALL AIL_free_all_busses(HDIGDRIVER dig); // For miles studio. - -extern HSAMPLE AILCALL AIL_API_allocate_file_sample - (HDIGDRIVER dig, - void const *file_image, - S32 block); - -extern void AILCALL AIL_API_set_speaker_configuration - (HDIGDRIVER dig, - MSSVECTOR3D *array, - S32 n_channels, - F32 falloff_power); - -extern MSSVECTOR3D * - AILCALL AIL_API_speaker_configuration - (HDIGDRIVER dig, - S32 *n_physical_channels, - S32 *n_logical_channels, - F32 *falloff_power, - MSS_MC_SPEC *channel_spec); - -extern void AILCALL AIL_API_set_listener_relative_receiver_array - (HDIGDRIVER dig, - MSS_RECEIVER_LIST *array, - S32 n_receivers); - -extern MSS_RECEIVER_LIST * - AILCALL AIL_API_listener_relative_receiver_array - (HDIGDRIVER dig, - S32 *n_receivers); - -extern void AILCALL AIL_API_set_speaker_reverb_levels - (HDIGDRIVER dig, - F32 *wet_array, - F32 *dry_array, - MSS_SPEAKER const *speaker_index_array, - S32 n_levels); - -extern S32 AILCALL AIL_API_speaker_reverb_levels (HDIGDRIVER dig, - F32 * *wet_array, - F32 * *dry_array, - MSS_SPEAKER const * *speaker_index_array); - -extern void AILCALL AIL_API_release_sample_handle (HSAMPLE S); - -extern S32 AILCALL AIL_API_set_sample_file (HSAMPLE S, - void const *file_image, - S32 block); - -extern S32 AILCALL AIL_API_set_sample_info (HSAMPLE S, - AILSOUNDINFO const * info); - -extern S32 AILCALL AIL_API_set_named_sample_file (HSAMPLE S, - C8 const *file_type_suffix, - void const *file_image, - U32 file_size, - S32 block); - -extern HPROVIDER AILCALL AIL_API_set_sample_processor (HSAMPLE S, - SAMPLESTAGE pipeline_stage, - HPROVIDER provider); - -extern HPROVIDER AILCALL AIL_API_set_digital_driver_processor - (HDIGDRIVER dig, - DIGDRVSTAGE pipeline_stage, - HPROVIDER provider); - -extern HPROVIDER AILCALL AIL_API_sample_processor (HSAMPLE S, - SAMPLESTAGE pipeline_stage); - -extern HPROVIDER AILCALL AIL_API_digital_driver_processor - (HDIGDRIVER dig, - DIGDRVSTAGE pipeline_stage); - -extern void AILCALL AIL_API_set_sample_address (HSAMPLE S, - void const *start, - U32 len); - -extern S32 AILCALL AIL_API_init_sample (HSAMPLE S, - S32 format); - -extern void AILCALL AIL_API_set_sample_adpcm_block_size - (HSAMPLE S, - U32 blocksize); - -extern void AILCALL AIL_API_start_sample (HSAMPLE S); -extern void AILCALL AIL_API_stop_sample (HSAMPLE S); -extern void AILCALL AIL_API_end_fade_sample (HSAMPLE S); -extern void AILCALL AIL_API_resume_sample (HSAMPLE S); -extern void AILCALL AIL_API_end_sample (HSAMPLE S); - -extern void AILCALL AIL_API_sample_group_operation (HDIGDRIVER dig, S32 op, S32 start_id, S32 set_to_id); -extern void AILCALL AIL_API_schedule_start_sample (HSAMPLE S, U64 mix_time_to_start); - -extern void AILCALL AIL_API_push_system_state (HDIGDRIVER dig, U32 flags, S16 crossfade_ms); -extern void AILCALL AIL_API_pop_system_state (HDIGDRIVER dig, S16 crossfade_ms); - -extern void AILCALL AIL_API_set_sample_playback_rate - (HSAMPLE S, - S32 playback_rate); - -extern void AILCALL AIL_API_set_sample_playback_rate_factor - (HSAMPLE S, - F32 playback_rate_factor); - -extern void AILCALL AIL_API_set_sample_playback_delay - (HSAMPLE S, - S32 playback_delay); - -extern void AILCALL AIL_API_set_sample_volume_pan (HSAMPLE S, - F32 volume, - F32 pan); - -extern S32 AILCALL AIL_API_sample_channel_count (HSAMPLE S, U32 *mask); - -extern S32 AILCALL AIL_API_set_sample_is_3D (HSAMPLE S, //) - S32 onoff); - -extern void AILCALL AIL_API_set_sample_speaker_scale_factors (HSAMPLE S, //) - MSS_SPEAKER const * dest_speaker_indexes, - F32 const * levels, - S32 n_levels ); - -extern void AILCALL AIL_API_sample_speaker_scale_factors (HSAMPLE S, //) - MSS_SPEAKER const * dest_speaker_indexes, - F32 * levels, - S32 n_levels ); - -extern void AILCALL AIL_API_set_sample_channel_levels (HSAMPLE S, - MSS_SPEAKER const *source_speaker_indexes, - MSS_SPEAKER const *dest_speaker_indexes, - F32 const *levels, - S32 n_levels); - -extern void AILCALL AIL_API_sample_channel_levels (HSAMPLE S, - MSS_SPEAKER const *source_speaker_indexes, - MSS_SPEAKER const *dest_speaker_indexes, - F32 *levels, - S32 n_levels); - -extern F32 AILCALL AIL_API_sample_output_levels (HSAMPLE S, - MSS_SPEAKER const *source_speaker_indexes, - MSS_SPEAKER const *dest_speaker_indexes, - F32 *levels, - S32 n_levels); - -extern void AILCALL AIL_API_set_sample_51_volume_pan( HSAMPLE S, - F32 volume, - F32 pan, - F32 fb_pan, - F32 center_level, - F32 sub_level ); - -extern void AILCALL AIL_API_sample_51_volume_pan ( HSAMPLE S, - F32* volume, - F32* pan, - F32* fb_pan, - F32* center_level, - F32* sub_level ); - -extern void AILCALL AIL_API_set_sample_51_volume_levels( HSAMPLE S, - F32 f_left_level, - F32 f_right_level, - F32 b_left_level, - F32 b_right_level, - F32 center_level, - F32 sub_level ); - -extern void AILCALL AIL_API_sample_51_volume_levels ( HSAMPLE S, - F32* f_left_level, - F32* f_right_level, - F32* b_left_level, - F32* b_right_level, - F32* center_level, - F32* sub_level ); -extern void AILCALL AIL_API_set_sample_volume_levels(HSAMPLE S, - F32 left_level, - F32 right_level); - -extern void AILCALL AIL_API_set_sample_reverb_levels(HSAMPLE S, - F32 dry_level, - F32 wet_level); - -extern void AILCALL AIL_API_set_sample_low_pass_cut_off( HSAMPLE S, - S32 /*-1 or MSS_SPEAKER*/ input_channel, - F32 cutoff ); - -extern void AILCALL AIL_API_set_sample_loop_count (HSAMPLE S, - S32 loop_count); - -extern void AILCALL AIL_API_set_sample_loop_block (HSAMPLE S, - S32 loop_start_offset, - S32 loop_end_offset); - -extern S32 AILCALL AIL_API_sample_loop_block (HSAMPLE S, - S32 *loop_start_offset, - S32 *loop_end_offset); - -extern U32 AILCALL AIL_API_sample_status (HSAMPLE S); - -extern S32 AILCALL AIL_API_sample_playback_rate (HSAMPLE S); - -extern F32 AILCALL AIL_API_sample_playback_rate_factor (HSAMPLE S); - -extern S32 AILCALL AIL_API_sample_playback_delay (HSAMPLE S); - -extern void AILCALL AIL_API_sample_volume_pan (HSAMPLE S, - F32* volume, - F32* pan); - -extern void AILCALL AIL_API_sample_volume_levels(HSAMPLE S, - F32 * left_level, - F32 * right_level); - -extern void AILCALL AIL_API_sample_reverb_levels(HSAMPLE S, - F32 * dry_level, - F32 * wet_level); - -extern F32 AILCALL AIL_API_sample_low_pass_cut_off(HSAMPLE S, S32 /*-1 or MSS_SPEAKER*/ channel); - -extern S32 AILCALL AIL_API_sample_loop_count (HSAMPLE S); - -extern void AILCALL AIL_API_set_digital_master_volume_level - (HDIGDRIVER dig, - F32 master_volume); - -extern F32 AILCALL AIL_API_digital_master_volume_level (HDIGDRIVER dig); - -extern void AILCALL AIL_API_set_digital_master_volume_levels(HDIGDRIVER dig, - F32 left_level, - F32 right_level); - -extern void AILCALL AIL_API_set_digital_master_reverb_levels(HDIGDRIVER dig, - S32 bus_index, - F32 dry_level, - F32 wet_level); - -extern void AILCALL AIL_API_set_digital_master_room_type(HDIGDRIVER dig, - S32 bus_index, - S32 room_type); - -extern void AILCALL AIL_API_digital_master_reverb_levels(HDIGDRIVER dig, - S32 bus_index, - F32 * dry_level, - F32 * wet_level); - -extern void AILCALL AIL_API_set_digital_master_reverb(HDIGDRIVER dig, - S32 bus_index, - F32 reverb_time, - F32 reverb_predelay, - F32 reverb_damping); - -extern void AILCALL AIL_API_digital_master_reverb(HDIGDRIVER dig, - S32 bus_index, - F32 * reverb_time, - F32 * reverb_predelay, - F32 * reverb_damping); - -extern S32 AILCALL AIL_API_minimum_sample_buffer_size - (HDIGDRIVER dig, - S32 playback_rate, - S32 format); - -extern S32 AILCALL AIL_API_set_sample_buffer_count - (HSAMPLE S, - S32 n_buffers); - -extern S32 AILCALL AIL_API_sample_buffer_count (HSAMPLE S); - -extern S32 AILCALL AIL_API_sample_buffer_available (HSAMPLE S); - -extern S32 AILCALL AIL_API_sample_loaded_len( HSAMPLE S ); - -extern S32 AILCALL AIL_API_load_sample_buffer (HSAMPLE S, - S32 buff_num, - void const *buffer, - U32 len); - -extern S32 AILCALL AIL_API_sample_buffer_info (HSAMPLE S, - S32 buff_num, - U32 *pos, - U32 *len, - S32 *head, - S32 *tail); - -extern U32 AILCALL AIL_API_sample_granularity (HSAMPLE S); - -extern void AILCALL AIL_API_set_sample_position (HSAMPLE S, - U32 pos); - -extern U32 AILCALL AIL_API_sample_position (HSAMPLE S); - -extern AILSAMPLECB AILCALL AIL_API_register_SOB_callback - (HSAMPLE S, - AILSAMPLECB SOB); - -extern AILSAMPLECB AILCALL AIL_API_register_EOB_callback - (HSAMPLE S, - AILSAMPLECB EOB); - -extern AILSAMPLECB AILCALL AIL_API_register_EOS_callback - (HSAMPLE S, - AILSAMPLECB EOS); - -extern AILFALLOFFCB AILCALL AIL_API_register_falloff_function_callback - (HSAMPLE S, - AILFALLOFFCB falloff_cb); - -extern void AILCALL AIL_API_set_sample_user_data (HSAMPLE S, - U32 index, - SINTa value); - -extern SINTa AILCALL AIL_API_sample_user_data (HSAMPLE S, - U32 index); - -extern S32 AILCALL AIL_API_active_sample_count (HDIGDRIVER dig); - -extern void AILCALL AIL_API_digital_configuration (HDIGDRIVER dig, - S32 *rate, - S32 *format, - char *config); - -// -// High-level XMIDI services -// - -#if defined(IS_WINDOWS) - -extern S32 AILCALL AIL_API_midiOutOpen (HMDIDRIVER *drvr, - LPHMIDIOUT *lphMidiOut, - U32 dwDeviceID); - -extern void AILCALL AIL_API_midiOutClose (HMDIDRIVER mdi); - - -extern S32 AILCALL AIL_API_MIDI_handle_release (HMDIDRIVER mdi); - -extern S32 AILCALL AIL_API_MIDI_handle_reacquire (HMDIDRIVER mdi); - -#else - -extern HMDIDRIVER AILCALL AIL_API_open_XMIDI_driver( U32 flags ); - -extern void AILCALL AIL_API_close_XMIDI_driver( HMDIDRIVER mdi ); - -#endif - -extern HSEQUENCE AILCALL AIL_API_allocate_sequence_handle - (HMDIDRIVER mdi); - -extern void AILCALL AIL_API_release_sequence_handle - (HSEQUENCE S); - -extern S32 AILCALL AIL_API_init_sequence (HSEQUENCE S, - void const *start, - S32 sequence_num); - -extern void AILCALL AIL_API_start_sequence (HSEQUENCE S); -extern void AILCALL AIL_API_stop_sequence (HSEQUENCE S); -extern void AILCALL AIL_API_resume_sequence (HSEQUENCE S); -extern void AILCALL AIL_API_end_sequence (HSEQUENCE S); - -extern void AILCALL AIL_API_set_sequence_tempo (HSEQUENCE S, - S32 tempo, - S32 milliseconds); - -extern void AILCALL AIL_API_set_sequence_volume (HSEQUENCE S, - S32 volume, - S32 milliseconds); - -extern void AILCALL AIL_API_set_sequence_loop_count - (HSEQUENCE S, - S32 loop_count); - -extern U32 AILCALL AIL_API_sequence_status (HSEQUENCE S); - -extern S32 AILCALL AIL_API_sequence_tempo (HSEQUENCE S); -extern S32 AILCALL AIL_API_sequence_volume (HSEQUENCE S); -extern S32 AILCALL AIL_API_sequence_loop_count (HSEQUENCE S); - -extern void AILCALL AIL_API_set_XMIDI_master_volume - (HMDIDRIVER mdi, - S32 master_volume); - -extern S32 AILCALL AIL_API_XMIDI_master_volume (HMDIDRIVER mdi); - -// -// Low-level XMIDI services -// - -extern S32 AILCALL AIL_API_active_sequence_count (HMDIDRIVER mdi); - -extern S32 AILCALL AIL_API_controller_value (HSEQUENCE S, - S32 channel, - S32 controller_num); - -extern S32 AILCALL AIL_API_channel_notes (HSEQUENCE S, - S32 channel); - -extern void AILCALL AIL_API_sequence_position (HSEQUENCE S, - S32 *beat, - S32 *measure); - -extern void AILCALL AIL_API_branch_index (HSEQUENCE S, - U32 marker); - -extern AILPREFIXCB AILCALL AIL_API_register_prefix_callback - (HSEQUENCE S, - AILPREFIXCB callback); - -extern AILTRIGGERCB AILCALL AIL_API_register_trigger_callback - (HSEQUENCE S, - AILTRIGGERCB callback); - -extern AILSEQUENCECB AILCALL AIL_API_register_sequence_callback - (HSEQUENCE S, - AILSEQUENCECB callback); - -extern AILEVENTCB AILCALL AIL_API_register_event_callback - (HMDIDRIVER mdi, - AILEVENTCB callback); - -extern AILBEATCB AILCALL AIL_API_register_beat_callback - (HSEQUENCE S, - AILBEATCB callback); - -extern AILTIMBRECB AILCALL AIL_API_register_timbre_callback - (HMDIDRIVER mdi, - AILTIMBRECB callback); - -extern void AILCALL AIL_API_set_sequence_user_data(HSEQUENCE S, - U32 index, - SINTa value); - -extern SINTa AILCALL AIL_API_sequence_user_data (HSEQUENCE S, - U32 index); - -extern void AILCALL AIL_API_register_ICA_array (HSEQUENCE S, - U8 *array); - -extern S32 AILCALL AIL_API_lock_channel (HMDIDRIVER mdi); - -extern void AILCALL AIL_API_release_channel (HMDIDRIVER mdi, - S32 channel); - -extern void AILCALL AIL_API_map_sequence_channel (HSEQUENCE S, - S32 seq_channel, - S32 new_channel); - -extern S32 AILCALL AIL_API_true_sequence_channel (HSEQUENCE S, - S32 seq_channel); - -extern void AILCALL AIL_API_send_channel_voice_message - (HMDIDRIVER mdi, - HSEQUENCE S, - S32 status, - S32 data_1, - S32 data_2); - -extern void AILCALL AIL_API_send_sysex_message (HMDIDRIVER mdi, - void const *buffer); - -extern HWAVESYNTH - AILCALL AIL_API_create_wave_synthesizer (HDIGDRIVER dig, - HMDIDRIVER mdi, - void const *wave_lib, - S32 polyphony); - -extern void AILCALL AIL_API_destroy_wave_synthesizer(HWAVESYNTH W); - -extern S32 AILCALL AIL_API_MIDI_to_XMI (void const* MIDI, - U32 MIDI_size, - void**XMIDI, - U32 * XMIDI_size, - S32 flags); - -#if defined(IS_WIN32) - -extern S32 AILCALL AIL_API_list_MIDI (void const* MIDI, - U32 MIDI_size, - char* *list, - U32 * list_size, - S32 flags); - -extern S32 AILCALL AIL_API_list_DLS (void const* DLS, - char**list, - U32 * list_size, - S32 flags, - C8 * title); - -#endif - -extern char* AILCALL AIL_API_last_error ( void ); - -extern void AILCALL AIL_API_set_error ( char const* error_msg ); - -extern S32 AILCALL AIL_API_file_error (void); - -extern S32 AILCALL AIL_API_file_size (char const *filename, - char const * caller, - U32 caller_line); - -extern void * AILCALL AIL_API_file_read (char const *filename, - void *dest, - char const * caller, - U32 caller_line); - -extern S32 AILCALL AIL_API_file_write (char const *filename, - void const *buf, - U32 len); - -extern S32 AILCALL AIL_API_WAV_file_write (char const *filename, - void const *buf, - U32 len, - S32 rate, - S32 format); - -extern void AILCALL AIL_API_serve (void); - - -#ifdef IS_WINDOWS - -extern HREDBOOK AILCALL AIL_API_redbook_open (U32 which); - -extern HREDBOOK AILCALL AIL_API_redbook_open_drive(S32 drive); - -extern void AILCALL AIL_API_redbook_close (HREDBOOK hand); - -extern void AILCALL AIL_API_redbook_eject (HREDBOOK hand); - -extern void AILCALL AIL_API_redbook_retract (HREDBOOK hand); - -extern U32 AILCALL AIL_API_redbook_status (HREDBOOK hand); - -extern U32 AILCALL AIL_API_redbook_tracks (HREDBOOK hand); - -extern U32 AILCALL AIL_API_redbook_track (HREDBOOK hand); - -extern void AILCALL AIL_API_redbook_track_info (HREDBOOK hand, - U32 tracknum, - U32* startmsec, - U32* endmsec); - -extern U32 AILCALL AIL_API_redbook_id (HREDBOOK hand); - -extern U32 AILCALL AIL_API_redbook_position (HREDBOOK hand); - -extern U32 AILCALL AIL_API_redbook_play (HREDBOOK hand, - U32 startmsec, - U32 endmsec); - -extern U32 AILCALL AIL_API_redbook_stop (HREDBOOK hand); - -extern U32 AILCALL AIL_API_redbook_pause (HREDBOOK hand); - -extern U32 AILCALL AIL_API_redbook_resume (HREDBOOK hand); - -extern F32 AILCALL AIL_API_redbook_volume_level (HREDBOOK hand); - -extern F32 AILCALL AIL_API_redbook_set_volume_level(HREDBOOK hand, - F32 volume); - -#endif - -extern S32 AILCALL AIL_API_quick_startup (S32 use_digital, - S32 use_MIDI, - U32 output_rate, - S32 output_bits, - S32 output_channels); - -extern void AILCALL AIL_API_quick_shutdown (void); - -extern void AILCALL AIL_API_quick_handles (HDIGDRIVER* pdig, - HMDIDRIVER* pmdi, - HDLSDEVICE* pdls); - -extern HAUDIO AILCALL AIL_API_quick_load (char const *filename); - -extern HAUDIO AILCALL AIL_API_quick_load_mem (void const *mem, - U32 size); - -extern HAUDIO AILCALL AIL_API_quick_load_named_mem(void const *mem, - char const *filename, - U32 size); - -extern void AILCALL AIL_API_quick_unload (HAUDIO audio); - -extern S32 AILCALL AIL_API_quick_play (HAUDIO audio, - U32 loop_count); - -extern void AILCALL AIL_API_quick_halt (HAUDIO audio); - -extern S32 AILCALL AIL_API_quick_status (HAUDIO audio); - -extern HAUDIO AILCALL AIL_API_quick_load_and_play (char const *filename, - U32 loop_count, - S32 wait_request); - -extern void AILCALL AIL_API_quick_set_speed (HAUDIO audio, - S32 speed); - -extern void AILCALL AIL_API_quick_set_volume (HAUDIO audio, - F32 volume, - F32 extravol); - -extern void AILCALL AIL_API_quick_set_reverb_levels(HAUDIO audio, - F32 dry_level, - F32 wet_level); - -extern void AILCALL AIL_API_quick_set_low_pass_cut_off(HAUDIO audio, - S32 channel, - F32 cut_off); - -extern HAUDIO AILCALL AIL_API_quick_copy (HAUDIO hand); - -extern void AILCALL AIL_API_quick_set_ms_position (HAUDIO audio, - S32 milliseconds); - -extern S32 AILCALL AIL_API_quick_ms_position (HAUDIO audio); - -extern S32 AILCALL AIL_API_quick_ms_length (HAUDIO audio); - -extern S32 AILCALL AIL_API_quick_type (HAUDIO audio); - -// -// High-level streaming services -// - -void AILSTRM_shutdown(HDIGDRIVER driver); - -extern HSTREAM AILCALL AIL_API_open_stream (HDIGDRIVER dig, - char const* filename, - S32 stream_mem); - -extern void AILCALL AIL_API_close_stream (HSTREAM stream); - -extern S32 AILCALL AIL_API_service_stream (HSTREAM stream, - S32 fillup); - -extern void AILCALL AIL_API_start_stream (HSTREAM stream); - -extern void AILCALL AIL_API_pause_stream (HSTREAM stream, - S32 onoff); - -extern void AILCALL AIL_API_set_stream_loop_block (HSTREAM S, - S32 loop_start_offset, - S32 loop_end_offset); - -extern S32 AILCALL AIL_API_stream_loop_count (HSTREAM stream); - -extern void AILCALL AIL_API_set_stream_loop_count (HSTREAM stream, - S32 count); - -extern S32 AILCALL AIL_API_stream_status (HSTREAM stream); - -extern F32 AILCALL AIL_API_stream_filled_percent (HSTREAM stream); - -extern void AILCALL AIL_API_set_stream_position (HSTREAM stream, - S32 offset); - -extern S32 AILCALL AIL_API_stream_position (HSTREAM stream); - -extern void AILCALL AIL_API_stream_info (HSTREAM stream, - S32* datarate, - S32* sndtype, - S32* length, - S32* memory); - -extern void AILCALL AIL_API_auto_service_stream (HSTREAM stream, - S32 onoff); - -extern AILSTREAMCB AILCALL AIL_API_register_stream_callback - (HSTREAM stream, - AILSTREAMCB callback); - -extern void AILCALL AIL_API_set_stream_user_data (HSTREAM S, - U32 index, - SINTa value); - -extern SINTa AILCALL AIL_API_stream_user_data (HSTREAM S, - U32 index); - -extern S32 AILCALL AIL_API_size_processed_digital_audio( - U32 dest_rate, - U32 dest_format, - S32 num_srcs, - AILMIXINFO const* src); - -extern S32 AILCALL AIL_API_process_digital_audio( - void *dest_buffer, - S32 dest_buffer_size, - U32 dest_rate, - U32 dest_format, - S32 num_srcs, - AILMIXINFO* src); - -extern HDLSDEVICE AILCALL AIL_API_DLS_open (HMDIDRIVER mdi, - HDIGDRIVER dig, -#ifdef IS_STATIC - AILSTATICDLS const* dls, -#else - char const* libname, -#endif - U32 flags, - U32 rate, - S32 bits, - S32 channels); - - -extern void AILCALL AIL_API_DLS_close (HDLSDEVICE dls, - U32 flags); - -extern HDLSFILEID AILCALL AIL_API_DLS_load_file (HDLSDEVICE dls, - char const* filename, - U32 flags); - -extern HDLSFILEID AILCALL AIL_API_DLS_load_memory (HDLSDEVICE dls, - void const* memfile, - U32 flags); - -extern void AILCALL AIL_API_DLS_unload (HDLSDEVICE dls, - HDLSFILEID dlsid); - -extern void AILCALL AIL_API_DLS_compact (HDLSDEVICE dls); - -extern void AILEXPORT AIL_API_DLS_set_reverb_levels(HDLSDEVICE dls, - F32 dry_level, - F32 wet_level); - -extern void AILEXPORT AIL_API_DLS_get_reverb_levels(HDLSDEVICE dls, - F32* dry_level, - F32* wet_level); - -extern void AILCALL AIL_API_DLS_get_info (HDLSDEVICE dls, - AILDLSINFO* info, - S32* PercentCPU); - -extern S32 AILCALL AIL_API_extract_DLS (void const*source_image, //) - U32 source_size, - void * *XMI_output_data, - U32 *XMI_output_size, - void * *DLS_output_data, - U32 *DLS_output_size, - AILLENGTHYCB callback); - -extern void AILCALL AIL_API_set_sequence_ms_position - (HSEQUENCE S, //) - S32 milliseconds); - -extern void AILCALL AIL_API_sequence_ms_position (HSEQUENCE S, //) - S32 *total_milliseconds, - S32 *current_milliseconds); - -extern void AILCALL AIL_API_set_sample_ms_position(HSAMPLE S, //) - S32 milliseconds); - -extern void AILCALL AIL_API_sample_ms_position (HSAMPLE S, //) - S32 *total_milliseconds, - S32 *current_milliseconds); - -extern U32 AILCALL AIL_API_sample_ms_lookup (HSAMPLE S, //) - S32 milliseconds, - S32* actualms); - -extern void AILCALL AIL_API_set_stream_ms_position(HSTREAM S, //) - S32 milliseconds); - -extern void AILCALL AIL_API_stream_ms_position (HSTREAM S, //) - S32 *total_milliseconds, - S32 *current_milliseconds); - -extern S32 AILCALL AIL_API_WAV_info (void const* data, - AILSOUNDINFO* info); - -extern S32 AILCALL AIL_API_compress_ADPCM (AILSOUNDINFO const* info, //) - void** outdata, U32* outsize); - -extern S32 AILCALL AIL_API_decompress_ADPCM (AILSOUNDINFO const* info, - void** outdata, - U32* outsize); - -extern S32 AILCALL AIL_API_file_type (void const* data, - U32 size); - -extern S32 AILCALL AIL_API_file_type_named (void const* data, - char const* filename, - U32 size); - -extern S32 AILCALL AIL_API_find_DLS (void const* data, - U32 size, - void**xmi, - U32* xmisize, - void**dls, - U32* dlssize); - -// -// Internal MSS mixer RIB calls -// - -extern U32 AILCALL MSS_MMX_available (void); - -extern void AILCALL MSS_mixer_startup (void); -extern void AILCALL MSS_mixer_shutdown (void); - -extern void AILCALL MSS_mixer_flush(S32 *dest, - S32 len -#ifdef IS_X86 - ,U32 MMX_available -#endif - ); - -extern void AILCALL MSS_mixer_merge(void const * *src, - U32 *src_fract, - void const *src_end, - S32 * *dest, - void *dest_end, - S32 *left_val, - S32 *right_val, - S32 playback_ratio, - S32 scale_left, - S32 scale_right, - U32 operation -#ifdef IS_X86 - ,U32 MMX_available -#endif - ); - -extern void AILCALL MSS_mixer_copy(void const *src, - S32 src_len, - void *dest, - U32 operation -#ifdef IS_BE - ,S32 big_endian_output -#else -#ifdef IS_X86 - ,U32 MMX_available -#endif -#endif - ); - -extern void AILCALL SS_set_speaker_configuration (D3DSTATE *D3D, - MSSVECTOR3D *speaker_positions, - S32 n_channels, - S32 logical_channels_per_sample); - -extern void SS_calculate_3D_channel_levels(D3DSTATE const *D3D, - S32 logical_channels_per_sample, - S3DSTATE *S3D, - F32 *channel_levels); - -extern void AILCALL SS_update_driver_reverb_state(HDIGDRIVER dig); - -extern void AILCALL SS_update_sample_reverb_state(HSAMPLE S); - -extern void AILCALL SS_flush (HDIGDRIVER dig, S32 reverb_index); - -extern void AILCALL SS_copy (HDIGDRIVER dig, S32 reverb_index, void *lpWaveAddr); - - -extern F32 AILCALLBACK SS_default_falloff_function_callback(HSAMPLE S, //) - F32 distance, - F32 rolloff_factor, - F32 min_dist, - F32 max_dist); -extern S32 AILCALLBACK SS_stream_to_buffer(HSAMPLE S, - S16 *dest_mono_sample_buffer, - S32 dest_buffer_size); - - -#ifdef MILES10 -extern void SS_fill(HDIGDRIVER dig); -#else -extern void SS_fill(HDIGDRIVER dig, void *lpData); -#endif - -extern void AILCALL SS_start_DIG_driver_playback(HSAMPLE S); - -extern S32 AILCALL SS_set_sample_type( HSAMPLE S, S32 format, U32 channel_mask ); - -extern void AILCALL AIL_apply_reverb( HDIGDRIVER dig ); - -extern S32 AILCALL AIL_allocate_reverb_buffers( HDIGDRIVER dig, S32 index ); - -extern void AILCALL AIL_apply_lowpass( void* dest, void const* src, void const* src_end, LOWPASS_INFO* lp_in, S32 op ); - - -#if defined(IS_WIN32) || defined(IS_GENERICDIG) -extern S32 AILCALL get_system_speaker_configuration(MSS_MC_SPEC *channel_spec); -#endif - - -#ifdef IS_BE - - #ifdef IS_PPC - - #ifdef IS_XENON - - #define LE_SWAP32( ptr ) __loadwordbytereverse(0,ptr) - - #define LE_SWAP32_OFS( ptr,ofs ) __loadwordbytereverse(ofs,ptr) - - #define STORE_LE_SWAP32( ptr, val ) __storewordbytereverse ( (U32)(val), 0, ptr ) - - #elif (defined(IS_PS3) && !defined(IS_SPU)) || defined(IS_MAC) - #define LE_SWAP32( ptr ) ld_le32(ptr) - #define LE_SWAP32_OFS( ptr, ofs ) ld_le32_ofs(ptr,ofs) - // the char* is not required, but works around a GCC bug - #define STORE_LE_SWAP32( ptr, val ) st_le32( (char*)(ptr), (U32)(val) ) - #elif defined(IS_WIIU) - - #define LE_SWAP32(ptr) (*(__bytereversed unsigned int *)(ptr)) - #define LE_SWAP32_OFS(ptr, ofs) (*(__bytereversed unsigned int *)AIL_ptr_add(ptr, ofs)) - - #define STORE_LE_SWAP32( ptr, val ) (*(__bytereversed unsigned int *)(ptr) = (val)) - - #define STORE_LE_SWAP16_OFS( ptr, val, const_ofs ) (*(__bytereversed unsigned short*)(AIL_ptr_add(ptr, const_ofs))) = (val) - #else - #define LE_SWAP32( ptr ) __lwbrx((void*)(ptr),0) - #define LE_SWAP32_OFS( ptr,ofs ) __lwbrx((void*)(ptr),ofs) - - #define STORE_LE_SWAP32( ptr, val ) __stwbrx( (U32)(val), ptr, 0 ) - #endif - - #elif defined(IS_SPU) - - static U32 inline LE_SWAP32(void const * src) __attribute__((always_inline)); - static U32 inline LE_SWAP32(void const * src) - { - U32 i = (*((U32*)src)); - vec_uint4 v = spu_promote( i, 0 ); - v = (vec_uint4)spu_shuffle( v, v, ((vec_uchar16){ 3, 2, 1, 0, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15})); - i = spu_extract( v, 0 ); - return i; - } - - static U32 inline LE_SWAP32_OFS(void const * src,S32 ofs) __attribute__((always_inline)); - static U32 inline LE_SWAP32_OFS(void const * src,S32 ofs) - { - U32 i = (*((U32*)(((char*)src)+ofs))); - vec_uint4 v = spu_promote( i, 0 ); - v = (vec_uint4)spu_shuffle( v, v, ((vec_uchar16){ 3, 2, 1, 0, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15})); - i = spu_extract( v, 0 ); - return i; - } - - #define STORE_LE_SWAP32( ptr, val )\ - { \ - U32 tmp = (U32) val; \ - vec_uint4 v = spu_promote( tmp, 0 ); \ - v = (vec_uint4)spu_shuffle( v, v, ((vec_uchar16){ 3, 2, 1, 0, 4, 5, 6, 7, \ - 8, 9, 10, 11, 12, 13, 14, 15})); \ - tmp = spu_extract( v, 0 ); \ - *((U32 *)(((char*)ptr)+0)) = tmp; \ - } - - #define STORE_LE_SWAP32_OFS( ptr, val, ofs )\ - { \ - U32 tmp = (U32) val; \ - vec_uint4 v = spu_promote( tmp, 0 ); \ - v = (vec_uint4)spu_shuffle( v, v, ((vec_uchar16){ 3, 2, 1, 0, 4, 5, 6, 7, \ - 8, 9, 10, 11, 12, 13, 14, 15})); \ - tmp = spu_extract( v, 0 ); \ - *((U32 *)(((char*)ptr)+ofs)) = tmp; \ - } - - #else - - #define LE_SWAP32(ptr) \ - ( ( ( ( *((U32 *)(ptr) ) ) << 24 ) ) | \ - ( ( ( *((U32 *)(ptr) ) ) << 8 ) & 0x00FF0000 ) | \ - ( ( ( *((U32 *)(ptr) ) ) >> 8 ) & 0x0000FF00 ) | \ - ( ( ( *((U32 *)(ptr) ) ) >> 24 ) ) ) - - #define LE_SWAP32_OFS(ptr,ofs) \ - ( ( ( ( *((U32 *)AIL_ptr_add(ptr,ofs) ) ) << 24 ) ) | \ - ( ( ( *((U32 *)AIL_ptr_add(ptr,ofs) ) ) << 8 ) & 0x00FF0000 ) | \ - ( ( ( *((U32 *)AIL_ptr_add(ptr,ofs) ) ) >> 8 ) & 0x0000FF00 ) | \ - ( ( ( *((U32 *)AIL_ptr_add(ptr,ofs) ) ) >> 24 ) ) ) - - #define STORE_LE_SWAP32( ptr, val ) { *((U32 *)ptr) = \ - ( ( ( ( ((U32)(val) ) ) << 24 ) ) | \ - ( ( ( ((U32)(val) ) ) << 8 ) & 0x00FF0000 ) | \ - ( ( ( ((U32)(val) ) ) >> 8 ) & 0x0000FF00 ) | \ - ( ( ( ((U32)(val) ) ) >> 24 ) ) ); } - - #endif - - #if defined( IS_PPC ) - - #ifdef IS_XENON - unsigned short __loadshortbytereverse (int offset, const void * base); - unsigned long __loadwordbytereverse (int offset, const void * base); - - void __storeshortbytereverse (unsigned short val, int offset, void * base); - void __storewordbytereverse (unsigned int val, int offset, void * base); - - #define LE_SWAP16( ptr ) __loadshortbytereverse (0,(S16 *)ptr) - - #define LE_SWAP16_OFS( ptr, const_ofs ) __loadshortbytereverse (const_ofs,(S16 *)ptr) - - #define STORE_LE_SWAP16( ptr, val ) __storeshortbytereverse ( (U16)(val), 0, (S16 *)ptr ) - - #define STORE_LE_SWAP16_OFS( ptr, val, const_ofs ) __storeshortbytereverse ( (U16)(val), const_ofs, (S16 *)ptr ) - #else - - #if (defined(IS_PS3) && !defined(IS_SPU)) || defined(IS_MAC) - - #define __fsel( outf, cmp, inf1, inf2 ) \ - __asm__ __volatile__ ("fsel %0,%1,%2,%3" : "=f" (outf) : "f" (cmp), "f" (inf1), "f" (inf2)); - - static inline float fclip1(float sample ) - { - float ret; - - __fsel( ret, sample + 1.0f, sample, -1.0f ); - __fsel( ret, sample - 1.0f, 1.0f, ret ); - return( ret ); - } - - static __inline__ U16 ld_le16(const S16 *addr) - { - U16 val; - __asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (addr)); - return val; - } - - static __inline__ U16 ld_le16_ofs(const S16 *addr, U64 const_ofs ) - { - U16 val; - __asm__ __volatile__ ("lhbrx %0,%1,%2" : "=r" (val) : "b" (const_ofs), "r" (addr)); - return val; - } - - static __inline__ void st_le16(S16 *addr, const U16 val) - { - __asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr)); - } - - static __inline__ void st_le16_ofs(S16 *addr, U64 const_ofs, const U16 val) - { - __asm__ __volatile__ ("sthbrx %2,%1,%3" : "=m" (*addr) : "b" (const_ofs), "r" (val), "r" (addr)); - } - - static __inline__ U32 ld_le32(const void *addr) - { - U32 val; - - __asm__ __volatile__ ("lwbrx %0,0,%1" : "=r" (val) : "r" ((U32*)addr) ); - return val; - } - - static __inline__ U32 ld_le32_ofs(const void *addr, U64 const_ofs ) - { - U32 val; - __asm__ __volatile__ ("lwbrx %0,%1,%2" : "=r" (val) : "b" (const_ofs), "r" (addr)); - return val; - } - -/* static __inline__ void st_le32_ofs(void *addr, U64 const_ofs, const U32 val) - { - __asm__ __volatile__ ("stwbrx %2,%1,%3" : "=m" (*(U32*)addr) : "b" (const_ofs), "r" (val), "r" ((U32*)addr)); - }*/ - - static __inline__ void st_le32(void *addr, const U32 val) - { //todo, weird hacks to make this work with GCC - __asm__ __volatile__ ("stwbrx %1,%3,%2" : "=m" (*(U32*)addr) : "r" (val), "r" ((U32*)addr), "O"(0) ); - } - - #define LE_SWAP16( ptr ) ld_le16 ((S16 *)ptr) - - #define LE_SWAP16_OFS( ptr, const_ofs ) ld_le16_ofs ((S16 *)ptr, const_ofs) - - #define STORE_LE_SWAP16( ptr, val ) st_le16( (S16 *)ptr, (U16)(val) ) - - #define STORE_LE_SWAP16_OFS( ptr, val, const_ofs ) st_le16_ofs( (S16 *)ptr, const_ofs, (U16)(val) ) - #elif defined(IS_WIIU) - - #define LE_SWAP16(ptr) (*(__bytereversed unsigned short *)(ptr)) - #define LE_SWAP16_OFS(ptr, ofs) (*(__bytereversed unsigned short *)AIL_ptr_add(ptr, ofs)) - - #define STORE_LE_SWAP16( ptr, val ) (*(__bytereversed unsigned short *)(ptr) = (val)) - - #else - #define LE_SWAP16( ptr ) __lhbrx((S16 *)ptr,0) - - #define LE_SWAP16_OFS( ptr, const_ofs ) __lhbrx((S16 *)ptr,const_ofs) - - #define STORE_LE_SWAP16( ptr, val ) __sthbrx( (U16)(val), (S16 *)ptr, 0 ) - - #define STORE_LE_SWAP16_OFS( ptr, val, const_ofs ) __sthbrx( (U16)(val), (S16 *)ptr, const_ofs ) - #endif - #endif - - #elif defined( IS_SPU ) - - static U32 inline LE_SWAP16(void const * src) __attribute__((always_inline)); - static U32 inline LE_SWAP16(void const * src) - { - U32 i = (*((U16*)src)); - vec_uint4 v = spu_promote( i, 0 ); - v = (vec_uint4)spu_shuffle( v, v, ((vec_uchar16){ 0, 1, 3, 2, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15})); - i = spu_extract( v, 0 ); - return i; - } - - static U32 inline LE_SWAP16_OFS(void const * src, S32 ofs) __attribute__((always_inline)); - static U32 inline LE_SWAP16_OFS(void const * src, S32 ofs) - { - U32 i = (*((U16*)(((char*)src)+ofs))); - vec_uint4 v = spu_promote( i, 0 ); - v = (vec_uint4)spu_shuffle( v, v, ((vec_uchar16){ 0, 1, 3, 2, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15})); - i = spu_extract( v, 0 ); - return i; - } - - #define STORE_LE_SWAP16( ptr, val )\ - { \ - U32 tmp = (U16) val; \ - vec_uint4 v = spu_promote( tmp, 0 ); \ - v = (vec_uint4)spu_shuffle( v, v, ((vec_uchar16){ 0, 1, 3, 2, 4, 5, 6, 7, \ - 8, 9, 10, 11, 12, 13, 14, 15})); \ - tmp = spu_extract( v, 0 ); \ - *((U16 *)(((char*)ptr)+0)) = tmp; \ - } - - #define STORE_LE_SWAP16_OFS( ptr, val, ofs )\ - { \ - U32 tmp = (U16) val; \ - vec_uint4 v = spu_promote( tmp, 0 ); \ - v = (vec_uint4)spu_shuffle( v, v, ((vec_uchar16){ 0, 1, 3, 2, 4, 5, 6, 7, \ - 8, 9, 10, 11, 12, 13, 14, 15})); \ - tmp = spu_extract( v, 0 ); \ - *((U16 *)(((char*)ptr)+ofs)) = tmp;\ - } - - #else - - #define LE_SWAP16(ptr) \ - ( ( U16 ) \ - ( ( ( ( *((U16 *)(ptr) ) ) << 8 ) ) | \ - ( ( ( *((U16 *)(ptr) ) ) >> 8 ) ) ) \ - ) - - #define LE_SWAP16_OFS(ptr,const_ofs) \ - ( ( U16 ) \ - ( ( ( ( *((U16 *)(AIL_ptr_add(ptr,const_ofs)) ) ) << 8 ) ) | \ - ( ( ( *((U16 *)(AIL_ptr_add(ptr,const_ofs)) ) ) >> 8 ) ) ) \ - ) - - #define STORE_LE_SWAP16( ptr, val ) { *((U16*)ptr) = ( \ - ( ( ( ((U16)(val) ) ) << 8 ) ) | \ - ( ( ( ((U16)(val) ) ) >> 8 ) ) ); } - - #define STORE_LE_SWAP16_OFS( ptr, val, const_ofs ) { *((U16*)AIL_ptr_add(ptr,const_ofs)) = ( \ - ( ( ( ((U16)(val) ) ) << 8 ) ) | \ - ( ( ( ((U16)(val) ) ) >> 8 ) ) ); } - - #endif - - #define BE_SWAP32( ptr ) ( *((U32 *)(ptr) ) ) - #define BE_SWAP16( ptr ) ( *((U16 *)(ptr) ) ) - - #define MEM_LE_SWAP32(n) *((U32*)n) = LE_SWAP32(n); - #define MEM_LE_SWAP16(n) *((U16*)n) = (U16) LE_SWAP16(n); - - #define MEM_BE_SWAP32(n) - #define MEM_BE_SWAP16(n) - - // unaligned versions - #define BEU_SWAP32( ptr ) ( *((U32 *)(ptr) ) ) - #define BEU_SWAP16( ptr ) ( *((U16 *)(ptr) ) ) - - #define LEU_SWAP32(ptr) LE_SWAP32(ptr) - #define LEU_SWAP16(ptr) LE_SWAP16(ptr) - - #define STORE_LEU_SWAP32( ptr, val ) STORE_LE_SWAP32( ptr, val ) - #define STORE_LEU_SWAP16( ptr, val ) STORE_LE_SWAP16( ptr, val ) - - #define MEM_LEU_SWAP32(n) *((U32*)n) = LEU_SWAP32(n); - #define MEM_LEU_SWAP16(n) *((U32*)n) = LEU_SWAP32(n); - -#else // IS_BE - - #define LE_SWAP32( ptr ) ( *((U32 *)(ptr) ) ) - #define LE_SWAP32_OFS( ptr,const_ofs ) ( *((U32 *)AIL_ptr_add(ptr,const_ofs) ) ) - #define LE_SWAP16( ptr ) ( *((U16 *)(ptr) ) ) - - #define LE_SWAP16_OFS( ptr, const_ofs ) ( *((U16 *)(AIL_ptr_add(ptr,const_ofs)) ) ) - - #define STORE_LE_SWAP32( ptr, val ) { *((U32*)(ptr))=(U32)(val); } - #define STORE_LE_SWAP16( ptr, val ) { *((U16*)(ptr))=(U16)(val); } - #define STORE_LE_SWAP16_OFS( ptr, val, const_ofs ) { *((U16*)((((U8*)ptr)+const_ofs)))=(U16)(val); } - - #define BE_SWAP32(ptr) \ - ( ( ( ( *((U32 *)(ptr) ) ) << 24 ) ) | \ - ( ( ( *((U32 *)(ptr) ) ) << 8 ) & 0x00FF0000 ) | \ - ( ( ( *((U32 *)(ptr) ) ) >> 8 ) & 0x0000FF00 ) | \ - ( ( ( *((U32 *)(ptr) ) ) >> 24 ) ) ) - - #define BE_SWAP16(ptr) \ - ( ( U16 ) \ - ( ( ( ( *((U16 *)(ptr) ) ) << 8 ) ) | \ - ( ( ( *((U16 *)(ptr) ) ) >> 8 ) ) ) \ - ) - -#if defined(IS_PSP) - - #define putunaligned4(temp, s ) \ - __asm__("swl %1,3+%0" : "+m"(*(s)): "r"(temp)); \ - __asm__("swr %1,%0" : "+m"(*(s)) : "r"(temp)); - - #define getunaligned4(temp, s ) \ - __asm__("lwl %0,3+%1" : "=r"(temp) : "o"(*(U32*)(s))); \ - __asm__("lwr %0,%1" : "+r"(temp) : "o"(*(U32*)(s)) ); - - static inline U32 LEU_SWAP32( void * ptr ) - { - U32 ret; - getunaligned4( ret, ptr ); - return( ret ); - } - - static inline U32 BEU_SWAP32( void * ptr ) - { - U32 ret; - - getunaligned4( ret, ptr ); - ret = ( ret << 24 ) | ( ( ret << 8 ) & 0x00ff0000 ) | ( ( ret >> 8 ) & 0x0000ff00 ) | ( ret >> 24 ); - return( ret ); - } - - #define LEU_SWAP16(ptr) \ - ( ( U16 ) \ - ( ( ( ( ((U32)(((U8 *)(ptr))[1]) ) ) << 8 ) ) | \ - ( ( ( ((U32)(((U8 *)(ptr))[0]) ) ) ) ) ) \ - ) - #define BEU_SWAP16(ptr) \ - ( ( U16 ) \ - ( ( ( ( ((U32)(((U8 *)(ptr))[0]) ) ) << 8 ) ) | \ - ( ( ( ((U32)(((U8 *)(ptr))[1]) ) ) ) ) ) \ - ) - - #define STORE_LEU_SWAP32( ptr, val ) { register U32 __v = (U32)val; register U32 * __p = (U32*)ptr; putunaligned4( __v, __p ); } - #define STORE_LEU_SWAP16( ptr, val ) { register U16 __v = (U16)val; ((U8*)(ptr))[0]=(U8)val; ((U8*)(ptr))[1]=(U8)(val>>8);} - -#else - - #define LEU_SWAP32(ptr) LE_SWAP32(ptr) - #define LEU_SWAP16(ptr) LE_SWAP16(ptr) - - #define BEU_SWAP32(ptr) BE_SWAP32(ptr) - #define BEU_SWAP16(ptr) BE_SWAP16(ptr) - - #define STORE_LEU_SWAP32( ptr, val ) STORE_LE_SWAP32( ptr, val ) - #define STORE_LEU_SWAP16( ptr, val ) STORE_LE_SWAP16( ptr, val ) - -#endif - - #define MEM_LEU_SWAP32(n) - #define MEM_LEU_SWAP16(n) - - #define MEM_LE_SWAP32(n) - #define MEM_LE_SWAP16(n) - - #define MEM_BE_SWAP32(n) *((U32*)n) = BE_SWAP32(n); - #define MEM_BE_SWAP16(n) *((U16*)n) = BE_SWAP16(n); - -#endif - - - -#if defined(IS_MAC) || defined(IS_WII) || defined(IS_IPHONE) - -#ifdef IS_X86 - -static inline U32 mult64addsubandshift( U32 mt1, U32 mt2, U32 addv, U32 subv, U32 shift ) -{ - U32 retv; - - unsigned long long value; - value = (unsigned long long)mt1 * mt2; - value += addv; - value -= subv; - value = (signed long long )value >> (signed long long )shift; - retv = (U32)value; - - return( retv ); - -} - - -static U32 __inline mult64anddiv(U32 a,U32 b, U32 c) -{ - U32 retv; - unsigned long long value; - value = (unsigned long long)a * b; - value /= c; - retv = (U32)value; - return( retv ); -} - -static U32 __inline shift64addsubanddiv( U32 val, U32 shift,U32 addv, U32 subv, U32 divv) -{ - U32 retv; - unsigned long long value; - value = (unsigned long long)val; - value <<= shift; - value += addv; - value -= subv; - value = (signed long long ) value / (signed long long ) divv; - retv = (U32)value; - return( retv ); -} - -#elif defined(IS_IPHONE) - -#define WRITE_MONO_SAMPLE( dest, fOut ) \ -{ \ - if (fOut > 32767.0F) *dest++ = 32767; \ - else if (fOut < -32768.0F) *dest++ = -32768; \ - else *dest++ = (S16) fOut; \ -} - -static U32 __inline mult64addsubandshift( U32 mt1, U32 mt2, U32 addv, U32 subv, U32 shift ) -{ - U32 retv; - unsigned long long value; - value = (unsigned long long)mt1 * mt2; - value += addv; - value -= subv; - value = (signed long long )value >> (signed long long )shift; - retv = (U32)value; - return( retv ); -} - -static U32 __inline mult64anddiv(U32 a,U32 b, U32 c) -{ - U32 retv; - unsigned long long value; - value = (unsigned long long)a * b; - value /= c; - retv = (U32)value; - return( retv ); -} - -static U32 __inline shift64addsubanddiv( U32 val, U32 shift,U32 addv, U32 subv, U32 divv) -{ - U32 retv; - unsigned long long value; - value = (unsigned long long)val; - value <<= shift; - value += addv; - value -= subv; - value = (signed long long ) value / (signed long long ) divv; - retv = (U32)value; - return( retv ); -} - -#else - -// -// These three dudes help deal with u64s in hi,lo format -// - -#define mul64hilo(_hi,_lo,_mt1,_mt2) \ - __asm \ - { \ - mulhwu _hi, _mt1, _mt2; \ - mullw _lo, _mt1, _mt2 \ - } \ - - -#define imul64hilo(_hi,_lo,_mt1,_mt2) \ - __asm \ - { \ - mulhw _hi, _mt1, _mt2; \ - mullw _lo, _mt1, _mt2 \ - } \ - - -#define add64hilo(_hi,_lo,_hisub,_losub) \ - __asm \ - { \ - addc _lo, _losub, _lo; \ - adde _hi, _hisub, _hi \ - } \ - - -#define sub64hilo(_hi,_lo,_hisub,_losub) \ - __asm \ - { \ - subfc _lo, _losub, _lo; \ - subfe _hi, _hisub, _hi \ - } \ - -#define carry_check( q, r, c, d ) \ - if ( r < c ) \ - { \ - --q; \ - r += d; \ - if ( r >= d ) \ - { \ - if ( r < c ) \ - { \ - --q; \ - r += d; \ - } \ - } \ - } - -// The PPC mac doesnt' have intrinsics like CW -#ifdef IS_MAC -static U32 __cntlzw(U32 in) -{ - U32 ret; - asm ("cntlzw %0, %1\n": "=r" (ret): "r" (in)); - return ret; -} -#endif - -static inline U32 div64with16( U32 nlo, U32 nhi, U32 d ) -{ - U32 dlo, dhi; - U32 rlo, rhi; - U32 qhi, qlo; - U32 carry; - - dhi = d >> 16; - dlo = d & 0xffff; - - qhi = nhi / dhi; - rhi = nhi % dhi; - - carry = qhi * dlo; - - rhi = ( rhi << 16 ) | ( nlo >> 16 ); - - carry_check( qhi, rhi, carry, d ); - rhi -= carry; - - qlo = rhi / dhi; - rlo = rhi % dhi; - carry = qlo * dlo; - - qhi <<= 16; - - rlo = ( rlo << 16 ) | ( nlo & 0xffff ); - carry_check( qlo, rlo, carry, d ); - -// rlo -= carry; - - return( qhi | qlo ); -} - -static U32 inline mult64anddiv( register U32 a, register U32 b,U32 d ) -{ -/* register U32 hi, lo; - register U32 mt1, mt2, d; - - mt1=m1; - mt2=m2; - d=dv; - - mul64hilo( hi, lo, mt1, mt2 ); - - return( div64(hi,lo,d) ); -*/ - U32 lz; - register U32 nhi=0, nlo=0; - - mul64hilo( nhi, nlo, a, b ); - - if ( ( d & ( d - 1 ) ) == 0 ) - { - lz = (U32) __cntlzw( d ); - - // Shift for powers of 2. - return( ( nhi << ( lz + 1 ) ) | ( nlo >> ( 31 - lz ) ) ); - } - - if ( nhi == 0 ) - { - return( nlo / d ); - } - - lz = (U32) __cntlzw( d ); - - d <<= lz; - nhi = ( nhi << lz ) + ( nlo >> ( 32 - lz ) ); - nlo <<= lz; - - return( div64with16( nlo, nhi, d ) ); - -} - -static U32 inline mult64andshift( U32 m1,U32 m2,U32 shift ) -{ - register U32 hi, lo; - register U32 mt1, mt2; - - mt1=m1; - mt2=m2; - - mul64hilo( hi, lo, mt1, mt2 ); - - return( ( hi << (32 - shift ) ) + ( lo >> shift ) ); -} - -static U32 inline mult64addsubandshift( U32 m1, U32 m2, U32 av, U32 sv, U32 shift ) -{ - register U32 hi=0, lo=0; - register U32 mt1, mt2; - register U32 addv; - register U32 subv; - register U32 zero = 0; - - mt1=m1; - mt2=m2; - addv=av; - subv=sv; - - mul64hilo(hi,lo,mt1,mt2); - add64hilo( hi, lo, zero, addv ); - sub64hilo( hi, lo, zero, subv ); - - return( ( hi << (32 - shift ) ) + ( lo >> shift ) ); -} - -static U32 __inline shift64addsubanddiv( U32 val, U32 shift,U32 av, U32 sv, U32 divv) -{ - register U32 hi, lo; - register U32 addv; - register U32 subv; - register U32 d; - register U32 zero = 0; - U32 lz; - - addv=av; - subv=sv; - d=divv; - - hi = val >> ( 32 - shift ); - lo = val << shift; - add64hilo( hi, lo, zero, addv ); - sub64hilo( hi, lo, zero, subv ); - - if ( hi & 0x80000000 ) - { - register U32 ihi = hi; - register U32 ilo = lo; - hi = lo = 0; - sub64hilo( hi, lo, ihi, ilo ); - - if ( ( d & ( d - 1 ) ) == 0 ) - { - lz = (U32) __cntlzw( d ); - - // Shift for powers of 2. - return( (U32) -(S32) ( ( hi << ( lz + 1 ) ) | ( lo >> ( 31 - lz ) ) ) ); - } - - if ( hi == 0 ) - { - return( (U32) -(S32) ( lo / d ) ); - } - - return( (U32) -(S32) div64with16( lo,hi,d ) ); - } - - if ( ( d & ( d - 1 ) ) == 0 ) - { - lz = (U32) __cntlzw( d ); - - // Shift for powers of 2. - return( ( hi << ( lz + 1 ) ) | ( lo >> ( 31 - lz ) ) ); - } - - if ( hi == 0 ) - { - return( lo / d ); - } - - return( div64with16( lo,hi,d ) ); -} - -#define WRITE_MONO_SAMPLE( dest, fOut ) \ -{ \ - if (fOut > 32767.0F) STORE_LE_SWAP16( dest, 32767 ); \ - else if (fOut < -32768.0F) STORE_LE_SWAP16( dest, -32768 ); \ - else STORE_LE_SWAP16( dest, (S16) fOut ); \ - ++dest; \ -} - -#endif - -#else - -#if ( defined(IS_X86) && defined(IS_WIN32API) ) || defined(IS_LINUX) || defined(__RADSEKRIT2__) - -// -// Macros to aid in writing to build buffers -// - -#define WRITE_MONO_SAMPLE( dest, fOut ) \ -{ \ - if (fOut > 32767.0F) *dest++ = 32767; \ - else if (fOut < -32768.0F) *dest++ = -32768; \ - else *dest++ = (S16) fOut; \ -} - -static U32 __inline mult64addsubandshift( U32 mt1, U32 mt2, U32 addv, U32 subv, U32 shift ) -{ - U32 retv; - -#ifdef __GNUC__ - unsigned long long value; - value = (unsigned long long)mt1 * mt2; - value += addv; - value -= subv; - value = (signed long long )value >> (signed long long )shift; - retv = (U32)value; -#else -#ifdef IS_WIN64 - U64 value; - value = (U64) mt1 * mt2; - value += addv; - value -= subv; - value = (S64) value >> (S64) shift; - retv = (U32) value; -#else - __asm - { - mov eax,[mt1] - mov ecx,[mt2] - mul ecx - add eax,[addv] - adc edx,0 - sub eax,[subv] - sbb edx,0 - mov ecx,[shift] - shrd eax,edx,cl - mov [retv], eax - } -#endif -#endif - return( retv ); -} - -static U32 __inline mult64anddiv(U32 a,U32 b, U32 c) -{ - U32 retv; - -#ifdef __GNUC__ - unsigned long long value; - value = (unsigned long long)a * b; - value /= c; - retv = (U32)value; -#else -#ifdef IS_WIN64 - U64 value; - value = (U64) a * b; - value /= c; - retv = (U32) value; -#else - __asm - { - mov eax,[a] - mov ecx,[b] - mul ecx - mov ecx,[c] - div ecx - mov [retv], eax - } -#endif -#endif - return( retv ); -} - -static U32 __inline shift64addsubanddiv( U32 val, U32 shift,U32 addv, U32 subv, U32 divv) -{ - U32 retv; -#ifdef __GNUC__ - unsigned long long value; - value = (unsigned long long)val; - value <<= shift; - value += addv; - value -= subv; - value = (signed long long ) value / (signed long long ) divv; - retv = (U32)value; -#else -#ifdef IS_WIN64 - U64 value; - value = (U64) val; - value <<= shift; - value += addv; - value -= subv; - value = (S64) value / (S64) divv; - retv = (U32) value; -#else - __asm - { - xor edx, edx - mov eax, [val] - mov ecx, [shift] - shld edx, eax, cl - shl eax, cl - add eax, [addv] - adc edx, 0 - sub eax, [subv] - sbb edx, 0 - mov ecx, [divv] - idiv ecx - mov [retv], eax - } -#endif -#endif - return( retv ); -} - -#else - -#ifdef __WATCOMC__ - -#else - -#if defined( IS_XENON ) - -#define toU64(v) ((U64)((U32)(v))) -#define toS64(v) ((S64)((S32)(v))) - -#define mult64anddiv(mt1,mt2,d) ((U32)((toU64(mt1)*toU64(mt2))/toU64(d))) - -#define mult64addsubandshift(mt1,mt2,addv,subv,d) ((U32)((((S64)((toU64(mt1)*toU64(mt2))+toU64(addv)))-toS64(subv))>>toS64(d))) - -#define shift64addsubanddiv(val,shift,addv,subv,divv) ((U32)(((S64)((toU64(val)< 32767.0F) STORE_LE_SWAP16( dest, 32767 ); \ - else if (fOut < -32768.0F) STORE_LE_SWAP16( dest, -32768 ); \ - else STORE_LE_SWAP16( dest, (S16) fOut ); \ - ++dest; \ -} - - -#else - -#if defined( IS_PSP ) || defined(IS_3DS) || defined(IS_PSP2) || defined(__RADANDROID__) - - -#define toU64(v) ((U64)((U32)(v))) -#define toS64(v) ((S64)((S32)(v))) - -#define mult64anddiv(mt1,mt2,d) ((U32)((toU64(mt1)*toU64(mt2))/toU64(d))) - -#define mult64addsubandshift(mt1,mt2,addv,subv,d) ((U32)((((S64)((toU64(mt1)*toU64(mt2))+toU64(addv)))-toS64(subv))>>toS64(d))) - -#define shift64addsubanddiv(val,shift,addv,subv,divv) ((U32)(((S64)((toU64(val)< 32767.0F) *dest++ = 32767; \ - else if (fOut < -32768.0F) *dest++ = -32768; \ - else *dest++ = (S16) fOut; \ -} - -#elif defined(IS_WIIU) - -#define toU64(v) ((U64)((U32)(v))) -#define toS64(v) ((S64)((S32)(v))) - -#define mult64anddiv(mt1,mt2,d) ((U32)((toU64(mt1)*toU64(mt2))/toU64(d))) - -#define mult64addsubandshift(mt1,mt2,addv,subv,d) ((U32)((((S64)((toU64(mt1)*toU64(mt2))+toU64(addv)))-toS64(subv))>>toS64(d))) - -#define shift64addsubanddiv(val,shift,addv,subv,divv) ((U32)(((S64)((toU64(val)< 32767.0F) STORE_LE_SWAP16( dest, 32767 ); \ - else if (fOut < -32768.0F) STORE_LE_SWAP16( dest, -32768 ); \ - else STORE_LE_SWAP16( dest, (S16) fOut ); \ - ++dest; \ -} - - - -#elif defined( IS_PS3 ) && !defined( IS_SPU ) - -#define toU64(v) ((U64)((U32)(v))) -#define toS64(v) ((S64)((S32)(v))) - -#define mult64anddiv(mt1,mt2,d) ((U32)((toU64(mt1)*toU64(mt2))/toU64(d))) - -#define mult64addsubandshift(mt1,mt2,addv,subv,d) ((U32)((((S64)((toU64(mt1)*toU64(mt2))+toU64(addv)))-toS64(subv))>>toS64(d))) - -#define shift64addsubanddiv(val,shift,addv,subv,divv) ((U32)(((S64)((toU64(val)< 32767.0F) *dest = (S16)(U16)0xff7f; \ - else if (fOut < -32768.0F) *dest = (S16)(U16)0x0080; \ - else STORE_LE_SWAP16( dest, (S16) fOut ) \ - ++dest; \ -} - -#define toU64(v) ((U64)((U32)(v))) -#define toS64(v) ((S64)((S32)(v))) - -#define mult64anddiv(mt1,mt2,d) ((U32)((toU64(mt1)*toU64(mt2))/toU64(d))) - -#define mult64addsubandshift(mt1,mt2,addv,subv,d) ((U32)((((S64)((toU64(mt1)*toU64(mt2))+toU64(addv)))-toS64(subv))>>toS64(d))) - -#define shift64addsubanddiv(val,shift,addv,subv,divv) ((U32)(((S64)((toU64(val)< - - static int stacksizehas( int v ) - { - vector signed int val; - __asm__("or %0,$1,$1" : "=r"(val) ); - - if ( val[1] < ( v + 2048 ) ) { MSSBreakPoint(); } - return v; - } - #define spu_alloc(bytes) (void*)alloca( stacksizehas( ( ( bytes ) + 15 ) & ~15 ) ) - #else - #include - #define spu_alloc(bytes) (void*)alloca( ( ( bytes ) + 15 ) & ~15 ) - #endif - -#endif - -#else - -#define SPU_NAME( flt, name ) static void AILCALL name -#define addstackmark() - -#endif - -// -// low-level utility memory file routines -// - -typedef struct _MEMDUMP -{ - void* buffer[1024]; // up to 64 MB - U8* current; - U32 size; - U32 totalsize; - U32 curbufnum; - U32 lastbufnum; - U32 curpos; - S32 error; - S32 expandable; - U32 eachbuf; - U32 firstbuf; -} MEMDUMP; - -// This typedef occurs in mss.h as well. -//typedef struct _MEMDUMP* HMEMDUMP; - -DXDEC HMEMDUMP AILCALL AIL_mem_open(void* addr,U32 size); - -DXDEC HMEMDUMP AILCALL AIL_mem_create(void); -DXDEC HMEMDUMP AILCALL AIL_mem_create_from_existing(void* addr, U32 size); // do not delete pointer passed in - -DXDEC S32 AILCALL AIL_mem_close(HMEMDUMP m, void** buf, U32* size); - -DXDEC U32 -#if defined(IS_WIN32API) -__cdecl -#endif -AIL_mem_printf(HMEMDUMP m, char const* fmt, ...); - -DXDEC U32 AILCALL AIL_mem_printc(HMEMDUMP m, char c); - -DXDEC U32 AILCALL AIL_mem_prints(HMEMDUMP m, char const* s); - -DXDEC U32 AILCALL AIL_mem_write(HMEMDUMP m, void const* s, U32 bytes); - -DXDEC U32 AILCALL AIL_mem_read(HMEMDUMP m, void* s, U32 bytes); - -DXDEC U32 AILCALL AIL_mem_seek(HMEMDUMP m, U32 pos); - -DXDEC U32 AILCALL AIL_mem_size(HMEMDUMP m); - -DXDEC U32 AILCALL AIL_mem_pos(HMEMDUMP m); - -DXDEC S32 AILCALL AIL_mem_error(HMEMDUMP m); - - - -#define DIG_PROCESS_BUFFER_SIZE 2048 - -extern U8 *ASI_mem_src_ptr; -extern S32 ASI_mem_src_len; -extern S32 ASI_mem_src_pos; - - -extern S32 AILCALLBACK ASI_mem_stream_CB(UINTa user, //) - void *dest, - S32 bytes_requested, - S32 offset); - -#if 1 - -#if 0 //used to be a IS_LINUX - -#else - -DXDEC S32 AILCALL AIL_stricmp(const char *s1, const char *s2); -DXDEC S32 AILCALL AIL_strnicmp( const char *s1, const char *s2, U32 maxlen); - -#if defined(IS_MAC) || defined(IS_LINUX) || defined(IS_3DS) || defined(IS_IPHONE) || defined(IS_PSP2) || defined(IS_WIIU) || defined(__RADSEKRIT2__) || defined(__RADANDROID__) - -#ifdef IS_PSP2 -#ifdef __cplusplus -} -#endif -#endif - -#include -#include // for abs(). - -#ifdef IS_PSP2 -#ifdef __cplusplus -extern "C" { -#endif -#endif - - -#define AIL_memcpy memcpy -#define AIL_memmove memmove -#define AIL_strcpy strcpy -#define AIL_strcmp strcmp -#define AIL_strlen strlen -#define AIL_strcat strcat -#define AIL_memset memset -#define AIL_ptr_add(ptr,off) ((void*)(((U8*)(ptr))+(off))) -#define AIL_ptr_dif(p1,p2) ((SINTa)((SINTa) p1) - ((SINTa) p2)) -#define AIL_ptr_alloc_clone(x) ((void*)x) -#define AIL_ptr_free_clone(x) - -#ifdef __cplusplus -} - template inline T AILptradd( T ptr, U32 off ) { return( T(AIL_ptr_add( ptr, off )) ); } - #define AIL_ptr_inc_clone(x,y) x=AILptradd(x,y) -extern "C" { -#endif - -#define AIL_ptr_fixup_clone(x) -#define AIL_ptr_lt(x,y) (((UINTa)x) < ((UINTa)y)) -#define AIL_ptr_ge(x,y) (((UINTa)x) >= ((UINTa)y)) -#define AIL_ptr_eq(x,y) (((UINTa)x) == ((UINTa)y)) -#define AIL_ptr_ne(x,y) (((UINTa)x) != ((UINTa)y)) -#define AIL_ptr_lin_addr(x) ((UINTa)(x)) - -#define AIL_abs abs -#define AIL_memcmp memcmp - -#else // not mac or linux - -#ifdef IS_WIN32API - -#define AIL_abs abs - -#ifdef IS_XENON - -typedef void *PVOID; -typedef int INT; -typedef unsigned long ULONG_PTR; -typedef ULONG_PTR SIZE_T; - -PVOID -__stdcall -XMemSet( - PVOID pDest, - INT c, - size_t count - ); - -PVOID -__stdcall -XMemCpy( - PVOID pDest, - const void* pSrc, - size_t count - ); - -char * __cdecl strcpy( char *_Dest, const char * _Source); - -#define AIL_memcpy XMemCpy -#define AIL_memset XMemSet - -#else - -#if defined(_WIN32) || defined(_WIN64) || defined(WIN32) || defined(__NT__) || defined(__WIN32__) - #include - void * __cdecl memcpy(void *, const void *, size_t); - void * __cdecl memset(void *, int, size_t); - char * __cdecl strcpy(char *, const char *); -#endif - -#define AIL_memcpy memcpy -#define AIL_memset memset - -#endif - -#if defined(IS_XENON) -#include -#endif - -#define AIL_memmove memmove - -#define AIL_memcmp memcmp - -#define AIL_strcpy strcpy - -#define AIL_strcmp strcmp - -#define AIL_strlen strlen - -#define AIL_strcat strcat - -#define AIL_ptr_add(ptr,off) ((void*)(((U8*)(ptr))+(off))) - -#define AIL_ptr_dif(p1,p2) ((SINTa)((SINTa) p1) - ((SINTa) p2)) - -#define AIL_ptr_alloc_clone(x) ((void*)x) - -#define AIL_ptr_free_clone(x) - -#ifdef __cplusplus -} - template inline T AILptradd( T ptr, U32 off ) { return( T(AIL_ptr_add( ptr, off )) ); } - #define AIL_ptr_inc_clone(x,y) x=AILptradd(x,y) -extern "C" { -#endif - -#define AIL_ptr_fixup_clone(x) - -#define AIL_ptr_lt(x,y) (((UINTa)x) < ((UINTa)y)) - -#define AIL_ptr_ge(x,y) (((UINTa)x) >= ((UINTa)y)) - -#define AIL_ptr_eq(x,y) (((UINTa)x) == ((UINTa)y)) - -#define AIL_ptr_ne(x,y) (((UINTa)x) != ((UINTa)y)) - -#define AIL_ptr_lin_addr(x) ((UINTa)(x)) - -#else - -#if defined(IS_PSP) - -#define AIL_memmove memmove - -#define AIL_memcpy memcpy - -#define AIL_memset memset - -#define AIL_memcmp memcmp - -#define AIL_strcpy strcpy - -#define AIL_strcmp strcmp - -#define AIL_stricmp strcasecmp - -#define AIL_strnicmp strncasecmp - -#define AIL_strlen strlen - -#define AIL_strcat strcat - -#define AIL_ptr_add(ptr,off) ((void*)(((U8*)(ptr))+(off))) - -#define AIL_ptr_dif(p1,p2) ((SINTa)((SINTa) p1) - ((SINTa) p2)) - -#define AIL_ptr_alloc_clone(x) ((void*)x) - -#define AIL_ptr_free_clone(x) - -#ifdef __cplusplus -} - template inline T AILptradd( T ptr, U32 off ) { return( T(AIL_ptr_add( ptr, off )) ); } - #define AIL_ptr_inc_clone(x,y) x=AILptradd(x,y) -extern "C" { -#endif - -#define AIL_ptr_fixup_clone(x) - -#define AIL_ptr_lt(x,y) (((UINTa)x) < ((UINTa)y)) - -#define AIL_ptr_ge(x,y) (((UINTa)x) >= ((UINTa)y)) - -#define AIL_ptr_eq(x,y) (((UINTa)x) == ((UINTa)y)) - -#define AIL_ptr_ne(x,y) (((UINTa)x) != ((UINTa)y)) - -#define AIL_ptr_lin_addr(x) ((UINTa)(x)) - -static inline S32 AIL_abs(S32 v) { return( ( v >=0 ) ? v : -v ); } - - -#elif defined(IS_PS3) - -#define AIL_memmove memmove - -#define AIL_memcpy memcpy - -#define AIL_memset memset - -#define AIL_memcmp memcmp - -#define AIL_strcpy strcpy - -#define AIL_strcmp strcmp - -#define AIL_stricmp strcasecmp_ascii - -#define AIL_strnicmp strncasecmp_ascii - -#define AIL_strlen strlen - -#define AIL_strcat strcat - -#define AIL_ptr_add(ptr,off) ((void*)(((U8*)(ptr))+(off))) - -#define AIL_ptr_dif(p1,p2) ((SINTa)((SINTa) p1) - ((SINTa) p2)) - -#define AIL_ptr_alloc_clone(x) ((void*)x) - -#define AIL_ptr_free_clone(x) - -#ifdef __cplusplus -} - template inline T AILptradd( T ptr, U32 off ) { return( T(AIL_ptr_add( ptr, off )) ); } - #define AIL_ptr_inc_clone(x,y) x=AILptradd(x,y) -extern "C" { -#endif - -#define AIL_ptr_fixup_clone(x) - -#define AIL_ptr_lt(x,y) (((UINTa)x) < ((UINTa)y)) - -#define AIL_ptr_ge(x,y) (((UINTa)x) >= ((UINTa)y)) - -#define AIL_ptr_eq(x,y) (((UINTa)x) == ((UINTa)y)) - -#define AIL_ptr_ne(x,y) (((UINTa)x) != ((UINTa)y)) - -#define AIL_ptr_lin_addr(x) ((UINTa)(x)) - -static inline S32 AIL_abs(S32 v) { return( ( v >=0 ) ? v : -v ); } - -#else - -#ifdef IS_WII - -#define AIL_memcpy memcpy - -#define AIL_memmove memmove - -#define AIL_strcpy strcpy - -#define AIL_strcmp strcmp - -#define AIL_strlen strlen - -#define AIL_strcat strcat - -#define AIL_memset memset - -#define AIL_ptr_add(ptr,off) ((void*)(((U8*)(ptr))+(off))) - -#define AIL_ptr_dif(p1,p2) ((SINTa)((SINTa) p1) - ((SINTa) p2)) - -#define AIL_ptr_alloc_clone(x) ((void*)x) - -#define AIL_ptr_free_clone(x) - -#ifdef __cplusplus -} - template inline T AILptradd( T ptr, U32 off ) { return( T(AIL_ptr_add( ptr, off )) ); } - #define AIL_ptr_inc_clone(x,y) x=AILptradd(x,y) -extern "C" { -#endif - -#define AIL_ptr_fixup_clone(x) - -#define AIL_ptr_lt(x,y) (((UINTa)x) < ((UINTa)y)) - -#define AIL_ptr_ge(x,y) (((UINTa)x) >= ((UINTa)y)) - -#define AIL_ptr_eq(x,y) (((UINTa)x) == ((UINTa)y)) - -#define AIL_ptr_ne(x,y) (((UINTa)x) != ((UINTa)y)) - -#define AIL_ptr_lin_addr(x) ((UINTa)(x)) - -#ifndef __cplusplus -int abs( int ); -#endif - -#define AIL_abs abs -#define AIL_memcmp memcmp - -#endif - -#endif - -#endif - -#endif - -#endif - -#endif - -#ifndef AIL_ptr_inc_clone -#define AIL_ptr_inc_clone(x,y) AIL_ptr_inc_clone_ref((void * *)(void*) &(x),y) -#endif -#define AIL_ptr_from_clone(clone,hptr) (AIL_ptr_add(hptr,AIL_ptr_dif(clone,hptr))) - - -#ifdef IS_32 - -#define MSS_do_cb1(type,addr,ds,param1) \ - (addr)(param1) - -#define MSS_do_cb3(type,addr,ds,param1,param2,param3) \ - (addr)(param1,param2,param3) - -#define MSS_do_cb4(type,addr,ds,param1,param2,param3,param4) \ - (addr)(param1,param2,param3,param4) - -#define MSS_do_cb1_with_ret(ret,type,addr,ds,param1) \ - ret = (addr)(param1) - -#define MSS_do_cb3_with_ret(ret,type,addr,ds,param1,param2,param3) \ - ret = (addr)(param1,param2,param3) - -#define MSS_do_cb4_with_ret(ret,type,addr,ds,param1,param2,param3,param4) \ - ret = (addr)(param1,param2,param3,param4) - -#define MSS_do_cb5_with_ret(ret,type,addr,ds,param1,param2,param3,param4,param5) \ - ret = (addr)(param1,param2,param3,param4,param5) - -#endif - -#if (defined(IS_MAC) && defined( IS_X86 )) || defined(IS_LINUX) - - -#define MSS_CB_STACK_ALIGN( name ) \ -void MSS_CALLBACK_ALIGNED_NAME(name)(void)\ -{\ - asm (\ - "mov $16,%%eax\n" \ - "sub $64,%%esp\n" \ - "add %%esp, %%eax\n" \ - "and $0xfffffff0,%%eax\n" \ - "movups 8(%%ebp), %%xmm0\n" \ - "movaps %%xmm0, (%%eax)\n" \ - "movl %%esp, 32(%%eax)\n" \ - "mov %%eax,%%esp\n" \ - "call *%0\n" \ - "movl 32(%%esp), %%esp\n" \ - "add $64,%%esp\n" \ - : : "r" (name) : "eax"); \ -} - -#define MSS_DEF_CB_STACK_ALIGN( name ) DXDEF MSS_CB_STACK_ALIGN( name ) -#define MSS_CB_STACK_ALIGN_DEC( name ) void MSS_CALLBACK_ALIGNED_NAME(name)(void); - -#else - -#define MSS_CB_STACK_ALIGN( name ) -#define MSS_DEF_CB_STACK_ALIGN( name ) -#define MSS_CB_STACK_ALIGN_DEC( name ) - -#endif - -#ifdef IS_XENON - -#define XWAVE_FORMAT_XMA 0x0165 - -typedef MSS_STRUCT XXMASTREAMFORMAT -{ - U32 PsuedoBytesPerSec; // Used by encoder - U32 SampleRate; // Sample rate for the stream. - U32 LoopStart; // Loop start offset (in bits). - U32 LoopEnd; // Loop end offset (in bits). - - // Format for SubframeData: eeee ssss. - // e: Subframe number of loop end point [0,3]. - // s: Number of subframes to skip before decoding and outputting at the loop start point [1,4]. - - U8 SubframeData; // Data for decoding subframes. See above. - U8 Channels; // Number of channels in the stream (1 or 2). - U16 ChannelMask; // Channel assignments for the channels in the stream (same as - // lower 16 bits of dwChannelMask in WAVEFORMATEXTENSIBLE). -} XXMASTREAMFORMAT; - -typedef MSS_STRUCT XXMAWAVEFORMAT -{ - U16 FormatTag; // Audio format type (always WAVE_FORMAT_XMA). - U16 BitsPerSample; // Bit depth (currently required to be 16). - U16 EncodeOptions; // Options for XMA encoder/decoder. - U16 LargestSkip; // Largest skip used in interleaving streams. - U16 NumStreams; // Number of interleaved audio streams. - U8 LoopCount; // Number of loop repetitions (255 == infinite). - U8 Version; // Version of the encoder that generated this. - XXMASTREAMFORMAT XmaStreams[1]; // Format info for each stream (can grow based on wNumStreams). -} XXMAWAVEFORMAT; - -#endif - -extern U32 SS_granularity(HSAMPLE S); - -extern S32 MC_open_output_filter(C8 const *name, //) - HDIGDRIVER driver, - S32 is_matrix_filter); - -extern void AILCALL MSS_mixer_mc_copy ( MSS_BB * build, - S32 n_build_buffers, - void * lpWaveAddr, - S32 hw_format, -#ifdef IS_X86 - S32 use_MMX, -#endif - S32 samples_per_buffer, - S32 physical_channels_per_sample ); - -extern void AILCALL MSS_mixer_adpcm_decode( void * dest, - void const * in, - S32 out_len, - S32 in_len, - S32 input_format, - ADPCMDATA *adpcm_data ); -// -// Prototypes for ADPCM decode routines -// - -extern void ASMLINK DecodeADPCM_STEREO( ASMPARM void *out, - ASMPARM void const *in, - ASMPARM S32 out_len, - ASMPARM S32 in_len, - ASMPARM ADPCMDATA *adpcm_data); - -extern void ASMLINK DecodeADPCM_MONO( ASMPARM void *out, - ASMPARM void const *in, - ASMPARM S32 out_len, - ASMPARM S32 in_len, - ASMPARM ADPCMDATA *adpcm_data); - -extern void ASMLINK DecodeADPCM_MONO_8( ASMPARM void *out, - ASMPARM void const *in, - ASMPARM S32 out_len, - ASMPARM S32 in_len, - ASMPARM ADPCMDATA *adpcm_data); - - -// -// .VOC file header -// - -typedef MSS_STRUCT -{ - S8 ID_string[20]; - - U16 data_offset; - U16 version; - U16 ID_code; -} -VOC; - -typedef MSS_STRUCT _ADPCMOUT { - U32 riffmark; - U32 rifflen; - U32 wavemark; - U32 fmtmark; - U32 fmtlen; - U16 fmttag; - U16 channels; - U32 sampersec; - U32 avepersec; - U16 blockalign; - U16 bitspersam; - S16 extra; - S16 samples_per_block; - U32 factmark; - U32 factlen; - U32 samples; - U32 datamark; - U32 datalen; -} ADPCMOUT; - -typedef MSS_STRUCT _WAVEOUT { - U32 riffmark; - U32 rifflen; - U32 wavemark; - U32 fmtmark; - U32 fmtlen; - U16 fmttag; - U16 channels; - U32 sampersec; - U32 avepersec; - U16 blockalign; - U16 bitspersam; - U32 datamark; - U32 datalen; -} WAVEOUT; - -typedef MSS_STRUCT _WAVEOUTEXT { - U32 riffmark; - U32 rifflen; - U32 wavemark; - U32 fmtmark; - U32 fmtlen; - U16 fmttag; - U16 channels; - U32 sampersec; - U32 avepersec; - U16 blockalign; - U16 bitspersam; - U16 size; - U16 sampbits; - U32 chanmask; - U8 subfmt[16]; - U32 datamark; - U32 datalen; -} WAVEOUTEXT; - -F32 evaluate_graph(MSSGRAPHPOINT const* graph, S32 cnt, F32 x); - -// -// platform allocators -// - -void * AILCALLBACK platform_alloc(UINTa size); -void AILCALLBACK platform_free( void * ptr ); - - -// -// Abstracted IO structures. -// - -#ifdef IS_WII -#define MAX_PLATFILE_SPECIFIC_SIZE 512 -#else -#define MAX_PLATFILE_SPECIFIC_SIZE 32 -#endif -typedef struct PLATFORM_FILE -{ - char plat_specific[MAX_PLATFILE_SPECIFIC_SIZE]; // needs to be at the front for wii - U32 offset; // current offset in to our "file" - U32 start_pos; // offset of our "file" from the start of the physical file. - U32 file_length; // length of our "file" - S32 dont_close; // nonzero if we don't own the file handle, so when done, don't close. - U32 raw_length; // length of the entire file that we might be "inside of" -} PLATFORM_FILE; - -typedef struct FNVALUES -{ - char const * filename; - U32 size; - U32 start; -} FNVALUES; - -typedef struct FHVALUES -{ - S32 hand; - S32 length; - S32 pos; -} FHVALUES; - -// -// Functions implemented per platform. -// -extern int Platform_OpenFile(struct PLATFORM_FILE* i_File, char const * fn); -extern void Platform_SeekFromBeginning(PLATFORM_FILE* i_File, S32 i_Offset); -extern U32 Platform_ReadFile(PLATFORM_FILE* i_File, void* o_Buffer, U32 i_ReadBytes); -extern void Platform_CloseFile(PLATFORM_FILE* i_File); - -DXDEC void AILCALL AIL_set_event_settings(void* i_Settings); - -// Auditioner Declarations -//----------------------------------------------------------------------------- -S32 Audition_Status(); -S32 Audition_Pump(); -void* Audition_OpenBank(char const* i_FileName); -S32 Audition_OpenComplete(void* i_Bank); -void Audition_CloseBank(void* i_Bank); - -void Audition_Suppress(S32 i_IsSuppressed); -void Audition_FrameStart(); -void Audition_FrameEnd(); -void Audition_DefragStart(); -void Audition_SetBlend(U64 i_EventId, char const* i_Name); -void Audition_SetPersist(U64 i_EventId, char const* i_Name, char const* i_Preset); -void Audition_Event(char const* i_EventName, U64 i_EventId, U64 i_Filter, S32 i_Exists, void* i_InitBlock, S32 i_InitBlockLen); -void Audition_Sound(U64 i_EventId, U64 i_SoundId, char const* i_Sound, char const* i_Label, float i_Volume, S32 i_Delay, float i_Pitch); -void Audition_SoundComplete(U64 i_SoundId); -void Audition_SoundPlaying(U64 i_SoundId); -void Audition_SoundFlags(U64 i_SoundId, S32 i_Flags); -void Audition_SoundLimited(U64 i_SoundId, char const* i_Label); -void Audition_SoundEvicted(U64 i_SoundId, U64 i_ForSound, S32 i_Reason); -void Audition_Control(U64 i_EventId, char const* i_Labels, U8 i_ControlType, U64 i_Filter); -void Audition_SoundBus(U64 i_SoundId, U8 i_BusIndex); - -void Audition_Error(U64 i_Id, char const* i_Details); - -void Audition_AsyncQueued(U64 i_RelevantId, S32 i_AsyncId, char const* i_Asset); -void Audition_AsyncLoad(S32 i_AsyncId, S32 i_ExpectedData); -void Audition_AsyncError(S32 i_AsyncId); -void Audition_AsyncComplete(S32 i_AsyncId, S32 i_DataLoaded); -void Audition_AsyncCancel(S32 i_AsyncId); -void Audition_ListenerPosition(float x, float y, float z); -void Audition_SoundPosition(U64 i_Sound, float x, float y, float z); -void Audition_SendCPU(HDIGDRIVER i_Driver); -void Audition_UpdateDataCount(S32 i_CurrentDataLoaded); -void Audition_SendCount(S32 i_SoundCount); -void Audition_HandleSystemLoad(S32 i_Avail, S32 i_Total); -void Audition_VarState(char const* i_Var, U64 i_SoundId, S32 i_Int, void* i_4ByteValue); -void Audition_RampState(char const* i_Ramp, U64 i_SoundId, S32 i_Type, float i_Current); -void Audition_SoundState(U64 i_SoundId, float i_FinalVol, float i_3DVol, float i_BlendVol, float i_BlendPitch, float i_RampVol, float i_RampWet, float i_RampLp, float i_RampRate); -void Audition_ClearState(); -void Audition_CompletionEvent(U64 i_CompletionEventId, U64 i_ParentSoundId); -void Audition_AddRamp(U64 i_ParentSoundId, S32 i_Type, char const* i_Name, char const* i_LabelQuery, U64 i_EventId); - -#if defined(IS_WIN32API) || defined(IS_WII) - #pragma pack(pop) -#endif -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/Minecraft.Client/Platform/Windows64/Miles/include/tmapi.h b/Minecraft.Client/Platform/Windows64/Miles/include/tmapi.h deleted file mode 100644 index 4ff673be0..000000000 --- a/Minecraft.Client/Platform/Windows64/Miles/include/tmapi.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once -// This is the null header file used to remove Telemetry calls. - -#define TMERR_DISABLED 1 - -#define tmTick(...) -#define tmPause(...) -#define tmEnter(...) -#define tmLeave(...) -#define tmThreadName(...) TMERR_DISABLED -#define tmMutexName(...) TMERR_DISABLED -#define tmTryLock(...) TMERR_DISABLED -#define tmEndTryLock(...) -#define tmSetMutexState(...) -#define tmAlloc(...) -#define tmRealloc(...) -#define tmFree(...) -#define tmPlot(...) -#define tmBlob(...) TMERR_DISABLED -#define tmBlobEx(...) TMERR_DISABLED -#define tmMessage(...) -#define tmEmitAccumulationZones(...) TMERR_DISABLED -#define tmEnterAccumulationZone(...) TMERR_DISABLED -#define tmLeaveAccumulationZone(...) TMERR_DISABLED -#define tmZone(...) -#define tmSetLockState(...) -#define tmLockName(...) -#define tmSendCallStack(...) -#define tmAllocEx(...) - -#define NTELEMETRY 1 - -#define TM_CONTEXT_LITE(val) ((char*)(val)) -#define TM_CONTEXT_FULL(val) ((char*)(val)) - -typedef char* HTELEMETRY; diff --git a/Minecraft.Client/Platform/Windows64/Miles/lib/aud32.lib b/Minecraft.Client/Platform/Windows64/Miles/lib/aud32.lib deleted file mode 100644 index 22381e1832f7323ccf67bb4f180d5a413aac37f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2480 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 uF78Z5#L%wsty8YdUutw7FJaP5wVd?zOf6 diff --git a/Minecraft.Client/Platform/Windows64/Miles/lib/mss32midi.lib b/Minecraft.Client/Platform/Windows64/Miles/lib/mss32midi.lib deleted file mode 100644 index 0c6552613113f4931a42c84439d3b54049fa0ea4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29792 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 diff --git a/Minecraft.Client/Platform/Windows64/Miles/lib/mss64.lib b/Minecraft.Client/Platform/Windows64/Miles/lib/mss64.lib deleted file mode 100644 index fa857a7a39d264fc05f10563618dea7510053857..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94326 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 A#{d8T diff --git a/Minecraft.Client/Platform/Windows64/Miles/lib/redist64/mss64dolby.flt b/Minecraft.Client/Platform/Windows64/Miles/lib/redist64/mss64dolby.flt deleted file mode 100644 index 8ae0cd6360d233c998b93ae70c6239ace56c8cb9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44032 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 bdafC~CV5Tvnu0YYn1BCy{i%WfsT%ly;-MhI diff --git a/Minecraft.Client/Platform/Windows64/Miles/lib/redist64/mss64srs.flt b/Minecraft.Client/Platform/Windows64/Miles/lib/redist64/mss64srs.flt deleted file mode 100644 index a0bf7d007bdcaf3a4fd9a233c97a95581e237d44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65024 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

    ph)K|X? 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 Ie^vtj4c*JDiU0rr diff --git a/Minecraft.Client/Platform/Windows64/Sentient/MinecraftTelemetry.h b/Minecraft.Client/Platform/Windows64/Sentient/MinecraftTelemetry.h deleted file mode 100644 index c5b92a321..000000000 --- a/Minecraft.Client/Platform/Windows64/Sentient/MinecraftTelemetry.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once -#include "SentientTelemetryCommon.h" -#include "TelemetryEnum.h" -#include "SentientStats.h" \ No newline at end of file diff --git a/Minecraft.Client/Platform/Windows64/XML/ATGXmlParser.h b/Minecraft.Client/Platform/Windows64/XML/ATGXmlParser.h deleted file mode 100644 index ab5b6bd48..000000000 --- a/Minecraft.Client/Platform/Windows64/XML/ATGXmlParser.h +++ /dev/null @@ -1,159 +0,0 @@ -// 4J-PB - -// The ATG Framework is a common set of C++ class libraries that is used by the -// samples in the XDK, and was developed by the Advanced Technology Group (ATG). -// The ATG Framework offers a clean and consistent format for the samples. These -// classes define functions used by all the samples. The ATG Framework together -// with the samples demonstrates best practices and innovative techniques for -// Xbox 360. There are many useful sections of code in the samples. You are -// encouraged to incorporate this code into your titles. - -//------------------------------------------------------------------------------------- -// AtgXmlParser.h -// -// XMLParser and SAX interface declaration -// -// Xbox Advanced Technology Group -// Copyright (C) Microsoft Corporation. All rights reserved. -//------------------------------------------------------------------------------------- - -#pragma once -#ifndef ATGXMLPARSER_H -#define ATGXMLPARSER_H - -namespace ATG { - -//----------------------------------------------------------------------------- -// error returns from XMLParse -//----------------------------------------------------------------------------- -#define _ATGFAC 0x61B -#define E_COULD_NOT_OPEN_FILE MAKE_HRESULT(1, _ATGFAC, 0x0001) -#define E_INVALID_XML_SYNTAX MAKE_HRESULT(1, _ATGFAC, 0x0002) - -const uint32_t XML_MAX_ATTRIBUTES_PER_ELEMENT = 32; -const uint32_t XML_MAX_NAME_LENGTH = 128; -const uint32_t XML_READ_BUFFER_SIZE = 2048; -const uint32_t XML_WRITE_BUFFER_SIZE = 2048; - -// No tag can be longer than XML_WRITE_BUFFER_SIZE - an error will be returned -// if it is - -//------------------------------------------------------------------------------------- -struct XMLAttribute { - wchar_t* strName; - uint32_t NameLen; - wchar_t* strValue; - uint32_t ValueLen; -}; - -//------------------------------------------------------------------------------------- -class ISAXCallback { - friend class XMLParser; - -public: - ISAXCallback() {}; - virtual ~ISAXCallback() {}; - - virtual int32_t StartDocument() = 0; - virtual int32_t EndDocument() = 0; - - virtual int32_t ElementBegin(const wchar_t* strName, uint32_t NameLen, - const XMLAttribute* pAttributes, - uint32_t NumAttributes) = 0; - virtual int32_t ElementContent(const wchar_t* strData, uint32_t DataLen, - bool More) = 0; - virtual int32_t ElementEnd(const wchar_t* strName, uint32_t NameLen) = 0; - - virtual int32_t CDATABegin() = 0; - virtual int32_t CDATAData(const wchar_t* strCDATA, uint32_t CDATALen, - bool bMore) = 0; - virtual int32_t CDATAEnd() = 0; - - virtual void Error(int32_t hError, const char* strMessage) = 0; - - virtual void SetParseProgress(uint32_t dwProgress) {} - - const char* GetFilename() { return m_strFilename; } - uint32_t GetLineNumber() { return m_LineNum; } - uint32_t GetLinePosition() { return m_LinePos; } - -private: - const char* m_strFilename; - uint32_t m_LineNum; - uint32_t m_LinePos; -}; - -//------------------------------------------------------------------------------------- -class XMLParser { -public: - XMLParser(); - ~XMLParser(); - - // Register an interface inheiriting from ISAXCallback - void RegisterSAXCallbackInterface(ISAXCallback* pISAXCallback); - - // Get the registered interface - ISAXCallback* GetSAXCallbackInterface(); - - // ParseXMLFile returns one of the following: - // E_COULD_NOT_OPEN_FILE - couldn't open the file - // E_INVALID_XML_SYNTAX - bad XML syntax according to this parser - // E_NOINTERFACE - RegisterSAXCallbackInterface not called - // E_ABORT - callback returned a fail code - // S_OK - file parsed and completed - - int32_t ParseXMLFile(const char* strFilename); - - // Parses from a buffer- if you pass a wchar_t buffer (and cast it), it - // will - // correctly detect it and use unicode instead. Return codes are - // the same as for ParseXMLFile - - int32_t ParseXMLBuffer(const char* strBuffer, uint32_t uBufferSize); - -private: - int32_t MainParseLoop(); - - int32_t AdvanceCharacter(bool bOkToFail = false); - void SkipNextAdvance(); - - int32_t ConsumeSpace(); - int32_t ConvertEscape(); - int32_t AdvanceElement(); - int32_t AdvanceName(); - int32_t AdvanceAttrVal(); - int32_t AdvanceCDATA(); - int32_t AdvanceComment(); - - void FillBuffer(); - -#ifdef _Printf_format_string_ // VC++ 2008 and later support this annotation - void Error(int32_t hRet, - _In_z_ _Printf_format_string_ const char* strFormat, ...); -#else - void Error(int32_t hRet, const char* strFormat, ...); -#endif - - ISAXCallback* m_pISAXCallback; - - void* m_hFile; - const char* m_pInXMLBuffer; - uint32_t m_uInXMLBufferCharsLeft; - uint32_t m_dwCharsTotal; - uint32_t m_dwCharsConsumed; - - uint8_t m_pReadBuf[XML_READ_BUFFER_SIZE + 2]; // room for a trailing NULL - wchar_t m_pWriteBuf[XML_WRITE_BUFFER_SIZE]; - - uint8_t* m_pReadPtr; - wchar_t* m_pWritePtr; // write pointer within m_pBuf - - bool m_bUnicode; // true = 16-bits, false = 8-bits - bool m_bReverseBytes; // true = reverse bytes, false = don't reverse - - bool m_bSkipNextAdvance; - wchar_t m_Ch; // Current character being parsed -}; - -} // namespace ATG - -#endif diff --git a/Minecraft.Client/Platform/Windows64/Xbox_BuildVer.h b/Minecraft.Client/Platform/Windows64/Xbox_BuildVer.h deleted file mode 100644 index ed6c609a7..000000000 --- a/Minecraft.Client/Platform/Windows64/Xbox_BuildVer.h +++ /dev/null @@ -1,60 +0,0 @@ - -#pragma once - -#define VER_PRODUCTMAJORVERSION 0 -#define VER_PRODUCTMINORVERSION 0 -#define VER_PRODUCTBUILD 170 -#define VER_PRODUCTBUILD_QFE 0 - -#define VER_FILEVERSION_STRING "1.1" -#define VER_PRODUCTVERSION_STRING VER_FILEVERSION_STRING -#define VER_FILEVERSION_STRING_W L"1.1" -#define VER_PRODUCTVERSION_STRING_W VER_FILEVERSION_STRING_W - -#define VER_FILEBETA_STR "" -#undef VER_FILEVERSION -#define VER_FILEVERSION \ - VER_PRODUCTMAJORVERSION, VER_PRODUCTMINORVERSION, VER_PRODUCTBUILD, \ - VER_PRODUCTBUILD_QFE -#define VER_PRODUCTVERSION \ - VER_PRODUCTMAJORVERSION, VER_PRODUCTMINORVERSION, VER_PRODUCTBUILD, \ - VER_PRODUCTBUILD_QFE - -#if (VER_PRODUCTBUILD < 10) -#define VER_FILEBPAD "000" -#define VER_FILEBPAD_W L"000" -#elif (VER_PRODUCTBUILD < 100) -#define VER_FILEBPAD "00" -#define VER_FILEBPAD_W L"00" -#elif (VER_PRODUCTBUILD < 1000) -#define VER_FILEBPAD "0" -#define VER_FILEBPAD_W L"0" -#else -#define VER_FILEBPAD -#define VER_FILEBPAD_W -#endif - -#define VER_WIDE_PREFIX(x) L##x - -#define VER_FILEVERSION_STR2(x, y) \ - VER_FILEVERSION_STRING "." VER_FILEBPAD #x "." #y -#define VER_FILEVERSION_STR2_W(x, y) \ - VER_FILEVERSION_STRING_W L"." VER_FILEBPAD_W VER_WIDE_PREFIX( \ - #x) L"." VER_WIDE_PREFIX(#y) -#define VER_FILEVERSION_STR1(x, y) VER_FILEVERSION_STR2(x, y) -#define VER_FILEVERSION_STR1_W(x, y) VER_FILEVERSION_STR2_W(x, y) - -#undef VER_FILEVERSION_STR -#define VER_FILEVERSION_STR \ - VER_FILEVERSION_STR1(VER_PRODUCTBUILD, VER_PRODUCTBUILD_QFE) -#define VER_PRODUCTVERSION_STR \ - VER_FILEVERSION_STR1(VER_PRODUCTBUILD, VER_PRODUCTBUILD_QFE) - -#define VER_FILEVERSION_STR_W \ - VER_FILEVERSION_STR1_W(VER_PRODUCTBUILD, VER_PRODUCTBUILD_QFE) -#define VER_PRODUCTVERSION_STR_W \ - VER_FILEVERSION_STR1_W(VER_PRODUCTBUILD, VER_PRODUCTBUILD_QFE) - -#if (VER_PRODUCTBUILD_QFE >= 256) -#error "QFE number cannot exceed 255" -#endif diff --git a/Minecraft.Client/Platform/stdafx.h b/Minecraft.Client/Platform/stdafx.h deleted file mode 100644 index ab8d08080..000000000 --- a/Minecraft.Client/Platform/stdafx.h +++ /dev/null @@ -1,153 +0,0 @@ -// stdafx.h : include file for standard system include files, -// or project specific include files that are used frequently, but -// are changed infrequently -// - -#pragma once - -// #include -// #include - -#define __STR2__(x) #x -#define __STR1__(x) __STR2__(x) -#define __LOC__ __FILE__ "(" __STR1__(__LINE__) ") : 4J Warning Msg: " - -// use - #pragma message(__LOC__"Need to do something here") - -#include -#include -#include -#include -#include - -#ifdef __linux__ -#include "../Platform/Linux/Stubs/LinuxStubs.h" -#endif - -#ifdef _WINDOWS64 -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -#include -#include -#include -#include -#include -using namespace DirectX; - -#define HRESULT_SUCCEEDED(hr) (((int32_t)(hr)) >= 0) -#endif - -#include "../../Minecraft.World/Platform/x64headers/extraX64.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "../../Minecraft.World/Util/Definitions.h" -#include "../../Minecraft.World/Util/Class.h" -#include "../../Minecraft.World/Util/ArrayWithLength.h" -#include "../../Minecraft.World/Util/SharedConstants.h" -#include "../../Minecraft.World/Util/Random.h" -#include "../../Minecraft.World/IO/Streams/Compression.h" -#include "../../Minecraft.World/Util/PerformanceTimer.h" - -#ifdef _WINDOWS64 -#include "../Platform/Windows64/4JLibs/inc/4J_Input.h" -#include "../Platform/Windows64/4JLibs/inc/4J_Profile.h" -#include "../Platform/Windows64/4JLibs/inc/4J_Render.h" -#include "../Platform/Windows64/4JLibs/inc/4J_Storage.h" -#else -#include "4J_Input.h" -#include "4J_Profile.h" -#include "4J_Render.h" -#include "4J_Storage.h" -#endif - -#include "../Textures/Textures.h" -#include "../UI/Font.h" -#include "../ClientConstants.h" -#include "../UI/Gui.h" -#include "../UI/Screen.h" -#include "../UI/ScreenSizeCalculator.h" -#include "../Minecraft.h" -#include "../Utils/MemoryTracker.h" -#include "stubs.h" -#include "../Textures/BufferedImage.h" - -#include "../Platform/Common/Network/GameNetworkManager.h" - -#include "../Platform/Common/UI/UIEnums.h" -#include "../Platform/Common/UI/UIStructs.h" -#include "../Platform/Common/App_Defines.h" -#include "../Platform/Common/App_enums.h" -#include "../Platform/Common/Tutorial/TutorialEnum.h" -#include "../Platform/Common/App_structs.h" - -#include "../Platform/Common/Consoles_App.h" -#include "../Platform/Common/Minecraft_Macros.h" -#include "../Platform/Common/BuildVer.h" - -// This is generated at build time via scripts/pack_loc.py -#include "strings.h" - -#ifdef _WINDOWS64 -#include "../Platform/Windows64/Sentient/MinecraftTelemetry.h" -#include "../Platform/Windows64/Windows64_App.h" -#include "../Platform/Windows64/Sentient/DynamicConfigurations.h" -#include "../Platform/Windows64/Sentient/SentientTelemetryCommon.h" -#include "../Platform/Windows64/GameConfig/Minecraft.spa.h" -#include "../Platform/Windows64/XML/ATGXmlParser.h" -#include "../Platform/Windows64/Social/SocialManager.h" -#include "../Platform/Common/Audio/SoundEngine.h" -#include "../Platform/Windows64/Iggy/include/iggy.h" -#include "../Platform/Windows64/Iggy/gdraw/gdraw_d3d11.h" -#include "../Platform/Windows64/Windows64_UIController.h" -#else -// Linux build: keep the Linux runtime/controller path and use the supported -// Linux/Windows64 metadata headers only. -#include "../Platform/Linux/Linux_App.h" -#include "../Platform/Linux/Iggy/include/iggy.h" -#include "../Platform/Linux/Sentient/SentientTelemetryCommon.h" -#include "../Platform/Linux/Sentient/DynamicConfigurations.h" -#include "../Platform/Windows64/GameConfig/Minecraft.spa.h" -#include "../Platform/Common/Audio/SoundEngine.h" -#include "../Platform/Linux/Linux_UIController.h" -#include "../Platform/Linux/Social/SocialManager.h" -#endif - -#include "../Platform/Common/ConsoleGameMode.h" -#include "../Platform/Common/Console_Debug_enum.h" -#include "../Platform/Common/Console_Awards_enum.h" -#include "../Platform/Common/Tutorial/TutorialMode.h" -#include "../Platform/Common/Tutorial/Tutorial.h" -#include "../Platform/Common/Tutorial/FullTutorialMode.h" -#include "../Platform/Common/Trial/TrialMode.h" -#include "../Platform/Common/GameRules/ConsoleGameRules.h" -#include "../Platform/Common/GameRules/ConsoleSchematicFile.h" -#include "../Platform/Common/Colours/ColourTable.h" -#include "../Platform/Common/DLC/DLCSkinFile.h" -#include "../Platform/Common/DLC/DLCManager.h" -#include "../Platform/Common/DLC/DLCPack.h" -#include "../Platform/Common/Telemetry/TelemetryManager.h" - -#include "extraX64client.h" - -#ifdef _FINAL_BUILD -#define printf BREAKTHECOMPILE -#define wprintf BREAKTHECOMPILE -#undef OutputDebugString -#define OutputDebugString BREAKTHECOMPILE -#define OutputDebugStringA BREAKTHECOMPILE -#define OutputDebugStringW BREAKTHECOMPILE -#endif - -void MemSect(int sect); diff --git a/Minecraft.Client/Textures/BufferedImage.cpp b/Minecraft.Client/Source Files/BufferedImage.cpp similarity index 96% rename from Minecraft.Client/Textures/BufferedImage.cpp rename to Minecraft.Client/Source Files/BufferedImage.cpp index 8a624960d..cdfdcd314 100644 --- a/Minecraft.Client/Textures/BufferedImage.cpp +++ b/Minecraft.Client/Source Files/BufferedImage.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "Textures.h" -#include "../../Minecraft.World/Util/PathHelper.h" -#include "../../Minecraft.World/Util/ArrayWithLength.h" -#include "BufferedImage.h" +#include "../../Minecraft.World/Header Files/stdafx.h" +#include "../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../net/minecraft/client/renderer/Textures.h" +#include "../../Minecraft.World/Header Files/PathHelper.h" +#include "../../Minecraft.World/ConsoleHelpers/ArrayWithLength.h" +#include "../Header Files/BufferedImage.h" #if defined(__linux__) #include #endif diff --git a/Minecraft.Client/Platform/Extrax64Stubs.cpp b/Minecraft.Client/Source Files/Extrax64Stubs.cpp similarity index 98% rename from Minecraft.Client/Platform/Extrax64Stubs.cpp rename to Minecraft.Client/Source Files/Extrax64Stubs.cpp index 68656798a..a7108d5f8 100644 --- a/Minecraft.Client/Platform/Extrax64Stubs.cpp +++ b/Minecraft.Client/Source Files/Extrax64Stubs.cpp @@ -1,20 +1,20 @@ -#include "stdafx.h" +#include "../../Minecraft.World/Header Files/stdafx.h" // #include #if defined(_WINDOWS64) -#include "../Platform/Windows64/Sentient/SentientManager.h" -#include "../GameState/StatsCounter.h" -#include "../Platform/Windows64/Social/SocialManager.h" -#include "../Platform/Windows64/Sentient/DynamicConfigurations.h" +#include "../Windows64/Source Files/Sentient/SentientManager.h" +#include "../net/minecraft/stats/StatsCounter.h" +#include "../Windows64/Source Files/Social/SocialManager.h" +#include "../Windows64/Source Files/Sentient/DynamicConfigurations.h" #elif defined(__linux__) // On Linux, stdafx.h already provides Orbis-compatible Sentient/Dynamic headers // via #pragma once. Pull in SentientManager for CSentientManager class // declaration and StatsCounter; CSocialManager is provided as inline stubs via -// Platform/Linux/Social/SocialManager.h. -#include "../Platform/Linux/Sentient/SentientManager.h" -#include "../GameState/StatsCounter.h" +// Linux/Social/SocialManager.h. +#include "../Windows64/Source Files/Sentient/SentientManager.h" +#include "../net/minecraft/stats/StatsCounter.h" #else -#include "../GameState/StatsCounter.h" +#include "../net/minecraft/stats/StatsCounter.h" #endif #if defined(_WINDOWS64) diff --git a/Minecraft.Client/Utils/FrameProfiler.cpp b/Minecraft.Client/Source Files/FrameProfiler.cpp similarity index 98% rename from Minecraft.Client/Utils/FrameProfiler.cpp rename to Minecraft.Client/Source Files/FrameProfiler.cpp index fbaebbb1d..4883fa790 100644 --- a/Minecraft.Client/Utils/FrameProfiler.cpp +++ b/Minecraft.Client/Source Files/FrameProfiler.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "FrameProfiler.h" +#include "../../Minecraft.World/Header Files/stdafx.h" +#include "../Header Files/FrameProfiler.h" #ifdef ENABLE_FRAME_PROFILER diff --git a/Minecraft.Client/Rendering/glWrapper.cpp b/Minecraft.Client/Source Files/glWrapper.cpp similarity index 97% rename from Minecraft.Client/Rendering/glWrapper.cpp rename to Minecraft.Client/Source Files/glWrapper.cpp index f328063c9..30ff4db7d 100644 --- a/Minecraft.Client/Rendering/glWrapper.cpp +++ b/Minecraft.Client/Source Files/glWrapper.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" +#include "../../Minecraft.World/Header Files/stdafx.h" #if !defined(__linux__) -#include "../../Minecraft.World/IO/Streams/FloatBuffer.h" -#include "../../Minecraft.World/IO/Streams/IntBuffer.h" -#include "../../Minecraft.World/IO/Streams/ByteBuffer.h" +#include "../../Minecraft.World/ConsoleJavaLibs/FloatBuffer.h" +#include "../../Minecraft.World/ConsoleJavaLibs/IntBuffer.h" +#include "../../Minecraft.World/ConsoleJavaLibs/ByteBuffer.h" void glViewport(int x, int y, int w, int h) { // We don't really need anything here because minecraft doesn't current do diff --git a/Minecraft.Client/Platform/stdafx.cpp b/Minecraft.Client/Source Files/stdafx.cpp similarity index 83% rename from Minecraft.Client/Platform/stdafx.cpp rename to Minecraft.Client/Source Files/stdafx.cpp index 4fbe6db5e..bcf4779d8 100644 --- a/Minecraft.Client/Platform/stdafx.cpp +++ b/Minecraft.Client/Source Files/stdafx.cpp @@ -2,7 +2,7 @@ // Minecraft.Client.pch will be the pre-compiled header // stdafx.obj will contain the pre-compiled type information -#include "stdafx.h" +#include "../../Minecraft.World/Header Files/stdafx.h" // TODO: reference any additional headers you need in STDAFX.H // and not in this file diff --git a/Minecraft.Client/Platform/stubs.cpp b/Minecraft.Client/Source Files/stubs.cpp similarity index 95% rename from Minecraft.Client/Platform/stubs.cpp rename to Minecraft.Client/Source Files/stubs.cpp index ba7c2bd5c..6c607e5c5 100644 --- a/Minecraft.Client/Platform/stubs.cpp +++ b/Minecraft.Client/Source Files/stubs.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "../../Minecraft.World/Header Files/stdafx.h" #if defined(__linux__) diff --git a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d10_shaders.inl b/Minecraft.Client/Windows64/Iggy/gdraw/gdraw_d3d10_shaders.inl similarity index 100% rename from Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d10_shaders.inl rename to Minecraft.Client/Windows64/Iggy/gdraw/gdraw_d3d10_shaders.inl diff --git a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d11.cpp b/Minecraft.Client/Windows64/Iggy/gdraw/gdraw_d3d11.cpp similarity index 98% rename from Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d11.cpp rename to Minecraft.Client/Windows64/Iggy/gdraw/gdraw_d3d11.cpp index d8655ff36..84a271182 100644 --- a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d11.cpp +++ b/Minecraft.Client/Windows64/Iggy/gdraw/gdraw_d3d11.cpp @@ -1,4 +1,4 @@ -#include "../../../../../Minecraft.World/Platform/stdafx.h" // 4J +#include "../../../../Minecraft.World/Header Files/stdafx.h" // 4J // gdraw_d3d11.cpp - author: Fabian Giesen - copyright 2011 RAD Game Tools // diff --git a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d11.h b/Minecraft.Client/Windows64/Iggy/gdraw/gdraw_d3d11.h similarity index 100% rename from Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d11.h rename to Minecraft.Client/Windows64/Iggy/gdraw/gdraw_d3d11.h diff --git a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d1x_shared.inl b/Minecraft.Client/Windows64/Iggy/gdraw/gdraw_d3d1x_shared.inl similarity index 100% rename from Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_d3d1x_shared.inl rename to Minecraft.Client/Windows64/Iggy/gdraw/gdraw_d3d1x_shared.inl diff --git a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_gl_shaders.inl b/Minecraft.Client/Windows64/Iggy/gdraw/gdraw_gl_shaders.inl similarity index 100% rename from Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_gl_shaders.inl rename to Minecraft.Client/Windows64/Iggy/gdraw/gdraw_gl_shaders.inl diff --git a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_gl_shared.inl b/Minecraft.Client/Windows64/Iggy/gdraw/gdraw_gl_shared.inl similarity index 100% rename from Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_gl_shared.inl rename to Minecraft.Client/Windows64/Iggy/gdraw/gdraw_gl_shared.inl diff --git a/Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_shared.inl b/Minecraft.Client/Windows64/Iggy/gdraw/gdraw_shared.inl similarity index 100% rename from Minecraft.Client/Platform/Windows64/Iggy/gdraw/gdraw_shared.inl rename to Minecraft.Client/Windows64/Iggy/gdraw/gdraw_shared.inl diff --git a/Minecraft.Client/Platform/Linux/Iggy/include/gdraw.h b/Minecraft.Client/Windows64/Iggy/include/gdraw.h similarity index 99% rename from Minecraft.Client/Platform/Linux/Iggy/include/gdraw.h rename to Minecraft.Client/Windows64/Iggy/include/gdraw.h index 7ca675cdf..f7212e5db 100644 --- a/Minecraft.Client/Platform/Linux/Iggy/include/gdraw.h +++ b/Minecraft.Client/Windows64/Iggy/include/gdraw.h @@ -6,7 +6,7 @@ #ifndef __RAD_INCLUDE_GDRAW_H__ #define __RAD_INCLUDE_GDRAW_H__ -#include "../../../Windows64/Miles/include/rrcore.h" +#include "../../Miles Sound System/Include/rrcore.h" #define IDOC diff --git a/Minecraft.Client/Platform/Windows64/Iggy/include/iggy.h b/Minecraft.Client/Windows64/Iggy/include/iggy.h similarity index 100% rename from Minecraft.Client/Platform/Windows64/Iggy/include/iggy.h rename to Minecraft.Client/Windows64/Iggy/include/iggy.h diff --git a/Minecraft.Client/Platform/Windows64/Iggy/include/iggyexpruntime.h b/Minecraft.Client/Windows64/Iggy/include/iggyexpruntime.h similarity index 100% rename from Minecraft.Client/Platform/Windows64/Iggy/include/iggyexpruntime.h rename to Minecraft.Client/Windows64/Iggy/include/iggyexpruntime.h diff --git a/Minecraft.Client/Platform/Windows64/Iggy/include/iggyperfmon.h b/Minecraft.Client/Windows64/Iggy/include/iggyperfmon.h similarity index 100% rename from Minecraft.Client/Platform/Windows64/Iggy/include/iggyperfmon.h rename to Minecraft.Client/Windows64/Iggy/include/iggyperfmon.h diff --git a/Minecraft.Client/Platform/Windows64/Iggy/include/rrCore.h b/Minecraft.Client/Windows64/Iggy/include/rrCore.h similarity index 100% rename from Minecraft.Client/Platform/Windows64/Iggy/include/rrCore.h rename to Minecraft.Client/Windows64/Iggy/include/rrCore.h diff --git a/Minecraft.Client/Platform/Windows64/Miles/include/mss.h b/Minecraft.Client/Windows64/Miles Sound System/Include/mss.h similarity index 100% rename from Minecraft.Client/Platform/Windows64/Miles/include/mss.h rename to Minecraft.Client/Windows64/Miles Sound System/Include/mss.h diff --git a/Minecraft.Client/Platform/Windows64/Miles/include/rrcore.h b/Minecraft.Client/Windows64/Miles Sound System/Include/rrcore.h similarity index 100% rename from Minecraft.Client/Platform/Windows64/Miles/include/rrcore.h rename to Minecraft.Client/Windows64/Miles Sound System/Include/rrcore.h diff --git a/Minecraft.Client/Platform/Windows64/Resource.h b/Minecraft.Client/Windows64/Resource.h similarity index 100% rename from Minecraft.Client/Platform/Windows64/Resource.h rename to Minecraft.Client/Windows64/Resource.h diff --git a/Minecraft.Client/Platform/Windows64/Leaderboards/WindowsLeaderboardManager.cpp b/Minecraft.Client/Windows64/Source Files/Leaderboards/WindowsLeaderboardManager.cpp similarity index 78% rename from Minecraft.Client/Platform/Windows64/Leaderboards/WindowsLeaderboardManager.cpp rename to Minecraft.Client/Windows64/Source Files/Leaderboards/WindowsLeaderboardManager.cpp index c317739f3..b6f2b7660 100644 --- a/Minecraft.Client/Platform/Windows64/Leaderboards/WindowsLeaderboardManager.cpp +++ b/Minecraft.Client/Windows64/Source Files/Leaderboards/WindowsLeaderboardManager.cpp @@ -1,4 +1,4 @@ -#include "../../../../Minecraft.World/Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "WindowsLeaderboardManager.h" diff --git a/Minecraft.Client/Platform/Windows64/Leaderboards/WindowsLeaderboardManager.h b/Minecraft.Client/Windows64/Source Files/Leaderboards/WindowsLeaderboardManager.h similarity index 95% rename from Minecraft.Client/Platform/Windows64/Leaderboards/WindowsLeaderboardManager.h rename to Minecraft.Client/Windows64/Source Files/Leaderboards/WindowsLeaderboardManager.h index a6e93e5ad..19653de2b 100644 --- a/Minecraft.Client/Platform/Windows64/Leaderboards/WindowsLeaderboardManager.h +++ b/Minecraft.Client/Windows64/Source Files/Leaderboards/WindowsLeaderboardManager.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Common/Leaderboards/LeaderboardManager.h" +#include "../../../Common/Source Files/Leaderboards/LeaderboardManager.h" class WindowsLeaderboardManager : public LeaderboardManager { public: diff --git a/Minecraft.Client/Platform/Windows64/Sentient/DynamicConfigurations.h b/Minecraft.Client/Windows64/Source Files/Sentient/DynamicConfigurations.h similarity index 100% rename from Minecraft.Client/Platform/Windows64/Sentient/DynamicConfigurations.h rename to Minecraft.Client/Windows64/Source Files/Sentient/DynamicConfigurations.h diff --git a/Minecraft.Client/Platform/Linux/Sentient/MinecraftTelemetry.h b/Minecraft.Client/Windows64/Source Files/Sentient/MinecraftTelemetry.h similarity index 100% rename from Minecraft.Client/Platform/Linux/Sentient/MinecraftTelemetry.h rename to Minecraft.Client/Windows64/Source Files/Sentient/MinecraftTelemetry.h diff --git a/Minecraft.Client/Platform/Linux/Sentient/SentientManager.h b/Minecraft.Client/Windows64/Source Files/Sentient/SentientManager.h similarity index 100% rename from Minecraft.Client/Platform/Linux/Sentient/SentientManager.h rename to Minecraft.Client/Windows64/Source Files/Sentient/SentientManager.h diff --git a/Minecraft.Client/Platform/Windows64/Sentient/SentientStats.h b/Minecraft.Client/Windows64/Source Files/Sentient/SentientStats.h similarity index 100% rename from Minecraft.Client/Platform/Windows64/Sentient/SentientStats.h rename to Minecraft.Client/Windows64/Source Files/Sentient/SentientStats.h diff --git a/Minecraft.Client/Platform/Windows64/Sentient/SentientTelemetryCommon.h b/Minecraft.Client/Windows64/Source Files/Sentient/SentientTelemetryCommon.h similarity index 100% rename from Minecraft.Client/Platform/Windows64/Sentient/SentientTelemetryCommon.h rename to Minecraft.Client/Windows64/Source Files/Sentient/SentientTelemetryCommon.h diff --git a/Minecraft.Client/Platform/Windows64/Sentient/TelemetryEnum.h b/Minecraft.Client/Windows64/Source Files/Sentient/TelemetryEnum.h similarity index 100% rename from Minecraft.Client/Platform/Windows64/Sentient/TelemetryEnum.h rename to Minecraft.Client/Windows64/Source Files/Sentient/TelemetryEnum.h diff --git a/Minecraft.Client/Platform/Windows64/Social/SocialManager.h b/Minecraft.Client/Windows64/Source Files/Social/SocialManager.h similarity index 100% rename from Minecraft.Client/Platform/Windows64/Social/SocialManager.h rename to Minecraft.Client/Windows64/Source Files/Social/SocialManager.h diff --git a/Minecraft.Client/Platform/Windows64/Windows64_Minecraft.cpp b/Minecraft.Client/Windows64/Source Files/Windows64_Minecraft.cpp similarity index 96% rename from Minecraft.Client/Platform/Windows64/Windows64_Minecraft.cpp rename to Minecraft.Client/Windows64/Source Files/Windows64_Minecraft.cpp index d0c2943ad..97e3ba640 100644 --- a/Minecraft.Client/Platform/Windows64/Windows64_Minecraft.cpp +++ b/Minecraft.Client/Windows64/Source Files/Windows64_Minecraft.cpp @@ -1,41 +1,41 @@ // Minecraft.cpp : Defines the entry point for the application. // -#include "../../../Minecraft.World/Platform/stdafx.h" +#include "../../../Minecraft.World/Header Files/stdafx.h" #include #include -#include "GameConfig/Minecraft.spa.h" -#include "../../MinecraftServer.h" -#include "../../Player/LocalPlayer.h" -#include "../../../Minecraft.World/Items/ItemInstance.h" -#include "../../../Minecraft.World/Items/MapItem.h" -#include "../../../Minecraft.World/Recipes/Recipes.h" -#include "../../../Minecraft.World/Recipes/Recipy.h" -#include "../../../Minecraft.World/Util/Language.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" -#include "../../../Minecraft.World/Util/AABB.h" -#include "../../../Minecraft.World/Util/Vec3.h" -#include "../../../Minecraft.World/Level/Level.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" +#include "../../Header Files/Minecraft.spa.h" +#include "../../net/minecraft/server/MinecraftServer.h" +#include "../../net/minecraft/client/player/LocalPlayer.h" +#include "../../../Minecraft.World/net/minecraft/world/item/ItemInstance.h" +#include "../../../Minecraft.World/net/minecraft/world/item/MapItem.h" +#include "../../../Minecraft.World/net/minecraft/world/item/crafting/Recipes.h" +#include "../../../Minecraft.World/net/minecraft/world/item/crafting/Recipy.h" +#include "../../../Minecraft.World/net/minecraft/locale/Language.h" +#include "../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../Minecraft.World/net/minecraft/world/phys/AABB.h" +#include "../../../Minecraft.World/net/minecraft/world/phys/Vec3.h" +#include "../../../Minecraft.World/net/minecraft/world/level/Level.h" +#include "../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" -#include "../../Network/ClientConnection.h" -#include "../../Player/User.h" -#include "../../../Minecraft.World/Network/Socket.h" -#include "../../../Minecraft.World/Util/ThreadName.h" -#include "../../GameState/StatsCounter.h" -#include "../../UI/Screens/ConnectScreen.h" +#include "../../net/minecraft/client/multiplayer/ClientConnection.h" +#include "../../net/minecraft/client/User.h" +#include "../../../Minecraft.World/ConsoleJavaLibs/Socket.h" +#include "../../../Minecraft.World/ConsoleHelpers/ThreadName.h" +#include "../../net/minecraft/stats/StatsCounter.h" +#include "../../net/minecraft/client/multiplayer/ConnectScreen.h" // #include "Social/SocialManager.h" -// #include "../Common/Leaderboards/LeaderboardManager.h" +// #include "../../Common/Source Files/Leaderboards/LeaderboardManager.h" // #include "../Common/XUI/XUI_Scene_Container.h" // #include "NetworkManager.h" -#include "../../Rendering/Tesselator.h" -#include "../../GameState/Options.h" +#include "../../net/minecraft/client/renderer/Tesselator.h" +#include "../../net/minecraft/client/Options.h" #include "Sentient/SentientManager.h" -#include "../../Textures/Textures.h" -#include "Resource.h" -#include "../../../Minecraft.World/IO/Streams/Compression.h" -#include "../../../Minecraft.World/Level/Storage/OldChunkStorage.h" +#include "../../net/minecraft/client/renderer/Textures.h" +#include "../Resource.h" +#include "../../../Minecraft.World/Header Files/compression.h" +#include "../../../Minecraft.World/net/minecraft/world/level/chunk/storage/OldChunkStorage.h" HINSTANCE hMyInst; LRESULT CALLBACK DlgProc(HWND hWndDlg, uint32_t Msg, WPARAM wParam, diff --git a/Minecraft.Client/Platform/Windows64/Windows64_App.cpp b/Minecraft.Client/Windows64/Windows64_App.cpp similarity index 88% rename from Minecraft.Client/Platform/Windows64/Windows64_App.cpp rename to Minecraft.Client/Windows64/Windows64_App.cpp index c9371b695..18972b8e5 100644 --- a/Minecraft.Client/Platform/Windows64/Windows64_App.cpp +++ b/Minecraft.Client/Windows64/Windows64_App.cpp @@ -1,14 +1,14 @@ -#include "../../../Minecraft.World/Platform/stdafx.h" +#include "../../Minecraft.World/Header Files/stdafx.h" #include "../Common/Consoles_App.h" -#include "../../Player/User.h" -#include "../../Minecraft.h" -#include "../../MinecraftServer.h" -#include "../../Network/PlayerList.h" -#include "../../Player/ServerPlayer.h" -#include "../../../Minecraft.World/Level/Level.h" -#include "../../../Minecraft.World/Level/Storage/LevelSettings.h" -#include "../../../Minecraft.World/WorldGen/Biomes/BiomeSource.h" -#include "../../../Minecraft.World/Level/Storage/LevelType.h" +#include "../net/minecraft/client/User.h" +#include "../net/minecraft/client/Minecraft.h" +#include "../net/minecraft/server/MinecraftServer.h" +#include "../net/minecraft/server/PlayerList.h" +#include "../net/minecraft/server/level/ServerPlayer.h" +#include "../../Minecraft.World/net/minecraft/world/level/Level.h" +#include "../../Minecraft.World/net/minecraft/world/level/LevelSettings.h" +#include "../../Minecraft.World/net/minecraft/world/level/biome/BiomeSource.h" +#include "../../Minecraft.World/net/minecraft/world/level/LevelType.h" #include "Windows64_App.h" CConsoleMinecraftApp app; diff --git a/Minecraft.Client/Platform/Windows64/Windows64_App.h b/Minecraft.Client/Windows64/Windows64_App.h similarity index 100% rename from Minecraft.Client/Platform/Windows64/Windows64_App.h rename to Minecraft.Client/Windows64/Windows64_App.h diff --git a/Minecraft.Client/Platform/Windows64/Windows64_UIController.cpp b/Minecraft.Client/Windows64/Windows64_UIController.cpp similarity index 97% rename from Minecraft.Client/Platform/Windows64/Windows64_UIController.cpp rename to Minecraft.Client/Windows64/Windows64_UIController.cpp index cd5a5c24b..7aa1e414b 100644 --- a/Minecraft.Client/Platform/Windows64/Windows64_UIController.cpp +++ b/Minecraft.Client/Windows64/Windows64_UIController.cpp @@ -1,9 +1,9 @@ -#include "../../../Minecraft.World/Platform/stdafx.h" +#include "../../Minecraft.World/Header Files/stdafx.h" #include "Windows64_UIController.h" // Temp -#include "../../Minecraft.h" -#include "../../Textures/Textures.h" +#include "../net/minecraft/client/Minecraft.h" +#include "../net/minecraft/client/renderer/Textures.h" #define _ENABLEIGGY diff --git a/Minecraft.Client/Platform/Windows64/Windows64_UIController.h b/Minecraft.Client/Windows64/Windows64_UIController.h similarity index 95% rename from Minecraft.Client/Platform/Windows64/Windows64_UIController.h rename to Minecraft.Client/Windows64/Windows64_UIController.h index d574a4fa8..fec203922 100644 --- a/Minecraft.Client/Platform/Windows64/Windows64_UIController.h +++ b/Minecraft.Client/Windows64/Windows64_UIController.h @@ -1,6 +1,6 @@ #pragma once -#include "../Common/UI/UIController.h" +#include "../Common/Source Files/UI/UIController.h" class ConsoleUIController : public UIController { private: diff --git a/Minecraft.Client/Platform/Common/XML/ATGXmlParser.cpp b/Minecraft.Client/Windows64/XML/ATGXmlParser.cpp similarity index 99% rename from Minecraft.Client/Platform/Common/XML/ATGXmlParser.cpp rename to Minecraft.Client/Windows64/XML/ATGXmlParser.cpp index 6ee5dc9f1..ec633dccf 100644 --- a/Minecraft.Client/Platform/Common/XML/ATGXmlParser.cpp +++ b/Minecraft.Client/Windows64/XML/ATGXmlParser.cpp @@ -16,7 +16,7 @@ // Copyright (C) Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------------- -#include "../../../../Minecraft.World/Platform/stdafx.h" +#include "../../../Minecraft.World/Header Files/stdafx.h" #include "ATGXmlParser.h" #include diff --git a/Minecraft.Client/Platform/Common/XML/ATGXmlParser.h b/Minecraft.Client/Windows64/XML/ATGXmlParser.h similarity index 100% rename from Minecraft.Client/Platform/Common/XML/ATGXmlParser.h rename to Minecraft.Client/Windows64/XML/ATGXmlParser.h diff --git a/Minecraft.Client/Platform/Common/XML/xmlFilesCallback.h b/Minecraft.Client/Windows64/XML/xmlFilesCallback.h similarity index 100% rename from Minecraft.Client/Platform/Common/XML/xmlFilesCallback.h rename to Minecraft.Client/Windows64/XML/xmlFilesCallback.h diff --git a/Minecraft.Client/Rendering/Camera.cpp b/Minecraft.Client/net/minecraft/client/Camera.cpp similarity index 88% rename from Minecraft.Client/Rendering/Camera.cpp rename to Minecraft.Client/net/minecraft/client/Camera.cpp index f95c729b4..a12084949 100644 --- a/Minecraft.Client/Rendering/Camera.cpp +++ b/Minecraft.Client/net/minecraft/client/Camera.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "Camera.h" -#include "../Utils/MemoryTracker.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Level/TilePos.h" +#include "MemoryTracker.h" +#include "../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/TilePos.h" float Camera::xPlayerOffs = 0.0f; float Camera::yPlayerOffs = 0.0f; diff --git a/Minecraft.Client/Rendering/Camera.h b/Minecraft.Client/net/minecraft/client/Camera.h similarity index 85% rename from Minecraft.Client/Rendering/Camera.h rename to Minecraft.Client/net/minecraft/client/Camera.h index 894a01967..3b3a4b088 100644 --- a/Minecraft.Client/Rendering/Camera.h +++ b/Minecraft.Client/net/minecraft/client/Camera.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Minecraft.World/IO/Streams/FloatBuffer.h" -#include "../../Minecraft.World/IO/Streams/IntBuffer.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/FloatBuffer.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/IntBuffer.h" class TilePos; class Vec3; diff --git a/Minecraft.Client/ClientConstants.cpp b/Minecraft.Client/net/minecraft/client/ClientConstants.cpp similarity index 78% rename from Minecraft.Client/ClientConstants.cpp rename to Minecraft.Client/net/minecraft/client/ClientConstants.cpp index b4a495c15..2892e33f8 100644 --- a/Minecraft.Client/ClientConstants.cpp +++ b/Minecraft.Client/net/minecraft/client/ClientConstants.cpp @@ -1,4 +1,4 @@ -#include "Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "ClientConstants.h" const std::wstring ClientConstants::VERSION_STRING = diff --git a/Minecraft.Client/ClientConstants.h b/Minecraft.Client/net/minecraft/client/ClientConstants.h similarity index 100% rename from Minecraft.Client/ClientConstants.h rename to Minecraft.Client/net/minecraft/client/ClientConstants.h diff --git a/Minecraft.Client/GameState/DemoUser.cpp b/Minecraft.Client/net/minecraft/client/DemoUser.cpp similarity index 54% rename from Minecraft.Client/GameState/DemoUser.cpp rename to Minecraft.Client/net/minecraft/client/DemoUser.cpp index b38394972..daeb39fae 100644 --- a/Minecraft.Client/GameState/DemoUser.cpp +++ b/Minecraft.Client/net/minecraft/client/DemoUser.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "DemoUser.h" DemoUser::DemoUser() : User(L"DemoUser", L"n/a") {} \ No newline at end of file diff --git a/Minecraft.Client/GameState/DemoUser.h b/Minecraft.Client/net/minecraft/client/DemoUser.h similarity index 71% rename from Minecraft.Client/GameState/DemoUser.h rename to Minecraft.Client/net/minecraft/client/DemoUser.h index 6a3818904..c48893749 100644 --- a/Minecraft.Client/GameState/DemoUser.h +++ b/Minecraft.Client/net/minecraft/client/DemoUser.h @@ -1,5 +1,5 @@ #pragma once -#include "../Player/User.h" +#include "User.h" class DemoUser : public User { public: diff --git a/Minecraft.Client/UI/GuiMessage.cpp b/Minecraft.Client/net/minecraft/client/GuiMessage.cpp similarity index 66% rename from Minecraft.Client/UI/GuiMessage.cpp rename to Minecraft.Client/net/minecraft/client/GuiMessage.cpp index 961c9e04b..4cd5e54b0 100644 --- a/Minecraft.Client/UI/GuiMessage.cpp +++ b/Minecraft.Client/net/minecraft/client/GuiMessage.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "GuiMessage.h" GuiMessage::GuiMessage(const std::wstring& string) { diff --git a/Minecraft.Client/UI/GuiMessage.h b/Minecraft.Client/net/minecraft/client/GuiMessage.h similarity index 100% rename from Minecraft.Client/UI/GuiMessage.h rename to Minecraft.Client/net/minecraft/client/GuiMessage.h diff --git a/Minecraft.Client/Input/KeyMapping.cpp b/Minecraft.Client/net/minecraft/client/KeyMapping.cpp similarity index 68% rename from Minecraft.Client/Input/KeyMapping.cpp rename to Minecraft.Client/net/minecraft/client/KeyMapping.cpp index c439bde54..cc366a1a4 100644 --- a/Minecraft.Client/Input/KeyMapping.cpp +++ b/Minecraft.Client/net/minecraft/client/KeyMapping.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "KeyMapping.h" KeyMapping::KeyMapping(const std::wstring& name, int key) { diff --git a/Minecraft.Client/Input/KeyMapping.h b/Minecraft.Client/net/minecraft/client/KeyMapping.h similarity index 100% rename from Minecraft.Client/Input/KeyMapping.h rename to Minecraft.Client/net/minecraft/client/KeyMapping.h diff --git a/Minecraft.Client/Rendering/Lighting.cpp b/Minecraft.Client/net/minecraft/client/Lighting.cpp similarity index 89% rename from Minecraft.Client/Rendering/Lighting.cpp rename to Minecraft.Client/net/minecraft/client/Lighting.cpp index 4182a9fe3..6a7ca71a5 100644 --- a/Minecraft.Client/Rendering/Lighting.cpp +++ b/Minecraft.Client/net/minecraft/client/Lighting.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "Lighting.h" -#include "../../Minecraft.World/IO/Streams/FloatBuffer.h" -#include "../../Minecraft.World/Util/Vec3.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/FloatBuffer.h" +#include "../../../../Minecraft.World/net/minecraft/world/phys/Vec3.h" FloatBuffer* Lighting::lb = new FloatBuffer(16); diff --git a/Minecraft.Client/Rendering/Lighting.h b/Minecraft.Client/net/minecraft/client/Lighting.h similarity index 100% rename from Minecraft.Client/Rendering/Lighting.h rename to Minecraft.Client/net/minecraft/client/Lighting.h diff --git a/Minecraft.Client/Utils/MemoryTracker.cpp b/Minecraft.Client/net/minecraft/client/MemoryTracker.cpp similarity index 84% rename from Minecraft.Client/Utils/MemoryTracker.cpp rename to Minecraft.Client/net/minecraft/client/MemoryTracker.cpp index 918ab9338..2613bd462 100644 --- a/Minecraft.Client/Utils/MemoryTracker.cpp +++ b/Minecraft.Client/net/minecraft/client/MemoryTracker.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "MemoryTracker.h" -#include "../../Minecraft.World/IO/Streams/IntBuffer.h" -#include "../../Minecraft.World/IO/Streams/ByteBuffer.h" -#include "../../Minecraft.World/IO/Streams/FloatBuffer.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/IntBuffer.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/ByteBuffer.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/FloatBuffer.h" std::unordered_map MemoryTracker::GL_LIST_IDS; std::vector MemoryTracker::TEXTURE_IDS; diff --git a/Minecraft.Client/Utils/MemoryTracker.h b/Minecraft.Client/net/minecraft/client/MemoryTracker.h similarity index 100% rename from Minecraft.Client/Utils/MemoryTracker.h rename to Minecraft.Client/net/minecraft/client/MemoryTracker.h diff --git a/Minecraft.Client/Minecraft.cpp b/Minecraft.Client/net/minecraft/client/Minecraft.cpp similarity index 97% rename from Minecraft.Client/Minecraft.cpp rename to Minecraft.Client/net/minecraft/client/Minecraft.cpp index 2305f0ed9..b3e7353c8 100644 --- a/Minecraft.Client/Minecraft.cpp +++ b/Minecraft.Client/net/minecraft/client/Minecraft.cpp @@ -1,77 +1,77 @@ #include #include -#include "Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "Minecraft.h" -#include "GameState/GameMode.h" -#include "UI/Screens/PauseScreen.h" -#include "Utils/Timer.h" -#include "Rendering/EntityRenderers/ProgressRenderer.h" -#include "Rendering/LevelRenderer.h" -#include "Rendering/Particles/ParticleEngine.h" -#include "Player/MultiPlayerLocalPlayer.h" -#include "Player/User.h" -#include "Textures/Textures.h" -#include "Rendering/GameRenderer.h" -#include "Rendering/Models/HumanoidModel.h" -#include "GameState/Options.h" -#include "Textures/Packs/TexturePackRepository.h" -#include "GameState/StatsCounter.h" -#include "Rendering/EntityRenderers/EntityRenderDispatcher.h" -#include "Rendering/EntityRenderers/TileEntityRenderDispatcher.h" -#include "GameState/SurvivalMode.h" -#include "Rendering/Chunk.h" -#include "GameState/CreativeMode.h" -#include "Level/DemoLevel.h" -#include "Level/MultiPlayerLevel.h" -#include "Player/MultiPlayerLocalPlayer.h" -#include "GameState/DemoUser.h" -#include "Rendering/Particles/GuiParticles.h" -#include "UI/Screen.h" -#include "UI/Screens/DeathScreen.h" -#include "UI/Screens/ErrorScreen.h" -#include "UI/Screens/TitleScreen.h" -#include "UI/Screens/InventoryScreen.h" +#include "../server/level/GameMode.h" +#include "gui/PauseScreen.h" +#include "Timer.h" +#include "ProgressRenderer.h" +#include "renderer/LevelRenderer.h" +#include "particle/ParticleEngine.h" +#include "multiplayer/MultiPlayerLocalPlayer.h" +#include "User.h" +#include "renderer/Textures.h" +#include "renderer/GameRenderer.h" +#include "model/HumanoidModel.h" +#include "Options.h" +#include "skins/TexturePackRepository.h" +#include "../stats/StatsCounter.h" +#include "renderer/entity/EntityRenderDispatcher.h" +#include "renderer/tileentity/TileEntityRenderDispatcher.h" +#include "../server/level/SurvivalMode.h" +#include "renderer/Chunk.h" +#include "../server/level/CreativeMode.h" +#include "level/DemoLevel.h" +#include "multiplayer/MultiPlayerLevel.h" +#include "multiplayer/MultiPlayerLocalPlayer.h" +#include "DemoUser.h" +#include "gui/particle/GuiParticles.h" +#include "gui/Screen.h" +#include "gui/DeathScreen.h" +#include "gui/ErrorScreen.h" +#include "title/TitleScreen.h" +#include "gui/inventory/InventoryScreen.h" #if defined(ENABLE_JAVA_GUIS) -#include "UI/Screens/CreativeInventoryScreen.h" +#include "gui/inventory/CreativeInventoryScreen.h" #endif -#include "UI/Screens/InBedChatScreen.h" -#include "UI/Screens/AchievementPopup.h" -#include "Input/Input.h" -#include "Rendering/FrustumCuller.h" -#include "Rendering/Camera.h" +#include "gui/InBedChatScreen.h" +#include "gui/achievement/AchievementPopup.h" +#include "player/Input.h" +#include "renderer/culling/FrustumCuller.h" +#include "Camera.h" -#include "../Minecraft.World/Entities/MobEffect.h" -#include "../Minecraft.World/Util/Difficulty.h" -#include "../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../Minecraft.World/Headers/net.minecraft.world.entity.item.h" -#include "../Minecraft.World/Headers/net.minecraft.world.phys.h" -#include "../Minecraft.World/IO/Files/File.h" -#include "../Minecraft.World/Headers/net.minecraft.world.level.storage.h" -#include "../Minecraft.World/Headers/net.minecraft.h" -#include "../Minecraft.World/Headers/net.minecraft.stats.h" -#include "../Minecraft.World/Platform/System.h" -#include "../Minecraft.World/IO/Streams/ByteBuffer.h" -#include "../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../Minecraft.World/Headers/net.minecraft.world.level.chunk.h" -#include "../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../Minecraft.World/Platform/Minecraft.World.h" -#include "Network/ClientConnection.h" -#include "../Minecraft.World/WorldGen/Sources/HellRandomLevelSource.h" -#include "../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" -#include "../Minecraft.World/Headers/net.minecraft.world.entity.monster.h" -#include "../Minecraft.World/WorldGen/Features/StrongholdFeature.h" -#include "../Minecraft.World/Entities/Mobs/Villager.h" -#include "../Minecraft.World/Level/Storage/SparseLightStorage.h" -#include "../Minecraft.World/Level/Storage/SparseDataStorage.h" -#include "../Minecraft.World/Blocks/TileEntities/ChestTileEntity.h" -#include "Textures/TextureManager.h" -#include "Platform/Common/UI/IUIScene_CreativeMenu.h" -#include "Platform/Common/UI/UIFontData.h" -#include "Textures/Packs/DLCTexturePack.h" +#include "../../../../Minecraft.World/net/minecraft/world/effect/MobEffect.h" +#include "../../../../Minecraft.World/net/minecraft/world/Difficulty.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h" +#include "../../../../Minecraft.World/net/minecraft/world/phys/net.minecraft.world.phys.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/File.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h" +#include "../../../../Minecraft.World/net/minecraft/net.minecraft.h" +#include "../../../../Minecraft.World/net/minecraft/stats/net.minecraft.stats.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/System.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/ByteBuffer.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../Minecraft.World/Header Files/Minecraft.World.h" +#include "multiplayer/ClientConnection.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/levelgen/HellRandomLevelSource.h" +#include "../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" +#include "../../../../Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/levelgen/structure/StrongholdFeature.h" +#include "../../../../Minecraft.World/net/minecraft/world/entity/npc/Villager.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/chunk/SparseLightStorage.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/chunk/SparseDataStorage.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/tile/entity/ChestTileEntity.h" +#include "renderer/texture/TextureManager.h" +#include "../../../Common/Source Files/UI/All Platforms/IUIScene_CreativeMenu.h" +#include "../../../Common/Source Files/UI/UIFontData.h" +#include "skins/DLCTexturePack.h" // #define DISABLE_SPU_CODE // 4J Turning this on will change the graph at the bottom of the debug overlay diff --git a/Minecraft.Client/Minecraft.h b/Minecraft.Client/net/minecraft/client/Minecraft.h similarity index 97% rename from Minecraft.Client/Minecraft.h rename to Minecraft.Client/net/minecraft/client/Minecraft.h index 751fec019..0dd991155 100644 --- a/Minecraft.Client/Minecraft.h +++ b/Minecraft.Client/net/minecraft/client/Minecraft.h @@ -37,10 +37,10 @@ class ItemInHandRenderer; class LevelSettings; class ColourTable; class MultiPlayerGameMode; -#include "../Minecraft.World/IO/Files/File.h" -#include "../Minecraft.World/Network/Packets/DisconnectPacket.h" -#include "../Minecraft.World/Util/C4JThread.h" -#include "Textures/ResourceLocation.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/File.h" +#include "../../../../Minecraft.World/net/minecraft/network/packet/DisconnectPacket.h" +#include "../../../../Minecraft.World/ConsoleHelpers/C4JThread.h" +#include "resources/ResourceLocation.h" #if defined(linux) #undef linux diff --git a/Minecraft.Client/GameState/Options.cpp b/Minecraft.Client/net/minecraft/client/Options.cpp similarity index 94% rename from Minecraft.Client/GameState/Options.cpp rename to Minecraft.Client/net/minecraft/client/Options.cpp index 082afb702..db33cea89 100644 --- a/Minecraft.Client/GameState/Options.cpp +++ b/Minecraft.Client/net/minecraft/client/Options.cpp @@ -1,18 +1,18 @@ -#include "../Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "Options.h" -#include "../Input/KeyMapping.h" -#include "../Rendering/LevelRenderer.h" -#include "../Textures/Textures.h" -#include "../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../../Minecraft.World/Util/Language.h" -#include "../../Minecraft.World/IO/Files/File.h" -#include "../../Minecraft.World/IO/Streams/BufferedReader.h" -#include "../../Minecraft.World/IO/Streams/DataInputStream.h" -#include "../../Minecraft.World/IO/Streams/InputStreamReader.h" -#include "../../Minecraft.World/IO/Files/FileInputStream.h" -#include "../../Minecraft.World/IO/Files/FileOutputStream.h" -#include "../../Minecraft.World/IO/Streams/DataOutputStream.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "KeyMapping.h" +#include "renderer/LevelRenderer.h" +#include "renderer/Textures.h" +#include "../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../../../Minecraft.World/net/minecraft/locale/Language.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/File.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/InputOutputStream/BufferedReader.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/InputOutputStream/DataInputStream.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputStreamReader.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/InputOutputStream/FileInputStream.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/InputOutputStream/FileOutputStream.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/InputOutputStream/DataOutputStream.h" +#include "../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" // 4J - the Option sub-class used to be an java enumerated type, trying to // emulate that functionality here diff --git a/Minecraft.Client/GameState/Options.h b/Minecraft.Client/net/minecraft/client/Options.h similarity index 98% rename from Minecraft.Client/GameState/Options.h rename to Minecraft.Client/net/minecraft/client/Options.h index b727da4a0..56e70004c 100644 --- a/Minecraft.Client/GameState/Options.h +++ b/Minecraft.Client/net/minecraft/client/Options.h @@ -2,7 +2,7 @@ class Minecraft; class KeyMapping; -#include "../../Minecraft.World/IO/Files/File.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/File.h" class Options { public: diff --git a/Minecraft.Client/Rendering/EntityRenderers/ProgressRenderer.cpp b/Minecraft.Client/net/minecraft/client/ProgressRenderer.cpp similarity index 94% rename from Minecraft.Client/Rendering/EntityRenderers/ProgressRenderer.cpp rename to Minecraft.Client/net/minecraft/client/ProgressRenderer.cpp index 68ed3dbad..abe1b3fd6 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/ProgressRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/ProgressRenderer.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../Tesselator.h" -#include "../../Textures/Textures.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" +#include "renderer/Tesselator.h" +#include "renderer/Textures.h" #include "ProgressRenderer.h" -#include "../../../Minecraft.World/Platform/System.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/System.h" std::recursive_mutex ProgressRenderer::s_progress; diff --git a/Minecraft.Client/Rendering/EntityRenderers/ProgressRenderer.h b/Minecraft.Client/net/minecraft/client/ProgressRenderer.h similarity index 93% rename from Minecraft.Client/Rendering/EntityRenderers/ProgressRenderer.h rename to Minecraft.Client/net/minecraft/client/ProgressRenderer.h index 5de0a6c95..65d6d6390 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/ProgressRenderer.h +++ b/Minecraft.Client/net/minecraft/client/ProgressRenderer.h @@ -1,6 +1,6 @@ #pragma once #include -#include "../../../Minecraft.World/Util/ProgressListener.h" +#include "../../../../Minecraft.World/net/minecraft/util/ProgressListener.h" class ProgressRenderer : public ProgressListener { public: diff --git a/Minecraft.Client/Utils/Timer.cpp b/Minecraft.Client/net/minecraft/client/Timer.cpp similarity index 96% rename from Minecraft.Client/Utils/Timer.cpp rename to Minecraft.Client/net/minecraft/client/Timer.cpp index ef654c8ed..8784f8206 100644 --- a/Minecraft.Client/Utils/Timer.cpp +++ b/Minecraft.Client/net/minecraft/client/Timer.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "Timer.h" -#include "../../Minecraft.World/Platform/System.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/System.h" Timer::Timer(float ticksPerSecond) { // 4J - added initialisers diff --git a/Minecraft.Client/Utils/Timer.h b/Minecraft.Client/net/minecraft/client/Timer.h similarity index 100% rename from Minecraft.Client/Utils/Timer.h rename to Minecraft.Client/net/minecraft/client/Timer.h diff --git a/Minecraft.Client/Player/User.cpp b/Minecraft.Client/net/minecraft/client/User.cpp similarity index 89% rename from Minecraft.Client/Player/User.cpp rename to Minecraft.Client/net/minecraft/client/User.cpp index 6d0c21bfd..e86d6dc03 100644 --- a/Minecraft.Client/Player/User.cpp +++ b/Minecraft.Client/net/minecraft/client/User.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "User.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" std::vector User::allowedTiles; diff --git a/Minecraft.Client/Player/User.h b/Minecraft.Client/net/minecraft/client/User.h similarity index 100% rename from Minecraft.Client/Player/User.h rename to Minecraft.Client/net/minecraft/client/User.h diff --git a/Minecraft.Client/UI/Button.cpp b/Minecraft.Client/net/minecraft/client/gui/Button.cpp similarity index 95% rename from Minecraft.Client/UI/Button.cpp rename to Minecraft.Client/net/minecraft/client/gui/Button.cpp index ced455e3b..1b2347301 100644 --- a/Minecraft.Client/UI/Button.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/Button.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "Button.h" -#include "../Textures/Textures.h" +#include "../renderer/Textures.h" #ifdef ENABLE_JAVA_GUIS ResourceLocation GUI_GUI_LOCATION = ResourceLocation(TN_GUI_GUI); diff --git a/Minecraft.Client/UI/Button.h b/Minecraft.Client/net/minecraft/client/gui/Button.h similarity index 100% rename from Minecraft.Client/UI/Button.h rename to Minecraft.Client/net/minecraft/client/gui/Button.h diff --git a/Minecraft.Client/UI/Screens/ChatScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/ChatScreen.cpp similarity index 88% rename from Minecraft.Client/UI/Screens/ChatScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/ChatScreen.cpp index 35e3cf6f9..7f0f9f75b 100644 --- a/Minecraft.Client/UI/Screens/ChatScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/ChatScreen.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ChatScreen.h" -#include "../../Player/MultiPlayerLocalPlayer.h" -#include "../../../Minecraft.World/Util/SharedConstants.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" +#include "../multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../Minecraft.World/net/minecraft/SharedConstants.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" const std::wstring ChatScreen::allowedChars = SharedConstants::acceptableLetters; diff --git a/Minecraft.Client/UI/Screens/ChatScreen.h b/Minecraft.Client/net/minecraft/client/gui/ChatScreen.h similarity index 95% rename from Minecraft.Client/UI/Screens/ChatScreen.h rename to Minecraft.Client/net/minecraft/client/gui/ChatScreen.h index ce20f5a62..3be4521f7 100644 --- a/Minecraft.Client/UI/Screens/ChatScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/ChatScreen.h @@ -1,5 +1,5 @@ #pragma once -#include "../Screen.h" +#include "Screen.h" class ChatScreen : public Screen { protected: diff --git a/Minecraft.Client/UI/Screens/ConfirmScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/ConfirmScreen.cpp similarity index 90% rename from Minecraft.Client/UI/Screens/ConfirmScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/ConfirmScreen.cpp index 17133b288..0052f0dcc 100644 --- a/Minecraft.Client/UI/Screens/ConfirmScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/ConfirmScreen.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ConfirmScreen.h" -#include "../SmallButton.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" +#include "SmallButton.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" ConfirmScreen::ConfirmScreen(Screen* parent, const std::wstring& title1, const std::wstring& title2, int id) { diff --git a/Minecraft.Client/UI/Screens/ConfirmScreen.h b/Minecraft.Client/net/minecraft/client/gui/ConfirmScreen.h similarity index 96% rename from Minecraft.Client/UI/Screens/ConfirmScreen.h rename to Minecraft.Client/net/minecraft/client/gui/ConfirmScreen.h index d400c70cd..5933ff0e4 100644 --- a/Minecraft.Client/UI/Screens/ConfirmScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/ConfirmScreen.h @@ -1,5 +1,5 @@ #pragma once -#include "../Screen.h" +#include "Screen.h" class ConfirmScreen : public Screen { private: diff --git a/Minecraft.Client/UI/Screens/ControlsScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/ControlsScreen.cpp similarity index 91% rename from Minecraft.Client/UI/Screens/ControlsScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/ControlsScreen.cpp index 908fcff1f..6516ebea8 100644 --- a/Minecraft.Client/UI/Screens/ControlsScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/ControlsScreen.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ControlsScreen.h" -#include "../../GameState/Options.h" -#include "../SmallButton.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" +#include "../Options.h" +#include "SmallButton.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" ControlsScreen::ControlsScreen(Screen* lastScreen, Options* options) { // 4J - added initialisers diff --git a/Minecraft.Client/UI/Screens/ControlsScreen.h b/Minecraft.Client/net/minecraft/client/gui/ControlsScreen.h similarity index 96% rename from Minecraft.Client/UI/Screens/ControlsScreen.h rename to Minecraft.Client/net/minecraft/client/gui/ControlsScreen.h index 3132fb451..4055c2f42 100644 --- a/Minecraft.Client/UI/Screens/ControlsScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/ControlsScreen.h @@ -1,5 +1,5 @@ #pragma once -#include "../Screen.h" +#include "Screen.h" class Options; diff --git a/Minecraft.Client/UI/Screens/CreateWorldScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/CreateWorldScreen.cpp similarity index 95% rename from Minecraft.Client/UI/Screens/CreateWorldScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/CreateWorldScreen.cpp index 4270190c2..f3d848c3c 100644 --- a/Minecraft.Client/UI/Screens/CreateWorldScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/CreateWorldScreen.cpp @@ -1,16 +1,16 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "CreateWorldScreen.h" -#include "../EditBox.h" -#include "../Button.h" -#include "../../GameState/SurvivalMode.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.storage.h" -#include "../../../Minecraft.World/Util/SharedConstants.h" -#include "../../../Minecraft.World/Util/Random.h" -#include "../../MinecraftServer.h" -#include "../../GameState/Options.h" +#include "EditBox.h" +#include "Button.h" +#include "../../server/level/SurvivalMode.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h" +#include "../../../../../Minecraft.World/net/minecraft/SharedConstants.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" +#include "../../server/MinecraftServer.h" +#include "../Options.h" #include "MessageScreen.h" #include diff --git a/Minecraft.Client/UI/Screens/CreateWorldScreen.h b/Minecraft.Client/net/minecraft/client/gui/CreateWorldScreen.h similarity index 98% rename from Minecraft.Client/UI/Screens/CreateWorldScreen.h rename to Minecraft.Client/net/minecraft/client/gui/CreateWorldScreen.h index ba38b2ec3..704df772e 100644 --- a/Minecraft.Client/UI/Screens/CreateWorldScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/CreateWorldScreen.h @@ -1,5 +1,5 @@ #pragma once -#include "../Screen.h" +#include "Screen.h" class EditBox; class LevelStorageSource; diff --git a/Minecraft.Client/UI/Screens/DeathScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/DeathScreen.cpp similarity index 87% rename from Minecraft.Client/UI/Screens/DeathScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/DeathScreen.cpp index c4765fcad..70d62fd97 100644 --- a/Minecraft.Client/UI/Screens/DeathScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/DeathScreen.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #include "DeathScreen.h" -#include "../Button.h" -#include "../../Player/MultiPlayerLocalPlayer.h" +#include "Button.h" +#include "../multiplayer/MultiPlayerLocalPlayer.h" #include "PauseScreen.h" -#include "TitleScreen.h" +#include "../title/TitleScreen.h" void DeathScreen::init() { buttons.clear(); diff --git a/Minecraft.Client/UI/Screens/DeathScreen.h b/Minecraft.Client/net/minecraft/client/gui/DeathScreen.h similarity index 93% rename from Minecraft.Client/UI/Screens/DeathScreen.h rename to Minecraft.Client/net/minecraft/client/gui/DeathScreen.h index 382f0e5b6..96e0d6260 100644 --- a/Minecraft.Client/UI/Screens/DeathScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/DeathScreen.h @@ -1,5 +1,5 @@ #pragma once -#include "../Screen.h" +#include "Screen.h" class DeathScreen : public Screen { public: diff --git a/Minecraft.Client/UI/EditBox.cpp b/Minecraft.Client/net/minecraft/client/gui/EditBox.cpp similarity index 95% rename from Minecraft.Client/UI/EditBox.cpp rename to Minecraft.Client/net/minecraft/client/gui/EditBox.cpp index da48457e7..9b30e79a8 100644 --- a/Minecraft.Client/UI/EditBox.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/EditBox.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "EditBox.h" -#include "../../Minecraft.World/Util/SharedConstants.h" +#include "../../../../../Minecraft.World/net/minecraft/SharedConstants.h" EditBox::EditBox(Screen* screen, Font* font, int x, int y, int width, int height, const std::wstring& value) { diff --git a/Minecraft.Client/UI/EditBox.h b/Minecraft.Client/net/minecraft/client/gui/EditBox.h similarity index 100% rename from Minecraft.Client/UI/EditBox.h rename to Minecraft.Client/net/minecraft/client/gui/EditBox.h diff --git a/Minecraft.Client/UI/Screens/EnchantmentScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/EnchantmentScreen.cpp similarity index 95% rename from Minecraft.Client/UI/Screens/EnchantmentScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/EnchantmentScreen.cpp index 24d239382..04bc6285a 100644 --- a/Minecraft.Client/UI/Screens/EnchantmentScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/EnchantmentScreen.cpp @@ -1,17 +1,17 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "EnchantmentScreen.h" #include #include #include #include -#include "../../Player/MultiPlayerLocalPlayer.h" -#include "../../Rendering/Lighting.h" -#include "../../Textures/Textures.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../../../Minecraft.World/Containers/EnchantmentMenu.h" -#include "../../../Minecraft.World/Containers/Slot.h" -#include "../../Rendering/Models/BookModel.h" -#include "../../../Minecraft.Client/Minecraft.h" +#include "../multiplayer/MultiPlayerLocalPlayer.h" +#include "../Lighting.h" +#include "../renderer/Textures.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/EnchantmentMenu.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/Slot.h" +#include "../model/BookModel.h" +#include "../Minecraft.h" // 4jcraft: referenced from MCP 8.11 (JE 1.6.4) and the existing // container classes (and iggy too) diff --git a/Minecraft.Client/UI/Screens/EnchantmentScreen.h b/Minecraft.Client/net/minecraft/client/gui/EnchantmentScreen.h similarity index 89% rename from Minecraft.Client/UI/Screens/EnchantmentScreen.h rename to Minecraft.Client/net/minecraft/client/gui/EnchantmentScreen.h index 96a7a6af6..8d9f87859 100644 --- a/Minecraft.Client/UI/Screens/EnchantmentScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/EnchantmentScreen.h @@ -1,7 +1,7 @@ #pragma once -#include "AbstractContainerScreen.h" -#include "../../../Minecraft.World/Containers/EnchantmentMenu.h" +#include "inventory/AbstractContainerScreen.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/EnchantmentMenu.h" class EnchantmentScreen : public AbstractContainerScreen { public: diff --git a/Minecraft.Client/UI/Screens/ErrorScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/ErrorScreen.cpp similarity index 90% rename from Minecraft.Client/UI/Screens/ErrorScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/ErrorScreen.cpp index 19e0542fb..241faa634 100644 --- a/Minecraft.Client/UI/Screens/ErrorScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/ErrorScreen.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ErrorScreen.h" ErrorScreen::ErrorScreen(const std::wstring& title, diff --git a/Minecraft.Client/UI/Screens/ErrorScreen.h b/Minecraft.Client/net/minecraft/client/gui/ErrorScreen.h similarity index 93% rename from Minecraft.Client/UI/Screens/ErrorScreen.h rename to Minecraft.Client/net/minecraft/client/gui/ErrorScreen.h index 4c46d36ff..b65f921b4 100644 --- a/Minecraft.Client/UI/Screens/ErrorScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/ErrorScreen.h @@ -1,5 +1,5 @@ #pragma once -#include "../Screen.h" +#include "Screen.h" class ErrorScreen : public Screen { private: diff --git a/Minecraft.Client/UI/Font.cpp b/Minecraft.Client/net/minecraft/client/gui/Font.cpp similarity index 97% rename from Minecraft.Client/UI/Font.cpp rename to Minecraft.Client/net/minecraft/client/gui/Font.cpp index 9971cec29..69d1c2714 100644 --- a/Minecraft.Client/UI/Font.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/Font.cpp @@ -1,13 +1,13 @@ -#include "../Platform/stdafx.h" -#include "../Textures/Textures.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../renderer/Textures.h" #include "Font.h" -#include "../GameState/Options.h" -#include "../Rendering/Tesselator.h" -#include "../Textures/ResourceLocation.h" -#include "../../Minecraft.World/IO/Streams/IntBuffer.h" -#include "../../Minecraft.World/Headers/net.minecraft.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Util/Random.h" +#include "../Options.h" +#include "../renderer/Tesselator.h" +#include "../resources/ResourceLocation.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/IntBuffer.h" +#include "../../../../../Minecraft.World/net/minecraft/net.minecraft.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" Font::Font(Options* options, const std::wstring& name, Textures* textures, bool enforceUnicode, ResourceLocation* textureLocation, int cols, diff --git a/Minecraft.Client/UI/Font.h b/Minecraft.Client/net/minecraft/client/gui/Font.h similarity index 100% rename from Minecraft.Client/UI/Font.h rename to Minecraft.Client/net/minecraft/client/gui/Font.h diff --git a/Minecraft.Client/UI/Gui.cpp b/Minecraft.Client/net/minecraft/client/gui/Gui.cpp similarity index 96% rename from Minecraft.Client/UI/Gui.cpp rename to Minecraft.Client/net/minecraft/client/gui/Gui.cpp index e5ec7ca2b..1a03c3d30 100644 --- a/Minecraft.Client/UI/Gui.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/Gui.cpp @@ -1,35 +1,35 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "Gui.h" -#include "../Rendering/EntityRenderers/ItemRenderer.h" -#include "../Rendering/GameRenderer.h" -#include "../GameState/Options.h" -#include "../Player/MultiPlayerLocalPlayer.h" -#include "../Textures/Textures.h" -#include "../Textures/TextureAtlas.h" -#include "../GameState/GameMode.h" -#include "../Rendering/Lighting.h" -#include "Screens/ChatScreen.h" -#include "../Level/MultiPlayerLevel.h" -#include "../../Minecraft.World/Util/JavaMath.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.effect.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.food.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Level/LevelData.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Platform/System.h" -#include "../../Minecraft.World/Util/Language.h" -#include "../Rendering/EntityRenderers/EntityRenderDispatcher.h" -#include "../../Minecraft.World/Level/Dimensions/Dimension.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.boss.enderdragon.h" -#include "../Rendering/EntityRenderers/EnderDragonRenderer.h" -#include "../../Minecraft.World/Headers/net.minecraft.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.h" -#include "../../Minecraft.World/Level/LevelChunk.h" -#include "../../Minecraft.World/WorldGen/Biomes/Biome.h" -#include "../../Minecraft.World/Entities/Mobs/SharedMonsterAttributes.h" -#include "../../Minecraft.World/AI/Attributes/AttributeInstance.h" +#include "../renderer/entity/ItemRenderer.h" +#include "../renderer/GameRenderer.h" +#include "../Options.h" +#include "../multiplayer/MultiPlayerLocalPlayer.h" +#include "../renderer/Textures.h" +#include "../renderer/texture/TextureAtlas.h" +#include "../../server/level/GameMode.h" +#include "../Lighting.h" +#include "ChatScreen.h" +#include "../multiplayer/MultiPlayerLevel.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/world/effect/net.minecraft.world.effect.h" +#include "../../../../../Minecraft.World/net/minecraft/world/food/net.minecraft.world.food.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/storage/LevelData.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/System.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/Language.h" +#include "../renderer/entity/EntityRenderDispatcher.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/Dimension.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/boss/enderdragon/net.minecraft.world.entity.boss.enderdragon.h" +#include "../renderer/entity/EnderDragonRenderer.h" +#include "../../../../../Minecraft.World/net/minecraft/net.minecraft.h" +#include "../../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/LevelChunk.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/biome/Biome.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/monster/SharedMonsterAttributes.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/ai/attributes/AttributeInstance.h" ResourceLocation Gui::PUMPKIN_BLUR_LOCATION = ResourceLocation(TN__BLUR__MISC_PUMPKINBLUR); diff --git a/Minecraft.Client/UI/Gui.h b/Minecraft.Client/net/minecraft/client/gui/Gui.h similarity index 96% rename from Minecraft.Client/UI/Gui.h rename to Minecraft.Client/net/minecraft/client/gui/Gui.h index 1fb274e00..a5570110e 100644 --- a/Minecraft.Client/UI/Gui.h +++ b/Minecraft.Client/net/minecraft/client/gui/Gui.h @@ -1,8 +1,8 @@ #pragma once #include #include "GuiComponent.h" -#include "GuiMessage.h" -#include "../../../Minecraft.Client/Rendering/EntityRenderers/ItemRenderer.h" +#include "../GuiMessage.h" +#include "../renderer/entity/ItemRenderer.h" class Random; class Minecraft; diff --git a/Minecraft.Client/UI/GuiComponent.cpp b/Minecraft.Client/net/minecraft/client/gui/GuiComponent.cpp similarity index 98% rename from Minecraft.Client/UI/GuiComponent.cpp rename to Minecraft.Client/net/minecraft/client/gui/GuiComponent.cpp index d9149f2c8..391b062c3 100644 --- a/Minecraft.Client/UI/GuiComponent.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/GuiComponent.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "GuiComponent.h" -#include "../Rendering/Tesselator.h" +#include "../renderer/Tesselator.h" void GuiComponent::hLine(int x0, int x1, int y, int col) { if (x1 < x0) { diff --git a/Minecraft.Client/UI/GuiComponent.h b/Minecraft.Client/net/minecraft/client/gui/GuiComponent.h similarity index 100% rename from Minecraft.Client/UI/GuiComponent.h rename to Minecraft.Client/net/minecraft/client/gui/GuiComponent.h diff --git a/Minecraft.Client/UI/Screens/HopperScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/HopperScreen.cpp similarity index 73% rename from Minecraft.Client/UI/Screens/HopperScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/HopperScreen.cpp index df3b3af9a..ae06bb0f5 100644 --- a/Minecraft.Client/UI/Screens/HopperScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/HopperScreen.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "HopperScreen.h" -#include "../../Textures/Textures.h" -#include "../../Player/LocalPlayer.h" -#include "../Font.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../../Minecraft.World/Containers/HopperMenu.h" +#include "../renderer/Textures.h" +#include "../player/LocalPlayer.h" +#include "Font.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/HopperMenu.h" // 4jcraft: referenced from MCP 8.11 (JE 1.6.4) and the existing // container classes diff --git a/Minecraft.Client/UI/Screens/HopperScreen.h b/Minecraft.Client/net/minecraft/client/gui/HopperScreen.h similarity index 90% rename from Minecraft.Client/UI/Screens/HopperScreen.h rename to Minecraft.Client/net/minecraft/client/gui/HopperScreen.h index e3e3d1eb4..6137ded26 100644 --- a/Minecraft.Client/UI/Screens/HopperScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/HopperScreen.h @@ -1,6 +1,6 @@ #pragma once #include -#include "AbstractContainerScreen.h" +#include "inventory/AbstractContainerScreen.h" class HopperTileEntity; class MinecartHopper; diff --git a/Minecraft.Client/UI/Screens/InBedChatScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/InBedChatScreen.cpp similarity index 82% rename from Minecraft.Client/UI/Screens/InBedChatScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/InBedChatScreen.cpp index 2c15026d2..7f8b4857e 100644 --- a/Minecraft.Client/UI/Screens/InBedChatScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/InBedChatScreen.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "InBedChatScreen.h" -#include "../Button.h" -#include "../../Player/MultiPlayerLocalPlayer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" +#include "Button.h" +#include "../multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" void InBedChatScreen::init() { Keyboard::enableRepeatEvents(true); diff --git a/Minecraft.Client/UI/Screens/InBedChatScreen.h b/Minecraft.Client/net/minecraft/client/gui/InBedChatScreen.h similarity index 100% rename from Minecraft.Client/UI/Screens/InBedChatScreen.h rename to Minecraft.Client/net/minecraft/client/gui/InBedChatScreen.h diff --git a/Minecraft.Client/UI/Screens/JoinMultiplayerScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/JoinMultiplayerScreen.cpp similarity index 94% rename from Minecraft.Client/UI/Screens/JoinMultiplayerScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/JoinMultiplayerScreen.cpp index b25a3d1ab..a4fb3dbbc 100644 --- a/Minecraft.Client/UI/Screens/JoinMultiplayerScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/JoinMultiplayerScreen.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "JoinMultiplayerScreen.h" -#include "../Button.h" -#include "../EditBox.h" -#include "../../GameState/Options.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" +#include "Button.h" +#include "EditBox.h" +#include "../Options.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" JoinMultiplayerScreen::JoinMultiplayerScreen(Screen* lastScreen) { ipEdit = nullptr; diff --git a/Minecraft.Client/UI/Screens/JoinMultiplayerScreen.h b/Minecraft.Client/net/minecraft/client/gui/JoinMultiplayerScreen.h similarity index 96% rename from Minecraft.Client/UI/Screens/JoinMultiplayerScreen.h rename to Minecraft.Client/net/minecraft/client/gui/JoinMultiplayerScreen.h index 78bce6115..8ec479267 100644 --- a/Minecraft.Client/UI/Screens/JoinMultiplayerScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/JoinMultiplayerScreen.h @@ -1,5 +1,5 @@ #pragma once -#include "../Screen.h" +#include "Screen.h" class EditBox; class Button; diff --git a/Minecraft.Client/UI/Screens/MerchantScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/MerchantScreen.cpp similarity index 86% rename from Minecraft.Client/UI/Screens/MerchantScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/MerchantScreen.cpp index f7e5a51e5..6883e972c 100644 --- a/Minecraft.Client/UI/Screens/MerchantScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/MerchantScreen.cpp @@ -1,22 +1,22 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "MerchantScreen.h" #include #include -#include "../TradeSwitchButton.h" -#include "../../Player/MultiPlayerLocalPlayer.h" -#include "../../Rendering/Lighting.h" -#include "../../Textures/Textures.h" -#include "../../Rendering/EntityRenderers/ItemRenderer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../../../Minecraft.World/Containers/MerchantMenu.h" -#include "../../../Minecraft.World/Containers/Slot.h" -#include "../../../Minecraft.World/Containers/MerchantContainer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.trading.h" -#include "../../../Minecraft.Client/Minecraft.h" -#include "../../../Minecraft.Client/Network/ClientConnection.h" -#include "../../../Minecraft.World/IO/Streams/ByteArrayOutputStream.h" -#include "../../../Minecraft.World/IO/Streams/DataOutputStream.h" -#include "../../../Minecraft.World/Util/Rarity.h" +#include "TradeSwitchButton.h" +#include "../multiplayer/MultiPlayerLocalPlayer.h" +#include "../Lighting.h" +#include "../renderer/Textures.h" +#include "../renderer/entity/ItemRenderer.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/MerchantMenu.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/Slot.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/MerchantContainer.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/trading/net.minecraft.world.item.trading.h" +#include "../Minecraft.h" +#include "../multiplayer/ClientConnection.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/InputOutputStream/ByteArrayOutputStream.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/InputOutputStream/DataOutputStream.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/Rarity.h" // 4jcraft: referenced from MCP 8.11 (JE 1.6.4) and the existing // container classes (and iggy too) diff --git a/Minecraft.Client/UI/Screens/MerchantScreen.h b/Minecraft.Client/net/minecraft/client/gui/MerchantScreen.h similarity index 77% rename from Minecraft.Client/UI/Screens/MerchantScreen.h rename to Minecraft.Client/net/minecraft/client/gui/MerchantScreen.h index 4a40bbb72..d3e613d3e 100644 --- a/Minecraft.Client/UI/Screens/MerchantScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/MerchantScreen.h @@ -1,8 +1,8 @@ #pragma once -#include "AbstractContainerScreen.h" -#include "../../../Minecraft.World/Containers/MerchantMenu.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.trading.h" +#include "inventory/AbstractContainerScreen.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/MerchantMenu.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/trading/net.minecraft.world.item.trading.h" class TradeSwitchButton; diff --git a/Minecraft.Client/UI/Screens/MessageScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/MessageScreen.cpp similarity index 88% rename from Minecraft.Client/UI/Screens/MessageScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/MessageScreen.cpp index 9cf8415d5..fa12cc957 100644 --- a/Minecraft.Client/UI/Screens/MessageScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/MessageScreen.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "MessageScreen.h" MessageScreen::MessageScreen(const std::wstring& message) { diff --git a/Minecraft.Client/UI/Screens/MessageScreen.h b/Minecraft.Client/net/minecraft/client/gui/MessageScreen.h similarity index 94% rename from Minecraft.Client/UI/Screens/MessageScreen.h rename to Minecraft.Client/net/minecraft/client/gui/MessageScreen.h index 62b4ee280..c4b5cc272 100644 --- a/Minecraft.Client/UI/Screens/MessageScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/MessageScreen.h @@ -1,5 +1,5 @@ #pragma once -#include "../Screen.h" +#include "Screen.h" class MessageScreen : public Screen { private: diff --git a/Minecraft.Client/Rendering/Minimap.cpp b/Minecraft.Client/net/minecraft/client/gui/Minimap.cpp similarity index 95% rename from Minecraft.Client/Rendering/Minimap.cpp rename to Minecraft.Client/net/minecraft/client/gui/Minimap.cpp index 2003f4f1d..d4a68f578 100644 --- a/Minecraft.Client/Rendering/Minimap.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/Minimap.cpp @@ -1,12 +1,12 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "../Minecraft.h" #include "Minimap.h" -#include "../UI/Font.h" -#include "../GameState/Options.h" -#include "../Textures/Textures.h" -#include "Tesselator.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.saveddata.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.material.h" +#include "Font.h" +#include "../Options.h" +#include "../renderer/Textures.h" +#include "../renderer/Tesselator.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/saveddata/net.minecraft.world.level.saveddata.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/material/net.minecraft.world.level.material.h" int Minimap::LUT[256]; // 4J added bool Minimap::genLUT = true; // 4J added diff --git a/Minecraft.Client/Rendering/Minimap.h b/Minecraft.Client/net/minecraft/client/gui/Minimap.h similarity index 91% rename from Minecraft.Client/Rendering/Minimap.h rename to Minecraft.Client/net/minecraft/client/gui/Minimap.h index 0fd927d5e..4bdd4a358 100644 --- a/Minecraft.Client/Rendering/Minimap.h +++ b/Minecraft.Client/net/minecraft/client/gui/Minimap.h @@ -1,5 +1,5 @@ #pragma once -#include "../../Minecraft.World/Items/MapItem.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/MapItem.h" class Options; class Font; class Textures; diff --git a/Minecraft.Client/UI/Screens/NameEntryScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/NameEntryScreen.cpp similarity index 93% rename from Minecraft.Client/UI/Screens/NameEntryScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/NameEntryScreen.cpp index c5a0d62f2..fb3d27668 100644 --- a/Minecraft.Client/UI/Screens/NameEntryScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/NameEntryScreen.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "NameEntryScreen.h" -#include "../Button.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" +#include "Button.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" const std::wstring NameEntryScreen::allowedChars = L"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 " diff --git a/Minecraft.Client/UI/Screens/NameEntryScreen.h b/Minecraft.Client/net/minecraft/client/gui/NameEntryScreen.h similarity index 96% rename from Minecraft.Client/UI/Screens/NameEntryScreen.h rename to Minecraft.Client/net/minecraft/client/gui/NameEntryScreen.h index 2f0babddd..454178657 100644 --- a/Minecraft.Client/UI/Screens/NameEntryScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/NameEntryScreen.h @@ -1,5 +1,5 @@ #pragma once -#include "../Screen.h" +#include "Screen.h" class NameEntryScreen : public Screen { private: diff --git a/Minecraft.Client/UI/Screens/OptionsScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/OptionsScreen.cpp similarity index 92% rename from Minecraft.Client/UI/Screens/OptionsScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/OptionsScreen.cpp index b20a9ee21..14197f043 100644 --- a/Minecraft.Client/UI/Screens/OptionsScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/OptionsScreen.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "OptionsScreen.h" -#include "../SmallButton.h" -#include "../SlideButton.h" -#include "../../GameState/Options.h" +#include "SmallButton.h" +#include "SlideButton.h" +#include "../Options.h" #include "ControlsScreen.h" #include "VideoSettingsScreen.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" OptionsScreen::OptionsScreen(Screen* lastScreen, Options* options) { title = L"Options"; // 4J added diff --git a/Minecraft.Client/UI/Screens/OptionsScreen.h b/Minecraft.Client/net/minecraft/client/gui/OptionsScreen.h similarity index 95% rename from Minecraft.Client/UI/Screens/OptionsScreen.h rename to Minecraft.Client/net/minecraft/client/gui/OptionsScreen.h index 509162eff..8019cb143 100644 --- a/Minecraft.Client/UI/Screens/OptionsScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/OptionsScreen.h @@ -1,5 +1,5 @@ #pragma once -#include "../Screen.h" +#include "Screen.h" class Options; class OptionsScreen : public Screen { diff --git a/Minecraft.Client/UI/Screens/PauseScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/PauseScreen.cpp similarity index 86% rename from Minecraft.Client/UI/Screens/PauseScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/PauseScreen.cpp index 11dd9e84a..020fe21ed 100644 --- a/Minecraft.Client/UI/Screens/PauseScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/PauseScreen.cpp @@ -1,17 +1,17 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "PauseScreen.h" -#include "../Button.h" -#include "../../GameState/StatsCounter.h" +#include "Button.h" +#include "../../stats/StatsCounter.h" #include "MessageScreen.h" #include "OptionsScreen.h" -#include "TitleScreen.h" -#include "../../Level/MultiPlayerLevel.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Headers/net.minecraft.stats.h" -#include "../../Player/LocalPlayer.h" -#include "../../Player/MultiPlayerLocalPlayer.h" -#include "../../MinecraftServer.h" +#include "../title/TitleScreen.h" +#include "../multiplayer/MultiPlayerLevel.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/stats/net.minecraft.stats.h" +#include "../player/LocalPlayer.h" +#include "../multiplayer/MultiPlayerLocalPlayer.h" +#include "../../server/MinecraftServer.h" PauseScreen::PauseScreen() { saveStep = 0; diff --git a/Minecraft.Client/UI/Screens/PauseScreen.h b/Minecraft.Client/net/minecraft/client/gui/PauseScreen.h similarity index 95% rename from Minecraft.Client/UI/Screens/PauseScreen.h rename to Minecraft.Client/net/minecraft/client/gui/PauseScreen.h index ef67c9f14..8b69dadaf 100644 --- a/Minecraft.Client/UI/Screens/PauseScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/PauseScreen.h @@ -1,5 +1,5 @@ #pragma once -#include "../Screen.h" +#include "Screen.h" class PauseScreen : public Screen { private: diff --git a/Minecraft.Client/UI/Screens/RenameWorldScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/RenameWorldScreen.cpp similarity index 82% rename from Minecraft.Client/UI/Screens/RenameWorldScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/RenameWorldScreen.cpp index 5448489a5..911c58211 100644 --- a/Minecraft.Client/UI/Screens/RenameWorldScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/RenameWorldScreen.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "RenameWorldScreen.h" -#include "../EditBox.h" -#include "../Button.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.storage.h" +#include "EditBox.h" +#include "Button.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h" RenameWorldScreen::RenameWorldScreen(Screen* lastScreen, const std::wstring& levelId) { diff --git a/Minecraft.Client/UI/Screens/RenameWorldScreen.h b/Minecraft.Client/net/minecraft/client/gui/RenameWorldScreen.h similarity index 96% rename from Minecraft.Client/UI/Screens/RenameWorldScreen.h rename to Minecraft.Client/net/minecraft/client/gui/RenameWorldScreen.h index 11f5ed41d..dc8f356b1 100644 --- a/Minecraft.Client/UI/Screens/RenameWorldScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/RenameWorldScreen.h @@ -1,5 +1,5 @@ #pragma once -#include "../Screen.h" +#include "Screen.h" class Button; class EditBox; diff --git a/Minecraft.Client/UI/Screens/RepairScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/RepairScreen.cpp similarity index 92% rename from Minecraft.Client/UI/Screens/RepairScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/RepairScreen.cpp index 54b18362b..7f253586d 100644 --- a/Minecraft.Client/UI/Screens/RepairScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/RepairScreen.cpp @@ -1,17 +1,17 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "RepairScreen.h" #include #include #include -#include "../EditBox.h" -#include "../../Player/MultiPlayerLocalPlayer.h" -#include "../../Rendering/Lighting.h" -#include "../../Textures/Textures.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../../../Minecraft.World/Containers/AnvilMenu.h" -#include "../../../Minecraft.World/Containers/Slot.h" -#include "../../../Minecraft.Client/Network/ClientConnection.h" -#include "../../../Minecraft.Client/Minecraft.h" +#include "EditBox.h" +#include "../multiplayer/MultiPlayerLocalPlayer.h" +#include "../Lighting.h" +#include "../renderer/Textures.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/AnvilMenu.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/Slot.h" +#include "../multiplayer/ClientConnection.h" +#include "../Minecraft.h" // 4jcraft: referenced from MCP 8.11 (JE 1.6.4) and the existing // IUIScene_AnvilMenu (from iggy UI) diff --git a/Minecraft.Client/UI/Screens/RepairScreen.h b/Minecraft.Client/net/minecraft/client/gui/RepairScreen.h similarity index 78% rename from Minecraft.Client/UI/Screens/RepairScreen.h rename to Minecraft.Client/net/minecraft/client/gui/RepairScreen.h index b5352a939..e8f6d740b 100644 --- a/Minecraft.Client/UI/Screens/RepairScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/RepairScreen.h @@ -1,9 +1,9 @@ #pragma once -#include "../../Platform/stdafx.h" -#include "AbstractContainerScreen.h" -#include "../../../Minecraft.World/Containers/AnvilMenu.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.inventory.ContainerListener.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "inventory/AbstractContainerScreen.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/AnvilMenu.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.ContainerListener.h" class EditBox; diff --git a/Minecraft.Client/UI/Screen.cpp b/Minecraft.Client/net/minecraft/client/gui/Screen.cpp similarity index 96% rename from Minecraft.Client/UI/Screen.cpp rename to Minecraft.Client/net/minecraft/client/gui/Screen.cpp index 210bd242f..a3c23390a 100644 --- a/Minecraft.Client/UI/Screen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/Screen.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "Screen.h" #include "Button.h" -#include "../Rendering/Particles/GuiParticles.h" -#include "../Rendering/Tesselator.h" -#include "../Textures/Textures.h" -#include "../../Minecraft.World/Util/SoundTypes.h" +#include "particle/GuiParticles.h" +#include "../renderer/Tesselator.h" +#include "../renderer/Textures.h" +#include "../../../../../Minecraft.World/Header Files/SoundTypes.h" Screen::Screen() // 4J added { diff --git a/Minecraft.Client/UI/Screen.h b/Minecraft.Client/net/minecraft/client/gui/Screen.h similarity index 100% rename from Minecraft.Client/UI/Screen.h rename to Minecraft.Client/net/minecraft/client/gui/Screen.h diff --git a/Minecraft.Client/UI/ScreenSizeCalculator.cpp b/Minecraft.Client/net/minecraft/client/gui/ScreenSizeCalculator.cpp similarity index 90% rename from Minecraft.Client/UI/ScreenSizeCalculator.cpp rename to Minecraft.Client/net/minecraft/client/gui/ScreenSizeCalculator.cpp index 611287552..ada56e7b5 100644 --- a/Minecraft.Client/UI/ScreenSizeCalculator.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/ScreenSizeCalculator.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ScreenSizeCalculator.h" -#include "../GameState/Options.h" +#include "../Options.h" // who the fuck thought this was a good idea ScreenSizeCalculator::ScreenSizeCalculator(Options* options, int width, diff --git a/Minecraft.Client/UI/ScreenSizeCalculator.h b/Minecraft.Client/net/minecraft/client/gui/ScreenSizeCalculator.h similarity index 100% rename from Minecraft.Client/UI/ScreenSizeCalculator.h rename to Minecraft.Client/net/minecraft/client/gui/ScreenSizeCalculator.h diff --git a/Minecraft.Client/UI/ScrolledSelectionList.cpp b/Minecraft.Client/net/minecraft/client/gui/ScrolledSelectionList.cpp similarity index 93% rename from Minecraft.Client/UI/ScrolledSelectionList.cpp rename to Minecraft.Client/net/minecraft/client/gui/ScrolledSelectionList.cpp index c91d92f64..1e3a245d2 100644 --- a/Minecraft.Client/UI/ScrolledSelectionList.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/ScrolledSelectionList.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ScrolledSelectionList.h" #include "Button.h" -#include "../Rendering/Tesselator.h" -#include "../Textures/Textures.h" -#include "../../Minecraft.World/Platform/System.h" +#include "../renderer/Tesselator.h" +#include "../renderer/Textures.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/System.h" ScrolledSelectionList::ScrolledSelectionList(Minecraft* minecraft, int width, int height, int y0, int y1, diff --git a/Minecraft.Client/UI/ScrolledSelectionList.h b/Minecraft.Client/net/minecraft/client/gui/ScrolledSelectionList.h similarity index 100% rename from Minecraft.Client/UI/ScrolledSelectionList.h rename to Minecraft.Client/net/minecraft/client/gui/ScrolledSelectionList.h diff --git a/Minecraft.Client/UI/Screens/SelectWorldScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/SelectWorldScreen.cpp similarity index 96% rename from Minecraft.Client/UI/Screens/SelectWorldScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/SelectWorldScreen.cpp index 150df4da6..d005cb28c 100644 --- a/Minecraft.Client/UI/Screens/SelectWorldScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/SelectWorldScreen.cpp @@ -1,13 +1,13 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "SelectWorldScreen.h" -#include "../Button.h" +#include "Button.h" #include "ConfirmScreen.h" #include "CreateWorldScreen.h" #include "RenameWorldScreen.h" -#include "../../GameState/DemoMode.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.storage.h" +#include "../../server/level/DemoMode.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h" SelectWorldScreen::SelectWorldScreen(Screen* lastScreen) { // 4J - added initialisers diff --git a/Minecraft.Client/UI/Screens/SelectWorldScreen.h b/Minecraft.Client/net/minecraft/client/gui/SelectWorldScreen.h similarity index 97% rename from Minecraft.Client/UI/Screens/SelectWorldScreen.h rename to Minecraft.Client/net/minecraft/client/gui/SelectWorldScreen.h index 39b56c32f..0012b5879 100644 --- a/Minecraft.Client/UI/Screens/SelectWorldScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/SelectWorldScreen.h @@ -1,6 +1,6 @@ #pragma once -#include "../Screen.h" -#include "../ScrolledSelectionList.h" +#include "Screen.h" +#include "ScrolledSelectionList.h" class LevelSummary; class Button; class Tesselator; diff --git a/Minecraft.Client/UI/SlideButton.cpp b/Minecraft.Client/net/minecraft/client/gui/SlideButton.cpp similarity index 95% rename from Minecraft.Client/UI/SlideButton.cpp rename to Minecraft.Client/net/minecraft/client/gui/SlideButton.cpp index a82956f67..4c5e7b41b 100644 --- a/Minecraft.Client/UI/SlideButton.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/SlideButton.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "SlideButton.h" SlideButton::SlideButton(int id, int x, int y, const Options::Option* option, diff --git a/Minecraft.Client/UI/SlideButton.h b/Minecraft.Client/net/minecraft/client/gui/SlideButton.h similarity index 94% rename from Minecraft.Client/UI/SlideButton.h rename to Minecraft.Client/net/minecraft/client/gui/SlideButton.h index f2db25366..91db3302c 100644 --- a/Minecraft.Client/UI/SlideButton.h +++ b/Minecraft.Client/net/minecraft/client/gui/SlideButton.h @@ -1,6 +1,6 @@ #pragma once #include "Button.h" -#include "../GameState/Options.h" +#include "../Options.h" class Minecraft; class SlideButton : public Button { diff --git a/Minecraft.Client/UI/SmallButton.cpp b/Minecraft.Client/net/minecraft/client/gui/SmallButton.cpp similarity index 90% rename from Minecraft.Client/UI/SmallButton.cpp rename to Minecraft.Client/net/minecraft/client/gui/SmallButton.cpp index 4b7a05612..52d160508 100644 --- a/Minecraft.Client/UI/SmallButton.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/SmallButton.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "SmallButton.h" SmallButton::SmallButton(int id, int x, int y, const std::wstring& msg) diff --git a/Minecraft.Client/UI/SmallButton.h b/Minecraft.Client/net/minecraft/client/gui/SmallButton.h similarity index 92% rename from Minecraft.Client/UI/SmallButton.h rename to Minecraft.Client/net/minecraft/client/gui/SmallButton.h index 2638c60a9..6d68d0513 100644 --- a/Minecraft.Client/UI/SmallButton.h +++ b/Minecraft.Client/net/minecraft/client/gui/SmallButton.h @@ -1,6 +1,6 @@ #pragma once #include "Button.h" -#include "../GameState/Options.h" +#include "../Options.h" class SmallButton : public Button { private: diff --git a/Minecraft.Client/UI/TradeSwitchButton.cpp b/Minecraft.Client/net/minecraft/client/gui/TradeSwitchButton.cpp similarity index 74% rename from Minecraft.Client/UI/TradeSwitchButton.cpp rename to Minecraft.Client/net/minecraft/client/gui/TradeSwitchButton.cpp index 860a2c43f..ac7dc4e04 100644 --- a/Minecraft.Client/UI/TradeSwitchButton.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/TradeSwitchButton.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "TradeSwitchButton.h" -#include "../Textures/Textures.h" -#include "../Rendering/Tesselator.h" -#include "../../../Minecraft.Client/Minecraft.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../../../Minecraft.World/Containers/MerchantMenu.h" +#include "../renderer/Textures.h" +#include "../renderer/Tesselator.h" +#include "../Minecraft.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/MerchantMenu.h" // 4jcraft: referenced from MCP 8.11 (JE 1.6.4) #ifdef ENABLE_JAVA_GUIS diff --git a/Minecraft.Client/UI/TradeSwitchButton.h b/Minecraft.Client/net/minecraft/client/gui/TradeSwitchButton.h similarity index 100% rename from Minecraft.Client/UI/TradeSwitchButton.h rename to Minecraft.Client/net/minecraft/client/gui/TradeSwitchButton.h diff --git a/Minecraft.Client/UI/Screens/VideoSettingsScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/VideoSettingsScreen.cpp similarity index 92% rename from Minecraft.Client/UI/Screens/VideoSettingsScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/VideoSettingsScreen.cpp index bab30504c..d6e19e2a2 100644 --- a/Minecraft.Client/UI/Screens/VideoSettingsScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/VideoSettingsScreen.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "VideoSettingsScreen.h" -#include "../SmallButton.h" -#include "../SlideButton.h" -#include "../../GameState/Options.h" +#include "SmallButton.h" +#include "SlideButton.h" +#include "../Options.h" #include "ControlsScreen.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" // 4jcraft #define ITEM_COUNT 10 diff --git a/Minecraft.Client/UI/Screens/VideoSettingsScreen.h b/Minecraft.Client/net/minecraft/client/gui/VideoSettingsScreen.h similarity index 94% rename from Minecraft.Client/UI/Screens/VideoSettingsScreen.h rename to Minecraft.Client/net/minecraft/client/gui/VideoSettingsScreen.h index bbeb74698..e4aa2189b 100644 --- a/Minecraft.Client/UI/Screens/VideoSettingsScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/VideoSettingsScreen.h @@ -1,5 +1,5 @@ #pragma once -#include "../Screen.h" +#include "Screen.h" class Options; class VideoSettingsScreen : public Screen { diff --git a/Minecraft.Client/UI/Screens/AchievementPopup.cpp b/Minecraft.Client/net/minecraft/client/gui/achievement/AchievementPopup.cpp similarity index 87% rename from Minecraft.Client/UI/Screens/AchievementPopup.cpp rename to Minecraft.Client/net/minecraft/client/gui/achievement/AchievementPopup.cpp index 7e4ef16b3..cfc3d3865 100644 --- a/Minecraft.Client/UI/Screens/AchievementPopup.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/achievement/AchievementPopup.cpp @@ -1,13 +1,13 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "AchievementPopup.h" -#include "../../Rendering/EntityRenderers/ItemRenderer.h" +#include "../../renderer/entity/ItemRenderer.h" #include "../Font.h" -#include "../../Textures/Textures.h" -#include "../../Rendering/Lighting.h" -#include "../../../Minecraft.World/Platform/System.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../../../Minecraft.World/Headers/net.minecraft.stats.h" -#include "../../../Minecraft.World/Util/SharedConstants.h" +#include "../../renderer/Textures.h" +#include "../../Lighting.h" +#include "../../../../../../Minecraft.World/ConsoleJavaLibs/System.h" +#include "../../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../../../../../Minecraft.World/net/minecraft/stats/net.minecraft.stats.h" +#include "../../../../../../Minecraft.World/net/minecraft/SharedConstants.h" AchievementPopup::AchievementPopup(Minecraft* mc) { // 4J - added initialisers diff --git a/Minecraft.Client/UI/Screens/AchievementPopup.h b/Minecraft.Client/net/minecraft/client/gui/achievement/AchievementPopup.h similarity index 100% rename from Minecraft.Client/UI/Screens/AchievementPopup.h rename to Minecraft.Client/net/minecraft/client/gui/achievement/AchievementPopup.h diff --git a/Minecraft.Client/UI/Screens/AchievementScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/achievement/AchievementScreen.cpp similarity index 87% rename from Minecraft.Client/UI/Screens/AchievementScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/achievement/AchievementScreen.cpp index 4754bcbbb..3e85bd6eb 100644 --- a/Minecraft.Client/UI/Screens/AchievementScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/achievement/AchievementScreen.cpp @@ -1,17 +1,17 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "AchievementScreen.h" #include "../SmallButton.h" -#include "../../GameState/Options.h" -#include "../../Input/KeyMapping.h" +#include "../../Options.h" +#include "../../KeyMapping.h" #include "../Font.h" -#include "../../Rendering/Lighting.h" -#include "../../Textures/Textures.h" -#include "../../GameState/StatsCounter.h" -#include "../../Rendering/EntityRenderers/ItemRenderer.h" -#include "../../../Minecraft.World/Platform/System.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Util/JavaMath.h" +#include "../../Lighting.h" +#include "../../renderer/Textures.h" +#include "../../../stats/StatsCounter.h" +#include "../../renderer/entity/ItemRenderer.h" +#include "../../../../../../Minecraft.World/ConsoleJavaLibs/System.h" +#include "../../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" AchievementScreen::AchievementScreen(StatsCounter* statsCounter) { // 4J - added initialisers diff --git a/Minecraft.Client/UI/Screens/AchievementScreen.h b/Minecraft.Client/net/minecraft/client/gui/achievement/AchievementScreen.h similarity index 94% rename from Minecraft.Client/UI/Screens/AchievementScreen.h rename to Minecraft.Client/net/minecraft/client/gui/achievement/AchievementScreen.h index 9c8a1223d..7c9aa42a8 100644 --- a/Minecraft.Client/UI/Screens/AchievementScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/achievement/AchievementScreen.h @@ -1,6 +1,6 @@ #pragma once #include "../Screen.h" -#include "../../../Minecraft.World/Headers/net.minecraft.stats.h" +#include "../../../../../../Minecraft.World/net/minecraft/stats/net.minecraft.stats.h" class StatsCounter; class AchievementScreen : public Screen { diff --git a/Minecraft.Client/UI/Screens/StatsScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/achievement/StatsScreen.cpp similarity index 97% rename from Minecraft.Client/UI/Screens/StatsScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/achievement/StatsScreen.cpp index de2cdf9c8..8024390bb 100644 --- a/Minecraft.Client/UI/Screens/StatsScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/achievement/StatsScreen.cpp @@ -1,13 +1,13 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "StatsScreen.h" -#include "../../GameState/StatsCounter.h" -#include "../../Rendering/EntityRenderers/ItemRenderer.h" +#include "../../../stats/StatsCounter.h" +#include "../../renderer/entity/ItemRenderer.h" #include "../Button.h" #include "../Font.h" -#include "../../Rendering/Lighting.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../../../Minecraft.World/Headers/net.minecraft.stats.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" +#include "../../Lighting.h" +#include "../../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../../../../../Minecraft.World/net/minecraft/stats/net.minecraft.stats.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" const float StatsScreen::SLOT_TEX_SIZE = 128.0f; ItemRenderer* StatsScreen::itemRenderer = nullptr; diff --git a/Minecraft.Client/UI/Screens/StatsScreen.h b/Minecraft.Client/net/minecraft/client/gui/achievement/StatsScreen.h similarity index 100% rename from Minecraft.Client/UI/Screens/StatsScreen.h rename to Minecraft.Client/net/minecraft/client/gui/achievement/StatsScreen.h diff --git a/Minecraft.Client/UI/AbstractBeaconButton.cpp b/Minecraft.Client/net/minecraft/client/gui/inventory/AbstractBeaconButton.cpp similarity index 88% rename from Minecraft.Client/UI/AbstractBeaconButton.cpp rename to Minecraft.Client/net/minecraft/client/gui/inventory/AbstractBeaconButton.cpp index 92b49e881..4a4d95c74 100644 --- a/Minecraft.Client/UI/AbstractBeaconButton.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/AbstractBeaconButton.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "AbstractBeaconButton.h" -#include "../Textures/Textures.h" -#include "../../../Minecraft.Client/Minecraft.h" +#include "../../renderer/Textures.h" +#include "../../Minecraft.h" #include // 4jcraft: referenced from MCP 8.11 (JE 1.6.4) diff --git a/Minecraft.Client/UI/AbstractBeaconButton.h b/Minecraft.Client/net/minecraft/client/gui/inventory/AbstractBeaconButton.h similarity index 95% rename from Minecraft.Client/UI/AbstractBeaconButton.h rename to Minecraft.Client/net/minecraft/client/gui/inventory/AbstractBeaconButton.h index 3254f4912..9b7601aa3 100644 --- a/Minecraft.Client/UI/AbstractBeaconButton.h +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/AbstractBeaconButton.h @@ -1,5 +1,5 @@ #pragma once -#include "Button.h" +#include "../Button.h" class ResourceLocation; diff --git a/Minecraft.Client/UI/Screens/AbstractContainerScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/inventory/AbstractContainerScreen.cpp similarity index 95% rename from Minecraft.Client/UI/Screens/AbstractContainerScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/inventory/AbstractContainerScreen.cpp index 6222807b9..5f991d465 100644 --- a/Minecraft.Client/UI/Screens/AbstractContainerScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/AbstractContainerScreen.cpp @@ -1,14 +1,14 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "AbstractContainerScreen.h" -#include "../../Rendering/EntityRenderers/ItemRenderer.h" -#include "../../Player/MultiPlayerLocalPlayer.h" -#include "../../Rendering/Lighting.h" -#include "../../GameState/GameMode.h" -#include "../../Input/KeyMapping.h" -#include "../../GameState/Options.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" +#include "../../renderer/entity/ItemRenderer.h" +#include "../../multiplayer/MultiPlayerLocalPlayer.h" +#include "../../Lighting.h" +#include "../../../server/level/GameMode.h" +#include "../../KeyMapping.h" +#include "../../Options.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" ItemRenderer* AbstractContainerScreen::itemRenderer = new ItemRenderer(); diff --git a/Minecraft.Client/UI/Screens/AbstractContainerScreen.h b/Minecraft.Client/net/minecraft/client/gui/inventory/AbstractContainerScreen.h similarity index 100% rename from Minecraft.Client/UI/Screens/AbstractContainerScreen.h rename to Minecraft.Client/net/minecraft/client/gui/inventory/AbstractContainerScreen.h diff --git a/Minecraft.Client/UI/BeaconCancelButton.cpp b/Minecraft.Client/net/minecraft/client/gui/inventory/BeaconCancelButton.cpp similarity index 78% rename from Minecraft.Client/UI/BeaconCancelButton.cpp rename to Minecraft.Client/net/minecraft/client/gui/inventory/BeaconCancelButton.cpp index 081029e4c..2176560f6 100644 --- a/Minecraft.Client/UI/BeaconCancelButton.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/BeaconCancelButton.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "BeaconCancelButton.h" -#include "Screens/BeaconScreen.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" +#include "BeaconScreen.h" +#include "../../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" // 4jcraft: referenced from MCP 8.11 (JE 1.6.4) #ifdef ENABLE_JAVA_GUIS diff --git a/Minecraft.Client/UI/BeaconCancelButton.h b/Minecraft.Client/net/minecraft/client/gui/inventory/BeaconCancelButton.h similarity index 100% rename from Minecraft.Client/UI/BeaconCancelButton.h rename to Minecraft.Client/net/minecraft/client/gui/inventory/BeaconCancelButton.h diff --git a/Minecraft.Client/UI/BeaconConfirmButton.cpp b/Minecraft.Client/net/minecraft/client/gui/inventory/BeaconConfirmButton.cpp similarity index 78% rename from Minecraft.Client/UI/BeaconConfirmButton.cpp rename to Minecraft.Client/net/minecraft/client/gui/inventory/BeaconConfirmButton.cpp index 00871f6e1..43bee5cf1 100644 --- a/Minecraft.Client/UI/BeaconConfirmButton.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/BeaconConfirmButton.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "BeaconConfirmButton.h" -#include "Screens/BeaconScreen.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" +#include "BeaconScreen.h" +#include "../../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" // 4jcraft: referenced from MCP 8.11 (JE 1.6.4) #ifdef ENABLE_JAVA_GUIS diff --git a/Minecraft.Client/UI/BeaconConfirmButton.h b/Minecraft.Client/net/minecraft/client/gui/inventory/BeaconConfirmButton.h similarity index 100% rename from Minecraft.Client/UI/BeaconConfirmButton.h rename to Minecraft.Client/net/minecraft/client/gui/inventory/BeaconConfirmButton.h diff --git a/Minecraft.Client/UI/BeaconPowerButton.cpp b/Minecraft.Client/net/minecraft/client/gui/inventory/BeaconPowerButton.cpp similarity index 74% rename from Minecraft.Client/UI/BeaconPowerButton.cpp rename to Minecraft.Client/net/minecraft/client/gui/inventory/BeaconPowerButton.cpp index 958badfe7..a2aa4192e 100644 --- a/Minecraft.Client/UI/BeaconPowerButton.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/BeaconPowerButton.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "BeaconPowerButton.h" -#include "Screens/BeaconScreen.h" -#include "../../../Minecraft.World/Entities/MobEffect.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../Textures/Textures.h" -#include "Textures/ResourceLocation.h" +#include "BeaconScreen.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/effect/MobEffect.h" +#include "../../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../renderer/Textures.h" +#include "../../resources/ResourceLocation.h" // 4jcraft: referenced from MCP 8.11 (JE 1.6.4) #ifdef ENABLE_JAVA_GUIS diff --git a/Minecraft.Client/UI/BeaconPowerButton.h b/Minecraft.Client/net/minecraft/client/gui/inventory/BeaconPowerButton.h similarity index 80% rename from Minecraft.Client/UI/BeaconPowerButton.h rename to Minecraft.Client/net/minecraft/client/gui/inventory/BeaconPowerButton.h index fc6e40266..e91acbc1f 100644 --- a/Minecraft.Client/UI/BeaconPowerButton.h +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/BeaconPowerButton.h @@ -1,6 +1,6 @@ #pragma once #include "AbstractBeaconButton.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.effect.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/effect/net.minecraft.world.effect.h" class BeaconScreen; diff --git a/Minecraft.Client/UI/Screens/BeaconScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/inventory/BeaconScreen.cpp similarity index 90% rename from Minecraft.Client/UI/Screens/BeaconScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/inventory/BeaconScreen.cpp index d44378d83..8023681c8 100644 --- a/Minecraft.Client/UI/Screens/BeaconScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/BeaconScreen.cpp @@ -1,20 +1,20 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "BeaconScreen.h" -#include "../BeaconConfirmButton.h" -#include "../BeaconCancelButton.h" -#include "../BeaconPowerButton.h" +#include "BeaconConfirmButton.h" +#include "BeaconCancelButton.h" +#include "BeaconPowerButton.h" #include #include -#include "../../Player/MultiPlayerLocalPlayer.h" -#include "../../Rendering/Lighting.h" -#include "../../Textures/Textures.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../../../Minecraft.World/Containers/Slot.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../../Minecraft.Client/Minecraft.h" -#include "../../../Minecraft.Client/Network/ClientConnection.h" -#include "../../../Minecraft.World/IO/Streams/ByteArrayOutputStream.h" -#include "../../../Minecraft.World/IO/Streams/DataOutputStream.h" +#include "../../multiplayer/MultiPlayerLocalPlayer.h" +#include "../../Lighting.h" +#include "../../renderer/Textures.h" +#include "../../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/inventory/Slot.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../Minecraft.h" +#include "../../multiplayer/ClientConnection.h" +#include "../../../../../../Minecraft.World/ConsoleJavaLibs/InputOutputStream/ByteArrayOutputStream.h" +#include "../../../../../../Minecraft.World/ConsoleJavaLibs/InputOutputStream/DataOutputStream.h" // 4jcraft: referenced from MCP 8.11 (JE 1.6.4) and the existing // container classes (and iggy too) diff --git a/Minecraft.Client/UI/Screens/BeaconScreen.h b/Minecraft.Client/net/minecraft/client/gui/inventory/BeaconScreen.h similarity index 79% rename from Minecraft.Client/UI/Screens/BeaconScreen.h rename to Minecraft.Client/net/minecraft/client/gui/inventory/BeaconScreen.h index 03a9db927..d57427873 100644 --- a/Minecraft.Client/UI/Screens/BeaconScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/BeaconScreen.h @@ -1,8 +1,8 @@ #pragma once #include "AbstractContainerScreen.h" -#include "../../../Minecraft.World/Containers/BeaconMenu.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/inventory/BeaconMenu.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" class BeaconConfirmButton; class BeaconCancelButton; diff --git a/Minecraft.Client/UI/Screens/BrewingStandScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/inventory/BrewingStandScreen.cpp similarity index 84% rename from Minecraft.Client/UI/Screens/BrewingStandScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/inventory/BrewingStandScreen.cpp index 1d1239c2a..0e4a793a2 100644 --- a/Minecraft.Client/UI/Screens/BrewingStandScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/BrewingStandScreen.cpp @@ -1,15 +1,15 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "BrewingStandScreen.h" #include #include #include -#include "../../Player/MultiPlayerLocalPlayer.h" -#include "../../Rendering/Lighting.h" -#include "../../Textures/Textures.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../../../Minecraft.World/Containers/BrewingStandMenu.h" -#include "../../../Minecraft.World/Containers/Slot.h" -#include "../../../Minecraft.Client/Minecraft.h" +#include "../../multiplayer/MultiPlayerLocalPlayer.h" +#include "../../Lighting.h" +#include "../../renderer/Textures.h" +#include "../../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/inventory/BrewingStandMenu.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/inventory/Slot.h" +#include "../../Minecraft.h" // 4jcraft: referenced from MCP 8.11 (JE 1.6.4) and the existing // container classes diff --git a/Minecraft.Client/UI/Screens/BrewingStandScreen.h b/Minecraft.Client/net/minecraft/client/gui/inventory/BrewingStandScreen.h similarity index 73% rename from Minecraft.Client/UI/Screens/BrewingStandScreen.h rename to Minecraft.Client/net/minecraft/client/gui/inventory/BrewingStandScreen.h index 12f834ed7..33e5761c2 100644 --- a/Minecraft.Client/UI/Screens/BrewingStandScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/BrewingStandScreen.h @@ -1,8 +1,8 @@ #pragma once #include "AbstractContainerScreen.h" -#include "../../../Minecraft.World/Containers/BrewingStandMenu.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/inventory/BrewingStandMenu.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" class BrewingStandScreen : public AbstractContainerScreen { public: diff --git a/Minecraft.Client/UI/Screens/ContainerScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/inventory/ContainerScreen.cpp similarity index 82% rename from Minecraft.Client/UI/Screens/ContainerScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/inventory/ContainerScreen.cpp index 9e073a6e6..2784baa73 100644 --- a/Minecraft.Client/UI/Screens/ContainerScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/ContainerScreen.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "ContainerScreen.h" -#include "../../Textures/Textures.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.inventory.h" +#include "../../renderer/Textures.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" ContainerScreen::ContainerScreen(std::shared_ptr inventory, std::shared_ptr container) diff --git a/Minecraft.Client/UI/Screens/ContainerScreen.h b/Minecraft.Client/net/minecraft/client/gui/inventory/ContainerScreen.h similarity index 100% rename from Minecraft.Client/UI/Screens/ContainerScreen.h rename to Minecraft.Client/net/minecraft/client/gui/inventory/ContainerScreen.h diff --git a/Minecraft.Client/UI/Screens/CraftingScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/inventory/CraftingScreen.cpp similarity index 75% rename from Minecraft.Client/UI/Screens/CraftingScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/inventory/CraftingScreen.cpp index 666c66878..31a2089bb 100644 --- a/Minecraft.Client/UI/Screens/CraftingScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/CraftingScreen.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "CraftingScreen.h" -#include "../../Textures/Textures.h" -#include "../../Player/MultiPlayerLocalPlayer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.inventory.h" +#include "../../renderer/Textures.h" +#include "../../multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" #ifdef ENABLE_JAVA_GUIS ResourceLocation GUI_CRAFTING_LOCATION = ResourceLocation(TN_GUI_CRAFTING); diff --git a/Minecraft.Client/UI/Screens/CraftingScreen.h b/Minecraft.Client/net/minecraft/client/gui/inventory/CraftingScreen.h similarity index 100% rename from Minecraft.Client/UI/Screens/CraftingScreen.h rename to Minecraft.Client/net/minecraft/client/gui/inventory/CraftingScreen.h diff --git a/Minecraft.Client/UI/Screens/CreativeInventoryScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/inventory/CreativeInventoryScreen.cpp similarity index 95% rename from Minecraft.Client/UI/Screens/CreativeInventoryScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/inventory/CreativeInventoryScreen.cpp index 741835b54..6d6f30609 100644 --- a/Minecraft.Client/UI/Screens/CreativeInventoryScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/CreativeInventoryScreen.cpp @@ -1,16 +1,16 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "CreativeInventoryScreen.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../../Minecraft.World/Containers/Inventory.h" -#include "../../../Minecraft.World/Containers/SimpleContainer.h" -#include "../../../Minecraft.World/Containers/Slot.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/player/Inventory.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/SimpleContainer.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/inventory/Slot.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" #include "../../Minecraft.h" -#include "../../Textures/Textures.h" -#include "../../Rendering/EntityRenderers/ItemRenderer.h" -#include "../../Rendering/Lighting.h" -#include "../../../Minecraft.World/Containers/InventoryMenu.h" +#include "../../renderer/Textures.h" +#include "../../renderer/entity/ItemRenderer.h" +#include "../../Lighting.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/inventory/InventoryMenu.h" #include #include diff --git a/Minecraft.Client/UI/Screens/CreativeInventoryScreen.h b/Minecraft.Client/net/minecraft/client/gui/inventory/CreativeInventoryScreen.h similarity index 92% rename from Minecraft.Client/UI/Screens/CreativeInventoryScreen.h rename to Minecraft.Client/net/minecraft/client/gui/inventory/CreativeInventoryScreen.h index e8fd36877..2f6b7df36 100644 --- a/Minecraft.Client/UI/Screens/CreativeInventoryScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/CreativeInventoryScreen.h @@ -1,8 +1,8 @@ #pragma once #include "AbstractContainerScreen.h" -#include "../../../Minecraft.World/Containers/AbstractContainerMenu.h" -#include "../../Platform/Common/UI/IUIScene_CreativeMenu.h" -#include "../../Player/MultiPlayerLocalPlayer.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/inventory/AbstractContainerMenu.h" +#include "../../../../../Common/Source Files/UI/All Platforms/IUIScene_CreativeMenu.h" +#include "../../multiplayer/MultiPlayerLocalPlayer.h" class Player; class SimpleContainer; diff --git a/Minecraft.Client/UI/Screens/FurnaceScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/inventory/FurnaceScreen.cpp similarity index 76% rename from Minecraft.Client/UI/Screens/FurnaceScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/inventory/FurnaceScreen.cpp index 170aedb61..eb2469ab5 100644 --- a/Minecraft.Client/UI/Screens/FurnaceScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/FurnaceScreen.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "FurnaceScreen.h" -#include "../../Textures/Textures.h" -#include "../../Player/LocalPlayer.h" +#include "../../renderer/Textures.h" +#include "../../player/LocalPlayer.h" #include "../Font.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../../Minecraft.World/Blocks/TileEntities/FurnaceTileEntity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/FurnaceTileEntity.h" #ifdef ENABLE_JAVA_GUIS ResourceLocation GUI_FURNACE_LOCATION = ResourceLocation(TN_GUI_FURNACE); diff --git a/Minecraft.Client/UI/Screens/FurnaceScreen.h b/Minecraft.Client/net/minecraft/client/gui/inventory/FurnaceScreen.h similarity index 100% rename from Minecraft.Client/UI/Screens/FurnaceScreen.h rename to Minecraft.Client/net/minecraft/client/gui/inventory/FurnaceScreen.h diff --git a/Minecraft.Client/UI/Screens/HorseInventoryScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/inventory/HorseInventoryScreen.cpp similarity index 86% rename from Minecraft.Client/UI/Screens/HorseInventoryScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/inventory/HorseInventoryScreen.cpp index f6de569c9..23a7727ae 100644 --- a/Minecraft.Client/UI/Screens/HorseInventoryScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/HorseInventoryScreen.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "HorseInventoryScreen.h" -#include "../../Player/MultiPlayerLocalPlayer.h" -#include "../../Rendering/EntityRenderers/EntityRenderDispatcher.h" -#include "../../Rendering/Lighting.h" -#include "../../Textures/Textures.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../../../Minecraft.World/Containers/HorseInventoryMenu.h" +#include "../../multiplayer/MultiPlayerLocalPlayer.h" +#include "../../renderer/entity/EntityRenderDispatcher.h" +#include "../../Lighting.h" +#include "../../renderer/Textures.h" +#include "../../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/inventory/HorseInventoryMenu.h" // 4jcraft: referenced from MCP 8.11 (JE 1.6.4) and the existing InventoryScreen #ifdef ENABLE_JAVA_GUIS diff --git a/Minecraft.Client/UI/Screens/HorseInventoryScreen.h b/Minecraft.Client/net/minecraft/client/gui/inventory/HorseInventoryScreen.h similarity index 85% rename from Minecraft.Client/UI/Screens/HorseInventoryScreen.h rename to Minecraft.Client/net/minecraft/client/gui/inventory/HorseInventoryScreen.h index 12b0e68a2..fcf508719 100644 --- a/Minecraft.Client/UI/Screens/HorseInventoryScreen.h +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/HorseInventoryScreen.h @@ -1,7 +1,7 @@ #pragma once #include #include "AbstractContainerScreen.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" class HorseInventoryScreen : public AbstractContainerScreen { public: diff --git a/Minecraft.Client/UI/Screens/InventoryScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/inventory/InventoryScreen.cpp similarity index 87% rename from Minecraft.Client/UI/Screens/InventoryScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/inventory/InventoryScreen.cpp index f4dccf4f6..0573dbc1c 100644 --- a/Minecraft.Client/UI/Screens/InventoryScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/InventoryScreen.cpp @@ -1,14 +1,14 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "InventoryScreen.h" -#include "../../Player/MultiPlayerLocalPlayer.h" +#include "../../multiplayer/MultiPlayerLocalPlayer.h" #include "../Font.h" -#include "../../Rendering/EntityRenderers/EntityRenderDispatcher.h" -#include "../../Rendering/Lighting.h" -#include "../../Textures/Textures.h" +#include "../../renderer/entity/EntityRenderDispatcher.h" +#include "../../Lighting.h" +#include "../../renderer/Textures.h" #include "../Button.h" -#include "AchievementScreen.h" -#include "StatsScreen.h" -#include "../../../Minecraft.World/Headers/net.minecraft.stats.h" +#include "../achievement/AchievementScreen.h" +#include "../achievement/StatsScreen.h" +#include "../../../../../../Minecraft.World/net/minecraft/stats/net.minecraft.stats.h" InventoryScreen::InventoryScreen(std::shared_ptr player) : AbstractContainerScreen(player->inventoryMenu) { diff --git a/Minecraft.Client/UI/Screens/InventoryScreen.h b/Minecraft.Client/net/minecraft/client/gui/inventory/InventoryScreen.h similarity index 100% rename from Minecraft.Client/UI/Screens/InventoryScreen.h rename to Minecraft.Client/net/minecraft/client/gui/inventory/InventoryScreen.h diff --git a/Minecraft.Client/UI/Screens/TextEditScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/inventory/TextEditScreen.cpp similarity index 78% rename from Minecraft.Client/UI/Screens/TextEditScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/inventory/TextEditScreen.cpp index 3e9053710..4c0480fec 100644 --- a/Minecraft.Client/UI/Screens/TextEditScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/TextEditScreen.cpp @@ -1,14 +1,14 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "TextEditScreen.h" #include "../Button.h" -#include "../../Rendering/EntityRenderers/TileEntityRenderDispatcher.h" -#include "../../Network/ClientConnection.h" -#include "../../Level/MultiPlayerLevel.h" -#include "../../../Minecraft.World/Blocks/TileEntities/SignTileEntity.h" -#include "../../../Minecraft.World/Util/SharedConstants.h" -#include "../../../Minecraft.World/Headers/net.minecraft.network.packet.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" +#include "../../renderer/tileentity/TileEntityRenderDispatcher.h" +#include "../../multiplayer/ClientConnection.h" +#include "../../multiplayer/MultiPlayerLevel.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/SignTileEntity.h" +#include "../../../../../../Minecraft.World/net/minecraft/SharedConstants.h" +#include "../../../../../../Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" const std::wstring TextEditScreen::allowedChars = SharedConstants::acceptableLetters; diff --git a/Minecraft.Client/UI/Screens/TextEditScreen.h b/Minecraft.Client/net/minecraft/client/gui/inventory/TextEditScreen.h similarity index 100% rename from Minecraft.Client/UI/Screens/TextEditScreen.h rename to Minecraft.Client/net/minecraft/client/gui/inventory/TextEditScreen.h diff --git a/Minecraft.Client/UI/Screens/TrapScreen.cpp b/Minecraft.Client/net/minecraft/client/gui/inventory/TrapScreen.cpp similarity index 57% rename from Minecraft.Client/UI/Screens/TrapScreen.cpp rename to Minecraft.Client/net/minecraft/client/gui/inventory/TrapScreen.cpp index bcad68240..ff9abe7a8 100644 --- a/Minecraft.Client/UI/Screens/TrapScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/inventory/TrapScreen.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "TrapScreen.h" -#include "../../Player/LocalPlayer.h" -#include "../../Textures/Textures.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../../Minecraft.World/Blocks/TileEntities/DispenserTileEntity.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.h" +#include "../../player/LocalPlayer.h" +#include "../../renderer/Textures.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/DispenserTileEntity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" #ifdef ENABLE_JAVA_GUIS ResourceLocation GUI_TRAP_LOCATION = ResourceLocation(TN_GUI_TRAP); diff --git a/Minecraft.Client/UI/Screens/TrapScreen.h b/Minecraft.Client/net/minecraft/client/gui/inventory/TrapScreen.h similarity index 100% rename from Minecraft.Client/UI/Screens/TrapScreen.h rename to Minecraft.Client/net/minecraft/client/gui/inventory/TrapScreen.h diff --git a/Minecraft.Client/Rendering/Particles/GuiParticle.cpp b/Minecraft.Client/net/minecraft/client/gui/particle/GuiParticle.cpp similarity index 88% rename from Minecraft.Client/Rendering/Particles/GuiParticle.cpp rename to Minecraft.Client/net/minecraft/client/gui/particle/GuiParticle.cpp index 85497e989..7fdc031d3 100644 --- a/Minecraft.Client/Rendering/Particles/GuiParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/particle/GuiParticle.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "GuiParticle.h" -#include "../../../Minecraft.World/Util/Random.h" +#include "../../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" Random* GuiParticle::random = new Random(); diff --git a/Minecraft.Client/Rendering/Particles/GuiParticle.h b/Minecraft.Client/net/minecraft/client/gui/particle/GuiParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/GuiParticle.h rename to Minecraft.Client/net/minecraft/client/gui/particle/GuiParticle.h diff --git a/Minecraft.Client/Rendering/Particles/GuiParticles.cpp b/Minecraft.Client/net/minecraft/client/gui/particle/GuiParticles.cpp similarity index 85% rename from Minecraft.Client/Rendering/Particles/GuiParticles.cpp rename to Minecraft.Client/net/minecraft/client/gui/particle/GuiParticles.cpp index 5a7002682..df902f590 100644 --- a/Minecraft.Client/Rendering/Particles/GuiParticles.cpp +++ b/Minecraft.Client/net/minecraft/client/gui/particle/GuiParticles.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "GuiParticles.h" #include "GuiParticle.h" -#include "../../Textures/Textures.h" +#include "../../renderer/Textures.h" GuiParticles::GuiParticles(Minecraft* mc) { this->mc = mc; } diff --git a/Minecraft.Client/Rendering/Particles/GuiParticles.h b/Minecraft.Client/net/minecraft/client/gui/particle/GuiParticles.h similarity index 89% rename from Minecraft.Client/Rendering/Particles/GuiParticles.h rename to Minecraft.Client/net/minecraft/client/gui/particle/GuiParticles.h index 4c277f4f7..f1dd8e426 100644 --- a/Minecraft.Client/Rendering/Particles/GuiParticles.h +++ b/Minecraft.Client/net/minecraft/client/gui/particle/GuiParticles.h @@ -1,5 +1,5 @@ #pragma once -#include "../../UI/GuiComponent.h" +#include "../GuiComponent.h" class GuiParticle; class Minecraft; diff --git a/Minecraft.Client/Level/DemoLevel.cpp b/Minecraft.Client/net/minecraft/client/level/DemoLevel.cpp similarity index 74% rename from Minecraft.Client/Level/DemoLevel.cpp rename to Minecraft.Client/net/minecraft/client/level/DemoLevel.cpp index 257e4d9c7..301abe131 100644 --- a/Minecraft.Client/Level/DemoLevel.cpp +++ b/Minecraft.Client/net/minecraft/client/level/DemoLevel.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "DemoLevel.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.storage.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h" LevelSettings DemoLevel::DEMO_LEVEL_SETTINGS = LevelSettings(DemoLevel::DEMO_LEVEL_SEED, GameType::SURVIVAL, false, false, diff --git a/Minecraft.Client/Level/DemoLevel.h b/Minecraft.Client/net/minecraft/client/level/DemoLevel.h similarity index 85% rename from Minecraft.Client/Level/DemoLevel.h rename to Minecraft.Client/net/minecraft/client/level/DemoLevel.h index 085e5a506..a60210a5d 100644 --- a/Minecraft.Client/Level/DemoLevel.h +++ b/Minecraft.Client/net/minecraft/client/level/DemoLevel.h @@ -1,5 +1,5 @@ #pragma once -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" class DemoLevel : public Level { private: diff --git a/Minecraft.Client/Rendering/Models/BatModel.cpp b/Minecraft.Client/net/minecraft/client/model/BatModel.cpp similarity index 93% rename from Minecraft.Client/Rendering/Models/BatModel.cpp rename to Minecraft.Client/net/minecraft/client/model/BatModel.cpp index 49c8f6d36..1dafd8ca1 100644 --- a/Minecraft.Client/Rendering/Models/BatModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/BatModel.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.ambient.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/ambient/net.minecraft.world.entity.ambient.h" #include "BatModel.h" -#include "ModelPart.h" +#include "geom/ModelPart.h" BatModel::BatModel() : Model() { texWidth = 64; diff --git a/Minecraft.Client/Rendering/Models/BatModel.h b/Minecraft.Client/net/minecraft/client/model/BatModel.h similarity index 94% rename from Minecraft.Client/Rendering/Models/BatModel.h rename to Minecraft.Client/net/minecraft/client/model/BatModel.h index e4c381147..4e58fd0da 100644 --- a/Minecraft.Client/Rendering/Models/BatModel.h +++ b/Minecraft.Client/net/minecraft/client/model/BatModel.h @@ -1,5 +1,5 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class BatModel : public Model { private: diff --git a/Minecraft.Client/Rendering/Models/BlazeModel.cpp b/Minecraft.Client/net/minecraft/client/model/BlazeModel.cpp similarity index 93% rename from Minecraft.Client/Rendering/Models/BlazeModel.cpp rename to Minecraft.Client/net/minecraft/client/model/BlazeModel.cpp index c584ae2ba..945685268 100644 --- a/Minecraft.Client/Rendering/Models/BlazeModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/BlazeModel.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" #include "BlazeModel.h" -#include "ModelPart.h" +#include "geom/ModelPart.h" BlazeModel::BlazeModel() : Model() { upperBodyParts = ModelPartArray(12); diff --git a/Minecraft.Client/Rendering/Models/BlazeModel.h b/Minecraft.Client/net/minecraft/client/model/BlazeModel.h similarity index 96% rename from Minecraft.Client/Rendering/Models/BlazeModel.h rename to Minecraft.Client/net/minecraft/client/model/BlazeModel.h index f6c689c98..f14203371 100644 --- a/Minecraft.Client/Rendering/Models/BlazeModel.h +++ b/Minecraft.Client/net/minecraft/client/model/BlazeModel.h @@ -1,5 +1,5 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class BlazeModel : public Model { private: diff --git a/Minecraft.Client/Rendering/Models/BoatModel.cpp b/Minecraft.Client/net/minecraft/client/model/BoatModel.cpp similarity index 96% rename from Minecraft.Client/Rendering/Models/BoatModel.cpp rename to Minecraft.Client/net/minecraft/client/model/BoatModel.cpp index e0b5da365..d666170f2 100644 --- a/Minecraft.Client/Rendering/Models/BoatModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/BoatModel.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "BoatModel.h" BoatModel::BoatModel() : Model() { diff --git a/Minecraft.Client/Rendering/Models/BoatModel.h b/Minecraft.Client/net/minecraft/client/model/BoatModel.h similarity index 84% rename from Minecraft.Client/Rendering/Models/BoatModel.h rename to Minecraft.Client/net/minecraft/client/model/BoatModel.h index d96fdef06..e8cc7f2d7 100644 --- a/Minecraft.Client/Rendering/Models/BoatModel.h +++ b/Minecraft.Client/net/minecraft/client/model/BoatModel.h @@ -1,6 +1,6 @@ #pragma once -#include "Model.h" -#include "ModelPart.h" +#include "geom/Model.h" +#include "geom/ModelPart.h" class BoatModel : public Model { public: diff --git a/Minecraft.Client/Rendering/Models/BookModel.cpp b/Minecraft.Client/net/minecraft/client/model/BookModel.cpp similarity index 94% rename from Minecraft.Client/Rendering/Models/BookModel.cpp rename to Minecraft.Client/net/minecraft/client/model/BookModel.cpp index 47af3bb83..255096464 100644 --- a/Minecraft.Client/Rendering/Models/BookModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/BookModel.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" #include "BookModel.h" -#include "ModelPart.h" +#include "geom/ModelPart.h" BookModel::BookModel() { leftLid = (new ModelPart(this))->texOffs(0, 0)->addBox(-6, -5, 0, 6, 10, 0); diff --git a/Minecraft.Client/Rendering/Models/BookModel.h b/Minecraft.Client/net/minecraft/client/model/BookModel.h similarity index 96% rename from Minecraft.Client/Rendering/Models/BookModel.h rename to Minecraft.Client/net/minecraft/client/model/BookModel.h index cef02230a..4ef9c5ff1 100644 --- a/Minecraft.Client/Rendering/Models/BookModel.h +++ b/Minecraft.Client/net/minecraft/client/model/BookModel.h @@ -1,6 +1,6 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class BookModel : public Model { public: diff --git a/Minecraft.Client/Rendering/Models/ChestModel.cpp b/Minecraft.Client/net/minecraft/client/model/ChestModel.cpp similarity index 92% rename from Minecraft.Client/Rendering/Models/ChestModel.cpp rename to Minecraft.Client/net/minecraft/client/model/ChestModel.cpp index 918c44620..335b30db3 100644 --- a/Minecraft.Client/Rendering/Models/ChestModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/ChestModel.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ChestModel.h" -#include "ModelPart.h" +#include "geom/ModelPart.h" ChestModel::ChestModel() { lid = ((new ModelPart(this, 0, 0)))->setTexSize(64, 64); diff --git a/Minecraft.Client/Rendering/Models/ChestModel.h b/Minecraft.Client/net/minecraft/client/model/ChestModel.h similarity index 90% rename from Minecraft.Client/Rendering/Models/ChestModel.h rename to Minecraft.Client/net/minecraft/client/model/ChestModel.h index 3b3cfd8b2..c26e82be9 100644 --- a/Minecraft.Client/Rendering/Models/ChestModel.h +++ b/Minecraft.Client/net/minecraft/client/model/ChestModel.h @@ -1,6 +1,6 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class Cube; diff --git a/Minecraft.Client/Rendering/Models/ChickenModel.cpp b/Minecraft.Client/net/minecraft/client/model/ChickenModel.cpp similarity index 95% rename from Minecraft.Client/Rendering/Models/ChickenModel.cpp rename to Minecraft.Client/net/minecraft/client/model/ChickenModel.cpp index e3c2e6ccd..148827e0a 100644 --- a/Minecraft.Client/Rendering/Models/ChickenModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/ChickenModel.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" #include "ChickenModel.h" -#include "ModelPart.h" +#include "geom/ModelPart.h" ChickenModel::ChickenModel() : Model() { int yo = 16; diff --git a/Minecraft.Client/Rendering/Models/ChickenModel.h b/Minecraft.Client/net/minecraft/client/model/ChickenModel.h similarity index 96% rename from Minecraft.Client/Rendering/Models/ChickenModel.h rename to Minecraft.Client/net/minecraft/client/model/ChickenModel.h index 7180802fe..87a130607 100644 --- a/Minecraft.Client/Rendering/Models/ChickenModel.h +++ b/Minecraft.Client/net/minecraft/client/model/ChickenModel.h @@ -1,5 +1,5 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class ChickenModel : public Model { public: diff --git a/Minecraft.Client/Rendering/Models/CowModel.cpp b/Minecraft.Client/net/minecraft/client/model/CowModel.cpp similarity index 90% rename from Minecraft.Client/Rendering/Models/CowModel.cpp rename to Minecraft.Client/net/minecraft/client/model/CowModel.cpp index 78efcd2a6..9b57577e2 100644 --- a/Minecraft.Client/Rendering/Models/CowModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/CowModel.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "CowModel.h" -#include "ModelPart.h" +#include "geom/ModelPart.h" CowModel::CowModel() : QuadrupedModel(12, 0) { head = new ModelPart(this, 0, 0); diff --git a/Minecraft.Client/Rendering/Models/CowModel.h b/Minecraft.Client/net/minecraft/client/model/CowModel.h similarity index 100% rename from Minecraft.Client/Rendering/Models/CowModel.h rename to Minecraft.Client/net/minecraft/client/model/CowModel.h diff --git a/Minecraft.Client/Rendering/Models/CreeperModel.cpp b/Minecraft.Client/net/minecraft/client/model/CreeperModel.cpp similarity index 94% rename from Minecraft.Client/Rendering/Models/CreeperModel.cpp rename to Minecraft.Client/net/minecraft/client/model/CreeperModel.cpp index c8c970f2e..6b3f433bc 100644 --- a/Minecraft.Client/Rendering/Models/CreeperModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/CreeperModel.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" #include "CreeperModel.h" -#include "ModelPart.h" +#include "geom/ModelPart.h" // 4J - added void CreeperModel::_init(float g) { diff --git a/Minecraft.Client/Rendering/Models/CreeperModel.h b/Minecraft.Client/net/minecraft/client/model/CreeperModel.h similarity index 96% rename from Minecraft.Client/Rendering/Models/CreeperModel.h rename to Minecraft.Client/net/minecraft/client/model/CreeperModel.h index 9c119e2fa..7ebe59de2 100644 --- a/Minecraft.Client/Rendering/Models/CreeperModel.h +++ b/Minecraft.Client/net/minecraft/client/model/CreeperModel.h @@ -1,5 +1,5 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class CreeperModel : public Model { public: diff --git a/Minecraft.Client/Rendering/Models/EnderManModel.cpp b/Minecraft.Client/net/minecraft/client/model/EndermanModel.cpp similarity index 96% rename from Minecraft.Client/Rendering/Models/EnderManModel.cpp rename to Minecraft.Client/net/minecraft/client/model/EndermanModel.cpp index 0e0d5f25b..7fc8610f4 100644 --- a/Minecraft.Client/Rendering/Models/EnderManModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/EndermanModel.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "EnderManModel.h" -#include "ModelPart.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "EndermanModel.h" +#include "geom/ModelPart.h" EndermanModel::EndermanModel() : HumanoidModel(0, -14, 64, 32) { carrying = false; diff --git a/Minecraft.Client/Rendering/Models/EnderManModel.h b/Minecraft.Client/net/minecraft/client/model/EndermanModel.h similarity index 100% rename from Minecraft.Client/Rendering/Models/EnderManModel.h rename to Minecraft.Client/net/minecraft/client/model/EndermanModel.h diff --git a/Minecraft.Client/Rendering/Models/GhastModel.cpp b/Minecraft.Client/net/minecraft/client/model/GhastModel.cpp similarity index 89% rename from Minecraft.Client/Rendering/Models/GhastModel.cpp rename to Minecraft.Client/net/minecraft/client/model/GhastModel.cpp index 252f7ca3c..c2fa3a6d7 100644 --- a/Minecraft.Client/Rendering/Models/GhastModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/GhastModel.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Util/Random.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" #include "GhastModel.h" -#include "ModelPart.h" +#include "geom/ModelPart.h" GhastModel::GhastModel() : Model() { int yoffs = -16; diff --git a/Minecraft.Client/Rendering/Models/GhastModel.h b/Minecraft.Client/net/minecraft/client/model/GhastModel.h similarity index 96% rename from Minecraft.Client/Rendering/Models/GhastModel.h rename to Minecraft.Client/net/minecraft/client/model/GhastModel.h index 64aca2e46..ab7c6a823 100644 --- a/Minecraft.Client/Rendering/Models/GhastModel.h +++ b/Minecraft.Client/net/minecraft/client/model/GhastModel.h @@ -1,5 +1,5 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class GhastModel : public Model { public: diff --git a/Minecraft.Client/Rendering/Models/HumanoidModel.cpp b/Minecraft.Client/net/minecraft/client/model/HumanoidModel.cpp similarity index 98% rename from Minecraft.Client/Rendering/Models/HumanoidModel.cpp rename to Minecraft.Client/net/minecraft/client/model/HumanoidModel.cpp index 6734b8388..e90361d7a 100644 --- a/Minecraft.Client/Rendering/Models/HumanoidModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/HumanoidModel.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "HumanoidModel.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "../../../Minecraft.World/Entities/Entity.h" -#include "ModelPart.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/Entity.h" +#include "geom/ModelPart.h" // 4J added diff --git a/Minecraft.Client/Rendering/Models/HumanoidModel.h b/Minecraft.Client/net/minecraft/client/model/HumanoidModel.h similarity index 99% rename from Minecraft.Client/Rendering/Models/HumanoidModel.h rename to Minecraft.Client/net/minecraft/client/model/HumanoidModel.h index 3d5c06fb8..6f452966c 100644 --- a/Minecraft.Client/Rendering/Models/HumanoidModel.h +++ b/Minecraft.Client/net/minecraft/client/model/HumanoidModel.h @@ -1,5 +1,5 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class HumanoidModel : public Model { public: diff --git a/Minecraft.Client/Rendering/Models/LargeChestModel.cpp b/Minecraft.Client/net/minecraft/client/model/LargeChestModel.cpp similarity index 89% rename from Minecraft.Client/Rendering/Models/LargeChestModel.cpp rename to Minecraft.Client/net/minecraft/client/model/LargeChestModel.cpp index f9a11082a..e859292c1 100644 --- a/Minecraft.Client/Rendering/Models/LargeChestModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/LargeChestModel.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "LargeChestModel.h" -#include "ModelPart.h" +#include "geom/ModelPart.h" LargeChestModel::LargeChestModel() { lid = ((new ModelPart(this, 0, 0)))->setTexSize(128, 64); diff --git a/Minecraft.Client/Rendering/Models/LargeChestModel.h b/Minecraft.Client/net/minecraft/client/model/LargeChestModel.h similarity index 100% rename from Minecraft.Client/Rendering/Models/LargeChestModel.h rename to Minecraft.Client/net/minecraft/client/model/LargeChestModel.h diff --git a/Minecraft.Client/Rendering/Models/LavaSlimeModel.cpp b/Minecraft.Client/net/minecraft/client/model/LavaSlimeModel.cpp similarity index 87% rename from Minecraft.Client/Rendering/Models/LavaSlimeModel.cpp rename to Minecraft.Client/net/minecraft/client/model/LavaSlimeModel.cpp index cf91175ee..d59bf1d37 100644 --- a/Minecraft.Client/Rendering/Models/LavaSlimeModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/LavaSlimeModel.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" #include "LavaSlimeModel.h" -#include "ModelPart.h" -#include "../../../Minecraft.World/Entities/Mobs/LavaSlime.h" +#include "geom/ModelPart.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/monster/LavaSlime.h" LavaSlimeModel::LavaSlimeModel() { for (int i = 0; i < BODYCUBESLENGTH; i++) { diff --git a/Minecraft.Client/Rendering/Models/LavaSlimeModel.h b/Minecraft.Client/net/minecraft/client/model/LavaSlimeModel.h similarity index 95% rename from Minecraft.Client/Rendering/Models/LavaSlimeModel.h rename to Minecraft.Client/net/minecraft/client/model/LavaSlimeModel.h index ef15cc39b..ae5e4babd 100644 --- a/Minecraft.Client/Rendering/Models/LavaSlimeModel.h +++ b/Minecraft.Client/net/minecraft/client/model/LavaSlimeModel.h @@ -1,5 +1,5 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class LavaSlimeModel : public Model { static const int BODYCUBESLENGTH = 8; diff --git a/Minecraft.Client/Rendering/Models/LeashKnotModel.cpp b/Minecraft.Client/net/minecraft/client/model/LeashKnotModel.cpp similarity index 92% rename from Minecraft.Client/Rendering/Models/LeashKnotModel.cpp rename to Minecraft.Client/net/minecraft/client/model/LeashKnotModel.cpp index 2d45af79b..6e4294428 100644 --- a/Minecraft.Client/Rendering/Models/LeashKnotModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/LeashKnotModel.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "LeashKnotModel.h" -#include "ModelPart.h" +#include "geom/ModelPart.h" LeashKnotModel::LeashKnotModel() { _init(0, 0, 32, 32); } diff --git a/Minecraft.Client/Rendering/Models/LeashKnotModel.h b/Minecraft.Client/net/minecraft/client/model/LeashKnotModel.h similarity index 96% rename from Minecraft.Client/Rendering/Models/LeashKnotModel.h rename to Minecraft.Client/net/minecraft/client/model/LeashKnotModel.h index 850ba7e1f..9eedff3b5 100644 --- a/Minecraft.Client/Rendering/Models/LeashKnotModel.h +++ b/Minecraft.Client/net/minecraft/client/model/LeashKnotModel.h @@ -1,5 +1,5 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class LeashKnotModel : public Model { public: diff --git a/Minecraft.Client/Rendering/Models/MinecartModel.cpp b/Minecraft.Client/net/minecraft/client/model/MinecartModel.cpp similarity index 95% rename from Minecraft.Client/Rendering/Models/MinecartModel.cpp rename to Minecraft.Client/net/minecraft/client/model/MinecartModel.cpp index 1feb9ab3b..57fe3f084 100644 --- a/Minecraft.Client/Rendering/Models/MinecartModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/MinecartModel.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "MinecartModel.h" -#include "ModelPart.h" +#include "geom/ModelPart.h" MinecartModel::MinecartModel() : Model() { cubes[0] = new ModelPart(this, 0, 10); diff --git a/Minecraft.Client/Rendering/Models/MinecartModel.h b/Minecraft.Client/net/minecraft/client/model/MinecartModel.h similarity index 93% rename from Minecraft.Client/Rendering/Models/MinecartModel.h rename to Minecraft.Client/net/minecraft/client/model/MinecartModel.h index 13b7cf69e..6f3d13b3a 100644 --- a/Minecraft.Client/Rendering/Models/MinecartModel.h +++ b/Minecraft.Client/net/minecraft/client/model/MinecartModel.h @@ -1,5 +1,5 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class MinecartModel : public Model { public: diff --git a/Minecraft.Client/Rendering/Models/ModelHorse.cpp b/Minecraft.Client/net/minecraft/client/model/ModelHorse.cpp similarity index 98% rename from Minecraft.Client/Rendering/Models/ModelHorse.cpp rename to Minecraft.Client/net/minecraft/client/model/ModelHorse.cpp index f036f6082..cfc25ef07 100644 --- a/Minecraft.Client/Rendering/Models/ModelHorse.cpp +++ b/Minecraft.Client/net/minecraft/client/model/ModelHorse.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" #include "ModelHorse.h" -#include "ModelPart.h" +#include "geom/ModelPart.h" ModelHorse::ModelHorse() { texWidth = 128; diff --git a/Minecraft.Client/Rendering/Models/ModelHorse.h b/Minecraft.Client/net/minecraft/client/model/ModelHorse.h similarity index 98% rename from Minecraft.Client/Rendering/Models/ModelHorse.h rename to Minecraft.Client/net/minecraft/client/model/ModelHorse.h index a200b873d..768a86e79 100644 --- a/Minecraft.Client/Rendering/Models/ModelHorse.h +++ b/Minecraft.Client/net/minecraft/client/model/ModelHorse.h @@ -1,5 +1,5 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class ModelHorse : public Model { private: diff --git a/Minecraft.Client/Rendering/Models/OcelotModel.cpp b/Minecraft.Client/net/minecraft/client/model/OcelotModel.cpp similarity index 96% rename from Minecraft.Client/Rendering/Models/OcelotModel.cpp rename to Minecraft.Client/net/minecraft/client/model/OcelotModel.cpp index afafef9a4..7c5f7a14b 100644 --- a/Minecraft.Client/Rendering/Models/OcelotModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/OcelotModel.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "ModelPart.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "geom/ModelPart.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" #include "OcelotModel.h" const float OcelotModel::xo = 0; diff --git a/Minecraft.Client/Rendering/Models/OcelotModel.h b/Minecraft.Client/net/minecraft/client/model/OcelotModel.h similarity index 98% rename from Minecraft.Client/Rendering/Models/OcelotModel.h rename to Minecraft.Client/net/minecraft/client/model/OcelotModel.h index 774a34662..b5447f840 100644 --- a/Minecraft.Client/Rendering/Models/OcelotModel.h +++ b/Minecraft.Client/net/minecraft/client/model/OcelotModel.h @@ -1,6 +1,6 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class OcelotModel : public Model { private: diff --git a/Minecraft.Client/Rendering/Models/PigModel.cpp b/Minecraft.Client/net/minecraft/client/model/PigModel.cpp similarity index 80% rename from Minecraft.Client/Rendering/Models/PigModel.cpp rename to Minecraft.Client/net/minecraft/client/model/PigModel.cpp index eb5308133..3d141e11e 100644 --- a/Minecraft.Client/Rendering/Models/PigModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/PigModel.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "PigModel.h" -#include "ModelPart.h" +#include "geom/ModelPart.h" PigModel::PigModel() : QuadrupedModel(6, 0) { head->texOffs(16, 16)->addBox(-2.0f, 0.0f, -9.0f, 4, 3, 1, 0.0f); diff --git a/Minecraft.Client/Rendering/Models/PigModel.h b/Minecraft.Client/net/minecraft/client/model/PigModel.h similarity index 100% rename from Minecraft.Client/Rendering/Models/PigModel.h rename to Minecraft.Client/net/minecraft/client/model/PigModel.h diff --git a/Minecraft.Client/Rendering/Polygon.cpp b/Minecraft.Client/net/minecraft/client/model/Polygon.cpp similarity index 98% rename from Minecraft.Client/Rendering/Polygon.cpp rename to Minecraft.Client/net/minecraft/client/model/Polygon.cpp index d0de18504..e30a668c0 100644 --- a/Minecraft.Client/Rendering/Polygon.cpp +++ b/Minecraft.Client/net/minecraft/client/model/Polygon.cpp @@ -1,4 +1,4 @@ -#include "Rendering/Vertex.h" +#include "Vertex.h" #include "Polygon.h" #include #include diff --git a/Minecraft.Client/Rendering/Polygon.h b/Minecraft.Client/net/minecraft/client/model/Polygon.h similarity index 84% rename from Minecraft.Client/Rendering/Polygon.h rename to Minecraft.Client/net/minecraft/client/model/Polygon.h index c56306533..b0747fa8a 100644 --- a/Minecraft.Client/Rendering/Polygon.h +++ b/Minecraft.Client/net/minecraft/client/model/Polygon.h @@ -3,8 +3,8 @@ #include #include #include "Vertex.h" -#include "Tesselator.h" -#include "../../Minecraft.World/Util/ArrayWithLength.h" +#include "../renderer/Tesselator.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/ArrayWithLength.h" class _Polygon { public: diff --git a/Minecraft.Client/Rendering/Models/QuadrupedModel.cpp b/Minecraft.Client/net/minecraft/client/model/QuadrupedModel.cpp similarity index 96% rename from Minecraft.Client/Rendering/Models/QuadrupedModel.cpp rename to Minecraft.Client/net/minecraft/client/model/QuadrupedModel.cpp index b6fa90fa2..eb1eeadd3 100644 --- a/Minecraft.Client/Rendering/Models/QuadrupedModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/QuadrupedModel.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "QuadrupedModel.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "ModelPart.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "geom/ModelPart.h" QuadrupedModel::QuadrupedModel(int legSize, float g) : Model() { yHeadOffs = 8; diff --git a/Minecraft.Client/Rendering/Models/QuadrupedModel.h b/Minecraft.Client/net/minecraft/client/model/QuadrupedModel.h similarity index 96% rename from Minecraft.Client/Rendering/Models/QuadrupedModel.h rename to Minecraft.Client/net/minecraft/client/model/QuadrupedModel.h index 7346510ee..b890269fe 100644 --- a/Minecraft.Client/Rendering/Models/QuadrupedModel.h +++ b/Minecraft.Client/net/minecraft/client/model/QuadrupedModel.h @@ -1,5 +1,5 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class QuadrupedModel : public Model { public: diff --git a/Minecraft.Client/Rendering/Models/SheepFurModel.cpp b/Minecraft.Client/net/minecraft/client/model/SheepFurModel.cpp similarity index 90% rename from Minecraft.Client/Rendering/Models/SheepFurModel.cpp rename to Minecraft.Client/net/minecraft/client/model/SheepFurModel.cpp index add8aa551..1a54c7872 100644 --- a/Minecraft.Client/Rendering/Models/SheepFurModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/SheepFurModel.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" #include "SheepFurModel.h" -#include "ModelPart.h" +#include "geom/ModelPart.h" SheepFurModel::SheepFurModel() : QuadrupedModel(12, 0) { headXRot = 0.0f; diff --git a/Minecraft.Client/Rendering/Models/SheepFurModel.h b/Minecraft.Client/net/minecraft/client/model/SheepFurModel.h similarity index 100% rename from Minecraft.Client/Rendering/Models/SheepFurModel.h rename to Minecraft.Client/net/minecraft/client/model/SheepFurModel.h diff --git a/Minecraft.Client/Rendering/Models/SheepModel.cpp b/Minecraft.Client/net/minecraft/client/model/SheepModel.cpp similarity index 85% rename from Minecraft.Client/Rendering/Models/SheepModel.cpp rename to Minecraft.Client/net/minecraft/client/model/SheepModel.cpp index 986bd3088..a817bbe80 100644 --- a/Minecraft.Client/Rendering/Models/SheepModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/SheepModel.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" #include "SheepModel.h" -#include "ModelPart.h" +#include "geom/ModelPart.h" SheepModel::SheepModel() : QuadrupedModel(12, 0) { headXRot = 0.0f; diff --git a/Minecraft.Client/Rendering/Models/SheepModel.h b/Minecraft.Client/net/minecraft/client/model/SheepModel.h similarity index 100% rename from Minecraft.Client/Rendering/Models/SheepModel.h rename to Minecraft.Client/net/minecraft/client/model/SheepModel.h diff --git a/Minecraft.Client/Rendering/Models/SignModel.cpp b/Minecraft.Client/net/minecraft/client/model/SignModel.cpp similarity index 84% rename from Minecraft.Client/Rendering/Models/SignModel.cpp rename to Minecraft.Client/net/minecraft/client/model/SignModel.cpp index 4b72bbbd0..1c87b5d79 100644 --- a/Minecraft.Client/Rendering/Models/SignModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/SignModel.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "SignModel.h" -#include "ModelPart.h" +#include "geom/ModelPart.h" SignModel::SignModel() { cube = new ModelPart(this, 0, 0); diff --git a/Minecraft.Client/Rendering/Models/SignModel.h b/Minecraft.Client/net/minecraft/client/model/SignModel.h similarity index 88% rename from Minecraft.Client/Rendering/Models/SignModel.h rename to Minecraft.Client/net/minecraft/client/model/SignModel.h index 3c2d26d22..f637bfa0a 100644 --- a/Minecraft.Client/Rendering/Models/SignModel.h +++ b/Minecraft.Client/net/minecraft/client/model/SignModel.h @@ -1,6 +1,6 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class Cube; diff --git a/Minecraft.Client/Rendering/Models/SilverfishModel.cpp b/Minecraft.Client/net/minecraft/client/model/SilverfishModel.cpp similarity index 94% rename from Minecraft.Client/Rendering/Models/SilverfishModel.cpp rename to Minecraft.Client/net/minecraft/client/model/SilverfishModel.cpp index 89b8c3c03..1e205e479 100644 --- a/Minecraft.Client/Rendering/Models/SilverfishModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/SilverfishModel.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "SilverfishModel.h" -#include "../Cube.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "ModelPart.h" +#include "geom/Cube.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "geom/ModelPart.h" const int SilverfishModel::BODY_SIZES[BODY_COUNT][3] = { {3, 2, 2}, {4, 3, 2}, {6, 4, 3}, {3, 3, 3}, {2, 2, 3}, {2, 1, 2}, {1, 1, 2}, diff --git a/Minecraft.Client/Rendering/Models/SilverfishModel.h b/Minecraft.Client/net/minecraft/client/model/SilverfishModel.h similarity index 96% rename from Minecraft.Client/Rendering/Models/SilverfishModel.h rename to Minecraft.Client/net/minecraft/client/model/SilverfishModel.h index c3c74e623..5e4d1028f 100644 --- a/Minecraft.Client/Rendering/Models/SilverfishModel.h +++ b/Minecraft.Client/net/minecraft/client/model/SilverfishModel.h @@ -1,6 +1,6 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class SilverfishModel : public Model { private: diff --git a/Minecraft.Client/Rendering/Models/SkeletonHeadModel.cpp b/Minecraft.Client/net/minecraft/client/model/SkeletonHeadModel.cpp similarity index 94% rename from Minecraft.Client/Rendering/Models/SkeletonHeadModel.cpp rename to Minecraft.Client/net/minecraft/client/model/SkeletonHeadModel.cpp index 4a251f2e1..da2c42bec 100644 --- a/Minecraft.Client/Rendering/Models/SkeletonHeadModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/SkeletonHeadModel.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "ModelPart.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "geom/ModelPart.h" #include "SkeletonHeadModel.h" void SkeletonHeadModel::_init(int u, int v, int tw, int th) { diff --git a/Minecraft.Client/Rendering/Models/SkeletonHeadModel.h b/Minecraft.Client/net/minecraft/client/model/SkeletonHeadModel.h similarity index 96% rename from Minecraft.Client/Rendering/Models/SkeletonHeadModel.h rename to Minecraft.Client/net/minecraft/client/model/SkeletonHeadModel.h index 32e6fa035..2edc9bb24 100644 --- a/Minecraft.Client/Rendering/Models/SkeletonHeadModel.h +++ b/Minecraft.Client/net/minecraft/client/model/SkeletonHeadModel.h @@ -1,6 +1,6 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class SkeletonHeadModel : public Model { public: diff --git a/Minecraft.Client/Rendering/Models/SkeletonModel.cpp b/Minecraft.Client/net/minecraft/client/model/SkeletonModel.cpp similarity index 86% rename from Minecraft.Client/Rendering/Models/SkeletonModel.cpp rename to Minecraft.Client/net/minecraft/client/model/SkeletonModel.cpp index b90cf661c..0ef75c835 100644 --- a/Minecraft.Client/Rendering/Models/SkeletonModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/SkeletonModel.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "SkeletonModel.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.monster.h" -#include "ModelPart.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h" +#include "geom/ModelPart.h" void SkeletonModel::_init(float g) { arm0 = new ModelPart(this, 24 + 16, 16); diff --git a/Minecraft.Client/Rendering/Models/SkeletonModel.h b/Minecraft.Client/net/minecraft/client/model/SkeletonModel.h similarity index 100% rename from Minecraft.Client/Rendering/Models/SkeletonModel.h rename to Minecraft.Client/net/minecraft/client/model/SkeletonModel.h diff --git a/Minecraft.Client/Rendering/Models/SkiModel.cpp b/Minecraft.Client/net/minecraft/client/model/SkiModel.cpp similarity index 96% rename from Minecraft.Client/Rendering/Models/SkiModel.cpp rename to Minecraft.Client/net/minecraft/client/model/SkiModel.cpp index 5fca00390..aa159ac3d 100644 --- a/Minecraft.Client/Rendering/Models/SkiModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/SkiModel.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "SkiModel.h" SkiModel::SkiModel() { _init(false); } diff --git a/Minecraft.Client/Rendering/Models/SkiModel.h b/Minecraft.Client/net/minecraft/client/model/SkiModel.h similarity index 91% rename from Minecraft.Client/Rendering/Models/SkiModel.h rename to Minecraft.Client/net/minecraft/client/model/SkiModel.h index 29502440f..f82119102 100644 --- a/Minecraft.Client/Rendering/Models/SkiModel.h +++ b/Minecraft.Client/net/minecraft/client/model/SkiModel.h @@ -1,6 +1,6 @@ #pragma once -#include "Model.h" -#include "ModelPart.h" +#include "geom/Model.h" +#include "geom/ModelPart.h" class SkiModel : public Model { public: diff --git a/Minecraft.Client/Rendering/Models/SlimeModel.cpp b/Minecraft.Client/net/minecraft/client/model/SlimeModel.cpp similarity index 93% rename from Minecraft.Client/Rendering/Models/SlimeModel.cpp rename to Minecraft.Client/net/minecraft/client/model/SlimeModel.cpp index 4c8cb0afc..391e88b46 100644 --- a/Minecraft.Client/Rendering/Models/SlimeModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/SlimeModel.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "SlimeModel.h" -#include "ModelPart.h" +#include "geom/ModelPart.h" SlimeModel::SlimeModel(int vOffs) { cube = new ModelPart(this, 0, vOffs); diff --git a/Minecraft.Client/Rendering/Models/SlimeModel.h b/Minecraft.Client/net/minecraft/client/model/SlimeModel.h similarity index 93% rename from Minecraft.Client/Rendering/Models/SlimeModel.h rename to Minecraft.Client/net/minecraft/client/model/SlimeModel.h index c9c8cadcb..8bd09ccfa 100644 --- a/Minecraft.Client/Rendering/Models/SlimeModel.h +++ b/Minecraft.Client/net/minecraft/client/model/SlimeModel.h @@ -1,5 +1,5 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class SlimeModel : public Model { public: diff --git a/Minecraft.Client/Rendering/Models/SnowManModel.cpp b/Minecraft.Client/net/minecraft/client/model/SnowManModel.cpp similarity index 93% rename from Minecraft.Client/Rendering/Models/SnowManModel.cpp rename to Minecraft.Client/net/minecraft/client/model/SnowManModel.cpp index 039f88654..f24aa4d14 100644 --- a/Minecraft.Client/Rendering/Models/SnowManModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/SnowManModel.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "SnowManModel.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "ModelPart.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "geom/ModelPart.h" SnowManModel::SnowManModel() : Model() { float yOffset = 4; diff --git a/Minecraft.Client/Rendering/Models/SnowManModel.h b/Minecraft.Client/net/minecraft/client/model/SnowManModel.h similarity index 95% rename from Minecraft.Client/Rendering/Models/SnowManModel.h rename to Minecraft.Client/net/minecraft/client/model/SnowManModel.h index 5279edc95..ce972545c 100644 --- a/Minecraft.Client/Rendering/Models/SnowManModel.h +++ b/Minecraft.Client/net/minecraft/client/model/SnowManModel.h @@ -1,5 +1,5 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class SnowManModel : public Model { public: diff --git a/Minecraft.Client/Rendering/Models/SpiderModel.cpp b/Minecraft.Client/net/minecraft/client/model/SpiderModel.cpp similarity index 96% rename from Minecraft.Client/Rendering/Models/SpiderModel.cpp rename to Minecraft.Client/net/minecraft/client/model/SpiderModel.cpp index 538009d1a..ec16c2590 100644 --- a/Minecraft.Client/Rendering/Models/SpiderModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/SpiderModel.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "SpiderModel.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "ModelPart.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "geom/ModelPart.h" SpiderModel::SpiderModel() : Model() { float g = 0; diff --git a/Minecraft.Client/Rendering/Models/SpiderModel.h b/Minecraft.Client/net/minecraft/client/model/SpiderModel.h similarity index 96% rename from Minecraft.Client/Rendering/Models/SpiderModel.h rename to Minecraft.Client/net/minecraft/client/model/SpiderModel.h index 271866e9d..b5325fbbf 100644 --- a/Minecraft.Client/Rendering/Models/SpiderModel.h +++ b/Minecraft.Client/net/minecraft/client/model/SpiderModel.h @@ -1,5 +1,5 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class SpiderModel : public Model { public: diff --git a/Minecraft.Client/Rendering/Models/SquidModel.cpp b/Minecraft.Client/net/minecraft/client/model/SquidModel.cpp similarity index 92% rename from Minecraft.Client/Rendering/Models/SquidModel.cpp rename to Minecraft.Client/net/minecraft/client/model/SquidModel.cpp index 34c942132..d7e4cd29c 100644 --- a/Minecraft.Client/Rendering/Models/SquidModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/SquidModel.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "SquidModel.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "ModelPart.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "geom/ModelPart.h" SquidModel::SquidModel() : Model() { int yoffs = -16; diff --git a/Minecraft.Client/Rendering/Models/SquidModel.h b/Minecraft.Client/net/minecraft/client/model/SquidModel.h similarity index 96% rename from Minecraft.Client/Rendering/Models/SquidModel.h rename to Minecraft.Client/net/minecraft/client/model/SquidModel.h index 80c769969..f10a0b23a 100644 --- a/Minecraft.Client/Rendering/Models/SquidModel.h +++ b/Minecraft.Client/net/minecraft/client/model/SquidModel.h @@ -1,5 +1,5 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class SquidModel : public Model { public: diff --git a/Minecraft.Client/Rendering/Vertex.cpp b/Minecraft.Client/net/minecraft/client/model/Vertex.cpp similarity index 100% rename from Minecraft.Client/Rendering/Vertex.cpp rename to Minecraft.Client/net/minecraft/client/model/Vertex.cpp diff --git a/Minecraft.Client/Rendering/Vertex.h b/Minecraft.Client/net/minecraft/client/model/Vertex.h similarity index 84% rename from Minecraft.Client/Rendering/Vertex.h rename to Minecraft.Client/net/minecraft/client/model/Vertex.h index b0437b9ba..83988d877 100644 --- a/Minecraft.Client/Rendering/Vertex.h +++ b/Minecraft.Client/net/minecraft/client/model/Vertex.h @@ -1,5 +1,5 @@ #pragma once -#include "../../Minecraft.World/Util/Vec3.h" +#include "../../../../../Minecraft.World/net/minecraft/world/phys/Vec3.h" class Vertex { public: diff --git a/Minecraft.Client/Rendering/Models/VillagerGolemModel.cpp b/Minecraft.Client/net/minecraft/client/model/VillagerGolemModel.cpp similarity index 94% rename from Minecraft.Client/Rendering/Models/VillagerGolemModel.cpp rename to Minecraft.Client/net/minecraft/client/model/VillagerGolemModel.cpp index 07172fefb..d4bb46ce6 100644 --- a/Minecraft.Client/Rendering/Models/VillagerGolemModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/VillagerGolemModel.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" -#include "ModelPart.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" +#include "geom/ModelPart.h" #include "VillagerGolemModel.h" VillagerGolemModel::VillagerGolemModel(float g, float yOffset) { diff --git a/Minecraft.Client/Rendering/Models/VillagerGolemModel.h b/Minecraft.Client/net/minecraft/client/model/VillagerGolemModel.h similarity index 97% rename from Minecraft.Client/Rendering/Models/VillagerGolemModel.h rename to Minecraft.Client/net/minecraft/client/model/VillagerGolemModel.h index fda66b16b..f9c487e71 100644 --- a/Minecraft.Client/Rendering/Models/VillagerGolemModel.h +++ b/Minecraft.Client/net/minecraft/client/model/VillagerGolemModel.h @@ -1,6 +1,6 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class ModelPart; diff --git a/Minecraft.Client/Rendering/Models/VillagerModel.cpp b/Minecraft.Client/net/minecraft/client/model/VillagerModel.cpp similarity index 94% rename from Minecraft.Client/Rendering/Models/VillagerModel.cpp rename to Minecraft.Client/net/minecraft/client/model/VillagerModel.cpp index 31b8fc383..d3e1df029 100644 --- a/Minecraft.Client/Rendering/Models/VillagerModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/VillagerModel.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "VillagerModel.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "ModelPart.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "geom/ModelPart.h" void VillagerModel::_init(float g, float yOffset, int xTexSize, int yTexSize) { head = (new ModelPart(this))->setTexSize(xTexSize, yTexSize); diff --git a/Minecraft.Client/Rendering/Models/VillagerModel.h b/Minecraft.Client/net/minecraft/client/model/VillagerModel.h similarity index 96% rename from Minecraft.Client/Rendering/Models/VillagerModel.h rename to Minecraft.Client/net/minecraft/client/model/VillagerModel.h index 46b104fb4..ee52cb7ae 100644 --- a/Minecraft.Client/Rendering/Models/VillagerModel.h +++ b/Minecraft.Client/net/minecraft/client/model/VillagerModel.h @@ -1,6 +1,6 @@ #pragma once -#include "Model.h" +#include "geom/Model.h" class VillagerModel : public Model { public: diff --git a/Minecraft.Client/Rendering/Models/VillagerZombieModel.cpp b/Minecraft.Client/net/minecraft/client/model/VillagerZombieModel.cpp similarity index 92% rename from Minecraft.Client/Rendering/Models/VillagerZombieModel.cpp rename to Minecraft.Client/net/minecraft/client/model/VillagerZombieModel.cpp index 221daa9f4..d5705f2ef 100644 --- a/Minecraft.Client/Rendering/Models/VillagerZombieModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/VillagerZombieModel.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "ModelPart.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "geom/ModelPart.h" #include "VillagerZombieModel.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" void VillagerZombieModel::_init(float g, float yOffset, bool isArmor) { delete head; diff --git a/Minecraft.Client/Rendering/Models/VillagerZombieModel.h b/Minecraft.Client/net/minecraft/client/model/VillagerZombieModel.h similarity index 100% rename from Minecraft.Client/Rendering/Models/VillagerZombieModel.h rename to Minecraft.Client/net/minecraft/client/model/VillagerZombieModel.h diff --git a/Minecraft.Client/Rendering/Models/WitchModel.cpp b/Minecraft.Client/net/minecraft/client/model/WitchModel.cpp similarity index 93% rename from Minecraft.Client/Rendering/Models/WitchModel.cpp rename to Minecraft.Client/net/minecraft/client/model/WitchModel.cpp index 20121428c..fdfdbb09f 100644 --- a/Minecraft.Client/Rendering/Models/WitchModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/WitchModel.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "ModelPart.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "geom/ModelPart.h" #include "WitchModel.h" #include "VillagerModel.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" WitchModel::WitchModel(float g) : VillagerModel(g, 0, 64, 128) { mole = (new ModelPart(this))->setTexSize(64, 128); diff --git a/Minecraft.Client/Rendering/Models/WitchModel.h b/Minecraft.Client/net/minecraft/client/model/WitchModel.h similarity index 100% rename from Minecraft.Client/Rendering/Models/WitchModel.h rename to Minecraft.Client/net/minecraft/client/model/WitchModel.h diff --git a/Minecraft.Client/Rendering/Models/WitherBossModel.cpp b/Minecraft.Client/net/minecraft/client/model/WitherBossModel.cpp similarity index 93% rename from Minecraft.Client/Rendering/Models/WitherBossModel.cpp rename to Minecraft.Client/net/minecraft/client/model/WitherBossModel.cpp index d73a06857..de56c36ec 100644 --- a/Minecraft.Client/Rendering/Models/WitherBossModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/WitherBossModel.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "WitherBossModel.h" -#include "../../../Minecraft.World/Entities/Mobs/WitherBoss.h" -#include "ModelPart.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/boss/wither/WitherBoss.h" +#include "geom/ModelPart.h" WitherBossModel::WitherBossModel() { texWidth = 64; diff --git a/Minecraft.Client/Rendering/Models/WitherBossModel.h b/Minecraft.Client/net/minecraft/client/model/WitherBossModel.h similarity index 93% rename from Minecraft.Client/Rendering/Models/WitherBossModel.h rename to Minecraft.Client/net/minecraft/client/model/WitherBossModel.h index 426e619e2..b0f090ffb 100644 --- a/Minecraft.Client/Rendering/Models/WitherBossModel.h +++ b/Minecraft.Client/net/minecraft/client/model/WitherBossModel.h @@ -1,6 +1,6 @@ #pragma once -#include "Model.h" -#include "ModelPart.h" +#include "geom/Model.h" +#include "geom/ModelPart.h" class WitherBossModel : public Model { private: diff --git a/Minecraft.Client/Rendering/Models/WolfModel.cpp b/Minecraft.Client/net/minecraft/client/model/WolfModel.cpp similarity index 95% rename from Minecraft.Client/Rendering/Models/WolfModel.cpp rename to Minecraft.Client/net/minecraft/client/model/WolfModel.cpp index 592781450..e586da7d0 100644 --- a/Minecraft.Client/Rendering/Models/WolfModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/WolfModel.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "WolfModel.h" -#include "../../../Minecraft.World/Entities/Mobs/Wolf.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "ModelPart.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/animal/Wolf.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "geom/ModelPart.h" WolfModel::WolfModel() { float g = 0; diff --git a/Minecraft.Client/Rendering/Models/WolfModel.h b/Minecraft.Client/net/minecraft/client/model/WolfModel.h similarity index 89% rename from Minecraft.Client/Rendering/Models/WolfModel.h rename to Minecraft.Client/net/minecraft/client/model/WolfModel.h index ced758eca..64c6916ce 100644 --- a/Minecraft.Client/Rendering/Models/WolfModel.h +++ b/Minecraft.Client/net/minecraft/client/model/WolfModel.h @@ -1,6 +1,6 @@ #pragma once -#include "Model.h" -#include "../../../Minecraft.World/Entities/Mob.h" +#include "geom/Model.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/Mob.h" class WolfModel : public Model { public: diff --git a/Minecraft.Client/Rendering/Models/ZombieModel.cpp b/Minecraft.Client/net/minecraft/client/model/ZombieModel.cpp similarity index 89% rename from Minecraft.Client/Rendering/Models/ZombieModel.cpp rename to Minecraft.Client/net/minecraft/client/model/ZombieModel.cpp index a6213c8c9..a7a38695e 100644 --- a/Minecraft.Client/Rendering/Models/ZombieModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/ZombieModel.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ZombieModel.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "ModelPart.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "geom/ModelPart.h" ZombieModel::ZombieModel() : HumanoidModel(0, 0, 64, 32) {} diff --git a/Minecraft.Client/Rendering/Models/ZombieModel.h b/Minecraft.Client/net/minecraft/client/model/ZombieModel.h similarity index 100% rename from Minecraft.Client/Rendering/Models/ZombieModel.h rename to Minecraft.Client/net/minecraft/client/model/ZombieModel.h diff --git a/Minecraft.Client/Rendering/Models/DragonModel.cpp b/Minecraft.Client/net/minecraft/client/model/dragon/DragonModel.cpp similarity index 97% rename from Minecraft.Client/Rendering/Models/DragonModel.cpp rename to Minecraft.Client/net/minecraft/client/model/dragon/DragonModel.cpp index 51eebc1b0..0fcd901cf 100644 --- a/Minecraft.Client/Rendering/Models/DragonModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/dragon/DragonModel.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "DragonModel.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "../../../Minecraft.World/Entities/Mobs/EnderDragon.h" +#include "../../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/boss/enderdragon/EnderDragon.h" DragonModel::DragonModel(float g) : Model() { // 4J-PB diff --git a/Minecraft.Client/Rendering/Models/DragonModel.h b/Minecraft.Client/net/minecraft/client/model/dragon/DragonModel.h similarity index 93% rename from Minecraft.Client/Rendering/Models/DragonModel.h rename to Minecraft.Client/net/minecraft/client/model/dragon/DragonModel.h index 0dd52f588..670dcfa1d 100644 --- a/Minecraft.Client/Rendering/Models/DragonModel.h +++ b/Minecraft.Client/net/minecraft/client/model/dragon/DragonModel.h @@ -1,6 +1,6 @@ #pragma once -#include "Model.h" -#include "ModelPart.h" +#include "../geom/Model.h" +#include "../geom/ModelPart.h" class DragonModel : public Model { public: diff --git a/Minecraft.Client/Rendering/Models/EnderCrystalModel.cpp b/Minecraft.Client/net/minecraft/client/model/dragon/EnderCrystalModel.cpp similarity index 95% rename from Minecraft.Client/Rendering/Models/EnderCrystalModel.cpp rename to Minecraft.Client/net/minecraft/client/model/dragon/EnderCrystalModel.cpp index 3d6cf075b..1f644bde1 100644 --- a/Minecraft.Client/Rendering/Models/EnderCrystalModel.cpp +++ b/Minecraft.Client/net/minecraft/client/model/dragon/EnderCrystalModel.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "EnderCrystalModel.h" EnderCrystalModel::EnderCrystalModel(float g) { diff --git a/Minecraft.Client/Rendering/Models/EnderCrystalModel.h b/Minecraft.Client/net/minecraft/client/model/dragon/EnderCrystalModel.h similarity index 87% rename from Minecraft.Client/Rendering/Models/EnderCrystalModel.h rename to Minecraft.Client/net/minecraft/client/model/dragon/EnderCrystalModel.h index ead865977..68bb52d10 100644 --- a/Minecraft.Client/Rendering/Models/EnderCrystalModel.h +++ b/Minecraft.Client/net/minecraft/client/model/dragon/EnderCrystalModel.h @@ -1,6 +1,6 @@ #pragma once -#include "Model.h" -#include "ModelPart.h" +#include "../geom/Model.h" +#include "../geom/ModelPart.h" class EnderCrystalModel : public Model { public: diff --git a/Minecraft.Client/Rendering/Cube.cpp b/Minecraft.Client/net/minecraft/client/model/geom/Cube.cpp similarity index 96% rename from Minecraft.Client/Rendering/Cube.cpp rename to Minecraft.Client/net/minecraft/client/model/geom/Cube.cpp index b091fa158..faab6a9da 100644 --- a/Minecraft.Client/Rendering/Cube.cpp +++ b/Minecraft.Client/net/minecraft/client/model/geom/Cube.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "Models/Model.h" -#include "Models/ModelPart.h" -#include "Rendering/Vertex.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "Model.h" +#include "ModelPart.h" +#include "../Vertex.h" #include "Cube.h" #include diff --git a/Minecraft.Client/Rendering/Cube.h b/Minecraft.Client/net/minecraft/client/model/geom/Cube.h similarity index 81% rename from Minecraft.Client/Rendering/Cube.h rename to Minecraft.Client/net/minecraft/client/model/geom/Cube.h index 9075d0950..5a3fca7de 100644 --- a/Minecraft.Client/Rendering/Cube.h +++ b/Minecraft.Client/net/minecraft/client/model/geom/Cube.h @@ -1,9 +1,9 @@ #pragma once #include #include -#include "../../Minecraft.World/Util/ArrayWithLength.h" -#include "Vertex.h" -#include "Polygon.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/ArrayWithLength.h" +#include "../Vertex.h" +#include "../Polygon.h" class Model; diff --git a/Minecraft.Client/Rendering/Models/Model.cpp b/Minecraft.Client/net/minecraft/client/model/geom/Model.cpp similarity index 79% rename from Minecraft.Client/Rendering/Models/Model.cpp rename to Minecraft.Client/net/minecraft/client/model/geom/Model.cpp index 788738bd5..2f526e43d 100644 --- a/Minecraft.Client/Rendering/Models/Model.cpp +++ b/Minecraft.Client/net/minecraft/client/model/geom/Model.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../TexOffs.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "TexOffs.h" #include "Model.h" Model::Model() { diff --git a/Minecraft.Client/Rendering/Models/Model.h b/Minecraft.Client/net/minecraft/client/model/geom/Model.h similarity index 91% rename from Minecraft.Client/Rendering/Models/Model.h rename to Minecraft.Client/net/minecraft/client/model/geom/Model.h index 129eab6b5..73595a0f8 100644 --- a/Minecraft.Client/Rendering/Models/Model.h +++ b/Minecraft.Client/net/minecraft/client/model/geom/Model.h @@ -1,7 +1,7 @@ #pragma once -#include "../../../Minecraft.World/Util/Random.h" -#include "SkinBox.h" +#include "../../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" +#include "../../../../../Header Files/SkinBox.h" class Mob; class ModelPart; class TexOffs; diff --git a/Minecraft.Client/Rendering/Models/ModelPart.cpp b/Minecraft.Client/net/minecraft/client/model/geom/ModelPart.cpp similarity index 98% rename from Minecraft.Client/Rendering/Models/ModelPart.cpp rename to Minecraft.Client/net/minecraft/client/model/geom/ModelPart.cpp index 01d4ab249..f854895fb 100644 --- a/Minecraft.Client/Rendering/Models/ModelPart.cpp +++ b/Minecraft.Client/net/minecraft/client/model/geom/ModelPart.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../TexOffs.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "TexOffs.h" #include "ModelPart.h" -#include "../Cube.h" +#include "Cube.h" const float ModelPart::RAD = (180.0f / PI); diff --git a/Minecraft.Client/Rendering/Models/ModelPart.h b/Minecraft.Client/net/minecraft/client/model/geom/ModelPart.h similarity index 94% rename from Minecraft.Client/Rendering/Models/ModelPart.h rename to Minecraft.Client/net/minecraft/client/model/geom/ModelPart.h index 778420184..c1df1e1e9 100644 --- a/Minecraft.Client/Rendering/Models/ModelPart.h +++ b/Minecraft.Client/net/minecraft/client/model/geom/ModelPart.h @@ -1,9 +1,9 @@ #pragma once -#include "../../../Minecraft.World/Util/ArrayWithLength.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/ArrayWithLength.h" #include "../Vertex.h" #include "../Polygon.h" #include "Model.h" -#include "./SkinBox.h" +#include "../../../../../Header Files/SkinBox.h" class Cube; diff --git a/Minecraft.Client/Rendering/TexOffs.cpp b/Minecraft.Client/net/minecraft/client/model/geom/TexOffs.cpp similarity index 50% rename from Minecraft.Client/Rendering/TexOffs.cpp rename to Minecraft.Client/net/minecraft/client/model/geom/TexOffs.cpp index 4cb40a021..01577c5b6 100644 --- a/Minecraft.Client/Rendering/TexOffs.cpp +++ b/Minecraft.Client/net/minecraft/client/model/geom/TexOffs.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "TexOffs.h" TexOffs::TexOffs(int x, int y) : x(x), y(y) {} \ No newline at end of file diff --git a/Minecraft.Client/Rendering/TexOffs.h b/Minecraft.Client/net/minecraft/client/model/geom/TexOffs.h similarity index 100% rename from Minecraft.Client/Rendering/TexOffs.h rename to Minecraft.Client/net/minecraft/client/model/geom/TexOffs.h diff --git a/Minecraft.Client/Network/ClientConnection.cpp b/Minecraft.Client/net/minecraft/client/multiplayer/ClientConnection.cpp similarity index 97% rename from Minecraft.Client/Network/ClientConnection.cpp rename to Minecraft.Client/net/minecraft/client/multiplayer/ClientConnection.cpp index bbb0adc98..5ed082ce5 100644 --- a/Minecraft.Client/Network/ClientConnection.cpp +++ b/Minecraft.Client/net/minecraft/client/multiplayer/ClientConnection.cpp @@ -1,54 +1,54 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ClientConnection.h" #include #include -#include "../Level/MultiPlayerLevel.h" -#include "../Player/MultiPlayerLocalPlayer.h" -#include "../GameState/StatsCounter.h" -#include "../UI/Screens/ReceivingLevelScreen.h" -#include "../Player/RemotePlayer.h" -#include "../UI/Screens/DisconnectedScreen.h" -#include "../Rendering/Particles/TakeAnimationParticle.h" -#include "../Rendering/Particles/CritParticle.h" -#include "../Player/User.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.storage.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.chunk.h" -#include "../../Minecraft.World/Headers/net.minecraft.stats.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.npc.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.projectile.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.global.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.boss.enderdragon.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.monster.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.trading.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.saveddata.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.effect.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.food.h" -#include "../../Minecraft.World/Util/SharedConstants.h" -#include "../../Minecraft.World/Util/AABB.h" -#include "../../Minecraft.World/Util/Pos.h" -#include "../../Minecraft.World/Network/Socket.h" +#include "MultiPlayerLevel.h" +#include "MultiPlayerLocalPlayer.h" +#include "../../stats/StatsCounter.h" +#include "ReceivingLevelScreen.h" +#include "../player/RemotePlayer.h" +#include "DisconnectedScreen.h" +#include "../particle/TakeAnimationParticle.h" +#include "../particle/CritParticle.h" +#include "../User.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h" +#include "../../../../../Minecraft.World/net/minecraft/stats/net.minecraft.stats.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/npc/net.minecraft.world.entity.npc.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/global/net.minecraft.world.entity.global.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/boss/enderdragon/net.minecraft.world.entity.boss.enderdragon.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/trading/net.minecraft.world.item.trading.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/saveddata/net.minecraft.world.level.saveddata.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../Minecraft.World/net/minecraft/world/effect/net.minecraft.world.effect.h" +#include "../../../../../Minecraft.World/net/minecraft/world/food/net.minecraft.world.food.h" +#include "../../../../../Minecraft.World/net/minecraft/SharedConstants.h" +#include "../../../../../Minecraft.World/net/minecraft/world/phys/AABB.h" +#include "../../../../../Minecraft.World/net/minecraft/Pos.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Socket.h" #include "../Minecraft.h" -#include "../Rendering/EntityRenderers/ProgressRenderer.h" -#include "../Rendering/LevelRenderer.h" -#include "../GameState/Options.h" -#include "../MinecraftServer.h" +#include "../ProgressRenderer.h" +#include "../renderer/LevelRenderer.h" +#include "../Options.h" +#include "../../server/MinecraftServer.h" #include "../ClientConstants.h" -#include "../../Minecraft.World/Util/SoundTypes.h" -#include "../Textures/Packs/TexturePackRepository.h" -#include "UI/Screens/MerchantScreen.h" -#include "../Platform/Common/UI/UI.h" -#include "../Textures/Packs/DLCTexturePack.h" +#include "../../../../../Minecraft.World/Header Files/SoundTypes.h" +#include "../skins/TexturePackRepository.h" +#include "../gui/MerchantScreen.h" +#include "../../../../Common/Source Files/UI/UI.h" +#include "../skins/DLCTexturePack.h" ClientConnection::ClientConnection(Minecraft* minecraft, const std::wstring& ip, int port) { diff --git a/Minecraft.Client/Network/ClientConnection.h b/Minecraft.Client/net/minecraft/client/multiplayer/ClientConnection.h similarity index 99% rename from Minecraft.Client/Network/ClientConnection.h rename to Minecraft.Client/net/minecraft/client/multiplayer/ClientConnection.h index b1deb132f..de46631d6 100644 --- a/Minecraft.Client/Network/ClientConnection.h +++ b/Minecraft.Client/net/minecraft/client/multiplayer/ClientConnection.h @@ -1,5 +1,5 @@ #pragma once -#include "../../Minecraft.World/Headers/net.minecraft.network.h" +#include "../../../../../Minecraft.World/net/minecraft/network/net.minecraft.network.h" class Minecraft; class MultiPlayerLevel; class SavedDataStorage; diff --git a/Minecraft.Client/UI/Screens/ConnectScreen.cpp b/Minecraft.Client/net/minecraft/client/multiplayer/ConnectScreen.cpp similarity index 86% rename from Minecraft.Client/UI/Screens/ConnectScreen.cpp rename to Minecraft.Client/net/minecraft/client/multiplayer/ConnectScreen.cpp index 9b861b78a..29ba0273b 100644 --- a/Minecraft.Client/UI/Screens/ConnectScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/multiplayer/ConnectScreen.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ConnectScreen.h" -#include "../../Network/ClientConnection.h" -#include "TitleScreen.h" -#include "../Button.h" -#include "../../Minecraft.h" -#include "../../Player/User.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" +#include "ClientConnection.h" +#include "../title/TitleScreen.h" +#include "../gui/Button.h" +#include "../Minecraft.h" +#include "../User.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" ConnectScreen::ConnectScreen(Minecraft* minecraft, const std::wstring& ip, int port) { diff --git a/Minecraft.Client/UI/Screens/ConnectScreen.h b/Minecraft.Client/net/minecraft/client/multiplayer/ConnectScreen.h similarity index 95% rename from Minecraft.Client/UI/Screens/ConnectScreen.h rename to Minecraft.Client/net/minecraft/client/multiplayer/ConnectScreen.h index f99add276..b0baab5e5 100644 --- a/Minecraft.Client/UI/Screens/ConnectScreen.h +++ b/Minecraft.Client/net/minecraft/client/multiplayer/ConnectScreen.h @@ -1,5 +1,5 @@ #pragma once -#include "../Screen.h" +#include "../gui/Screen.h" class ClientConnection; class Minecraft; diff --git a/Minecraft.Client/UI/Screens/DisconnectedScreen.cpp b/Minecraft.Client/net/minecraft/client/multiplayer/DisconnectedScreen.cpp similarity index 85% rename from Minecraft.Client/UI/Screens/DisconnectedScreen.cpp rename to Minecraft.Client/net/minecraft/client/multiplayer/DisconnectedScreen.cpp index d23211a80..349154363 100644 --- a/Minecraft.Client/UI/Screens/DisconnectedScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/multiplayer/DisconnectedScreen.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "DisconnectedScreen.h" -#include "TitleScreen.h" -#include "../Button.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" +#include "../title/TitleScreen.h" +#include "../gui/Button.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" DisconnectedScreen::DisconnectedScreen(const std::wstring& title, const std::wstring reason, diff --git a/Minecraft.Client/UI/Screens/DisconnectedScreen.h b/Minecraft.Client/net/minecraft/client/multiplayer/DisconnectedScreen.h similarity index 95% rename from Minecraft.Client/UI/Screens/DisconnectedScreen.h rename to Minecraft.Client/net/minecraft/client/multiplayer/DisconnectedScreen.h index 1dcc1151d..c3b84068d 100644 --- a/Minecraft.Client/UI/Screens/DisconnectedScreen.h +++ b/Minecraft.Client/net/minecraft/client/multiplayer/DisconnectedScreen.h @@ -1,5 +1,5 @@ #pragma once -#include "../Screen.h" +#include "../gui/Screen.h" class DisconnectedScreen : public Screen { private: diff --git a/Minecraft.Client/Network/MultiPlayerChunkCache.cpp b/Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerChunkCache.cpp similarity index 93% rename from Minecraft.Client/Network/MultiPlayerChunkCache.cpp rename to Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerChunkCache.cpp index 960b231be..083cf2b52 100644 --- a/Minecraft.Client/Network/MultiPlayerChunkCache.cpp +++ b/Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerChunkCache.cpp @@ -1,14 +1,14 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "MultiPlayerChunkCache.h" -#include "ServerChunkCache.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.chunk.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../../Minecraft.World/Util/Arrays.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../MinecraftServer.h" -#include "../Level/ServerLevel.h" -#include "../../Minecraft.World/Blocks/Tile.h" -#include "../../Minecraft.World/Level/WaterLevelChunk.h" +#include "../../server/level/ServerChunkCache.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Arrays.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../server/MinecraftServer.h" +#include "../../server/level/ServerLevel.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/Tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/WaterLevelChunk.h" MultiPlayerChunkCache::MultiPlayerChunkCache(Level* level) { XZSIZE = level->dimension->getXZSize(); // 4J Added diff --git a/Minecraft.Client/Network/MultiPlayerChunkCache.h b/Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerChunkCache.h similarity index 84% rename from Minecraft.Client/Network/MultiPlayerChunkCache.h rename to Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerChunkCache.h index 63b114bf9..89840a4cc 100644 --- a/Minecraft.Client/Network/MultiPlayerChunkCache.h +++ b/Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerChunkCache.h @@ -1,8 +1,8 @@ #pragma once #include -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.chunk.h" -#include "../../Minecraft.World/Level/RandomLevelSource.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/levelgen/RandomLevelSource.h" class ServerChunkCache; diff --git a/Minecraft.Client/Player/MultiPlayerGameMode.cpp b/Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerGameMode.cpp similarity index 96% rename from Minecraft.Client/Player/MultiPlayerGameMode.cpp rename to Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerGameMode.cpp index 29a804452..e4aa77e19 100644 --- a/Minecraft.Client/Player/MultiPlayerGameMode.cpp +++ b/Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerGameMode.cpp @@ -1,17 +1,17 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "MultiPlayerGameMode.h" -#include "../GameState/CreativeMode.h" +#include "../../server/level/CreativeMode.h" #include "MultiPlayerLocalPlayer.h" -#include "../Level/MultiPlayerLevel.h" +#include "MultiPlayerLevel.h" #include "../Minecraft.h" -#include "../Network/ClientConnection.h" -#include "../Rendering/LevelRenderer.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.h" +#include "ClientConnection.h" +#include "../renderer/LevelRenderer.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/net.minecraft.h" MultiPlayerGameMode::MultiPlayerGameMode(Minecraft* minecraft, ClientConnection* connection) { diff --git a/Minecraft.Client/Player/MultiPlayerGameMode.h b/Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerGameMode.h similarity index 98% rename from Minecraft.Client/Player/MultiPlayerGameMode.h rename to Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerGameMode.h index a43685cd9..c255c7b36 100644 --- a/Minecraft.Client/Player/MultiPlayerGameMode.h +++ b/Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerGameMode.h @@ -1,5 +1,5 @@ #pragma once -#include "../GameState/GameMode.h" +#include "../../server/level/GameMode.h" class ClientConnection; class GameType; class Vec3; diff --git a/Minecraft.Client/Level/MultiPlayerLevel.cpp b/Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerLevel.cpp similarity index 97% rename from Minecraft.Client/Level/MultiPlayerLevel.cpp rename to Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerLevel.cpp index 1bf05b98a..fdd59cf56 100644 --- a/Minecraft.Client/Level/MultiPlayerLevel.cpp +++ b/Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerLevel.cpp @@ -1,20 +1,20 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include #include "MultiPlayerLevel.h" -#include "../Player/MultiPlayerLocalPlayer.h" -#include "../Network/ClientConnection.h" -#include "../Network/MultiPlayerChunkCache.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.storage.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../../Minecraft.World/Util/Pos.h" -#include "../MinecraftServer.h" -#include "ServerLevel.h" +#include "MultiPlayerLocalPlayer.h" +#include "ClientConnection.h" +#include "MultiPlayerChunkCache.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../Minecraft.World/net/minecraft/Pos.h" +#include "../../server/MinecraftServer.h" +#include "../../server/level/ServerLevel.h" #include "../Minecraft.h" -#include "../Rendering/Particles/FireworksParticles.h" -#include "../../Minecraft.World/Entities/Mobs/PrimedTnt.h" -#include "../../Minecraft.World/Blocks/Tile.h" -#include "../../Minecraft.World/Blocks/TileEntities/TileEntity.h" -#include "../../Minecraft.World/Util/JavaMath.h" +#include "../particle/FireworksParticles.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/item/PrimedTnt.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/Tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/TileEntity.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" MultiPlayerLevel::ResetInfo::ResetInfo(int x, int y, int z, int tile, int data) { diff --git a/Minecraft.Client/Level/MultiPlayerLevel.h b/Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerLevel.h similarity index 92% rename from Minecraft.Client/Level/MultiPlayerLevel.h rename to Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerLevel.h index aeb70e2bc..d9a035605 100644 --- a/Minecraft.Client/Level/MultiPlayerLevel.h +++ b/Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerLevel.h @@ -1,9 +1,9 @@ #pragma once -#include "../../Minecraft.World/Util/HashExtension.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "../../Minecraft.World/Util/JavaIntHash.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/HashExtension.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaIntHash.h" class ClientConnection; class MultiPlayerChunkCache; diff --git a/Minecraft.Client/Player/MultiPlayerLocalPlayer.cpp b/Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.cpp similarity index 93% rename from Minecraft.Client/Player/MultiPlayerLocalPlayer.cpp rename to Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.cpp index 4fc916c09..e8c9c2f9b 100644 --- a/Minecraft.Client/Player/MultiPlayerLocalPlayer.cpp +++ b/Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.cpp @@ -1,19 +1,19 @@ -#include "../Platform/stdafx.h" -// #include "../../Minecraft.World/Util/JavaMath.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +// #include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" #include "MultiPlayerLocalPlayer.h" -#include "../Network/ClientConnection.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.h" -#include "../../Minecraft.World/Util/Mth.h" -#include "../../Minecraft.World/Util/AABB.h" -#include "../../Minecraft.World/Headers/net.minecraft.stats.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.effect.h" -#include "../../Minecraft.World/Level/LevelData.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.item.h" -#include "../Input/Input.h" -#include "../Rendering/LevelRenderer.h" +#include "ClientConnection.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/network/net.minecraft.network.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "../../../../../Minecraft.World/net/minecraft/world/phys/AABB.h" +#include "../../../../../Minecraft.World/net/minecraft/stats/net.minecraft.stats.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../Minecraft.World/net/minecraft/world/effect/net.minecraft.world.effect.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/storage/LevelData.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h" +#include "../player/Input.h" +#include "../renderer/LevelRenderer.h" // 4J added for testing #if defined(STRESS_TEST_MOVE) diff --git a/Minecraft.Client/Player/MultiPlayerLocalPlayer.h b/Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h similarity index 95% rename from Minecraft.Client/Player/MultiPlayerLocalPlayer.h rename to Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h index a68e7ee02..337bba8cc 100644 --- a/Minecraft.Client/Player/MultiPlayerLocalPlayer.h +++ b/Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h @@ -1,7 +1,7 @@ #pragma once #include -#include "LocalPlayer.h" -#include "../../Minecraft.World/Util/SharedConstants.h" +#include "../player/LocalPlayer.h" +#include "../../../../../Minecraft.World/net/minecraft/SharedConstants.h" class ClientConnection; class Minecraft; diff --git a/Minecraft.Client/Network/PlayerInfo.h b/Minecraft.Client/net/minecraft/client/multiplayer/PlayerInfo.h similarity index 100% rename from Minecraft.Client/Network/PlayerInfo.h rename to Minecraft.Client/net/minecraft/client/multiplayer/PlayerInfo.h diff --git a/Minecraft.Client/UI/Screens/ReceivingLevelScreen.cpp b/Minecraft.Client/net/minecraft/client/multiplayer/ReceivingLevelScreen.cpp similarity index 84% rename from Minecraft.Client/UI/Screens/ReceivingLevelScreen.cpp rename to Minecraft.Client/net/minecraft/client/multiplayer/ReceivingLevelScreen.cpp index 013d3a675..4b17a217e 100644 --- a/Minecraft.Client/UI/Screens/ReceivingLevelScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/multiplayer/ReceivingLevelScreen.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ReceivingLevelScreen.h" -#include "../../Network/ClientConnection.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" +#include "ClientConnection.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" ReceivingLevelScreen::ReceivingLevelScreen(ClientConnection* connection) { tickCount = 0; diff --git a/Minecraft.Client/UI/Screens/ReceivingLevelScreen.h b/Minecraft.Client/net/minecraft/client/multiplayer/ReceivingLevelScreen.h similarity index 95% rename from Minecraft.Client/UI/Screens/ReceivingLevelScreen.h rename to Minecraft.Client/net/minecraft/client/multiplayer/ReceivingLevelScreen.h index fb54bec4d..c49884eda 100644 --- a/Minecraft.Client/UI/Screens/ReceivingLevelScreen.h +++ b/Minecraft.Client/net/minecraft/client/multiplayer/ReceivingLevelScreen.h @@ -1,5 +1,5 @@ #pragma once -#include "../Screen.h" +#include "../gui/Screen.h" class ClientConnection; class ReceivingLevelScreen : public Screen { diff --git a/Minecraft.Client/Rendering/Particles/BreakingItemParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/BreakingItemParticle.cpp similarity index 87% rename from Minecraft.Client/Rendering/Particles/BreakingItemParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/BreakingItemParticle.cpp index 9ee928679..9cd46035f 100644 --- a/Minecraft.Client/Rendering/Particles/BreakingItemParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/BreakingItemParticle.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "BreakingItemParticle.h" -#include "../Tesselator.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.h" +#include "../renderer/Tesselator.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" void BreakingItemParticle::_init(Item* item, Textures* textures, int data) { this->setTex(textures, item->getIcon(data)); diff --git a/Minecraft.Client/Rendering/Particles/BreakingItemParticle.h b/Minecraft.Client/net/minecraft/client/particle/BreakingItemParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/BreakingItemParticle.h rename to Minecraft.Client/net/minecraft/client/particle/BreakingItemParticle.h diff --git a/Minecraft.Client/Rendering/Particles/BubbleParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/BubbleParticle.cpp similarity index 66% rename from Minecraft.Client/Rendering/Particles/BubbleParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/BubbleParticle.cpp index 79008ef54..2b629bdb4 100644 --- a/Minecraft.Client/Rendering/Particles/BubbleParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/BubbleParticle.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "BubbleParticle.h" -#include "../../../Minecraft.World/Util/Random.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "../../../Minecraft.World/Util/JavaMath.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.material.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/material/net.minecraft.world.level.material.h" BubbleParticle::BubbleParticle(Level* level, double x, double y, double z, double xa, double ya, double za) diff --git a/Minecraft.Client/Rendering/Particles/BubbleParticle.h b/Minecraft.Client/net/minecraft/client/particle/BubbleParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/BubbleParticle.h rename to Minecraft.Client/net/minecraft/client/particle/BubbleParticle.h diff --git a/Minecraft.Client/Rendering/Particles/CritParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/CritParticle.cpp similarity index 81% rename from Minecraft.Client/Rendering/Particles/CritParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/CritParticle.cpp index fba87aca0..26ab31d2e 100644 --- a/Minecraft.Client/Rendering/Particles/CritParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/CritParticle.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "CritParticle.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "../../../Minecraft.World/Util/Random.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.phys.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" +#include "../../../../../Minecraft.World/net/minecraft/world/phys/net.minecraft.world.phys.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" void CritParticle::_init(Level* level, std::shared_ptr entity, ePARTICLE_TYPE type) { diff --git a/Minecraft.Client/Rendering/Particles/CritParticle.h b/Minecraft.Client/net/minecraft/client/particle/CritParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/CritParticle.h rename to Minecraft.Client/net/minecraft/client/particle/CritParticle.h diff --git a/Minecraft.Client/Rendering/Particles/CritParticle2.cpp b/Minecraft.Client/net/minecraft/client/particle/CritParticle2.cpp similarity index 93% rename from Minecraft.Client/Rendering/Particles/CritParticle2.cpp rename to Minecraft.Client/net/minecraft/client/particle/CritParticle2.cpp index cd9f40d32..d835105f1 100644 --- a/Minecraft.Client/Rendering/Particles/CritParticle2.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/CritParticle2.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "CritParticle2.h" -#include "../../../Minecraft.World/Util/JavaMath.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" void CritParticle2::_init(double xa, double ya, double za, float scale) { xd *= 0.1f; diff --git a/Minecraft.Client/Rendering/Particles/CritParticle2.h b/Minecraft.Client/net/minecraft/client/particle/CritParticle2.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/CritParticle2.h rename to Minecraft.Client/net/minecraft/client/particle/CritParticle2.h diff --git a/Minecraft.Client/Rendering/Particles/DragonBreathParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/DragonBreathParticle.cpp similarity index 95% rename from Minecraft.Client/Rendering/Particles/DragonBreathParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/DragonBreathParticle.cpp index ca58a3250..df2367cf2 100644 --- a/Minecraft.Client/Rendering/Particles/DragonBreathParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/DragonBreathParticle.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Util/JavaMath.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" #include "DragonBreathParticle.h" void DragonBreathParticle::init(Level* level, double x, double y, double z, diff --git a/Minecraft.Client/Rendering/Particles/DragonBreathParticle.h b/Minecraft.Client/net/minecraft/client/particle/DragonBreathParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/DragonBreathParticle.h rename to Minecraft.Client/net/minecraft/client/particle/DragonBreathParticle.h diff --git a/Minecraft.Client/Rendering/Particles/DripParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/DripParticle.cpp similarity index 88% rename from Minecraft.Client/Rendering/Particles/DripParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/DripParticle.cpp index be5e8f889..2ef052a1f 100644 --- a/Minecraft.Client/Rendering/Particles/DripParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/DripParticle.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.material.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Util/JavaMath.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/material/net.minecraft.world.level.material.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" #include "DripParticle.h" DripParticle::DripParticle(Level* level, double x, double y, double z, diff --git a/Minecraft.Client/Rendering/Particles/DripParticle.h b/Minecraft.Client/net/minecraft/client/particle/DripParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/DripParticle.h rename to Minecraft.Client/net/minecraft/client/particle/DripParticle.h diff --git a/Minecraft.Client/Rendering/Particles/EnchantmentTableParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/EnchantmentTableParticle.cpp similarity index 93% rename from Minecraft.Client/Rendering/Particles/EnchantmentTableParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/EnchantmentTableParticle.cpp index ff20c175f..069e5170d 100644 --- a/Minecraft.Client/Rendering/Particles/EnchantmentTableParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/EnchantmentTableParticle.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Util/JavaMath.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" #include "EnchantmentTableParticle.h" EchantmentTableParticle::EchantmentTableParticle(Level* level, double x, diff --git a/Minecraft.Client/Rendering/Particles/EnchantmentTableParticle.h b/Minecraft.Client/net/minecraft/client/particle/EnchantmentTableParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/EnchantmentTableParticle.h rename to Minecraft.Client/net/minecraft/client/particle/EnchantmentTableParticle.h diff --git a/Minecraft.Client/Rendering/Particles/EnderParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/EnderParticle.cpp similarity index 92% rename from Minecraft.Client/Rendering/Particles/EnderParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/EnderParticle.cpp index 5e9458e32..d7a242bbd 100644 --- a/Minecraft.Client/Rendering/Particles/EnderParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/EnderParticle.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "EnderParticle.h" -#include "../../../Minecraft.World/Util/JavaMath.h" -#include "../../../Minecraft.World/Util/Random.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" // 4J Stu - This class was originally "PortalParticle" but I have split the two // uses of the particle End creatures/items (e.g. EnderMan, EyeOfEnder, etc) use diff --git a/Minecraft.Client/Rendering/Particles/EnderParticle.h b/Minecraft.Client/net/minecraft/client/particle/EnderParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/EnderParticle.h rename to Minecraft.Client/net/minecraft/client/particle/EnderParticle.h diff --git a/Minecraft.Client/Rendering/Particles/ExplodeParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/ExplodeParticle.cpp similarity index 90% rename from Minecraft.Client/Rendering/Particles/ExplodeParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/ExplodeParticle.cpp index 586428892..6e7a4f783 100644 --- a/Minecraft.Client/Rendering/Particles/ExplodeParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/ExplodeParticle.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ExplodeParticle.h" -#include "../../../Minecraft.World/Util/JavaMath.h" -#include "../../../Minecraft.World/Util/Random.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" ExplodeParticle::ExplodeParticle(Level* level, double x, double y, double z, double xa, double ya, double za) diff --git a/Minecraft.Client/Rendering/Particles/ExplodeParticle.h b/Minecraft.Client/net/minecraft/client/particle/ExplodeParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/ExplodeParticle.h rename to Minecraft.Client/net/minecraft/client/particle/ExplodeParticle.h diff --git a/Minecraft.Client/Rendering/Particles/FireworksParticles.cpp b/Minecraft.Client/net/minecraft/client/particle/FireworksParticles.cpp similarity index 98% rename from Minecraft.Client/Rendering/Particles/FireworksParticles.cpp rename to Minecraft.Client/net/minecraft/client/particle/FireworksParticles.cpp index 00a3c0daa..58ec0fa70 100644 --- a/Minecraft.Client/Rendering/Particles/FireworksParticles.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/FireworksParticles.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" #include "FireworksParticles.h" -#include "../Tesselator.h" -#include "../../../Minecraft.World/Level/Level.h" +#include "../renderer/Tesselator.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/Level.h" FireworksParticles::FireworksStarter::FireworksStarter( Level* level, double x, double y, double z, double xd, double yd, double zd, diff --git a/Minecraft.Client/Rendering/Particles/FireworksParticles.h b/Minecraft.Client/net/minecraft/client/particle/FireworksParticles.h similarity index 97% rename from Minecraft.Client/Rendering/Particles/FireworksParticles.h rename to Minecraft.Client/net/minecraft/client/particle/FireworksParticles.h index 95bb71740..7c953456f 100644 --- a/Minecraft.Client/Rendering/Particles/FireworksParticles.h +++ b/Minecraft.Client/net/minecraft/client/particle/FireworksParticles.h @@ -1,6 +1,6 @@ #pragma once #include "Particle.h" -#include "../../../Minecraft.World/IO/NBT/CompoundTag.h" +#include "../../../../../Minecraft.World/com/mojang/nbt/CompoundTag.h" class ParticleEngine; diff --git a/Minecraft.Client/Rendering/Particles/FlameParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/FlameParticle.cpp similarity index 89% rename from Minecraft.Client/Rendering/Particles/FlameParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/FlameParticle.cpp index 89106e8e4..67ceada0a 100644 --- a/Minecraft.Client/Rendering/Particles/FlameParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/FlameParticle.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Util/JavaMath.h" -#include "../../../Minecraft.World/Util/Random.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" #include "FlameParticle.h" FlameParticle::FlameParticle(Level* level, double x, double y, double z, diff --git a/Minecraft.Client/Rendering/Particles/FlameParticle.h b/Minecraft.Client/net/minecraft/client/particle/FlameParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/FlameParticle.h rename to Minecraft.Client/net/minecraft/client/particle/FlameParticle.h diff --git a/Minecraft.Client/Rendering/Particles/FootstepParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/FootstepParticle.cpp similarity index 84% rename from Minecraft.Client/Rendering/Particles/FootstepParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/FootstepParticle.cpp index 9f1dc5647..35f1a75d5 100644 --- a/Minecraft.Client/Rendering/Particles/FootstepParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/FootstepParticle.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "FootstepParticle.h" -#include "../../Textures/Textures.h" -#include "../Tesselator.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Textures/ResourceLocation.h" +#include "../renderer/Textures.h" +#include "../renderer/Tesselator.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../resources/ResourceLocation.h" ResourceLocation FootstepParticle::FOOTPRINT_LOCATION = ResourceLocation(TN_MISC_FOOTSTEP); diff --git a/Minecraft.Client/Rendering/Particles/FootstepParticle.h b/Minecraft.Client/net/minecraft/client/particle/FootstepParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/FootstepParticle.h rename to Minecraft.Client/net/minecraft/client/particle/FootstepParticle.h diff --git a/Minecraft.Client/Rendering/Particles/HeartParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/HeartParticle.cpp similarity index 95% rename from Minecraft.Client/Rendering/Particles/HeartParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/HeartParticle.cpp index cb77054ce..1ed8fb040 100644 --- a/Minecraft.Client/Rendering/Particles/HeartParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/HeartParticle.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "HeartParticle.h" // 4J - added diff --git a/Minecraft.Client/Rendering/Particles/HeartParticle.h b/Minecraft.Client/net/minecraft/client/particle/HeartParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/HeartParticle.h rename to Minecraft.Client/net/minecraft/client/particle/HeartParticle.h diff --git a/Minecraft.Client/Rendering/Particles/HugeExplosionParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/HugeExplosionParticle.cpp similarity index 91% rename from Minecraft.Client/Rendering/Particles/HugeExplosionParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/HugeExplosionParticle.cpp index 018204c5f..d71b90603 100644 --- a/Minecraft.Client/Rendering/Particles/HugeExplosionParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/HugeExplosionParticle.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "HugeExplosionParticle.h" -#include "../../../Minecraft.World/Util/Random.h" -#include "../../Textures/Textures.h" -#include "../Tesselator.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" +#include "../renderer/Textures.h" +#include "../renderer/Tesselator.h" #include "../Lighting.h" -#include "../../Textures/ResourceLocation.h" +#include "../resources/ResourceLocation.h" ResourceLocation HugeExplosionParticle::EXPLOSION_LOCATION = ResourceLocation(TN_MISC_EXPLOSION); diff --git a/Minecraft.Client/Rendering/Particles/HugeExplosionParticle.h b/Minecraft.Client/net/minecraft/client/particle/HugeExplosionParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/HugeExplosionParticle.h rename to Minecraft.Client/net/minecraft/client/particle/HugeExplosionParticle.h diff --git a/Minecraft.Client/Rendering/Particles/HugeExplosionSeedParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/HugeExplosionSeedParticle.cpp similarity index 87% rename from Minecraft.Client/Rendering/Particles/HugeExplosionSeedParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/HugeExplosionSeedParticle.cpp index 0dad12558..35bb81e5c 100644 --- a/Minecraft.Client/Rendering/Particles/HugeExplosionSeedParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/HugeExplosionSeedParticle.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "HugeExplosionSeedParticle.h" -#include "../../../Minecraft.World/Util/Random.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" HugeExplosionSeedParticle::HugeExplosionSeedParticle(Level* level, double x, double y, double z, diff --git a/Minecraft.Client/Rendering/Particles/HugeExplosionSeedParticle.h b/Minecraft.Client/net/minecraft/client/particle/HugeExplosionSeedParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/HugeExplosionSeedParticle.h rename to Minecraft.Client/net/minecraft/client/particle/HugeExplosionSeedParticle.h diff --git a/Minecraft.Client/Rendering/Particles/LavaParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/LavaParticle.cpp similarity index 82% rename from Minecraft.Client/Rendering/Particles/LavaParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/LavaParticle.cpp index b3cb03c18..b514d084f 100644 --- a/Minecraft.Client/Rendering/Particles/LavaParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/LavaParticle.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "LavaParticle.h" -#include "../../../Minecraft.World/Util/JavaMath.h" -#include "../../../Minecraft.World/Util/Random.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" LavaParticle::LavaParticle(Level* level, double x, double y, double z) : Particle(level, x, y, z, 0, 0, 0) { diff --git a/Minecraft.Client/Rendering/Particles/LavaParticle.h b/Minecraft.Client/net/minecraft/client/particle/LavaParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/LavaParticle.h rename to Minecraft.Client/net/minecraft/client/particle/LavaParticle.h diff --git a/Minecraft.Client/Rendering/Particles/NetherPortalParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/NetherPortalParticle.cpp similarity index 92% rename from Minecraft.Client/Rendering/Particles/NetherPortalParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/NetherPortalParticle.cpp index 315adc071..373c33122 100644 --- a/Minecraft.Client/Rendering/Particles/NetherPortalParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/NetherPortalParticle.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "NetherPortalParticle.h" -#include "../../../Minecraft.World/Util/JavaMath.h" -#include "../../../Minecraft.World/Util/Random.h" -#include "../../Minecraft.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" +#include "../Minecraft.h" // 4J Stu - This class was originally "PortalParticle" but I have split the two // uses of the particle Only the nether portal uses this particle diff --git a/Minecraft.Client/Rendering/Particles/NetherPortalParticle.h b/Minecraft.Client/net/minecraft/client/particle/NetherPortalParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/NetherPortalParticle.h rename to Minecraft.Client/net/minecraft/client/particle/NetherPortalParticle.h diff --git a/Minecraft.Client/Rendering/Particles/NoteParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/NoteParticle.cpp similarity index 95% rename from Minecraft.Client/Rendering/Particles/NoteParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/NoteParticle.cpp index db6bb47b5..f44850d2f 100644 --- a/Minecraft.Client/Rendering/Particles/NoteParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/NoteParticle.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" #include "NoteParticle.h" void NoteParticle::init(Level* level, double x, double y, double z, double xa, diff --git a/Minecraft.Client/Rendering/Particles/NoteParticle.h b/Minecraft.Client/net/minecraft/client/particle/NoteParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/NoteParticle.h rename to Minecraft.Client/net/minecraft/client/particle/NoteParticle.h diff --git a/Minecraft.Client/Rendering/Particles/Particle.cpp b/Minecraft.Client/net/minecraft/client/particle/Particle.cpp similarity index 93% rename from Minecraft.Client/Rendering/Particles/Particle.cpp rename to Minecraft.Client/net/minecraft/client/particle/Particle.cpp index fb4b7f0c8..6ae03048f 100644 --- a/Minecraft.Client/Rendering/Particles/Particle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/Particle.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "Particle.h" -#include "../Tesselator.h" -#include "../../../Minecraft.World/Util/Random.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "../../../Minecraft.World/Util/JavaMath.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.h" +#include "../renderer/Tesselator.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" /* protected int tex; diff --git a/Minecraft.Client/Rendering/Particles/Particle.h b/Minecraft.Client/net/minecraft/client/particle/Particle.h similarity index 90% rename from Minecraft.Client/Rendering/Particles/Particle.h rename to Minecraft.Client/net/minecraft/client/particle/Particle.h index f8b99761f..2d796b189 100644 --- a/Minecraft.Client/Rendering/Particles/Particle.h +++ b/Minecraft.Client/net/minecraft/client/particle/Particle.h @@ -1,7 +1,7 @@ #pragma once -#include "../../../Minecraft.World/Entities/Entity.h" -#include "../../../Minecraft.World/Util/ParticleTypes.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/Entity.h" +#include "../../../../../Minecraft.World/Header Files/ParticleTypes.h" #include "ParticleEngine.h" class Tesselator; class CompoundTag; diff --git a/Minecraft.Client/Rendering/Particles/ParticleEngine.cpp b/Minecraft.Client/net/minecraft/client/particle/ParticleEngine.cpp similarity index 93% rename from Minecraft.Client/Rendering/Particles/ParticleEngine.cpp rename to Minecraft.Client/net/minecraft/client/particle/ParticleEngine.cpp index 9ae08c5d3..ab9964953 100644 --- a/Minecraft.Client/Rendering/Particles/ParticleEngine.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/ParticleEngine.cpp @@ -1,17 +1,17 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ParticleEngine.h" #include "Particle.h" -#include "../../Textures/Textures.h" -#include "../../Textures/TextureAtlas.h" -#include "../Tesselator.h" +#include "../renderer/Textures.h" +#include "../renderer/texture/TextureAtlas.h" +#include "../renderer/Tesselator.h" #include "TerrainParticle.h" -#include "../../Textures/ResourceLocation.h" +#include "../resources/ResourceLocation.h" #include "../Camera.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" ResourceLocation ParticleEngine::PARTICLES_LOCATION = ResourceLocation(TN_PARTICLES); diff --git a/Minecraft.Client/Rendering/Particles/ParticleEngine.h b/Minecraft.Client/net/minecraft/client/particle/ParticleEngine.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/ParticleEngine.h rename to Minecraft.Client/net/minecraft/client/particle/ParticleEngine.h diff --git a/Minecraft.Client/Rendering/Particles/PlayerCloudParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/PlayerCloudParticle.cpp similarity index 77% rename from Minecraft.Client/Rendering/Particles/PlayerCloudParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/PlayerCloudParticle.cpp index adcbc1989..7b920930c 100644 --- a/Minecraft.Client/Rendering/Particles/PlayerCloudParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/PlayerCloudParticle.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "PlayerCloudParticle.h" -#include "../../../Minecraft.World/Util/JavaMath.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.phys.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/world/phys/net.minecraft.world.phys.h" PlayerCloudParticle::PlayerCloudParticle(Level* level, double x, double y, double z, double xa, double ya, diff --git a/Minecraft.Client/Rendering/Particles/PlayerCloudParticle.h b/Minecraft.Client/net/minecraft/client/particle/PlayerCloudParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/PlayerCloudParticle.h rename to Minecraft.Client/net/minecraft/client/particle/PlayerCloudParticle.h diff --git a/Minecraft.Client/Rendering/Particles/RedDustParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/RedDustParticle.cpp similarity index 94% rename from Minecraft.Client/Rendering/Particles/RedDustParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/RedDustParticle.cpp index aac218649..22d6e5f95 100644 --- a/Minecraft.Client/Rendering/Particles/RedDustParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/RedDustParticle.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Util/JavaMath.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" #include "RedDustParticle.h" void RedDustParticle::init(Level* level, double x, double y, double z, diff --git a/Minecraft.Client/Rendering/Particles/RedDustParticle.h b/Minecraft.Client/net/minecraft/client/particle/RedDustParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/RedDustParticle.h rename to Minecraft.Client/net/minecraft/client/particle/RedDustParticle.h diff --git a/Minecraft.Client/Rendering/Particles/SmokeParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/SmokeParticle.cpp similarity index 93% rename from Minecraft.Client/Rendering/Particles/SmokeParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/SmokeParticle.cpp index 58794dbc7..a6395b66d 100644 --- a/Minecraft.Client/Rendering/Particles/SmokeParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/SmokeParticle.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Util/JavaMath.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" #include "SmokeParticle.h" void SmokeParticle::init(Level* level, double x, double y, double z, double xa, diff --git a/Minecraft.Client/Rendering/Particles/SmokeParticle.h b/Minecraft.Client/net/minecraft/client/particle/SmokeParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/SmokeParticle.h rename to Minecraft.Client/net/minecraft/client/particle/SmokeParticle.h diff --git a/Minecraft.Client/Rendering/Particles/SnowShovelParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/SnowShovelParticle.cpp similarity index 92% rename from Minecraft.Client/Rendering/Particles/SnowShovelParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/SnowShovelParticle.cpp index 4dd53aaa3..9b99f1a24 100644 --- a/Minecraft.Client/Rendering/Particles/SnowShovelParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/SnowShovelParticle.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Util/JavaMath.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" #include "SnowShovelParticle.h" void SnowShovelParticle::init(Level* level, double x, double y, double z, diff --git a/Minecraft.Client/Rendering/Particles/SnowShovelParticle.h b/Minecraft.Client/net/minecraft/client/particle/SnowShovelParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/SnowShovelParticle.h rename to Minecraft.Client/net/minecraft/client/particle/SnowShovelParticle.h diff --git a/Minecraft.Client/Rendering/Particles/SpellParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/SpellParticle.cpp similarity index 89% rename from Minecraft.Client/Rendering/Particles/SpellParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/SpellParticle.cpp index 661f24d2d..fc4ef5abf 100644 --- a/Minecraft.Client/Rendering/Particles/SpellParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/SpellParticle.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Util/JavaMath.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" #include "SpellParticle.h" SpellParticle::SpellParticle(Level* level, double x, double y, double z, diff --git a/Minecraft.Client/Rendering/Particles/SpellParticle.h b/Minecraft.Client/net/minecraft/client/particle/SpellParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/SpellParticle.h rename to Minecraft.Client/net/minecraft/client/particle/SpellParticle.h diff --git a/Minecraft.Client/Rendering/Particles/SplashParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/SplashParticle.cpp similarity index 85% rename from Minecraft.Client/Rendering/Particles/SplashParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/SplashParticle.cpp index 5704aff6d..88ebe0e0f 100644 --- a/Minecraft.Client/Rendering/Particles/SplashParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/SplashParticle.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "SplashParticle.h" SplashParticle::SplashParticle(Level* level, double x, double y, double z, diff --git a/Minecraft.Client/Rendering/Particles/SplashParticle.h b/Minecraft.Client/net/minecraft/client/particle/SplashParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/SplashParticle.h rename to Minecraft.Client/net/minecraft/client/particle/SplashParticle.h diff --git a/Minecraft.Client/Rendering/Particles/SuspendedParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/SuspendedParticle.cpp similarity index 69% rename from Minecraft.Client/Rendering/Particles/SuspendedParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/SuspendedParticle.cpp index 924611472..0271a0fe2 100644 --- a/Minecraft.Client/Rendering/Particles/SuspendedParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/SuspendedParticle.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "SuspendedParticle.h" -#include "../../../Minecraft.World/Util/Random.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Util/JavaMath.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.material.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/material/net.minecraft.world.level.material.h" SuspendedParticle::SuspendedParticle(Level* level, double x, double y, double z, double xa, double ya, double za) diff --git a/Minecraft.Client/Rendering/Particles/SuspendedParticle.h b/Minecraft.Client/net/minecraft/client/particle/SuspendedParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/SuspendedParticle.h rename to Minecraft.Client/net/minecraft/client/particle/SuspendedParticle.h diff --git a/Minecraft.Client/Rendering/Particles/SuspendedTownParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/SuspendedTownParticle.cpp similarity index 80% rename from Minecraft.Client/Rendering/Particles/SuspendedTownParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/SuspendedTownParticle.cpp index c25074575..2e877af33 100644 --- a/Minecraft.Client/Rendering/Particles/SuspendedTownParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/SuspendedTownParticle.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "SuspendedTownParticle.h" -#include "../../../Minecraft.World/Util/Random.h" -#include "../../../Minecraft.World/Util/JavaMath.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" SuspendedTownParticle::SuspendedTownParticle(Level* level, double x, double y, double z, double xa, double ya, diff --git a/Minecraft.Client/Rendering/Particles/SuspendedTownParticle.h b/Minecraft.Client/net/minecraft/client/particle/SuspendedTownParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/SuspendedTownParticle.h rename to Minecraft.Client/net/minecraft/client/particle/SuspendedTownParticle.h diff --git a/Minecraft.Client/Rendering/Particles/TakeAnimationParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/TakeAnimationParticle.cpp similarity index 84% rename from Minecraft.Client/Rendering/Particles/TakeAnimationParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/TakeAnimationParticle.cpp index 0272da4b9..be1eb5523 100644 --- a/Minecraft.Client/Rendering/Particles/TakeAnimationParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/TakeAnimationParticle.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "TakeAnimationParticle.h" -#include "../EntityRenderers/EntityRenderDispatcher.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../renderer/entity/EntityRenderDispatcher.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" TakeAnimationParticle::TakeAnimationParticle(Level* level, std::shared_ptr item, diff --git a/Minecraft.Client/Rendering/Particles/TakeAnimationParticle.h b/Minecraft.Client/net/minecraft/client/particle/TakeAnimationParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/TakeAnimationParticle.h rename to Minecraft.Client/net/minecraft/client/particle/TakeAnimationParticle.h diff --git a/Minecraft.Client/Rendering/Particles/TerrainParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/TerrainParticle.cpp similarity index 90% rename from Minecraft.Client/Rendering/Particles/TerrainParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/TerrainParticle.cpp index 5cc4f9697..345210285 100644 --- a/Minecraft.Client/Rendering/Particles/TerrainParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/TerrainParticle.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "TerrainParticle.h" -#include "../Tesselator.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.h" +#include "../renderer/Tesselator.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" TerrainParticle::TerrainParticle(Level* level, double x, double y, double z, double xa, double ya, double za, Tile* tile, diff --git a/Minecraft.Client/Rendering/Particles/TerrainParticle.h b/Minecraft.Client/net/minecraft/client/particle/TerrainParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/TerrainParticle.h rename to Minecraft.Client/net/minecraft/client/particle/TerrainParticle.h diff --git a/Minecraft.Client/Rendering/Particles/WaterDropParticle.cpp b/Minecraft.Client/net/minecraft/client/particle/WaterDropParticle.cpp similarity index 73% rename from Minecraft.Client/Rendering/Particles/WaterDropParticle.cpp rename to Minecraft.Client/net/minecraft/client/particle/WaterDropParticle.cpp index 150dca852..f3cee2e4b 100644 --- a/Minecraft.Client/Rendering/Particles/WaterDropParticle.cpp +++ b/Minecraft.Client/net/minecraft/client/particle/WaterDropParticle.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "WaterDropParticle.h" -#include "../../../Minecraft.World/Util/JavaMath.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.material.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/material/net.minecraft.world.level.material.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" WaterDropParticle::WaterDropParticle(Level* level, double x, double y, double z) : Particle(level, x, y, z, 0, 0, 0) { diff --git a/Minecraft.Client/Rendering/Particles/WaterDropParticle.h b/Minecraft.Client/net/minecraft/client/particle/WaterDropParticle.h similarity index 100% rename from Minecraft.Client/Rendering/Particles/WaterDropParticle.h rename to Minecraft.Client/net/minecraft/client/particle/WaterDropParticle.h diff --git a/Minecraft.Client/Input/Input.cpp b/Minecraft.Client/net/minecraft/client/player/Input.cpp similarity index 89% rename from Minecraft.Client/Input/Input.cpp rename to Minecraft.Client/net/minecraft/client/player/Input.cpp index 69b5e9f09..bc3fc4025 100644 --- a/Minecraft.Client/Input/Input.cpp +++ b/Minecraft.Client/net/minecraft/client/player/Input.cpp @@ -1,12 +1,12 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "../Minecraft.h" -#include "../GameState/GameMode.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.storage.h" +#include "../../server/level/GameMode.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h" #include "Input.h" -#include "../Player/LocalPlayer.h" -#include "../GameState/Options.h" +#include "LocalPlayer.h" +#include "../Options.h" Input::Input() { xa = 0; diff --git a/Minecraft.Client/Input/Input.h b/Minecraft.Client/net/minecraft/client/player/Input.h similarity index 100% rename from Minecraft.Client/Input/Input.h rename to Minecraft.Client/net/minecraft/client/player/Input.h diff --git a/Minecraft.Client/Player/LocalPlayer.cpp b/Minecraft.Client/net/minecraft/client/player/LocalPlayer.cpp similarity index 94% rename from Minecraft.Client/Player/LocalPlayer.cpp rename to Minecraft.Client/net/minecraft/client/player/LocalPlayer.cpp index 9c84f17c8..595ee7221 100644 --- a/Minecraft.Client/Player/LocalPlayer.cpp +++ b/Minecraft.Client/net/minecraft/client/player/LocalPlayer.cpp @@ -1,66 +1,66 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "LocalPlayer.h" -#include "UI/Screens/BeaconScreen.h" -#include "UI/Screens/BrewingStandScreen.h" -#include "UI/Screens/EnchantmentScreen.h" -#include "UI/Screens/HopperScreen.h" -#include "UI/Screens/HorseInventoryScreen.h" -#include "UI/Screens/MerchantScreen.h" -#include "UI/Screens/RepairScreen.h" -#include "User.h" -#include "../Input/Input.h" -#include "../GameState/StatsCounter.h" -#include "../Rendering/Particles/ParticleEngine.h" -#include "../Rendering/Particles/TakeAnimationParticle.h" -#include "../GameState/Options.h" -#include "../UI/Screens/TextEditScreen.h" -#include "../UI/Screens/ContainerScreen.h" -#include "../UI/Screens/CraftingScreen.h" -#include "../UI/Screens/FurnaceScreen.h" -#include "../UI/Screens/TrapScreen.h" +#include "../gui/inventory/BeaconScreen.h" +#include "../gui/inventory/BrewingStandScreen.h" +#include "../gui/EnchantmentScreen.h" +#include "../gui/HopperScreen.h" +#include "../gui/inventory/HorseInventoryScreen.h" +#include "../gui/MerchantScreen.h" +#include "../gui/RepairScreen.h" +#include "../User.h" +#include "Input.h" +#include "../../stats/StatsCounter.h" +#include "../particle/ParticleEngine.h" +#include "../particle/TakeAnimationParticle.h" +#include "../Options.h" +#include "../gui/inventory/TextEditScreen.h" +#include "../gui/inventory/ContainerScreen.h" +#include "../gui/inventory/CraftingScreen.h" +#include "../gui/inventory/FurnaceScreen.h" +#include "../gui/inventory/TrapScreen.h" -#include "MultiPlayerLocalPlayer.h" -#include "../GameState/CreativeMode.h" -#include "../Rendering/GameRenderer.h" -#include "../Rendering/EntityRenderers/ItemInHandRenderer.h" -#include "../../Minecraft.World/AI/Attributes/AttributeInstance.h" -#include "../../Minecraft.World/Level/LevelData.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.damagesource.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.food.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.effect.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.monster.h" -#include "../../Minecraft.World/Entities/ItemEntity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.phys.h" -#include "../../Minecraft.World/Headers/net.minecraft.stats.h" -#include "../../Minecraft.World/Headers/com.mojang.nbt.h" -#include "../../Minecraft.World/Util/Random.h" -#include "../../Minecraft.World/Blocks/TileEntities/TileEntity.h" -#include "../../Minecraft.World/Util/Mth.h" -#include "../UI/Screens/AchievementPopup.h" -#include "../Rendering/Particles/CritParticle.h" +#include "../multiplayer/MultiPlayerLocalPlayer.h" +#include "../../server/level/CreativeMode.h" +#include "../renderer/GameRenderer.h" +#include "../renderer/ItemInHandRenderer.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/ai/attributes/AttributeInstance.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/storage/LevelData.h" +#include "../../../../../Minecraft.World/net/minecraft/world/damageSource/net.minecraft.world.damagesource.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/food/net.minecraft.world.food.h" +#include "../../../../../Minecraft.World/net/minecraft/world/effect/net.minecraft.world.effect.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/item/ItemEntity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/phys/net.minecraft.world.phys.h" +#include "../../../../../Minecraft.World/net/minecraft/stats/net.minecraft.stats.h" +#include "../../../../../Minecraft.World/com/mojang/nbt/com.mojang.nbt.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/TileEntity.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "../gui/achievement/AchievementPopup.h" +#include "../particle/CritParticle.h" // 4J : WESTY : Added for new achievements. -#include "../../Minecraft.World/Items/Item.h" -#include "../../Minecraft.World/Items/MapItem.h" -#include "../../Minecraft.World/Blocks/Tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/Item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/MapItem.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/Tile.h" // 4J Stu - Added for tutorial callbacks #include "../Minecraft.h" -#include "../../Minecraft.World/Entities/Mobs/Minecart.h" -#include "../../Minecraft.World/Entities/Mobs/Boat.h" -#include "../../Minecraft.World/Entities/Mobs/Pig.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/item/Minecart.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/item/Boat.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/animal/Pig.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" -#include "../GameState/Options.h" -#include "../../Minecraft.World/Level/Dimensions/Dimension.h" +#include "../Options.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/Dimension.h" -#include "../../Minecraft.World/Stats/CommonStats.h" +#include "../../../../../Minecraft.World/net/minecraft/stats/CommonStats.h" LocalPlayer::LocalPlayer(Minecraft* minecraft, Level* level, User* user, int dimension) @@ -1211,7 +1211,7 @@ void LocalPlayer::setAndBroadcastCustomCape(std::uint32_t capeId) { } // 4J TODO - Remove -#include "../../Minecraft.World/Level/LevelChunk.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/LevelChunk.h" void LocalPlayer::mapPlayerChunk(const unsigned int flagTileType) { int cx = this->xChunk; int cz = this->zChunk; diff --git a/Minecraft.Client/Player/LocalPlayer.h b/Minecraft.Client/net/minecraft/client/player/LocalPlayer.h similarity index 96% rename from Minecraft.Client/Player/LocalPlayer.h rename to Minecraft.Client/net/minecraft/client/player/LocalPlayer.h index 5348876a2..dd353b7f5 100644 --- a/Minecraft.Client/Player/LocalPlayer.h +++ b/Minecraft.Client/net/minecraft/client/player/LocalPlayer.h @@ -1,8 +1,8 @@ #pragma once #include -#include "../../Minecraft.World/Util/SmoothFloat.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.World/Util/Pos.h" +#include "../../../../../Minecraft.World/net/minecraft/util/SmoothFloat.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/Pos.h" class Level; class User; class CompoundTag; diff --git a/Minecraft.Client/Player/RemotePlayer.cpp b/Minecraft.Client/net/minecraft/client/player/RemotePlayer.cpp similarity index 94% rename from Minecraft.Client/Player/RemotePlayer.cpp rename to Minecraft.Client/net/minecraft/client/player/RemotePlayer.cpp index f437ca8b1..e52ecc995 100644 --- a/Minecraft.Client/Player/RemotePlayer.cpp +++ b/Minecraft.Client/net/minecraft/client/player/RemotePlayer.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "RemotePlayer.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Util/Mth.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" RemotePlayer::RemotePlayer(Level* level, const std::wstring& name) : Player(level, name) { diff --git a/Minecraft.Client/Player/RemotePlayer.h b/Minecraft.Client/net/minecraft/client/player/RemotePlayer.h similarity index 86% rename from Minecraft.Client/Player/RemotePlayer.h rename to Minecraft.Client/net/minecraft/client/player/RemotePlayer.h index 938543917..343faba62 100644 --- a/Minecraft.Client/Player/RemotePlayer.h +++ b/Minecraft.Client/net/minecraft/client/player/RemotePlayer.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Minecraft.World/Util/SmoothFloat.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/util/SmoothFloat.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" class Input; diff --git a/Minecraft.Client/UI/BossMobGuiInfo.cpp b/Minecraft.Client/net/minecraft/client/renderer/BossMobGuiInfo.cpp similarity index 78% rename from Minecraft.Client/UI/BossMobGuiInfo.cpp rename to Minecraft.Client/net/minecraft/client/renderer/BossMobGuiInfo.cpp index 0c04331ee..2b1bedaf8 100644 --- a/Minecraft.Client/UI/BossMobGuiInfo.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/BossMobGuiInfo.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "BossMobGuiInfo.h" -#include "../../Minecraft.World/Entities/Mobs/BossMob.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/boss/BossMob.h" float BossMobGuiInfo::healthProgress = 0.0f; int BossMobGuiInfo::displayTicks = 0; diff --git a/Minecraft.Client/UI/BossMobGuiInfo.h b/Minecraft.Client/net/minecraft/client/renderer/BossMobGuiInfo.h similarity index 100% rename from Minecraft.Client/UI/BossMobGuiInfo.h rename to Minecraft.Client/net/minecraft/client/renderer/BossMobGuiInfo.h diff --git a/Minecraft.Client/Rendering/Chunk.cpp b/Minecraft.Client/net/minecraft/client/renderer/Chunk.cpp similarity index 98% rename from Minecraft.Client/Rendering/Chunk.cpp rename to Minecraft.Client/net/minecraft/client/renderer/Chunk.cpp index 091f45ddc..dc374dc38 100644 --- a/Minecraft.Client/Rendering/Chunk.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/Chunk.cpp @@ -1,13 +1,13 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "Chunk.h" -#include "EntityRenderers/TileRenderer.h" -#include "EntityRenderers/TileEntityRenderDispatcher.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.chunk.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" +#include "TileRenderer.h" +#include "tileentity/TileEntityRenderDispatcher.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" #include "LevelRenderer.h" -#include "../Utils/FrameProfiler.h" +#include "../../../../Header Files/FrameProfiler.h" #include #include diff --git a/Minecraft.Client/Rendering/Chunk.h b/Minecraft.Client/net/minecraft/client/renderer/Chunk.h similarity index 94% rename from Minecraft.Client/Rendering/Chunk.h rename to Minecraft.Client/net/minecraft/client/renderer/Chunk.h index 90c5004fb..161d3db1a 100644 --- a/Minecraft.Client/Rendering/Chunk.h +++ b/Minecraft.Client/net/minecraft/client/renderer/Chunk.h @@ -1,7 +1,7 @@ #pragma once -#include "Culling/AllowAllCuller.h" +#include "culling/AllowAllCuller.h" #include "Tesselator.h" -#include "../../Minecraft.World/Util/ArrayWithLength.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/ArrayWithLength.h" #include "LevelRenderer.h" class Level; diff --git a/Minecraft.Client/Rendering/Culling/DirtyChunkSorter.cpp b/Minecraft.Client/net/minecraft/client/renderer/DirtyChunkSorter.cpp similarity index 78% rename from Minecraft.Client/Rendering/Culling/DirtyChunkSorter.cpp rename to Minecraft.Client/net/minecraft/client/renderer/DirtyChunkSorter.cpp index ed12da6ef..7a9a4d2f8 100644 --- a/Minecraft.Client/Rendering/Culling/DirtyChunkSorter.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/DirtyChunkSorter.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "DirtyChunkSorter.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../Chunk.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "Chunk.h" DirtyChunkSorter::DirtyChunkSorter(std::shared_ptr cameraEntity, int playerIndex) // 4J - added player index diff --git a/Minecraft.Client/Rendering/Culling/DirtyChunkSorter.h b/Minecraft.Client/net/minecraft/client/renderer/DirtyChunkSorter.h similarity index 100% rename from Minecraft.Client/Rendering/Culling/DirtyChunkSorter.h rename to Minecraft.Client/net/minecraft/client/renderer/DirtyChunkSorter.h diff --git a/Minecraft.Client/Rendering/Culling/DistanceChunkSorter.cpp b/Minecraft.Client/net/minecraft/client/renderer/DistanceChunkSorter.cpp similarity index 74% rename from Minecraft.Client/Rendering/Culling/DistanceChunkSorter.cpp rename to Minecraft.Client/net/minecraft/client/renderer/DistanceChunkSorter.cpp index 09ff30e06..9db25eb1c 100644 --- a/Minecraft.Client/Rendering/Culling/DistanceChunkSorter.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/DistanceChunkSorter.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "DistanceChunkSorter.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../Chunk.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "Chunk.h" DistanceChunkSorter::DistanceChunkSorter(std::shared_ptr player) { ix = -player->x; diff --git a/Minecraft.Client/Rendering/Culling/DistanceChunkSorter.h b/Minecraft.Client/net/minecraft/client/renderer/DistanceChunkSorter.h similarity index 100% rename from Minecraft.Client/Rendering/Culling/DistanceChunkSorter.h rename to Minecraft.Client/net/minecraft/client/renderer/DistanceChunkSorter.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/EntityTileRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/EntityTileRenderer.cpp similarity index 75% rename from Minecraft.Client/Rendering/EntityRenderers/EntityTileRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/EntityTileRenderer.cpp index cf4a3d687..0762d9d2a 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/EntityTileRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/EntityTileRenderer.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "EntityTileRenderer.h" -#include "TileEntityRenderDispatcher.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" +#include "tileentity/TileEntityRenderDispatcher.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" EntityTileRenderer* EntityTileRenderer::instance = new EntityTileRenderer; diff --git a/Minecraft.Client/Rendering/EntityRenderers/EntityTileRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/EntityTileRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/EntityTileRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/EntityTileRenderer.h diff --git a/Minecraft.Client/Rendering/GameRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/GameRenderer.cpp similarity index 95% rename from Minecraft.Client/Rendering/GameRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/GameRenderer.cpp index b3f1b9458..310ef1e77 100644 --- a/Minecraft.Client/Rendering/GameRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/GameRenderer.cpp @@ -1,56 +1,56 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "GameRenderer.h" -#include "EntityRenderers/ItemInHandRenderer.h" +#include "ItemInHandRenderer.h" #include "LevelRenderer.h" -#include "Frustum.h" -#include "FrustumCuller.h" -#include "../Textures/Textures.h" +#include "culling/Frustum.h" +#include "culling/FrustumCuller.h" +#include "Textures.h" #include "Tesselator.h" -#include "Particles/ParticleEngine.h" -#include "Particles/SmokeParticle.h" -#include "Particles/WaterDropParticle.h" -#include "../GameState/GameMode.h" -#include "../GameState/CreativeMode.h" -#include "Lighting.h" -#include "../GameState/Options.h" -#include "../Player/MultiPlayerLocalPlayer.h" -#include "Particles/GuiParticles.h" -#include "../Level/MultiPlayerLevel.h" +#include "../particle/ParticleEngine.h" +#include "../particle/SmokeParticle.h" +#include "../particle/WaterDropParticle.h" +#include "../../server/level/GameMode.h" +#include "../../server/level/CreativeMode.h" +#include "../Lighting.h" +#include "../Options.h" +#include "../multiplayer/MultiPlayerLocalPlayer.h" +#include "../gui/particle/GuiParticles.h" +#include "../multiplayer/MultiPlayerLevel.h" #include "Chunk.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.enchantment.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.material.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.chunk.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.biome.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.phys.h" -#include "../../Minecraft.World/Platform/System.h" -#include "../../Minecraft.World/IO/Streams/FloatBuffer.h" -#include "../../Minecraft.World/Util/ThreadName.h" -#include "../../Minecraft.World/Level/Storage/SparseLightStorage.h" -#include "../../Minecraft.World/Level/Storage/CompressedTileStorage.h" -#include "../../Minecraft.World/Level/Storage/SparseDataStorage.h" -#include "../../Minecraft.World/Util/JavaMath.h" -#include "../../Minecraft.World/Util/Facing.h" -#include "../../Minecraft.World/Entities/MobEffect.h" -#include "../../Minecraft.World/Util/SmoothFloat.h" -#include "../../Minecraft.World/Entities/MobEffectInstance.h" -#include "../../Minecraft.World/Items/Item.h" -#include "Camera.h" -#include "../../Minecraft.World/Util/SoundTypes.h" -#include "Models/HumanoidModel.h" -#include "../../Minecraft.World/Items/Item.h" -#include "../../Minecraft.World/IO/Streams/Compression.h" -#include "../Platform/Common/ShutdownManager.h" -#include "../UI/BossMobGuiInfo.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/enchantment/net.minecraft.world.item.enchantment.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/material/net.minecraft.world.level.material.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/biome/net.minecraft.world.level.biome.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../Minecraft.World/net/minecraft/world/phys/net.minecraft.world.phys.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/System.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/FloatBuffer.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/ThreadName.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/SparseLightStorage.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/CompressedTileStorage.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/SparseDataStorage.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../../../../../Minecraft.World/net/minecraft/Facing.h" +#include "../../../../../Minecraft.World/net/minecraft/world/effect/MobEffect.h" +#include "../../../../../Minecraft.World/net/minecraft/util/SmoothFloat.h" +#include "../../../../../Minecraft.World/net/minecraft/world/effect/MobEffectInstance.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/Item.h" +#include "../Camera.h" +#include "../../../../../Minecraft.World/Header Files/SoundTypes.h" +#include "../model/HumanoidModel.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/Item.h" +#include "../../../../../Minecraft.World/Header Files/compression.h" +#include "../../../../Common/ShutdownManager.h" +#include "BossMobGuiInfo.h" -#include "../Textures/Packs/TexturePackRepository.h" -#include "../Textures/Packs/TexturePack.h" -#include "../Textures/TextureAtlas.h" -#include "../Utils/FrameProfiler.h" +#include "../skins/TexturePackRepository.h" +#include "../skins/TexturePack.h" +#include "texture/TextureAtlas.h" +#include "../../../../Header Files/FrameProfiler.h" bool GameRenderer::anaglyph3d = false; int GameRenderer::anaglyphPass = 0; diff --git a/Minecraft.Client/Rendering/GameRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/GameRenderer.h similarity index 96% rename from Minecraft.Client/Rendering/GameRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/GameRenderer.h index c92136b3b..722cac468 100644 --- a/Minecraft.Client/Rendering/GameRenderer.h +++ b/Minecraft.Client/net/minecraft/client/renderer/GameRenderer.h @@ -10,9 +10,9 @@ class CompressedTileStorage; class SparseDataStorage; #include -#include "../../Minecraft.World/Util/SmoothFloat.h" -#include "../../Minecraft.World/Util/C4JThread.h" -#include "../Textures/ResourceLocation.h" +#include "../../../../../Minecraft.World/net/minecraft/util/SmoothFloat.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/C4JThread.h" +#include "../resources/ResourceLocation.h" class GameRenderer { private: diff --git a/Minecraft.Client/Textures/HttpTexture.cpp b/Minecraft.Client/net/minecraft/client/renderer/HttpTexture.cpp similarity index 79% rename from Minecraft.Client/Textures/HttpTexture.cpp rename to Minecraft.Client/net/minecraft/client/renderer/HttpTexture.cpp index f7a658f42..4a6aaf0e7 100644 --- a/Minecraft.Client/Textures/HttpTexture.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/HttpTexture.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "HttpTexture.h" HttpTexture::HttpTexture(const std::wstring& _url, diff --git a/Minecraft.Client/Textures/HttpTexture.h b/Minecraft.Client/net/minecraft/client/renderer/HttpTexture.h similarity index 100% rename from Minecraft.Client/Textures/HttpTexture.h rename to Minecraft.Client/net/minecraft/client/renderer/HttpTexture.h diff --git a/Minecraft.Client/Textures/HttpTextureProcessor.h b/Minecraft.Client/net/minecraft/client/renderer/HttpTextureProcessor.h similarity index 100% rename from Minecraft.Client/Textures/HttpTextureProcessor.h rename to Minecraft.Client/net/minecraft/client/renderer/HttpTextureProcessor.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/ItemInHandRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/ItemInHandRenderer.cpp similarity index 97% rename from Minecraft.Client/Rendering/EntityRenderers/ItemInHandRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/ItemInHandRenderer.cpp index e814afb66..79f800419 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/ItemInHandRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/ItemInHandRenderer.cpp @@ -1,22 +1,22 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ItemInHandRenderer.h" #include "TileRenderer.h" -#include "../Tesselator.h" -#include "../../Textures/Textures.h" -#include "../../Textures/TextureAtlas.h" -#include "EntityRenderer.h" -#include "PlayerRenderer.h" -#include "EntityRenderDispatcher.h" +#include "Tesselator.h" +#include "Textures.h" +#include "texture/TextureAtlas.h" +#include "entity/EntityRenderer.h" +#include "entity/PlayerRenderer.h" +#include "entity/EntityRenderDispatcher.h" #include "../Lighting.h" -#include "../../Player/MultiPlayerLocalPlayer.h" -#include "../Minimap.h" -#include "../../Level/MultiPlayerLevel.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.h" +#include "../multiplayer/MultiPlayerLocalPlayer.h" +#include "../gui/Minimap.h" +#include "../multiplayer/MultiPlayerLevel.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" ResourceLocation ItemInHandRenderer::ENCHANT_GLINT_LOCATION = ResourceLocation(TN__BLUR__MISC_GLINT); diff --git a/Minecraft.Client/Rendering/EntityRenderers/ItemInHandRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/ItemInHandRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/ItemInHandRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/ItemInHandRenderer.h diff --git a/Minecraft.Client/Rendering/LevelRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/LevelRenderer.cpp similarity index 98% rename from Minecraft.Client/Rendering/LevelRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/LevelRenderer.cpp index 57ac3f6f6..548c62bae 100644 --- a/Minecraft.Client/Rendering/LevelRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/LevelRenderer.cpp @@ -3,69 +3,69 @@ #include #include -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "LevelRenderer.h" #include -#include "../Textures/Textures.h" -#include "../Textures/TextureAtlas.h" +#include "Textures.h" +#include "texture/TextureAtlas.h" #include "Tesselator.h" #include "Chunk.h" -#include "EntityRenderers/EntityRenderDispatcher.h" -#include "EntityRenderers/TileEntityRenderDispatcher.h" -#include "Culling/DistanceChunkSorter.h" -#include "Culling/DirtyChunkSorter.h" -#include "../Textures/MobSkinTextureProcessor.h" -#include "../Textures/MobSkinMemTextureProcessor.h" +#include "entity/EntityRenderDispatcher.h" +#include "tileentity/TileEntityRenderDispatcher.h" +#include "DistanceChunkSorter.h" +#include "DirtyChunkSorter.h" +#include "MobSkinTextureProcessor.h" +#include "../../../../Header Files/MobSkinMemTextureProcessor.h" #include "GameRenderer.h" -#include "Particles/BubbleParticle.h" -#include "Particles/SmokeParticle.h" -#include "Particles/NoteParticle.h" -#include "Particles/NetherPortalParticle.h" -#include "Particles/EnderParticle.h" -#include "Particles/ExplodeParticle.h" -#include "Particles/FlameParticle.h" -#include "Particles/LavaParticle.h" -#include "Particles/FootstepParticle.h" -#include "Particles/SplashParticle.h" -#include "Particles/SmokeParticle.h" -#include "Particles/RedDustParticle.h" -#include "Particles/BreakingItemParticle.h" -#include "Particles/SnowShovelParticle.h" -#include "Particles/BreakingItemParticle.h" -#include "Particles/HeartParticle.h" -#include "Particles/HugeExplosionParticle.h" -#include "Particles/HugeExplosionSeedParticle.h" -#include "Particles/SuspendedParticle.h" -#include "Particles/SuspendedTownParticle.h" -#include "Particles/CritParticle2.h" -#include "Particles/TerrainParticle.h" -#include "Particles/SpellParticle.h" -#include "Particles/DripParticle.h" -#include "Particles/EnchantmentTableParticle.h" -#include "Particles/DragonBreathParticle.h" -#include "Particles/FireworksParticles.h" -#include "Lighting.h" -#include "../GameState/Options.h" -#include "../Network/MultiPlayerChunkCache.h" -#include "../../Minecraft.World/Util/ParticleTypes.h" -#include "../../Minecraft.World/IO/Streams/IntBuffer.h" -#include "../../Minecraft.World/Util/JavaMath.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.phys.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Platform/System.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.chunk.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.projectile.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.h" -#include "../Player/MultiPlayerLocalPlayer.h" -#include "../Level/MultiPlayerLevel.h" -#include "../../Minecraft.World/Util/SoundTypes.h" -#include "FrustumCuller.h" -#include "../Utils/FrameProfiler.h" +#include "../particle/BubbleParticle.h" +#include "../particle/SmokeParticle.h" +#include "../particle/NoteParticle.h" +#include "../particle/NetherPortalParticle.h" +#include "../particle/EnderParticle.h" +#include "../particle/ExplodeParticle.h" +#include "../particle/FlameParticle.h" +#include "../particle/LavaParticle.h" +#include "../particle/FootstepParticle.h" +#include "../particle/SplashParticle.h" +#include "../particle/SmokeParticle.h" +#include "../particle/RedDustParticle.h" +#include "../particle/BreakingItemParticle.h" +#include "../particle/SnowShovelParticle.h" +#include "../particle/BreakingItemParticle.h" +#include "../particle/HeartParticle.h" +#include "../particle/HugeExplosionParticle.h" +#include "../particle/HugeExplosionSeedParticle.h" +#include "../particle/SuspendedParticle.h" +#include "../particle/SuspendedTownParticle.h" +#include "../particle/CritParticle2.h" +#include "../particle/TerrainParticle.h" +#include "../particle/SpellParticle.h" +#include "../particle/DripParticle.h" +#include "../particle/EnchantmentTableParticle.h" +#include "../particle/DragonBreathParticle.h" +#include "../particle/FireworksParticles.h" +#include "../Lighting.h" +#include "../Options.h" +#include "../multiplayer/MultiPlayerChunkCache.h" +#include "../../../../../Minecraft.World/Header Files/ParticleTypes.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/IntBuffer.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/phys/net.minecraft.world.phys.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/System.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" +#include "../multiplayer/MultiPlayerLocalPlayer.h" +#include "../multiplayer/MultiPlayerLevel.h" +#include "../../../../../Minecraft.World/Header Files/SoundTypes.h" +#include "culling/FrustumCuller.h" +#include "../../../../Header Files/FrameProfiler.h" // #define DISABLE_SPU_CODE diff --git a/Minecraft.Client/Rendering/LevelRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/LevelRenderer.h similarity index 97% rename from Minecraft.Client/Rendering/LevelRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/LevelRenderer.h index f237ebe5c..44cb826ea 100644 --- a/Minecraft.Client/Rendering/LevelRenderer.h +++ b/Minecraft.Client/net/minecraft/client/renderer/LevelRenderer.h @@ -1,9 +1,9 @@ #pragma once -#include "../../Minecraft.World/Level/Events/LevelListener.h" -#include "../../Minecraft.World/Util/Definitions.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/LevelListener.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/Definitions.h" #include "OffsettedRenderList.h" -#include "../../Minecraft.World/Util/JavaIntHash.h" -#include "../../Minecraft.World/Level/Level.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaIntHash.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/Level.h" #if !defined(__linux__) #include #endif diff --git a/Minecraft.Client/Textures/MemTexture.cpp b/Minecraft.Client/net/minecraft/client/renderer/MemTexture.cpp similarity index 86% rename from Minecraft.Client/Textures/MemTexture.cpp rename to Minecraft.Client/net/minecraft/client/renderer/MemTexture.cpp index 3beec4a65..bcf84aa53 100644 --- a/Minecraft.Client/Textures/MemTexture.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/MemTexture.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "MemTexture.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../Header Files/MemTexture.h" MemTexture::MemTexture(const std::wstring& _url, std::uint8_t* pbData, std::uint32_t dataBytes, diff --git a/Minecraft.Client/Textures/MobSkinMemTextureProcessor.cpp b/Minecraft.Client/net/minecraft/client/renderer/MobSkinMemTextureProcessor.cpp similarity index 93% rename from Minecraft.Client/Textures/MobSkinMemTextureProcessor.cpp rename to Minecraft.Client/net/minecraft/client/renderer/MobSkinMemTextureProcessor.cpp index c82be9800..9e569cd0b 100644 --- a/Minecraft.Client/Textures/MobSkinMemTextureProcessor.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/MobSkinMemTextureProcessor.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "MobSkinMemTextureProcessor.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../Header Files/MobSkinMemTextureProcessor.h" BufferedImage* MobSkinMemTextureProcessor::process(BufferedImage* in) { if (in == nullptr) return nullptr; diff --git a/Minecraft.Client/Textures/MobSkinTextureProcessor.cpp b/Minecraft.Client/net/minecraft/client/renderer/MobSkinTextureProcessor.cpp similarity index 96% rename from Minecraft.Client/Textures/MobSkinTextureProcessor.cpp rename to Minecraft.Client/net/minecraft/client/renderer/MobSkinTextureProcessor.cpp index ff52d1594..2a3947b69 100644 --- a/Minecraft.Client/Textures/MobSkinTextureProcessor.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/MobSkinTextureProcessor.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "MobSkinTextureProcessor.h" BufferedImage* MobSkinTextureProcessor::process(BufferedImage* in) { diff --git a/Minecraft.Client/Textures/MobSkinTextureProcessor.h b/Minecraft.Client/net/minecraft/client/renderer/MobSkinTextureProcessor.h similarity index 100% rename from Minecraft.Client/Textures/MobSkinTextureProcessor.h rename to Minecraft.Client/net/minecraft/client/renderer/MobSkinTextureProcessor.h diff --git a/Minecraft.Client/Rendering/OffsettedRenderList.cpp b/Minecraft.Client/net/minecraft/client/renderer/OffsettedRenderList.cpp similarity index 91% rename from Minecraft.Client/Rendering/OffsettedRenderList.cpp rename to Minecraft.Client/net/minecraft/client/renderer/OffsettedRenderList.cpp index 685da0524..423717610 100644 --- a/Minecraft.Client/Rendering/OffsettedRenderList.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/OffsettedRenderList.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../../Minecraft.World/IO/Streams/IntBuffer.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/IntBuffer.h" #include "OffsettedRenderList.h" // 4J added diff --git a/Minecraft.Client/Rendering/OffsettedRenderList.h b/Minecraft.Client/net/minecraft/client/renderer/OffsettedRenderList.h similarity index 100% rename from Minecraft.Client/Rendering/OffsettedRenderList.h rename to Minecraft.Client/net/minecraft/client/renderer/OffsettedRenderList.h diff --git a/Minecraft.Client/UI/Rect2i.cpp b/Minecraft.Client/net/minecraft/client/renderer/Rect2i.cpp similarity index 94% rename from Minecraft.Client/UI/Rect2i.cpp rename to Minecraft.Client/net/minecraft/client/renderer/Rect2i.cpp index e7d8e0f52..1c7c2b935 100644 --- a/Minecraft.Client/UI/Rect2i.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/Rect2i.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "Rect2i.h" Rect2i::Rect2i(int x, int y, int width, int height) { diff --git a/Minecraft.Client/UI/Rect2i.h b/Minecraft.Client/net/minecraft/client/renderer/Rect2i.h similarity index 100% rename from Minecraft.Client/UI/Rect2i.h rename to Minecraft.Client/net/minecraft/client/renderer/Rect2i.h diff --git a/Minecraft.Client/Rendering/Tesselator.cpp b/Minecraft.Client/net/minecraft/client/renderer/Tesselator.cpp similarity index 98% rename from Minecraft.Client/Rendering/Tesselator.cpp rename to Minecraft.Client/net/minecraft/client/renderer/Tesselator.cpp index 6bc17df8d..1211a60dd 100644 --- a/Minecraft.Client/Rendering/Tesselator.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/Tesselator.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "Tesselator.h" -#include "../../Minecraft.World/IO/Streams/FloatBuffer.h" -#include "../../Minecraft.World/IO/Streams/IntBuffer.h" -#include "../../Minecraft.World/IO/Streams/ByteBuffer.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/FloatBuffer.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/IntBuffer.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/ByteBuffer.h" bool Tesselator::TRIANGLE_MODE = false; bool Tesselator::USE_VBO = false; diff --git a/Minecraft.Client/Rendering/Tesselator.h b/Minecraft.Client/net/minecraft/client/renderer/Tesselator.h similarity index 100% rename from Minecraft.Client/Rendering/Tesselator.h rename to Minecraft.Client/net/minecraft/client/renderer/Tesselator.h diff --git a/Minecraft.Client/Textures/Textures.cpp b/Minecraft.Client/net/minecraft/client/renderer/Textures.cpp similarity index 97% rename from Minecraft.Client/Textures/Textures.cpp rename to Minecraft.Client/net/minecraft/client/renderer/Textures.cpp index 481a7bb70..06281359b 100644 --- a/Minecraft.Client/Textures/Textures.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/Textures.cpp @@ -1,24 +1,24 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "Textures.h" -#include "Packs/TexturePackRepository.h" +#include "../skins/TexturePackRepository.h" #include "HttpTexture.h" -#include "MemTexture.h" -#include "../../Minecraft.World/IO/Streams/InputStream.h" -#include "../../Minecraft.World/IO/Streams/IntBuffer.h" -#include "../../Minecraft.World/IO/Streams/ByteBuffer.h" -#include "Packs/TexturePack.h" -#include "../GameState/Options.h" -#include "../../Minecraft.Client/Textures/MemTextureProcessor.h" -#include "MobSkinMemTextureProcessor.h" -#include "Stitching/PreStitchedTextureMap.h" -#include "Stitching/StitchedTexture.h" -#include "Texture.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Util/StringHelpers.h" -#include "ResourceLocation.h" -#include "../../Minecraft.World/Entities/ItemEntity.h" -#include "TextureAtlas.h" +#include "../../../../Header Files/MemTexture.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputStream.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/IntBuffer.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/ByteBuffer.h" +#include "../skins/TexturePack.h" +#include "../Options.h" +#include "../../../../Header Files/MemTextureProcessor.h" +#include "../../../../Header Files/MobSkinMemTextureProcessor.h" +#include "texture/PreStitchedTextureMap.h" +#include "texture/StitchedTexture.h" +#include "texture/Texture.h" +#include "../../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../resources/ResourceLocation.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/item/ItemEntity.h" +#include "texture/TextureAtlas.h" // Linux/PC port: disable mipmapping globally so textures are always sampled // from the full-resolution level 0 with GL_NEAREST, giving pixel-crisp diff --git a/Minecraft.Client/Textures/Textures.h b/Minecraft.Client/net/minecraft/client/renderer/Textures.h similarity index 99% rename from Minecraft.Client/Textures/Textures.h rename to Minecraft.Client/net/minecraft/client/renderer/Textures.h index fd59fc66b..4ab6eda8f 100644 --- a/Minecraft.Client/Textures/Textures.h +++ b/Minecraft.Client/net/minecraft/client/renderer/Textures.h @@ -1,5 +1,5 @@ #pragma once -#include "../../Minecraft.World/Util/ArrayWithLength.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/ArrayWithLength.h" class DynamicTexture; class BufferedImage; diff --git a/Minecraft.Client/Rendering/EntityRenderers/TileRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/TileRenderer.cpp similarity index 99% rename from Minecraft.Client/Rendering/EntityRenderers/TileRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/TileRenderer.cpp index a43146943..42dc3d52f 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/TileRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/TileRenderer.cpp @@ -1,19 +1,19 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "TileRenderer.h" #include -#include "../GameRenderer.h" -#include "../../Minecraft.h" -#include "../../Textures/Textures.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.material.h" -#include "../../../Minecraft.World/Headers/net.minecraft.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.h" -#include "../Tesselator.h" -#include "../../Utils/FrameProfiler.h" +#include "GameRenderer.h" +#include "../Minecraft.h" +#include "Textures.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/material/net.minecraft.world.level.material.h" +#include "../../../../../Minecraft.World/net/minecraft/net.minecraft.h" +#include "../../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" +#include "Tesselator.h" +#include "../../../../Header Files/FrameProfiler.h" #include "EntityTileRenderer.h" -#include "../../GameState/Options.h" +#include "../Options.h" bool TileRenderer::fancy = true; diff --git a/Minecraft.Client/Rendering/EntityRenderers/TileRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/TileRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/TileRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/TileRenderer.h diff --git a/Minecraft.Client/Rendering/Culling/AllowAllCuller.cpp b/Minecraft.Client/net/minecraft/client/renderer/culling/AllowAllCuller.cpp similarity index 87% rename from Minecraft.Client/Rendering/Culling/AllowAllCuller.cpp rename to Minecraft.Client/net/minecraft/client/renderer/culling/AllowAllCuller.cpp index 87ef63f07..f182ff754 100644 --- a/Minecraft.Client/Rendering/Culling/AllowAllCuller.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/culling/AllowAllCuller.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "AllowAllCuller.h" bool AllowAllCuller::isVisible(AABB* bb) { return true; } diff --git a/Minecraft.Client/Rendering/Culling/AllowAllCuller.h b/Minecraft.Client/net/minecraft/client/renderer/culling/AllowAllCuller.h similarity index 100% rename from Minecraft.Client/Rendering/Culling/AllowAllCuller.h rename to Minecraft.Client/net/minecraft/client/renderer/culling/AllowAllCuller.h diff --git a/Minecraft.Client/Rendering/Culling/Culler.h b/Minecraft.Client/net/minecraft/client/renderer/culling/Culler.h similarity index 84% rename from Minecraft.Client/Rendering/Culling/Culler.h rename to Minecraft.Client/net/minecraft/client/renderer/culling/Culler.h index a84da40c9..0009b4614 100644 --- a/Minecraft.Client/Rendering/Culling/Culler.h +++ b/Minecraft.Client/net/minecraft/client/renderer/culling/Culler.h @@ -1,5 +1,5 @@ #pragma once -#include "../../../Minecraft.World/Util/AABB.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/phys/AABB.h" class Culler { public: diff --git a/Minecraft.Client/Rendering/Frustum.cpp b/Minecraft.Client/net/minecraft/client/renderer/culling/Frustum.cpp similarity index 96% rename from Minecraft.Client/Rendering/Frustum.cpp rename to Minecraft.Client/net/minecraft/client/renderer/culling/Frustum.cpp index 3d2e562ea..c1c43c156 100644 --- a/Minecraft.Client/Rendering/Frustum.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/culling/Frustum.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../../Minecraft.World/IO/Streams/FloatBuffer.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/ConsoleJavaLibs/FloatBuffer.h" #include "Frustum.h" -#include "Camera.h" +#include "../../Camera.h" Frustum* Frustum::frustum = new Frustum(); diff --git a/Minecraft.Client/Rendering/Frustum.h b/Minecraft.Client/net/minecraft/client/renderer/culling/Frustum.h similarity index 100% rename from Minecraft.Client/Rendering/Frustum.h rename to Minecraft.Client/net/minecraft/client/renderer/culling/Frustum.h diff --git a/Minecraft.Client/Rendering/FrustumCuller.cpp b/Minecraft.Client/net/minecraft/client/renderer/culling/FrustumCuller.cpp similarity index 93% rename from Minecraft.Client/Rendering/FrustumCuller.cpp rename to Minecraft.Client/net/minecraft/client/renderer/culling/FrustumCuller.cpp index e2ab78c7f..bf7ad9485 100644 --- a/Minecraft.Client/Rendering/FrustumCuller.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/culling/FrustumCuller.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "FrustumCuller.h" FrustumCuller::FrustumCuller() { frustum = Frustum::getFrustum(); } diff --git a/Minecraft.Client/Rendering/FrustumCuller.h b/Minecraft.Client/net/minecraft/client/renderer/culling/FrustumCuller.h similarity index 86% rename from Minecraft.Client/Rendering/FrustumCuller.h rename to Minecraft.Client/net/minecraft/client/renderer/culling/FrustumCuller.h index a14814c1d..d0ee56a88 100644 --- a/Minecraft.Client/Rendering/FrustumCuller.h +++ b/Minecraft.Client/net/minecraft/client/renderer/culling/FrustumCuller.h @@ -1,6 +1,6 @@ #pragma once -#include "../Platform/stdafx.h" -#include "Culling/Culler.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "Culler.h" #include "Frustum.h" class FrustumCuller : public Culler { diff --git a/Minecraft.Client/Rendering/FrustumData.cpp b/Minecraft.Client/net/minecraft/client/renderer/culling/FrustumData.cpp similarity index 98% rename from Minecraft.Client/Rendering/FrustumData.cpp rename to Minecraft.Client/net/minecraft/client/renderer/culling/FrustumData.cpp index 140fa4772..4184f0cb8 100644 --- a/Minecraft.Client/Rendering/FrustumData.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/culling/FrustumData.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "FrustumData.h" // float** m_Frustum; diff --git a/Minecraft.Client/Rendering/FrustumData.h b/Minecraft.Client/net/minecraft/client/renderer/culling/FrustumData.h similarity index 94% rename from Minecraft.Client/Rendering/FrustumData.h rename to Minecraft.Client/net/minecraft/client/renderer/culling/FrustumData.h index 1a61d4ae3..223f2d7f7 100644 --- a/Minecraft.Client/Rendering/FrustumData.h +++ b/Minecraft.Client/net/minecraft/client/renderer/culling/FrustumData.h @@ -1,5 +1,5 @@ #pragma once -#include "../../Minecraft.World/Util/AABB.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/phys/AABB.h" class FrustumData { public: diff --git a/Minecraft.Client/Rendering/Culling/ViewportCuller.cpp b/Minecraft.Client/net/minecraft/client/renderer/culling/ViewportCuller.cpp similarity index 97% rename from Minecraft.Client/Rendering/Culling/ViewportCuller.cpp rename to Minecraft.Client/net/minecraft/client/renderer/culling/ViewportCuller.cpp index addd4b097..6821b7c97 100644 --- a/Minecraft.Client/Rendering/Culling/ViewportCuller.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/culling/ViewportCuller.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "ViewportCuller.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../../../../../../Minecraft.World/net/minecraft/util/Mth.h" ViewportCuller::Face::Face(double x, double y, double z, float yRot, float xRot) { diff --git a/Minecraft.Client/Rendering/Culling/ViewportCuller.h b/Minecraft.Client/net/minecraft/client/renderer/culling/ViewportCuller.h similarity index 94% rename from Minecraft.Client/Rendering/Culling/ViewportCuller.h rename to Minecraft.Client/net/minecraft/client/renderer/culling/ViewportCuller.h index 72373dd49..8f2e52c32 100644 --- a/Minecraft.Client/Rendering/Culling/ViewportCuller.h +++ b/Minecraft.Client/net/minecraft/client/renderer/culling/ViewportCuller.h @@ -1,6 +1,6 @@ #pragma once #include "Culler.h" -#include "../../../Minecraft.World/Entities/Mob.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/Mob.h" class Mob; class ViewportCuller : public Culler { diff --git a/Minecraft.Client/Rendering/EntityRenderers/ArrowRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/ArrowRenderer.cpp similarity index 93% rename from Minecraft.Client/Rendering/EntityRenderers/ArrowRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/ArrowRenderer.cpp index 1c619b2f3..c96611a48 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/ArrowRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/ArrowRenderer.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "ArrowRenderer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.projectile.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../../../../../../Minecraft.World/net/minecraft/util/Mth.h" ResourceLocation ArrowRenderer::ARROW_LOCATION = ResourceLocation(TN_ITEM_ARROWS); diff --git a/Minecraft.Client/Rendering/EntityRenderers/ArrowRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/ArrowRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/ArrowRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/ArrowRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/BatRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/BatRenderer.cpp similarity index 86% rename from Minecraft.Client/Rendering/EntityRenderers/BatRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/BatRenderer.cpp index ce3e7859d..7d38817e2 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/BatRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/BatRenderer.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.ambient.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/ambient/net.minecraft.world.entity.ambient.h" #include "BatRenderer.h" -#include "../Models/BatModel.h" +#include "../../model/BatModel.h" ResourceLocation BatRenderer::BAT_LOCATION = ResourceLocation(TN_MOB_BAT); diff --git a/Minecraft.Client/Rendering/EntityRenderers/BatRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/BatRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/BatRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/BatRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/BlazeRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/BlazeRenderer.cpp similarity index 81% rename from Minecraft.Client/Rendering/EntityRenderers/BlazeRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/BlazeRenderer.cpp index 30242923f..618caf63c 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/BlazeRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/BlazeRenderer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../Models/BlazeModel.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.monster.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../model/BlazeModel.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h" #include "BlazeRenderer.h" ResourceLocation BlazeRenderer::BLAZE_LOCATION = ResourceLocation(TN_MOB_BLAZE); diff --git a/Minecraft.Client/Rendering/EntityRenderers/BlazeRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/BlazeRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/BlazeRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/BlazeRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/BoatRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/BoatRenderer.cpp similarity index 81% rename from Minecraft.Client/Rendering/EntityRenderers/BoatRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/BoatRenderer.cpp index a6ef9dd0a..9be52bc5b 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/BoatRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/BoatRenderer.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "BoatRenderer.h" -#include "../Models/BoatModel.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.item.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../../model/BoatModel.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/util/Mth.h" ResourceLocation BoatRenderer::BOAT_LOCATION = ResourceLocation(TN_ITEM_BOAT); diff --git a/Minecraft.Client/Rendering/EntityRenderers/BoatRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/BoatRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/BoatRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/BoatRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/CaveSpiderRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/CaveSpiderRenderer.cpp similarity index 88% rename from Minecraft.Client/Rendering/EntityRenderers/CaveSpiderRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/CaveSpiderRenderer.cpp index 9a5445672..b68df4c79 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/CaveSpiderRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/CaveSpiderRenderer.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "CaveSpiderRenderer.h" ResourceLocation CaveSpiderRenderer::CAVE_SPIDER_LOCATION = diff --git a/Minecraft.Client/Rendering/EntityRenderers/CaveSpiderRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/CaveSpiderRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/CaveSpiderRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/CaveSpiderRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/ChickenRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/ChickenRenderer.cpp similarity index 79% rename from Minecraft.Client/Rendering/EntityRenderers/ChickenRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/ChickenRenderer.cpp index 096ffd459..193d20d4a 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/ChickenRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/ChickenRenderer.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/net/minecraft/util/Mth.h" #include "ChickenRenderer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" ResourceLocation ChickenRenderer::CHICKEN_LOCATION = ResourceLocation(TN_MOB_CHICKEN); diff --git a/Minecraft.Client/Rendering/EntityRenderers/ChickenRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/ChickenRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/ChickenRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/ChickenRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/CowRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/CowRenderer.cpp similarity index 87% rename from Minecraft.Client/Rendering/EntityRenderers/CowRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/CowRenderer.cpp index 7daee01cc..f23015267 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/CowRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/CowRenderer.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "CowRenderer.h" ResourceLocation CowRenderer::COW_LOCATION = ResourceLocation(TN_MOB_COW); diff --git a/Minecraft.Client/Rendering/EntityRenderers/CowRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/CowRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/CowRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/CowRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/CreeperRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/CreeperRenderer.cpp similarity index 90% rename from Minecraft.Client/Rendering/EntityRenderers/CreeperRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/CreeperRenderer.cpp index 062344713..9d17e4b02 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/CreeperRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/CreeperRenderer.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "CreeperRenderer.h" -#include "../Models/CreeperModel.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.monster.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../../model/CreeperModel.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h" +#include "../../../../../../Minecraft.World/net/minecraft/util/Mth.h" ResourceLocation CreeperRenderer::POWER_LOCATION = ResourceLocation(TN_POWERED_CREEPER); diff --git a/Minecraft.Client/Rendering/EntityRenderers/CreeperRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/CreeperRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/CreeperRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/CreeperRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/DefaultRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/DefaultRenderer.cpp similarity index 69% rename from Minecraft.Client/Rendering/EntityRenderers/DefaultRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/DefaultRenderer.cpp index ad631c6df..bd0ff7ba1 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/DefaultRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/DefaultRenderer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "DefaultRenderer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" void DefaultRenderer::render(std::shared_ptr entity, double x, double y, double z, float rot, float a) { diff --git a/Minecraft.Client/Rendering/EntityRenderers/DefaultRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/DefaultRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/DefaultRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/DefaultRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/EnderCrystalRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/EnderCrystalRenderer.cpp similarity index 83% rename from Minecraft.Client/Rendering/EntityRenderers/EnderCrystalRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/EnderCrystalRenderer.cpp index bdb9b17f0..531c188da 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/EnderCrystalRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/EnderCrystalRenderer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../Models/EnderCrystalModel.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.boss.enderdragon.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../model/dragon/EnderCrystalModel.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/boss/enderdragon/net.minecraft.world.entity.boss.enderdragon.h" #include "EnderCrystalRenderer.h" ResourceLocation EnderCrystalRenderer::ENDER_CRYSTAL_LOCATION = diff --git a/Minecraft.Client/Rendering/EntityRenderers/EnderCrystalRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/EnderCrystalRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/EnderCrystalRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/EnderCrystalRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/EnderDragonRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/EnderDragonRenderer.cpp similarity index 97% rename from Minecraft.Client/Rendering/EntityRenderers/EnderDragonRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/EnderDragonRenderer.cpp index f71c07234..ee91e3664 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/EnderDragonRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/EnderDragonRenderer.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../Models/DragonModel.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.boss.enderdragon.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../model/dragon/DragonModel.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/boss/enderdragon/net.minecraft.world.entity.boss.enderdragon.h" #include "../Tesselator.h" -#include "../Lighting.h" +#include "../../Lighting.h" #include "EnderDragonRenderer.h" -#include "../../UI/BossMobGuiInfo.h" +#include "../BossMobGuiInfo.h" ResourceLocation EnderDragonRenderer::DRAGON_EXPLODING_LOCATION = ResourceLocation(TN_MOB_ENDERDRAGON_SHUFFLE); diff --git a/Minecraft.Client/Rendering/EntityRenderers/EnderDragonRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/EnderDragonRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/EnderDragonRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/EnderDragonRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/EnderManRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/EndermanRenderer.cpp similarity index 90% rename from Minecraft.Client/Rendering/EntityRenderers/EnderManRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/EndermanRenderer.cpp index 4798c2754..c202ca72c 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/EnderManRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/EndermanRenderer.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "EnderManRenderer.h" -#include "../Models/EnderManModel.h" -#include "../../Textures/TextureAtlas.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.monster.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "EndermanRenderer.h" +#include "../../model/EndermanModel.h" +#include "../texture/TextureAtlas.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" ResourceLocation EndermanRenderer::ENDERMAN_EYES_LOCATION = ResourceLocation(TN_MOB_ENDERMAN_EYES); diff --git a/Minecraft.Client/Rendering/EntityRenderers/EnderManRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/EndermanRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/EnderManRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/EndermanRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/EntityRenderDispatcher.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderDispatcher.cpp similarity index 84% rename from Minecraft.Client/Rendering/EntityRenderers/EntityRenderDispatcher.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderDispatcher.cpp index ab7fff785..1f861d99d 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/EntityRenderDispatcher.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderDispatcher.cpp @@ -1,18 +1,18 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "EntityRenderDispatcher.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.projectile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.monster.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.item.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.global.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.boss.enderdragon.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.npc.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.alchemy.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/global/net.minecraft.world.entity.global.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/boss/enderdragon/net.minecraft.world.entity.boss.enderdragon.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/npc/net.minecraft.world.entity.npc.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/alchemy/net.minecraft.world.item.alchemy.h" #include "SpiderRenderer.h" #include "PigRenderer.h" #include "SheepRenderer.h" @@ -40,7 +40,7 @@ #include "LightningBoltRenderer.h" #include "HumanoidMobRenderer.h" #include "DefaultRenderer.h" -#include "EnderManRenderer.h" +#include "EndermanRenderer.h" #include "ExperienceOrbRenderer.h" #include "SilverfishRenderer.h" #include "MushroomCowRenderer.h" @@ -58,27 +58,27 @@ #include "TntMinecartRenderer.h" #include "MinecartSpawnerRenderer.h" #include "HorseRenderer.h" -#include "../Models/SpiderModel.h" -#include "../Models/PigModel.h" -#include "../Models/SheepModel.h" -#include "../Models/CowModel.h" -#include "../Models/WolfModel.h" -#include "../Models/ChickenModel.h" -#include "../Models/CreeperModel.h" -#include "../Models/SlimeModel.h" -#include "../Models/GhastModel.h" -#include "../Models/SquidModel.h" -#include "../Models/MinecartModel.h" -#include "../Models/BoatModel.h" -#include "../Models/HumanoidModel.h" -#include "../Models/SheepFurModel.h" -#include "../Models/SkeletonModel.h" -#include "../Models/ModelHorse.h" -#include "../../GameState/Options.h" +#include "../../model/SpiderModel.h" +#include "../../model/PigModel.h" +#include "../../model/SheepModel.h" +#include "../../model/CowModel.h" +#include "../../model/WolfModel.h" +#include "../../model/ChickenModel.h" +#include "../../model/CreeperModel.h" +#include "../../model/SlimeModel.h" +#include "../../model/GhastModel.h" +#include "../../model/SquidModel.h" +#include "../../model/MinecartModel.h" +#include "../../model/BoatModel.h" +#include "../../model/HumanoidModel.h" +#include "../../model/SheepFurModel.h" +#include "../../model/SkeletonModel.h" +#include "../../model/ModelHorse.h" +#include "../../Options.h" #include "ItemFrameRenderer.h" #include "OcelotRenderer.h" #include "VillagerGolemRenderer.h" -#include "../Models/OcelotModel.h" +#include "../../model/OcelotModel.h" #include "ZombieRenderer.h" #include "BatRenderer.h" #include "CaveSpiderRenderer.h" diff --git a/Minecraft.Client/Rendering/EntityRenderers/EntityRenderDispatcher.h b/Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderDispatcher.h similarity index 92% rename from Minecraft.Client/Rendering/EntityRenderers/EntityRenderDispatcher.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderDispatcher.h index 11d8a1709..141e44250 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/EntityRenderDispatcher.h +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderDispatcher.h @@ -1,7 +1,7 @@ #pragma once #include "EntityRenderer.h" -#include "../../../Minecraft.World/Entities/Entity.h" -#include "../../../Minecraft.World/Util/JavaIntHash.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/Entity.h" +#include "../../../../../../Minecraft.World/ConsoleJavaLibs/JavaIntHash.h" class font; class EntityRenderDispatcher { diff --git a/Minecraft.Client/Rendering/EntityRenderers/EntityRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderer.cpp similarity index 94% rename from Minecraft.Client/Rendering/EntityRenderers/EntityRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderer.cpp index f98c8881c..ae915ba4b 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/EntityRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderer.cpp @@ -1,17 +1,17 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "EntityRenderer.h" #include "EntityRenderDispatcher.h" -#include "../Models/HumanoidModel.h" -#include "../../Player/LocalPlayer.h" -#include "../../GameState/Options.h" -#include "../../Textures/TextureAtlas.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "../../../Minecraft.World/Level/Level.h" -#include "../../../Minecraft.World/Util/AABB.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" +#include "../../model/HumanoidModel.h" +#include "../../player/LocalPlayer.h" +#include "../../Options.h" +#include "../texture/TextureAtlas.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/Level.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/phys/AABB.h" +#include "../../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" ResourceLocation EntityRenderer::SHADOW_LOCATION = ResourceLocation(TN__CLAMP__MISC_SHADOW); diff --git a/Minecraft.Client/Rendering/EntityRenderers/EntityRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderer.h similarity index 94% rename from Minecraft.Client/Rendering/EntityRenderers/EntityRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderer.h index f25cdd880..f84682d89 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/EntityRenderer.h +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/EntityRenderer.h @@ -1,10 +1,10 @@ #pragma once -#include "../Models/Model.h" -#include "TileRenderer.h" +#include "../../model/geom/Model.h" +#include "../TileRenderer.h" #include "../Tesselator.h" -#include "../../Textures/Textures.h" -#include "ItemInHandRenderer.h" -#include "../../Textures/ResourceLocation.h" +#include "../Textures.h" +#include "../ItemInHandRenderer.h" +#include "../../resources/ResourceLocation.h" class Tile; class Entity; diff --git a/Minecraft.Client/Rendering/EntityRenderers/ExperienceOrbRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/ExperienceOrbRenderer.cpp similarity index 84% rename from Minecraft.Client/Rendering/EntityRenderers/ExperienceOrbRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/ExperienceOrbRenderer.cpp index b7f40a6e6..309904c9a 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/ExperienceOrbRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/ExperienceOrbRenderer.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "ExperienceOrbRenderer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" #include "../Tesselator.h" #include "EntityRenderDispatcher.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "../../../Minecraft.World/Util/JavaMath.h" +#include "../../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "../../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" ResourceLocation ExperienceOrbRenderer::XP_ORB_LOCATION = ResourceLocation(TN_ITEM_EXPERIENCE_ORB); diff --git a/Minecraft.Client/Rendering/EntityRenderers/ExperienceOrbRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/ExperienceOrbRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/ExperienceOrbRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/ExperienceOrbRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/FallingTileRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/FallingTileRenderer.cpp similarity index 86% rename from Minecraft.Client/Rendering/EntityRenderers/FallingTileRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/FallingTileRenderer.cpp index a89a08cd7..164689d20 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/FallingTileRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/FallingTileRenderer.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "FallingTileRenderer.h" -#include "../../Textures/TextureAtlas.h" -#include "TileRenderer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.item.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" +#include "../texture/TextureAtlas.h" +#include "../TileRenderer.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" #include "EntityRenderDispatcher.h" FallingTileRenderer::FallingTileRenderer() : EntityRenderer() { diff --git a/Minecraft.Client/Rendering/EntityRenderers/FallingTileRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/FallingTileRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/FallingTileRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/FallingTileRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/FireballRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/FireballRenderer.cpp similarity index 85% rename from Minecraft.Client/Rendering/EntityRenderers/FireballRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/FireballRenderer.cpp index fd1dce90c..1185ce270 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/FireballRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/FireballRenderer.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "FireballRenderer.h" #include "EntityRenderDispatcher.h" -#include "../../Textures/TextureAtlas.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.projectile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.phys.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.h" +#include "../texture/TextureAtlas.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/phys/net.minecraft.world.phys.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" FireballRenderer::FireballRenderer(float scale) { this->scale = scale; } diff --git a/Minecraft.Client/Rendering/EntityRenderers/FireballRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/FireballRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/FireballRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/FireballRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/FishingHookRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/FishingHookRenderer.cpp similarity index 89% rename from Minecraft.Client/Rendering/EntityRenderers/FishingHookRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/FishingHookRenderer.cpp index b07539ca4..f04124131 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/FishingHookRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/FishingHookRenderer.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "FishingHookRenderer.h" #include "EntityRenderDispatcher.h" -#include "../../GameState/Options.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.projectile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../../Minecraft.World/Util/Vec3.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "../../Player/MultiPlayerLocalPlayer.h" +#include "../../Options.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/phys/Vec3.h" +#include "../../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "../../multiplayer/MultiPlayerLocalPlayer.h" ResourceLocation FishingHookRenderer::PARTICLE_LOCATION = ResourceLocation(TN_PARTICLES); diff --git a/Minecraft.Client/Rendering/EntityRenderers/FishingHookRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/FishingHookRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/FishingHookRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/FishingHookRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/GhastRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/GhastRenderer.cpp similarity index 81% rename from Minecraft.Client/Rendering/EntityRenderers/GhastRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/GhastRenderer.cpp index 0eb074802..4b6feca89 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/GhastRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/GhastRenderer.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "GhastRenderer.h" -#include "../Models/GhastModel.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.monster.h" +#include "../../model/GhastModel.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h" ResourceLocation GhastRenderer::GHAST_LOCATION = ResourceLocation(TN_MOB_GHAST); ResourceLocation GhastRenderer::GHAST_SHOOTING_LOCATION = diff --git a/Minecraft.Client/Rendering/EntityRenderers/GhastRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/GhastRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/GhastRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/GhastRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/GiantMobRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/GiantMobRenderer.cpp similarity index 88% rename from Minecraft.Client/Rendering/EntityRenderers/GiantMobRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/GiantMobRenderer.cpp index 8206f8635..ff0b98371 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/GiantMobRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/GiantMobRenderer.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "GiantMobRenderer.h" ResourceLocation GiantMobRenderer::ZOMBIE_LOCATION = diff --git a/Minecraft.Client/Rendering/EntityRenderers/GiantMobRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/GiantMobRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/GiantMobRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/GiantMobRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/HorseRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/HorseRenderer.cpp similarity index 95% rename from Minecraft.Client/Rendering/EntityRenderers/HorseRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/HorseRenderer.cpp index 1fa12dcaf..2a6f5eb2b 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/HorseRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/HorseRenderer.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "HorseRenderer.h" #include "MobRenderer.h" #include "EntityRenderDispatcher.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" ResourceLocation HorseRenderer::HORSE_LOCATION = ResourceLocation(TN_MOB_HORSE_WHITE); diff --git a/Minecraft.Client/Rendering/EntityRenderers/HorseRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/HorseRenderer.h similarity index 96% rename from Minecraft.Client/Rendering/EntityRenderers/HorseRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/HorseRenderer.h index 31f7c281c..2858652ea 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/HorseRenderer.h +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/HorseRenderer.h @@ -1,6 +1,6 @@ #pragma once #include "MobRenderer.h" -#include "../../Textures/ResourceLocation.h" +#include "../../resources/ResourceLocation.h" class EntityHorse; class PathfinderMob; diff --git a/Minecraft.Client/Rendering/EntityRenderers/HumanoidMobRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/HumanoidMobRenderer.cpp similarity index 93% rename from Minecraft.Client/Rendering/EntityRenderers/HumanoidMobRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/HumanoidMobRenderer.cpp index b1f94d370..b48dca781 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/HumanoidMobRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/HumanoidMobRenderer.cpp @@ -1,14 +1,14 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "HumanoidMobRenderer.h" -#include "SkullTileRenderer.h" -#include "../Models/HumanoidModel.h" -#include "../Models/ModelPart.h" +#include "../tileentity/SkullTileRenderer.h" +#include "../../model/HumanoidModel.h" +#include "../../model/geom/ModelPart.h" #include "EntityRenderDispatcher.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.monster.h" -#include "../../../Minecraft.World/Headers/net.minecraft.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h" +#include "../../../../../../Minecraft.World/net/minecraft/net.minecraft.h" const std::wstring HumanoidMobRenderer::MATERIAL_NAMES[5] = { L"cloth", L"chain", L"iron", L"diamond", L"gold"}; diff --git a/Minecraft.Client/Rendering/EntityRenderers/HumanoidMobRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/HumanoidMobRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/HumanoidMobRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/HumanoidMobRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/ItemFrameRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/ItemFrameRenderer.cpp similarity index 86% rename from Minecraft.Client/Rendering/EntityRenderers/ItemFrameRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/ItemFrameRenderer.cpp index 9d46d6e63..56488ddc9 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/ItemFrameRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/ItemFrameRenderer.cpp @@ -1,23 +1,23 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "ItemRenderer.h" -#include "TileRenderer.h" +#include "../TileRenderer.h" #include "EntityRenderDispatcher.h" // #include "ItemFrame" #include "ItemFrameRenderer.h" -#include "../../Textures/TextureAtlas.h" +#include "../texture/TextureAtlas.h" -#include "../../../Minecraft.World/Util/JavaMath.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.item.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.alchemy.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/alchemy/net.minecraft.world.item.alchemy.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #include "../../Minecraft.h" -#include "../../../Minecraft.World/Items/Item.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.h" -#include "../../../Minecraft.World/Headers/net.minecraft.h" -#include "../../Textures/CompassTexture.h" -#include "../Minimap.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/Item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" +#include "../../../../../../Minecraft.World/net/minecraft/net.minecraft.h" +#include "../texture/custom/CompassTexture.h" +#include "../../gui/Minimap.h" ResourceLocation ItemFrameRenderer::MAP_BACKGROUND_LOCATION = ResourceLocation(TN_MISC_MAPBG); diff --git a/Minecraft.Client/Rendering/EntityRenderers/ItemFrameRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/ItemFrameRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/ItemFrameRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/ItemFrameRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/ItemRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/ItemRenderer.cpp similarity index 97% rename from Minecraft.Client/Rendering/EntityRenderers/ItemRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/ItemRenderer.cpp index b8641c198..bd5f17f1e 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/ItemRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/ItemRenderer.cpp @@ -1,16 +1,16 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "ItemRenderer.h" -#include "TileRenderer.h" +#include "../TileRenderer.h" #include "EntityRenderDispatcher.h" -#include "../../../Minecraft.World/Util/JavaMath.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.item.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.alchemy.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.h" -#include "../../GameState/Options.h" -#include "../../Textures/TextureAtlas.h" +#include "../../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/alchemy/net.minecraft.world.item.alchemy.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" +#include "../../Options.h" +#include "../texture/TextureAtlas.h" ItemRenderer::ItemRenderer() : EntityRenderer() { random = new Random(); diff --git a/Minecraft.Client/Rendering/EntityRenderers/ItemRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/ItemRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/ItemRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/ItemRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/ItemSpriteRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/ItemSpriteRenderer.cpp similarity index 83% rename from Minecraft.Client/Rendering/EntityRenderers/ItemSpriteRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/ItemSpriteRenderer.cpp index e530b1b2f..0dc1d3344 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/ItemSpriteRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/ItemSpriteRenderer.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "ItemSpriteRenderer.h" #include "EntityRenderDispatcher.h" -#include "../../Textures/TextureAtlas.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.projectile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.alchemy.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.h" +#include "../texture/TextureAtlas.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/alchemy/net.minecraft.world.item.alchemy.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" ItemSpriteRenderer::ItemSpriteRenderer(Item* sourceItem, int sourceItemAuxValue /*= 0*/) diff --git a/Minecraft.Client/Rendering/EntityRenderers/ItemSpriteRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/ItemSpriteRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/ItemSpriteRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/ItemSpriteRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/LavaSlimeRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/LavaSlimeRenderer.cpp similarity index 81% rename from Minecraft.Client/Rendering/EntityRenderers/LavaSlimeRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/LavaSlimeRenderer.cpp index 932449062..2a8310075 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/LavaSlimeRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/LavaSlimeRenderer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.monster.h" -#include "../Models/LavaSlimeModel.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h" +#include "../../model/LavaSlimeModel.h" #include "LavaSlimeRenderer.h" ResourceLocation LavaSlimeRenderer::MAGMACUBE_LOCATION = diff --git a/Minecraft.Client/Rendering/EntityRenderers/LavaSlimeRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/LavaSlimeRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/LavaSlimeRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/LavaSlimeRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/LeashKnotRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/LeashKnotRenderer.cpp similarity index 89% rename from Minecraft.Client/Rendering/EntityRenderers/LeashKnotRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/LeashKnotRenderer.cpp index 3988e9af4..d8f4db396 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/LeashKnotRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/LeashKnotRenderer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "LeashKnotRenderer.h" -#include "../Models/LeashKnotModel.h" +#include "../../model/LeashKnotModel.h" ResourceLocation LeashKnotRenderer::KNOT_LOCATION = ResourceLocation(TN_ITEM_LEASHKNOT); diff --git a/Minecraft.Client/Rendering/EntityRenderers/LeashKnotRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/LeashKnotRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/LeashKnotRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/LeashKnotRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/LightningBoltRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/LightningBoltRenderer.cpp similarity index 94% rename from Minecraft.Client/Rendering/EntityRenderers/LightningBoltRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/LightningBoltRenderer.cpp index fe4321e12..8eb91e1ea 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/LightningBoltRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/LightningBoltRenderer.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "LightningBoltRenderer.h" #include "../Tesselator.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.global.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/global/net.minecraft.world.entity.global.h" void LightningBoltRenderer::render(std::shared_ptr _bolt, double x, double y, double z, float rot, float a) { diff --git a/Minecraft.Client/Rendering/EntityRenderers/LightningBoltRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/LightningBoltRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/LightningBoltRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/LightningBoltRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/LivingEntityRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/LivingEntityRenderer.cpp similarity index 97% rename from Minecraft.Client/Rendering/EntityRenderers/LivingEntityRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/LivingEntityRenderer.cpp index ed2fe1e08..458f218c7 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/LivingEntityRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/LivingEntityRenderer.cpp @@ -1,13 +1,13 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "LivingEntityRenderer.h" -#include "../Lighting.h" -#include "../Cube.h" -#include "../Models/ModelPart.h" +#include "../../Lighting.h" +#include "../../model/geom/Cube.h" +#include "../../model/geom/ModelPart.h" #include "EntityRenderDispatcher.h" -#include "../../Player/MultiPlayerLocalPlayer.h" -#include "../../../Minecraft.World/Entities/Mobs/Arrow.h" -#include "../../../Minecraft.World/Util/Mth.h" -#include "../../../Minecraft.World/Player/Player.h" +#include "../../multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/projectile/Arrow.h" +#include "../../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/player/Player.h" ResourceLocation LivingEntityRenderer::ENCHANT_GLINT_LOCATION = ResourceLocation(TN__BLUR__MISC_GLINT); diff --git a/Minecraft.Client/Rendering/EntityRenderers/LivingEntityRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/LivingEntityRenderer.h similarity index 95% rename from Minecraft.Client/Rendering/EntityRenderers/LivingEntityRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/LivingEntityRenderer.h index b6d73b003..14e69e456 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/LivingEntityRenderer.h +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/LivingEntityRenderer.h @@ -1,7 +1,7 @@ #pragma once -#include "../../Textures/ResourceLocation.h" +#include "../../resources/ResourceLocation.h" #include "EntityRenderer.h" -#include "../../../Minecraft.World/Entities/LivingEntity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/LivingEntity.h" class LivingEntity; diff --git a/Minecraft.Client/Rendering/EntityRenderers/MinecartRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/MinecartRenderer.cpp similarity index 92% rename from Minecraft.Client/Rendering/EntityRenderers/MinecartRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/MinecartRenderer.cpp index 82f808e09..4c9e35475 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/MinecartRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/MinecartRenderer.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "MinecartRenderer.h" #include -#include "../Models/MinecartModel.h" -#include "../../Textures/TextureAtlas.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.item.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" +#include "../../model/MinecartModel.h" +#include "../texture/TextureAtlas.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" ResourceLocation MinecartRenderer::MINECART_LOCATION(TN_ITEM_CART); diff --git a/Minecraft.Client/Rendering/EntityRenderers/MinecartRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/MinecartRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/MinecartRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/MinecartRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/MinecartSpawnerRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/MinecartSpawnerRenderer.cpp similarity index 57% rename from Minecraft.Client/Rendering/EntityRenderers/MinecartSpawnerRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/MinecartSpawnerRenderer.cpp index 90f2da54a..ea0ecfe9c 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/MinecartSpawnerRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/MinecartSpawnerRenderer.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "MinecartSpawnerRenderer.h" -#include "../../../Minecraft.World/Blocks/Tile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.item.h" -#include "MobSpawnerRenderer.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/Tile.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h" +#include "../tileentity/MobSpawnerRenderer.h" void MinecartSpawnerRenderer::renderMinecartContents( std::shared_ptr cart, float a, Tile* tile, int tileData) { diff --git a/Minecraft.Client/Rendering/EntityRenderers/MinecartSpawnerRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/MinecartSpawnerRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/MinecartSpawnerRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/MinecartSpawnerRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/MobRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/MobRenderer.cpp similarity index 90% rename from Minecraft.Client/Rendering/EntityRenderers/MobRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/MobRenderer.cpp index 838892f99..e7d79caba 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/MobRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/MobRenderer.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "MobRenderer.h" #include "LivingEntityRenderer.h" -#include "../../Player/MultiPlayerLocalPlayer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.projectile.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../../multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../../Minecraft.World/net/minecraft/util/Mth.h" #include "EntityRenderDispatcher.h" MobRenderer::MobRenderer(Model* model, float shadow) diff --git a/Minecraft.Client/Rendering/EntityRenderers/MobRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/MobRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/MobRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/MobRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/MushroomCowRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/MushroomCowRenderer.cpp similarity index 83% rename from Minecraft.Client/Rendering/EntityRenderers/MushroomCowRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/MushroomCowRenderer.cpp index a45b8b20f..4592fe549 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/MushroomCowRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/MushroomCowRenderer.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../Models/ModelPart.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../model/geom/ModelPart.h" #include "MushroomCowRenderer.h" -#include "../../Textures/TextureAtlas.h" -#include "../Models/QuadrupedModel.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" +#include "../texture/TextureAtlas.h" +#include "../../model/QuadrupedModel.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" ResourceLocation MushroomCowRenderer::MOOSHROOM_LOCATION = ResourceLocation(TN_MOB_RED_COW); diff --git a/Minecraft.Client/Rendering/EntityRenderers/MushroomCowRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/MushroomCowRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/MushroomCowRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/MushroomCowRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/OcelotRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/OcelotRenderer.cpp similarity index 90% rename from Minecraft.Client/Rendering/EntityRenderers/OcelotRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/OcelotRenderer.cpp index 134c6db22..17bab5898 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/OcelotRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/OcelotRenderer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "OcelotRenderer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" ResourceLocation OcelotRenderer::CAT_BLACK_LOCATION = ResourceLocation(TN_MOB_CAT_BLACK); diff --git a/Minecraft.Client/Rendering/EntityRenderers/OcelotRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/OcelotRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/OcelotRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/OcelotRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/PaintingRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/PaintingRenderer.cpp similarity index 92% rename from Minecraft.Client/Rendering/EntityRenderers/PaintingRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/PaintingRenderer.cpp index 91449b4b6..4c0cdfd4f 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/PaintingRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/PaintingRenderer.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "PaintingRenderer.h" #include "EntityRenderDispatcher.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Util/Random.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" +#include "../../../../../../Minecraft.World/net/minecraft/util/Mth.h" ResourceLocation PaintingRenderer::PAINTING_LOCATION(TN_ART_KZ); diff --git a/Minecraft.Client/Rendering/EntityRenderers/PaintingRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/PaintingRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/PaintingRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/PaintingRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/PigRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/PigRenderer.cpp similarity index 85% rename from Minecraft.Client/Rendering/EntityRenderers/PigRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/PigRenderer.cpp index c1281fc66..c16e66dcf 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/PigRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/PigRenderer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "PigRenderer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" ResourceLocation PigRenderer::PIG_LOCATION = ResourceLocation(TN_MOB_PIG); ResourceLocation PigRenderer::SADDLE_LOCATION = ResourceLocation(TN_MOB_SADDLE); diff --git a/Minecraft.Client/Rendering/EntityRenderers/PigRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/PigRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/PigRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/PigRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/PlayerRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/PlayerRenderer.cpp similarity index 95% rename from Minecraft.Client/Rendering/EntityRenderers/PlayerRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/PlayerRenderer.cpp index d032450e3..2e20d6dd1 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/PlayerRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/PlayerRenderer.cpp @@ -1,18 +1,18 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "PlayerRenderer.h" -#include "SkullTileRenderer.h" +#include "../tileentity/SkullTileRenderer.h" #include "HumanoidMobRenderer.h" -#include "../Models/HumanoidModel.h" -#include "../Models/ModelPart.h" -#include "../../Player/LocalPlayer.h" -#include "../../Player/MultiPlayerLocalPlayer.h" +#include "../../model/HumanoidModel.h" +#include "../../model/geom/ModelPart.h" +#include "../../player/LocalPlayer.h" +#include "../../multiplayer/MultiPlayerLocalPlayer.h" #include "EntityRenderDispatcher.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../../Minecraft.World/net/minecraft/net.minecraft.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" const unsigned int PlayerRenderer::s_nametagColors[MINECRAFT_NET_MAX_PLAYERS] = { diff --git a/Minecraft.Client/Rendering/EntityRenderers/PlayerRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/PlayerRenderer.h similarity index 95% rename from Minecraft.Client/Rendering/EntityRenderers/PlayerRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/PlayerRenderer.h index e754b9a3c..629eba1da 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/PlayerRenderer.h +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/PlayerRenderer.h @@ -1,6 +1,6 @@ #pragma once #include "MobRenderer.h" -#include "../../../Minecraft.World/Player/Player.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/player/Player.h" class HumanoidModel; diff --git a/Minecraft.Client/Rendering/EntityRenderers/SheepRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/SheepRenderer.cpp similarity index 91% rename from Minecraft.Client/Rendering/EntityRenderers/SheepRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/SheepRenderer.cpp index a95f9f971..617908932 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/SheepRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/SheepRenderer.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "SheepRenderer.h" -#include "../../Player/MultiPlayerLocalPlayer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" +#include "../../multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" ResourceLocation SheepRenderer::SHEEP_LOCATION = ResourceLocation(TN_MOB_SHEEP); ResourceLocation SheepRenderer::SHEEP_FUR_LOCATION = diff --git a/Minecraft.Client/Rendering/EntityRenderers/SheepRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/SheepRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/SheepRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/SheepRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/SilverfishRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/SilverfishRenderer.cpp similarity index 77% rename from Minecraft.Client/Rendering/EntityRenderers/SilverfishRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/SilverfishRenderer.cpp index ad88672d0..9e4f41d05 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/SilverfishRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/SilverfishRenderer.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "SilverfishRenderer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.monster.h" -#include "../Models/SilverfishModel.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h" +#include "../../model/SilverfishModel.h" ResourceLocation SilverfishRenderer::SILVERFISH_LOCATION(TN_MOB_SILVERFISH); diff --git a/Minecraft.Client/Rendering/EntityRenderers/SilverfishRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/SilverfishRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/SilverfishRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/SilverfishRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/SkeletonRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/SkeletonRenderer.cpp similarity index 83% rename from Minecraft.Client/Rendering/EntityRenderers/SkeletonRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/SkeletonRenderer.cpp index 7538ff352..14f8e54a4 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/SkeletonRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/SkeletonRenderer.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "SkeletonRenderer.h" -#include "../Models/SkeletonModel.h" -#include "../../../Minecraft.World/Entities/Mobs/Skeleton.h" +#include "../../model/SkeletonModel.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/monster/Skeleton.h" ResourceLocation SkeletonRenderer::SKELETON_LOCATION = ResourceLocation(TN_MOB_SKELETON); diff --git a/Minecraft.Client/Rendering/EntityRenderers/SkeletonRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/SkeletonRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/SkeletonRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/SkeletonRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/SlimeRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/SlimeRenderer.cpp similarity index 89% rename from Minecraft.Client/Rendering/EntityRenderers/SlimeRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/SlimeRenderer.cpp index 21def8ae8..009b187ac 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/SlimeRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/SlimeRenderer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "SlimeRenderer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.monster.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h" ResourceLocation SlimeRenderer::SLIME_LOCATION = ResourceLocation(TN_MOB_SLIME); diff --git a/Minecraft.Client/Rendering/EntityRenderers/SlimeRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/SlimeRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/SlimeRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/SlimeRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/SnowManRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/SnowManRenderer.cpp similarity index 77% rename from Minecraft.Client/Rendering/EntityRenderers/SnowManRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/SnowManRenderer.cpp index 3394d7d10..c88ba639c 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/SnowManRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/SnowManRenderer.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../Models/SnowManModel.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../Models/ModelPart.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../model/SnowManModel.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../model/geom/ModelPart.h" #include "EntityRenderDispatcher.h" #include "SnowManRenderer.h" diff --git a/Minecraft.Client/Rendering/EntityRenderers/SnowManRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/SnowManRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/SnowManRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/SnowManRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/SpiderRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/SpiderRenderer.cpp similarity index 91% rename from Minecraft.Client/Rendering/EntityRenderers/SpiderRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/SpiderRenderer.cpp index bc03ecb3b..108464643 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/SpiderRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/SpiderRenderer.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "SpiderRenderer.h" -#include "../Models/SpiderModel.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.monster.h" +#include "../../model/SpiderModel.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h" ResourceLocation SpiderRenderer::SPIDER_LOCATION = ResourceLocation(TN_MOB_SPIDER); diff --git a/Minecraft.Client/Rendering/EntityRenderers/SpiderRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/SpiderRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/SpiderRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/SpiderRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/SquidRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/SquidRenderer.cpp similarity index 89% rename from Minecraft.Client/Rendering/EntityRenderers/SquidRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/SquidRenderer.cpp index 411be9141..471715e75 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/SquidRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/SquidRenderer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "SquidRenderer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" ResourceLocation SquidRenderer::SQUID_LOCATION = ResourceLocation(TN_MOB_SQUID); diff --git a/Minecraft.Client/Rendering/EntityRenderers/SquidRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/SquidRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/SquidRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/SquidRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/TntMinecartRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/TntMinecartRenderer.cpp similarity index 79% rename from Minecraft.Client/Rendering/EntityRenderers/TntMinecartRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/TntMinecartRenderer.cpp index ef7900b58..93b9e26ab 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/TntMinecartRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/TntMinecartRenderer.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "TntMinecartRenderer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.item.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" void TntMinecartRenderer::renderMinecartContents( std::shared_ptr _cart, float a, Tile* tile, int tileData) { diff --git a/Minecraft.Client/Rendering/EntityRenderers/TntMinecartRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/TntMinecartRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/TntMinecartRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/TntMinecartRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/TntRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/TntRenderer.cpp similarity index 83% rename from Minecraft.Client/Rendering/EntityRenderers/TntRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/TntRenderer.cpp index 86754c5aa..722f9ff4f 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/TntRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/TntRenderer.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "TntRenderer.h" -#include "../../Textures/TextureAtlas.h" -#include "TileRenderer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.item.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" +#include "../texture/TextureAtlas.h" +#include "../TileRenderer.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" TntRenderer::TntRenderer() { renderer = new TileRenderer(); diff --git a/Minecraft.Client/Rendering/EntityRenderers/TntRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/TntRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/TntRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/TntRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/VillagerGolemRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/VillagerGolemRenderer.cpp similarity index 86% rename from Minecraft.Client/Rendering/EntityRenderers/VillagerGolemRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/VillagerGolemRenderer.cpp index 8d1650c98..b4c1de269 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/VillagerGolemRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/VillagerGolemRenderer.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../Models/VillagerGolemModel.h" -#include "../Models/ModelPart.h" -#include "../../Textures/TextureAtlas.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../model/VillagerGolemModel.h" +#include "../../model/geom/ModelPart.h" +#include "../texture/TextureAtlas.h" #include "VillagerGolemRenderer.h" ResourceLocation VillagerGolemRenderer::GOLEM_LOCATION = diff --git a/Minecraft.Client/Rendering/EntityRenderers/VillagerGolemRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/VillagerGolemRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/VillagerGolemRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/VillagerGolemRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/VillagerRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/VillagerRenderer.cpp similarity index 92% rename from Minecraft.Client/Rendering/EntityRenderers/VillagerRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/VillagerRenderer.cpp index e91151b5f..1714a328f 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/VillagerRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/VillagerRenderer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.npc.h" -#include "../Models/VillagerModel.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/npc/net.minecraft.world.entity.npc.h" +#include "../../model/VillagerModel.h" #include "VillagerRenderer.h" ResourceLocation VillagerRenderer::VILLAGER_LOCATION = diff --git a/Minecraft.Client/Rendering/EntityRenderers/VillagerRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/VillagerRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/VillagerRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/VillagerRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/WitchRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/WitchRenderer.cpp similarity index 93% rename from Minecraft.Client/Rendering/EntityRenderers/WitchRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/WitchRenderer.cpp index 2c25af985..5491ffe3f 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/WitchRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/WitchRenderer.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "EntityRenderDispatcher.h" #include "WitchRenderer.h" -#include "../Models/WitchModel.h" -#include "../Models/ModelPart.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" +#include "../../model/WitchModel.h" +#include "../../model/geom/ModelPart.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" ResourceLocation WitchRenderer::WITCH_LOCATION = ResourceLocation(TN_MOB_WITCH); diff --git a/Minecraft.Client/Rendering/EntityRenderers/WitchRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/WitchRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/WitchRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/WitchRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/WitherBossRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/WitherBossRenderer.cpp similarity index 93% rename from Minecraft.Client/Rendering/EntityRenderers/WitherBossRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/WitherBossRenderer.cpp index c0d38e65e..cf6f0aa57 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/WitherBossRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/WitherBossRenderer.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "WitherBossRenderer.h" -#include "../Models/WitherBossModel.h" +#include "../../model/WitherBossModel.h" #include "MobRenderer.h" -#include "../../../Minecraft.World/Entities/Mobs/WitherBoss.h" -#include "../../UI/BossMobGuiInfo.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/boss/wither/WitherBoss.h" +#include "../BossMobGuiInfo.h" ResourceLocation WitherBossRenderer::WITHER_ARMOR_LOCATION = ResourceLocation(TN_MOB_WITHER_ARMOR); diff --git a/Minecraft.Client/Rendering/EntityRenderers/WitherBossRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/WitherBossRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/WitherBossRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/WitherBossRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/WitherSkullRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/WitherSkullRenderer.cpp similarity index 86% rename from Minecraft.Client/Rendering/EntityRenderers/WitherSkullRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/WitherSkullRenderer.cpp index dc2794f09..f05a42132 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/WitherSkullRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/WitherSkullRenderer.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "WitherSkullRenderer.h" -#include "../Models/SkeletonHeadModel.h" -#include "../../../Minecraft.World/Entities/WitherSkull.h" +#include "../../model/SkeletonHeadModel.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/projectile/WitherSkull.h" ResourceLocation WitherSkullRenderer::WITHER_ARMOR_LOCATION( TN_MOB_WITHER_INVULNERABLE); diff --git a/Minecraft.Client/Rendering/EntityRenderers/WitherSkullRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/WitherSkullRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/WitherSkullRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/WitherSkullRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/WolfRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/WolfRenderer.cpp similarity index 90% rename from Minecraft.Client/Rendering/EntityRenderers/WolfRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/WolfRenderer.cpp index ddeb8acf3..4b53ddd4d 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/WolfRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/WolfRenderer.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "WolfRenderer.h" -#include "../../Player/MultiPlayerLocalPlayer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" +#include "../../multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" ResourceLocation* WolfRenderer::WOLF_LOCATION = new ResourceLocation(TN_MOB_WOLF); diff --git a/Minecraft.Client/Rendering/EntityRenderers/WolfRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/WolfRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/WolfRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/WolfRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/ZombieRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/entity/ZombieRenderer.cpp similarity index 92% rename from Minecraft.Client/Rendering/EntityRenderers/ZombieRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/entity/ZombieRenderer.cpp index 46c79e157..784e21dd0 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/ZombieRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/entity/ZombieRenderer.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../Models/ZombieModel.h" -#include "../Models/VillagerZombieModel.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.monster.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../model/ZombieModel.h" +#include "../../model/VillagerZombieModel.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h" #include "ZombieRenderer.h" ResourceLocation ZombieRenderer::ZOMBIE_PIGMAN_LOCATION(TN_MOB_PIGZOMBIE); diff --git a/Minecraft.Client/Rendering/EntityRenderers/ZombieRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/entity/ZombieRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/ZombieRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/entity/ZombieRenderer.h diff --git a/Minecraft.Client/Textures/Stitching/PreStitchedTextureMap.cpp b/Minecraft.Client/net/minecraft/client/renderer/texture/PreStitchedTextureMap.cpp similarity index 97% rename from Minecraft.Client/Textures/Stitching/PreStitchedTextureMap.cpp rename to Minecraft.Client/net/minecraft/client/renderer/texture/PreStitchedTextureMap.cpp index 553f63221..9f42dd6fb 100644 --- a/Minecraft.Client/Textures/Stitching/PreStitchedTextureMap.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/texture/PreStitchedTextureMap.cpp @@ -1,23 +1,23 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../../Minecraft.World/IO/Streams/ByteBuffer.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../../Minecraft.World/ConsoleJavaLibs/ByteBuffer.h" #include "../../Minecraft.h" -#include "../../Rendering/LevelRenderer.h" -#include "../../Rendering/EntityRenderers/EntityRenderDispatcher.h" +#include "../LevelRenderer.h" +#include "../entity/EntityRenderDispatcher.h" #include "Stitcher.h" #include "StitchSlot.h" #include "StitchedTexture.h" -#include "../Texture.h" -#include "../TextureHolder.h" -#include "../TextureManager.h" -#include "../Packs/TexturePack.h" -#include "../Packs/TexturePackRepository.h" +#include "Texture.h" +#include "TextureHolder.h" +#include "TextureManager.h" +#include "../../skins/TexturePack.h" +#include "../../skins/TexturePackRepository.h" #include "PreStitchedTextureMap.h" -#include "../../UI/SimpleIcon.h" -#include "../CompassTexture.h" -#include "../ClockTexture.h" +#include "SimpleIcon.h" +#include "custom/CompassTexture.h" +#include "custom/ClockTexture.h" const std::wstring PreStitchedTextureMap::NAME_MISSING_TEXTURE = L"missingno"; diff --git a/Minecraft.Client/Textures/Stitching/PreStitchedTextureMap.h b/Minecraft.Client/net/minecraft/client/renderer/texture/PreStitchedTextureMap.h similarity index 95% rename from Minecraft.Client/Textures/Stitching/PreStitchedTextureMap.h rename to Minecraft.Client/net/minecraft/client/renderer/texture/PreStitchedTextureMap.h index 2d735f9a9..2fec945d6 100644 --- a/Minecraft.Client/Textures/Stitching/PreStitchedTextureMap.h +++ b/Minecraft.Client/net/minecraft/client/renderer/texture/PreStitchedTextureMap.h @@ -1,6 +1,6 @@ #pragma once -#include "../../../Minecraft.World/Util/IconRegister.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/IconRegister.h" class Icon; class StitchedTexture; diff --git a/Minecraft.Client/UI/SimpleIcon.cpp b/Minecraft.Client/net/minecraft/client/renderer/texture/SimpleIcon.cpp similarity index 79% rename from Minecraft.Client/UI/SimpleIcon.cpp rename to Minecraft.Client/net/minecraft/client/renderer/texture/SimpleIcon.cpp index 33d5b5057..395235582 100644 --- a/Minecraft.Client/UI/SimpleIcon.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/texture/SimpleIcon.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "SimpleIcon.h" SimpleIcon::SimpleIcon(const std::wstring& name, const std::wstring& filename, diff --git a/Minecraft.Client/UI/SimpleIcon.h b/Minecraft.Client/net/minecraft/client/renderer/texture/SimpleIcon.h similarity index 75% rename from Minecraft.Client/UI/SimpleIcon.h rename to Minecraft.Client/net/minecraft/client/renderer/texture/SimpleIcon.h index a01014cb7..e0114bf50 100644 --- a/Minecraft.Client/UI/SimpleIcon.h +++ b/Minecraft.Client/net/minecraft/client/renderer/texture/SimpleIcon.h @@ -1,6 +1,6 @@ #pragma once -#include "../Platform/stdafx.h" -#include "../Textures/Stitching/StitchedTexture.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "StitchedTexture.h" // 4J Added this class to store the uv data that we have pre-calculated and // loaded from a file diff --git a/Minecraft.Client/Textures/Stitching/StitchSlot.cpp b/Minecraft.Client/net/minecraft/client/renderer/texture/StitchSlot.cpp similarity index 96% rename from Minecraft.Client/Textures/Stitching/StitchSlot.cpp rename to Minecraft.Client/net/minecraft/client/renderer/texture/StitchSlot.cpp index 2a98bd466..44c868afa 100644 --- a/Minecraft.Client/Textures/Stitching/StitchSlot.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/texture/StitchSlot.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../TextureHolder.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "TextureHolder.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #include "StitchSlot.h" StitchSlot::StitchSlot(int originX, int originY, int width, int height) diff --git a/Minecraft.Client/Textures/Stitching/StitchSlot.h b/Minecraft.Client/net/minecraft/client/renderer/texture/StitchSlot.h similarity index 100% rename from Minecraft.Client/Textures/Stitching/StitchSlot.h rename to Minecraft.Client/net/minecraft/client/renderer/texture/StitchSlot.h diff --git a/Minecraft.Client/Textures/Stitching/StitchedTexture.cpp b/Minecraft.Client/net/minecraft/client/renderer/texture/StitchedTexture.cpp similarity index 97% rename from Minecraft.Client/Textures/Stitching/StitchedTexture.cpp rename to Minecraft.Client/net/minecraft/client/renderer/texture/StitchedTexture.cpp index a91cc8c71..d834a34b7 100644 --- a/Minecraft.Client/Textures/Stitching/StitchedTexture.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/texture/StitchedTexture.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../Texture.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" -#include "../ClockTexture.h" -#include "../CompassTexture.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "Texture.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "custom/ClockTexture.h" +#include "custom/CompassTexture.h" #include "StitchedTexture.h" -#include "../TextureManager.h" +#include "TextureManager.h" StitchedTexture* StitchedTexture::create(const std::wstring& name) { // TODO: Generalize? diff --git a/Minecraft.Client/Textures/Stitching/StitchedTexture.h b/Minecraft.Client/net/minecraft/client/renderer/texture/StitchedTexture.h similarity index 96% rename from Minecraft.Client/Textures/Stitching/StitchedTexture.h rename to Minecraft.Client/net/minecraft/client/renderer/texture/StitchedTexture.h index 1f90e43ff..eb02fe8a0 100644 --- a/Minecraft.Client/Textures/Stitching/StitchedTexture.h +++ b/Minecraft.Client/net/minecraft/client/renderer/texture/StitchedTexture.h @@ -1,6 +1,6 @@ #pragma once -#include "../../../Minecraft.World/Util/Icon.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/Icon.h" class Texture; class StitchedTexture : public Icon { diff --git a/Minecraft.Client/Textures/Stitching/Stitcher.cpp b/Minecraft.Client/net/minecraft/client/renderer/texture/Stitcher.cpp similarity index 98% rename from Minecraft.Client/Textures/Stitching/Stitcher.cpp rename to Minecraft.Client/net/minecraft/client/renderer/texture/Stitcher.cpp index 611cd37dd..3e20d5e6e 100644 --- a/Minecraft.Client/Textures/Stitching/Stitcher.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/texture/Stitcher.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "StitchSlot.h" -#include "../Texture.h" -#include "../TextureHolder.h" -#include "../TextureManager.h" +#include "Texture.h" +#include "TextureHolder.h" +#include "TextureManager.h" #include "StitchedTexture.h" #include "Stitcher.h" diff --git a/Minecraft.Client/Textures/Stitching/Stitcher.h b/Minecraft.Client/net/minecraft/client/renderer/texture/Stitcher.h similarity index 98% rename from Minecraft.Client/Textures/Stitching/Stitcher.h rename to Minecraft.Client/net/minecraft/client/renderer/texture/Stitcher.h index ca5c7846a..bb7aebb14 100644 --- a/Minecraft.Client/Textures/Stitching/Stitcher.h +++ b/Minecraft.Client/net/minecraft/client/renderer/texture/Stitcher.h @@ -2,7 +2,7 @@ class StitchSlot; class Texture; -#include "../TextureHolder.h" +#include "TextureHolder.h" class Stitcher { public: diff --git a/Minecraft.Client/Textures/Texture.cpp b/Minecraft.Client/net/minecraft/client/renderer/texture/Texture.cpp similarity index 99% rename from Minecraft.Client/Textures/Texture.cpp rename to Minecraft.Client/net/minecraft/client/renderer/texture/Texture.cpp index 2ec68febc..d83dd2667 100644 --- a/Minecraft.Client/Textures/Texture.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/texture/Texture.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../../Minecraft.World/IO/Streams/ByteBuffer.h" -#include "../UI/Rect2i.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/ConsoleJavaLibs/ByteBuffer.h" +#include "../Rect2i.h" #include "TextureManager.h" #include "Texture.h" diff --git a/Minecraft.Client/Textures/Texture.h b/Minecraft.Client/net/minecraft/client/renderer/texture/Texture.h similarity index 100% rename from Minecraft.Client/Textures/Texture.h rename to Minecraft.Client/net/minecraft/client/renderer/texture/Texture.h diff --git a/Minecraft.Client/Textures/TextureAtlas.cpp b/Minecraft.Client/net/minecraft/client/renderer/texture/TextureAtlas.cpp similarity index 62% rename from Minecraft.Client/Textures/TextureAtlas.cpp rename to Minecraft.Client/net/minecraft/client/renderer/texture/TextureAtlas.cpp index cfdc7b9bb..09ef5c6ae 100644 --- a/Minecraft.Client/Textures/TextureAtlas.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/texture/TextureAtlas.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "TextureAtlas.h" -#include "ResourceLocation.h" +#include "../../resources/ResourceLocation.h" ResourceLocation TextureAtlas::LOCATION_BLOCKS = ResourceLocation(TN_TERRAIN); ResourceLocation TextureAtlas::LOCATION_ITEMS = ResourceLocation(TN_GUI_ITEMS); \ No newline at end of file diff --git a/Minecraft.Client/Textures/TextureAtlas.h b/Minecraft.Client/net/minecraft/client/renderer/texture/TextureAtlas.h similarity index 100% rename from Minecraft.Client/Textures/TextureAtlas.h rename to Minecraft.Client/net/minecraft/client/renderer/texture/TextureAtlas.h diff --git a/Minecraft.Client/Textures/TextureHolder.cpp b/Minecraft.Client/net/minecraft/client/renderer/texture/TextureHolder.cpp similarity index 92% rename from Minecraft.Client/Textures/TextureHolder.cpp rename to Minecraft.Client/net/minecraft/client/renderer/texture/TextureHolder.cpp index 3c29330c6..5dfc3c081 100644 --- a/Minecraft.Client/Textures/TextureHolder.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/texture/TextureHolder.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "Stitching/Stitcher.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "Stitcher.h" #include "Texture.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #include "TextureHolder.h" TextureHolder::TextureHolder(Texture* texture) { diff --git a/Minecraft.Client/Textures/TextureHolder.h b/Minecraft.Client/net/minecraft/client/renderer/texture/TextureHolder.h similarity index 100% rename from Minecraft.Client/Textures/TextureHolder.h rename to Minecraft.Client/net/minecraft/client/renderer/texture/TextureHolder.h diff --git a/Minecraft.Client/Textures/TextureManager.cpp b/Minecraft.Client/net/minecraft/client/renderer/texture/TextureManager.cpp similarity index 96% rename from Minecraft.Client/Textures/TextureManager.cpp rename to Minecraft.Client/net/minecraft/client/renderer/texture/TextureManager.cpp index ac92dc81c..f84a95e40 100644 --- a/Minecraft.Client/Textures/TextureManager.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/texture/TextureManager.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "Stitching/Stitcher.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "Stitcher.h" #include "Texture.h" -#include "Packs/TexturePack.h" -#include "Packs/TexturePackRepository.h" -#include "../Minecraft.h" +#include "../../skins/TexturePack.h" +#include "../../skins/TexturePackRepository.h" +#include "../../Minecraft.h" #include "TextureManager.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" TextureManager* TextureManager::instance = nullptr; diff --git a/Minecraft.Client/Textures/TextureManager.h b/Minecraft.Client/net/minecraft/client/renderer/texture/TextureManager.h similarity index 100% rename from Minecraft.Client/Textures/TextureManager.h rename to Minecraft.Client/net/minecraft/client/renderer/texture/TextureManager.h diff --git a/Minecraft.Client/Textures/Stitching/TextureMap.cpp b/Minecraft.Client/net/minecraft/client/renderer/texture/TextureMap.cpp similarity index 93% rename from Minecraft.Client/Textures/Stitching/TextureMap.cpp rename to Minecraft.Client/net/minecraft/client/renderer/texture/TextureMap.cpp index 20a636913..dd4908d1d 100644 --- a/Minecraft.Client/Textures/Stitching/TextureMap.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/texture/TextureMap.cpp @@ -1,18 +1,18 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.item.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" #include "../../Minecraft.h" -#include "../../Rendering/LevelRenderer.h" -#include "../../Rendering/EntityRenderers/EntityRenderDispatcher.h" +#include "../LevelRenderer.h" +#include "../entity/EntityRenderDispatcher.h" #include "Stitcher.h" #include "StitchSlot.h" #include "StitchedTexture.h" -#include "../Texture.h" -#include "../TextureHolder.h" -#include "../TextureManager.h" -#include "../Packs/TexturePack.h" -#include "../Packs/TexturePackRepository.h" +#include "Texture.h" +#include "TextureHolder.h" +#include "TextureManager.h" +#include "../../skins/TexturePack.h" +#include "../../skins/TexturePackRepository.h" #include "TextureMap.h" const std::wstring TextureMap::NAME_MISSING_TEXTURE = L"missingno"; diff --git a/Minecraft.Client/Textures/Stitching/TextureMap.h b/Minecraft.Client/net/minecraft/client/renderer/texture/TextureMap.h similarity index 94% rename from Minecraft.Client/Textures/Stitching/TextureMap.h rename to Minecraft.Client/net/minecraft/client/renderer/texture/TextureMap.h index d139b1e4e..da2a66b3c 100644 --- a/Minecraft.Client/Textures/Stitching/TextureMap.h +++ b/Minecraft.Client/net/minecraft/client/renderer/texture/TextureMap.h @@ -1,6 +1,6 @@ #pragma once -#include "../../../Minecraft.World/Util/IconRegister.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/IconRegister.h" class StitchedTexture; class Texture; diff --git a/Minecraft.Client/Textures/ClockTexture.cpp b/Minecraft.Client/net/minecraft/client/renderer/texture/custom/ClockTexture.cpp similarity index 84% rename from Minecraft.Client/Textures/ClockTexture.cpp rename to Minecraft.Client/net/minecraft/client/renderer/texture/custom/ClockTexture.cpp index adecbd545..5a9560e0b 100644 --- a/Minecraft.Client/Textures/ClockTexture.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/texture/custom/ClockTexture.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Minecraft.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.World/Util/JavaMath.h" -#include "Texture.h" +#include "../../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../Minecraft.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../Texture.h" #include "ClockTexture.h" ClockTexture::ClockTexture() : StitchedTexture(L"clock", L"clock") { diff --git a/Minecraft.Client/Textures/ClockTexture.h b/Minecraft.Client/net/minecraft/client/renderer/texture/custom/ClockTexture.h similarity index 92% rename from Minecraft.Client/Textures/ClockTexture.h rename to Minecraft.Client/net/minecraft/client/renderer/texture/custom/ClockTexture.h index fc745bed7..9ec172d93 100644 --- a/Minecraft.Client/Textures/ClockTexture.h +++ b/Minecraft.Client/net/minecraft/client/renderer/texture/custom/ClockTexture.h @@ -1,5 +1,5 @@ #pragma once -#include "Stitching/StitchedTexture.h" +#include "../StitchedTexture.h" class ClockTexture : public StitchedTexture { private: diff --git a/Minecraft.Client/Textures/CompassTexture.cpp b/Minecraft.Client/net/minecraft/client/renderer/texture/custom/CompassTexture.cpp similarity index 87% rename from Minecraft.Client/Textures/CompassTexture.cpp rename to Minecraft.Client/net/minecraft/client/renderer/texture/custom/CompassTexture.cpp index 857ceeeb5..23c952ae2 100644 --- a/Minecraft.Client/Textures/CompassTexture.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/texture/custom/CompassTexture.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Minecraft.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../Player/MultiPlayerLocalPlayer.h" -#include "../../Minecraft.World/Util/JavaMath.h" -#include "Texture.h" +#include "../../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../Minecraft.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../Texture.h" #include "CompassTexture.h" CompassTexture* CompassTexture::instance = nullptr; diff --git a/Minecraft.Client/Textures/CompassTexture.h b/Minecraft.Client/net/minecraft/client/renderer/texture/custom/CompassTexture.h similarity index 94% rename from Minecraft.Client/Textures/CompassTexture.h rename to Minecraft.Client/net/minecraft/client/renderer/texture/custom/CompassTexture.h index 50121d7db..cdad3280f 100644 --- a/Minecraft.Client/Textures/CompassTexture.h +++ b/Minecraft.Client/net/minecraft/client/renderer/texture/custom/CompassTexture.h @@ -1,5 +1,5 @@ #pragma once -#include "Stitching/StitchedTexture.h" +#include "../StitchedTexture.h" class CompassTexture : public StitchedTexture { private: diff --git a/Minecraft.Client/Rendering/EntityRenderers/BeaconRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/tileentity/BeaconRenderer.cpp similarity index 94% rename from Minecraft.Client/Rendering/EntityRenderers/BeaconRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/BeaconRenderer.cpp index 017dee765..8bc2ca8df 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/BeaconRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/tileentity/BeaconRenderer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" #include "BeaconRenderer.h" #include "../Tesselator.h" diff --git a/Minecraft.Client/Rendering/EntityRenderers/BeaconRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/tileentity/BeaconRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/BeaconRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/BeaconRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/ChestRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/tileentity/ChestRenderer.cpp similarity index 88% rename from Minecraft.Client/Rendering/EntityRenderers/ChestRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/ChestRenderer.cpp index 8d33aa0a2..5fd0e3f08 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/ChestRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/tileentity/ChestRenderer.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "ChestRenderer.h" -#include "../Models/ChestModel.h" -#include "../Models/LargeChestModel.h" -#include "../Models/ModelPart.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Level/Calendar.h" +#include "../../model/ChestModel.h" +#include "../../model/LargeChestModel.h" +#include "../../model/geom/ModelPart.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/Calendar.h" ResourceLocation ChestRenderer::CHEST_LARGE_TRAP_LOCATION = ResourceLocation(TN_TILE_LARGE_TRAP_CHEST); diff --git a/Minecraft.Client/Rendering/EntityRenderers/ChestRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/tileentity/ChestRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/ChestRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/ChestRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/EnchantTableRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/tileentity/EnchantTableRenderer.cpp similarity index 85% rename from Minecraft.Client/Rendering/EntityRenderers/EnchantTableRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/EnchantTableRenderer.cpp index f215d186d..60c107a4a 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/EnchantTableRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/tileentity/EnchantTableRenderer.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../Models/BookModel.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../../Minecraft.World/Util/Mth.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../model/BookModel.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../Minecraft.World/net/minecraft/util/Mth.h" #include "EnchantTableRenderer.h" ResourceLocation EnchantTableRenderer::BOOK_LOCATION = diff --git a/Minecraft.Client/Rendering/EntityRenderers/EnchantTableRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/tileentity/EnchantTableRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/EnchantTableRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/EnchantTableRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/EnderChestRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/tileentity/EnderChestRenderer.cpp similarity index 86% rename from Minecraft.Client/Rendering/EntityRenderers/EnderChestRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/EnderChestRenderer.cpp index d27799560..4462bf493 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/EnderChestRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/tileentity/EnderChestRenderer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../Models/ModelPart.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../model/geom/ModelPart.h" #include "EnderChestRenderer.h" ResourceLocation EnderChestRenderer::ENDER_CHEST_LOCATION = diff --git a/Minecraft.Client/Rendering/EntityRenderers/EnderChestRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/tileentity/EnderChestRenderer.h similarity index 91% rename from Minecraft.Client/Rendering/EntityRenderers/EnderChestRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/EnderChestRenderer.h index afa310b3a..46ee5aa62 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/EnderChestRenderer.h +++ b/Minecraft.Client/net/minecraft/client/renderer/tileentity/EnderChestRenderer.h @@ -1,6 +1,6 @@ #pragma once #include "TileEntityRenderer.h" -#include "../Models/ChestModel.h" +#include "../../model/ChestModel.h" class EnderChestRenderer : public TileEntityRenderer { private: diff --git a/Minecraft.Client/Rendering/EntityRenderers/MobSpawnerRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/tileentity/MobSpawnerRenderer.cpp similarity index 79% rename from Minecraft.Client/Rendering/EntityRenderers/MobSpawnerRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/MobSpawnerRenderer.cpp index 6207ee94b..e98d1f49a 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/MobSpawnerRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/tileentity/MobSpawnerRenderer.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "MobSpawnerRenderer.h" #include "TileEntityRenderDispatcher.h" -#include "EntityRenderDispatcher.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.h" +#include "../entity/EntityRenderDispatcher.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" void MobSpawnerRenderer::render(std::shared_ptr _spawner, double x, double y, double z, float a, bool setColor, diff --git a/Minecraft.Client/Rendering/EntityRenderers/MobSpawnerRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/tileentity/MobSpawnerRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/MobSpawnerRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/MobSpawnerRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/PistonPieceRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/tileentity/PistonPieceRenderer.cpp similarity index 87% rename from Minecraft.Client/Rendering/EntityRenderers/PistonPieceRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/PistonPieceRenderer.cpp index 903091602..23e79a88c 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/PistonPieceRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/tileentity/PistonPieceRenderer.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "PistonPieceRenderer.h" -#include "../Lighting.h" +#include "../../Lighting.h" #include "../Tesselator.h" -#include "../../Textures/TextureAtlas.h" -#include "TileRenderer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Blocks/TileEntities/PistonPieceTileEntity.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" +#include "../texture/TextureAtlas.h" +#include "../TileRenderer.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/PistonPieceTileEntity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" ResourceLocation PistonPieceRenderer::SIGN_LOCATION = ResourceLocation(TN_ITEM_SIGN); diff --git a/Minecraft.Client/Rendering/EntityRenderers/PistonPieceRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/tileentity/PistonPieceRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/PistonPieceRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/PistonPieceRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/SignRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/tileentity/SignRenderer.cpp similarity index 87% rename from Minecraft.Client/Rendering/EntityRenderers/SignRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/SignRenderer.cpp index b368f0760..7775e1979 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/SignRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/tileentity/SignRenderer.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "SignRenderer.h" -#include "../Models/SignModel.h" -#include "../Models/ModelPart.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.World/Entities/Entity.h" -#include "../../../Minecraft.World/Level/Level.h" +#include "../../model/SignModel.h" +#include "../../model/geom/ModelPart.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/Entity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/Level.h" ResourceLocation SignRenderer::SIGN_LOCATION = ResourceLocation(TN_ITEM_SIGN); diff --git a/Minecraft.Client/Rendering/EntityRenderers/SignRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/tileentity/SignRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/SignRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/SignRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/SkullTileRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/tileentity/SkullTileRenderer.cpp similarity index 89% rename from Minecraft.Client/Rendering/EntityRenderers/SkullTileRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/SkullTileRenderer.cpp index 22fc1763b..c28c6f890 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/SkullTileRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/tileentity/SkullTileRenderer.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "SkullTileRenderer.h" -#include "../Models/SkeletonHeadModel.h" -#include "PlayerRenderer.h" -#include "../../../Minecraft.World/Blocks/TileEntities/SkullTileEntity.h" -#include "../../../Minecraft.World/Headers/net.minecraft.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" +#include "../../model/SkeletonHeadModel.h" +#include "../entity/PlayerRenderer.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/SkullTileEntity.h" +#include "../../../../../../Minecraft.World/net/minecraft/net.minecraft.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" SkullTileRenderer* SkullTileRenderer::instance = nullptr; diff --git a/Minecraft.Client/Rendering/EntityRenderers/SkullTileRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/tileentity/SkullTileRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/SkullTileRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/SkullTileRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/TheEndPortalRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/tileentity/TheEndPortalRenderer.cpp similarity index 92% rename from Minecraft.Client/Rendering/EntityRenderers/TheEndPortalRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/TheEndPortalRenderer.cpp index 2a780c229..c867709f8 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/TheEndPortalRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/tileentity/TheEndPortalRenderer.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.World/Util/Random.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" #include "../Tesselator.h" #include "TileEntityRenderDispatcher.h" -#include "../Camera.h" -#include "../../../Minecraft.World/IO/Streams/FloatBuffer.h" +#include "../../Camera.h" +#include "../../../../../../Minecraft.World/ConsoleJavaLibs/FloatBuffer.h" #include "TheEndPortalRenderer.h" ResourceLocation TheEndPortalRenderer::END_SKY_LOCATION = diff --git a/Minecraft.Client/Rendering/EntityRenderers/TheEndPortalRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/tileentity/TheEndPortalRenderer.h similarity index 100% rename from Minecraft.Client/Rendering/EntityRenderers/TheEndPortalRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/TheEndPortalRenderer.h diff --git a/Minecraft.Client/Rendering/EntityRenderers/TileEntityRenderDispatcher.cpp b/Minecraft.Client/net/minecraft/client/renderer/tileentity/TileEntityRenderDispatcher.cpp similarity index 91% rename from Minecraft.Client/Rendering/EntityRenderers/TileEntityRenderDispatcher.cpp rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/TileEntityRenderDispatcher.cpp index f3cec5af6..7ef77d731 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/TileEntityRenderDispatcher.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/tileentity/TileEntityRenderDispatcher.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "TileEntityRenderDispatcher.h" #include "TileEntityRenderer.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.World/Blocks/TileEntities/PistonPieceTileEntity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/PistonPieceTileEntity.h" #include "SignRenderer.h" #include "MobSpawnerRenderer.h" #include "PistonPieceRenderer.h" diff --git a/Minecraft.Client/Rendering/EntityRenderers/TileEntityRenderDispatcher.h b/Minecraft.Client/net/minecraft/client/renderer/tileentity/TileEntityRenderDispatcher.h similarity index 93% rename from Minecraft.Client/Rendering/EntityRenderers/TileEntityRenderDispatcher.h rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/TileEntityRenderDispatcher.h index b748eb846..6ca5ad0f1 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/TileEntityRenderDispatcher.h +++ b/Minecraft.Client/net/minecraft/client/renderer/tileentity/TileEntityRenderDispatcher.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Textures/Textures.h" -#include "../../../Minecraft.World/Util/JavaIntHash.h" +#include "../Textures.h" +#include "../../../../../../Minecraft.World/ConsoleJavaLibs/JavaIntHash.h" class Mob; class Level; class TileEntityRenderer; diff --git a/Minecraft.Client/Rendering/EntityRenderers/TileEntityRenderer.cpp b/Minecraft.Client/net/minecraft/client/renderer/tileentity/TileEntityRenderer.cpp similarity index 93% rename from Minecraft.Client/Rendering/EntityRenderers/TileEntityRenderer.cpp rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/TileEntityRenderer.cpp index 97d660a73..60e2357cd 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/TileEntityRenderer.cpp +++ b/Minecraft.Client/net/minecraft/client/renderer/tileentity/TileEntityRenderer.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Minecraft.World/Header Files/stdafx.h" #include "TileEntityRenderer.h" #include "TileEntityRenderDispatcher.h" diff --git a/Minecraft.Client/Rendering/EntityRenderers/TileEntityRenderer.h b/Minecraft.Client/net/minecraft/client/renderer/tileentity/TileEntityRenderer.h similarity index 91% rename from Minecraft.Client/Rendering/EntityRenderers/TileEntityRenderer.h rename to Minecraft.Client/net/minecraft/client/renderer/tileentity/TileEntityRenderer.h index a3656ebbf..d5436e945 100644 --- a/Minecraft.Client/Rendering/EntityRenderers/TileEntityRenderer.h +++ b/Minecraft.Client/net/minecraft/client/renderer/tileentity/TileEntityRenderer.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Textures/Textures.h" -#include "../../Textures/ResourceLocation.h" +#include "../Textures.h" +#include "../../resources/ResourceLocation.h" class TileEntityRenderDispatcher; class TileEntity; diff --git a/Minecraft.Client/Textures/ResourceLocation.h b/Minecraft.Client/net/minecraft/client/resources/ResourceLocation.h similarity index 97% rename from Minecraft.Client/Textures/ResourceLocation.h rename to Minecraft.Client/net/minecraft/client/resources/ResourceLocation.h index 9cf96e6de..975a7368d 100644 --- a/Minecraft.Client/Textures/ResourceLocation.h +++ b/Minecraft.Client/net/minecraft/client/resources/ResourceLocation.h @@ -1,5 +1,5 @@ #pragma once -#include "Textures.h" +#include "../renderer/Textures.h" typedef arrayWithLength<_TEXTURE_NAME> textureNameArray; class ResourceLocation { diff --git a/Minecraft.Client/Textures/Packs/AbstractTexturePack.cpp b/Minecraft.Client/net/minecraft/client/skins/AbstractTexturePack.cpp similarity index 96% rename from Minecraft.Client/Textures/Packs/AbstractTexturePack.cpp rename to Minecraft.Client/net/minecraft/client/skins/AbstractTexturePack.cpp index 8d4051fdd..c408c85f0 100644 --- a/Minecraft.Client/Textures/Packs/AbstractTexturePack.cpp +++ b/Minecraft.Client/net/minecraft/client/skins/AbstractTexturePack.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../Textures.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../renderer/Textures.h" #include "AbstractTexturePack.h" -#include "../../../Minecraft.World/IO/Streams/InputOutputStream.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #include diff --git a/Minecraft.Client/Textures/Packs/AbstractTexturePack.h b/Minecraft.Client/net/minecraft/client/skins/AbstractTexturePack.h similarity index 100% rename from Minecraft.Client/Textures/Packs/AbstractTexturePack.h rename to Minecraft.Client/net/minecraft/client/skins/AbstractTexturePack.h diff --git a/Minecraft.Client/Textures/Packs/DLCTexturePack.cpp b/Minecraft.Client/net/minecraft/client/skins/DLCTexturePack.cpp similarity index 94% rename from Minecraft.Client/Textures/Packs/DLCTexturePack.cpp rename to Minecraft.Client/net/minecraft/client/skins/DLCTexturePack.cpp index 0feb4ec7d..a2112f2b5 100644 --- a/Minecraft.Client/Textures/Packs/DLCTexturePack.cpp +++ b/Minecraft.Client/net/minecraft/client/skins/DLCTexturePack.cpp @@ -1,23 +1,23 @@ -#include "../../Platform/stdafx.h" -#include "../../Platform/Common/DLC/DLCGameRulesFile.h" -#include "../../Platform/Common/DLC/DLCGameRulesHeader.h" -#include "../../Platform/Common/DLC/DLCGameRules.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../../../Common/Source Files/DLC/DLCGameRulesFile.h" +#include "../../../../Common/Source Files/DLC/DLCGameRulesHeader.h" +#include "../../../../Common/Source Files/DLC/DLCGameRules.h" #include "DLCTexturePack.h" -#include "../../Platform/Common/DLC/DLCColourTableFile.h" -#include "../../Platform/Common/DLC/DLCUIDataFile.h" -#include "../../Platform/Common/DLC/DLCTextureFile.h" -#include "../../Platform/Common/DLC/DLCLocalisationFile.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" -#include "../../../Minecraft.World/Util/PortableFileIO.h" -#include "../../Utils/StringTable.h" -#include "../../Platform/Common/DLC/DLCAudioFile.h" +#include "../../../../Common/Source Files/DLC/DLCColourTableFile.h" +#include "../../../../Common/Source Files/DLC/DLCUIDataFile.h" +#include "../../../../Common/Source Files/DLC/DLCTextureFile.h" +#include "../../../../Common/Source Files/DLC/DLCLocalisationFile.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../Minecraft.World/Header Files/PortableFileIO.h" +#include "../../../../Common/Source Files/Localisation/StringTable.h" +#include "../../../../Common/Source Files/DLC/DLCAudioFile.h" #include #include #if defined(_WINDOWS64) -#include "../../Platform/Common/XML/ATGXmlParser.h" -#include "../../Platform/Common/XML/xmlFilesCallback.h" +#include "../../../../Windows64/XML/ATGXmlParser.h" +#include "../../../../Windows64/XML/xmlFilesCallback.h" #endif namespace { diff --git a/Minecraft.Client/Textures/Packs/DLCTexturePack.h b/Minecraft.Client/net/minecraft/client/skins/DLCTexturePack.h similarity index 100% rename from Minecraft.Client/Textures/Packs/DLCTexturePack.h rename to Minecraft.Client/net/minecraft/client/skins/DLCTexturePack.h diff --git a/Minecraft.Client/Textures/Packs/DefaultTexturePack.cpp b/Minecraft.Client/net/minecraft/client/skins/DefaultTexturePack.cpp similarity index 91% rename from Minecraft.Client/Textures/Packs/DefaultTexturePack.cpp rename to Minecraft.Client/net/minecraft/client/skins/DefaultTexturePack.cpp index 2774d398a..d460fcd42 100644 --- a/Minecraft.Client/Textures/Packs/DefaultTexturePack.cpp +++ b/Minecraft.Client/net/minecraft/client/skins/DefaultTexturePack.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "DefaultTexturePack.h" -#include "../Textures.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" +#include "../renderer/Textures.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" DefaultTexturePack::DefaultTexturePack() : AbstractTexturePack(0, nullptr, L"Minecraft", nullptr) { diff --git a/Minecraft.Client/Textures/Packs/DefaultTexturePack.h b/Minecraft.Client/net/minecraft/client/skins/DefaultTexturePack.h similarity index 100% rename from Minecraft.Client/Textures/Packs/DefaultTexturePack.h rename to Minecraft.Client/net/minecraft/client/skins/DefaultTexturePack.h diff --git a/Minecraft.Client/Textures/Packs/FileTexturePack.cpp b/Minecraft.Client/net/minecraft/client/skins/FileTexturePack.cpp similarity index 92% rename from Minecraft.Client/Textures/Packs/FileTexturePack.cpp rename to Minecraft.Client/net/minecraft/client/skins/FileTexturePack.cpp index a7a48daa3..472ea641f 100644 --- a/Minecraft.Client/Textures/Packs/FileTexturePack.cpp +++ b/Minecraft.Client/net/minecraft/client/skins/FileTexturePack.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "FileTexturePack.h" FileTexturePack::FileTexturePack(std::uint32_t id, File* file, diff --git a/Minecraft.Client/Textures/Packs/FileTexturePack.h b/Minecraft.Client/net/minecraft/client/skins/FileTexturePack.h similarity index 100% rename from Minecraft.Client/Textures/Packs/FileTexturePack.h rename to Minecraft.Client/net/minecraft/client/skins/FileTexturePack.h diff --git a/Minecraft.Client/Textures/Packs/FolderTexturePack.cpp b/Minecraft.Client/net/minecraft/client/skins/FolderTexturePack.cpp similarity index 96% rename from Minecraft.Client/Textures/Packs/FolderTexturePack.cpp rename to Minecraft.Client/net/minecraft/client/skins/FolderTexturePack.cpp index f2b466b34..2c6235c35 100644 --- a/Minecraft.Client/Textures/Packs/FolderTexturePack.cpp +++ b/Minecraft.Client/net/minecraft/client/skins/FolderTexturePack.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "FolderTexturePack.h" FolderTexturePack::FolderTexturePack(std::uint32_t id, const std::wstring& name, diff --git a/Minecraft.Client/Textures/Packs/FolderTexturePack.h b/Minecraft.Client/net/minecraft/client/skins/FolderTexturePack.h similarity index 100% rename from Minecraft.Client/Textures/Packs/FolderTexturePack.h rename to Minecraft.Client/net/minecraft/client/skins/FolderTexturePack.h diff --git a/Minecraft.Client/Textures/Packs/TexturePack.cpp b/Minecraft.Client/net/minecraft/client/skins/TexturePack.cpp similarity index 86% rename from Minecraft.Client/Textures/Packs/TexturePack.cpp rename to Minecraft.Client/net/minecraft/client/skins/TexturePack.cpp index 1cbe8e450..f4bc55688 100644 --- a/Minecraft.Client/Textures/Packs/TexturePack.cpp +++ b/Minecraft.Client/net/minecraft/client/skins/TexturePack.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "TexturePack.h" std::wstring TexturePack::getPath( diff --git a/Minecraft.Client/Textures/Packs/TexturePack.h b/Minecraft.Client/net/minecraft/client/skins/TexturePack.h similarity index 98% rename from Minecraft.Client/Textures/Packs/TexturePack.h rename to Minecraft.Client/net/minecraft/client/skins/TexturePack.h index 4c2de6925..052b7edff 100644 --- a/Minecraft.Client/Textures/Packs/TexturePack.h +++ b/Minecraft.Client/net/minecraft/client/skins/TexturePack.h @@ -2,7 +2,7 @@ #include -#include "../../Platform/Common/App_enums.h" +#include "../../../../Common/App_enums.h" class InputStream; class Minecraft; diff --git a/Minecraft.Client/Textures/Packs/TexturePackRepository.cpp b/Minecraft.Client/net/minecraft/client/skins/TexturePackRepository.cpp similarity index 97% rename from Minecraft.Client/Textures/Packs/TexturePackRepository.cpp rename to Minecraft.Client/net/minecraft/client/skins/TexturePackRepository.cpp index 697eb5356..130d4402c 100644 --- a/Minecraft.Client/Textures/Packs/TexturePackRepository.cpp +++ b/Minecraft.Client/net/minecraft/client/skins/TexturePackRepository.cpp @@ -1,13 +1,13 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "TexturePackRepository.h" #include "DefaultTexturePack.h" #include "FileTexturePack.h" #include "FolderTexturePack.h" #include "DLCTexturePack.h" -#include "../../GameState/Options.h" -#include "../../../Minecraft.World/IO/Files/File.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" -#include "../../Rendering/Minimap.h" +#include "../Options.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/File.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../gui/Minimap.h" TexturePack* TexturePackRepository::DEFAULT_TEXTURE_PACK = nullptr; diff --git a/Minecraft.Client/Textures/Packs/TexturePackRepository.h b/Minecraft.Client/net/minecraft/client/skins/TexturePackRepository.h similarity index 100% rename from Minecraft.Client/Textures/Packs/TexturePackRepository.h rename to Minecraft.Client/net/minecraft/client/skins/TexturePackRepository.h diff --git a/Minecraft.Client/UI/Screens/TitleScreen.cpp b/Minecraft.Client/net/minecraft/client/title/TitleScreen.cpp similarity index 95% rename from Minecraft.Client/UI/Screens/TitleScreen.cpp rename to Minecraft.Client/net/minecraft/client/title/TitleScreen.cpp index 5df54e275..29e8855a0 100644 --- a/Minecraft.Client/UI/Screens/TitleScreen.cpp +++ b/Minecraft.Client/net/minecraft/client/title/TitleScreen.cpp @@ -1,16 +1,16 @@ -#include "../../Platform/stdafx.h" -#include "../Button.h" -#include "OptionsScreen.h" -#include "SelectWorldScreen.h" -#include "JoinMultiplayerScreen.h" -#include "../../Rendering/Tesselator.h" -#include "../../Textures/Textures.h" -#include "../../GameState/Options.h" -#include "../../../Minecraft.World/Util/StringHelpers.h" -#include "../../../Minecraft.World/IO/Streams/InputOutputStream.h" -#include "../../../Minecraft.World/Headers/net.minecraft.locale.h" -#include "../../../Minecraft.World/Platform/System.h" -#include "../../../Minecraft.World/Util/Random.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../gui/Button.h" +#include "../gui/OptionsScreen.h" +#include "../gui/SelectWorldScreen.h" +#include "../gui/JoinMultiplayerScreen.h" +#include "../renderer/Tesselator.h" +#include "../renderer/Textures.h" +#include "../Options.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/System.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" #include #include "TitleScreen.h" diff --git a/Minecraft.Client/UI/Screens/TitleScreen.h b/Minecraft.Client/net/minecraft/client/title/TitleScreen.h similarity index 97% rename from Minecraft.Client/UI/Screens/TitleScreen.h rename to Minecraft.Client/net/minecraft/client/title/TitleScreen.h index 5df5d4984..14b643c3f 100644 --- a/Minecraft.Client/UI/Screens/TitleScreen.h +++ b/Minecraft.Client/net/minecraft/client/title/TitleScreen.h @@ -1,5 +1,5 @@ #pragma once -#include "../Screen.h" +#include "../gui/Screen.h" class Random; class Button; diff --git a/Minecraft.Client/Input/ConsoleInput.cpp b/Minecraft.Client/net/minecraft/server/ConsoleInput.cpp similarity index 75% rename from Minecraft.Client/Input/ConsoleInput.cpp rename to Minecraft.Client/net/minecraft/server/ConsoleInput.cpp index 66aebd432..78de39d6e 100644 --- a/Minecraft.Client/Input/ConsoleInput.cpp +++ b/Minecraft.Client/net/minecraft/server/ConsoleInput.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "ConsoleInput.h" ConsoleInput::ConsoleInput(const std::wstring& msg, diff --git a/Minecraft.Client/Input/ConsoleInput.h b/Minecraft.Client/net/minecraft/server/ConsoleInput.h similarity index 100% rename from Minecraft.Client/Input/ConsoleInput.h rename to Minecraft.Client/net/minecraft/server/ConsoleInput.h diff --git a/Minecraft.Client/Input/ConsoleInputSource.h b/Minecraft.Client/net/minecraft/server/ConsoleInputSource.h similarity index 100% rename from Minecraft.Client/Input/ConsoleInputSource.h rename to Minecraft.Client/net/minecraft/server/ConsoleInputSource.h diff --git a/Minecraft.Client/net/minecraft/server/DispenserBootstrap.cpp b/Minecraft.Client/net/minecraft/server/DispenserBootstrap.cpp new file mode 100644 index 000000000..c933f4cb5 --- /dev/null +++ b/Minecraft.Client/net/minecraft/server/DispenserBootstrap.cpp @@ -0,0 +1 @@ +#include "../../../../Minecraft.World/Header Files/stdafx.h" \ No newline at end of file diff --git a/Minecraft.Client/GameState/DispenserBootstrap.h b/Minecraft.Client/net/minecraft/server/DispenserBootstrap.h similarity index 83% rename from Minecraft.Client/GameState/DispenserBootstrap.h rename to Minecraft.Client/net/minecraft/server/DispenserBootstrap.h index da22d8244..212d95ab7 100644 --- a/Minecraft.Client/GameState/DispenserBootstrap.h +++ b/Minecraft.Client/net/minecraft/server/DispenserBootstrap.h @@ -1,8 +1,8 @@ #pragma once -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Blocks/DispenserTile.h" -#include "../../Minecraft.World/Headers/net.minecraft.core.h" -#include "../../Minecraft.World/Level/Events/LevelEvent.h" +#include "../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/tile/DispenserTile.h" +#include "../../../../Minecraft.World/net/minecraft/core/net.minecraft.core.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/tile/LevelEvent.h" class DispenserBootstrap { public: diff --git a/Minecraft.Client/MinecraftServer.cpp b/Minecraft.Client/net/minecraft/server/MinecraftServer.cpp similarity index 96% rename from Minecraft.Client/MinecraftServer.cpp rename to Minecraft.Client/net/minecraft/server/MinecraftServer.cpp index de1e9fda2..520455c59 100644 --- a/Minecraft.Client/MinecraftServer.cpp +++ b/Minecraft.Client/net/minecraft/server/MinecraftServer.cpp @@ -1,54 +1,54 @@ -#include "Platform/stdafx.h" -// #include "Minecraft.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" +// #include "../client/Minecraft.h" #include #include #include -#include "Input/ConsoleInput.h" -#include "Level/DerivedServerLevel.h" -#include "GameState/DispenserBootstrap.h" -#include "Player/EntityTracker.h" +#include "ConsoleInput.h" +#include "level/DerivedServerLevel.h" +#include "DispenserBootstrap.h" +#include "level/EntityTracker.h" #include "MinecraftServer.h" -#include "GameState/Options.h" -#include "Network/PlayerList.h" -#include "Network/ServerChunkCache.h" -#include "Network/ServerConnection.h" -#include "Level/ServerLevel.h" -#include "Level/ServerLevelListener.h" -#include "GameState/Settings.h" -#include "../Minecraft.World/Commands/Command.h" -#include "../Minecraft.World/Util/AABB.h" -#include "../Minecraft.World/Util/Vec3.h" -#include "../Minecraft.World/Headers/net.minecraft.network.h" -#include "../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../Minecraft.World/Headers/net.minecraft.world.level.storage.h" -#include "../Minecraft.World/Headers/net.minecraft.world.h" -#include "../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../Minecraft.World/Util/Pos.h" -#include "../Minecraft.World/Platform/System.h" -#include "../Minecraft.World/Util/StringHelpers.h" +#include "../client/Options.h" +#include "PlayerList.h" +#include "level/ServerChunkCache.h" +#include "network/ServerConnection.h" +#include "level/ServerLevel.h" +#include "level/ServerLevelListener.h" +#include "Settings.h" +#include "../../../../Minecraft.World/net/minecraft/commands/Command.h" +#include "../../../../Minecraft.World/net/minecraft/world/phys/AABB.h" +#include "../../../../Minecraft.World/net/minecraft/world/phys/Vec3.h" +#include "../../../../Minecraft.World/net/minecraft/network/net.minecraft.network.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h" +#include "../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../Minecraft.World/net/minecraft/Pos.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/System.h" +#include "../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" #if defined(SPLIT_SAVES) -#include "../Minecraft.World/IO/Files/ConsoleSaveFileSplit.h" +#include "../../../../Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileSplit.h" #endif -#include "../Minecraft.World/IO/Files/ConsoleSaveFileOriginal.h" -#include "../Minecraft.World/Network/Socket.h" -#include "../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "Rendering/EntityRenderers/ProgressRenderer.h" -#include "Player/ServerPlayer.h" -#include "Rendering/GameRenderer.h" -#include "../Minecraft.World/Util/ThreadName.h" -#include "../Minecraft.World/Level/Storage/CompressedTileStorage.h" -#include "../Minecraft.World/Level/Storage/SparseLightStorage.h" -#include "../Minecraft.World/Level/Storage/SparseDataStorage.h" -#include "../Minecraft.World/IO/Streams/Compression.h" -#include "Platform/Common/ShutdownManager.h" -#include "Platform/Common/UI/UIStructs.h" -#include "Network/ServerCommandDispatcher.h" -#include "../Minecraft.World/WorldGen/Biomes/BiomeSource.h" -#include "Network/PlayerChunkMap.h" -#include "Platform/Common/Telemetry/TelemetryManager.h" +#include "../../../../Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileOriginal.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/Socket.h" +#include "../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../client/ProgressRenderer.h" +#include "level/ServerPlayer.h" +#include "../client/renderer/GameRenderer.h" +#include "../../../../Minecraft.World/ConsoleHelpers/ThreadName.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/chunk/CompressedTileStorage.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/chunk/SparseLightStorage.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/chunk/SparseDataStorage.h" +#include "../../../../Minecraft.World/Header Files/compression.h" +#include "../../../Common/ShutdownManager.h" +#include "../../../Common/Source Files/UI/All Platforms/UIStructs.h" +#include "commands/ServerCommandDispatcher.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/biome/BiomeSource.h" +#include "level/PlayerChunkMap.h" +#include "../../../Common/Source Files/Telemetry/TelemetryManager.h" #define DEBUG_SERVER_DONT_SPAWN_MOBS 0 diff --git a/Minecraft.Client/MinecraftServer.h b/Minecraft.Client/net/minecraft/server/MinecraftServer.h similarity index 97% rename from Minecraft.Client/MinecraftServer.h rename to Minecraft.Client/net/minecraft/server/MinecraftServer.h index 606efd0c3..64ba8d978 100644 --- a/Minecraft.Client/MinecraftServer.h +++ b/Minecraft.Client/net/minecraft/server/MinecraftServer.h @@ -2,10 +2,10 @@ #include #include -#include "Input/ConsoleInputSource.h" -#include "../Minecraft.World/Util/ArrayWithLength.h" -#include "../Minecraft.World/Util/SharedConstants.h" -#include "../Minecraft.World/Util/C4JThread.h" +#include "ConsoleInputSource.h" +#include "../../../../Minecraft.World/ConsoleHelpers/ArrayWithLength.h" +#include "../../../../Minecraft.World/net/minecraft/SharedConstants.h" +#include "../../../../Minecraft.World/ConsoleHelpers/C4JThread.h" class ServerConnection; class Settings; diff --git a/Minecraft.Client/Network/PlayerList.cpp b/Minecraft.Client/net/minecraft/server/PlayerList.cpp similarity index 97% rename from Minecraft.Client/Network/PlayerList.cpp rename to Minecraft.Client/net/minecraft/server/PlayerList.cpp index 6ad051886..84600cc25 100644 --- a/Minecraft.Client/Network/PlayerList.cpp +++ b/Minecraft.Client/net/minecraft/server/PlayerList.cpp @@ -1,31 +1,31 @@ -#include "../Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include #include "PlayerList.h" -#include "PlayerChunkMap.h" -#include "../MinecraftServer.h" -#include "../GameState/Settings.h" -#include "../Level/ServerLevel.h" -#include "ServerChunkCache.h" -#include "../Player/ServerPlayer.h" -#include "../Player/ServerPlayerGameMode.h" -#include "ServerConnection.h" -#include "PendingConnection.h" -#include "PlayerConnection.h" -#include "../Player/EntityTracker.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.storage.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../../Minecraft.World/Util/ArrayWithLength.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.packet.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.h" -#include "../../Minecraft.World/Util/Pos.h" -#include "../../Minecraft.World/Util/ProgressListener.h" -#include "../../Minecraft.World/WorldGen/Sources/HellRandomLevelSource.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.phys.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.storage.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.saveddata.h" -#include "../../Minecraft.World/Util/JavaMath.h" -#include "../../Minecraft.World/Level/Storage/EntityIO.h" +#include "level/PlayerChunkMap.h" +#include "MinecraftServer.h" +#include "Settings.h" +#include "level/ServerLevel.h" +#include "level/ServerChunkCache.h" +#include "level/ServerPlayer.h" +#include "level/ServerPlayerGameMode.h" +#include "network/ServerConnection.h" +#include "network/PendingConnection.h" +#include "network/PlayerConnection.h" +#include "level/EntityTracker.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../Minecraft.World/ConsoleHelpers/ArrayWithLength.h" +#include "../../../../Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h" +#include "../../../../Minecraft.World/net/minecraft/network/net.minecraft.network.h" +#include "../../../../Minecraft.World/net/minecraft/Pos.h" +#include "../../../../Minecraft.World/net/minecraft/util/ProgressListener.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/levelgen/HellRandomLevelSource.h" +#include "../../../../Minecraft.World/net/minecraft/world/phys/net.minecraft.world.phys.h" +#include "../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/saveddata/net.minecraft.world.level.saveddata.h" +#include "../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" +#include "../../../../Minecraft.World/net/minecraft/world/entity/EntityIO.h" // 4J - this class is fairly substantially altered as there didn't seem any // point in porting code for banning, whitelisting, ops etc. diff --git a/Minecraft.Client/Network/PlayerList.h b/Minecraft.Client/net/minecraft/server/PlayerList.h similarity index 98% rename from Minecraft.Client/Network/PlayerList.h rename to Minecraft.Client/net/minecraft/server/PlayerList.h index 77371f3cb..12bdfaf93 100644 --- a/Minecraft.Client/Network/PlayerList.h +++ b/Minecraft.Client/net/minecraft/server/PlayerList.h @@ -2,7 +2,7 @@ #include #include #include -#include "../../Minecraft.World/Util/ArrayWithLength.h" +#include "../../../../Minecraft.World/ConsoleHelpers/ArrayWithLength.h" class ServerPlayer; class PlayerChunkMap; diff --git a/Minecraft.Client/Network/ServerInterface.h b/Minecraft.Client/net/minecraft/server/ServerInterface.h similarity index 100% rename from Minecraft.Client/Network/ServerInterface.h rename to Minecraft.Client/net/minecraft/server/ServerInterface.h diff --git a/Minecraft.Client/Network/ServerScoreboard.cpp b/Minecraft.Client/net/minecraft/server/ServerScoreboard.cpp similarity index 99% rename from Minecraft.Client/Network/ServerScoreboard.cpp rename to Minecraft.Client/net/minecraft/server/ServerScoreboard.cpp index 5f93e8ae7..4ef07076c 100644 --- a/Minecraft.Client/Network/ServerScoreboard.cpp +++ b/Minecraft.Client/net/minecraft/server/ServerScoreboard.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "ServerScoreboard.h" diff --git a/Minecraft.Client/Network/ServerScoreboard.h b/Minecraft.Client/net/minecraft/server/ServerScoreboard.h similarity index 94% rename from Minecraft.Client/Network/ServerScoreboard.h rename to Minecraft.Client/net/minecraft/server/ServerScoreboard.h index e06bd569b..36f4f34f3 100644 --- a/Minecraft.Client/Network/ServerScoreboard.h +++ b/Minecraft.Client/net/minecraft/server/ServerScoreboard.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Minecraft.World/Scores/Scoreboard.h" +#include "../../../../Minecraft.World/net/minecraft/world/scores/Scoreboard.h" class MinecraftServer; class ScoreboardSaveData; diff --git a/Minecraft.Client/GameState/Settings.cpp b/Minecraft.Client/net/minecraft/server/Settings.cpp similarity index 90% rename from Minecraft.Client/GameState/Settings.cpp rename to Minecraft.Client/net/minecraft/server/Settings.cpp index 658cebd32..ea138826f 100644 --- a/Minecraft.Client/GameState/Settings.cpp +++ b/Minecraft.Client/net/minecraft/server/Settings.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "Settings.h" -#include "../../Minecraft.World/Util/StringHelpers.h" +#include "../../../../Minecraft.World/ConsoleHelpers/StringHelpers.h" // 4J - TODO - serialise/deserialise from file Settings::Settings(File* file) {} diff --git a/Minecraft.Client/GameState/Settings.h b/Minecraft.Client/net/minecraft/server/Settings.h similarity index 100% rename from Minecraft.Client/GameState/Settings.h rename to Minecraft.Client/net/minecraft/server/Settings.h diff --git a/Minecraft.Client/Network/ServerCommandDispatcher.cpp b/Minecraft.Client/net/minecraft/server/commands/ServerCommandDispatcher.cpp similarity index 89% rename from Minecraft.Client/Network/ServerCommandDispatcher.cpp rename to Minecraft.Client/net/minecraft/server/commands/ServerCommandDispatcher.cpp index e427d3222..3cd16f582 100644 --- a/Minecraft.Client/Network/ServerCommandDispatcher.cpp +++ b/Minecraft.Client/net/minecraft/server/commands/ServerCommandDispatcher.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "../MinecraftServer.h" -#include "PlayerList.h" -#include "../Player/ServerPlayer.h" -#include "../../Minecraft.World/Headers/net.minecraft.commands.h" -#include "../../Minecraft.World/Headers/net.minecraft.commands.common.h" -#include "../Commands/TeleportCommand.h" +#include "../PlayerList.h" +#include "../level/ServerPlayer.h" +#include "../../../../../Minecraft.World/net/minecraft/commands/net.minecraft.commands.h" +#include "../../../../../Minecraft.World/net/minecraft/commands/common/net.minecraft.commands.common.h" +#include "TeleportCommand.h" #include "ServerCommandDispatcher.h" ServerCommandDispatcher::ServerCommandDispatcher() { diff --git a/Minecraft.Client/Network/ServerCommandDispatcher.h b/Minecraft.Client/net/minecraft/server/commands/ServerCommandDispatcher.h similarity index 73% rename from Minecraft.Client/Network/ServerCommandDispatcher.h rename to Minecraft.Client/net/minecraft/server/commands/ServerCommandDispatcher.h index bd3906018..1a137593a 100644 --- a/Minecraft.Client/Network/ServerCommandDispatcher.h +++ b/Minecraft.Client/net/minecraft/server/commands/ServerCommandDispatcher.h @@ -1,7 +1,7 @@ #pragma once -#include "../../Minecraft.World/Commands/CommandDispatcher.h" -#include "../../Minecraft.World/Commands/AdminLogCommand.h" +#include "../../../../../Minecraft.World/net/minecraft/commands/CommandDispatcher.h" +#include "../../../../../Minecraft.World/net/minecraft/commands/AdminLogCommand.h" class ServerCommandDispatcher : public CommandDispatcher, public AdminLogCommand { diff --git a/Minecraft.Client/Commands/TeleportCommand.cpp b/Minecraft.Client/net/minecraft/server/commands/TeleportCommand.cpp similarity index 86% rename from Minecraft.Client/Commands/TeleportCommand.cpp rename to Minecraft.Client/net/minecraft/server/commands/TeleportCommand.cpp index 4c6a39236..7493d2098 100644 --- a/Minecraft.Client/Commands/TeleportCommand.cpp +++ b/Minecraft.Client/net/minecraft/server/commands/TeleportCommand.cpp @@ -1,12 +1,12 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "../MinecraftServer.h" -#include "../Network/PlayerList.h" -#include "../Player/ServerPlayer.h" -#include "../Network/PlayerConnection.h" -#include "../../Minecraft.World/Headers/net.minecraft.commands.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.packet.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" +#include "../PlayerList.h" +#include "../level/ServerPlayer.h" +#include "../network/PlayerConnection.h" +#include "../../../../../Minecraft.World/net/minecraft/commands/net.minecraft.commands.h" +#include "../../../../../Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" #include "TeleportCommand.h" EGameCommand TeleportCommand::getId() { return eGameCommand_Teleport; } diff --git a/Minecraft.Client/Commands/TeleportCommand.h b/Minecraft.Client/net/minecraft/server/commands/TeleportCommand.h similarity index 81% rename from Minecraft.Client/Commands/TeleportCommand.h rename to Minecraft.Client/net/minecraft/server/commands/TeleportCommand.h index f42016ab1..3c7cf1ad4 100644 --- a/Minecraft.Client/Commands/TeleportCommand.h +++ b/Minecraft.Client/net/minecraft/server/commands/TeleportCommand.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Minecraft.World/Commands/Command.h" +#include "../../../../../Minecraft.World/net/minecraft/commands/Command.h" class TeleportCommand : public Command { public: diff --git a/Minecraft.Client/GameState/CreativeMode.cpp b/Minecraft.Client/net/minecraft/server/level/CreativeMode.cpp similarity index 81% rename from Minecraft.Client/GameState/CreativeMode.cpp rename to Minecraft.Client/net/minecraft/server/level/CreativeMode.cpp index d36b340f9..7576eaab6 100644 --- a/Minecraft.Client/GameState/CreativeMode.cpp +++ b/Minecraft.Client/net/minecraft/server/level/CreativeMode.cpp @@ -1,12 +1,12 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "CreativeMode.h" -#include "../Player/User.h" -#include "../Player/LocalPlayer.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" +#include "../../client/User.h" +#include "../../client/player/LocalPlayer.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" CreativeMode::CreativeMode(Minecraft* minecraft) : GameMode(minecraft) { destroyDelay = 0; diff --git a/Minecraft.Client/GameState/CreativeMode.h b/Minecraft.Client/net/minecraft/server/level/CreativeMode.h similarity index 100% rename from Minecraft.Client/GameState/CreativeMode.h rename to Minecraft.Client/net/minecraft/server/level/CreativeMode.h diff --git a/Minecraft.Client/GameState/DemoMode.cpp b/Minecraft.Client/net/minecraft/server/level/DemoMode.cpp similarity index 95% rename from Minecraft.Client/GameState/DemoMode.cpp rename to Minecraft.Client/net/minecraft/server/level/DemoMode.cpp index 8794ea9fc..144c5268b 100644 --- a/Minecraft.Client/GameState/DemoMode.cpp +++ b/Minecraft.Client/net/minecraft/server/level/DemoMode.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "DemoMode.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" DemoMode::DemoMode(Minecraft* minecraft) : SurvivalMode(minecraft) { demoHasEnded = false; diff --git a/Minecraft.Client/GameState/DemoMode.h b/Minecraft.Client/net/minecraft/server/level/DemoMode.h similarity index 100% rename from Minecraft.Client/GameState/DemoMode.h rename to Minecraft.Client/net/minecraft/server/level/DemoMode.h diff --git a/Minecraft.Client/Level/DerivedServerLevel.cpp b/Minecraft.Client/net/minecraft/server/level/DerivedServerLevel.cpp similarity index 78% rename from Minecraft.Client/Level/DerivedServerLevel.cpp rename to Minecraft.Client/net/minecraft/server/level/DerivedServerLevel.cpp index 7aa81864f..7d6a0c10f 100644 --- a/Minecraft.Client/Level/DerivedServerLevel.cpp +++ b/Minecraft.Client/net/minecraft/server/level/DerivedServerLevel.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "DerivedServerLevel.h" -#include "../../Minecraft.World/Level/Storage/SavedDataStorage.h" -#include "../../Minecraft.World/Level/DerivedLevelData.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/storage/SavedDataStorage.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/storage/DerivedLevelData.h" DerivedServerLevel::DerivedServerLevel( MinecraftServer* server, std::shared_ptr levelStorage, diff --git a/Minecraft.Client/Level/DerivedServerLevel.h b/Minecraft.Client/net/minecraft/server/level/DerivedServerLevel.h similarity index 100% rename from Minecraft.Client/Level/DerivedServerLevel.h rename to Minecraft.Client/net/minecraft/server/level/DerivedServerLevel.h diff --git a/Minecraft.Client/Player/EntityTracker.cpp b/Minecraft.Client/net/minecraft/server/level/EntityTracker.cpp similarity index 85% rename from Minecraft.Client/Player/EntityTracker.cpp rename to Minecraft.Client/net/minecraft/server/level/EntityTracker.cpp index c64cb685a..a4d5630da 100644 --- a/Minecraft.Client/Player/EntityTracker.cpp +++ b/Minecraft.Client/net/minecraft/server/level/EntityTracker.cpp @@ -1,24 +1,24 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "EntityTracker.h" #include "../MinecraftServer.h" -#include "../Network/PlayerList.h" +#include "../PlayerList.h" #include "TrackedEntity.h" #include "ServerPlayer.h" -#include "../Level/ServerLevel.h" -#include "../../Minecraft.World/Util/Mth.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.monster.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.global.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.projectile.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.boss.enderdragon.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.packet.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.chunk.h" -#include "../Network/PlayerConnection.h" +#include "ServerLevel.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/global/net.minecraft.world.entity.global.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/boss/enderdragon/net.minecraft.world.entity.boss.enderdragon.h" +#include "../../../../../Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h" +#include "../../../../../Minecraft.World/net/minecraft/network/net.minecraft.network.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h" +#include "../network/PlayerConnection.h" EntityTracker::EntityTracker(ServerLevel* level) { this->level = level; diff --git a/Minecraft.Client/Player/EntityTracker.h b/Minecraft.Client/net/minecraft/server/level/EntityTracker.h similarity index 90% rename from Minecraft.Client/Player/EntityTracker.h rename to Minecraft.Client/net/minecraft/server/level/EntityTracker.h index 55c657f12..3f2b96388 100644 --- a/Minecraft.Client/Player/EntityTracker.h +++ b/Minecraft.Client/net/minecraft/server/level/EntityTracker.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Minecraft.World/Util/HashExtension.h" -#include "../../Minecraft.World/Util/JavaIntHash.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/HashExtension.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaIntHash.h" class Entity; class ServerPlayer; class TrackedEntity; diff --git a/Minecraft.Client/GameState/GameMode.cpp b/Minecraft.Client/net/minecraft/server/level/GameMode.cpp similarity index 83% rename from Minecraft.Client/GameState/GameMode.cpp rename to Minecraft.Client/net/minecraft/server/level/GameMode.cpp index 432687223..4f519ed8d 100644 --- a/Minecraft.Client/GameState/GameMode.cpp +++ b/Minecraft.Client/net/minecraft/server/level/GameMode.cpp @@ -1,14 +1,14 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "GameMode.h" -#include "../Player/LocalPlayer.h" -#include "../Rendering/LevelRenderer.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.chunk.h" +#include "../../client/player/LocalPlayer.h" +#include "../../client/renderer/LevelRenderer.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h" GameMode::GameMode(Minecraft* minecraft) { instaBuild = false; // 4J - added diff --git a/Minecraft.Client/GameState/GameMode.h b/Minecraft.Client/net/minecraft/server/level/GameMode.h similarity index 100% rename from Minecraft.Client/GameState/GameMode.h rename to Minecraft.Client/net/minecraft/server/level/GameMode.h diff --git a/Minecraft.Client/Network/PlayerChunkMap.cpp b/Minecraft.Client/net/minecraft/server/level/PlayerChunkMap.cpp similarity index 97% rename from Minecraft.Client/Network/PlayerChunkMap.cpp rename to Minecraft.Client/net/minecraft/server/level/PlayerChunkMap.cpp index ddcbdd577..b6d485131 100644 --- a/Minecraft.Client/Network/PlayerChunkMap.cpp +++ b/Minecraft.Client/net/minecraft/server/level/PlayerChunkMap.cpp @@ -1,17 +1,17 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "PlayerChunkMap.h" -#include "PlayerConnection.h" -#include "../Level/ServerLevel.h" +#include "../network/PlayerConnection.h" +#include "ServerLevel.h" #include "ServerChunkCache.h" -#include "../Player/ServerPlayer.h" +#include "ServerPlayer.h" #include "../MinecraftServer.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.packet.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.chunk.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Util/ArrayWithLength.h" -#include "../../Minecraft.World/Platform/System.h" -#include "PlayerList.h" +#include "../../../../../Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/ArrayWithLength.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/System.h" +#include "../PlayerList.h" PlayerChunkMap::PlayerChunk::PlayerChunk(int x, int z, PlayerChunkMap* pcm) : pos(x, z) { diff --git a/Minecraft.Client/Network/PlayerChunkMap.h b/Minecraft.Client/net/minecraft/server/level/PlayerChunkMap.h similarity index 96% rename from Minecraft.Client/Network/PlayerChunkMap.h rename to Minecraft.Client/net/minecraft/server/level/PlayerChunkMap.h index a0315897a..b75dd4c1e 100644 --- a/Minecraft.Client/Network/PlayerChunkMap.h +++ b/Minecraft.Client/net/minecraft/server/level/PlayerChunkMap.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Minecraft.World/Util/JavaIntHash.h" -#include "../../Minecraft.World/Level/ChunkPos.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaIntHash.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/ChunkPos.h" class ServerPlayer; class ServerLevel; class MinecraftServer; diff --git a/Minecraft.Client/Network/ServerChunkCache.cpp b/Minecraft.Client/net/minecraft/server/level/ServerChunkCache.cpp similarity index 97% rename from Minecraft.Client/Network/ServerChunkCache.cpp rename to Minecraft.Client/net/minecraft/server/level/ServerChunkCache.cpp index 79e5775af..cc37424eb 100644 --- a/Minecraft.Client/Network/ServerChunkCache.cpp +++ b/Minecraft.Client/net/minecraft/server/level/ServerChunkCache.cpp @@ -1,20 +1,20 @@ #include #include -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ServerChunkCache.h" -#include "../Level/ServerLevel.h" +#include "ServerLevel.h" #include "../MinecraftServer.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.storage.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.chunk.h" -#include "../../Minecraft.World/Util/Pos.h" -#include "../../Minecraft.World/Util/ProgressListener.h" -#include "../../Minecraft.World/Util/ThreadName.h" -#include "../../Minecraft.World/IO/Streams/Compression.h" -#include "../../Minecraft.World/Level/Storage/OldChunkStorage.h" -#include "../../Minecraft.World/Blocks/Tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h" +#include "../../../../../Minecraft.World/net/minecraft/Pos.h" +#include "../../../../../Minecraft.World/net/minecraft/util/ProgressListener.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/ThreadName.h" +#include "../../../../../Minecraft.World/Header Files/compression.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/storage/OldChunkStorage.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/Tile.h" ServerChunkCache::ServerChunkCache(ServerLevel* level, ChunkStorage* storage, ChunkSource* source) { diff --git a/Minecraft.Client/Network/ServerChunkCache.h b/Minecraft.Client/net/minecraft/server/level/ServerChunkCache.h similarity index 87% rename from Minecraft.Client/Network/ServerChunkCache.h rename to Minecraft.Client/net/minecraft/server/level/ServerChunkCache.h index ee9d30caa..b6650bc4d 100644 --- a/Minecraft.Client/Network/ServerChunkCache.h +++ b/Minecraft.Client/net/minecraft/server/level/ServerChunkCache.h @@ -1,11 +1,11 @@ #pragma once #include -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/IO/Files/File.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.storage.h" -#include "../../Minecraft.World/Util/JavaIntHash.h" -#include "../../Minecraft.World/Level/RandomLevelSource.h" -#include "../../Minecraft.World/Util/C4JThread.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/File.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaIntHash.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/levelgen/RandomLevelSource.h" +#include "../../../../../Minecraft.World/ConsoleHelpers/C4JThread.h" class ServerLevel; diff --git a/Minecraft.Client/Level/ServerLevel.cpp b/Minecraft.Client/net/minecraft/server/level/ServerLevel.cpp similarity index 95% rename from Minecraft.Client/Level/ServerLevel.cpp rename to Minecraft.Client/net/minecraft/server/level/ServerLevel.cpp index 2822c8350..62c1c7307 100644 --- a/Minecraft.Client/Level/ServerLevel.cpp +++ b/Minecraft.Client/net/minecraft/server/level/ServerLevel.cpp @@ -2,45 +2,45 @@ #include #include -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ServerLevel.h" #include "../MinecraftServer.h" -#include "../Network/ServerChunkCache.h" -#include "../Network/PlayerList.h" -#include "../Player/ServerPlayer.h" -#include "../Network/PlayerConnection.h" -#include "../Player/EntityTracker.h" -#include "../Network/ServerScoreboard.h" -#include "../../Minecraft.World/Scores/ScoreboardSaveData.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.ai.village.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.global.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.npc.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.biome.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.chunk.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.levelgen.feature.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.storage.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.scores.h" -#include "../../Minecraft.World/Entities/ItemEntity.h" -#include "../../Minecraft.World/Entities/Mobs/Arrow.h" -#include "../../Minecraft.World/Entities/Mobs/PrimedTnt.h" -#include "../../Minecraft.World/Blocks/FallingTile.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.packet.h" -#include "../../Minecraft.World/Util/Mth.h" -#include "../../Minecraft.World/WorldGen/Structures/StructurePiece.h" -#include "./ServerLevelListener.h" -#include "../../Minecraft.World/Util/WeighedTreasure.h" -#include "../Textures/Packs/TexturePackRepository.h" -#include "../Textures/Packs/DLCTexturePack.h" -#include "../../Minecraft.World/Util/ProgressListener.h" -#include "../Platform/Common/ShutdownManager.h" -#include "../Network/PlayerChunkMap.h" +#include "ServerChunkCache.h" +#include "../PlayerList.h" +#include "ServerPlayer.h" +#include "../network/PlayerConnection.h" +#include "EntityTracker.h" +#include "../ServerScoreboard.h" +#include "../../../../../Minecraft.World/net/minecraft/world/scores/ScoreboardSaveData.h" +#include "../../../../../Minecraft.World/net/minecraft/world/net.minecraft.world.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/ai/village/net.minecraft.world.entity.ai.village.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/global/net.minecraft.world.entity.global.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/npc/net.minecraft.world.entity.npc.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/biome/net.minecraft.world.level.biome.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/levelgen/feature/net.minecraft.world.level.levelgen.feature.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/scores/net.minecraft.world.scores.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/item/ItemEntity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/projectile/Arrow.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/item/PrimedTnt.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/item/FallingTile.h" +#include "../../../../../Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/levelgen/structure/StructurePiece.h" +#include "ServerLevelListener.h" +#include "../../../../../Minecraft.World/net/minecraft/util/WeighedTreasure.h" +#include "../../client/skins/TexturePackRepository.h" +#include "../../client/skins/DLCTexturePack.h" +#include "../../../../../Minecraft.World/net/minecraft/util/ProgressListener.h" +#include "../../../../Common/ShutdownManager.h" +#include "PlayerChunkMap.h" WeighedTreasureArray ServerLevel::RANDOM_BONUS_ITEMS; diff --git a/Minecraft.Client/Level/ServerLevel.h b/Minecraft.Client/net/minecraft/server/level/ServerLevel.h similarity index 97% rename from Minecraft.Client/Level/ServerLevel.h rename to Minecraft.Client/net/minecraft/server/level/ServerLevel.h index 852b391a3..1e01023c0 100644 --- a/Minecraft.Client/Level/ServerLevel.h +++ b/Minecraft.Client/net/minecraft/server/level/ServerLevel.h @@ -1,7 +1,7 @@ #pragma once #include -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Util/JavaIntHash.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaIntHash.h" class ServerChunkCache; class MinecraftServer; class Node; diff --git a/Minecraft.Client/Level/ServerLevelListener.cpp b/Minecraft.Client/net/minecraft/server/level/ServerLevelListener.cpp similarity index 90% rename from Minecraft.Client/Level/ServerLevelListener.cpp rename to Minecraft.Client/net/minecraft/server/level/ServerLevelListener.cpp index 1f19a12ae..e9d7b2233 100644 --- a/Minecraft.Client/Level/ServerLevelListener.cpp +++ b/Minecraft.Client/net/minecraft/server/level/ServerLevelListener.cpp @@ -1,15 +1,15 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ServerLevelListener.h" -#include "../Player/EntityTracker.h" +#include "EntityTracker.h" #include "../MinecraftServer.h" #include "ServerLevel.h" -#include "../Player/ServerPlayer.h" -#include "../Network/PlayerList.h" -#include "../Network/PlayerChunkMap.h" -#include "../Network/PlayerConnection.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.packet.h" -#include "../../Minecraft.World/Level/LevelData.h" +#include "ServerPlayer.h" +#include "../PlayerList.h" +#include "PlayerChunkMap.h" +#include "../network/PlayerConnection.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/storage/LevelData.h" ServerLevelListener::ServerLevelListener(MinecraftServer* server, ServerLevel* level) { diff --git a/Minecraft.Client/Level/ServerLevelListener.h b/Minecraft.Client/net/minecraft/server/level/ServerLevelListener.h similarity index 96% rename from Minecraft.Client/Level/ServerLevelListener.h rename to Minecraft.Client/net/minecraft/server/level/ServerLevelListener.h index dc313d558..26c31658d 100644 --- a/Minecraft.Client/Level/ServerLevelListener.h +++ b/Minecraft.Client/net/minecraft/server/level/ServerLevelListener.h @@ -1,5 +1,5 @@ #pragma once -#include "../../Minecraft.World/Level/Events/LevelListener.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/LevelListener.h" class Player; class TileEntity; class Entity; diff --git a/Minecraft.Client/Player/ServerPlayer.cpp b/Minecraft.Client/net/minecraft/server/level/ServerPlayer.cpp similarity index 96% rename from Minecraft.Client/Player/ServerPlayer.cpp rename to Minecraft.Client/net/minecraft/server/level/ServerPlayer.cpp index 419dd4384..15df8779d 100644 --- a/Minecraft.Client/Player/ServerPlayer.cpp +++ b/Minecraft.Client/net/minecraft/server/level/ServerPlayer.cpp @@ -1,37 +1,37 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ServerPlayer.h" #include "ServerPlayerGameMode.h" -#include "../Level/ServerLevel.h" +#include "ServerLevel.h" #include "../MinecraftServer.h" #include "EntityTracker.h" -#include "../Network/PlayerConnection.h" -#include "../GameState/Settings.h" -#include "../Network/PlayerList.h" -#include "../Level/MultiPlayerLevel.h" +#include "../network/PlayerConnection.h" +#include "../Settings.h" +#include "../PlayerList.h" +#include "../../client/multiplayer/MultiPlayerLevel.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.packet.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.damagesource.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.storage.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.projectile.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.trading.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.scores.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.scores.criteria.h" -#include "../../Minecraft.World/Headers/net.minecraft.stats.h" -#include "../../Minecraft.World/Headers/net.minecraft.locale.h" +#include "../../../../../Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h" +#include "../../../../../Minecraft.World/net/minecraft/world/damageSource/net.minecraft.world.damagesource.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/trading/net.minecraft.world.item.trading.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/scores/net.minecraft.world.scores.h" +#include "../../../../../Minecraft.World/net/minecraft/world/scores/criteria/net.minecraft.world.scores.criteria.h" +#include "../../../../../Minecraft.World/net/minecraft/stats/net.minecraft.stats.h" +#include "../../../../../Minecraft.World/net/minecraft/locale/net.minecraft.locale.h" -#include "../../Minecraft.World/Util/Pos.h" -#include "../../Minecraft.World/Util/Random.h" +#include "../../../../../Minecraft.World/net/minecraft/Pos.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Random.h" -#include "../../Minecraft.World/Level/LevelChunk.h" -#include "../Rendering/LevelRenderer.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/LevelChunk.h" +#include "../../client/renderer/LevelRenderer.h" ServerPlayer::ServerPlayer(MinecraftServer* server, Level* level, const std::wstring& name, diff --git a/Minecraft.Client/Player/ServerPlayer.h b/Minecraft.Client/net/minecraft/server/level/ServerPlayer.h similarity index 95% rename from Minecraft.Client/Player/ServerPlayer.h rename to Minecraft.Client/net/minecraft/server/level/ServerPlayer.h index 30160d730..266a16f0f 100644 --- a/Minecraft.Client/Player/ServerPlayer.h +++ b/Minecraft.Client/net/minecraft/server/level/ServerPlayer.h @@ -1,7 +1,7 @@ #pragma once -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.ContainerListener.h" -#include "../../Minecraft.World/Level/ChunkPos.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.ContainerListener.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/ChunkPos.h" class PlayerConnection; class MinecraftServer; class ServerPlayerGameMode; diff --git a/Minecraft.Client/Player/ServerPlayerGameMode.cpp b/Minecraft.Client/net/minecraft/server/level/ServerPlayerGameMode.cpp similarity index 93% rename from Minecraft.Client/Player/ServerPlayerGameMode.cpp rename to Minecraft.Client/net/minecraft/server/level/ServerPlayerGameMode.cpp index fce273b72..22532f0db 100644 --- a/Minecraft.Client/Player/ServerPlayerGameMode.cpp +++ b/Minecraft.Client/net/minecraft/server/level/ServerPlayerGameMode.cpp @@ -1,17 +1,17 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "ServerPlayerGameMode.h" -#include "../Level/ServerLevel.h" +#include "ServerLevel.h" #include "ServerPlayer.h" -#include "../Network/PlayerConnection.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.packet.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.chunk.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../Level/MultiPlayerLevel.h" -#include "../Rendering/LevelRenderer.h" +#include "../network/PlayerConnection.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../client/multiplayer/MultiPlayerLevel.h" +#include "../../client/renderer/LevelRenderer.h" ServerPlayerGameMode::ServerPlayerGameMode(Level* level) { // 4J - added initialisers diff --git a/Minecraft.Client/Player/ServerPlayerGameMode.h b/Minecraft.Client/net/minecraft/server/level/ServerPlayerGameMode.h similarity index 100% rename from Minecraft.Client/Player/ServerPlayerGameMode.h rename to Minecraft.Client/net/minecraft/server/level/ServerPlayerGameMode.h diff --git a/Minecraft.Client/GameState/SurvivalMode.cpp b/Minecraft.Client/net/minecraft/server/level/SurvivalMode.cpp similarity index 90% rename from Minecraft.Client/GameState/SurvivalMode.cpp rename to Minecraft.Client/net/minecraft/server/level/SurvivalMode.cpp index 69aa0b251..9018d6d4a 100644 --- a/Minecraft.Client/GameState/SurvivalMode.cpp +++ b/Minecraft.Client/net/minecraft/server/level/SurvivalMode.cpp @@ -1,13 +1,13 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "SurvivalMode.h" #include "DemoMode.h" -#include "../Rendering/LevelRenderer.h" -#include "../Player/LocalPlayer.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../ClientConstants.h" +#include "../../client/renderer/LevelRenderer.h" +#include "../../client/player/LocalPlayer.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../client/ClientConstants.h" SurvivalMode::SurvivalMode(Minecraft* minecraft) : GameMode(minecraft) { // 4J - added initialisers diff --git a/Minecraft.Client/GameState/SurvivalMode.h b/Minecraft.Client/net/minecraft/server/level/SurvivalMode.h similarity index 100% rename from Minecraft.Client/GameState/SurvivalMode.h rename to Minecraft.Client/net/minecraft/server/level/SurvivalMode.h diff --git a/Minecraft.Client/Player/TrackedEntity.cpp b/Minecraft.Client/net/minecraft/server/level/TrackedEntity.cpp similarity index 96% rename from Minecraft.Client/Player/TrackedEntity.cpp rename to Minecraft.Client/net/minecraft/server/level/TrackedEntity.cpp index 8e60db877..6dbcc2512 100644 --- a/Minecraft.Client/Player/TrackedEntity.cpp +++ b/Minecraft.Client/net/minecraft/server/level/TrackedEntity.cpp @@ -1,24 +1,24 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "TrackedEntity.h" #include "ServerPlayer.h" -#include "../Network/PlayerConnection.h" -#include "../../Minecraft.World/Util/Mth.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.monster.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.player.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.global.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.projectile.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.packet.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.saveddata.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.ai.attributes.h" +#include "../network/PlayerConnection.h" +#include "../../../../../Minecraft.World/net/minecraft/util/Mth.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/global/net.minecraft.world.entity.global.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../../../../../Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/saveddata/net.minecraft.world.level.saveddata.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/ai/attributes/net.minecraft.world.entity.ai.attributes.h" #include "../MinecraftServer.h" -#include "../Level/ServerLevel.h" -#include "../Network/PlayerList.h" +#include "ServerLevel.h" +#include "../PlayerList.h" #include "EntityTracker.h" -#include "../Network/PlayerChunkMap.h" +#include "PlayerChunkMap.h" #ifndef __linux__ #include #endif // __linux__ diff --git a/Minecraft.Client/Player/TrackedEntity.h b/Minecraft.Client/net/minecraft/server/level/TrackedEntity.h similarity index 100% rename from Minecraft.Client/Player/TrackedEntity.h rename to Minecraft.Client/net/minecraft/server/level/TrackedEntity.h diff --git a/Minecraft.Client/Network/PendingConnection.cpp b/Minecraft.Client/net/minecraft/server/network/PendingConnection.cpp similarity index 91% rename from Minecraft.Client/Network/PendingConnection.cpp rename to Minecraft.Client/net/minecraft/server/network/PendingConnection.cpp index c58099822..7d5aae5e4 100644 --- a/Minecraft.Client/Network/PendingConnection.cpp +++ b/Minecraft.Client/net/minecraft/server/network/PendingConnection.cpp @@ -1,20 +1,20 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include #include "PendingConnection.h" #include "PlayerConnection.h" #include "ServerConnection.h" -#include "../Player/ServerPlayer.h" -#include "../Player/ServerPlayerGameMode.h" -#include "../Level/ServerLevel.h" -#include "PlayerList.h" +#include "../level/ServerPlayer.h" +#include "../level/ServerPlayerGameMode.h" +#include "../level/ServerLevel.h" +#include "../PlayerList.h" #include "../MinecraftServer.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.h" -#include "../../Minecraft.World/Util/Pos.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.storage.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Util/SharedConstants.h" -#include "../GameState/Settings.h" +#include "../../../../../Minecraft.World/net/minecraft/network/net.minecraft.network.h" +#include "../../../../../Minecraft.World/net/minecraft/Pos.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/SharedConstants.h" +#include "../Settings.h" // #if 0 // #include "PS3/Network/NetworkPlayerSony.h" // #endif diff --git a/Minecraft.Client/Network/PendingConnection.h b/Minecraft.Client/net/minecraft/server/network/PendingConnection.h similarity index 94% rename from Minecraft.Client/Network/PendingConnection.h rename to Minecraft.Client/net/minecraft/server/network/PendingConnection.h index aab9e0ed3..cb0bbfa0d 100644 --- a/Minecraft.Client/Network/PendingConnection.h +++ b/Minecraft.Client/net/minecraft/server/network/PendingConnection.h @@ -1,5 +1,5 @@ #pragma once -#include "../../Minecraft.World/Network/Packets/PacketListener.h" +#include "../../../../../Minecraft.World/net/minecraft/network/packet/PacketListener.h" class MinecraftServer; class Socket; class LoginPacket; diff --git a/Minecraft.Client/Network/PlayerConnection.cpp b/Minecraft.Client/net/minecraft/server/network/PlayerConnection.cpp similarity index 97% rename from Minecraft.Client/Network/PlayerConnection.cpp rename to Minecraft.Client/net/minecraft/server/network/PlayerConnection.cpp index eabe55c1f..80344c69b 100644 --- a/Minecraft.Client/Network/PlayerConnection.cpp +++ b/Minecraft.Client/net/minecraft/server/network/PlayerConnection.cpp @@ -1,37 +1,37 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" #include "PlayerConnection.h" -#include "../Player/ServerPlayer.h" -#include "../Level/ServerLevel.h" -#include "../Player/ServerPlayerGameMode.h" -#include "PlayerList.h" +#include "../level/ServerPlayer.h" +#include "../level/ServerLevel.h" +#include "../level/ServerPlayerGameMode.h" +#include "../PlayerList.h" #include "../MinecraftServer.h" -#include "../../Minecraft.World/Headers/net.minecraft.commands.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.dimension.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.trading.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.inventory.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.saveddata.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.entity.animal.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.food.h" -#include "../../Minecraft.World/Util/AABB.h" -#include "../../Minecraft.World/Util/Pos.h" -#include "../../Minecraft.World/Util/SharedConstants.h" -#include "../../Minecraft.World/Network/Socket.h" -#include "../../Minecraft.World/Stats/Achievements.h" -#include "../../Minecraft.World/Headers/net.minecraft.h" -#include "../Player/EntityTracker.h" +#include "../../../../../Minecraft.World/net/minecraft/commands/net.minecraft.commands.h" +#include "../../../../../Minecraft.World/net/minecraft/network/net.minecraft.network.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/trading/net.minecraft.world.item.trading.h" +#include "../../../../../Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/saveddata/net.minecraft.world.level.saveddata.h" +#include "../../../../../Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h" +#include "../../../../../Minecraft.World/net/minecraft/network/net.minecraft.network.h" +#include "../../../../../Minecraft.World/net/minecraft/world/food/net.minecraft.world.food.h" +#include "../../../../../Minecraft.World/net/minecraft/world/phys/AABB.h" +#include "../../../../../Minecraft.World/net/minecraft/Pos.h" +#include "../../../../../Minecraft.World/net/minecraft/SharedConstants.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Socket.h" +#include "../../../../../Minecraft.World/net/minecraft/stats/Achievements.h" +#include "../../../../../Minecraft.World/net/minecraft/net.minecraft.h" +#include "../level/EntityTracker.h" #include "ServerConnection.h" -#include "../../Minecraft.World/Stats/GenericStats.h" -#include "../../Minecraft.World/Util/JavaMath.h" +#include "../../../../../Minecraft.World/net/minecraft/stats/GenericStats.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaMath.h" // 4J Added -#include "../../Minecraft.World/Headers/net.minecraft.world.item.crafting.h" -#include "../GameState/Options.h" +#include "../../../../../Minecraft.World/net/minecraft/world/item/crafting/net.minecraft.world.item.crafting.h" +#include "../../client/Options.h" Random PlayerConnection::random; diff --git a/Minecraft.Client/Network/PlayerConnection.h b/Minecraft.Client/net/minecraft/server/network/PlayerConnection.h similarity index 96% rename from Minecraft.Client/Network/PlayerConnection.h rename to Minecraft.Client/net/minecraft/server/network/PlayerConnection.h index b3956acba..d1c40da42 100644 --- a/Minecraft.Client/Network/PlayerConnection.h +++ b/Minecraft.Client/net/minecraft/server/network/PlayerConnection.h @@ -1,8 +1,8 @@ #pragma once #include -#include "../Input/ConsoleInputSource.h" -#include "../../Minecraft.World/Network/Packets/PacketListener.h" -#include "../../Minecraft.World/Util/JavaIntHash.h" +#include "../ConsoleInputSource.h" +#include "../../../../../Minecraft.World/net/minecraft/network/packet/PacketListener.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/JavaIntHash.h" class MinecraftServer; class Connection; diff --git a/Minecraft.Client/Network/ServerConnection.cpp b/Minecraft.Client/net/minecraft/server/network/ServerConnection.cpp similarity index 93% rename from Minecraft.Client/Network/ServerConnection.cpp rename to Minecraft.Client/net/minecraft/server/network/ServerConnection.cpp index 13aab0dd6..455c014b8 100644 --- a/Minecraft.Client/Network/ServerConnection.cpp +++ b/Minecraft.Client/net/minecraft/server/network/ServerConnection.cpp @@ -1,13 +1,13 @@ -#include "../Platform/stdafx.h" -#include "../GameState/Options.h" +#include "../../../../../Minecraft.World/Header Files/stdafx.h" +#include "../../client/Options.h" #include "ServerConnection.h" #include "PendingConnection.h" #include "PlayerConnection.h" -#include "../Player/ServerPlayer.h" -#include "../../Minecraft.World/Headers/net.minecraft.network.h" -#include "../../Minecraft.World/Network/Socket.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.h" -#include "../Level/MultiPlayerLevel.h" +#include "../level/ServerPlayer.h" +#include "../../../../../Minecraft.World/net/minecraft/network/net.minecraft.network.h" +#include "../../../../../Minecraft.World/ConsoleJavaLibs/Socket.h" +#include "../../../../../Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../client/multiplayer/MultiPlayerLevel.h" ServerConnection::ServerConnection(MinecraftServer* server) { // 4J - added initialiser diff --git a/Minecraft.Client/Network/ServerConnection.h b/Minecraft.Client/net/minecraft/server/network/ServerConnection.h similarity index 100% rename from Minecraft.Client/Network/ServerConnection.h rename to Minecraft.Client/net/minecraft/server/network/ServerConnection.h diff --git a/Minecraft.Client/GameState/StatsCounter.cpp b/Minecraft.Client/net/minecraft/stats/StatsCounter.cpp similarity index 95% rename from Minecraft.Client/GameState/StatsCounter.cpp rename to Minecraft.Client/net/minecraft/stats/StatsCounter.cpp index a64af092b..2cab4a5d8 100644 --- a/Minecraft.Client/GameState/StatsCounter.cpp +++ b/Minecraft.Client/net/minecraft/stats/StatsCounter.cpp @@ -1,15 +1,15 @@ -#include "../Platform/stdafx.h" +#include "../../../../Minecraft.World/Header Files/stdafx.h" #include "StatsCounter.h" -#include "../../Minecraft.World/Stats/Stat.h" -#include "../../Minecraft.World/Stats/Stats.h" -#include "../../Minecraft.World/Stats/Achievement.h" -#include "../../Minecraft.World/Stats/Achievements.h" -#include "../Player/LocalPlayer.h" +#include "../../../../Minecraft.World/net/minecraft/stats/Stat.h" +#include "../../../../Minecraft.World/net/minecraft/stats/Stats.h" +#include "../../../../Minecraft.World/net/minecraft/stats/Achievement.h" +#include "../../../../Minecraft.World/net/minecraft/stats/Achievements.h" +#include "../client/player/LocalPlayer.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.level.tile.h" -#include "../../Minecraft.World/Headers/net.minecraft.world.item.h" +#include "../../../../Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../../../../Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h" -#include "../Platform/Common/Leaderboards/LeaderboardManager.h" +#include "../../../Common/Source Files/Leaderboards/LeaderboardManager.h" #include Stat** StatsCounter::LARGE_STATS[] = {&Stats::walkOneM, &Stats::swimOneM, diff --git a/Minecraft.Client/GameState/StatsCounter.h b/Minecraft.Client/net/minecraft/stats/StatsCounter.h similarity index 100% rename from Minecraft.Client/GameState/StatsCounter.h rename to Minecraft.Client/net/minecraft/stats/StatsCounter.h diff --git a/Minecraft.Client/net/minecraft/stats/StatsSyncer.cpp b/Minecraft.Client/net/minecraft/stats/StatsSyncer.cpp new file mode 100644 index 000000000..dd7a6ada7 --- /dev/null +++ b/Minecraft.Client/net/minecraft/stats/StatsSyncer.cpp @@ -0,0 +1,4 @@ +#include "../../../../Minecraft.World/Header Files/stdafx.h" +#include "StatsSyncer.h" + +// 4J - TODO \ No newline at end of file diff --git a/Minecraft.Client/GameState/StatsSyncer.h b/Minecraft.Client/net/minecraft/stats/StatsSyncer.h similarity index 100% rename from Minecraft.Client/GameState/StatsSyncer.h rename to Minecraft.Client/net/minecraft/stats/StatsSyncer.h diff --git a/Minecraft.World/Util/ArrayWithLength.h b/Minecraft.World/ConsoleHelpers/ArrayWithLength.h similarity index 98% rename from Minecraft.World/Util/ArrayWithLength.h rename to Minecraft.World/ConsoleHelpers/ArrayWithLength.h index d46f390f6..50eccb4f2 100644 --- a/Minecraft.World/Util/ArrayWithLength.h +++ b/Minecraft.World/ConsoleHelpers/ArrayWithLength.h @@ -126,5 +126,5 @@ typedef arrayWithLength ModelPartArray; typedef arrayWithLength EnchantmentArray; typedef arrayWithLength ClipChunkArray; -#include "../Items/ItemInstance.h" +#include "../net/minecraft/world/item/ItemInstance.h" typedef arrayWithLength > ItemInstanceArray; diff --git a/Minecraft.World/Util/C4JThread.cpp b/Minecraft.World/ConsoleHelpers/C4JThread.cpp similarity index 99% rename from Minecraft.World/Util/C4JThread.cpp rename to Minecraft.World/ConsoleHelpers/C4JThread.cpp index 56b620e6d..12234be29 100644 --- a/Minecraft.World/Util/C4JThread.cpp +++ b/Minecraft.World/ConsoleHelpers/C4JThread.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../Header Files/stdafx.h" #include "C4JThread.h" @@ -26,7 +26,7 @@ #include #endif -#include "../../Minecraft.Client/Platform/Common/ShutdownManager.h" +#include "../../Minecraft.Client/Common/ShutdownManager.h" thread_local C4JThread* C4JThread::ms_currentThread = nullptr; diff --git a/Minecraft.World/Util/C4JThread.h b/Minecraft.World/ConsoleHelpers/C4JThread.h similarity index 100% rename from Minecraft.World/Util/C4JThread.h rename to Minecraft.World/ConsoleHelpers/C4JThread.h diff --git a/Minecraft.World/IO/Files/ConsoleSaveFile.h b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFile.h similarity index 100% rename from Minecraft.World/IO/Files/ConsoleSaveFile.h rename to Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFile.h diff --git a/Minecraft.World/IO/Files/ConsoleSaveFileConverter.cpp b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileConverter.cpp similarity index 97% rename from Minecraft.World/IO/Files/ConsoleSaveFileConverter.cpp rename to Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileConverter.cpp index 5df018def..9c277509b 100644 --- a/Minecraft.World/IO/Files/ConsoleSaveFileConverter.cpp +++ b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileConverter.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.chunk.storage.h" -#include "../../Headers/net.minecraft.world.level.storage.h" +#include "../../Header Files/stdafx.h" +#include "../../net/minecraft/world/level/chunk/storage/net.minecraft.world.level.chunk.storage.h" +#include "../../net/minecraft/world/level/storage/net.minecraft.world.level.storage.h" #include "ConsoleSaveFileIO.h" #include "ConsoleSaveFileConverter.h" -#include "../../Util/ProgressListener.h" +#include "../../net/minecraft/util/ProgressListener.h" void ConsoleSaveFileConverter::ProcessSimpleFile(ConsoleSaveFile* sourceSave, FileEntry* sourceFileEntry, diff --git a/Minecraft.World/IO/Files/ConsoleSaveFileConverter.h b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileConverter.h similarity index 95% rename from Minecraft.World/IO/Files/ConsoleSaveFileConverter.h rename to Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileConverter.h index e6005dde5..5e8ea06d0 100644 --- a/Minecraft.World/IO/Files/ConsoleSaveFileConverter.h +++ b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileConverter.h @@ -1,5 +1,5 @@ #pragma once -#include "File.h" +#include "../../ConsoleJavaLibs/File.h" class FileEntry; class ConsoleSaveFile; class ProgressRenderer; diff --git a/Minecraft.World/IO/Files/ConsoleSaveFileIO.h b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileIO.h similarity index 100% rename from Minecraft.World/IO/Files/ConsoleSaveFileIO.h rename to Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileIO.h diff --git a/Minecraft.World/IO/Files/ConsoleSaveFileInputStream.cpp b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileInputStream.cpp similarity index 98% rename from Minecraft.World/IO/Files/ConsoleSaveFileInputStream.cpp rename to Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileInputStream.cpp index 1a612dc05..1b7f0c1d5 100644 --- a/Minecraft.World/IO/Files/ConsoleSaveFileInputStream.cpp +++ b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileInputStream.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../Header Files/stdafx.h" -#include "File.h" +#include "../../ConsoleJavaLibs/File.h" #include "ConsoleSaveFile.h" #include "ConsoleSaveFileInputStream.h" diff --git a/Minecraft.World/IO/Files/ConsoleSaveFileInputStream.h b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileInputStream.h similarity index 91% rename from Minecraft.World/IO/Files/ConsoleSaveFileInputStream.h rename to Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileInputStream.h index 3203644fd..ad6cf5d09 100644 --- a/Minecraft.World/IO/Files/ConsoleSaveFileInputStream.h +++ b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileInputStream.h @@ -2,7 +2,7 @@ // 4J Stu - Implements the Java InputStream but rather than writing directly to // disc it writes through the save file -#include "../Streams/InputStream.h" +#include "../../ConsoleJavaLibs/InputOutputStream/InputStream.h" #include "ConsoleSavePath.h" diff --git a/Minecraft.World/IO/Files/ConsoleSaveFileOriginal.cpp b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileOriginal.cpp similarity index 97% rename from Minecraft.World/IO/Files/ConsoleSaveFileOriginal.cpp rename to Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileOriginal.cpp index 38d550b8e..dd2685999 100644 --- a/Minecraft.World/IO/Files/ConsoleSaveFileOriginal.cpp +++ b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileOriginal.cpp @@ -1,22 +1,22 @@ #include #include -#include "../../Platform/stdafx.h" -#include "../../Util/StringHelpers.h" -#include "../../Util/PortableFileIO.h" +#include "../../Header Files/stdafx.h" +#include "../StringHelpers.h" +#include "../../Header Files/PortableFileIO.h" #include "ConsoleSaveFileOriginal.h" -#include "File.h" +#include "../../ConsoleJavaLibs/File.h" #include #include #include -#include "../Streams/Compression.h" -#include "../../../Minecraft.Client/Minecraft.h" -#include "../../../Minecraft.Client/MinecraftServer.h" -#include "../../../Minecraft.Client/Level/ServerLevel.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Level/LevelData.h" -#include "../../../Minecraft.Client/Platform/Common/GameRules/LevelGenerationOptions.h" -#include "../../Headers/net.minecraft.world.level.chunk.storage.h" +#include "../../Header Files/compression.h" +#include "../../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../../../Minecraft.Client/net/minecraft/server/MinecraftServer.h" +#include "../../../Minecraft.Client/net/minecraft/server/level/ServerLevel.h" +#include "../../net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../net/minecraft/world/level/storage/LevelData.h" +#include "../../../Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/LevelGenerationOptions.h" +#include "../../net/minecraft/world/level/chunk/storage/net.minecraft.world.level.chunk.storage.h" #define RESERVE_ALLOCATION MEM_RESERVE #define COMMIT_ALLOCATION MEM_COMMIT diff --git a/Minecraft.World/IO/Files/ConsoleSaveFileOriginal.h b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileOriginal.h similarity index 100% rename from Minecraft.World/IO/Files/ConsoleSaveFileOriginal.h rename to Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileOriginal.h diff --git a/Minecraft.World/IO/Files/ConsoleSaveFileOutputStream.cpp b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileOutputStream.cpp similarity index 98% rename from Minecraft.World/IO/Files/ConsoleSaveFileOutputStream.cpp rename to Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileOutputStream.cpp index 951ecde10..5a3dd08a2 100644 --- a/Minecraft.World/IO/Files/ConsoleSaveFileOutputStream.cpp +++ b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileOutputStream.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "File.h" +#include "../../Header Files/stdafx.h" +#include "../../ConsoleJavaLibs/File.h" #include "ConsoleSaveFileOutputStream.h" #include "ConsoleSaveFile.h" diff --git a/Minecraft.World/IO/Files/ConsoleSaveFileOutputStream.h b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileOutputStream.h similarity index 91% rename from Minecraft.World/IO/Files/ConsoleSaveFileOutputStream.h rename to Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileOutputStream.h index 4559cbd12..790a3f88d 100644 --- a/Minecraft.World/IO/Files/ConsoleSaveFileOutputStream.h +++ b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileOutputStream.h @@ -2,7 +2,7 @@ // 4J Stu - Implements the Java InputStream but rather than writing directly to // disc it writes through the save file -#include "../Streams/OutputStream.h" +#include "../../ConsoleJavaLibs/InputOutputStream/OutputStream.h" #include "ConsoleSavePath.h" diff --git a/Minecraft.World/IO/Files/ConsoleSaveFileSplit.cpp b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileSplit.cpp similarity index 98% rename from Minecraft.World/IO/Files/ConsoleSaveFileSplit.cpp rename to Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileSplit.cpp index 28c00eacd..de28bf1f7 100644 --- a/Minecraft.World/IO/Files/ConsoleSaveFileSplit.cpp +++ b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileSplit.cpp @@ -1,21 +1,21 @@ #include #include -#include "../../Platform/stdafx.h" -#include "../../Util/StringHelpers.h" -#include "../../Util/PortableFileIO.h" +#include "../../Header Files/stdafx.h" +#include "../StringHelpers.h" +#include "../../Header Files/PortableFileIO.h" #include "ConsoleSaveFileSplit.h" #include "ConsoleSaveFileConverter.h" -#include "File.h" +#include "../../ConsoleJavaLibs/File.h" #include -#include "../Streams/Compression.h" -#include "../../../Minecraft.Client/Minecraft.h" -#include "../../../Minecraft.Client/MinecraftServer.h" -#include "../../../Minecraft.Client/Level/ServerLevel.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Level/LevelData.h" -#include "../../../Minecraft.Client/Platform/Common/GameRules/LevelGenerationOptions.h" -#include "../../Headers/net.minecraft.world.level.chunk.storage.h" +#include "../../Header Files/compression.h" +#include "../../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../../../Minecraft.Client/net/minecraft/server/MinecraftServer.h" +#include "../../../Minecraft.Client/net/minecraft/server/level/ServerLevel.h" +#include "../../net/minecraft/world/level/net.minecraft.world.level.h" +#include "../../net/minecraft/world/level/storage/LevelData.h" +#include "../../../Minecraft.Client/Common/Source Files/GameRules/LevelGeneration/LevelGenerationOptions.h" +#include "../../net/minecraft/world/level/chunk/storage/net.minecraft.world.level.chunk.storage.h" #define RESERVE_ALLOCATION MEM_RESERVE #define COMMIT_ALLOCATION MEM_COMMIT diff --git a/Minecraft.World/IO/Files/ConsoleSaveFileSplit.h b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileSplit.h similarity index 100% rename from Minecraft.World/IO/Files/ConsoleSaveFileSplit.h rename to Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileSplit.h diff --git a/Minecraft.World/IO/Files/ConsoleSavePath.h b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSavePath.h similarity index 100% rename from Minecraft.World/IO/Files/ConsoleSavePath.h rename to Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/ConsoleSavePath.h diff --git a/Minecraft.World/IO/Files/FileHeader.cpp b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/FileHeader.cpp similarity index 99% rename from Minecraft.World/IO/Files/FileHeader.cpp rename to Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/FileHeader.cpp index 2e69e4d27..e5124ba60 100644 --- a/Minecraft.World/IO/Files/FileHeader.cpp +++ b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/FileHeader.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../Header Files/stdafx.h" #include "FileHeader.h" // #define _DEBUG_FILE_HEADER diff --git a/Minecraft.World/IO/Files/FileHeader.h b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/FileHeader.h similarity index 99% rename from Minecraft.World/IO/Files/FileHeader.h rename to Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/FileHeader.h index 256f6c6c2..981b063bf 100644 --- a/Minecraft.World/IO/Files/FileHeader.h +++ b/Minecraft.World/ConsoleHelpers/ConsoleSaveFileIO/FileHeader.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Platform/System.h" +#include "../../ConsoleJavaLibs/System.h" // The first 4 bytes is the location of the header (the header itself is at the // end of the file) Then 4 bytes for the size of the header Then 2 bytes for the diff --git a/Minecraft.World/Util/Definitions.h b/Minecraft.World/ConsoleHelpers/Definitions.h similarity index 100% rename from Minecraft.World/Util/Definitions.h rename to Minecraft.World/ConsoleHelpers/Definitions.h diff --git a/Minecraft.World/Util/HashExtension.h b/Minecraft.World/ConsoleHelpers/HashExtension.h similarity index 100% rename from Minecraft.World/Util/HashExtension.h rename to Minecraft.World/ConsoleHelpers/HashExtension.h diff --git a/Minecraft.World/Util/PerformanceTimer.cpp b/Minecraft.World/ConsoleHelpers/PerformanceTimer.cpp similarity index 92% rename from Minecraft.World/Util/PerformanceTimer.cpp rename to Minecraft.World/ConsoleHelpers/PerformanceTimer.cpp index 4b6c02c95..02aed2672 100644 --- a/Minecraft.World/Util/PerformanceTimer.cpp +++ b/Minecraft.World/ConsoleHelpers/PerformanceTimer.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../Header Files/stdafx.h" #include "PerformanceTimer.h" PerformanceTimer::PerformanceTimer() { Reset(); } diff --git a/Minecraft.World/Util/PerformanceTimer.h b/Minecraft.World/ConsoleHelpers/PerformanceTimer.h similarity index 100% rename from Minecraft.World/Util/PerformanceTimer.h rename to Minecraft.World/ConsoleHelpers/PerformanceTimer.h diff --git a/Minecraft.World/Util/StringHelpers.cpp b/Minecraft.World/ConsoleHelpers/StringHelpers.cpp similarity index 99% rename from Minecraft.World/Util/StringHelpers.cpp rename to Minecraft.World/ConsoleHelpers/StringHelpers.cpp index 445ac21be..2486f4de1 100644 --- a/Minecraft.World/Util/StringHelpers.cpp +++ b/Minecraft.World/ConsoleHelpers/StringHelpers.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../Header Files/stdafx.h" #include "simdutf.h" std::wstring toLower(const std::wstring& a) { diff --git a/Minecraft.World/Util/StringHelpers.h b/Minecraft.World/ConsoleHelpers/StringHelpers.h similarity index 100% rename from Minecraft.World/Util/StringHelpers.h rename to Minecraft.World/ConsoleHelpers/StringHelpers.h diff --git a/Minecraft.World/Util/ThreadName.cpp b/Minecraft.World/ConsoleHelpers/ThreadName.cpp similarity index 96% rename from Minecraft.World/Util/ThreadName.cpp rename to Minecraft.World/ConsoleHelpers/ThreadName.cpp index a65c7fb2e..32848d3d8 100644 --- a/Minecraft.World/Util/ThreadName.cpp +++ b/Minecraft.World/ConsoleHelpers/ThreadName.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../Header Files/stdafx.h" #include // From Xbox documentation diff --git a/Minecraft.World/Util/ThreadName.h b/Minecraft.World/ConsoleHelpers/ThreadName.h similarity index 100% rename from Minecraft.World/Util/ThreadName.h rename to Minecraft.World/ConsoleHelpers/ThreadName.h diff --git a/Minecraft.World/Util/Arrays.h b/Minecraft.World/ConsoleJavaLibs/Arrays.h similarity index 96% rename from Minecraft.World/Util/Arrays.h rename to Minecraft.World/ConsoleJavaLibs/Arrays.h index 89e3fcfd5..b55f11f4b 100644 --- a/Minecraft.World/Util/Arrays.h +++ b/Minecraft.World/ConsoleJavaLibs/Arrays.h @@ -1,6 +1,6 @@ #pragma once -#include "ArrayWithLength.h" +#include "../ConsoleHelpers/ArrayWithLength.h" class Arrays { public: diff --git a/Minecraft.World/IO/Streams/Buffer.cpp b/Minecraft.World/ConsoleJavaLibs/Buffer.cpp similarity index 98% rename from Minecraft.World/IO/Streams/Buffer.cpp rename to Minecraft.World/ConsoleJavaLibs/Buffer.cpp index e2705aa1b..86c0b8746 100644 --- a/Minecraft.World/IO/Streams/Buffer.cpp +++ b/Minecraft.World/ConsoleJavaLibs/Buffer.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../Header Files/stdafx.h" #include "Buffer.h" Buffer::Buffer(unsigned int capacity) diff --git a/Minecraft.World/IO/Streams/Buffer.h b/Minecraft.World/ConsoleJavaLibs/Buffer.h similarity index 100% rename from Minecraft.World/IO/Streams/Buffer.h rename to Minecraft.World/ConsoleJavaLibs/Buffer.h diff --git a/Minecraft.World/IO/Streams/ByteBuffer.cpp b/Minecraft.World/ConsoleJavaLibs/ByteBuffer.cpp similarity index 99% rename from Minecraft.World/IO/Streams/ByteBuffer.cpp rename to Minecraft.World/ConsoleJavaLibs/ByteBuffer.cpp index 96168693c..9bf801557 100644 --- a/Minecraft.World/IO/Streams/ByteBuffer.cpp +++ b/Minecraft.World/ConsoleJavaLibs/ByteBuffer.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../Header Files/stdafx.h" #include "IntBuffer.h" #include "FloatBuffer.h" diff --git a/Minecraft.World/IO/Streams/ByteBuffer.h b/Minecraft.World/ConsoleJavaLibs/ByteBuffer.h similarity index 96% rename from Minecraft.World/IO/Streams/ByteBuffer.h rename to Minecraft.World/ConsoleJavaLibs/ByteBuffer.h index 74dd5fafd..a43ebb410 100644 --- a/Minecraft.World/IO/Streams/ByteBuffer.h +++ b/Minecraft.World/ConsoleJavaLibs/ByteBuffer.h @@ -1,7 +1,7 @@ #pragma once #include "Buffer.h" -#include "../../Util/Definitions.h" +#include "../ConsoleHelpers/Definitions.h" class IntBuffer; class FloatBuffer; diff --git a/Minecraft.World/Util/Class.cpp b/Minecraft.World/ConsoleJavaLibs/Class.cpp similarity index 81% rename from Minecraft.World/Util/Class.cpp rename to Minecraft.World/ConsoleJavaLibs/Class.cpp index 48c13b3a1..9880131ee 100644 --- a/Minecraft.World/Util/Class.cpp +++ b/Minecraft.World/ConsoleJavaLibs/Class.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../Header Files/stdafx.h" #include "Class.h" // 4J Stu - To ensure that other classes can get the _class object of it's diff --git a/Minecraft.World/Util/Class.h b/Minecraft.World/ConsoleJavaLibs/Class.h similarity index 100% rename from Minecraft.World/Util/Class.h rename to Minecraft.World/ConsoleJavaLibs/Class.h diff --git a/Minecraft.World/Util/Color.cpp b/Minecraft.World/ConsoleJavaLibs/Color.cpp similarity index 98% rename from Minecraft.World/Util/Color.cpp rename to Minecraft.World/ConsoleJavaLibs/Color.cpp index 8843b01ca..15ad6c77e 100644 --- a/Minecraft.World/Util/Color.cpp +++ b/Minecraft.World/ConsoleJavaLibs/Color.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../Header Files/stdafx.h" #include "Color.h" diff --git a/Minecraft.World/Util/Color.h b/Minecraft.World/ConsoleJavaLibs/Color.h similarity index 100% rename from Minecraft.World/Util/Color.h rename to Minecraft.World/ConsoleJavaLibs/Color.h diff --git a/Minecraft.World/Util/Exceptions.h b/Minecraft.World/ConsoleJavaLibs/Exceptions.h similarity index 100% rename from Minecraft.World/Util/Exceptions.h rename to Minecraft.World/ConsoleJavaLibs/Exceptions.h diff --git a/Minecraft.World/IO/Files/File.cpp b/Minecraft.World/ConsoleJavaLibs/File.cpp similarity index 98% rename from Minecraft.World/IO/Files/File.cpp rename to Minecraft.World/ConsoleJavaLibs/File.cpp index be3926eef..0d17436ba 100644 --- a/Minecraft.World/IO/Files/File.cpp +++ b/Minecraft.World/ConsoleJavaLibs/File.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../Header Files/stdafx.h" #include "FileFilter.h" -#include "../../Level/Storage/McRegionLevelStorageSource.h" +#include "../net/minecraft/world/level/storage/McRegionLevelStorageSource.h" #include "File.h" -#include "../../../Minecraft.World/Util/PathHelper.h" +#include "../Header Files/PathHelper.h" #include #include diff --git a/Minecraft.World/IO/Files/File.h b/Minecraft.World/ConsoleJavaLibs/File.h similarity index 100% rename from Minecraft.World/IO/Files/File.h rename to Minecraft.World/ConsoleJavaLibs/File.h diff --git a/Minecraft.World/IO/Files/FileFilter.h b/Minecraft.World/ConsoleJavaLibs/FileFilter.h similarity index 100% rename from Minecraft.World/IO/Files/FileFilter.h rename to Minecraft.World/ConsoleJavaLibs/FileFilter.h diff --git a/Minecraft.World/IO/Files/FilenameFilter.h b/Minecraft.World/ConsoleJavaLibs/FilenameFilter.h similarity index 81% rename from Minecraft.World/IO/Files/FilenameFilter.h rename to Minecraft.World/ConsoleJavaLibs/FilenameFilter.h index 1e475783d..687412f5a 100644 --- a/Minecraft.World/IO/Files/FilenameFilter.h +++ b/Minecraft.World/ConsoleJavaLibs/FilenameFilter.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Platform/stdafx.h" +#include "../Header Files/stdafx.h" class File; diff --git a/Minecraft.World/IO/Streams/FloatBuffer.cpp b/Minecraft.World/ConsoleJavaLibs/FloatBuffer.cpp similarity index 97% rename from Minecraft.World/IO/Streams/FloatBuffer.cpp rename to Minecraft.World/ConsoleJavaLibs/FloatBuffer.cpp index ea753ec6c..0a0c1e916 100644 --- a/Minecraft.World/IO/Streams/FloatBuffer.cpp +++ b/Minecraft.World/ConsoleJavaLibs/FloatBuffer.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../Header Files/stdafx.h" #include "FloatBuffer.h" // Allocates a new float buffer. diff --git a/Minecraft.World/IO/Streams/FloatBuffer.h b/Minecraft.World/ConsoleJavaLibs/FloatBuffer.h similarity index 100% rename from Minecraft.World/IO/Streams/FloatBuffer.h rename to Minecraft.World/ConsoleJavaLibs/FloatBuffer.h diff --git a/Minecraft.World/IO/Streams/BufferedOutputStream.cpp b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/BufferedOutputStream.cpp similarity index 98% rename from Minecraft.World/IO/Streams/BufferedOutputStream.cpp rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/BufferedOutputStream.cpp index 5e41fb5c2..99e0cc9e6 100644 --- a/Minecraft.World/IO/Streams/BufferedOutputStream.cpp +++ b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/BufferedOutputStream.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../Header Files/stdafx.h" #include "BufferedOutputStream.h" diff --git a/Minecraft.World/IO/Streams/BufferedOutputStream.h b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/BufferedOutputStream.h similarity index 100% rename from Minecraft.World/IO/Streams/BufferedOutputStream.h rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/BufferedOutputStream.h diff --git a/Minecraft.World/IO/Streams/BufferedReader.cpp b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/BufferedReader.cpp similarity index 99% rename from Minecraft.World/IO/Streams/BufferedReader.cpp rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/BufferedReader.cpp index ab8996790..ad440c228 100644 --- a/Minecraft.World/IO/Streams/BufferedReader.cpp +++ b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/BufferedReader.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../Header Files/stdafx.h" #include "BufferedReader.h" diff --git a/Minecraft.World/IO/Streams/BufferedReader.h b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/BufferedReader.h similarity index 100% rename from Minecraft.World/IO/Streams/BufferedReader.h rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/BufferedReader.h diff --git a/Minecraft.World/IO/Streams/ByteArrayInputStream.cpp b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/ByteArrayInputStream.cpp similarity index 99% rename from Minecraft.World/IO/Streams/ByteArrayInputStream.cpp rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/ByteArrayInputStream.cpp index f4b317b18..96c94f350 100644 --- a/Minecraft.World/IO/Streams/ByteArrayInputStream.cpp +++ b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/ByteArrayInputStream.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../Header Files/stdafx.h" #include "InputOutputStream.h" diff --git a/Minecraft.World/IO/Streams/ByteArrayInputStream.h b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/ByteArrayInputStream.h similarity index 100% rename from Minecraft.World/IO/Streams/ByteArrayInputStream.h rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/ByteArrayInputStream.h diff --git a/Minecraft.World/IO/Streams/ByteArrayOutputStream.cpp b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/ByteArrayOutputStream.cpp similarity index 98% rename from Minecraft.World/IO/Streams/ByteArrayOutputStream.cpp rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/ByteArrayOutputStream.cpp index 7cc8b4efb..e6bd50dfd 100644 --- a/Minecraft.World/IO/Streams/ByteArrayOutputStream.cpp +++ b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/ByteArrayOutputStream.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../Header Files/stdafx.h" #include "ByteArrayOutputStream.h" diff --git a/Minecraft.World/IO/Streams/ByteArrayOutputStream.h b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/ByteArrayOutputStream.h similarity index 100% rename from Minecraft.World/IO/Streams/ByteArrayOutputStream.h rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/ByteArrayOutputStream.h diff --git a/Minecraft.World/IO/Streams/DataInput.h b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/DataInput.h similarity index 100% rename from Minecraft.World/IO/Streams/DataInput.h rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/DataInput.h diff --git a/Minecraft.World/IO/Streams/DataInputStream.cpp b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/DataInputStream.cpp similarity index 99% rename from Minecraft.World/IO/Streams/DataInputStream.cpp rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/DataInputStream.cpp index 3cc3988ac..8c70b3a79 100644 --- a/Minecraft.World/IO/Streams/DataInputStream.cpp +++ b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/DataInputStream.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../Header Files/stdafx.h" #include "DataInputStream.h" #include diff --git a/Minecraft.World/IO/Streams/DataInputStream.h b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/DataInputStream.h similarity index 100% rename from Minecraft.World/IO/Streams/DataInputStream.h rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/DataInputStream.h diff --git a/Minecraft.World/IO/Streams/DataOutput.h b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/DataOutput.h similarity index 100% rename from Minecraft.World/IO/Streams/DataOutput.h rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/DataOutput.h diff --git a/Minecraft.World/IO/Streams/DataOutputStream.cpp b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/DataOutputStream.cpp similarity index 99% rename from Minecraft.World/IO/Streams/DataOutputStream.cpp rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/DataOutputStream.cpp index fc5d80451..3b14dbfa7 100644 --- a/Minecraft.World/IO/Streams/DataOutputStream.cpp +++ b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/DataOutputStream.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../Header Files/stdafx.h" #include "DataOutputStream.h" #include diff --git a/Minecraft.World/IO/Streams/DataOutputStream.h b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/DataOutputStream.h similarity index 100% rename from Minecraft.World/IO/Streams/DataOutputStream.h rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/DataOutputStream.h diff --git a/Minecraft.World/IO/Files/FileInputStream.cpp b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/FileInputStream.cpp similarity index 99% rename from Minecraft.World/IO/Files/FileInputStream.cpp rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/FileInputStream.cpp index 84c5220b1..92348c197 100644 --- a/Minecraft.World/IO/Files/FileInputStream.cpp +++ b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/FileInputStream.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../Header Files/stdafx.h" -#include "File.h" +#include "../File.h" #include "FileInputStream.h" #include diff --git a/Minecraft.World/IO/Files/FileInputStream.h b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/FileInputStream.h similarity index 92% rename from Minecraft.World/IO/Files/FileInputStream.h rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/FileInputStream.h index 7d3d3eed7..80d6aa91f 100644 --- a/Minecraft.World/IO/Files/FileInputStream.h +++ b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/FileInputStream.h @@ -3,7 +3,7 @@ #include -#include "../Streams/InputStream.h" +#include "InputStream.h" class File; diff --git a/Minecraft.World/IO/Files/FileOutputStream.cpp b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/FileOutputStream.cpp similarity index 98% rename from Minecraft.World/IO/Files/FileOutputStream.cpp rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/FileOutputStream.cpp index bc7685228..e66ce451c 100644 --- a/Minecraft.World/IO/Files/FileOutputStream.cpp +++ b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/FileOutputStream.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "File.h" +#include "../../Header Files/stdafx.h" +#include "../File.h" #include "FileOutputStream.h" // Creates a file output stream to write to the file represented by the diff --git a/Minecraft.World/IO/Files/FileOutputStream.h b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/FileOutputStream.h similarity index 92% rename from Minecraft.World/IO/Files/FileOutputStream.h rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/FileOutputStream.h index 988dc9222..0df2cd6b4 100644 --- a/Minecraft.World/IO/Files/FileOutputStream.h +++ b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/FileOutputStream.h @@ -3,7 +3,7 @@ #include -#include "../Streams/OutputStream.h" +#include "OutputStream.h" class File; diff --git a/Minecraft.World/IO/Streams/GZIPInputStream.h b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/GZIPInputStream.h similarity index 100% rename from Minecraft.World/IO/Streams/GZIPInputStream.h rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/GZIPInputStream.h diff --git a/Minecraft.World/IO/Streams/GZIPOutputStream.h b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/GZIPOutputStream.h similarity index 100% rename from Minecraft.World/IO/Streams/GZIPOutputStream.h rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/GZIPOutputStream.h diff --git a/Minecraft.World/IO/Streams/InputOutputStream.h b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputOutputStream.h similarity index 84% rename from Minecraft.World/IO/Streams/InputOutputStream.h rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputOutputStream.h index 5005c2309..1708c213a 100644 --- a/Minecraft.World/IO/Streams/InputOutputStream.h +++ b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputOutputStream.h @@ -4,7 +4,7 @@ #include "ByteArrayInputStream.h" #include "DataInput.h" #include "DataInputStream.h" -#include "../Files/FileInputStream.h" +#include "FileInputStream.h" #include "GZIPInputStream.h" #include "OutputStream.h" @@ -12,7 +12,7 @@ #include "DataOutput.h" #include "BufferedOutputStream.h" #include "DataOutputStream.h" -#include "../Files/FileOutputStream.h" +#include "FileOutputStream.h" #include "GZIPOutputStream.h" #include "Reader.h" diff --git a/Minecraft.World/IO/Streams/InputStream.cpp b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputStream.cpp similarity index 78% rename from Minecraft.World/IO/Streams/InputStream.cpp rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputStream.cpp index bcb6ff928..7798095f2 100644 --- a/Minecraft.World/IO/Streams/InputStream.cpp +++ b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputStream.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../Files/File.h" +#include "../../Header Files/stdafx.h" +#include "../File.h" #include "InputOutputStream.h" #include "InputStream.h" diff --git a/Minecraft.World/IO/Streams/InputStream.h b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputStream.h similarity index 100% rename from Minecraft.World/IO/Streams/InputStream.h rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputStream.h diff --git a/Minecraft.World/IO/Streams/InputStreamReader.cpp b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputStreamReader.cpp similarity index 97% rename from Minecraft.World/IO/Streams/InputStreamReader.cpp rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputStreamReader.cpp index 44af81283..77c4223c0 100644 --- a/Minecraft.World/IO/Streams/InputStreamReader.cpp +++ b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputStreamReader.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../Header Files/stdafx.h" #include "InputStream.h" #include "DataInputStream.h" diff --git a/Minecraft.World/IO/Streams/InputStreamReader.h b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputStreamReader.h similarity index 100% rename from Minecraft.World/IO/Streams/InputStreamReader.h rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/InputStreamReader.h diff --git a/Minecraft.World/IO/Streams/OutputStream.h b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/OutputStream.h similarity index 100% rename from Minecraft.World/IO/Streams/OutputStream.h rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/OutputStream.h diff --git a/Minecraft.World/IO/Streams/Reader.h b/Minecraft.World/ConsoleJavaLibs/InputOutputStream/Reader.h similarity index 100% rename from Minecraft.World/IO/Streams/Reader.h rename to Minecraft.World/ConsoleJavaLibs/InputOutputStream/Reader.h diff --git a/Minecraft.World/IO/Streams/IntBuffer.cpp b/Minecraft.World/ConsoleJavaLibs/IntBuffer.cpp similarity index 98% rename from Minecraft.World/IO/Streams/IntBuffer.cpp rename to Minecraft.World/ConsoleJavaLibs/IntBuffer.cpp index 857866d10..87c6ccf0a 100644 --- a/Minecraft.World/IO/Streams/IntBuffer.cpp +++ b/Minecraft.World/ConsoleJavaLibs/IntBuffer.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../Header Files/stdafx.h" #include "IntBuffer.h" diff --git a/Minecraft.World/IO/Streams/IntBuffer.h b/Minecraft.World/ConsoleJavaLibs/IntBuffer.h similarity index 100% rename from Minecraft.World/IO/Streams/IntBuffer.h rename to Minecraft.World/ConsoleJavaLibs/IntBuffer.h diff --git a/Minecraft.World/Util/JavaIntHash.h b/Minecraft.World/ConsoleJavaLibs/JavaIntHash.h similarity index 100% rename from Minecraft.World/Util/JavaIntHash.h rename to Minecraft.World/ConsoleJavaLibs/JavaIntHash.h diff --git a/Minecraft.World/Util/JavaMath.cpp b/Minecraft.World/ConsoleJavaLibs/JavaMath.cpp similarity index 98% rename from Minecraft.World/Util/JavaMath.cpp rename to Minecraft.World/ConsoleJavaLibs/JavaMath.cpp index d83332c8e..70bb230bc 100644 --- a/Minecraft.World/Util/JavaMath.cpp +++ b/Minecraft.World/ConsoleJavaLibs/JavaMath.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../Header Files/stdafx.h" #include "JavaMath.h" diff --git a/Minecraft.World/Util/JavaMath.h b/Minecraft.World/ConsoleJavaLibs/JavaMath.h similarity index 100% rename from Minecraft.World/Util/JavaMath.h rename to Minecraft.World/ConsoleJavaLibs/JavaMath.h diff --git a/Minecraft.World/Util/Random.cpp b/Minecraft.World/ConsoleJavaLibs/Random.cpp similarity index 97% rename from Minecraft.World/Util/Random.cpp rename to Minecraft.World/ConsoleJavaLibs/Random.cpp index 55bead661..0e305835f 100644 --- a/Minecraft.World/Util/Random.cpp +++ b/Minecraft.World/ConsoleJavaLibs/Random.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" +#include "../Header Files/stdafx.h" #include "Random.h" #include #include // for int64_t -#include "../Platform/System.h" +#include "System.h" Random::Random() { // 4J - jave now uses the system nanosecond counter added to a diff --git a/Minecraft.World/Util/Random.h b/Minecraft.World/ConsoleJavaLibs/Random.h similarity index 100% rename from Minecraft.World/Util/Random.h rename to Minecraft.World/ConsoleJavaLibs/Random.h diff --git a/Minecraft.World/Util/Reference.h b/Minecraft.World/ConsoleJavaLibs/Reference.h similarity index 100% rename from Minecraft.World/Util/Reference.h rename to Minecraft.World/ConsoleJavaLibs/Reference.h diff --git a/Minecraft.World/Network/Socket.cpp b/Minecraft.World/ConsoleJavaLibs/Socket.cpp similarity index 98% rename from Minecraft.World/Network/Socket.cpp rename to Minecraft.World/ConsoleJavaLibs/Socket.cpp index 120cd5700..d278924b3 100644 --- a/Minecraft.World/Network/Socket.cpp +++ b/Minecraft.World/ConsoleJavaLibs/Socket.cpp @@ -1,14 +1,14 @@ #include #include -#include "../Platform/stdafx.h" -#include "../IO/Streams/InputOutputStream.h" +#include "../Header Files/stdafx.h" +#include "InputOutputStream/InputOutputStream.h" #include "SocketAddress.h" #include "Socket.h" -#include "../Util/ThreadName.h" -#include "../../Minecraft.Client/Network/ServerConnection.h" +#include "../ConsoleHelpers/ThreadName.h" +#include "../../Minecraft.Client/net/minecraft/server/network/ServerConnection.h" #include -#include "../../Minecraft.Client/Platform/Common/ShutdownManager.h" +#include "../../Minecraft.Client/Common/ShutdownManager.h" // This current socket implementation is for the creation of a single local // link. 2 sockets can be created, one for either end of this local link, the diff --git a/Minecraft.World/Network/Socket.h b/Minecraft.World/ConsoleJavaLibs/Socket.h similarity index 98% rename from Minecraft.World/Network/Socket.h rename to Minecraft.World/ConsoleJavaLibs/Socket.h index 6a26e1001..b1027f8ba 100644 --- a/Minecraft.World/Network/Socket.h +++ b/Minecraft.World/ConsoleJavaLibs/Socket.h @@ -7,8 +7,8 @@ #endif #include #include -#include "../IO/Streams/InputStream.h" -#include "../IO/Streams/OutputStream.h" +#include "InputOutputStream/InputStream.h" +#include "InputOutputStream/OutputStream.h" #define SOCKET_CLIENT_END 0 #define SOCKET_SERVER_END 1 diff --git a/Minecraft.World/Network/SocketAddress.h b/Minecraft.World/ConsoleJavaLibs/SocketAddress.h similarity index 100% rename from Minecraft.World/Network/SocketAddress.h rename to Minecraft.World/ConsoleJavaLibs/SocketAddress.h diff --git a/Minecraft.World/Platform/System.h b/Minecraft.World/ConsoleJavaLibs/System.h similarity index 97% rename from Minecraft.World/Platform/System.h rename to Minecraft.World/ConsoleJavaLibs/System.h index 20424e4f7..82321cdf2 100644 --- a/Minecraft.World/Platform/System.h +++ b/Minecraft.World/ConsoleJavaLibs/System.h @@ -1,7 +1,7 @@ #pragma once #include -#include "../Util/ArrayWithLength.h" +#include "../ConsoleHelpers/ArrayWithLength.h" // 4J Jev, just thought it would be easier this way. #define ArrayCopyFunctionDeclaration(x) \ diff --git a/Minecraft.World/Platform/System.cpp b/Minecraft.World/ConsoleJavaLibs/system.cpp similarity index 99% rename from Minecraft.World/Platform/System.cpp rename to Minecraft.World/ConsoleJavaLibs/system.cpp index 23d92499e..74a4af283 100644 --- a/Minecraft.World/Platform/System.cpp +++ b/Minecraft.World/ConsoleJavaLibs/system.cpp @@ -1,4 +1,4 @@ -#include "stdafx.h" +#include "../Header Files/stdafx.h" #include "System.h" #if defined(__linux__) #include diff --git a/Minecraft.World/Entities/GlobalEntity.cpp b/Minecraft.World/Entities/GlobalEntity.cpp deleted file mode 100644 index beb18c0f5..000000000 --- a/Minecraft.World/Entities/GlobalEntity.cpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "../Platform/stdafx.h" -#include "GlobalEntity.h" diff --git a/Minecraft.World/Entities/Mobs/Creature.cpp b/Minecraft.World/Entities/Mobs/Creature.cpp deleted file mode 100644 index fb5ede2d2..000000000 --- a/Minecraft.World/Entities/Mobs/Creature.cpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "../../Platform/stdafx.h" -#include "Creature.h" diff --git a/Minecraft.World/Entities/Mobs/Npc.cpp b/Minecraft.World/Entities/Mobs/Npc.cpp deleted file mode 100644 index 7a0cbf996..000000000 --- a/Minecraft.World/Entities/Mobs/Npc.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "../../Platform/stdafx.h" - -#include "Npc.h" diff --git a/Minecraft.World/Level/Events/LevelObjectInputStream.h b/Minecraft.World/Header Files/LevelObjectInputStream.h similarity index 100% rename from Minecraft.World/Level/Events/LevelObjectInputStream.h rename to Minecraft.World/Header Files/LevelObjectInputStream.h diff --git a/Minecraft.World/Platform/Minecraft.World.h b/Minecraft.World/Header Files/Minecraft.World.h similarity index 100% rename from Minecraft.World/Platform/Minecraft.World.h rename to Minecraft.World/Header Files/Minecraft.World.h diff --git a/Minecraft.World/Util/ParticleTypes.h b/Minecraft.World/Header Files/ParticleTypes.h similarity index 100% rename from Minecraft.World/Util/ParticleTypes.h rename to Minecraft.World/Header Files/ParticleTypes.h diff --git a/Minecraft.World/Util/PathHelper.h b/Minecraft.World/Header Files/PathHelper.h similarity index 100% rename from Minecraft.World/Util/PathHelper.h rename to Minecraft.World/Header Files/PathHelper.h diff --git a/Minecraft.World/Util/PortableFileIO.h b/Minecraft.World/Header Files/PortableFileIO.h similarity index 98% rename from Minecraft.World/Util/PortableFileIO.h rename to Minecraft.World/Header Files/PortableFileIO.h index 75dd2ed6d..02a576c45 100644 --- a/Minecraft.World/Util/PortableFileIO.h +++ b/Minecraft.World/Header Files/PortableFileIO.h @@ -4,7 +4,7 @@ #include #include -#include "StringHelpers.h" +#include "../ConsoleHelpers/StringHelpers.h" namespace PortableFileIO { enum class BinaryReadStatus { diff --git a/Minecraft.World/Util/SoundTypes.h b/Minecraft.World/Header Files/SoundTypes.h similarity index 100% rename from Minecraft.World/Util/SoundTypes.h rename to Minecraft.World/Header Files/SoundTypes.h diff --git a/Minecraft.World/IO/Streams/Compression.h b/Minecraft.World/Header Files/compression.h similarity index 98% rename from Minecraft.World/IO/Streams/Compression.h rename to Minecraft.World/Header Files/compression.h index 2ff65a491..82cf5b46e 100644 --- a/Minecraft.World/IO/Streams/Compression.h +++ b/Minecraft.World/Header Files/compression.h @@ -1,6 +1,6 @@ #pragma once #include -#include "../Files/FileHeader.h" +#include "../ConsoleHelpers/ConsoleSaveFileIO/FileHeader.h" class Compression { public: diff --git a/Minecraft.World/Util/libdivide.h b/Minecraft.World/Header Files/libdivide.h similarity index 100% rename from Minecraft.World/Util/libdivide.h rename to Minecraft.World/Header Files/libdivide.h diff --git a/Minecraft.World/Header Files/stdafx.h b/Minecraft.World/Header Files/stdafx.h new file mode 100644 index 000000000..a56f2e4b1 --- /dev/null +++ b/Minecraft.World/Header Files/stdafx.h @@ -0,0 +1,116 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, but +// are changed infrequently +// +#pragma once + +#ifdef _WINDOWS64 +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +#include +#include +#include +#include +#endif + +#ifdef __linux__ +#include +#include +#include +#include "../../Minecraft.Client/Linux/Stubs/LinuxStubs.h" +#else +#include +#include +#include +#include +#endif + +#include + +#include "../x64headers/extraX64.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "../ConsoleHelpers/Definitions.h" +#include "../ConsoleJavaLibs/Class.h" +#include "../ConsoleJavaLibs/Exceptions.h" +#include "../net/minecraft/util/Mth.h" +#include "../ConsoleHelpers/StringHelpers.h" +#include "../ConsoleHelpers/ArrayWithLength.h" +#include "../ConsoleJavaLibs/Random.h" +#include "../net/minecraft/world/level/TilePos.h" +#include "../net/minecraft/world/level/ChunkPos.h" +#include "compression.h" +#include "../ConsoleHelpers/PerformanceTimer.h" + +#ifdef _FINAL_BUILD +#define printf BREAKTHECOMPILE +#define wprintf BREAKTHECOMPILE +#undef OutputDebugString +#define OutputDebugString BREAKTHECOMPILE +#define OutputDebugStringA BREAKTHECOMPILE +#define OutputDebugStringW BREAKTHECOMPILE +#endif + +void MemSect(int sect); + +#ifdef _WINDOWS64 +#include "../../Minecraft.Client/Platform/Windows64/4JLibs/inc/4J_Profile.h" +#include "../../Minecraft.Client/Platform/Windows64/4JLibs/inc/4J_Render.h" +#include "../../Minecraft.Client/Platform/Windows64/4JLibs/inc/4J_Storage.h" +#include "../../Minecraft.Client/Platform/Windows64/4JLibs/inc/4J_Input.h" +#else +#include "4J_Profile.h" +#include "4J_Render.h" +#include "4J_Storage.h" +#include "4J_Input.h" +#endif + +#include "../../Minecraft.Client/Common/Source Files/Network/GameNetworkManager.h" + +#include "../../Minecraft.Client/Common/Source Files/UI/All Platforms/UIEnums.h" +#include "../../Minecraft.Client/Common/App_Defines.h" +#include "../../Minecraft.Client/Common/App_enums.h" +#include "../../Minecraft.Client/Common/Source Files/Tutorial/TutorialEnum.h" +#include "../../Minecraft.Client/Common/App_structs.h" + +#include "../../Minecraft.Client/Common/Consoles_App.h" +#include "../../Minecraft.Client/Common/Minecraft_Macros.h" +#include "../../Minecraft.Client/Common/Source Files/Colours/ColourTable.h" + +#include "../../Minecraft.Client/Common/Source Files/BuildVer/BuildVer.h" + +// This is generated at build time via scripts/pack_loc.py +#include "strings.h" + +#ifdef _WINDOWS64 +#include "../../Minecraft.Client/Windows64/Windows64_App.h" +#include "../../Minecraft.Client/Windows64/Source Files/Sentient/SentientTelemetryCommon.h" +#include "../../Minecraft.Client/Windows64/Source Files/Sentient/MinecraftTelemetry.h" +#else +// Use the Linux runtime path with supported metadata/config headers only. +#include "../../Minecraft.Client/Linux/Linux_App.h" +#include "../../Minecraft.Client/Windows64/Source Files/Sentient/SentientTelemetryCommon.h" +#include "../../Minecraft.Client/Windows64/Source Files/Sentient/DynamicConfigurations.h" +#include "../../Minecraft.Client/Header Files/Minecraft.spa.h" +#endif + +#include "../../Minecraft.Client/Common/Source Files/DLC/DLCSkinFile.h" +#include "../../Minecraft.Client/Common/Source Files/Console_Awards_enum.h" +#include "../../Minecraft.Client/Common/Potion_Macros.h" +#include "../../Minecraft.Client/Common/Source Files/Console_Debug_enum.h" +#include "../../Minecraft.Client/Common/Source Files/GameRules/ConsoleGameRulesConstants.h" +#include "../../Minecraft.Client/Common/Source Files/GameRules/ConsoleGameRules.h" +#include "../../Minecraft.Client/Common/Source Files/Telemetry/TelemetryManager.h" diff --git a/Minecraft.World/Headers/com.mojang.nbt.h b/Minecraft.World/Headers/com.mojang.nbt.h deleted file mode 100644 index e337cffd9..000000000 --- a/Minecraft.World/Headers/com.mojang.nbt.h +++ /dev/null @@ -1,2 +0,0 @@ -#pragma once -#include "../IO/NBT/NbtIO.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.commands.common.h b/Minecraft.World/Headers/net.minecraft.commands.common.h deleted file mode 100644 index 7f5a886cf..000000000 --- a/Minecraft.World/Headers/net.minecraft.commands.common.h +++ /dev/null @@ -1,11 +0,0 @@ -#pragma once - -#include "../Commands/DefaultGameModeCommand.h" -#include "../Commands/EffectCommand.h" -#include "../Commands/EnchantItemCommand.h" -#include "../Commands/ExperienceCommand.h" -#include "../Commands/GameModeCommand.h" -#include "../Commands/GiveItemCommand.h" -#include "../Commands/KillCommand.h" -#include "../Commands/TimeCommand.h" -#include "../Commands/ToggleDownfallCommand.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.commands.h b/Minecraft.World/Headers/net.minecraft.commands.h deleted file mode 100644 index 3646a7425..000000000 --- a/Minecraft.World/Headers/net.minecraft.commands.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#include "../Commands/AdminLogCommand.h" -#include "../Commands/CommandsEnum.h" -#include "../Commands/Command.h" -#include "../Commands/CommandDispatcher.h" -#include "../Commands/CommandSender.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.core.h b/Minecraft.World/Headers/net.minecraft.core.h deleted file mode 100644 index 985a72f95..000000000 --- a/Minecraft.World/Headers/net.minecraft.core.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include "../Core/Behavior.h" -#include "../Core/BlockSource.h" -#include "../Core/BlockSourceImpl.h" -#include "../Core/BehaviorRegistry.h" -#include "../Core/DispenseItemBehavior.h" -#include "../Core/DefaultDispenseItemBehavior.h" -#include "../Core/AbstractProjectileDispenseBehavior.h" -#include "../Core/ItemDispenseBehaviors.h" -#include "../Core/FacingEnum.h" -#include "../Core/LocatableSource.h" -#include "../Core/Location.h" -#include "../Core/Position.h" -#include "../Core/PositionImpl.h" -#include "../Core/Source.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.h b/Minecraft.World/Headers/net.minecraft.h deleted file mode 100644 index 000b8bd72..000000000 --- a/Minecraft.World/Headers/net.minecraft.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include "../Util/Facing.h" -#include "../Util/Direction.h" -#include "../Util/Pos.h" -#include "../Util/SharedConstants.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.locale.h b/Minecraft.World/Headers/net.minecraft.locale.h deleted file mode 100644 index 0a8e80fe5..000000000 --- a/Minecraft.World/Headers/net.minecraft.locale.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -#include "../Util/Language.h" -#include "../Util/I18n.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.network.h b/Minecraft.World/Headers/net.minecraft.network.h deleted file mode 100644 index 6e120e9d1..000000000 --- a/Minecraft.World/Headers/net.minecraft.network.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#include "../Network/Connection.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.network.packet.h b/Minecraft.World/Headers/net.minecraft.network.packet.h deleted file mode 100644 index 514756eb5..000000000 --- a/Minecraft.World/Headers/net.minecraft.network.packet.h +++ /dev/null @@ -1,110 +0,0 @@ -#pragma once - -#include "../Network/Packets/AddEntityPacket.h" -#include "../Network/Packets/AddGlobalEntityPacket.h" -#include "../Network/Packets/AddMobPacket.h" -#include "../Network/Packets/AddPaintingPacket.h" -#include "../Network/Packets/AddPlayerPacket.h" -#include "../Network/Packets/AnimatePacket.h" -#include "../Network/Packets/AwardStatPacket.h" -#include "../Network/Packets/BlockRegionUpdatePacket.h" -#include "../Network/Packets/ChatPacket.h" -#include "../Network/Packets/ChunkTilesUpdatePacket.h" -#include "../Network/Packets/ChunkVisibilityPacket.h" -#include "../Network/Packets/ComplexItemDataPacket.h" -#include "../Network/Packets/ContainerAckPacket.h" -#include "../Network/Packets/ContainerClickPacket.h" -#include "../Network/Packets/ContainerClosePacket.h" -#include "../Network/Packets/ContainerOpenPacket.h" -#include "../Network/Packets/ContainerSetContentPacket.h" -#include "../Network/Packets/ContainerSetDataPacket.h" -#include "../Network/Packets/ContainerSetSlotPacket.h" -#include "../Network/Packets/DisconnectPacket.h" -#include "../Network/Packets/EntityActionAtPositionPacket.h" -#include "../Network/Packets/EntityEventPacket.h" -#include "../Network/Packets/ExplodePacket.h" -#include "../Network/Packets/GameEventPacket.h" -#include "../Network/Packets/InteractPacket.h" -#include "../Network/Packets/KeepAlivePacket.h" -#include "../Network/Packets/LevelEventPacket.h" -#include "../Network/Packets/LoginPacket.h" -#include "../Network/Packets/MoveEntityPacket.h" -#include "../Network/Packets/MoveEntityPacketSmall.h" -#include "../Network/Packets/MovePlayerPacket.h" -#include "../Network/Packets/Packet.h" -#include "../Network/Packets/PacketListener.h" -#include "../Network/Packets/PlayerActionPacket.h" -#include "../Network/Packets/PlayerCommandPacket.h" -#include "../Network/Packets/PlayerInputPacket.h" -#include "../Network/Packets/PreLoginPacket.h" -#include "../Network/Packets/RemoveEntitiesPacket.h" -#include "../Network/Packets/RespawnPacket.h" - -#include "../Network/Packets/SetCarriedItemPacket.h" -#include "../Network/Packets/SetEntityDataPacket.h" -#include "../Network/Packets/SetEntityMotionPacket.h" -#include "../Network/Packets/SetEquippedItemPacket.h" -#include "../Network/Packets/SetHealthPacket.h" -#include "../Network/Packets/SetEntityLinkPacket.h" -#include "../Network/Packets/SetSpawnPositionPacket.h" -#include "../Network/Packets/SetTimePacket.h" -#include "../Network/Packets/SignUpdatePacket.h" -#include "../Network/Packets/TakeItemEntityPacket.h" -#include "../Network/Packets/TeleportEntityPacket.h" -#include "../Network/Packets/TileEventPacket.h" -#include "../Network/Packets/TileUpdatePacket.h" -#include "../Network/Packets/UseItemPacket.h" - -// 1.8.2 Added -#include "../Network/Packets/AddExperienceOrbPacket.h" -#include "../Network/Packets/GetInfoPacket.h" -#include "../Network/Packets/PlayerInfoPacket.h" -#include "../Network/Packets/RemoveMobEffectPacket.h" -#include "../Network/Packets/SetCreativeModeSlotPacket.h" -#include "../Network/Packets/SetExperiencePacket.h" -#include "../Network/Packets/UpdateMobEffectPacket.h" - -// 1.0.1 Added -#include "../Network/Packets/ContainerButtonClickPacket.h" -#include "../Network/Packets/TileEntityDataPacket.h" - -// 1.1 Added (TU9) -#include "../Network/Packets/CustomPayloadPacket.h" - -// 1.2.3 -#include "../Network/Packets/RotateHeadPacket.h" - -// 1.3.2 -#include "../Network/Packets/ChatAutoCompletePacket.h" -#include "../Network/Packets/ClientCommandPacket.h" -#include "../Network/Packets/ClientInformationPacket.h" -#include "../Network/Packets/ClientProtocolPacket.h" -#include "../Network/Packets/LevelSoundPacket.h" -#include "../Network/Packets/PlayerAbilitiesPacket.h" -#include "../Network/Packets/ServerAuthDataPacket.h" -#include "../Network/Packets/TileDestructionPacket.h" - -// 1.6.4 -#include "../Network/Packets/LevelParticlesPacket.h" -#include "../Network/Packets/SetDisplayObjectivePacket.h" -#include "../Network/Packets/SetObjectivePacket.h" -#include "../Network/Packets/SetPlayerTeamPacket.h" -#include "../Network/Packets/SetScorePacket.h" -#include "../Network/Packets/TileEditorOpenPacket.h" -#include "../Network/Packets/UpdateAttributesPacket.h" - -// 4J Added -#include "../Network/Packets/CraftItemPacket.h" -#include "../Network/Packets/TradeItemPacket.h" -#include "../Network/Packets/DebugOptionsPacket.h" -#include "../Network/Packets/ServerSettingsChangedPacket.h" -#include "../Network/Packets/TexturePacket.h" -#include "../Network/Packets/TextureAndGeometryPacket.h" -#include "../Network/Packets/ChunkVisibilityAreaPacket.h" -#include "../Network/Packets/UpdateProgressPacket.h" -#include "../Network/Packets/TextureChangePacket.h" -#include "../Network/Packets/TextureAndGeometryChangePacket.h" -#include "../Network/Packets/UpdateGameRuleProgressPacket.h" -#include "../Network/Packets/KickPlayerPacket.h" -#include "../Network/Packets/XZPacket.h" -#include "../Network/Packets/GameCommandPacket.h" diff --git a/Minecraft.World/Headers/net.minecraft.stats.h b/Minecraft.World/Headers/net.minecraft.stats.h deleted file mode 100644 index 14e78ce1e..000000000 --- a/Minecraft.World/Headers/net.minecraft.stats.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include "../Stats/Achievement.h" -#include "../Stats/Achievements.h" -#include "../Util/DescFormatter.h" -#include "../Stats/GeneralStat.h" -#include "../Stats/ItemStat.h" -#include "../Stats/Stat.h" -#include "../Stats/StatFormatter.h" -#include "../Stats/Stats.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.damagesource.h b/Minecraft.World/Headers/net.minecraft.world.damagesource.h deleted file mode 100644 index 22d7164a7..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.damagesource.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#include "../Util/CombatEntry.h" -#include "../Util/CombatTracker.h" -#include "../Util/DamageSource.h" -#include "../Entities/EntityDamageSource.h" -#include "../Entities/IndirectEntityDamageSource.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.effect.h b/Minecraft.World/Headers/net.minecraft.world.effect.h deleted file mode 100644 index badfd0e1e..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.effect.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include "../Entities/AbsoptionMobEffect.h" -#include "../Entities/AttackDamageMobEffect.h" -#include "../Entities/HealthBoostMobEffect.h" -#include "../Entities/MobEffect.h" -#include "../Entities/InstantaneousMobEffect.h" -#include "../Entities/MobEffectInstance.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.entity.ai.attributes.h b/Minecraft.World/Headers/net.minecraft.world.entity.ai.attributes.h deleted file mode 100644 index 51cd4f5af..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.entity.ai.attributes.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once - -#include "../AI/Attributes/Attribute.h" -#include "../AI/Attributes/AttributeInstance.h" -#include "../AI/Attributes/AttributeModifier.h" -#include "../AI/Attributes/BaseAttribute.h" -#include "../AI/Attributes/BaseAttributeMap.h" -#include "../AI/Attributes/ModifiableAttributeInstance.h" -#include "../AI/Attributes/RangedAttribute.h" -#include "../AI/Attributes/ServersideAttributeMap.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.entity.ai.control.h b/Minecraft.World/Headers/net.minecraft.world.entity.ai.control.h deleted file mode 100644 index 2639461d0..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.entity.ai.control.h +++ /dev/null @@ -1,7 +0,0 @@ -#pragma once - -#include "../AI/Control/Control.h" -#include "../AI/Control/BodyControl.h" -#include "../AI/Control/JumpControl.h" -#include "../AI/Control/LookControl.h" -#include "../AI/Control/MoveControl.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.entity.ai.goal.h b/Minecraft.World/Headers/net.minecraft.world.entity.ai.goal.h deleted file mode 100644 index 9f95bc82b..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.entity.ai.goal.h +++ /dev/null @@ -1,42 +0,0 @@ -#pragma once - -#include "../AI/Goals/Goal.h" -#include "../AI/Goals/AvoidPlayerGoal.h" -#include "../AI/Goals/BegGoal.h" -#include "../AI/Goals/BreakDoorGoal.h" -#include "../AI/Goals/BreedGoal.h" -#include "../AI/Goals/ControlledByPlayerGoal.h" -#include "../AI/Goals/DoorInteractGoal.h" -#include "../AI/Goals/EatTileGoal.h" -#include "../AI/Goals/FleeSunGoal.h" -#include "../AI/Goals/FollowOwnerGoal.h" -#include "../AI/Goals/FollowParentGoal.h" -#include "../AI/Goals/FloatGoal.h" -#include "../AI/Goals/GoalSelector.h" -#include "../AI/Goals/InteractGoal.h" -#include "../AI/Goals/LeapAtTargetGoal.h" -#include "../AI/Goals/LookAtPlayerGoal.h" -#include "../AI/Goals/LookAtTradingPlayerGoal.h" -#include "../AI/Goals/MakeLoveGoal.h" -#include "../AI/Goals/MeleeAttackGoal.h" -#include "../AI/Goals/MoveIndoorsGoal.h" -#include "../AI/Goals/MoveThroughVillageGoal.h" -#include "../AI/Goals/MoveTowardsRestrictionGoal.h" -#include "../AI/Goals/MoveTowardsTargetGoal.h" -#include "../AI/Goals/OcelotSitOnTileGoal.h" -#include "../AI/Goals/OfferFlowerGoal.h" -#include "../AI/Goals/OpenDoorGoal.h" -#include "../AI/Goals/OcelotAttackGoal.h" -#include "../AI/Goals/PanicGoal.h" -#include "../AI/Goals/PlayGoal.h" -#include "../AI/Goals/RandomLookAroundGoal.h" -#include "../AI/Goals/RandomStrollGoal.h" -#include "../AI/Goals/RangedAttackGoal.h" -#include "../AI/Goals/RestrictOpenDoorGoal.h" -#include "../AI/Goals/RestrictSunGoal.h" -#include "../AI/Goals/RunAroundLikeCrazyGoal.h" -#include "../AI/Goals/SitGoal.h" -#include "../AI/Goals/SwellGoal.h" -#include "../AI/Goals/TakeFlowerGoal.h" -#include "../AI/Goals/TemptGoal.h" -#include "../AI/Goals/TradeWithPlayerGoal.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.entity.ai.goal.target.h b/Minecraft.World/Headers/net.minecraft.world.entity.ai.goal.target.h deleted file mode 100644 index 30220807e..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.entity.ai.goal.target.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include "../AI/Goals/TargetGoal.h" -#include "../AI/Goals/DefendVillageTargetGoal.h" -#include "../AI/Goals/HurtByTargetGoal.h" -#include "../AI/Goals/NearestAttackableTargetGoal.h" -#include "../AI/Goals/NonTameRandomTargetGoal.h" -#include "../AI/Goals/OwnerHurtByTargetGoal.h" -#include "../AI/Goals/OwnerHurtTargetGoal.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.entity.ai.navigation.h b/Minecraft.World/Headers/net.minecraft.world.entity.ai.navigation.h deleted file mode 100644 index 971421f86..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.entity.ai.navigation.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#include "../AI/Navigation/PathNavigation.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.entity.ai.sensing.h b/Minecraft.World/Headers/net.minecraft.world.entity.ai.sensing.h deleted file mode 100644 index b866d3e20..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.entity.ai.sensing.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#include "../AI/Control/Sensing.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.entity.ai.util.h b/Minecraft.World/Headers/net.minecraft.world.entity.ai.util.h deleted file mode 100644 index 88890596c..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.entity.ai.util.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#include "../AI/Navigation/RandomPos.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.entity.ai.village.h b/Minecraft.World/Headers/net.minecraft.world.entity.ai.village.h deleted file mode 100644 index 4ed86a9a1..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.entity.ai.village.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include "../Entities/DoorInfo.h" -#include "../WorldGen/Structures/Village.h" -#include "../WorldGen/Structures/Villages.h" -#include "../Level/Events/VillageSiege.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.entity.ambient.h b/Minecraft.World/Headers/net.minecraft.world.entity.ambient.h deleted file mode 100644 index d293c7bd2..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.entity.ambient.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -#include "../Entities/Mobs/AmbientCreature.h" -#include "../Entities/Mobs/Bat.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.entity.animal.h b/Minecraft.World/Headers/net.minecraft.world.entity.animal.h deleted file mode 100644 index bc9cfa784..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.entity.animal.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "../Entities/Mobs/Animal.h" -#include "../Entities/Mobs/Chicken.h" -#include "../Entities/Mobs/Cow.h" -#include "../Entities/Mobs/Pig.h" -#include "../Entities/Mobs/Sheep.h" -#include "../Entities/Mobs/Squid.h" -#include "../Entities/WaterAnimal.h" -#include "../Entities/Mobs/Wolf.h" - -// 1.0.1 -#include "../Entities/Mobs/Golem.h" -#include "../Entities/Mobs/MushroomCow.h" -#include "../Entities/Mobs/SnowMan.h" - -// 1.2.3 -#include "../Entities/Mobs/Ocelot.h" -#include "../Entities/Mobs/VillagerGolem.h" - -// 1.6.4 -#include "../Entities/Mobs/EntityHorse.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.entity.boss.enderdragon.h b/Minecraft.World/Headers/net.minecraft.world.entity.boss.enderdragon.h deleted file mode 100644 index 546dc383c..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.entity.boss.enderdragon.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#include "../Entities/Mobs/EnderCrystal.h" -#include "../Entities/Mobs/EnderDragon.h" -#include "../WorldGen/Features/NetherSphereFeature.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.entity.boss.h b/Minecraft.World/Headers/net.minecraft.world.entity.boss.h deleted file mode 100644 index 108bb0e08..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.entity.boss.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#include "../Entities/Mobs/BossMob.h" -#include "../Entities/Mobs/MultiEntityMob.h" -#include "../Entities/Mobs/MultiEntityMobPart.h" diff --git a/Minecraft.World/Headers/net.minecraft.world.entity.global.h b/Minecraft.World/Headers/net.minecraft.world.entity.global.h deleted file mode 100644 index e38731cc6..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.entity.global.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -#include "../Entities/GlobalEntity.h" -#include "../Entities/Mobs/LightningBolt.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.entity.h b/Minecraft.World/Headers/net.minecraft.world.entity.h deleted file mode 100644 index fa51b8bbb..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.entity.h +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include "../Entities/Mobs/Creature.h" -#include "../Entities/SyncedEntityData.h" -#include "../Entities/Entity.h" -#include "../Entities/EntityEvent.h" -#include "../Level/Storage/EntityIO.h" -#include "../Entities/EntityPos.h" -#include "../Entities/FlyingMob.h" -#include "../Entities/Mob.h" -#include "../Entities/MobCategory.h" -#include "../Entities/Mobs/Painting.h" -#include "../Entities/PathfinderMob.h" - -// 1.8.2 -#include "../Util/DelayedRelease.h" -#include "../Entities/Mobs/ExperienceOrb.h" - -// 1.0.1 -#include "../Entities/MobType.h" - -// TU9 -#include "../Entities/Mobs/ItemFrame.h" - -// 1.2.3 -#include "../Entities/Mobs/AgeableMob.h" -#include "../Entities/TamableAnimal.h" - -// 1.6.4 -#include "../Entities/LeashFenceKnotEntity.h" -#include "../Entities/Mobs/MobGroupData.h" -#include "../Entities/OwnableEntity.h" -#include "../Entities/EntitySelector.h" -#include "../Entities/LivingEntity.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.entity.item.h b/Minecraft.World/Headers/net.minecraft.world.entity.item.h deleted file mode 100644 index 79f7fd07e..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.entity.item.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "../Entities/Mobs/Boat.h" -#include "../Blocks/FallingTile.h" -#include "../Entities/ItemEntity.h" -#include "../Entities/Mobs/Minecart.h" -#include "../Entities/MinecartChest.h" -#include "../Entities/MinecartContainer.h" -#include "../Entities/MinecartHopper.h" -#include "../Entities/MinecartFurnace.h" -#include "../Entities/MinecartRideable.h" -#include "../Entities/MinecartSpawner.h" -#include "../Entities/MinecartTNT.h" -#include "../Entities/Mobs/PrimedTnt.h" diff --git a/Minecraft.World/Headers/net.minecraft.world.entity.monster.h b/Minecraft.World/Headers/net.minecraft.world.entity.monster.h deleted file mode 100644 index 9102c6c6e..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.entity.monster.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include "../Entities/Enemy.h" -#include "../Entities/Monster.h" -#include "../Entities/Mobs/Creeper.h" -#include "../Entities/Mobs/Ghast.h" -#include "../Entities/Mobs/Giant.h" -#include "../Entities/Mobs/Zombie.h" -#include "../Entities/Mobs/PigZombie.h" -#include "../Entities/Mobs/Skeleton.h" -#include "../Entities/Mobs/Slime.h" -#include "../Entities/Mobs/Spider.h" - -// 1.8.2 -#include "../Entities/Mobs/CaveSpider.h" -#include "../Entities/Mobs/EnderMan.h" -#include "../Entities/Mobs/Silverfish.h" - -// 1.0.1 -#include "../Entities/Mobs/Blaze.h" -#include "../Entities/Mobs/LavaSlime.h" - -// 1.6.4 -#include "../Entities/Mobs/RangedAttackMob.h" -#include "../Entities/Mobs/SharedMonsterAttributes.h" -#include "../Entities/Mobs/Witch.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.entity.npc.h b/Minecraft.World/Headers/net.minecraft.world.entity.npc.h deleted file mode 100644 index 96f8f08f6..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.entity.npc.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#include "../Entities/Mobs/Npc.h" -#include "../Entities/Mobs/Villager.h" -#include "../Containers/ClientSideMerchant.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.entity.player.h b/Minecraft.World/Headers/net.minecraft.world.entity.player.h deleted file mode 100644 index 907614a52..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.entity.player.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#include "../Containers/Inventory.h" -#include "../Player/Player.h" -#include "../Player/Abilities.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.entity.projectile.h b/Minecraft.World/Headers/net.minecraft.world.entity.projectile.h deleted file mode 100644 index df0777e9b..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.entity.projectile.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include "../Entities/Mobs/Arrow.h" -#include "../Entities/Mobs/Fireball.h" -#include "../Entities/Mobs/FishingHook.h" -#include "../Entities/Mobs/Snowball.h" -#include "../Entities/Mobs/ThrownEgg.h" - -// 1.0.1 -#include "../Entities/Mobs/EyeOfEnderSignal.h" -#include "../Entities/Mobs/SmallFireball.h" -#include "../Entities/Throwable.h" -#include "../Entities/Mobs/ThrownEnderPearl.h" -#include "../Entities/Mobs/ThrownPotion.h" -#include "../Entities/Mobs/ThrownExpBottle.h" // Brought forward from 1.2 - -// Added TU 9 -#include "../Entities/Mobs/DragonFireball.h" - -// 1.6.4 -#include "../Entities/FireworksRocketEntity.h" -#include "../Entities/LargeFireball.h" -#include "../Entities/Projectile.h" -#include "../Entities/WitherSkull.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.food.h b/Minecraft.World/Headers/net.minecraft.world.food.h deleted file mode 100644 index 2b272b5e2..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.food.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -#include "../Util/FoodConstants.h" -#include "../Player/FoodData.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.h b/Minecraft.World/Headers/net.minecraft.world.h deleted file mode 100644 index fb211fc3f..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include "../Containers/CompoundContainer.h" -#include "../Containers/Container.h" -#include "../Util/Difficulty.h" -#include "../Containers/MouseInventoryClickHandler.h" -#include "net.minecraft.world.ContainerListener.h" -#include "../Containers/SimpleContainer.h" - -// TU10 -#include "../Util/Icon.h" -#include "../Util/IconRegister.h" -#include "../Util/FlippedIcon.h" - -#include "../Containers/WorldlyContainer.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.inventory.h b/Minecraft.World/Headers/net.minecraft.world.inventory.h deleted file mode 100644 index 58aa00f65..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.inventory.h +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include "../Containers/AbstractContainerMenu.h" -#include "../Containers/AnimalChest.h" -#include "../Containers/ArmorSlot.h" -#include "../Containers/BeaconMenu.h" -#include "net.minecraft.world.inventory.ContainerListener.h" -#include "../Containers/ContainerMenu.h" -#include "../Containers/CraftingContainer.h" -#include "../Containers/CraftingMenu.h" -#include "../Containers/FireworksMenu.h" -#include "../Containers/FurnaceMenu.h" -#include "../Containers/FurnaceResultSlot.h" -#include "../Containers/HopperMenu.h" -#include "../Containers/HorseInventoryMenu.h" -#include "../Containers/InventoryMenu.h" -#include "../Containers/MenuBackup.h" -#include "../Containers/ResultContainer.h" -#include "../Containers/ResultSlot.h" -#include "../Containers/Slot.h" -#include "../Containers/TrapMenu.h" -#include "../Containers/EnchantmentMenu.h" -#include "../Containers/EnchantmentSlot.h" -#include "../Containers/EnchantmentContainer.h" -#include "../Containers/BrewingStandMenu.h" -#include "../Containers/MerchantContainer.h" -#include "../Containers/MerchantMenu.h" -#include "../Containers/MerchantResultSlot.h" -#include "../Player/PlayerEnderChestContainer.h" -#include "../Containers/AnvilMenu.h" -#include "../Containers/RepairContainer.h" -#include "../Containers/RepairResultSlot.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.item.alchemy.h b/Minecraft.World/Headers/net.minecraft.world.item.alchemy.h deleted file mode 100644 index d60626895..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.item.alchemy.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#include "../Blocks/TileEntities/PotionBrewing.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.item.crafting.h b/Minecraft.World/Headers/net.minecraft.world.item.crafting.h deleted file mode 100644 index 0c49d9fa3..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.item.crafting.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include "../Recipes/Recipes.h" -#include "../Recipes/Recipy.h" -#include "../Recipes/ArmorDyeRecipe.h" -#include "../Recipes/ArmorRecipes.h" -#include "../Recipes/ClothDyeRecipes.h" -#include "../Recipes/FoodRecipes.h" -#include "../Recipes/FireworksRecipe.h" -#include "../Recipes/FurnaceRecipes.h" -#include "../Recipes/OreRecipes.h" -#include "../Recipes/ShapedRecipy.h" -#include "../Recipes/ShapelessRecipy.h" -#include "../Recipes/StructureRecipes.h" -#include "../Recipes/ToolRecipes.h" -#include "../Recipes/WeaponRecipes.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.item.enchantment.h b/Minecraft.World/Headers/net.minecraft.world.item.enchantment.h deleted file mode 100644 index 556d1c01d..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.item.enchantment.h +++ /dev/null @@ -1,24 +0,0 @@ -#pragma once - -#include "../Enchantments/DamageEnchantment.h" -#include "../Enchantments/DigDurabilityEnchantment.h" -#include "../Enchantments/DiggingEnchantment.h" -#include "../Enchantments/Enchantment.h" -#include "../Enchantments/EnchantmentCategory.h" -#include "../Enchantments/EnchantmentHelper.h" -#include "../Enchantments/EnchantmentInstance.h" -#include "../Enchantments/FireAspectEnchantment.h" -#include "../Enchantments/KnockbackEnchantment.h" -#include "../Enchantments/LootBonusEnchantment.h" -#include "../Enchantments/OxygenEnchantment.h" -#include "../Enchantments/ProtectionEnchantment.h" -#include "../Enchantments/UntouchingEnchantment.h" -#include "../Enchantments/WaterWorkerEnchantment.h" - -// 4J Stu - Brought forward -#include "../Enchantments/ArrowDamageEnchantment.h" -#include "../Enchantments/ArrowFireEnchantment.h" -#include "../Enchantments/ArrowInfiniteEnchantment.h" -#include "../Enchantments/ArrowKnockbackEnchantment.h" - -#include "../Enchantments/ThornsEnchantment.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.item.h b/Minecraft.World/Headers/net.minecraft.world.item.h deleted file mode 100644 index e560bd9f5..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.item.h +++ /dev/null @@ -1,87 +0,0 @@ -#pragma once - -#include "../Items/ArmorItem.h" -#include "../Items/BedItem.h" -#include "../Items/BoatItem.h" -#include "../Items/BowItem.h" -#include "../Items/BowlFoodItem.h" -#include "../Items/BucketItem.h" -#include "../Items/TileItems/WoolTileItem.h" -#include "../Items/CoalItem.h" -#include "../Items/ComplexItem.h" -#include "../Items/DiggerItem.h" -#include "../Items/DoorItem.h" -#include "../Items/DyePowderItem.h" -#include "../Items/EggItem.h" -#include "../Items/FishingRodItem.h" -#include "../Items/FlintAndSteelItem.h" -#include "../Items/FoodItem.h" -#include "../Items/HatchetItem.h" -#include "../Items/HoeItem.h" -#include "../Items/Item.h" -#include "../Items/ItemInstance.h" -#include "../Items/TileItems/LeafTileItem.h" -#include "../Items/MapItem.h" -#include "../Items/MinecartItem.h" -// #include "PaintingItem.h" -#include "../Items/PickaxeItem.h" -#include "../Items/TileItems/PistonTileItem.h" -#include "../Items/RecordingItem.h" -#include "../Items/RedstoneItem.h" -#include "../Items/SaddleItem.h" -#include "../Items/TileItems/SaplingTileItem.h" -#include "../Items/SeedItem.h" -#include "../Items/ShearsItem.h" -#include "../Items/ShovelItem.h" -#include "../Items/SignItem.h" -#include "../Items/SnowballItem.h" -#include "../Items/TileItems/StoneSlabTileItem.h" -#include "../Items/TileItems/TileItem.h" -#include "../Items/TileItems/PlanterTileItem.h" -#include "../Items/WeaponItem.h" - -// 1.8.2 -#include "../Items/TileItems/AuxDataTileItem.h" -#include "../Items/TileItems/ColoredTileItem.h" -#include "../Util/UseAnim.h" - -// 1.0.1 -#include "../Items/BottleItem.h" -#include "../Items/EnderEyeItem.h" -#include "../Items/EnderPearlItem.h" -#include "../Items/GoldenAppleItem.h" -#include "../Items/MilkBucketItem.h" -#include "../Items/PotionItem.h" -#include "../Util/Rarity.h" -#include "../Items/TileItems/WaterLilyTileItem.h" -#include "../Items/ExperienceItem.h" // 4J Stu brought forward - -// TU9 -#include "../Items/FireChargeItem.h" -#include "../Entities/Mobs/ItemFrame.h" -#include "../Items/SpawnEggItem.h" -#include "../Items/TileItems/MultiTextureTileItem.h" - -// TU12 -#include "../Items/TileItems/SkullItem.h" - -// TU14 -#include "../Items/TileItems/AnvilTileItem.h" -#include "../Items/BookItem.h" -#include "../Items/CarrotOnAStickItem.h" -#include "../Items/EnchantedBookItem.h" -#include "../Items/SeedFoodItem.h" - -// 1.6.4 -#include "../Items/FireworksChargeItem.h" -#include "../Items/FireworksItem.h" -#include "../Items/LeashItem.h" -#include "../Items/NameTagItem.h" -#include "../Items/SimpleFoiledItem.h" -#include "../Items/SnowItem.h" -#include "../Items/EmptyMapItem.h" - -// 4J Added -#include "../Items/ClockItem.h" -#include "../Items/CompassItem.h" -#include "../Util/HtmlString.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.item.trading.h b/Minecraft.World/Headers/net.minecraft.world.item.trading.h deleted file mode 100644 index fa8762ecd..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.item.trading.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#include "../Containers/Merchant.h" -#include "../Containers/MerchantRecipe.h" -#include "../Containers/MerchantRecipeList.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.level.biome.h b/Minecraft.World/Headers/net.minecraft.world.level.biome.h deleted file mode 100644 index 66861636e..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.level.biome.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once - -#include "../WorldGen/Biomes/Biome.h" -#include "../WorldGen/Biomes/ForestBiome.h" -#include "../WorldGen/Biomes/HellBiome.h" -#include "../WorldGen/Biomes/RainforestBiome.h" -#include "../WorldGen/Biomes/IceBiome.h" -#include "../WorldGen/Biomes/MushroomIslandBiome.h" -#include "../WorldGen/Biomes/TheEndBiome.h" -#include "../WorldGen/Structures/TheEndBiomeDecorator.h" -#include "../WorldGen/Features/WaterlilyFeature.h" -#include "../WorldGen/Biomes/SwampBiome.h" -#include "../WorldGen/Biomes/TaigaBiome.h" -#include "../Level/Storage/LevelSource.h" -#include "../WorldGen/Biomes/BiomeSource.h" -#include "../WorldGen/Biomes/FixedBiomeSource.h" - -// 1.8.2 -#include "../WorldGen/Biomes/BiomeCache.h" -#include "../WorldGen/Biomes/BiomeDecorator.h" -#include "../WorldGen/Biomes/DesertBiome.h" -#include "../WorldGen/Biomes/ExtremeHillsBiome.h" -#include "../WorldGen/Biomes/OceanBiome.h" -#include "../WorldGen/Biomes/PlainsBiome.h" -#include "../WorldGen/Biomes/RiverBiome.h" - -// 1.1 -#include "../WorldGen/Biomes/BeachBiome.h" - -// 1.2.3 -#include "../WorldGen/Biomes/JungleBiome.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.level.chunk.h b/Minecraft.World/Headers/net.minecraft.world.level.chunk.h deleted file mode 100644 index 4742b685d..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.level.chunk.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include "../Level/BlockReplacements.h" -#include "../Level/ChunkSource.h" -#include "../Level/Storage/DataLayer.h" -#include "../Level/EmptyLevelChunk.h" -#include "../Level/LevelChunk.h" -#include "../Level/Storage/ReadOnlyChunkCache.h" diff --git a/Minecraft.World/Headers/net.minecraft.world.level.chunk.storage.h b/Minecraft.World/Headers/net.minecraft.world.level.chunk.storage.h deleted file mode 100644 index 5e2c1528f..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.level.chunk.storage.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include "../Level/Storage/ChunkStorage.h" -#include "../Level/Storage/ChunkStorageProfileDecorator.h" -#include "../Level/Storage/MemoryChunkStorage.h" -#include "../Level/Storage/McRegionChunkStorage.h" -#include "../IO/NBT/NbtSlotFile.h" -#include "../Level/Storage/OldChunkStorage.h" -#include "../Level/Storage/RegionFile.h" -#include "../Level/Storage/RegionFileCache.h" -#include "../Level/Storage/ZonedChunkStorage.h" -#include "../Level/Storage/ZoneFile.h" -#include "../Level/Storage/ZoneIO.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.level.dimension.h b/Minecraft.World/Headers/net.minecraft.world.level.dimension.h deleted file mode 100644 index a44759836..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.level.dimension.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include "../Level/Dimensions/Dimension.h" -#include "../Level/Dimensions/HellDimension.h" -#include "../Level/Dimensions/NormalDimension.h" -#include "../Level/Dimensions/TheEndDimension.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.level.h b/Minecraft.World/Headers/net.minecraft.world.level.h deleted file mode 100644 index d1839f9ea..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.level.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include "../Level/BaseMobSpawner.h" -#include "../Level/BlockDestructionProgress.h" -#include "../Level/ChunkPos.h" -#include "../Util/Coord.h" -#include "../Level/Explosion.h" -#include "../Util/FoliageColor.h" -#include "../Level/GameRules.h" -#include "../Util/GrassColor.h" -#include "../Level/LevelConflictException.h" -#include "../Level/Events/LevelListener.h" -#include "../Level/Storage/LevelSource.h" -#include "../Util/LightLayer.h" -#include "../Blocks/MobSpawner.h" -#include "../Level/Storage/PortalForcer.h" -#include "../Level/Storage/Region.h" -#include "../Level/TickNextTickData.h" -#include "../Level/TileEventData.h" -#include "../Level/TilePos.h" -#include "../Util/WaterColor.h" -#include "../Level/Level.h" -#include "../Level/Storage/LevelType.h" -#include "../Level/Storage/LevelSettings.h" - -#include "../Level/Calendar.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.level.levelgen.feature.h b/Minecraft.World/Headers/net.minecraft.world.level.levelgen.feature.h deleted file mode 100644 index f0c147f25..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.level.levelgen.feature.h +++ /dev/null @@ -1,37 +0,0 @@ -#pragma once - -#include "../WorldGen/Features/BasicTreeFeature.h" -#include "../WorldGen/Features/BirchFeature.h" -#include "../WorldGen/Features/CactusFeature.h" -#include "../WorldGen/Features/CaveFeature.h" -#include "../WorldGen/Features/ClayFeature.h" -#include "../WorldGen/Features/DeadBushFeature.h" -#include "../WorldGen/Features/Feature.h" -#include "../WorldGen/Features/FlowerFeature.h" -#include "../WorldGen/Features/HellFireFeature.h" -#include "../WorldGen/Features/HellPortalFeature.h" -#include "../WorldGen/Features/HellSpringFeature.h" -#include "../WorldGen/Features/HouseFeature.h" -#include "../WorldGen/Features/LakeFeature.h" -#include "../WorldGen/Features/LightGemFeature.h" -#include "../WorldGen/Features/MonsterRoomFeature.h" -#include "../WorldGen/Features/OreFeature.h" -#include "../WorldGen/Features/PineFeature.h" -#include "../WorldGen/Features/PumpkinFeature.h" -#include "../WorldGen/Features/ReedsFeature.h" -#include "../WorldGen/Features/SpringFeature.h" -#include "../WorldGen/Features/SpruceFeature.h" -#include "../WorldGen/Features/TallGrassFeature.h" -#include "../WorldGen/Features/TreeFeature.h" - -#include "../WorldGen/Features/HugeMushroomFeature.h" -#include "../WorldGen/Features/SandFeature.h" -#include "../WorldGen/Features/SwampTreeFeature.h" -#include "../WorldGen/Features/BonusChestFeature.h" -#include "../WorldGen/Features/SpikeFeature.h" -#include "../WorldGen/Features/EndPodiumFeature.h" - -#include "../WorldGen/Features/DesertWellFeature.h" -#include "../WorldGen/Features/MegaTreeFeature.h" -#include "../WorldGen/Features/VinesFeature.h" -#include "../WorldGen/Features/GroundBushFeature.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.level.levelgen.flat.h b/Minecraft.World/Headers/net.minecraft.world.level.levelgen.flat.h deleted file mode 100644 index 0cfe19ebd..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.level.levelgen.flat.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -#include "../WorldGen/Flat/FlatGeneratorInfo.h" -#include "../WorldGen/Flat/FlatLayerInfo.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.level.levelgen.h b/Minecraft.World/Headers/net.minecraft.world.level.levelgen.h deleted file mode 100644 index 07bc30ee5..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.level.levelgen.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - -#include "../WorldGen/Features/CanyonFeature.h" -#include "../WorldGen/Features/DungeonFeature.h" -#include "../WorldGen/Sources/HellRandomLevelSource.h" -#include "../WorldGen/Sources/HellFlatLevelSource.h" -#include "../WorldGen/Features/LargeCaveFeature.h" -#include "../WorldGen/Features/LargeFeature.h" -#include "../WorldGen/Features/LargeHellCaveFeature.h" -#include "../Level/RandomLevelSource.h" -#include "../WorldGen/Sources/FlatLevelSource.h" -#include "../WorldGen/Features/TownFeature.h" -#include "../WorldGen/Sources/TheEndLevelRandomLevelSource.h" - -#include "../Level/CustomLevelSource.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.level.levelgen.structure.h b/Minecraft.World/Headers/net.minecraft.world.level.levelgen.structure.h deleted file mode 100644 index 98cbec5b0..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.level.levelgen.structure.h +++ /dev/null @@ -1,20 +0,0 @@ -#pragma once - -#include "../Level/BlockGenMethods.h" -#include "../Util/BoundingBox.h" -#include "../WorldGen/Features/MineShaftFeature.h" -#include "../WorldGen/Structures/MineShaftPieces.h" -#include "../WorldGen/Structures/MineShaftStart.h" -#include "../WorldGen/Features/NetherBridgeFeature.h" -#include "../WorldGen/Structures/NetherBridgePieces.h" -#include "../WorldGen/Features/StrongholdFeature.h" -#include "../WorldGen/Structures/StrongholdPieces.h" -#include "../WorldGen/Features/StructureFeature.h" -#include "../WorldGen/StructureFeatureIO.h" -#include "../WorldGen/StructureFeatureSavedData.h" -#include "../WorldGen/Structures/StructurePiece.h" -#include "../WorldGen/Structures/StructureStart.h" -#include "../WorldGen/Features/VillageFeature.h" -#include "../WorldGen/Structures/VillagePieces.h" -#include "../WorldGen/Features/RandomScatteredLargeFeature.h" -#include "../WorldGen/Structures/ScatteredFeaturePieces.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.level.levelgen.synth.h b/Minecraft.World/Headers/net.minecraft.world.level.levelgen.synth.h deleted file mode 100644 index d3b04d56a..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.level.levelgen.synth.h +++ /dev/null @@ -1,12 +0,0 @@ -#pragma once - -#include "../Util/Distort.h" -#include "../Util/Emboss.h" -#include "../WorldGen/Noise/FastNoise.h" -#include "../WorldGen/Noise/ImprovedNoise.h" -#include "../WorldGen/Noise/PerlinNoise.h" -#include "../WorldGen/Noise/PerlinSimplexNoise.h" -#include "../Util/Rotate.h" -#include "../Util/Scale.h" -#include "../WorldGen/Noise/SimplexNoise.h" -#include "../WorldGen/Noise/Synth.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.level.material.h b/Minecraft.World/Headers/net.minecraft.world.level.material.h deleted file mode 100644 index a686fa6d1..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.level.material.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -#include "../Blocks/DecorationMaterial.h" -#include "../Blocks/GasMaterial.h" -#include "../Blocks/LiquidMaterial.h" -#include "../Blocks/Material.h" -#include "../Blocks/MaterialColor.h" -#include "../Blocks/PortalMaterial.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.level.newbiome.layer.h b/Minecraft.World/Headers/net.minecraft.world.level.newbiome.layer.h deleted file mode 100644 index c77578b3d..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.level.newbiome.layer.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#include "../WorldGen/Layers/AddIslandLayer.h" -#include "../WorldGen/Layers/AddMushroomIslandLayer.h" -#include "../WorldGen/Layers/AddSnowLayer.h" -#include "../WorldGen/Layers/BiomeInitLayer.h" -#include "../WorldGen/Layers/DownfallLayer.h" -#include "../WorldGen/Layers/DownfallMixerLayer.h" -#include "../WorldGen/Layers/FlatLayer.h" -#include "../WorldGen/Layers/FuzzyZoomLayer.h" -#include "../WorldGen/Layers/IslandLayer.h" -#include "../WorldGen/Layers/Layer.h" -#include "../WorldGen/Layers/RiverInitLayer.h" -#include "../WorldGen/Layers/RiverLayer.h" -#include "../WorldGen/Layers/RiverMixerLayer.h" -#include "../WorldGen/Layers/ShoreLayer.h" -#include "../WorldGen/Layers/SmoothLayer.h" -#include "../WorldGen/Layers/SmoothZoomLayer.h" -#include "../WorldGen/Layers/TemperatureLayer.h" -#include "../WorldGen/Layers/TemperatureMixerLayer.h" -#include "../WorldGen/Layers/VoronoiZoom.h" -#include "../WorldGen/Layers/ZoomLayer.h" -#include "../WorldGen/Layers/GrowMushroomIslandLayer.h" // 4J added - -// 1.1. -#include "../WorldGen/Layers/RegionHillsLayer.h" -#include "../WorldGen/Layers/SwampRiversLayer.h" diff --git a/Minecraft.World/Headers/net.minecraft.world.level.pathfinder.h b/Minecraft.World/Headers/net.minecraft.world.level.pathfinder.h deleted file mode 100644 index cb5731660..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.level.pathfinder.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include "../Util/BinaryHeap.h" -#include "../AI/Navigation/Node.h" -#include "../AI/Navigation/Path.h" -#include "../AI/Navigation/PathFinder.h" diff --git a/Minecraft.World/Headers/net.minecraft.world.level.redstone.h b/Minecraft.World/Headers/net.minecraft.world.level.redstone.h deleted file mode 100644 index cea785b1c..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.level.redstone.h +++ /dev/null @@ -1,3 +0,0 @@ -#pragma once - -#include "../Level/Redstone.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.level.saveddata.h b/Minecraft.World/Headers/net.minecraft.world.level.saveddata.h deleted file mode 100644 index 71ee2f91e..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.level.saveddata.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -#include "../Level/Storage/SavedData.h" -#include "../Level/Storage/MapItemSavedData.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.level.storage.h b/Minecraft.World/Headers/net.minecraft.world.level.storage.h deleted file mode 100644 index 7d9fc08d7..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.level.storage.h +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include "../Level/Storage/DirectoryLevelStorage.h" -#include "../Level/Storage/DirectoryLevelStorageSource.h" -#include "../Level/LevelData.h" -#include "../Level/Storage/LevelStorage.h" -#include "../Level/Storage/LevelStorageProfilerDecorator.h" -#include "../Level/Storage/LevelStorageSource.h" -#include "../Level/Storage/LevelSummary.h" -#include "../Level/Storage/McRegionLevelStorage.h" -#include "../Level/Storage/McRegionLevelStorageSource.h" -// #include "../Level/Storage/MemoryLevelStorage.h" // 4J removed as unused -// #include "../Level/Storage/MemoryLevelStorageSource.h" // 4J removed as -// unused -#include "../Level/Storage/MockedLevelStorage.h" -#include "../Level/Storage/PlayerIO.h" -#include "../Level/Storage/SavedDataStorage.h" diff --git a/Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h b/Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h deleted file mode 100644 index 77a97cac5..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.level.tile.entity.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include "../Blocks/TileEntities/BeaconTileEntity.h" -#include "../Blocks/TileEntities/BrewingStandTileEntity.h" -#include "../Blocks/TileEntities/ChestTileEntity.h" -#include "../Blocks/TileEntities/CommandBlockEntity.h" -#include "../Blocks/TileEntities/ComparatorTileEntity.h" -#include "../Blocks/TileEntities/DaylightDetectorTileEntity.h" -#include "../Blocks/TileEntities/DispenserTileEntity.h" -#include "../Blocks/TileEntities/DropperTileEntity.h" -#include "../Blocks/TileEntities/EnchantmentTableTileEntity.h" -#include "../Blocks/TileEntities/FurnaceTileEntity.h" -#include "../Blocks/TileEntities/Hopper.h" -#include "../Blocks/TileEntities/HopperTileEntity.h" -#include "../Blocks/TileEntities/MobSpawnerTileEntity.h" -#include "../Blocks/TileEntities/MusicTileEntity.h" -#include "../Blocks/TileEntities/SignTileEntity.h" -#include "../Blocks/TileEntities/TileEntity.h" -#include "../Blocks/PistonMovingTileEntity.h" -#include "../Blocks/TileEntities/TheEndPortalTileEntity.h" -#include "../Blocks/TileEntities/SkullTileEntity.h" -#include "../Blocks/TileEntities/EnderChestTileEntity.h" diff --git a/Minecraft.World/Headers/net.minecraft.world.level.tile.h b/Minecraft.World/Headers/net.minecraft.world.level.tile.h deleted file mode 100644 index ad30850c8..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.level.tile.h +++ /dev/null @@ -1,131 +0,0 @@ -#pragma once - -#include "../Blocks/Tile.h" -#include "../Blocks/AirTile.h" -#include "../Blocks/AnvilTile.h" -#include "../Blocks/BaseEntityTile.h" -#include "../Blocks/BasePressurePlateTile.h" -#include "../Blocks/BaseRailTile.h" -#include "../Blocks/BeaconTile.h" -#include "../Blocks/BedTile.h" -#include "../Blocks/BookshelfTile.h" -#include "../Blocks/BrewingStandTile.h" -#include "../Blocks/PlantTile.h" -#include "../Blocks/ButtonTile.h" -#include "../Blocks/CactusTile.h" -#include "../Blocks/CakeTile.h" -#include "../Blocks/CarrotTile.h" -#include "../Blocks/CauldronTile.h" -#include "../Blocks/ChestTile.h" -#include "../Blocks/ClayTile.h" -#include "../Blocks/CocoaTile.h" -#include "../Blocks/ColoredTile.h" -#include "../Blocks/CommandBlock.h" -#include "../Blocks/ComparatorTile.h" -#include "../Blocks/CoralTile.h" -#include "../Blocks/CropTile.h" -#include "../Blocks/DaylightDetectorTile.h" -#include "../Blocks/DeadBushTile.h" -#include "../Blocks/DetectorRailTile.h" -#include "../Blocks/DiodeTile.h" -#include "../Blocks/DirectionalTile.h" -#include "../Blocks/DirtTile.h" -#include "../Blocks/DispenserTile.h" -#include "../Blocks/DoorTile.h" -#include "../Blocks/DropperTile.h" -#include "../Blocks/EggTile.h" -#include "../Blocks/EnchantmentTableTile.h" -#include "../Blocks/EnderChestTile.h" -#include "../Blocks/TileEntities/EntityTile.h" -#include "../Blocks/FarmTile.h" -#include "../Blocks/FenceGateTile.h" -#include "../Blocks/FenceTile.h" -#include "../Blocks/FireTile.h" -#include "../Blocks/FlowerPotTile.h" -#include "../Blocks/FurnaceTile.h" -#include "../Blocks/GlassTile.h" -#include "../Blocks/GlowstoneTile.h" -#include "../Blocks/GrassTile.h" -#include "../Blocks/GravelTile.h" -#include "../Blocks/HalfSlabTile.h" -#include "../Blocks/HalfTransparentTile.h" -#include "../Blocks/HayBlockTile.h" -#include "../Blocks/HeavyTile.h" -#include "../Blocks/HopperTile.h" -#include "../Blocks/HugeMushroomTile.h" -#include "../Blocks/IceTile.h" -#include "../Blocks/JukeboxTile.h" -#include "../Blocks/LadderTile.h" -#include "../Blocks/LeafTile.h" -#include "../Level/Events/LevelEvent.h" -#include "../Blocks/LeverTile.h" -#include "../Blocks/LiquidTile.h" -#include "../Blocks/LiquidTileDynamic.h" -#include "../Blocks/LiquidTileStatic.h" -#include "../Blocks/LockedChestTile.h" -#include "../Blocks/MelonTile.h" -#include "../Blocks/MetalTile.h" -#include "../Blocks/MobSpawnerTile.h" -#include "../Blocks/MushroomPlantTile.h" -#include "../Blocks/NoteBlockTile.h" -#include "../Blocks/MycelTile.h" -#include "../Blocks/NetherrackTile.h" -#include "../Blocks/NetherWartTile.h" -#include "../Blocks/NotGateTile.h" -#include "../Blocks/ObsidianTile.h" -#include "../Blocks/OreTile.h" -#include "../Blocks/PistonBaseTile.h" -#include "../Blocks/PistonExtensionTile.h" -#include "../Blocks/PortalTile.h" -#include "../Blocks/PotatoTile.h" -#include "../Blocks/PoweredMetalTile.h" -#include "../Blocks/PoweredRailTile.h" -#include "../Blocks/PressurePlateTile.h" -#include "../Blocks/PumpkinTile.h" -#include "../Blocks/QuartzBlockTile.h" -#include "../Blocks/RailTile.h" -#include "../Blocks/RedLightTile.h" -#include "../Blocks/RedStoneDustTile.h" -#include "../Blocks/RedStoneOreTile.h" -#include "../Blocks/ReedTile.h" -#include "../Blocks/RepeaterTile.h" -#include "../Blocks/RotatedPillarTile.h" -#include "../Blocks/SandStoneTile.h" -#include "../Blocks/SaplingPlantTile.h" -#include "../Blocks/SignTile.h" -#include "../Blocks/SkullTile.h" -#include "../Blocks/SmoothStoneBrickTile.h" -#include "../Blocks/SnowTile.h" -#include "../Blocks/SoulSandTile.h" -#include "../Blocks/SpongeTile.h" -#include "../Blocks/StainedGlassBlock.h" -#include "../Blocks/StainedGlassPaneBlock.h" -#include "../Blocks/StairTile.h" -#include "../Blocks/StemTile.h" -#include "../Blocks/StoneButtonTile.h" -#include "../Blocks/StoneMonsterTile.h" -#include "../Blocks/StoneSlabTile.h" -#include "../Blocks/StoneTile.h" -#include "../Blocks/TallGrassPlantTile.h" -#include "../Blocks/TheEndPortalTile.h" -#include "../Blocks/TheEndPortalFrameTile.h" -#include "../Blocks/ThinFenceTile.h" -#include "../Blocks/TntTile.h" -#include "../Blocks/TopSnowTile.h" -#include "../Blocks/TorchTile.h" -#include "../Blocks/TransparentTile.h" -#include "../Blocks/TrapDoorTile.h" -#include "../Blocks/TreeTile.h" -#include "../Blocks/TripWireSourceTile.h" -#include "../Blocks/TripWireTile.h" -#include "../Blocks/VineTile.h" -#include "../Blocks/WallTile.h" -#include "../Blocks/WaterLilyTile.h" -#include "../Blocks/WebTile.h" -#include "../Blocks/WeightedPressurePlateTile.h" -#include "../Blocks/WoodButtonTile.h" -#include "../Blocks/WorkbenchTile.h" -#include "../Blocks/WoodTile.h" -#include "../Blocks/HalfSlabTile.h" -#include "../Blocks/WoodSlabTile.h" -#include "../Blocks/WoolCarpetTile.h" diff --git a/Minecraft.World/Headers/net.minecraft.world.level.tile.piston.h b/Minecraft.World/Headers/net.minecraft.world.level.tile.piston.h deleted file mode 100644 index f6de64b54..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.level.tile.piston.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include "../Blocks/PistonBaseTile.h" -#include "../Blocks/PistonExtensionTile.h" -#include "../Blocks/PistonMovingTileEntity.h" -#include "../Blocks/TileEntities/PistonPieceTileEntity.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.phys.h b/Minecraft.World/Headers/net.minecraft.world.phys.h deleted file mode 100644 index cdc742b2a..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.phys.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once -#include "../Util/AABB.h" -#include "../Util/HitResult.h" -#include "../Util/Vec3.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.scores.criteria.h b/Minecraft.World/Headers/net.minecraft.world.scores.criteria.h deleted file mode 100644 index 74dd60806..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.scores.criteria.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#include "../Scores/Criteria/DummyCriteria.h" -#include "../Scores/Criteria/HealthCriteria.h" -#include "../Scores/Criteria/ObjectiveCriteria.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.scores.h b/Minecraft.World/Headers/net.minecraft.world.scores.h deleted file mode 100644 index 0a7dbc3f0..000000000 --- a/Minecraft.World/Headers/net.minecraft.world.scores.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include "../Scores/Objective.h" -#include "../Scores/PlayerTeam.h" -#include "../Scores/Score.h" -#include "../Scores/Scoreboard.h" -#include "../Scores/ScoreboardSaveData.h" -#include "../Scores/ScoreHolder.h" -#include "../Scores/Team.h" \ No newline at end of file diff --git a/Minecraft.World/Items/EggItem.cpp b/Minecraft.World/Items/EggItem.cpp deleted file mode 100644 index b47cf12da..000000000 --- a/Minecraft.World/Items/EggItem.cpp +++ /dev/null @@ -1,29 +0,0 @@ - -#include "../Platform/stdafx.h" -#include "../Headers/com.mojang.nbt.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.entity.global.h" -#include "../Headers/net.minecraft.world.entity.projectile.h" -#include "EggItem.h" -#include "../Util/SoundTypes.h" - -EggItem::EggItem(int id) : Item(id) { maxStackSize = 16; } - -std::shared_ptr EggItem::use( - std::shared_ptr instance, Level* level, - std::shared_ptr player) { - if (!player->abilities.instabuild) { - instance->count--; - } - level->playEntitySound(player, eSoundType_RANDOM_BOW, 0.5f, - 0.4f / (random->nextFloat() * 0.4f + 0.8f)); - if (!level->isClientSide) - level->addEntity( - std::shared_ptr(new ThrownEgg(level, player))); - return instance; -} diff --git a/Minecraft.World/Platform/stdafx.h b/Minecraft.World/Platform/stdafx.h index 5f03e70a1..a56f2e4b1 100644 --- a/Minecraft.World/Platform/stdafx.h +++ b/Minecraft.World/Platform/stdafx.h @@ -16,7 +16,7 @@ #include #include #include -#include "../../Minecraft.Client/Platform/Linux/Stubs/LinuxStubs.h" +#include "../../Minecraft.Client/Linux/Stubs/LinuxStubs.h" #else #include #include @@ -26,7 +26,7 @@ #include -#include "x64headers/extraX64.h" +#include "../x64headers/extraX64.h" #include #include @@ -43,17 +43,17 @@ #include -#include "../Util/Definitions.h" -#include "../Util/Class.h" -#include "../Util/Exceptions.h" -#include "../Util/Mth.h" -#include "../Util/StringHelpers.h" -#include "../Util/ArrayWithLength.h" -#include "../Util/Random.h" -#include "../Level/TilePos.h" -#include "../Level/ChunkPos.h" -#include "../IO/Streams/Compression.h" -#include "../Util/PerformanceTimer.h" +#include "../ConsoleHelpers/Definitions.h" +#include "../ConsoleJavaLibs/Class.h" +#include "../ConsoleJavaLibs/Exceptions.h" +#include "../net/minecraft/util/Mth.h" +#include "../ConsoleHelpers/StringHelpers.h" +#include "../ConsoleHelpers/ArrayWithLength.h" +#include "../ConsoleJavaLibs/Random.h" +#include "../net/minecraft/world/level/TilePos.h" +#include "../net/minecraft/world/level/ChunkPos.h" +#include "compression.h" +#include "../ConsoleHelpers/PerformanceTimer.h" #ifdef _FINAL_BUILD #define printf BREAKTHECOMPILE @@ -78,39 +78,39 @@ void MemSect(int sect); #include "4J_Input.h" #endif -#include "../../Minecraft.Client/Platform/Common/Network/GameNetworkManager.h" +#include "../../Minecraft.Client/Common/Source Files/Network/GameNetworkManager.h" -#include "../../Minecraft.Client/Platform/Common/UI/UIEnums.h" -#include "../../Minecraft.Client/Platform/Common/App_Defines.h" -#include "../../Minecraft.Client/Platform/Common/App_enums.h" -#include "../../Minecraft.Client/Platform/Common/Tutorial/TutorialEnum.h" -#include "../../Minecraft.Client/Platform/Common/App_structs.h" +#include "../../Minecraft.Client/Common/Source Files/UI/All Platforms/UIEnums.h" +#include "../../Minecraft.Client/Common/App_Defines.h" +#include "../../Minecraft.Client/Common/App_enums.h" +#include "../../Minecraft.Client/Common/Source Files/Tutorial/TutorialEnum.h" +#include "../../Minecraft.Client/Common/App_structs.h" -#include "../../Minecraft.Client/Platform/Common/Consoles_App.h" -#include "../../Minecraft.Client/Platform/Common/Minecraft_Macros.h" -#include "../../Minecraft.Client/Platform/Common/Colours/ColourTable.h" +#include "../../Minecraft.Client/Common/Consoles_App.h" +#include "../../Minecraft.Client/Common/Minecraft_Macros.h" +#include "../../Minecraft.Client/Common/Source Files/Colours/ColourTable.h" -#include "../../Minecraft.Client/Platform/Common/BuildVer.h" +#include "../../Minecraft.Client/Common/Source Files/BuildVer/BuildVer.h" // This is generated at build time via scripts/pack_loc.py #include "strings.h" #ifdef _WINDOWS64 -#include "../../Minecraft.Client/Platform/Windows64/Windows64_App.h" -#include "../../Minecraft.Client/Platform/Windows64/Sentient/SentientTelemetryCommon.h" -#include "../../Minecraft.Client/Platform/Windows64/Sentient/MinecraftTelemetry.h" +#include "../../Minecraft.Client/Windows64/Windows64_App.h" +#include "../../Minecraft.Client/Windows64/Source Files/Sentient/SentientTelemetryCommon.h" +#include "../../Minecraft.Client/Windows64/Source Files/Sentient/MinecraftTelemetry.h" #else // Use the Linux runtime path with supported metadata/config headers only. -#include "../../Minecraft.Client/Platform/Linux/Linux_App.h" -#include "../../Minecraft.Client/Platform/Linux/Sentient/SentientTelemetryCommon.h" -#include "../../Minecraft.Client/Platform/Linux/Sentient/DynamicConfigurations.h" -#include "../../Minecraft.Client/Platform/Windows64/GameConfig/Minecraft.spa.h" +#include "../../Minecraft.Client/Linux/Linux_App.h" +#include "../../Minecraft.Client/Windows64/Source Files/Sentient/SentientTelemetryCommon.h" +#include "../../Minecraft.Client/Windows64/Source Files/Sentient/DynamicConfigurations.h" +#include "../../Minecraft.Client/Header Files/Minecraft.spa.h" #endif -#include "../../Minecraft.Client/Platform/Common/DLC/DLCSkinFile.h" -#include "../../Minecraft.Client/Platform/Common/Console_Awards_enum.h" -#include "../../Minecraft.Client/Platform/Common/Potion_Macros.h" -#include "../../Minecraft.Client/Platform/Common/Console_Debug_enum.h" -#include "../../Minecraft.Client/Platform/Common/GameRules/ConsoleGameRulesConstants.h" -#include "../../Minecraft.Client/Platform/Common/GameRules/ConsoleGameRules.h" -#include "../../Minecraft.Client/Platform/Common/Telemetry/TelemetryManager.h" +#include "../../Minecraft.Client/Common/Source Files/DLC/DLCSkinFile.h" +#include "../../Minecraft.Client/Common/Source Files/Console_Awards_enum.h" +#include "../../Minecraft.Client/Common/Potion_Macros.h" +#include "../../Minecraft.Client/Common/Source Files/Console_Debug_enum.h" +#include "../../Minecraft.Client/Common/Source Files/GameRules/ConsoleGameRulesConstants.h" +#include "../../Minecraft.Client/Common/Source Files/GameRules/ConsoleGameRules.h" +#include "../../Minecraft.Client/Common/Source Files/Telemetry/TelemetryManager.h" diff --git a/Minecraft.World/Platform/Minecraft.World.cpp b/Minecraft.World/Source Files/Minecraft.World.cpp similarity index 57% rename from Minecraft.World/Platform/Minecraft.World.cpp rename to Minecraft.World/Source Files/Minecraft.World.cpp index 3770f4c39..9d3a235f3 100644 --- a/Minecraft.World/Platform/Minecraft.World.cpp +++ b/Minecraft.World/Source Files/Minecraft.World.cpp @@ -1,23 +1,23 @@ -#include "stdafx.h" +#include "../Header Files/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.item.alchemy.h" -#include "../Headers/net.minecraft.world.item.crafting.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" -#include "../Headers/net.minecraft.world.level.chunk.h" -#include "../Headers/net.minecraft.world.level.chunk.storage.h" -#include "../Headers/net.minecraft.world.level.levelgen.structure.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.monster.h" -#include "../Headers/net.minecraft.world.entity.npc.h" -#include "../Headers/net.minecraft.world.effect.h" +#include "../net/minecraft/world/item/net.minecraft.world.item.h" +#include "../net/minecraft/world/item/alchemy/net.minecraft.world.item.alchemy.h" +#include "../net/minecraft/world/item/crafting/net.minecraft.world.item.crafting.h" +#include "../net/minecraft/world/item/enchantment/net.minecraft.world.item.enchantment.h" +#include "../net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h" +#include "../net/minecraft/world/level/chunk/storage/net.minecraft.world.level.chunk.storage.h" +#include "../net/minecraft/world/level/levelgen/structure/net.minecraft.world.level.levelgen.structure.h" +#include "../net/minecraft/world/level/tile/net.minecraft.world.level.tile.h" +#include "../net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../net/minecraft/world/entity/net.minecraft.world.entity.h" +#include "../net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h" +#include "../net/minecraft/world/entity/npc/net.minecraft.world.entity.npc.h" +#include "../net/minecraft/world/effect/net.minecraft.world.effect.h" -#include "Minecraft.World.h" -#include "../../Minecraft.Client/Level/ServerLevel.h" +#include "../Header Files/Minecraft.World.h" +#include "../../Minecraft.Client/net/minecraft/server/level/ServerLevel.h" -#include "../Stats/CommonStats.h" +#include "../net/minecraft/stats/CommonStats.h" void MinecraftWorld_RunStaticCtors() { // The ordering of these static ctors can be important. If they are within diff --git a/Minecraft.World/IO/Streams/Compression.cpp b/Minecraft.World/Source Files/compression.cpp similarity index 99% rename from Minecraft.World/IO/Streams/Compression.cpp rename to Minecraft.World/Source Files/compression.cpp index 91c840fa3..0237fe7de 100644 --- a/Minecraft.World/IO/Streams/Compression.cpp +++ b/Minecraft.World/Source Files/compression.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "Compression.h" +#include "../Header Files/stdafx.h" +#include "../Header Files/compression.h" #if defined(_WIN64) || defined(__linux__) // zconf.h defines "typedef unsigned char Byte" which conflicts with the // project's "class Byte" from BasicTypeContainers.h (via stdafx.h). diff --git a/Minecraft.World/Platform/stdafx.cpp b/Minecraft.World/Source Files/stdafx.cpp similarity index 88% rename from Minecraft.World/Platform/stdafx.cpp rename to Minecraft.World/Source Files/stdafx.cpp index 8e08093d4..0979d0e47 100644 --- a/Minecraft.World/Platform/stdafx.cpp +++ b/Minecraft.World/Source Files/stdafx.cpp @@ -2,7 +2,7 @@ // Minecraft.World.pch will be the pre-compiled header // stdafx.obj will contain the pre-compiled type information -#include "stdafx.h" +#include "../Header Files/stdafx.h" // TODO: reference any additional headers you need in STDAFX.H // and not in this file diff --git a/Minecraft.World/IO/NBT/ByteArrayTag.h b/Minecraft.World/com/mojang/nbt/ByteArrayTag.h similarity index 97% rename from Minecraft.World/IO/NBT/ByteArrayTag.h rename to Minecraft.World/com/mojang/nbt/ByteArrayTag.h index 63170e585..35bb29314 100644 --- a/Minecraft.World/IO/NBT/ByteArrayTag.h +++ b/Minecraft.World/com/mojang/nbt/ByteArrayTag.h @@ -1,6 +1,6 @@ #pragma once #include "Tag.h" -#include "../../Platform/System.h" +#include "../../../ConsoleJavaLibs/System.h" class ByteArrayTag : public Tag { public: diff --git a/Minecraft.World/IO/NBT/ByteTag.h b/Minecraft.World/com/mojang/nbt/ByteTag.h similarity index 100% rename from Minecraft.World/IO/NBT/ByteTag.h rename to Minecraft.World/com/mojang/nbt/ByteTag.h diff --git a/Minecraft.World/IO/NBT/CompoundTag.h b/Minecraft.World/com/mojang/nbt/CompoundTag.h similarity index 100% rename from Minecraft.World/IO/NBT/CompoundTag.h rename to Minecraft.World/com/mojang/nbt/CompoundTag.h diff --git a/Minecraft.World/IO/NBT/DoubleTag.h b/Minecraft.World/com/mojang/nbt/DoubleTag.h similarity index 91% rename from Minecraft.World/IO/NBT/DoubleTag.h rename to Minecraft.World/com/mojang/nbt/DoubleTag.h index 319c9bb33..7999b7b57 100644 --- a/Minecraft.World/IO/NBT/DoubleTag.h +++ b/Minecraft.World/com/mojang/nbt/DoubleTag.h @@ -1,5 +1,5 @@ #pragma once -#include "../Streams/InputOutputStream.h" +#include "../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "Tag.h" class DoubleTag : public Tag { diff --git a/Minecraft.World/IO/NBT/EndTag.h b/Minecraft.World/com/mojang/nbt/EndTag.h similarity index 100% rename from Minecraft.World/IO/NBT/EndTag.h rename to Minecraft.World/com/mojang/nbt/EndTag.h diff --git a/Minecraft.World/IO/NBT/FloatTag.h b/Minecraft.World/com/mojang/nbt/FloatTag.h similarity index 91% rename from Minecraft.World/IO/NBT/FloatTag.h rename to Minecraft.World/com/mojang/nbt/FloatTag.h index 7651d761c..d9b2cb24e 100644 --- a/Minecraft.World/IO/NBT/FloatTag.h +++ b/Minecraft.World/com/mojang/nbt/FloatTag.h @@ -1,5 +1,5 @@ #pragma once -#include "../Streams/InputOutputStream.h" +#include "../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "Tag.h" class FloatTag : public Tag { diff --git a/Minecraft.World/IO/NBT/IntArrayTag.h b/Minecraft.World/com/mojang/nbt/IntArrayTag.h similarity index 97% rename from Minecraft.World/IO/NBT/IntArrayTag.h rename to Minecraft.World/com/mojang/nbt/IntArrayTag.h index 626d042d7..40420b3e2 100644 --- a/Minecraft.World/IO/NBT/IntArrayTag.h +++ b/Minecraft.World/com/mojang/nbt/IntArrayTag.h @@ -1,7 +1,7 @@ #pragma once #include "Tag.h" -#include "../../Platform/System.h" +#include "../../../ConsoleJavaLibs/System.h" class IntArrayTag : public Tag { public: diff --git a/Minecraft.World/IO/NBT/IntTag.h b/Minecraft.World/com/mojang/nbt/IntTag.h similarity index 100% rename from Minecraft.World/IO/NBT/IntTag.h rename to Minecraft.World/com/mojang/nbt/IntTag.h diff --git a/Minecraft.World/IO/NBT/ListTag.h b/Minecraft.World/com/mojang/nbt/ListTag.h similarity index 100% rename from Minecraft.World/IO/NBT/ListTag.h rename to Minecraft.World/com/mojang/nbt/ListTag.h diff --git a/Minecraft.World/IO/NBT/LongTag.h b/Minecraft.World/com/mojang/nbt/LongTag.h similarity index 100% rename from Minecraft.World/IO/NBT/LongTag.h rename to Minecraft.World/com/mojang/nbt/LongTag.h diff --git a/Minecraft.World/IO/NBT/NbtIO.cpp b/Minecraft.World/com/mojang/nbt/NbtIo.cpp similarity index 93% rename from Minecraft.World/IO/NBT/NbtIO.cpp rename to Minecraft.World/com/mojang/nbt/NbtIo.cpp index f6c39040c..eda1841ec 100644 --- a/Minecraft.World/IO/NBT/NbtIO.cpp +++ b/Minecraft.World/com/mojang/nbt/NbtIo.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../Streams/InputOutputStream.h" -#include "NbtIO.h" +#include "../../../Header Files/stdafx.h" +#include "../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "NbtIo.h" CompoundTag* NbtIo::readCompressed(InputStream* in) { MemSect(26); diff --git a/Minecraft.World/IO/NBT/NbtIO.h b/Minecraft.World/com/mojang/nbt/NbtIo.h similarity index 100% rename from Minecraft.World/IO/NBT/NbtIO.h rename to Minecraft.World/com/mojang/nbt/NbtIo.h diff --git a/Minecraft.World/IO/NBT/ShortTag.h b/Minecraft.World/com/mojang/nbt/ShortTag.h similarity index 100% rename from Minecraft.World/IO/NBT/ShortTag.h rename to Minecraft.World/com/mojang/nbt/ShortTag.h diff --git a/Minecraft.World/IO/NBT/StringTag.h b/Minecraft.World/com/mojang/nbt/StringTag.h similarity index 100% rename from Minecraft.World/IO/NBT/StringTag.h rename to Minecraft.World/com/mojang/nbt/StringTag.h diff --git a/Minecraft.World/IO/NBT/Tag.cpp b/Minecraft.World/com/mojang/nbt/Tag.cpp similarity index 98% rename from Minecraft.World/IO/NBT/Tag.cpp rename to Minecraft.World/com/mojang/nbt/Tag.cpp index 14115ae3a..8d7f89bce 100644 --- a/Minecraft.World/IO/NBT/Tag.cpp +++ b/Minecraft.World/com/mojang/nbt/Tag.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" #include "Tag.h" #include "EndTag.h" #include "ByteTag.h" diff --git a/Minecraft.World/IO/NBT/Tag.h b/Minecraft.World/com/mojang/nbt/Tag.h similarity index 95% rename from Minecraft.World/IO/NBT/Tag.h rename to Minecraft.World/com/mojang/nbt/Tag.h index a4c8ea07d..3c32df1c1 100644 --- a/Minecraft.World/IO/NBT/Tag.h +++ b/Minecraft.World/com/mojang/nbt/Tag.h @@ -1,6 +1,6 @@ #pragma once #include -#include "../Streams/InputOutputStream.h" +#include "../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" class Tag { public: diff --git a/Minecraft.World/com/mojang/nbt/com.mojang.nbt.h b/Minecraft.World/com/mojang/nbt/com.mojang.nbt.h new file mode 100644 index 000000000..7edae5e04 --- /dev/null +++ b/Minecraft.World/com/mojang/nbt/com.mojang.nbt.h @@ -0,0 +1,2 @@ +#pragma once +#include "NbtIo.h" \ No newline at end of file diff --git a/Minecraft.World/Util/Direction.cpp b/Minecraft.World/net/minecraft/Direction.cpp similarity index 97% rename from Minecraft.World/Util/Direction.cpp rename to Minecraft.World/net/minecraft/Direction.cpp index bac1a79af..ca3ece296 100644 --- a/Minecraft.World/Util/Direction.cpp +++ b/Minecraft.World/net/minecraft/Direction.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../Header Files/stdafx.h" #include "Direction.h" #include "Facing.h" diff --git a/Minecraft.World/Util/Direction.h b/Minecraft.World/net/minecraft/Direction.h similarity index 100% rename from Minecraft.World/Util/Direction.h rename to Minecraft.World/net/minecraft/Direction.h diff --git a/Minecraft.World/Util/Facing.cpp b/Minecraft.World/net/minecraft/Facing.cpp similarity index 90% rename from Minecraft.World/Util/Facing.cpp rename to Minecraft.World/net/minecraft/Facing.cpp index 4476da038..d5b9f9fc4 100644 --- a/Minecraft.World/Util/Facing.cpp +++ b/Minecraft.World/net/minecraft/Facing.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../Header Files/stdafx.h" #include "Facing.h" const int Facing::OPPOSITE_FACING[6] = {UP, DOWN, SOUTH, NORTH, EAST, WEST}; diff --git a/Minecraft.World/Util/Facing.h b/Minecraft.World/net/minecraft/Facing.h similarity index 100% rename from Minecraft.World/Util/Facing.h rename to Minecraft.World/net/minecraft/Facing.h diff --git a/Minecraft.World/Util/Pos.cpp b/Minecraft.World/net/minecraft/Pos.cpp similarity index 98% rename from Minecraft.World/Util/Pos.cpp rename to Minecraft.World/net/minecraft/Pos.cpp index 194765f4a..181523e6d 100644 --- a/Minecraft.World/Util/Pos.cpp +++ b/Minecraft.World/net/minecraft/Pos.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../Header Files/stdafx.h" #include "Pos.h" diff --git a/Minecraft.World/Util/Pos.h b/Minecraft.World/net/minecraft/Pos.h similarity index 100% rename from Minecraft.World/Util/Pos.h rename to Minecraft.World/net/minecraft/Pos.h diff --git a/Minecraft.World/Util/SharedConstants.cpp b/Minecraft.World/net/minecraft/SharedConstants.cpp similarity index 88% rename from Minecraft.World/Util/SharedConstants.cpp rename to Minecraft.World/net/minecraft/SharedConstants.cpp index 77077c19e..73f3afdbb 100644 --- a/Minecraft.World/Util/SharedConstants.cpp +++ b/Minecraft.World/net/minecraft/SharedConstants.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../IO/Files/File.h" -#include "../IO/Streams/InputOutputStream.h" +#include "../../Header Files/stdafx.h" +#include "../../ConsoleJavaLibs/File.h" +#include "../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "SharedConstants.h" const std::wstring SharedConstants::VERSION_STRING = L"1.6.4"; diff --git a/Minecraft.World/Util/SharedConstants.h b/Minecraft.World/net/minecraft/SharedConstants.h similarity index 95% rename from Minecraft.World/Util/SharedConstants.h rename to Minecraft.World/net/minecraft/SharedConstants.h index 94c0e1dc4..45466b8e6 100644 --- a/Minecraft.World/Util/SharedConstants.h +++ b/Minecraft.World/net/minecraft/SharedConstants.h @@ -1,6 +1,6 @@ #pragma once -#include "Class.h" +#include "../../ConsoleJavaLibs/Class.h" class SharedConstants { public: diff --git a/Minecraft.World/Commands/AdminLogCommand.h b/Minecraft.World/net/minecraft/commands/AdminLogCommand.h similarity index 90% rename from Minecraft.World/Commands/AdminLogCommand.h rename to Minecraft.World/net/minecraft/commands/AdminLogCommand.h index 6b1d0e177..eff1abaf2 100644 --- a/Minecraft.World/Commands/AdminLogCommand.h +++ b/Minecraft.World/net/minecraft/commands/AdminLogCommand.h @@ -1,6 +1,6 @@ #pragma once -#include "../Network/Packets/ChatPacket.h" +#include "../network/packet/ChatPacket.h" class CommandSender; diff --git a/Minecraft.World/Commands/Command.cpp b/Minecraft.World/net/minecraft/commands/Command.cpp similarity index 83% rename from Minecraft.World/Commands/Command.cpp rename to Minecraft.World/net/minecraft/commands/Command.cpp index 443678861..e13a26443 100644 --- a/Minecraft.World/Commands/Command.cpp +++ b/Minecraft.World/net/minecraft/commands/Command.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.commands.h" -#include "../../Minecraft.Client/MinecraftServer.h" -#include "../../Minecraft.Client/Network/PlayerList.h" -#include "../../Minecraft.Client/Player/ServerPlayer.h" +#include "../../../Header Files/stdafx.h" +#include "net.minecraft.commands.h" +#include "../../Minecraft.Client/net/minecraft/server/MinecraftServer.h" +#include "../../Minecraft.Client/net/minecraft/server/PlayerList.h" +#include "../../Minecraft.Client/net/minecraft/server/level/ServerPlayer.h" #include "Command.h" AdminLogCommand* Command::logger; diff --git a/Minecraft.World/Commands/Command.h b/Minecraft.World/net/minecraft/commands/Command.h similarity index 97% rename from Minecraft.World/Commands/Command.h rename to Minecraft.World/net/minecraft/commands/Command.h index 6a8fb5220..50d624d46 100644 --- a/Minecraft.World/Commands/Command.h +++ b/Minecraft.World/net/minecraft/commands/Command.h @@ -3,7 +3,7 @@ // 4J Stu - Based loosely on the Java versions #include "CommandsEnum.h" -#include "../Network/Packets/ChatPacket.h" +#include "../network/packet/ChatPacket.h" class AdminLogCommand; class CommandSender; diff --git a/Minecraft.World/Commands/CommandDispatcher.cpp b/Minecraft.World/net/minecraft/commands/CommandDispatcher.cpp similarity index 91% rename from Minecraft.World/Commands/CommandDispatcher.cpp rename to Minecraft.World/net/minecraft/commands/CommandDispatcher.cpp index 4c6f0b4cd..a1ce0c9db 100644 --- a/Minecraft.World/Commands/CommandDispatcher.cpp +++ b/Minecraft.World/net/minecraft/commands/CommandDispatcher.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.commands.h" +#include "../../../Header Files/stdafx.h" +#include "net.minecraft.commands.h" #include "CommandDispatcher.h" int CommandDispatcher::performCommand(std::shared_ptr sender, diff --git a/Minecraft.World/Commands/CommandDispatcher.h b/Minecraft.World/net/minecraft/commands/CommandDispatcher.h similarity index 100% rename from Minecraft.World/Commands/CommandDispatcher.h rename to Minecraft.World/net/minecraft/commands/CommandDispatcher.h diff --git a/Minecraft.World/Commands/CommandSender.h b/Minecraft.World/net/minecraft/commands/CommandSender.h similarity index 89% rename from Minecraft.World/Commands/CommandSender.h rename to Minecraft.World/net/minecraft/commands/CommandSender.h index e2271d21d..287f4fe8a 100644 --- a/Minecraft.World/Commands/CommandSender.h +++ b/Minecraft.World/net/minecraft/commands/CommandSender.h @@ -1,7 +1,7 @@ #pragma once #include "CommandsEnum.h" -#include "../Network/Packets/ChatPacket.h" +#include "../network/packet/ChatPacket.h" class CommandSender { public: diff --git a/Minecraft.World/Commands/CommandsEnum.h b/Minecraft.World/net/minecraft/commands/CommandsEnum.h similarity index 100% rename from Minecraft.World/Commands/CommandsEnum.h rename to Minecraft.World/net/minecraft/commands/CommandsEnum.h diff --git a/Minecraft.World/Commands/PlayerSelector.h b/Minecraft.World/net/minecraft/commands/PlayerSelector.h similarity index 100% rename from Minecraft.World/Commands/PlayerSelector.h rename to Minecraft.World/net/minecraft/commands/PlayerSelector.h diff --git a/Minecraft.World/Commands/DefaultGameModeCommand.cpp b/Minecraft.World/net/minecraft/commands/common/DefaultGameModeCommand.cpp similarity index 93% rename from Minecraft.World/Commands/DefaultGameModeCommand.cpp rename to Minecraft.World/net/minecraft/commands/common/DefaultGameModeCommand.cpp index b40001083..f5b293447 100644 --- a/Minecraft.World/Commands/DefaultGameModeCommand.cpp +++ b/Minecraft.World/net/minecraft/commands/common/DefaultGameModeCommand.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.commands.h" +#include "../../../../Header Files/stdafx.h" +#include "../net.minecraft.commands.h" #include "DefaultGameModeCommand.h" EGameCommand DefaultGameModeCommand::getId() { diff --git a/Minecraft.World/Commands/DefaultGameModeCommand.h b/Minecraft.World/net/minecraft/commands/common/DefaultGameModeCommand.h similarity index 100% rename from Minecraft.World/Commands/DefaultGameModeCommand.h rename to Minecraft.World/net/minecraft/commands/common/DefaultGameModeCommand.h diff --git a/Minecraft.World/Commands/EffectCommand.cpp b/Minecraft.World/net/minecraft/commands/common/EffectCommand.cpp similarity index 94% rename from Minecraft.World/Commands/EffectCommand.cpp rename to Minecraft.World/net/minecraft/commands/common/EffectCommand.cpp index 890e03d66..4911ec346 100644 --- a/Minecraft.World/Commands/EffectCommand.cpp +++ b/Minecraft.World/net/minecraft/commands/common/EffectCommand.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.commands.common.h" -#include "../../Minecraft.Client/MinecraftServer.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.commands.common.h" +#include "../../Minecraft.Client/net/minecraft/server/MinecraftServer.h" EGameCommand EffectCommand::getId() { return eGameCommand_Effect; } diff --git a/Minecraft.World/Commands/EffectCommand.h b/Minecraft.World/net/minecraft/commands/common/EffectCommand.h similarity index 94% rename from Minecraft.World/Commands/EffectCommand.h rename to Minecraft.World/net/minecraft/commands/common/EffectCommand.h index 71842af45..436a9084f 100644 --- a/Minecraft.World/Commands/EffectCommand.h +++ b/Minecraft.World/net/minecraft/commands/common/EffectCommand.h @@ -1,6 +1,6 @@ #pragma once -#include "Command.h" +#include "../Command.h" class EffectCommand : public Command { public: diff --git a/Minecraft.World/Commands/EnchantItemCommand.cpp b/Minecraft.World/net/minecraft/commands/common/EnchantItemCommand.cpp similarity index 89% rename from Minecraft.World/Commands/EnchantItemCommand.cpp rename to Minecraft.World/net/minecraft/commands/common/EnchantItemCommand.cpp index 13e1df281..6f9f24d86 100644 --- a/Minecraft.World/Commands/EnchantItemCommand.cpp +++ b/Minecraft.World/net/minecraft/commands/common/EnchantItemCommand.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.network.packet.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" -#include "../../Minecraft.Client/Player/ServerPlayer.h" +#include "../../../../Header Files/stdafx.h" +#include "../../network/packet/net.minecraft.network.packet.h" +#include "../../world/item/net.minecraft.world.item.h" +#include "../../world/item/enchantment/net.minecraft.world.item.enchantment.h" +#include "../../Minecraft.Client/net/minecraft/server/level/ServerPlayer.h" #include "EnchantItemCommand.h" EGameCommand EnchantItemCommand::getId() { return eGameCommand_EnchantItem; } diff --git a/Minecraft.World/Commands/EnchantItemCommand.h b/Minecraft.World/net/minecraft/commands/common/EnchantItemCommand.h similarity index 94% rename from Minecraft.World/Commands/EnchantItemCommand.h rename to Minecraft.World/net/minecraft/commands/common/EnchantItemCommand.h index 87f186484..77f914683 100644 --- a/Minecraft.World/Commands/EnchantItemCommand.h +++ b/Minecraft.World/net/minecraft/commands/common/EnchantItemCommand.h @@ -1,6 +1,6 @@ #pragma once -#include "Command.h" +#include "../Command.h" class GameCommandPacket; diff --git a/Minecraft.World/Commands/ExperienceCommand.cpp b/Minecraft.World/net/minecraft/commands/common/ExperienceCommand.cpp similarity index 85% rename from Minecraft.World/Commands/ExperienceCommand.cpp rename to Minecraft.World/net/minecraft/commands/common/ExperienceCommand.cpp index 025bcf356..e724a80ab 100644 --- a/Minecraft.World/Commands/ExperienceCommand.cpp +++ b/Minecraft.World/net/minecraft/commands/common/ExperienceCommand.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.commands.h" -#include "../../Minecraft.Client/MinecraftServer.h" -#include "../../Minecraft.Client/Network/PlayerList.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../Header Files/stdafx.h" +#include "../net.minecraft.commands.h" +#include "../../Minecraft.Client/net/minecraft/server/MinecraftServer.h" +#include "../../Minecraft.Client/net/minecraft/server/PlayerList.h" +#include "../../world/level/net.minecraft.world.level.h" #include "ExperienceCommand.h" EGameCommand ExperienceCommand::getId() { return eGameCommand_Experience; } diff --git a/Minecraft.World/Commands/ExperienceCommand.h b/Minecraft.World/net/minecraft/commands/common/ExperienceCommand.h similarity index 91% rename from Minecraft.World/Commands/ExperienceCommand.h rename to Minecraft.World/net/minecraft/commands/common/ExperienceCommand.h index 4f41f03b1..54dbe732c 100644 --- a/Minecraft.World/Commands/ExperienceCommand.h +++ b/Minecraft.World/net/minecraft/commands/common/ExperienceCommand.h @@ -1,6 +1,6 @@ #pragma once -#include "Command.h" +#include "../Command.h" class CommandSender; diff --git a/Minecraft.World/Commands/GameDifficultyCommand.h b/Minecraft.World/net/minecraft/commands/common/GameDifficultyCommand.h similarity index 100% rename from Minecraft.World/Commands/GameDifficultyCommand.h rename to Minecraft.World/net/minecraft/commands/common/GameDifficultyCommand.h diff --git a/Minecraft.World/Commands/GameModeCommand.cpp b/Minecraft.World/net/minecraft/commands/common/GameModeCommand.cpp similarity index 95% rename from Minecraft.World/Commands/GameModeCommand.cpp rename to Minecraft.World/net/minecraft/commands/common/GameModeCommand.cpp index 06a5fdb34..507973245 100644 --- a/Minecraft.World/Commands/GameModeCommand.cpp +++ b/Minecraft.World/net/minecraft/commands/common/GameModeCommand.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.commands.h" +#include "../../../../Header Files/stdafx.h" +#include "../net.minecraft.commands.h" #include "GameModeCommand.h" EGameCommand GameModeCommand::getId() { return eGameCommand_GameMode; } diff --git a/Minecraft.World/Commands/GameModeCommand.h b/Minecraft.World/net/minecraft/commands/common/GameModeCommand.h similarity index 94% rename from Minecraft.World/Commands/GameModeCommand.h rename to Minecraft.World/net/minecraft/commands/common/GameModeCommand.h index 514cf1969..87f9c1eec 100644 --- a/Minecraft.World/Commands/GameModeCommand.h +++ b/Minecraft.World/net/minecraft/commands/common/GameModeCommand.h @@ -1,6 +1,6 @@ #pragma once -#include "Command.h" +#include "../Command.h" class GameType; diff --git a/Minecraft.World/Commands/GameRuleCommand.h b/Minecraft.World/net/minecraft/commands/common/GameRuleCommand.h similarity index 100% rename from Minecraft.World/Commands/GameRuleCommand.h rename to Minecraft.World/net/minecraft/commands/common/GameRuleCommand.h diff --git a/Minecraft.World/Commands/GiveItemCommand.cpp b/Minecraft.World/net/minecraft/commands/common/GiveItemCommand.cpp similarity index 83% rename from Minecraft.World/Commands/GiveItemCommand.cpp rename to Minecraft.World/net/minecraft/commands/common/GiveItemCommand.cpp index 2ab658c7c..b0ba0808c 100644 --- a/Minecraft.World/Commands/GiveItemCommand.cpp +++ b/Minecraft.World/net/minecraft/commands/common/GiveItemCommand.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.commands.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.network.packet.h" -#include "../../Minecraft.Client/Player/ServerPlayer.h" +#include "../../../../Header Files/stdafx.h" +#include "../net.minecraft.commands.h" +#include "../../world/entity/item/net.minecraft.world.entity.item.h" +#include "../../world/item/net.minecraft.world.item.h" +#include "../../network/packet/net.minecraft.network.packet.h" +#include "../../Minecraft.Client/net/minecraft/server/level/ServerPlayer.h" #include "GiveItemCommand.h" EGameCommand GiveItemCommand::getId() { return eGameCommand_Give; } diff --git a/Minecraft.World/Commands/GiveItemCommand.h b/Minecraft.World/net/minecraft/commands/common/GiveItemCommand.h similarity index 95% rename from Minecraft.World/Commands/GiveItemCommand.h rename to Minecraft.World/net/minecraft/commands/common/GiveItemCommand.h index 9bf214056..3df5ac671 100644 --- a/Minecraft.World/Commands/GiveItemCommand.h +++ b/Minecraft.World/net/minecraft/commands/common/GiveItemCommand.h @@ -1,6 +1,6 @@ #pragma once -#include "Command.h" +#include "../Command.h" class GameCommandPacket; diff --git a/Minecraft.World/Commands/KillCommand.cpp b/Minecraft.World/net/minecraft/commands/common/KillCommand.cpp similarity index 72% rename from Minecraft.World/Commands/KillCommand.cpp rename to Minecraft.World/net/minecraft/commands/common/KillCommand.cpp index fef099420..732313952 100644 --- a/Minecraft.World/Commands/KillCommand.cpp +++ b/Minecraft.World/net/minecraft/commands/common/KillCommand.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.commands.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.damagesource.h" +#include "../../../../Header Files/stdafx.h" +#include "../net.minecraft.commands.h" +#include "../../world/entity/player/net.minecraft.world.entity.player.h" +#include "../../world/damageSource/net.minecraft.world.damagesource.h" #include "KillCommand.h" #include diff --git a/Minecraft.World/Commands/KillCommand.h b/Minecraft.World/net/minecraft/commands/common/KillCommand.h similarity index 91% rename from Minecraft.World/Commands/KillCommand.h rename to Minecraft.World/net/minecraft/commands/common/KillCommand.h index a69b23b66..43a7c40ee 100644 --- a/Minecraft.World/Commands/KillCommand.h +++ b/Minecraft.World/net/minecraft/commands/common/KillCommand.h @@ -1,6 +1,6 @@ #pragma once -#include "Command.h" +#include "../Command.h" class KillCommand : public Command { public: diff --git a/Minecraft.World/Commands/PlaySoundCommand.h b/Minecraft.World/net/minecraft/commands/common/PlaySoundCommand.h similarity index 100% rename from Minecraft.World/Commands/PlaySoundCommand.h rename to Minecraft.World/net/minecraft/commands/common/PlaySoundCommand.h diff --git a/Minecraft.World/Commands/SetPlayerTimeoutCommand.h b/Minecraft.World/net/minecraft/commands/common/SetPlayerTimeoutCommand.h similarity index 100% rename from Minecraft.World/Commands/SetPlayerTimeoutCommand.h rename to Minecraft.World/net/minecraft/commands/common/SetPlayerTimeoutCommand.h diff --git a/Minecraft.World/Commands/ShowSeedCommand.h b/Minecraft.World/net/minecraft/commands/common/ShowSeedCommand.h similarity index 100% rename from Minecraft.World/Commands/ShowSeedCommand.h rename to Minecraft.World/net/minecraft/commands/common/ShowSeedCommand.h diff --git a/Minecraft.World/Commands/SpreadPlayersCommand.h b/Minecraft.World/net/minecraft/commands/common/SpreadPlayersCommand.h similarity index 100% rename from Minecraft.World/Commands/SpreadPlayersCommand.h rename to Minecraft.World/net/minecraft/commands/common/SpreadPlayersCommand.h diff --git a/Minecraft.World/Commands/TimeCommand.cpp b/Minecraft.World/net/minecraft/commands/common/TimeCommand.cpp similarity index 87% rename from Minecraft.World/Commands/TimeCommand.cpp rename to Minecraft.World/net/minecraft/commands/common/TimeCommand.cpp index 051bc2862..fdb2f0ef5 100644 --- a/Minecraft.World/Commands/TimeCommand.cpp +++ b/Minecraft.World/net/minecraft/commands/common/TimeCommand.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.commands.h" -#include "../../Minecraft.Client/MinecraftServer.h" -#include "../../Minecraft.Client/Level/ServerLevel.h" -#include "../Headers/net.minecraft.network.packet.h" +#include "../../../../Header Files/stdafx.h" +#include "../net.minecraft.commands.h" +#include "../../Minecraft.Client/net/minecraft/server/MinecraftServer.h" +#include "../../Minecraft.Client/net/minecraft/server/level/ServerLevel.h" +#include "../../network/packet/net.minecraft.network.packet.h" #include "TimeCommand.h" EGameCommand TimeCommand::getId() { return eGameCommand_Time; } diff --git a/Minecraft.World/Commands/TimeCommand.h b/Minecraft.World/net/minecraft/commands/common/TimeCommand.h similarity index 95% rename from Minecraft.World/Commands/TimeCommand.h rename to Minecraft.World/net/minecraft/commands/common/TimeCommand.h index 2b38a4b9b..18db1ca21 100644 --- a/Minecraft.World/Commands/TimeCommand.h +++ b/Minecraft.World/net/minecraft/commands/common/TimeCommand.h @@ -1,6 +1,6 @@ #pragma once -#include "Command.h" +#include "../Command.h" class TimeCommand : public Command { public: diff --git a/Minecraft.World/Commands/ToggleDownfallCommand.cpp b/Minecraft.World/net/minecraft/commands/common/ToggleDownfallCommand.cpp similarity index 67% rename from Minecraft.World/Commands/ToggleDownfallCommand.cpp rename to Minecraft.World/net/minecraft/commands/common/ToggleDownfallCommand.cpp index fa760f539..d9d5a92f6 100644 --- a/Minecraft.World/Commands/ToggleDownfallCommand.cpp +++ b/Minecraft.World/net/minecraft/commands/common/ToggleDownfallCommand.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../../Minecraft.Client/MinecraftServer.h" -#include "../../Minecraft.Client/Level/ServerLevel.h" -#include "../Headers/net.minecraft.commands.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.storage.h" -#include "../Headers/net.minecraft.network.packet.h" +#include "../../../../Header Files/stdafx.h" +#include "../../Minecraft.Client/net/minecraft/server/MinecraftServer.h" +#include "../../Minecraft.Client/net/minecraft/server/level/ServerLevel.h" +#include "../net.minecraft.commands.h" +#include "../../world/level/net.minecraft.world.level.h" +#include "../../world/level/storage/net.minecraft.world.level.storage.h" +#include "../../network/packet/net.minecraft.network.packet.h" #include "ToggleDownfallCommand.h" EGameCommand ToggleDownfallCommand::getId() { diff --git a/Minecraft.World/Commands/ToggleDownfallCommand.h b/Minecraft.World/net/minecraft/commands/common/ToggleDownfallCommand.h similarity index 94% rename from Minecraft.World/Commands/ToggleDownfallCommand.h rename to Minecraft.World/net/minecraft/commands/common/ToggleDownfallCommand.h index 1b9000b4d..944fcc969 100644 --- a/Minecraft.World/Commands/ToggleDownfallCommand.h +++ b/Minecraft.World/net/minecraft/commands/common/ToggleDownfallCommand.h @@ -1,5 +1,5 @@ #pragma once -#include "Command.h" +#include "../Command.h" class GameCommandPacket; diff --git a/Minecraft.World/Commands/WeatherCommand.h b/Minecraft.World/net/minecraft/commands/common/WeatherCommand.h similarity index 100% rename from Minecraft.World/Commands/WeatherCommand.h rename to Minecraft.World/net/minecraft/commands/common/WeatherCommand.h diff --git a/Minecraft.World/net/minecraft/commands/common/net.minecraft.commands.common.h b/Minecraft.World/net/minecraft/commands/common/net.minecraft.commands.common.h new file mode 100644 index 000000000..83b0dca5c --- /dev/null +++ b/Minecraft.World/net/minecraft/commands/common/net.minecraft.commands.common.h @@ -0,0 +1,11 @@ +#pragma once + +#include "DefaultGameModeCommand.h" +#include "EffectCommand.h" +#include "EnchantItemCommand.h" +#include "ExperienceCommand.h" +#include "GameModeCommand.h" +#include "GiveItemCommand.h" +#include "KillCommand.h" +#include "TimeCommand.h" +#include "ToggleDownfallCommand.h" \ No newline at end of file diff --git a/Minecraft.World/net/minecraft/commands/net.minecraft.commands.h b/Minecraft.World/net/minecraft/commands/net.minecraft.commands.h new file mode 100644 index 000000000..616b2e076 --- /dev/null +++ b/Minecraft.World/net/minecraft/commands/net.minecraft.commands.h @@ -0,0 +1,7 @@ +#pragma once + +#include "AdminLogCommand.h" +#include "CommandsEnum.h" +#include "Command.h" +#include "CommandDispatcher.h" +#include "CommandSender.h" \ No newline at end of file diff --git a/Minecraft.World/Core/AbstractProjectileDispenseBehavior.cpp b/Minecraft.World/net/minecraft/core/AbstractProjectileDispenseBehavior.cpp similarity index 85% rename from Minecraft.World/Core/AbstractProjectileDispenseBehavior.cpp rename to Minecraft.World/net/minecraft/core/AbstractProjectileDispenseBehavior.cpp index d81edbc7e..7e318e01c 100644 --- a/Minecraft.World/Core/AbstractProjectileDispenseBehavior.cpp +++ b/Minecraft.World/net/minecraft/core/AbstractProjectileDispenseBehavior.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" #include "AbstractProjectileDispenseBehavior.h" -#include "../Blocks/DispenserTile.h" -#include "../Entities/Projectile.h" -#include "../Level/Level.h" -#include "../Level/Events/LevelEvent.h" -#include "../Items/ItemInstance.h" +#include "../world/level/tile/DispenserTile.h" +#include "../world/entity/projectile/Projectile.h" +#include "../world/level/Level.h" +#include "../world/level/tile/LevelEvent.h" +#include "../world/item/ItemInstance.h" std::shared_ptr AbstractProjectileDispenseBehavior::execute( BlockSource* source, std::shared_ptr dispensed, diff --git a/Minecraft.World/Core/AbstractProjectileDispenseBehavior.h b/Minecraft.World/net/minecraft/core/AbstractProjectileDispenseBehavior.h similarity index 100% rename from Minecraft.World/Core/AbstractProjectileDispenseBehavior.h rename to Minecraft.World/net/minecraft/core/AbstractProjectileDispenseBehavior.h diff --git a/Minecraft.World/Core/Behavior.h b/Minecraft.World/net/minecraft/core/Behavior.h similarity index 100% rename from Minecraft.World/Core/Behavior.h rename to Minecraft.World/net/minecraft/core/Behavior.h diff --git a/Minecraft.World/Core/BehaviorRegistry.cpp b/Minecraft.World/net/minecraft/core/BehaviorRegistry.cpp similarity index 93% rename from Minecraft.World/Core/BehaviorRegistry.cpp rename to Minecraft.World/net/minecraft/core/BehaviorRegistry.cpp index 0b9e965ab..ab046e54e 100644 --- a/Minecraft.World/Core/BehaviorRegistry.cpp +++ b/Minecraft.World/net/minecraft/core/BehaviorRegistry.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" #include "BehaviorRegistry.h" diff --git a/Minecraft.World/Core/BehaviorRegistry.h b/Minecraft.World/net/minecraft/core/BehaviorRegistry.h similarity index 100% rename from Minecraft.World/Core/BehaviorRegistry.h rename to Minecraft.World/net/minecraft/core/BehaviorRegistry.h diff --git a/Minecraft.World/Core/BlockSource.h b/Minecraft.World/net/minecraft/core/BlockSource.h similarity index 100% rename from Minecraft.World/Core/BlockSource.h rename to Minecraft.World/net/minecraft/core/BlockSource.h diff --git a/Minecraft.World/Core/BlockSourceImpl.cpp b/Minecraft.World/net/minecraft/core/BlockSourceImpl.cpp similarity index 78% rename from Minecraft.World/Core/BlockSourceImpl.cpp rename to Minecraft.World/net/minecraft/core/BlockSourceImpl.cpp index 65ff22f95..5ff0692b7 100644 --- a/Minecraft.World/Core/BlockSourceImpl.cpp +++ b/Minecraft.World/net/minecraft/core/BlockSourceImpl.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" #include "BlockSourceImpl.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" +#include "../world/level/net.minecraft.world.level.h" +#include "../world/level/tile/net.minecraft.world.level.tile.h" +#include "../world/level/tile/entity/net.minecraft.world.level.tile.entity.h" BlockSourceImpl::BlockSourceImpl(Level* world, int x, int y, int z) { this->world = world; diff --git a/Minecraft.World/Core/BlockSourceImpl.h b/Minecraft.World/net/minecraft/core/BlockSourceImpl.h similarity index 100% rename from Minecraft.World/Core/BlockSourceImpl.h rename to Minecraft.World/net/minecraft/core/BlockSourceImpl.h diff --git a/Minecraft.World/Core/DefaultDispenseItemBehavior.cpp b/Minecraft.World/net/minecraft/core/DefaultDispenseItemBehavior.cpp similarity index 91% rename from Minecraft.World/Core/DefaultDispenseItemBehavior.cpp rename to Minecraft.World/net/minecraft/core/DefaultDispenseItemBehavior.cpp index a01ce291e..6ed45fd23 100644 --- a/Minecraft.World/Core/DefaultDispenseItemBehavior.cpp +++ b/Minecraft.World/net/minecraft/core/DefaultDispenseItemBehavior.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.core.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.entity.item.h" +#include "../../../Header Files/stdafx.h" +#include "../net.minecraft.h" +#include "net.minecraft.core.h" +#include "../world/level/tile/net.minecraft.world.level.tile.h" +#include "../world/level/net.minecraft.world.level.h" +#include "../world/entity/item/net.minecraft.world.entity.item.h" #include "DefaultDispenseItemBehavior.h" std::shared_ptr DefaultDispenseItemBehavior::dispense( diff --git a/Minecraft.World/Core/DefaultDispenseItemBehavior.h b/Minecraft.World/net/minecraft/core/DefaultDispenseItemBehavior.h similarity index 100% rename from Minecraft.World/Core/DefaultDispenseItemBehavior.h rename to Minecraft.World/net/minecraft/core/DefaultDispenseItemBehavior.h diff --git a/Minecraft.World/Core/DispenseItemBehavior.cpp b/Minecraft.World/net/minecraft/core/DispenseItemBehavior.cpp similarity index 86% rename from Minecraft.World/Core/DispenseItemBehavior.cpp rename to Minecraft.World/net/minecraft/core/DispenseItemBehavior.cpp index a8946af17..fb83cde07 100644 --- a/Minecraft.World/Core/DispenseItemBehavior.cpp +++ b/Minecraft.World/net/minecraft/core/DispenseItemBehavior.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" #include "DispenseItemBehavior.h" diff --git a/Minecraft.World/Core/DispenseItemBehavior.h b/Minecraft.World/net/minecraft/core/DispenseItemBehavior.h similarity index 100% rename from Minecraft.World/Core/DispenseItemBehavior.h rename to Minecraft.World/net/minecraft/core/DispenseItemBehavior.h diff --git a/Minecraft.World/Core/FacingEnum.cpp b/Minecraft.World/net/minecraft/core/FacingEnum.cpp similarity index 96% rename from Minecraft.World/Core/FacingEnum.cpp rename to Minecraft.World/net/minecraft/core/FacingEnum.cpp index 0f8c58f4e..dde690db3 100644 --- a/Minecraft.World/Core/FacingEnum.cpp +++ b/Minecraft.World/net/minecraft/core/FacingEnum.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" #include "FacingEnum.h" diff --git a/Minecraft.World/Core/FacingEnum.h b/Minecraft.World/net/minecraft/core/FacingEnum.h similarity index 100% rename from Minecraft.World/Core/FacingEnum.h rename to Minecraft.World/net/minecraft/core/FacingEnum.h diff --git a/Minecraft.World/Core/ItemDispenseBehaviors.cpp b/Minecraft.World/net/minecraft/core/ItemDispenseBehaviors.cpp similarity index 97% rename from Minecraft.World/Core/ItemDispenseBehaviors.cpp rename to Minecraft.World/net/minecraft/core/ItemDispenseBehaviors.cpp index b15a58c9e..6e51efc51 100644 --- a/Minecraft.World/Core/ItemDispenseBehaviors.cpp +++ b/Minecraft.World/net/minecraft/core/ItemDispenseBehaviors.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.entity.projectile.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../Header Files/stdafx.h" +#include "../world/entity/item/net.minecraft.world.entity.item.h" +#include "../world/entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../world/level/net.minecraft.world.level.h" +#include "../world/level/tile/net.minecraft.world.level.tile.h" +#include "../world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../world/item/net.minecraft.world.item.h" #include "ItemDispenseBehaviors.h" /* Arrow */ diff --git a/Minecraft.World/Core/ItemDispenseBehaviors.h b/Minecraft.World/net/minecraft/core/ItemDispenseBehaviors.h similarity index 100% rename from Minecraft.World/Core/ItemDispenseBehaviors.h rename to Minecraft.World/net/minecraft/core/ItemDispenseBehaviors.h diff --git a/Minecraft.World/Core/LocatableSource.h b/Minecraft.World/net/minecraft/core/LocatableSource.h similarity index 100% rename from Minecraft.World/Core/LocatableSource.h rename to Minecraft.World/net/minecraft/core/LocatableSource.h diff --git a/Minecraft.World/Core/Location.h b/Minecraft.World/net/minecraft/core/Location.h similarity index 100% rename from Minecraft.World/Core/Location.h rename to Minecraft.World/net/minecraft/core/Location.h diff --git a/Minecraft.World/Core/Position.h b/Minecraft.World/net/minecraft/core/Position.h similarity index 100% rename from Minecraft.World/Core/Position.h rename to Minecraft.World/net/minecraft/core/Position.h diff --git a/Minecraft.World/Core/PositionImpl.h b/Minecraft.World/net/minecraft/core/PositionImpl.h similarity index 100% rename from Minecraft.World/Core/PositionImpl.h rename to Minecraft.World/net/minecraft/core/PositionImpl.h diff --git a/Minecraft.World/Core/Source.h b/Minecraft.World/net/minecraft/core/Source.h similarity index 100% rename from Minecraft.World/Core/Source.h rename to Minecraft.World/net/minecraft/core/Source.h diff --git a/Minecraft.World/net/minecraft/core/net.minecraft.core.h b/Minecraft.World/net/minecraft/core/net.minecraft.core.h new file mode 100644 index 000000000..d67789892 --- /dev/null +++ b/Minecraft.World/net/minecraft/core/net.minecraft.core.h @@ -0,0 +1,16 @@ +#pragma once + +#include "Behavior.h" +#include "BlockSource.h" +#include "BlockSourceImpl.h" +#include "BehaviorRegistry.h" +#include "DispenseItemBehavior.h" +#include "DefaultDispenseItemBehavior.h" +#include "AbstractProjectileDispenseBehavior.h" +#include "ItemDispenseBehaviors.h" +#include "FacingEnum.h" +#include "LocatableSource.h" +#include "Location.h" +#include "Position.h" +#include "PositionImpl.h" +#include "Source.h" \ No newline at end of file diff --git a/Minecraft.World/Util/I18n.cpp b/Minecraft.World/net/minecraft/locale/I18n.cpp similarity index 89% rename from Minecraft.World/Util/I18n.cpp rename to Minecraft.World/net/minecraft/locale/I18n.cpp index 19b76ac1e..e8f6ff6a4 100644 --- a/Minecraft.World/Util/I18n.cpp +++ b/Minecraft.World/net/minecraft/locale/I18n.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" #include "Language.h" #include "I18n.h" diff --git a/Minecraft.World/Util/I18n.h b/Minecraft.World/net/minecraft/locale/I18n.h similarity index 83% rename from Minecraft.World/Util/I18n.h rename to Minecraft.World/net/minecraft/locale/I18n.h index 2393606fa..f995b7be6 100644 --- a/Minecraft.World/Util/I18n.h +++ b/Minecraft.World/net/minecraft/locale/I18n.h @@ -1,6 +1,6 @@ #pragma once -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" #include "Language.h" class I18n { diff --git a/Minecraft.World/Util/Language.cpp b/Minecraft.World/net/minecraft/locale/Language.cpp similarity index 96% rename from Minecraft.World/Util/Language.cpp rename to Minecraft.World/net/minecraft/locale/Language.cpp index 2ac4f068f..01ab5e0ca 100644 --- a/Minecraft.World/Util/Language.cpp +++ b/Minecraft.World/net/minecraft/locale/Language.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" #include "Language.h" -#include "../IO/Files/File.h" -#include "../IO/Files/FileInputStream.h" +#include "../../../ConsoleJavaLibs/File.h" +#include "../../../ConsoleJavaLibs/InputOutputStream/FileInputStream.h" // 4J - TODO - properly implement // 4jcraft: done! diff --git a/Minecraft.World/Util/Language.h b/Minecraft.World/net/minecraft/locale/Language.h similarity index 100% rename from Minecraft.World/Util/Language.h rename to Minecraft.World/net/minecraft/locale/Language.h diff --git a/Minecraft.World/net/minecraft/locale/net.minecraft.locale.h b/Minecraft.World/net/minecraft/locale/net.minecraft.locale.h new file mode 100644 index 000000000..b6ed8a10d --- /dev/null +++ b/Minecraft.World/net/minecraft/locale/net.minecraft.locale.h @@ -0,0 +1,4 @@ +#pragma once + +#include "Language.h" +#include "I18n.h" \ No newline at end of file diff --git a/Minecraft.World/net/minecraft/net.minecraft.h b/Minecraft.World/net/minecraft/net.minecraft.h new file mode 100644 index 000000000..203a8b938 --- /dev/null +++ b/Minecraft.World/net/minecraft/net.minecraft.h @@ -0,0 +1,6 @@ +#pragma once + +#include "Facing.h" +#include "Direction.h" +#include "Pos.h" +#include "SharedConstants.h" \ No newline at end of file diff --git a/Minecraft.World/Network/Connection.cpp b/Minecraft.World/net/minecraft/network/Connection.cpp similarity index 98% rename from Minecraft.World/Network/Connection.cpp rename to Minecraft.World/net/minecraft/network/Connection.cpp index 871560dc2..6a4ed8dbe 100644 --- a/Minecraft.World/Network/Connection.cpp +++ b/Minecraft.World/net/minecraft/network/Connection.cpp @@ -1,13 +1,13 @@ #include #include -#include "../Platform/stdafx.h" -#include "../IO/Streams/InputOutputStream.h" -#include "Socket.h" +#include "../../../Header Files/stdafx.h" +#include "../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../../ConsoleJavaLibs/Socket.h" #include "Connection.h" -#include "../Util/ThreadName.h" -#include "../IO/Streams/Compression.h" -#include "../../Minecraft.Client/Platform/Common/ShutdownManager.h" +#include "../../../ConsoleHelpers/ThreadName.h" +#include "../../../Header Files/compression.h" +#include "../../Minecraft.Client/Common/ShutdownManager.h" // This should always be enabled, except for debugging use #if !defined(_DEBUG) diff --git a/Minecraft.World/Network/Connection.h b/Minecraft.World/net/minecraft/network/Connection.h similarity index 90% rename from Minecraft.World/Network/Connection.h rename to Minecraft.World/net/minecraft/network/Connection.h index 7759e6c1f..c9e3ba5b3 100644 --- a/Minecraft.World/Network/Connection.h +++ b/Minecraft.World/net/minecraft/network/Connection.h @@ -1,16 +1,16 @@ #pragma once -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" #include -#include "../Platform/System.h" -#include "../IO/Streams/DataInputStream.h" -#include "../IO/Streams/DataOutputStream.h" -#include "../Headers/net.minecraft.network.packet.h" -#include "../Util/C4JThread.h" +#include "../../../ConsoleJavaLibs/System.h" +#include "../../../ConsoleJavaLibs/InputOutputStream/DataInputStream.h" +#include "../../../ConsoleJavaLibs/InputOutputStream/DataOutputStream.h" +#include "packet/net.minecraft.network.packet.h" +#include "../../../ConsoleHelpers/C4JThread.h" #include -#include "Socket.h" +#include "../../../ConsoleJavaLibs/Socket.h" // 4J JEV, size of the threads (bytes). #define READ_STACK_SIZE 0 diff --git a/Minecraft.World/net/minecraft/network/net.minecraft.network.h b/Minecraft.World/net/minecraft/network/net.minecraft.network.h new file mode 100644 index 000000000..cbeae4751 --- /dev/null +++ b/Minecraft.World/net/minecraft/network/net.minecraft.network.h @@ -0,0 +1,3 @@ +#pragma once + +#include "Connection.h" \ No newline at end of file diff --git a/Minecraft.World/Network/Packets/AddEntityPacket.cpp b/Minecraft.World/net/minecraft/network/packet/AddEntityPacket.cpp similarity index 94% rename from Minecraft.World/Network/Packets/AddEntityPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/AddEntityPacket.cpp index 848b2cbf4..703f5cb93 100644 --- a/Minecraft.World/Network/Packets/AddEntityPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/AddEntityPacket.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.entity.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/entity/net.minecraft.world.entity.h" #include "PacketListener.h" #include "AddEntityPacket.h" #include diff --git a/Minecraft.World/Network/Packets/AddEntityPacket.h b/Minecraft.World/net/minecraft/network/packet/AddEntityPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/AddEntityPacket.h rename to Minecraft.World/net/minecraft/network/packet/AddEntityPacket.h diff --git a/Minecraft.World/Network/Packets/AddExperienceOrbPacket.cpp b/Minecraft.World/net/minecraft/network/packet/AddExperienceOrbPacket.cpp similarity index 84% rename from Minecraft.World/Network/Packets/AddExperienceOrbPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/AddExperienceOrbPacket.cpp index e8394e6bb..b15353cca 100644 --- a/Minecraft.World/Network/Packets/AddExperienceOrbPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/AddExperienceOrbPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../Header Files/stdafx.h" +#include "../../world/entity/net.minecraft.world.entity.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "AddExperienceOrbPacket.h" diff --git a/Minecraft.World/Network/Packets/AddExperienceOrbPacket.h b/Minecraft.World/net/minecraft/network/packet/AddExperienceOrbPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/AddExperienceOrbPacket.h rename to Minecraft.World/net/minecraft/network/packet/AddExperienceOrbPacket.h diff --git a/Minecraft.World/Network/Packets/AddGlobalEntityPacket.cpp b/Minecraft.World/net/minecraft/network/packet/AddGlobalEntityPacket.cpp similarity index 82% rename from Minecraft.World/Network/Packets/AddGlobalEntityPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/AddGlobalEntityPacket.cpp index 724dbb1f9..00f8b4812 100644 --- a/Minecraft.World/Network/Packets/AddGlobalEntityPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/AddGlobalEntityPacket.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.global.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/entity/net.minecraft.world.entity.h" +#include "../../world/entity/global/net.minecraft.world.entity.global.h" #include "PacketListener.h" #include "AddGlobalEntityPacket.h" diff --git a/Minecraft.World/Network/Packets/AddGlobalEntityPacket.h b/Minecraft.World/net/minecraft/network/packet/AddGlobalEntityPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/AddGlobalEntityPacket.h rename to Minecraft.World/net/minecraft/network/packet/AddGlobalEntityPacket.h diff --git a/Minecraft.World/Network/Packets/AddMobPacket.cpp b/Minecraft.World/net/minecraft/network/packet/AddMobPacket.cpp similarity index 94% rename from Minecraft.World/Network/Packets/AddMobPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/AddMobPacket.cpp index b6ce8b268..7a9d2c7a4 100644 --- a/Minecraft.World/Network/Packets/AddMobPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/AddMobPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.entity.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/entity/net.minecraft.world.entity.h" #include "PacketListener.h" #include "AddMobPacket.h" diff --git a/Minecraft.World/Network/Packets/AddMobPacket.h b/Minecraft.World/net/minecraft/network/packet/AddMobPacket.h similarity index 95% rename from Minecraft.World/Network/Packets/AddMobPacket.h rename to Minecraft.World/net/minecraft/network/packet/AddMobPacket.h index adde6dcde..dbe13d3f0 100644 --- a/Minecraft.World/Network/Packets/AddMobPacket.h +++ b/Minecraft.World/net/minecraft/network/packet/AddMobPacket.h @@ -1,7 +1,7 @@ #pragma once #include "Packet.h" -#include "../../Entities/SyncedEntityData.h" +#include "../../world/entity/SyncedEntityData.h" class LivingEntity; diff --git a/Minecraft.World/Network/Packets/AddPaintingPacket.cpp b/Minecraft.World/net/minecraft/network/packet/AddPaintingPacket.cpp similarity index 85% rename from Minecraft.World/Network/Packets/AddPaintingPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/AddPaintingPacket.cpp index c85296cb3..e4adc4591 100644 --- a/Minecraft.World/Network/Packets/AddPaintingPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/AddPaintingPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.entity.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/entity/net.minecraft.world.entity.h" #include "PacketListener.h" #include "AddPaintingPacket.h" diff --git a/Minecraft.World/Network/Packets/AddPaintingPacket.h b/Minecraft.World/net/minecraft/network/packet/AddPaintingPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/AddPaintingPacket.h rename to Minecraft.World/net/minecraft/network/packet/AddPaintingPacket.h diff --git a/Minecraft.World/Network/Packets/AddPlayerPacket.cpp b/Minecraft.World/net/minecraft/network/packet/AddPlayerPacket.cpp similarity index 94% rename from Minecraft.World/Network/Packets/AddPlayerPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/AddPlayerPacket.cpp index a10aabed6..adfc49029 100644 --- a/Minecraft.World/Network/Packets/AddPlayerPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/AddPlayerPacket.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.item.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/entity/player/net.minecraft.world.entity.player.h" +#include "../../world/item/net.minecraft.world.item.h" #include "PacketListener.h" #include "AddPlayerPacket.h" diff --git a/Minecraft.World/Network/Packets/AddPlayerPacket.h b/Minecraft.World/net/minecraft/network/packet/AddPlayerPacket.h similarity index 96% rename from Minecraft.World/Network/Packets/AddPlayerPacket.h rename to Minecraft.World/net/minecraft/network/packet/AddPlayerPacket.h index 9a1e1324e..0604ebf44 100644 --- a/Minecraft.World/Network/Packets/AddPlayerPacket.h +++ b/Minecraft.World/net/minecraft/network/packet/AddPlayerPacket.h @@ -3,7 +3,7 @@ #include #include "Packet.h" -#include "../../Entities/SyncedEntityData.h" +#include "../../world/entity/SyncedEntityData.h" class Player; diff --git a/Minecraft.World/Network/Packets/AnimatePacket.cpp b/Minecraft.World/net/minecraft/network/packet/AnimatePacket.cpp similarity index 79% rename from Minecraft.World/Network/Packets/AnimatePacket.cpp rename to Minecraft.World/net/minecraft/network/packet/AnimatePacket.cpp index 363c88aa0..a211f7611 100644 --- a/Minecraft.World/Network/Packets/AnimatePacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/AnimatePacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.entity.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/entity/net.minecraft.world.entity.h" #include "PacketListener.h" #include "AnimatePacket.h" diff --git a/Minecraft.World/Network/Packets/AnimatePacket.h b/Minecraft.World/net/minecraft/network/packet/AnimatePacket.h similarity index 100% rename from Minecraft.World/Network/Packets/AnimatePacket.h rename to Minecraft.World/net/minecraft/network/packet/AnimatePacket.h diff --git a/Minecraft.World/Network/Packets/AwardStatPacket.cpp b/Minecraft.World/net/minecraft/network/packet/AwardStatPacket.cpp similarity index 94% rename from Minecraft.World/Network/Packets/AwardStatPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/AwardStatPacket.cpp index c95f201cd..1a610bd01 100644 --- a/Minecraft.World/Network/Packets/AwardStatPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/AwardStatPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "AwardStatPacket.h" diff --git a/Minecraft.World/Network/Packets/AwardStatPacket.h b/Minecraft.World/net/minecraft/network/packet/AwardStatPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/AwardStatPacket.h rename to Minecraft.World/net/minecraft/network/packet/AwardStatPacket.h diff --git a/Minecraft.World/Network/Packets/BlockRegionUpdatePacket.cpp b/Minecraft.World/net/minecraft/network/packet/BlockRegionUpdatePacket.cpp similarity index 92% rename from Minecraft.World/Network/Packets/BlockRegionUpdatePacket.cpp rename to Minecraft.World/net/minecraft/network/packet/BlockRegionUpdatePacket.cpp index c6ca7f954..2d05a04c1 100644 --- a/Minecraft.World/Network/Packets/BlockRegionUpdatePacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/BlockRegionUpdatePacket.cpp @@ -1,14 +1,14 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../IO/Streams/Compression.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/level/net.minecraft.world.level.h" +#include "../../../../Header Files/compression.h" #include "PacketListener.h" #include "BlockRegionUpdatePacket.h" -#include "../../Level/LevelChunk.h" -#include "../../Level/Storage/DataLayer.h" -#include "../../Level/Dimensions/Dimension.h" +#include "../../world/level/chunk/LevelChunk.h" +#include "../../world/level/chunk/DataLayer.h" +#include "../../world/level/dimension/Dimension.h" #define BLOCK_REGION_UPDATE_FULLCHUNK 0x01 #define BLOCK_REGION_UPDATE_ZEROHEIGHT \ diff --git a/Minecraft.World/Network/Packets/BlockRegionUpdatePacket.h b/Minecraft.World/net/minecraft/network/packet/BlockRegionUpdatePacket.h similarity index 100% rename from Minecraft.World/Network/Packets/BlockRegionUpdatePacket.h rename to Minecraft.World/net/minecraft/network/packet/BlockRegionUpdatePacket.h diff --git a/Minecraft.World/Network/Packets/ChatAutoCompletePacket.h b/Minecraft.World/net/minecraft/network/packet/ChatAutoCompletePacket.h similarity index 100% rename from Minecraft.World/Network/Packets/ChatAutoCompletePacket.h rename to Minecraft.World/net/minecraft/network/packet/ChatAutoCompletePacket.h diff --git a/Minecraft.World/Network/Packets/ChatPacket.cpp b/Minecraft.World/net/minecraft/network/packet/ChatPacket.cpp similarity index 95% rename from Minecraft.World/Network/Packets/ChatPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/ChatPacket.cpp index 4f8ee4b0e..82cfd7c3c 100644 --- a/Minecraft.World/Network/Packets/ChatPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/ChatPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../Headers/net.minecraft.h" -#include "../../Headers/net.minecraft.world.entity.player.h" +#include "../../net.minecraft.h" +#include "../../world/entity/player/net.minecraft.world.entity.player.h" #include "PacketListener.h" #include "ChatPacket.h" diff --git a/Minecraft.World/Network/Packets/ChatPacket.h b/Minecraft.World/net/minecraft/network/packet/ChatPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/ChatPacket.h rename to Minecraft.World/net/minecraft/network/packet/ChatPacket.h diff --git a/Minecraft.World/Network/Packets/ChunkTilesUpdatePacket.cpp b/Minecraft.World/net/minecraft/network/packet/ChunkTilesUpdatePacket.cpp similarity index 94% rename from Minecraft.World/Network/Packets/ChunkTilesUpdatePacket.cpp rename to Minecraft.World/net/minecraft/network/packet/ChunkTilesUpdatePacket.cpp index 54308acec..505c80c2c 100644 --- a/Minecraft.World/Network/Packets/ChunkTilesUpdatePacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/ChunkTilesUpdatePacket.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.chunk.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/level/net.minecraft.world.level.h" +#include "../../world/level/chunk/net.minecraft.world.level.chunk.h" #include "PacketListener.h" #include "ChunkTilesUpdatePacket.h" -#include "../../Level/Dimensions/Dimension.h" +#include "../../world/level/dimension/Dimension.h" ChunkTilesUpdatePacket::~ChunkTilesUpdatePacket() { delete[] blocks.data; diff --git a/Minecraft.World/Network/Packets/ChunkTilesUpdatePacket.h b/Minecraft.World/net/minecraft/network/packet/ChunkTilesUpdatePacket.h similarity index 100% rename from Minecraft.World/Network/Packets/ChunkTilesUpdatePacket.h rename to Minecraft.World/net/minecraft/network/packet/ChunkTilesUpdatePacket.h diff --git a/Minecraft.World/Network/Packets/ChunkVisibilityAreaPacket.cpp b/Minecraft.World/net/minecraft/network/packet/ChunkVisibilityAreaPacket.cpp similarity index 85% rename from Minecraft.World/Network/Packets/ChunkVisibilityAreaPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/ChunkVisibilityAreaPacket.cpp index 21ac83a91..6589b9ef3 100644 --- a/Minecraft.World/Network/Packets/ChunkVisibilityAreaPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/ChunkVisibilityAreaPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/level/net.minecraft.world.level.h" #include "PacketListener.h" #include "ChunkVisibilityAreaPacket.h" diff --git a/Minecraft.World/Network/Packets/ChunkVisibilityAreaPacket.h b/Minecraft.World/net/minecraft/network/packet/ChunkVisibilityAreaPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/ChunkVisibilityAreaPacket.h rename to Minecraft.World/net/minecraft/network/packet/ChunkVisibilityAreaPacket.h diff --git a/Minecraft.World/Network/Packets/ChunkVisibilityPacket.cpp b/Minecraft.World/net/minecraft/network/packet/ChunkVisibilityPacket.cpp similarity index 87% rename from Minecraft.World/Network/Packets/ChunkVisibilityPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/ChunkVisibilityPacket.cpp index 18c4172da..463ab86a0 100644 --- a/Minecraft.World/Network/Packets/ChunkVisibilityPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/ChunkVisibilityPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "ChunkVisibilityPacket.h" diff --git a/Minecraft.World/Network/Packets/ChunkVisibilityPacket.h b/Minecraft.World/net/minecraft/network/packet/ChunkVisibilityPacket.h similarity index 93% rename from Minecraft.World/Network/Packets/ChunkVisibilityPacket.h rename to Minecraft.World/net/minecraft/network/packet/ChunkVisibilityPacket.h index 34202ca5f..7b308053e 100644 --- a/Minecraft.World/Network/Packets/ChunkVisibilityPacket.h +++ b/Minecraft.World/net/minecraft/network/packet/ChunkVisibilityPacket.h @@ -2,7 +2,7 @@ #include "Packet.h" -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include #include "PacketListener.h" diff --git a/Minecraft.World/Network/Packets/ClientCommandPacket.cpp b/Minecraft.World/net/minecraft/network/packet/ClientCommandPacket.cpp similarity index 93% rename from Minecraft.World/Network/Packets/ClientCommandPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/ClientCommandPacket.cpp index 51397673c..fca8b013c 100644 --- a/Minecraft.World/Network/Packets/ClientCommandPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/ClientCommandPacket.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "PacketListener.h" #include "ClientCommandPacket.h" diff --git a/Minecraft.World/Network/Packets/ClientCommandPacket.h b/Minecraft.World/net/minecraft/network/packet/ClientCommandPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/ClientCommandPacket.h rename to Minecraft.World/net/minecraft/network/packet/ClientCommandPacket.h diff --git a/Minecraft.World/Network/Packets/ClientInformationPacket.h b/Minecraft.World/net/minecraft/network/packet/ClientInformationPacket.h similarity index 58% rename from Minecraft.World/Network/Packets/ClientInformationPacket.h rename to Minecraft.World/net/minecraft/network/packet/ClientInformationPacket.h index f4b73ad27..fbb376ab2 100644 --- a/Minecraft.World/Network/Packets/ClientInformationPacket.h +++ b/Minecraft.World/net/minecraft/network/packet/ClientInformationPacket.h @@ -1,5 +1,5 @@ #pragma once -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" class ClientInformationPacket : public Packet {}; \ No newline at end of file diff --git a/Minecraft.World/Network/Packets/ClientProtocolPacket.h b/Minecraft.World/net/minecraft/network/packet/ClientProtocolPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/ClientProtocolPacket.h rename to Minecraft.World/net/minecraft/network/packet/ClientProtocolPacket.h diff --git a/Minecraft.World/Network/Packets/ComplexItemDataPacket.cpp b/Minecraft.World/net/minecraft/network/packet/ComplexItemDataPacket.cpp similarity index 91% rename from Minecraft.World/Network/Packets/ComplexItemDataPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/ComplexItemDataPacket.cpp index a6767cc65..926b7ffa4 100644 --- a/Minecraft.World/Network/Packets/ComplexItemDataPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/ComplexItemDataPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "ComplexItemDataPacket.h" diff --git a/Minecraft.World/Network/Packets/ComplexItemDataPacket.h b/Minecraft.World/net/minecraft/network/packet/ComplexItemDataPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/ComplexItemDataPacket.h rename to Minecraft.World/net/minecraft/network/packet/ComplexItemDataPacket.h diff --git a/Minecraft.World/Network/Packets/ContainerAckPacket.cpp b/Minecraft.World/net/minecraft/network/packet/ContainerAckPacket.cpp similarity index 88% rename from Minecraft.World/Network/Packets/ContainerAckPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/ContainerAckPacket.cpp index b78211a49..fc7eeff59 100644 --- a/Minecraft.World/Network/Packets/ContainerAckPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/ContainerAckPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "ContainerAckPacket.h" diff --git a/Minecraft.World/Network/Packets/ContainerAckPacket.h b/Minecraft.World/net/minecraft/network/packet/ContainerAckPacket.h similarity index 93% rename from Minecraft.World/Network/Packets/ContainerAckPacket.h rename to Minecraft.World/net/minecraft/network/packet/ContainerAckPacket.h index 92a931fa4..245439d6e 100644 --- a/Minecraft.World/Network/Packets/ContainerAckPacket.h +++ b/Minecraft.World/net/minecraft/network/packet/ContainerAckPacket.h @@ -2,7 +2,7 @@ #include "Packet.h" -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include #include "PacketListener.h" diff --git a/Minecraft.World/Network/Packets/ContainerButtonClickPacket.cpp b/Minecraft.World/net/minecraft/network/packet/ContainerButtonClickPacket.cpp similarity index 82% rename from Minecraft.World/Network/Packets/ContainerButtonClickPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/ContainerButtonClickPacket.cpp index 512535ded..c8fed699b 100644 --- a/Minecraft.World/Network/Packets/ContainerButtonClickPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/ContainerButtonClickPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.entity.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/entity/net.minecraft.world.entity.h" #include "PacketListener.h" #include "ContainerButtonClickPacket.h" diff --git a/Minecraft.World/Network/Packets/ContainerButtonClickPacket.h b/Minecraft.World/net/minecraft/network/packet/ContainerButtonClickPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/ContainerButtonClickPacket.h rename to Minecraft.World/net/minecraft/network/packet/ContainerButtonClickPacket.h diff --git a/Minecraft.World/Network/Packets/ContainerClickPacket.cpp b/Minecraft.World/net/minecraft/network/packet/ContainerClickPacket.cpp similarity index 90% rename from Minecraft.World/Network/Packets/ContainerClickPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/ContainerClickPacket.cpp index de1e780d6..3e96482d5 100644 --- a/Minecraft.World/Network/Packets/ContainerClickPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/ContainerClickPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.item.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/item/net.minecraft.world.item.h" #include "PacketListener.h" #include "ContainerClickPacket.h" diff --git a/Minecraft.World/Network/Packets/ContainerClickPacket.h b/Minecraft.World/net/minecraft/network/packet/ContainerClickPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/ContainerClickPacket.h rename to Minecraft.World/net/minecraft/network/packet/ContainerClickPacket.h diff --git a/Minecraft.World/Network/Packets/ContainerClosePacket.cpp b/Minecraft.World/net/minecraft/network/packet/ContainerClosePacket.cpp similarity index 84% rename from Minecraft.World/Network/Packets/ContainerClosePacket.cpp rename to Minecraft.World/net/minecraft/network/packet/ContainerClosePacket.cpp index bd8471950..e72bcb8c2 100644 --- a/Minecraft.World/Network/Packets/ContainerClosePacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/ContainerClosePacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "ContainerClosePacket.h" diff --git a/Minecraft.World/Network/Packets/ContainerClosePacket.h b/Minecraft.World/net/minecraft/network/packet/ContainerClosePacket.h similarity index 100% rename from Minecraft.World/Network/Packets/ContainerClosePacket.h rename to Minecraft.World/net/minecraft/network/packet/ContainerClosePacket.h diff --git a/Minecraft.World/Network/Packets/ContainerOpenPacket.cpp b/Minecraft.World/net/minecraft/network/packet/ContainerOpenPacket.cpp similarity index 94% rename from Minecraft.World/Network/Packets/ContainerOpenPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/ContainerOpenPacket.cpp index c70949f71..d1acd3f1d 100644 --- a/Minecraft.World/Network/Packets/ContainerOpenPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/ContainerOpenPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "ContainerOpenPacket.h" diff --git a/Minecraft.World/Network/Packets/ContainerOpenPacket.h b/Minecraft.World/net/minecraft/network/packet/ContainerOpenPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/ContainerOpenPacket.h rename to Minecraft.World/net/minecraft/network/packet/ContainerOpenPacket.h diff --git a/Minecraft.World/Network/Packets/ContainerSetContentPacket.cpp b/Minecraft.World/net/minecraft/network/packet/ContainerSetContentPacket.cpp similarity index 88% rename from Minecraft.World/Network/Packets/ContainerSetContentPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/ContainerSetContentPacket.cpp index b25b11f2d..73e28d6a1 100644 --- a/Minecraft.World/Network/Packets/ContainerSetContentPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/ContainerSetContentPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.item.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/item/net.minecraft.world.item.h" #include "PacketListener.h" #include "ContainerSetContentPacket.h" diff --git a/Minecraft.World/Network/Packets/ContainerSetContentPacket.h b/Minecraft.World/net/minecraft/network/packet/ContainerSetContentPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/ContainerSetContentPacket.h rename to Minecraft.World/net/minecraft/network/packet/ContainerSetContentPacket.h diff --git a/Minecraft.World/Network/Packets/ContainerSetDataPacket.cpp b/Minecraft.World/net/minecraft/network/packet/ContainerSetDataPacket.cpp similarity index 88% rename from Minecraft.World/Network/Packets/ContainerSetDataPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/ContainerSetDataPacket.cpp index a69818a49..9b59a5869 100644 --- a/Minecraft.World/Network/Packets/ContainerSetDataPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/ContainerSetDataPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "ContainerSetDataPacket.h" diff --git a/Minecraft.World/Network/Packets/ContainerSetDataPacket.h b/Minecraft.World/net/minecraft/network/packet/ContainerSetDataPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/ContainerSetDataPacket.h rename to Minecraft.World/net/minecraft/network/packet/ContainerSetDataPacket.h diff --git a/Minecraft.World/Network/Packets/ContainerSetSlotPacket.cpp b/Minecraft.World/net/minecraft/network/packet/ContainerSetSlotPacket.cpp similarity index 88% rename from Minecraft.World/Network/Packets/ContainerSetSlotPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/ContainerSetSlotPacket.cpp index 5483c1a90..aec79be3a 100644 --- a/Minecraft.World/Network/Packets/ContainerSetSlotPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/ContainerSetSlotPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.item.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/item/net.minecraft.world.item.h" #include "PacketListener.h" #include "ContainerSetSlotPacket.h" diff --git a/Minecraft.World/Network/Packets/ContainerSetSlotPacket.h b/Minecraft.World/net/minecraft/network/packet/ContainerSetSlotPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/ContainerSetSlotPacket.h rename to Minecraft.World/net/minecraft/network/packet/ContainerSetSlotPacket.h diff --git a/Minecraft.World/Network/Packets/CraftItemPacket.cpp b/Minecraft.World/net/minecraft/network/packet/CraftItemPacket.cpp similarity index 80% rename from Minecraft.World/Network/Packets/CraftItemPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/CraftItemPacket.cpp index 59f981a03..a691a3899 100644 --- a/Minecraft.World/Network/Packets/CraftItemPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/CraftItemPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.item.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/item/net.minecraft.world.item.h" #include "PacketListener.h" #include "CraftItemPacket.h" diff --git a/Minecraft.World/Network/Packets/CraftItemPacket.h b/Minecraft.World/net/minecraft/network/packet/CraftItemPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/CraftItemPacket.h rename to Minecraft.World/net/minecraft/network/packet/CraftItemPacket.h diff --git a/Minecraft.World/Network/Packets/CustomPayloadPacket.cpp b/Minecraft.World/net/minecraft/network/packet/CustomPayloadPacket.cpp similarity index 94% rename from Minecraft.World/Network/Packets/CustomPayloadPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/CustomPayloadPacket.cpp index 87e9af094..ff229363e 100644 --- a/Minecraft.World/Network/Packets/CustomPayloadPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/CustomPayloadPacket.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../Header Files/stdafx.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "CustomPayloadPacket.h" #include diff --git a/Minecraft.World/Network/Packets/CustomPayloadPacket.h b/Minecraft.World/net/minecraft/network/packet/CustomPayloadPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/CustomPayloadPacket.h rename to Minecraft.World/net/minecraft/network/packet/CustomPayloadPacket.h diff --git a/Minecraft.World/Network/Packets/DebugOptionsPacket.cpp b/Minecraft.World/net/minecraft/network/packet/DebugOptionsPacket.cpp similarity index 79% rename from Minecraft.World/Network/Packets/DebugOptionsPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/DebugOptionsPacket.cpp index 3dcbbe295..efecbb485 100644 --- a/Minecraft.World/Network/Packets/DebugOptionsPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/DebugOptionsPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.item.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/item/net.minecraft.world.item.h" #include "PacketListener.h" #include "DebugOptionsPacket.h" diff --git a/Minecraft.World/Network/Packets/DebugOptionsPacket.h b/Minecraft.World/net/minecraft/network/packet/DebugOptionsPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/DebugOptionsPacket.h rename to Minecraft.World/net/minecraft/network/packet/DebugOptionsPacket.h diff --git a/Minecraft.World/Network/Packets/DisconnectPacket.cpp b/Minecraft.World/net/minecraft/network/packet/DisconnectPacket.cpp similarity index 86% rename from Minecraft.World/Network/Packets/DisconnectPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/DisconnectPacket.cpp index 2da1665d6..f864f8599 100644 --- a/Minecraft.World/Network/Packets/DisconnectPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/DisconnectPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Util/SharedConstants.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../SharedConstants.h" #include "PacketListener.h" #include "DisconnectPacket.h" diff --git a/Minecraft.World/Network/Packets/DisconnectPacket.h b/Minecraft.World/net/minecraft/network/packet/DisconnectPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/DisconnectPacket.h rename to Minecraft.World/net/minecraft/network/packet/DisconnectPacket.h diff --git a/Minecraft.World/Network/Packets/EntityActionAtPositionPacket.cpp b/Minecraft.World/net/minecraft/network/packet/EntityActionAtPositionPacket.cpp similarity index 86% rename from Minecraft.World/Network/Packets/EntityActionAtPositionPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/EntityActionAtPositionPacket.cpp index 4a0255fee..63d455c95 100644 --- a/Minecraft.World/Network/Packets/EntityActionAtPositionPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/EntityActionAtPositionPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.entity.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/entity/net.minecraft.world.entity.h" #include "PacketListener.h" #include "EntityActionAtPositionPacket.h" diff --git a/Minecraft.World/Network/Packets/EntityActionAtPositionPacket.h b/Minecraft.World/net/minecraft/network/packet/EntityActionAtPositionPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/EntityActionAtPositionPacket.h rename to Minecraft.World/net/minecraft/network/packet/EntityActionAtPositionPacket.h diff --git a/Minecraft.World/Network/Packets/EntityEventPacket.cpp b/Minecraft.World/net/minecraft/network/packet/EntityEventPacket.cpp similarity index 86% rename from Minecraft.World/Network/Packets/EntityEventPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/EntityEventPacket.cpp index 18ac96cef..3cae4a5db 100644 --- a/Minecraft.World/Network/Packets/EntityEventPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/EntityEventPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "EntityEventPacket.h" diff --git a/Minecraft.World/Network/Packets/EntityEventPacket.h b/Minecraft.World/net/minecraft/network/packet/EntityEventPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/EntityEventPacket.h rename to Minecraft.World/net/minecraft/network/packet/EntityEventPacket.h diff --git a/Minecraft.World/Network/Packets/ExplodePacket.cpp b/Minecraft.World/net/minecraft/network/packet/ExplodePacket.cpp similarity index 94% rename from Minecraft.World/Network/Packets/ExplodePacket.cpp rename to Minecraft.World/net/minecraft/network/packet/ExplodePacket.cpp index 97650af0d..b355b2efd 100644 --- a/Minecraft.World/Network/Packets/ExplodePacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/ExplodePacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/level/net.minecraft.world.level.h" #include "PacketListener.h" #include "ExplodePacket.h" diff --git a/Minecraft.World/Network/Packets/ExplodePacket.h b/Minecraft.World/net/minecraft/network/packet/ExplodePacket.h similarity index 96% rename from Minecraft.World/Network/Packets/ExplodePacket.h rename to Minecraft.World/net/minecraft/network/packet/ExplodePacket.h index c6b0a5bd4..9ffc077a6 100644 --- a/Minecraft.World/Network/Packets/ExplodePacket.h +++ b/Minecraft.World/net/minecraft/network/packet/ExplodePacket.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Level/TilePos.h" +#include "../../world/level/TilePos.h" #include "Packet.h" class ExplodePacket : public Packet, diff --git a/Minecraft.World/Network/Packets/GameCommandPacket.cpp b/Minecraft.World/net/minecraft/network/packet/GameCommandPacket.cpp similarity index 92% rename from Minecraft.World/Network/Packets/GameCommandPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/GameCommandPacket.cpp index 33d1ebbf7..04a7ce3ab 100644 --- a/Minecraft.World/Network/Packets/GameCommandPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/GameCommandPacket.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../Header Files/stdafx.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "GameCommandPacket.h" #include diff --git a/Minecraft.World/Network/Packets/GameCommandPacket.h b/Minecraft.World/net/minecraft/network/packet/GameCommandPacket.h similarity index 94% rename from Minecraft.World/Network/Packets/GameCommandPacket.h rename to Minecraft.World/net/minecraft/network/packet/GameCommandPacket.h index cb8e9d5dd..453d61fca 100644 --- a/Minecraft.World/Network/Packets/GameCommandPacket.h +++ b/Minecraft.World/net/minecraft/network/packet/GameCommandPacket.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Commands/CommandsEnum.h" +#include "../../commands/CommandsEnum.h" #include "Packet.h" class GameCommandPacket diff --git a/Minecraft.World/Network/Packets/GameEventPacket.cpp b/Minecraft.World/net/minecraft/network/packet/GameEventPacket.cpp similarity index 92% rename from Minecraft.World/Network/Packets/GameEventPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/GameEventPacket.cpp index 0b5504141..d12a6ddb7 100644 --- a/Minecraft.World/Network/Packets/GameEventPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/GameEventPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "GameEventPacket.h" diff --git a/Minecraft.World/Network/Packets/GameEventPacket.h b/Minecraft.World/net/minecraft/network/packet/GameEventPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/GameEventPacket.h rename to Minecraft.World/net/minecraft/network/packet/GameEventPacket.h diff --git a/Minecraft.World/Network/Packets/GetInfoPacket.cpp b/Minecraft.World/net/minecraft/network/packet/GetInfoPacket.cpp similarity index 72% rename from Minecraft.World/Network/Packets/GetInfoPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/GetInfoPacket.cpp index ddec91bb7..858c8e40c 100644 --- a/Minecraft.World/Network/Packets/GetInfoPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/GetInfoPacket.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../Header Files/stdafx.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "GetInfoPacket.h" diff --git a/Minecraft.World/Network/Packets/GetInfoPacket.h b/Minecraft.World/net/minecraft/network/packet/GetInfoPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/GetInfoPacket.h rename to Minecraft.World/net/minecraft/network/packet/GetInfoPacket.h diff --git a/Minecraft.World/Network/Packets/InteractPacket.cpp b/Minecraft.World/net/minecraft/network/packet/InteractPacket.cpp similarity index 88% rename from Minecraft.World/Network/Packets/InteractPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/InteractPacket.cpp index 2078127ed..6a67ea236 100644 --- a/Minecraft.World/Network/Packets/InteractPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/InteractPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "InteractPacket.h" diff --git a/Minecraft.World/Network/Packets/InteractPacket.h b/Minecraft.World/net/minecraft/network/packet/InteractPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/InteractPacket.h rename to Minecraft.World/net/minecraft/network/packet/InteractPacket.h diff --git a/Minecraft.World/Network/Packets/KeepAlivePacket.cpp b/Minecraft.World/net/minecraft/network/packet/KeepAlivePacket.cpp similarity index 86% rename from Minecraft.World/Network/Packets/KeepAlivePacket.cpp rename to Minecraft.World/net/minecraft/network/packet/KeepAlivePacket.cpp index e5a4329ab..171c418ad 100644 --- a/Minecraft.World/Network/Packets/KeepAlivePacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/KeepAlivePacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "KeepAlivePacket.h" diff --git a/Minecraft.World/Network/Packets/KeepAlivePacket.h b/Minecraft.World/net/minecraft/network/packet/KeepAlivePacket.h similarity index 100% rename from Minecraft.World/Network/Packets/KeepAlivePacket.h rename to Minecraft.World/net/minecraft/network/packet/KeepAlivePacket.h diff --git a/Minecraft.World/Network/Packets/KickPlayerPacket.cpp b/Minecraft.World/net/minecraft/network/packet/KickPlayerPacket.cpp similarity index 84% rename from Minecraft.World/Network/Packets/KickPlayerPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/KickPlayerPacket.cpp index c1d52e149..95e28691c 100644 --- a/Minecraft.World/Network/Packets/KickPlayerPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/KickPlayerPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "KickPlayerPacket.h" diff --git a/Minecraft.World/Network/Packets/KickPlayerPacket.h b/Minecraft.World/net/minecraft/network/packet/KickPlayerPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/KickPlayerPacket.h rename to Minecraft.World/net/minecraft/network/packet/KickPlayerPacket.h diff --git a/Minecraft.World/Network/Packets/LevelEventPacket.cpp b/Minecraft.World/net/minecraft/network/packet/LevelEventPacket.cpp similarity index 90% rename from Minecraft.World/Network/Packets/LevelEventPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/LevelEventPacket.cpp index 21f01e753..ffe45cdb0 100644 --- a/Minecraft.World/Network/Packets/LevelEventPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/LevelEventPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "LevelEventPacket.h" diff --git a/Minecraft.World/Network/Packets/LevelEventPacket.h b/Minecraft.World/net/minecraft/network/packet/LevelEventPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/LevelEventPacket.h rename to Minecraft.World/net/minecraft/network/packet/LevelEventPacket.h diff --git a/Minecraft.World/Network/Packets/LevelParticlesPacket.cpp b/Minecraft.World/net/minecraft/network/packet/LevelParticlesPacket.cpp similarity index 97% rename from Minecraft.World/Network/Packets/LevelParticlesPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/LevelParticlesPacket.cpp index a844f3a02..2eba51f9f 100644 --- a/Minecraft.World/Network/Packets/LevelParticlesPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/LevelParticlesPacket.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "PacketListener.h" #include "LevelParticlesPacket.h" diff --git a/Minecraft.World/Network/Packets/LevelParticlesPacket.h b/Minecraft.World/net/minecraft/network/packet/LevelParticlesPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/LevelParticlesPacket.h rename to Minecraft.World/net/minecraft/network/packet/LevelParticlesPacket.h diff --git a/Minecraft.World/Network/Packets/LevelSoundPacket.cpp b/Minecraft.World/net/minecraft/network/packet/LevelSoundPacket.cpp similarity index 92% rename from Minecraft.World/Network/Packets/LevelSoundPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/LevelSoundPacket.cpp index 269136de6..2da855fc8 100644 --- a/Minecraft.World/Network/Packets/LevelSoundPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/LevelSoundPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.network.packet.h" +#include "../../../../Header Files/stdafx.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "net.minecraft.network.packet.h" #include "LevelSoundPacket.h" #include diff --git a/Minecraft.World/Network/Packets/LevelSoundPacket.h b/Minecraft.World/net/minecraft/network/packet/LevelSoundPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/LevelSoundPacket.h rename to Minecraft.World/net/minecraft/network/packet/LevelSoundPacket.h diff --git a/Minecraft.World/Network/Packets/LoginPacket.cpp b/Minecraft.World/net/minecraft/network/packet/LoginPacket.cpp similarity index 96% rename from Minecraft.World/Network/Packets/LoginPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/LoginPacket.cpp index da4a00667..f13f6f94e 100644 --- a/Minecraft.World/Network/Packets/LoginPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/LoginPacket.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.entity.player.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/entity/player/net.minecraft.world.entity.player.h" #include "PacketListener.h" #include "LoginPacket.h" -#include "../../Level/Storage/LevelType.h" +#include "../../world/level/LevelType.h" LoginPacket::LoginPacket() { this->userName = L""; diff --git a/Minecraft.World/Network/Packets/LoginPacket.h b/Minecraft.World/net/minecraft/network/packet/LoginPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/LoginPacket.h rename to Minecraft.World/net/minecraft/network/packet/LoginPacket.h diff --git a/Minecraft.World/Network/Packets/MoveEntityPacket.cpp b/Minecraft.World/net/minecraft/network/packet/MoveEntityPacket.cpp similarity index 96% rename from Minecraft.World/Network/Packets/MoveEntityPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/MoveEntityPacket.cpp index 1d4d114b2..fed630029 100644 --- a/Minecraft.World/Network/Packets/MoveEntityPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/MoveEntityPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "MoveEntityPacket.h" diff --git a/Minecraft.World/Network/Packets/MoveEntityPacket.h b/Minecraft.World/net/minecraft/network/packet/MoveEntityPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/MoveEntityPacket.h rename to Minecraft.World/net/minecraft/network/packet/MoveEntityPacket.h diff --git a/Minecraft.World/Network/Packets/MoveEntityPacketSmall.cpp b/Minecraft.World/net/minecraft/network/packet/MoveEntityPacketSmall.cpp similarity index 97% rename from Minecraft.World/Network/Packets/MoveEntityPacketSmall.cpp rename to Minecraft.World/net/minecraft/network/packet/MoveEntityPacketSmall.cpp index 844e400ba..dabf86ead 100644 --- a/Minecraft.World/Network/Packets/MoveEntityPacketSmall.cpp +++ b/Minecraft.World/net/minecraft/network/packet/MoveEntityPacketSmall.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "MoveEntityPacketSmall.h" diff --git a/Minecraft.World/Network/Packets/MoveEntityPacketSmall.h b/Minecraft.World/net/minecraft/network/packet/MoveEntityPacketSmall.h similarity index 100% rename from Minecraft.World/Network/Packets/MoveEntityPacketSmall.h rename to Minecraft.World/net/minecraft/network/packet/MoveEntityPacketSmall.h diff --git a/Minecraft.World/Network/Packets/MovePlayerPacket.cpp b/Minecraft.World/net/minecraft/network/packet/MovePlayerPacket.cpp similarity index 97% rename from Minecraft.World/Network/Packets/MovePlayerPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/MovePlayerPacket.cpp index e296dc7cf..63e6dd5c7 100644 --- a/Minecraft.World/Network/Packets/MovePlayerPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/MovePlayerPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "MovePlayerPacket.h" diff --git a/Minecraft.World/Network/Packets/MovePlayerPacket.h b/Minecraft.World/net/minecraft/network/packet/MovePlayerPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/MovePlayerPacket.h rename to Minecraft.World/net/minecraft/network/packet/MovePlayerPacket.h diff --git a/Minecraft.World/Network/Packets/Packet.cpp b/Minecraft.World/net/minecraft/network/packet/Packet.cpp similarity index 98% rename from Minecraft.World/Network/Packets/Packet.cpp rename to Minecraft.World/net/minecraft/network/packet/Packet.cpp index 3ea1bbb7a..d1f761ed9 100644 --- a/Minecraft.World/Network/Packets/Packet.cpp +++ b/Minecraft.World/net/minecraft/network/packet/Packet.cpp @@ -1,14 +1,14 @@ -#include "../../Platform/stdafx.h" -#include "../../Platform/System.h" -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.network.packet.h" +#include "../../../../Header Files/stdafx.h" +#include "../../../../ConsoleJavaLibs/System.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "net.minecraft.network.packet.h" #include "PacketListener.h" #include "Packet.h" -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../com/mojang/nbt/com.mojang.nbt.h" #if !defined(_CONTENT_PACKAGE) -#include "../../../Minecraft.Client/Minecraft.h" -#include "../../../Minecraft.Client/UI/Gui.h" +#include "../../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../../../Minecraft.Client/net/minecraft/client/gui/Gui.h" #endif void Packet::staticCtor() { diff --git a/Minecraft.World/Network/Packets/Packet.h b/Minecraft.World/net/minecraft/network/packet/Packet.h similarity index 100% rename from Minecraft.World/Network/Packets/Packet.h rename to Minecraft.World/net/minecraft/network/packet/Packet.h diff --git a/Minecraft.World/Network/Packets/PacketListener.cpp b/Minecraft.World/net/minecraft/network/packet/PacketListener.cpp similarity index 99% rename from Minecraft.World/Network/Packets/PacketListener.cpp rename to Minecraft.World/net/minecraft/network/packet/PacketListener.cpp index db1045e03..88071202a 100644 --- a/Minecraft.World/Network/Packets/PacketListener.cpp +++ b/Minecraft.World/net/minecraft/network/packet/PacketListener.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.network.packet.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.network.packet.h" #include "PacketListener.h" void PacketListener::handleBlockRegionUpdate( diff --git a/Minecraft.World/Network/Packets/PacketListener.h b/Minecraft.World/net/minecraft/network/packet/PacketListener.h similarity index 100% rename from Minecraft.World/Network/Packets/PacketListener.h rename to Minecraft.World/net/minecraft/network/packet/PacketListener.h diff --git a/Minecraft.World/Network/Packets/PlayerAbilitiesPacket.cpp b/Minecraft.World/net/minecraft/network/packet/PlayerAbilitiesPacket.cpp similarity index 94% rename from Minecraft.World/Network/Packets/PlayerAbilitiesPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/PlayerAbilitiesPacket.cpp index 52b977607..212e3ca19 100644 --- a/Minecraft.World/Network/Packets/PlayerAbilitiesPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/PlayerAbilitiesPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.network.packet.h" +#include "../../../../Header Files/stdafx.h" +#include "../../world/entity/player/net.minecraft.world.entity.player.h" +#include "net.minecraft.network.packet.h" #include "PlayerAbilitiesPacket.h" PlayerAbilitiesPacket::PlayerAbilitiesPacket() { diff --git a/Minecraft.World/Network/Packets/PlayerAbilitiesPacket.h b/Minecraft.World/net/minecraft/network/packet/PlayerAbilitiesPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/PlayerAbilitiesPacket.h rename to Minecraft.World/net/minecraft/network/packet/PlayerAbilitiesPacket.h diff --git a/Minecraft.World/Network/Packets/PlayerActionPacket.cpp b/Minecraft.World/net/minecraft/network/packet/PlayerActionPacket.cpp similarity index 91% rename from Minecraft.World/Network/Packets/PlayerActionPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/PlayerActionPacket.cpp index b1f585297..306001e5e 100644 --- a/Minecraft.World/Network/Packets/PlayerActionPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/PlayerActionPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "PlayerActionPacket.h" diff --git a/Minecraft.World/Network/Packets/PlayerActionPacket.h b/Minecraft.World/net/minecraft/network/packet/PlayerActionPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/PlayerActionPacket.h rename to Minecraft.World/net/minecraft/network/packet/PlayerActionPacket.h diff --git a/Minecraft.World/Network/Packets/PlayerCommandPacket.cpp b/Minecraft.World/net/minecraft/network/packet/PlayerCommandPacket.cpp similarity index 89% rename from Minecraft.World/Network/Packets/PlayerCommandPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/PlayerCommandPacket.cpp index 2f0996811..9aa28856f 100644 --- a/Minecraft.World/Network/Packets/PlayerCommandPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/PlayerCommandPacket.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" -#include "../../Headers/net.minecraft.world.entity.h" +#include "../../world/entity/net.minecraft.world.entity.h" #include "PlayerCommandPacket.h" const int PlayerCommandPacket::START_SNEAKING = 1; diff --git a/Minecraft.World/Network/Packets/PlayerCommandPacket.h b/Minecraft.World/net/minecraft/network/packet/PlayerCommandPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/PlayerCommandPacket.h rename to Minecraft.World/net/minecraft/network/packet/PlayerCommandPacket.h diff --git a/Minecraft.World/Network/Packets/PlayerInfoPacket.cpp b/Minecraft.World/net/minecraft/network/packet/PlayerInfoPacket.cpp similarity index 82% rename from Minecraft.World/Network/Packets/PlayerInfoPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/PlayerInfoPacket.cpp index 30b80762b..b351c353f 100644 --- a/Minecraft.World/Network/Packets/PlayerInfoPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/PlayerInfoPacket.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../../Minecraft.Client/Player/ServerPlayer.h" -#include "../../../Minecraft.Client/Network/PlayerConnection.h" +#include "../../../../Header Files/stdafx.h" +#include "../../world/entity/player/net.minecraft.world.entity.player.h" +#include "../../../Minecraft.Client/net/minecraft/server/level/ServerPlayer.h" +#include "../../../Minecraft.Client/net/minecraft/server/network/PlayerConnection.h" #ifndef __linux__ #include #endif // __linux__ #include "PacketListener.h" -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PlayerInfoPacket.h" PlayerInfoPacket::PlayerInfoPacket() { diff --git a/Minecraft.World/Network/Packets/PlayerInfoPacket.h b/Minecraft.World/net/minecraft/network/packet/PlayerInfoPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/PlayerInfoPacket.h rename to Minecraft.World/net/minecraft/network/packet/PlayerInfoPacket.h diff --git a/Minecraft.World/Network/Packets/PlayerInputPacket.cpp b/Minecraft.World/net/minecraft/network/packet/PlayerInputPacket.cpp similarity index 91% rename from Minecraft.World/Network/Packets/PlayerInputPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/PlayerInputPacket.cpp index 8f1bad5b2..0a90ddef2 100644 --- a/Minecraft.World/Network/Packets/PlayerInputPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/PlayerInputPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "PlayerInputPacket.h" diff --git a/Minecraft.World/Network/Packets/PlayerInputPacket.h b/Minecraft.World/net/minecraft/network/packet/PlayerInputPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/PlayerInputPacket.h rename to Minecraft.World/net/minecraft/network/packet/PlayerInputPacket.h diff --git a/Minecraft.World/Network/Packets/PreLoginPacket.cpp b/Minecraft.World/net/minecraft/network/packet/PreLoginPacket.cpp similarity index 96% rename from Minecraft.World/Network/Packets/PreLoginPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/PreLoginPacket.cpp index 4173fd6a8..8dbb25985 100644 --- a/Minecraft.World/Network/Packets/PreLoginPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/PreLoginPacket.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include #include #include #include "PacketListener.h" #include "PreLoginPacket.h" -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" PreLoginPacket::PreLoginPacket() { loginKey = L""; diff --git a/Minecraft.World/Network/Packets/PreLoginPacket.h b/Minecraft.World/net/minecraft/network/packet/PreLoginPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/PreLoginPacket.h rename to Minecraft.World/net/minecraft/network/packet/PreLoginPacket.h diff --git a/Minecraft.World/Network/Packets/RemoveEntitiesPacket.cpp b/Minecraft.World/net/minecraft/network/packet/RemoveEntitiesPacket.cpp similarity index 85% rename from Minecraft.World/Network/Packets/RemoveEntitiesPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/RemoveEntitiesPacket.cpp index 1b745c698..7d4cbecca 100644 --- a/Minecraft.World/Network/Packets/RemoveEntitiesPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/RemoveEntitiesPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../Util/ArrayWithLength.h" -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleHelpers/ArrayWithLength.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "RemoveEntitiesPacket.h" diff --git a/Minecraft.World/Network/Packets/RemoveEntitiesPacket.h b/Minecraft.World/net/minecraft/network/packet/RemoveEntitiesPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/RemoveEntitiesPacket.h rename to Minecraft.World/net/minecraft/network/packet/RemoveEntitiesPacket.h diff --git a/Minecraft.World/Network/Packets/RemoveMobEffectPacket.cpp b/Minecraft.World/net/minecraft/network/packet/RemoveMobEffectPacket.cpp similarity index 80% rename from Minecraft.World/Network/Packets/RemoveMobEffectPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/RemoveMobEffectPacket.cpp index 67604d3a2..34071dd2e 100644 --- a/Minecraft.World/Network/Packets/RemoveMobEffectPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/RemoveMobEffectPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.effect.h" -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../Header Files/stdafx.h" +#include "../../world/effect/net.minecraft.world.effect.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "RemoveMobEffectPacket.h" diff --git a/Minecraft.World/Network/Packets/RemoveMobEffectPacket.h b/Minecraft.World/net/minecraft/network/packet/RemoveMobEffectPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/RemoveMobEffectPacket.h rename to Minecraft.World/net/minecraft/network/packet/RemoveMobEffectPacket.h diff --git a/Minecraft.World/Network/Packets/RespawnPacket.cpp b/Minecraft.World/net/minecraft/network/packet/RespawnPacket.cpp similarity index 94% rename from Minecraft.World/Network/Packets/RespawnPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/RespawnPacket.cpp index 494648da5..38e2b9afb 100644 --- a/Minecraft.World/Network/Packets/RespawnPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/RespawnPacket.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "RespawnPacket.h" -#include "../../Level/Storage/LevelType.h" +#include "../../world/level/LevelType.h" RespawnPacket::RespawnPacket() { this->dimension = 0; diff --git a/Minecraft.World/Network/Packets/RespawnPacket.h b/Minecraft.World/net/minecraft/network/packet/RespawnPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/RespawnPacket.h rename to Minecraft.World/net/minecraft/network/packet/RespawnPacket.h diff --git a/Minecraft.World/Network/Packets/RotateHeadPacket.cpp b/Minecraft.World/net/minecraft/network/packet/RotateHeadPacket.cpp similarity index 95% rename from Minecraft.World/Network/Packets/RotateHeadPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/RotateHeadPacket.cpp index ce9002fb1..f504b5cea 100644 --- a/Minecraft.World/Network/Packets/RotateHeadPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/RotateHeadPacket.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "RotateHeadPacket.h" diff --git a/Minecraft.World/Network/Packets/RotateHeadPacket.h b/Minecraft.World/net/minecraft/network/packet/RotateHeadPacket.h similarity index 90% rename from Minecraft.World/Network/Packets/RotateHeadPacket.h rename to Minecraft.World/net/minecraft/network/packet/RotateHeadPacket.h index b1120e57c..828aa5bd9 100644 --- a/Minecraft.World/Network/Packets/RotateHeadPacket.h +++ b/Minecraft.World/net/minecraft/network/packet/RotateHeadPacket.h @@ -1,6 +1,6 @@ #pragma once -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "Packet.h" diff --git a/Minecraft.World/Network/Packets/ServerAuthDataPacket.h b/Minecraft.World/net/minecraft/network/packet/ServerAuthDataPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/ServerAuthDataPacket.h rename to Minecraft.World/net/minecraft/network/packet/ServerAuthDataPacket.h diff --git a/Minecraft.World/Network/Packets/ServerSettingsChangedPacket.cpp b/Minecraft.World/net/minecraft/network/packet/ServerSettingsChangedPacket.cpp similarity index 87% rename from Minecraft.World/Network/Packets/ServerSettingsChangedPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/ServerSettingsChangedPacket.cpp index 441117163..f1c6a890d 100644 --- a/Minecraft.World/Network/Packets/ServerSettingsChangedPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/ServerSettingsChangedPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.item.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/item/net.minecraft.world.item.h" #include "PacketListener.h" #include "ServerSettingsChangedPacket.h" diff --git a/Minecraft.World/Network/Packets/ServerSettingsChangedPacket.h b/Minecraft.World/net/minecraft/network/packet/ServerSettingsChangedPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/ServerSettingsChangedPacket.h rename to Minecraft.World/net/minecraft/network/packet/ServerSettingsChangedPacket.h diff --git a/Minecraft.World/Network/Packets/SetCarriedItemPacket.cpp b/Minecraft.World/net/minecraft/network/packet/SetCarriedItemPacket.cpp similarity index 86% rename from Minecraft.World/Network/Packets/SetCarriedItemPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/SetCarriedItemPacket.cpp index 886cf1ae5..233b8208a 100644 --- a/Minecraft.World/Network/Packets/SetCarriedItemPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/SetCarriedItemPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "SetCarriedItemPacket.h" diff --git a/Minecraft.World/Network/Packets/SetCarriedItemPacket.h b/Minecraft.World/net/minecraft/network/packet/SetCarriedItemPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/SetCarriedItemPacket.h rename to Minecraft.World/net/minecraft/network/packet/SetCarriedItemPacket.h diff --git a/Minecraft.World/Network/Packets/SetCreativeModeSlotPacket.cpp b/Minecraft.World/net/minecraft/network/packet/SetCreativeModeSlotPacket.cpp similarity index 88% rename from Minecraft.World/Network/Packets/SetCreativeModeSlotPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/SetCreativeModeSlotPacket.cpp index 85e09bbcc..0cda8e9f9 100644 --- a/Minecraft.World/Network/Packets/SetCreativeModeSlotPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/SetCreativeModeSlotPacket.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../Header Files/stdafx.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "SetCreativeModeSlotPacket.h" diff --git a/Minecraft.World/Network/Packets/SetCreativeModeSlotPacket.h b/Minecraft.World/net/minecraft/network/packet/SetCreativeModeSlotPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/SetCreativeModeSlotPacket.h rename to Minecraft.World/net/minecraft/network/packet/SetCreativeModeSlotPacket.h diff --git a/Minecraft.World/Network/Packets/SetDisplayObjectivePacket.cpp b/Minecraft.World/net/minecraft/network/packet/SetDisplayObjectivePacket.cpp similarity index 90% rename from Minecraft.World/Network/Packets/SetDisplayObjectivePacket.cpp rename to Minecraft.World/net/minecraft/network/packet/SetDisplayObjectivePacket.cpp index 266c8130d..be8a491d6 100644 --- a/Minecraft.World/Network/Packets/SetDisplayObjectivePacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/SetDisplayObjectivePacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "PacketListener.h" -#include "../../Headers/net.minecraft.world.scores.h" +#include "../../world/scores/net.minecraft.world.scores.h" #include "SetDisplayObjectivePacket.h" SetDisplayObjectivePacket::SetDisplayObjectivePacket() { diff --git a/Minecraft.World/Network/Packets/SetDisplayObjectivePacket.h b/Minecraft.World/net/minecraft/network/packet/SetDisplayObjectivePacket.h similarity index 100% rename from Minecraft.World/Network/Packets/SetDisplayObjectivePacket.h rename to Minecraft.World/net/minecraft/network/packet/SetDisplayObjectivePacket.h diff --git a/Minecraft.World/Network/Packets/SetEntityDataPacket.cpp b/Minecraft.World/net/minecraft/network/packet/SetEntityDataPacket.cpp similarity index 86% rename from Minecraft.World/Network/Packets/SetEntityDataPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/SetEntityDataPacket.cpp index 74598842e..4f5985f8c 100644 --- a/Minecraft.World/Network/Packets/SetEntityDataPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/SetEntityDataPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.entity.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/entity/net.minecraft.world.entity.h" #include "PacketListener.h" #include "SetEntityDataPacket.h" diff --git a/Minecraft.World/Network/Packets/SetEntityDataPacket.h b/Minecraft.World/net/minecraft/network/packet/SetEntityDataPacket.h similarity index 94% rename from Minecraft.World/Network/Packets/SetEntityDataPacket.h rename to Minecraft.World/net/minecraft/network/packet/SetEntityDataPacket.h index 4ffffbc5d..4a6bf3881 100644 --- a/Minecraft.World/Network/Packets/SetEntityDataPacket.h +++ b/Minecraft.World/net/minecraft/network/packet/SetEntityDataPacket.h @@ -1,7 +1,7 @@ #pragma once #include "Packet.h" -#include "../../Entities/SyncedEntityData.h" +#include "../../world/entity/SyncedEntityData.h" class SetEntityDataPacket : public Packet, diff --git a/Minecraft.World/Network/Packets/SetEntityLinkPacket.cpp b/Minecraft.World/net/minecraft/network/packet/SetEntityLinkPacket.cpp similarity index 88% rename from Minecraft.World/Network/Packets/SetEntityLinkPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/SetEntityLinkPacket.cpp index 4172e3eba..52977acf9 100644 --- a/Minecraft.World/Network/Packets/SetEntityLinkPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/SetEntityLinkPacket.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" -#include "../../Headers/net.minecraft.world.entity.h" +#include "../../world/entity/net.minecraft.world.entity.h" #include "SetEntityLinkPacket.h" SetEntityLinkPacket::SetEntityLinkPacket() { diff --git a/Minecraft.World/Network/Packets/SetEntityLinkPacket.h b/Minecraft.World/net/minecraft/network/packet/SetEntityLinkPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/SetEntityLinkPacket.h rename to Minecraft.World/net/minecraft/network/packet/SetEntityLinkPacket.h diff --git a/Minecraft.World/Network/Packets/SetEntityMotionPacket.cpp b/Minecraft.World/net/minecraft/network/packet/SetEntityMotionPacket.cpp similarity index 93% rename from Minecraft.World/Network/Packets/SetEntityMotionPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/SetEntityMotionPacket.cpp index 4e37d3eb1..a949e5d9d 100644 --- a/Minecraft.World/Network/Packets/SetEntityMotionPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/SetEntityMotionPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.entity.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/entity/net.minecraft.world.entity.h" #include "PacketListener.h" #include "SetEntityMotionPacket.h" diff --git a/Minecraft.World/Network/Packets/SetEntityMotionPacket.h b/Minecraft.World/net/minecraft/network/packet/SetEntityMotionPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/SetEntityMotionPacket.h rename to Minecraft.World/net/minecraft/network/packet/SetEntityMotionPacket.h diff --git a/Minecraft.World/Network/Packets/SetEquippedItemPacket.cpp b/Minecraft.World/net/minecraft/network/packet/SetEquippedItemPacket.cpp similarity index 92% rename from Minecraft.World/Network/Packets/SetEquippedItemPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/SetEquippedItemPacket.cpp index 1e47d66cb..a24b36bac 100644 --- a/Minecraft.World/Network/Packets/SetEquippedItemPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/SetEquippedItemPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.item.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/item/net.minecraft.world.item.h" #include "PacketListener.h" #include "SetEquippedItemPacket.h" diff --git a/Minecraft.World/Network/Packets/SetEquippedItemPacket.h b/Minecraft.World/net/minecraft/network/packet/SetEquippedItemPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/SetEquippedItemPacket.h rename to Minecraft.World/net/minecraft/network/packet/SetEquippedItemPacket.h diff --git a/Minecraft.World/Network/Packets/SetExperiencePacket.cpp b/Minecraft.World/net/minecraft/network/packet/SetExperiencePacket.cpp similarity index 91% rename from Minecraft.World/Network/Packets/SetExperiencePacket.cpp rename to Minecraft.World/net/minecraft/network/packet/SetExperiencePacket.cpp index 0966b55e6..1843b8658 100644 --- a/Minecraft.World/Network/Packets/SetExperiencePacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/SetExperiencePacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "SetExperiencePacket.h" #include "PacketListener.h" -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" SetExperiencePacket::SetExperiencePacket() { this->experienceProgress = 0; diff --git a/Minecraft.World/Network/Packets/SetExperiencePacket.h b/Minecraft.World/net/minecraft/network/packet/SetExperiencePacket.h similarity index 100% rename from Minecraft.World/Network/Packets/SetExperiencePacket.h rename to Minecraft.World/net/minecraft/network/packet/SetExperiencePacket.h diff --git a/Minecraft.World/Network/Packets/SetHealthPacket.cpp b/Minecraft.World/net/minecraft/network/packet/SetHealthPacket.cpp similarity index 92% rename from Minecraft.World/Network/Packets/SetHealthPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/SetHealthPacket.cpp index ed529ecfe..78bdb2d44 100644 --- a/Minecraft.World/Network/Packets/SetHealthPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/SetHealthPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "SetHealthPacket.h" diff --git a/Minecraft.World/Network/Packets/SetHealthPacket.h b/Minecraft.World/net/minecraft/network/packet/SetHealthPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/SetHealthPacket.h rename to Minecraft.World/net/minecraft/network/packet/SetHealthPacket.h diff --git a/Minecraft.World/Network/Packets/SetObjectivePacket.cpp b/Minecraft.World/net/minecraft/network/packet/SetObjectivePacket.cpp similarity index 90% rename from Minecraft.World/Network/Packets/SetObjectivePacket.cpp rename to Minecraft.World/net/minecraft/network/packet/SetObjectivePacket.cpp index e2a867a44..b567e2065 100644 --- a/Minecraft.World/Network/Packets/SetObjectivePacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/SetObjectivePacket.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.scores.h" +#include "../../../../Header Files/stdafx.h" +#include "../../world/scores/net.minecraft.world.scores.h" #include "PacketListener.h" #include "SetObjectivePacket.h" diff --git a/Minecraft.World/Network/Packets/SetObjectivePacket.h b/Minecraft.World/net/minecraft/network/packet/SetObjectivePacket.h similarity index 100% rename from Minecraft.World/Network/Packets/SetObjectivePacket.h rename to Minecraft.World/net/minecraft/network/packet/SetObjectivePacket.h diff --git a/Minecraft.World/Network/Packets/SetPlayerTeamPacket.cpp b/Minecraft.World/net/minecraft/network/packet/SetPlayerTeamPacket.cpp similarity index 94% rename from Minecraft.World/Network/Packets/SetPlayerTeamPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/SetPlayerTeamPacket.cpp index d20c639f3..118666ee0 100644 --- a/Minecraft.World/Network/Packets/SetPlayerTeamPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/SetPlayerTeamPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.scores.h" -#include "../../Headers/net.minecraft.world.entity.player.h" +#include "../../../../Header Files/stdafx.h" +#include "../../world/scores/net.minecraft.world.scores.h" +#include "../../world/entity/player/net.minecraft.world.entity.player.h" #include "PacketListener.h" #include "SetPlayerTeamPacket.h" diff --git a/Minecraft.World/Network/Packets/SetPlayerTeamPacket.h b/Minecraft.World/net/minecraft/network/packet/SetPlayerTeamPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/SetPlayerTeamPacket.h rename to Minecraft.World/net/minecraft/network/packet/SetPlayerTeamPacket.h diff --git a/Minecraft.World/Network/Packets/SetScorePacket.cpp b/Minecraft.World/net/minecraft/network/packet/SetScorePacket.cpp similarity index 88% rename from Minecraft.World/Network/Packets/SetScorePacket.cpp rename to Minecraft.World/net/minecraft/network/packet/SetScorePacket.cpp index 47a0a5e2f..842b91fc7 100644 --- a/Minecraft.World/Network/Packets/SetScorePacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/SetScorePacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.scores.h" +#include "../../../../Header Files/stdafx.h" +#include "../../world/entity/player/net.minecraft.world.entity.player.h" +#include "../../world/scores/net.minecraft.world.scores.h" #include "PacketListener.h" #include "SetScorePacket.h" diff --git a/Minecraft.World/Network/Packets/SetScorePacket.h b/Minecraft.World/net/minecraft/network/packet/SetScorePacket.h similarity index 100% rename from Minecraft.World/Network/Packets/SetScorePacket.h rename to Minecraft.World/net/minecraft/network/packet/SetScorePacket.h diff --git a/Minecraft.World/Network/Packets/SetSpawnPositionPacket.cpp b/Minecraft.World/net/minecraft/network/packet/SetSpawnPositionPacket.cpp similarity index 89% rename from Minecraft.World/Network/Packets/SetSpawnPositionPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/SetSpawnPositionPacket.cpp index 591f83fdf..6563d3745 100644 --- a/Minecraft.World/Network/Packets/SetSpawnPositionPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/SetSpawnPositionPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "SetSpawnPositionPacket.h" diff --git a/Minecraft.World/Network/Packets/SetSpawnPositionPacket.h b/Minecraft.World/net/minecraft/network/packet/SetSpawnPositionPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/SetSpawnPositionPacket.h rename to Minecraft.World/net/minecraft/network/packet/SetSpawnPositionPacket.h diff --git a/Minecraft.World/Network/Packets/SetTimePacket.cpp b/Minecraft.World/net/minecraft/network/packet/SetTimePacket.cpp similarity index 90% rename from Minecraft.World/Network/Packets/SetTimePacket.cpp rename to Minecraft.World/net/minecraft/network/packet/SetTimePacket.cpp index 0bafd9389..395acd088 100644 --- a/Minecraft.World/Network/Packets/SetTimePacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/SetTimePacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "SetTimePacket.h" diff --git a/Minecraft.World/Network/Packets/SetTimePacket.h b/Minecraft.World/net/minecraft/network/packet/SetTimePacket.h similarity index 100% rename from Minecraft.World/Network/Packets/SetTimePacket.h rename to Minecraft.World/net/minecraft/network/packet/SetTimePacket.h diff --git a/Minecraft.World/Network/Packets/SharedKeyPacket.h b/Minecraft.World/net/minecraft/network/packet/SharedKeyPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/SharedKeyPacket.h rename to Minecraft.World/net/minecraft/network/packet/SharedKeyPacket.h diff --git a/Minecraft.World/Network/Packets/SignUpdatePacket.cpp b/Minecraft.World/net/minecraft/network/packet/SignUpdatePacket.cpp similarity index 88% rename from Minecraft.World/Network/Packets/SignUpdatePacket.cpp rename to Minecraft.World/net/minecraft/network/packet/SignUpdatePacket.cpp index e1addb4bc..6a68dfa04 100644 --- a/Minecraft.World/Network/Packets/SignUpdatePacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/SignUpdatePacket.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" -#include "../../Headers/net.minecraft.world.level.tile.entity.h" +#include "../../world/level/tile/entity/net.minecraft.world.level.tile.entity.h" #include "SignUpdatePacket.h" SignUpdatePacket::SignUpdatePacket() { diff --git a/Minecraft.World/Network/Packets/SignUpdatePacket.h b/Minecraft.World/net/minecraft/network/packet/SignUpdatePacket.h similarity index 100% rename from Minecraft.World/Network/Packets/SignUpdatePacket.h rename to Minecraft.World/net/minecraft/network/packet/SignUpdatePacket.h diff --git a/Minecraft.World/Network/Packets/TakeItemEntityPacket.cpp b/Minecraft.World/net/minecraft/network/packet/TakeItemEntityPacket.cpp similarity index 86% rename from Minecraft.World/Network/Packets/TakeItemEntityPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/TakeItemEntityPacket.cpp index 837832d86..a2c54eb8f 100644 --- a/Minecraft.World/Network/Packets/TakeItemEntityPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/TakeItemEntityPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "TakeItemEntityPacket.h" diff --git a/Minecraft.World/Network/Packets/TakeItemEntityPacket.h b/Minecraft.World/net/minecraft/network/packet/TakeItemEntityPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/TakeItemEntityPacket.h rename to Minecraft.World/net/minecraft/network/packet/TakeItemEntityPacket.h diff --git a/Minecraft.World/Network/Packets/TeleportEntityPacket.cpp b/Minecraft.World/net/minecraft/network/packet/TeleportEntityPacket.cpp similarity index 91% rename from Minecraft.World/Network/Packets/TeleportEntityPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/TeleportEntityPacket.cpp index e2659f209..ea675d9c2 100644 --- a/Minecraft.World/Network/Packets/TeleportEntityPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/TeleportEntityPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.entity.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/entity/net.minecraft.world.entity.h" #include "PacketListener.h" #include "TeleportEntityPacket.h" diff --git a/Minecraft.World/Network/Packets/TeleportEntityPacket.h b/Minecraft.World/net/minecraft/network/packet/TeleportEntityPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/TeleportEntityPacket.h rename to Minecraft.World/net/minecraft/network/packet/TeleportEntityPacket.h diff --git a/Minecraft.World/Network/Packets/TextureAndGeometryChangePacket.cpp b/Minecraft.World/net/minecraft/network/packet/TextureAndGeometryChangePacket.cpp similarity index 87% rename from Minecraft.World/Network/Packets/TextureAndGeometryChangePacket.cpp rename to Minecraft.World/net/minecraft/network/packet/TextureAndGeometryChangePacket.cpp index 75b66c781..237c6a1f2 100644 --- a/Minecraft.World/Network/Packets/TextureAndGeometryChangePacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/TextureAndGeometryChangePacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.entity.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/entity/net.minecraft.world.entity.h" #include "PacketListener.h" #include "TextureAndGeometryChangePacket.h" diff --git a/Minecraft.World/Network/Packets/TextureAndGeometryChangePacket.h b/Minecraft.World/net/minecraft/network/packet/TextureAndGeometryChangePacket.h similarity index 100% rename from Minecraft.World/Network/Packets/TextureAndGeometryChangePacket.h rename to Minecraft.World/net/minecraft/network/packet/TextureAndGeometryChangePacket.h diff --git a/Minecraft.World/Network/Packets/TextureAndGeometryPacket.cpp b/Minecraft.World/net/minecraft/network/packet/TextureAndGeometryPacket.cpp similarity index 97% rename from Minecraft.World/Network/Packets/TextureAndGeometryPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/TextureAndGeometryPacket.cpp index df9876aee..eb99fe5fa 100644 --- a/Minecraft.World/Network/Packets/TextureAndGeometryPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/TextureAndGeometryPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "TextureAndGeometryPacket.h" diff --git a/Minecraft.World/Network/Packets/TextureAndGeometryPacket.h b/Minecraft.World/net/minecraft/network/packet/TextureAndGeometryPacket.h similarity index 91% rename from Minecraft.World/Network/Packets/TextureAndGeometryPacket.h rename to Minecraft.World/net/minecraft/network/packet/TextureAndGeometryPacket.h index a49b9f092..2e4a2d256 100644 --- a/Minecraft.World/Network/Packets/TextureAndGeometryPacket.h +++ b/Minecraft.World/net/minecraft/network/packet/TextureAndGeometryPacket.h @@ -2,8 +2,8 @@ #include #include "Packet.h" -#include "../../../Minecraft.Client/Rendering/Models/Model.h" -#include "../../../Minecraft.Client/Rendering/Models/SkinBox.h" +#include "../../../Minecraft.Client/net/minecraft/client/model/geom/Model.h" +#include "../../../Minecraft.Client/Header Files/SkinBox.h" class DLCSkinFile; diff --git a/Minecraft.World/Network/Packets/TextureChangePacket.cpp b/Minecraft.World/net/minecraft/network/packet/TextureChangePacket.cpp similarity index 84% rename from Minecraft.World/Network/Packets/TextureChangePacket.cpp rename to Minecraft.World/net/minecraft/network/packet/TextureChangePacket.cpp index 086758c6d..1c3fb9b0f 100644 --- a/Minecraft.World/Network/Packets/TextureChangePacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/TextureChangePacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.entity.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/entity/net.minecraft.world.entity.h" #include "PacketListener.h" #include "TextureChangePacket.h" diff --git a/Minecraft.World/Network/Packets/TextureChangePacket.h b/Minecraft.World/net/minecraft/network/packet/TextureChangePacket.h similarity index 100% rename from Minecraft.World/Network/Packets/TextureChangePacket.h rename to Minecraft.World/net/minecraft/network/packet/TextureChangePacket.h diff --git a/Minecraft.World/Network/Packets/TexturePacket.cpp b/Minecraft.World/net/minecraft/network/packet/TexturePacket.cpp similarity index 91% rename from Minecraft.World/Network/Packets/TexturePacket.cpp rename to Minecraft.World/net/minecraft/network/packet/TexturePacket.cpp index 2d5a10f78..9e348f413 100644 --- a/Minecraft.World/Network/Packets/TexturePacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/TexturePacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "TexturePacket.h" diff --git a/Minecraft.World/Network/Packets/TexturePacket.h b/Minecraft.World/net/minecraft/network/packet/TexturePacket.h similarity index 100% rename from Minecraft.World/Network/Packets/TexturePacket.h rename to Minecraft.World/net/minecraft/network/packet/TexturePacket.h diff --git a/Minecraft.World/Network/Packets/TileDestructionPacket.cpp b/Minecraft.World/net/minecraft/network/packet/TileDestructionPacket.cpp similarity index 94% rename from Minecraft.World/Network/Packets/TileDestructionPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/TileDestructionPacket.cpp index 81c07581b..c89d52b66 100644 --- a/Minecraft.World/Network/Packets/TileDestructionPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/TileDestructionPacket.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.network.packet.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.network.packet.h" #include "TileDestructionPacket.h" TileDestructionPacket::TileDestructionPacket() { diff --git a/Minecraft.World/Network/Packets/TileDestructionPacket.h b/Minecraft.World/net/minecraft/network/packet/TileDestructionPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/TileDestructionPacket.h rename to Minecraft.World/net/minecraft/network/packet/TileDestructionPacket.h diff --git a/Minecraft.World/Network/Packets/TileEditorOpenPacket.cpp b/Minecraft.World/net/minecraft/network/packet/TileEditorOpenPacket.cpp similarity index 95% rename from Minecraft.World/Network/Packets/TileEditorOpenPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/TileEditorOpenPacket.cpp index 049d37224..c26d8b055 100644 --- a/Minecraft.World/Network/Packets/TileEditorOpenPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/TileEditorOpenPacket.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "PacketListener.h" #include "TileEditorOpenPacket.h" diff --git a/Minecraft.World/Network/Packets/TileEditorOpenPacket.h b/Minecraft.World/net/minecraft/network/packet/TileEditorOpenPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/TileEditorOpenPacket.h rename to Minecraft.World/net/minecraft/network/packet/TileEditorOpenPacket.h diff --git a/Minecraft.World/Network/Packets/TileEntityDataPacket.cpp b/Minecraft.World/net/minecraft/network/packet/TileEntityDataPacket.cpp similarity index 90% rename from Minecraft.World/Network/Packets/TileEntityDataPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/TileEntityDataPacket.cpp index 0e2b129be..c24a6db91 100644 --- a/Minecraft.World/Network/Packets/TileEntityDataPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/TileEntityDataPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "TileEntityDataPacket.h" diff --git a/Minecraft.World/Network/Packets/TileEntityDataPacket.h b/Minecraft.World/net/minecraft/network/packet/TileEntityDataPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/TileEntityDataPacket.h rename to Minecraft.World/net/minecraft/network/packet/TileEntityDataPacket.h diff --git a/Minecraft.World/Network/Packets/TileEventPacket.cpp b/Minecraft.World/net/minecraft/network/packet/TileEventPacket.cpp similarity index 85% rename from Minecraft.World/Network/Packets/TileEventPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/TileEventPacket.cpp index f6f8a023b..8a2b0be1c 100644 --- a/Minecraft.World/Network/Packets/TileEventPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/TileEventPacket.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "TileEventPacket.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../world/level/tile/net.minecraft.world.level.tile.h" TileEventPacket::TileEventPacket() { x = 0; diff --git a/Minecraft.World/Network/Packets/TileEventPacket.h b/Minecraft.World/net/minecraft/network/packet/TileEventPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/TileEventPacket.h rename to Minecraft.World/net/minecraft/network/packet/TileEventPacket.h diff --git a/Minecraft.World/Network/Packets/TileUpdatePacket.cpp b/Minecraft.World/net/minecraft/network/packet/TileUpdatePacket.cpp similarity index 91% rename from Minecraft.World/Network/Packets/TileUpdatePacket.cpp rename to Minecraft.World/net/minecraft/network/packet/TileUpdatePacket.cpp index e6a83d150..77be8b070 100644 --- a/Minecraft.World/Network/Packets/TileUpdatePacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/TileUpdatePacket.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/level/net.minecraft.world.level.h" #include "PacketListener.h" #include "TileUpdatePacket.h" -#include "../../Level/Dimensions/Dimension.h" +#include "../../world/level/dimension/Dimension.h" TileUpdatePacket::TileUpdatePacket() { shouldDelay = true; } diff --git a/Minecraft.World/Network/Packets/TileUpdatePacket.h b/Minecraft.World/net/minecraft/network/packet/TileUpdatePacket.h similarity index 100% rename from Minecraft.World/Network/Packets/TileUpdatePacket.h rename to Minecraft.World/net/minecraft/network/packet/TileUpdatePacket.h diff --git a/Minecraft.World/Network/Packets/TradeItemPacket.cpp b/Minecraft.World/net/minecraft/network/packet/TradeItemPacket.cpp similarity index 85% rename from Minecraft.World/Network/Packets/TradeItemPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/TradeItemPacket.cpp index 06c081872..942a77be6 100644 --- a/Minecraft.World/Network/Packets/TradeItemPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/TradeItemPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "TradeItemPacket.h" diff --git a/Minecraft.World/Network/Packets/TradeItemPacket.h b/Minecraft.World/net/minecraft/network/packet/TradeItemPacket.h similarity index 93% rename from Minecraft.World/Network/Packets/TradeItemPacket.h rename to Minecraft.World/net/minecraft/network/packet/TradeItemPacket.h index 671409154..46dfaebe4 100644 --- a/Minecraft.World/Network/Packets/TradeItemPacket.h +++ b/Minecraft.World/net/minecraft/network/packet/TradeItemPacket.h @@ -4,7 +4,7 @@ #include "Packet.h" -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include #include "PacketListener.h" diff --git a/Minecraft.World/Network/Packets/UpdateAttributesPacket.cpp b/Minecraft.World/net/minecraft/network/packet/UpdateAttributesPacket.cpp similarity index 96% rename from Minecraft.World/Network/Packets/UpdateAttributesPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/UpdateAttributesPacket.cpp index 8e7e2be26..ff1cb0cd4 100644 --- a/Minecraft.World/Network/Packets/UpdateAttributesPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/UpdateAttributesPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" +#include "../../world/entity/ai/attributes/net.minecraft.world.entity.ai.attributes.h" #include "PacketListener.h" #include "UpdateAttributesPacket.h" diff --git a/Minecraft.World/Network/Packets/UpdateAttributesPacket.h b/Minecraft.World/net/minecraft/network/packet/UpdateAttributesPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/UpdateAttributesPacket.h rename to Minecraft.World/net/minecraft/network/packet/UpdateAttributesPacket.h diff --git a/Minecraft.World/Network/Packets/UpdateGameRuleProgressPacket.cpp b/Minecraft.World/net/minecraft/network/packet/UpdateGameRuleProgressPacket.cpp similarity index 93% rename from Minecraft.World/Network/Packets/UpdateGameRuleProgressPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/UpdateGameRuleProgressPacket.cpp index b6065baa2..01c228120 100644 --- a/Minecraft.World/Network/Packets/UpdateGameRuleProgressPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/UpdateGameRuleProgressPacket.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../Header Files/stdafx.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "UpdateGameRuleProgressPacket.h" diff --git a/Minecraft.World/Network/Packets/UpdateGameRuleProgressPacket.h b/Minecraft.World/net/minecraft/network/packet/UpdateGameRuleProgressPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/UpdateGameRuleProgressPacket.h rename to Minecraft.World/net/minecraft/network/packet/UpdateGameRuleProgressPacket.h diff --git a/Minecraft.World/Network/Packets/UpdateMobEffectPacket.cpp b/Minecraft.World/net/minecraft/network/packet/UpdateMobEffectPacket.cpp similarity index 87% rename from Minecraft.World/Network/Packets/UpdateMobEffectPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/UpdateMobEffectPacket.cpp index c099b9bfb..8a943642d 100644 --- a/Minecraft.World/Network/Packets/UpdateMobEffectPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/UpdateMobEffectPacket.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.effect.h" -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../Header Files/stdafx.h" +#include "../../world/effect/net.minecraft.world.effect.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" -#include "../../WorldGen/Features/BasicTreeFeature.h" +#include "../../world/level/levelgen/feature/BasicTreeFeature.h" #include "UpdateMobEffectPacket.h" #include diff --git a/Minecraft.World/Network/Packets/UpdateMobEffectPacket.h b/Minecraft.World/net/minecraft/network/packet/UpdateMobEffectPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/UpdateMobEffectPacket.h rename to Minecraft.World/net/minecraft/network/packet/UpdateMobEffectPacket.h diff --git a/Minecraft.World/Network/Packets/UpdateProgressPacket.cpp b/Minecraft.World/net/minecraft/network/packet/UpdateProgressPacket.cpp similarity index 84% rename from Minecraft.World/Network/Packets/UpdateProgressPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/UpdateProgressPacket.cpp index e1253ed11..2cedb9e8f 100644 --- a/Minecraft.World/Network/Packets/UpdateProgressPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/UpdateProgressPacket.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" #include "PacketListener.h" #include "UpdateProgressPacket.h" diff --git a/Minecraft.World/Network/Packets/UpdateProgressPacket.h b/Minecraft.World/net/minecraft/network/packet/UpdateProgressPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/UpdateProgressPacket.h rename to Minecraft.World/net/minecraft/network/packet/UpdateProgressPacket.h diff --git a/Minecraft.World/Network/Packets/UseItemPacket.cpp b/Minecraft.World/net/minecraft/network/packet/UseItemPacket.cpp similarity index 92% rename from Minecraft.World/Network/Packets/UseItemPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/UseItemPacket.cpp index de3abc36e..d50e2f2dd 100644 --- a/Minecraft.World/Network/Packets/UseItemPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/UseItemPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.item.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/item/net.minecraft.world.item.h" #include "PacketListener.h" #include "UseItemPacket.h" diff --git a/Minecraft.World/Network/Packets/UseItemPacket.h b/Minecraft.World/net/minecraft/network/packet/UseItemPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/UseItemPacket.h rename to Minecraft.World/net/minecraft/network/packet/UseItemPacket.h diff --git a/Minecraft.World/Network/Packets/XZPacket.cpp b/Minecraft.World/net/minecraft/network/packet/XZPacket.cpp similarity index 80% rename from Minecraft.World/Network/Packets/XZPacket.cpp rename to Minecraft.World/net/minecraft/network/packet/XZPacket.cpp index c131cbbda..126ebddfe 100644 --- a/Minecraft.World/Network/Packets/XZPacket.cpp +++ b/Minecraft.World/net/minecraft/network/packet/XZPacket.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.item.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../world/item/net.minecraft.world.item.h" #include "PacketListener.h" #include "XZPacket.h" diff --git a/Minecraft.World/Network/Packets/XZPacket.h b/Minecraft.World/net/minecraft/network/packet/XZPacket.h similarity index 100% rename from Minecraft.World/Network/Packets/XZPacket.h rename to Minecraft.World/net/minecraft/network/packet/XZPacket.h diff --git a/Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h b/Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h new file mode 100644 index 000000000..3705e4774 --- /dev/null +++ b/Minecraft.World/net/minecraft/network/packet/net.minecraft.network.packet.h @@ -0,0 +1,110 @@ +#pragma once + +#include "AddEntityPacket.h" +#include "AddGlobalEntityPacket.h" +#include "AddMobPacket.h" +#include "AddPaintingPacket.h" +#include "AddPlayerPacket.h" +#include "AnimatePacket.h" +#include "AwardStatPacket.h" +#include "BlockRegionUpdatePacket.h" +#include "ChatPacket.h" +#include "ChunkTilesUpdatePacket.h" +#include "ChunkVisibilityPacket.h" +#include "ComplexItemDataPacket.h" +#include "ContainerAckPacket.h" +#include "ContainerClickPacket.h" +#include "ContainerClosePacket.h" +#include "ContainerOpenPacket.h" +#include "ContainerSetContentPacket.h" +#include "ContainerSetDataPacket.h" +#include "ContainerSetSlotPacket.h" +#include "DisconnectPacket.h" +#include "EntityActionAtPositionPacket.h" +#include "EntityEventPacket.h" +#include "ExplodePacket.h" +#include "GameEventPacket.h" +#include "InteractPacket.h" +#include "KeepAlivePacket.h" +#include "LevelEventPacket.h" +#include "LoginPacket.h" +#include "MoveEntityPacket.h" +#include "MoveEntityPacketSmall.h" +#include "MovePlayerPacket.h" +#include "Packet.h" +#include "PacketListener.h" +#include "PlayerActionPacket.h" +#include "PlayerCommandPacket.h" +#include "PlayerInputPacket.h" +#include "PreLoginPacket.h" +#include "RemoveEntitiesPacket.h" +#include "RespawnPacket.h" + +#include "SetCarriedItemPacket.h" +#include "SetEntityDataPacket.h" +#include "SetEntityMotionPacket.h" +#include "SetEquippedItemPacket.h" +#include "SetHealthPacket.h" +#include "SetEntityLinkPacket.h" +#include "SetSpawnPositionPacket.h" +#include "SetTimePacket.h" +#include "SignUpdatePacket.h" +#include "TakeItemEntityPacket.h" +#include "TeleportEntityPacket.h" +#include "TileEventPacket.h" +#include "TileUpdatePacket.h" +#include "UseItemPacket.h" + +// 1.8.2 Added +#include "AddExperienceOrbPacket.h" +#include "GetInfoPacket.h" +#include "PlayerInfoPacket.h" +#include "RemoveMobEffectPacket.h" +#include "SetCreativeModeSlotPacket.h" +#include "SetExperiencePacket.h" +#include "UpdateMobEffectPacket.h" + +// 1.0.1 Added +#include "ContainerButtonClickPacket.h" +#include "TileEntityDataPacket.h" + +// 1.1 Added (TU9) +#include "CustomPayloadPacket.h" + +// 1.2.3 +#include "RotateHeadPacket.h" + +// 1.3.2 +#include "ChatAutoCompletePacket.h" +#include "ClientCommandPacket.h" +#include "ClientInformationPacket.h" +#include "ClientProtocolPacket.h" +#include "LevelSoundPacket.h" +#include "PlayerAbilitiesPacket.h" +#include "ServerAuthDataPacket.h" +#include "TileDestructionPacket.h" + +// 1.6.4 +#include "LevelParticlesPacket.h" +#include "SetDisplayObjectivePacket.h" +#include "SetObjectivePacket.h" +#include "SetPlayerTeamPacket.h" +#include "SetScorePacket.h" +#include "TileEditorOpenPacket.h" +#include "UpdateAttributesPacket.h" + +// 4J Added +#include "CraftItemPacket.h" +#include "TradeItemPacket.h" +#include "DebugOptionsPacket.h" +#include "ServerSettingsChangedPacket.h" +#include "TexturePacket.h" +#include "TextureAndGeometryPacket.h" +#include "ChunkVisibilityAreaPacket.h" +#include "UpdateProgressPacket.h" +#include "TextureChangePacket.h" +#include "TextureAndGeometryChangePacket.h" +#include "UpdateGameRuleProgressPacket.h" +#include "KickPlayerPacket.h" +#include "XZPacket.h" +#include "GameCommandPacket.h" diff --git a/Minecraft.World/Stats/Achievement.cpp b/Minecraft.World/net/minecraft/stats/Achievement.cpp similarity index 96% rename from Minecraft.World/Stats/Achievement.cpp rename to Minecraft.World/net/minecraft/stats/Achievement.cpp index 76bd0e3a1..573f59dce 100644 --- a/Minecraft.World/Stats/Achievement.cpp +++ b/Minecraft.World/net/minecraft/stats/Achievement.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.locale.h" -#include "../Items/ItemInstance.h" +#include "../../../Header Files/stdafx.h" +#include "../locale/net.minecraft.locale.h" +#include "../world/item/ItemInstance.h" #include "Achievements.h" -#include "../Util/DescFormatter.h" +#include "DescFormatter.h" #include "Achievement.h" /** diff --git a/Minecraft.World/Stats/Achievement.h b/Minecraft.World/net/minecraft/stats/Achievement.h similarity index 100% rename from Minecraft.World/Stats/Achievement.h rename to Minecraft.World/net/minecraft/stats/Achievement.h diff --git a/Minecraft.World/Stats/Achievements.cpp b/Minecraft.World/net/minecraft/stats/Achievements.cpp similarity index 98% rename from Minecraft.World/Stats/Achievements.cpp rename to Minecraft.World/net/minecraft/stats/Achievements.cpp index 8348b7a83..c0959ba0b 100644 --- a/Minecraft.World/Stats/Achievements.cpp +++ b/Minecraft.World/net/minecraft/stats/Achievements.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.stats.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../../../Header Files/stdafx.h" +#include "net.minecraft.stats.h" +#include "../world/item/net.minecraft.world.item.h" +#include "../world/level/tile/net.minecraft.world.level.tile.h" #include #include "Achievement.h" #include "Achievements.h" diff --git a/Minecraft.World/Stats/Achievements.h b/Minecraft.World/net/minecraft/stats/Achievements.h similarity index 100% rename from Minecraft.World/Stats/Achievements.h rename to Minecraft.World/net/minecraft/stats/Achievements.h diff --git a/Minecraft.World/Stats/CommonStats.cpp b/Minecraft.World/net/minecraft/stats/CommonStats.cpp similarity index 98% rename from Minecraft.World/Stats/CommonStats.cpp rename to Minecraft.World/net/minecraft/stats/CommonStats.cpp index 2930a070b..9499ba0ad 100644 --- a/Minecraft.World/Stats/CommonStats.cpp +++ b/Minecraft.World/net/minecraft/stats/CommonStats.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" #include "Achievements.h" -#include "../Items/Item.h" -#include "../Blocks/Tile.h" +#include "../world/item/Item.h" +#include "../world/level/tile/Tile.h" #include "CommonStats.h" Stat* CommonStats::get_stat(int i) { return Stats::get(i); } diff --git a/Minecraft.World/Stats/CommonStats.h b/Minecraft.World/net/minecraft/stats/CommonStats.h similarity index 100% rename from Minecraft.World/Stats/CommonStats.h rename to Minecraft.World/net/minecraft/stats/CommonStats.h diff --git a/Minecraft.World/Util/DescFormatter.h b/Minecraft.World/net/minecraft/stats/DescFormatter.h similarity index 100% rename from Minecraft.World/Util/DescFormatter.h rename to Minecraft.World/net/minecraft/stats/DescFormatter.h diff --git a/Minecraft.World/Stats/DurangoStats.h b/Minecraft.World/net/minecraft/stats/DurangoStats.h similarity index 100% rename from Minecraft.World/Stats/DurangoStats.h rename to Minecraft.World/net/minecraft/stats/DurangoStats.h diff --git a/Minecraft.World/Stats/GeneralStat.cpp b/Minecraft.World/net/minecraft/stats/GeneralStat.cpp similarity index 83% rename from Minecraft.World/Stats/GeneralStat.cpp rename to Minecraft.World/net/minecraft/stats/GeneralStat.cpp index ce1d767ac..43f2723d0 100644 --- a/Minecraft.World/Stats/GeneralStat.cpp +++ b/Minecraft.World/net/minecraft/stats/GeneralStat.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.stats.h" +#include "../../../Header Files/stdafx.h" +#include "net.minecraft.stats.h" #include "GeneralStat.h" GeneralStat::GeneralStat(int id, const std::wstring& name, diff --git a/Minecraft.World/Stats/GeneralStat.h b/Minecraft.World/net/minecraft/stats/GeneralStat.h similarity index 100% rename from Minecraft.World/Stats/GeneralStat.h rename to Minecraft.World/net/minecraft/stats/GeneralStat.h diff --git a/Minecraft.World/Stats/GenericStats.cpp b/Minecraft.World/net/minecraft/stats/GenericStats.cpp similarity index 99% rename from Minecraft.World/Stats/GenericStats.cpp rename to Minecraft.World/net/minecraft/stats/GenericStats.cpp index 5a79b03c5..1c4607499 100644 --- a/Minecraft.World/Stats/GenericStats.cpp +++ b/Minecraft.World/net/minecraft/stats/GenericStats.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" -#include "../Entities/Monster.h" +#include "../world/entity/monster/Monster.h" #include "GenericStats.h" diff --git a/Minecraft.World/Stats/GenericStats.h b/Minecraft.World/net/minecraft/stats/GenericStats.h similarity index 99% rename from Minecraft.World/Stats/GenericStats.h rename to Minecraft.World/net/minecraft/stats/GenericStats.h index 2277bf68e..77ef9833b 100644 --- a/Minecraft.World/Stats/GenericStats.h +++ b/Minecraft.World/net/minecraft/stats/GenericStats.h @@ -3,9 +3,9 @@ #include "Stat.h" #include "Stats.h" -// #include "../Util/DamageSource.h" +// #include "../world/damageSource/DamageSource.h" -// #include "../../Minecraft.Client/Platform/Common/Console_Awards_enum.h" +// #include "../../Minecraft.Client/Common/Source Files/Console_Awards_enum.h" /** 4J-JEV: diff --git a/Minecraft.World/Stats/ItemStat.cpp b/Minecraft.World/net/minecraft/stats/ItemStat.cpp similarity index 80% rename from Minecraft.World/Stats/ItemStat.cpp rename to Minecraft.World/net/minecraft/stats/ItemStat.cpp index c39824f9d..d71d770e2 100644 --- a/Minecraft.World/Stats/ItemStat.cpp +++ b/Minecraft.World/net/minecraft/stats/ItemStat.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" #include "ItemStat.h" ItemStat::ItemStat(int id, const std::wstring& name, int itemId) diff --git a/Minecraft.World/Stats/ItemStat.h b/Minecraft.World/net/minecraft/stats/ItemStat.h similarity index 100% rename from Minecraft.World/Stats/ItemStat.h rename to Minecraft.World/net/minecraft/stats/ItemStat.h diff --git a/Minecraft.World/Util/NumberFormatters.h b/Minecraft.World/net/minecraft/stats/NumberFormatters.h similarity index 100% rename from Minecraft.World/Util/NumberFormatters.h rename to Minecraft.World/net/minecraft/stats/NumberFormatters.h diff --git a/Minecraft.World/Stats/Stat.cpp b/Minecraft.World/net/minecraft/stats/Stat.cpp similarity index 97% rename from Minecraft.World/Stats/Stat.cpp rename to Minecraft.World/net/minecraft/stats/Stat.cpp index 64aa04dff..31ba84efb 100644 --- a/Minecraft.World/Stats/Stat.cpp +++ b/Minecraft.World/net/minecraft/stats/Stat.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" #include -#include "../Util/NumberFormatters.h" +#include "NumberFormatters.h" #include "StatFormatter.h" #include "Stats.h" #include "Stat.h" diff --git a/Minecraft.World/Stats/Stat.h b/Minecraft.World/net/minecraft/stats/Stat.h similarity index 100% rename from Minecraft.World/Stats/Stat.h rename to Minecraft.World/net/minecraft/stats/Stat.h diff --git a/Minecraft.World/Stats/StatFormatter.h b/Minecraft.World/net/minecraft/stats/StatFormatter.h similarity index 100% rename from Minecraft.World/Stats/StatFormatter.h rename to Minecraft.World/net/minecraft/stats/StatFormatter.h diff --git a/Minecraft.World/Stats/Stats.cpp b/Minecraft.World/net/minecraft/stats/Stats.cpp similarity index 98% rename from Minecraft.World/Stats/Stats.cpp rename to Minecraft.World/net/minecraft/stats/Stats.cpp index 00a676fb5..82769b1f1 100644 --- a/Minecraft.World/Stats/Stats.cpp +++ b/Minecraft.World/net/minecraft/stats/Stats.cpp @@ -1,14 +1,14 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.locale.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.item.crafting.h" +#include "../../../Header Files/stdafx.h" +#include "../locale/net.minecraft.locale.h" +#include "../world/level/tile/net.minecraft.world.level.tile.h" +#include "../world/item/net.minecraft.world.item.h" +#include "../world/entity/item/net.minecraft.world.entity.item.h" +#include "../world/item/crafting/net.minecraft.world.item.crafting.h" #include "Achievements.h" #include "ItemStat.h" #include "GeneralStat.h" #include "Stats.h" -#include "../../Minecraft.Client/GameState/StatsCounter.h" +#include "../../Minecraft.Client/net/minecraft/stats/StatsCounter.h" const int Stats::BLOCKS_MINED_OFFSET = 0x1000000; const int Stats::ITEMS_COLLECTED_OFFSET = 0x1010000; diff --git a/Minecraft.World/Stats/Stats.h b/Minecraft.World/net/minecraft/stats/Stats.h similarity index 100% rename from Minecraft.World/Stats/Stats.h rename to Minecraft.World/net/minecraft/stats/Stats.h diff --git a/Minecraft.World/net/minecraft/stats/net.minecraft.stats.h b/Minecraft.World/net/minecraft/stats/net.minecraft.stats.h new file mode 100644 index 000000000..52cc4afc0 --- /dev/null +++ b/Minecraft.World/net/minecraft/stats/net.minecraft.stats.h @@ -0,0 +1,10 @@ +#pragma once + +#include "Achievement.h" +#include "Achievements.h" +#include "DescFormatter.h" +#include "GeneralStat.h" +#include "ItemStat.h" +#include "Stat.h" +#include "StatFormatter.h" +#include "Stats.h" \ No newline at end of file diff --git a/Minecraft.World/Util/Hasher.cpp b/Minecraft.World/net/minecraft/util/Hasher.cpp similarity index 97% rename from Minecraft.World/Util/Hasher.cpp rename to Minecraft.World/net/minecraft/util/Hasher.cpp index 4a0da53b4..ffc770a33 100644 --- a/Minecraft.World/Util/Hasher.cpp +++ b/Minecraft.World/net/minecraft/util/Hasher.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" #if defined(_WIN32) #include #else diff --git a/Minecraft.World/Util/Hasher.h b/Minecraft.World/net/minecraft/util/Hasher.h similarity index 100% rename from Minecraft.World/Util/Hasher.h rename to Minecraft.World/net/minecraft/util/Hasher.h diff --git a/Minecraft.World/Util/HtmlString.cpp b/Minecraft.World/net/minecraft/util/HtmlString.cpp similarity index 96% rename from Minecraft.World/Util/HtmlString.cpp rename to Minecraft.World/net/minecraft/util/HtmlString.cpp index 078f5d2fd..ccff71259 100644 --- a/Minecraft.World/Util/HtmlString.cpp +++ b/Minecraft.World/net/minecraft/util/HtmlString.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" #include "HtmlString.h" #include diff --git a/Minecraft.World/Util/HtmlString.h b/Minecraft.World/net/minecraft/util/HtmlString.h similarity index 100% rename from Minecraft.World/Util/HtmlString.h rename to Minecraft.World/net/minecraft/util/HtmlString.h diff --git a/Minecraft.World/Util/Mth.cpp b/Minecraft.World/net/minecraft/util/Mth.cpp similarity index 97% rename from Minecraft.World/Util/Mth.cpp rename to Minecraft.World/net/minecraft/util/Mth.cpp index 611e53a05..735678197 100644 --- a/Minecraft.World/Util/Mth.cpp +++ b/Minecraft.World/net/minecraft/util/Mth.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" #include "Mth.h" -#include "Random.h" -#include "StringHelpers.h" +#include "../../../ConsoleJavaLibs/Random.h" +#include "../../../ConsoleHelpers/StringHelpers.h" const int Mth::BIG_ENOUGH_INT = 1024; const float Mth::BIG_ENOUGH_FLOAT = BIG_ENOUGH_INT; diff --git a/Minecraft.World/Util/Mth.h b/Minecraft.World/net/minecraft/util/Mth.h similarity index 100% rename from Minecraft.World/Util/Mth.h rename to Minecraft.World/net/minecraft/util/Mth.h diff --git a/Minecraft.World/Util/ProgressListener.h b/Minecraft.World/net/minecraft/util/ProgressListener.h similarity index 100% rename from Minecraft.World/Util/ProgressListener.h rename to Minecraft.World/net/minecraft/util/ProgressListener.h diff --git a/Minecraft.World/Util/SmoothFloat.cpp b/Minecraft.World/net/minecraft/util/SmoothFloat.cpp similarity index 94% rename from Minecraft.World/Util/SmoothFloat.cpp rename to Minecraft.World/net/minecraft/util/SmoothFloat.cpp index dd61b8b3b..e4d68cabc 100644 --- a/Minecraft.World/Util/SmoothFloat.cpp +++ b/Minecraft.World/net/minecraft/util/SmoothFloat.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" #include "SmoothFloat.h" SmoothFloat::SmoothFloat() { diff --git a/Minecraft.World/Util/SmoothFloat.h b/Minecraft.World/net/minecraft/util/SmoothFloat.h similarity index 100% rename from Minecraft.World/Util/SmoothFloat.h rename to Minecraft.World/net/minecraft/util/SmoothFloat.h diff --git a/Minecraft.World/Util/WeighedRandom.cpp b/Minecraft.World/net/minecraft/util/WeighedRandom.cpp similarity index 97% rename from Minecraft.World/Util/WeighedRandom.cpp rename to Minecraft.World/net/minecraft/util/WeighedRandom.cpp index ece44e353..237030d3e 100644 --- a/Minecraft.World/Util/WeighedRandom.cpp +++ b/Minecraft.World/net/minecraft/util/WeighedRandom.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" #include "WeighedRandom.h" int WeighedRandom::getTotalWeight(std::vector* items) { diff --git a/Minecraft.World/Util/WeighedRandom.h b/Minecraft.World/net/minecraft/util/WeighedRandom.h similarity index 100% rename from Minecraft.World/Util/WeighedRandom.h rename to Minecraft.World/net/minecraft/util/WeighedRandom.h diff --git a/Minecraft.World/Util/WeighedTreasure.cpp b/Minecraft.World/net/minecraft/util/WeighedTreasure.cpp similarity index 94% rename from Minecraft.World/Util/WeighedTreasure.cpp rename to Minecraft.World/net/minecraft/util/WeighedTreasure.cpp index 8b1a98b86..0e9a919ae 100644 --- a/Minecraft.World/Util/WeighedTreasure.cpp +++ b/Minecraft.World/net/minecraft/util/WeighedTreasure.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../Header Files/stdafx.h" +#include "../world/level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../world/item/net.minecraft.world.item.h" #include "WeighedRandom.h" #include "WeighedTreasure.h" diff --git a/Minecraft.World/Util/WeighedTreasure.h b/Minecraft.World/net/minecraft/util/WeighedTreasure.h similarity index 100% rename from Minecraft.World/Util/WeighedTreasure.h rename to Minecraft.World/net/minecraft/util/WeighedTreasure.h diff --git a/Minecraft.World/Containers/CompoundContainer.cpp b/Minecraft.World/net/minecraft/world/CompoundContainer.cpp similarity index 94% rename from Minecraft.World/Containers/CompoundContainer.cpp rename to Minecraft.World/net/minecraft/world/CompoundContainer.cpp index 2a5c37f99..67611a993 100644 --- a/Minecraft.World/Containers/CompoundContainer.cpp +++ b/Minecraft.World/net/minecraft/world/CompoundContainer.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Network/Packets/ContainerOpenPacket.h" +#include "../../../Header Files/stdafx.h" +#include "entity/player/net.minecraft.world.entity.player.h" +#include "../network/packet/ContainerOpenPacket.h" #include "CompoundContainer.h" CompoundContainer::CompoundContainer(int name, std::shared_ptr c1, diff --git a/Minecraft.World/Containers/CompoundContainer.h b/Minecraft.World/net/minecraft/world/CompoundContainer.h similarity index 100% rename from Minecraft.World/Containers/CompoundContainer.h rename to Minecraft.World/net/minecraft/world/CompoundContainer.h diff --git a/Minecraft.World/Containers/Container.h b/Minecraft.World/net/minecraft/world/Container.h similarity index 100% rename from Minecraft.World/Containers/Container.h rename to Minecraft.World/net/minecraft/world/Container.h diff --git a/Minecraft.World/Util/Difficulty.h b/Minecraft.World/net/minecraft/world/Difficulty.h similarity index 100% rename from Minecraft.World/Util/Difficulty.h rename to Minecraft.World/net/minecraft/world/Difficulty.h diff --git a/Minecraft.World/Util/FlippedIcon.cpp b/Minecraft.World/net/minecraft/world/FlippedIcon.cpp similarity index 95% rename from Minecraft.World/Util/FlippedIcon.cpp rename to Minecraft.World/net/minecraft/world/FlippedIcon.cpp index 3064189f8..eae05d67b 100644 --- a/Minecraft.World/Util/FlippedIcon.cpp +++ b/Minecraft.World/net/minecraft/world/FlippedIcon.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" #include "FlippedIcon.h" -#include "SharedConstants.h" +#include "../SharedConstants.h" FlippedIcon::FlippedIcon(Icon* base, bool horizontal, bool vertical) : base(base), horizontal(horizontal), vertical(vertical) {} diff --git a/Minecraft.World/Util/FlippedIcon.h b/Minecraft.World/net/minecraft/world/FlippedIcon.h similarity index 100% rename from Minecraft.World/Util/FlippedIcon.h rename to Minecraft.World/net/minecraft/world/FlippedIcon.h diff --git a/Minecraft.World/Util/Icon.h b/Minecraft.World/net/minecraft/world/Icon.h similarity index 100% rename from Minecraft.World/Util/Icon.h rename to Minecraft.World/net/minecraft/world/Icon.h diff --git a/Minecraft.World/Util/IconRegister.h b/Minecraft.World/net/minecraft/world/IconRegister.h similarity index 100% rename from Minecraft.World/Util/IconRegister.h rename to Minecraft.World/net/minecraft/world/IconRegister.h diff --git a/Minecraft.World/Containers/MouseInventoryClickHandler.h b/Minecraft.World/net/minecraft/world/MouseInventoryClickHandler.h similarity index 100% rename from Minecraft.World/Containers/MouseInventoryClickHandler.h rename to Minecraft.World/net/minecraft/world/MouseInventoryClickHandler.h diff --git a/Minecraft.World/Containers/SimpleContainer.cpp b/Minecraft.World/net/minecraft/world/SimpleContainer.cpp similarity index 95% rename from Minecraft.World/Containers/SimpleContainer.cpp rename to Minecraft.World/net/minecraft/world/SimpleContainer.cpp index 59f7a0d39..2e3e9fe59 100644 --- a/Minecraft.World/Containers/SimpleContainer.cpp +++ b/Minecraft.World/net/minecraft/world/SimpleContainer.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" +#include "../../../Header Files/stdafx.h" -#include "../Headers/net.minecraft.world.ContainerListener.h" -#include "../Headers/net.minecraft.world.item.h" +#include "net.minecraft.world.ContainerListener.h" +#include "item/net.minecraft.world.item.h" #include "SimpleContainer.h" diff --git a/Minecraft.World/Containers/SimpleContainer.h b/Minecraft.World/net/minecraft/world/SimpleContainer.h similarity index 96% rename from Minecraft.World/Containers/SimpleContainer.h rename to Minecraft.World/net/minecraft/world/SimpleContainer.h index e9164c1eb..fcd91d44c 100644 --- a/Minecraft.World/Containers/SimpleContainer.h +++ b/Minecraft.World/net/minecraft/world/SimpleContainer.h @@ -1,7 +1,7 @@ #pragma once #include "Container.h" -#include "../Headers/net.minecraft.world.ContainerListener.h" +#include "net.minecraft.world.ContainerListener.h" class SimpleContainer : public Container { private: diff --git a/Minecraft.World/Containers/WorldlyContainer.h b/Minecraft.World/net/minecraft/world/WorldlyContainer.h similarity index 100% rename from Minecraft.World/Containers/WorldlyContainer.h rename to Minecraft.World/net/minecraft/world/WorldlyContainer.h diff --git a/Minecraft.World/Util/CombatEntry.cpp b/Minecraft.World/net/minecraft/world/damageSource/CombatEntry.cpp similarity index 91% rename from Minecraft.World/Util/CombatEntry.cpp rename to Minecraft.World/net/minecraft/world/damageSource/CombatEntry.cpp index ddc933b3c..a83934d31 100644 --- a/Minecraft.World/Util/CombatEntry.cpp +++ b/Minecraft.World/net/minecraft/world/damageSource/CombatEntry.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/net.minecraft.world.entity.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.world.damagesource.h" +#include "../entity/net.minecraft.world.entity.h" #include "CombatEntry.h" #include diff --git a/Minecraft.World/Util/CombatEntry.h b/Minecraft.World/net/minecraft/world/damageSource/CombatEntry.h similarity index 100% rename from Minecraft.World/Util/CombatEntry.h rename to Minecraft.World/net/minecraft/world/damageSource/CombatEntry.h diff --git a/Minecraft.World/Util/CombatTracker.cpp b/Minecraft.World/net/minecraft/world/damageSource/CombatTracker.cpp similarity index 96% rename from Minecraft.World/Util/CombatTracker.cpp rename to Minecraft.World/net/minecraft/world/damageSource/CombatTracker.cpp index f607a972b..00591cc99 100644 --- a/Minecraft.World/Util/CombatTracker.cpp +++ b/Minecraft.World/net/minecraft/world/damageSource/CombatTracker.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.damagesource.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/net.minecraft.world.entity.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../phys/net.minecraft.world.phys.h" +#include "net.minecraft.world.damagesource.h" #include "CombatTracker.h" CombatTracker::CombatTracker(LivingEntity* mob) { this->mob = mob; } diff --git a/Minecraft.World/Util/CombatTracker.h b/Minecraft.World/net/minecraft/world/damageSource/CombatTracker.h similarity index 97% rename from Minecraft.World/Util/CombatTracker.h rename to Minecraft.World/net/minecraft/world/damageSource/CombatTracker.h index 9a37ad8b4..3fa4a65fa 100644 --- a/Minecraft.World/Util/CombatTracker.h +++ b/Minecraft.World/net/minecraft/world/damageSource/CombatTracker.h @@ -1,6 +1,6 @@ #pragma once -#include "SharedConstants.h" +#include "../../SharedConstants.h" class CombatEntry; class LivingEntity; diff --git a/Minecraft.World/Util/DamageSource.cpp b/Minecraft.World/net/minecraft/world/damageSource/DamageSource.cpp similarity index 94% rename from Minecraft.World/Util/DamageSource.cpp rename to Minecraft.World/net/minecraft/world/damageSource/DamageSource.cpp index c5c8271f5..9995110a3 100644 --- a/Minecraft.World/Util/DamageSource.cpp +++ b/Minecraft.World/net/minecraft/world/damageSource/DamageSource.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.projectile.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/net.minecraft.world.food.h" -#include "../Headers/net.minecraft.network.packet.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/net.minecraft.world.entity.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../level/net.minecraft.world.level.h" +#include "net.minecraft.world.damagesource.h" +#include "../food/net.minecraft.world.food.h" +#include "../../network/packet/net.minecraft.network.packet.h" DamageSource* DamageSource::inFire = (new DamageSource(ChatPacket::e_ChatDeathInFire, diff --git a/Minecraft.World/Util/DamageSource.h b/Minecraft.World/net/minecraft/world/damageSource/DamageSource.h similarity index 98% rename from Minecraft.World/Util/DamageSource.h rename to Minecraft.World/net/minecraft/world/damageSource/DamageSource.h index 0c7467372..ea3626ced 100644 --- a/Minecraft.World/Util/DamageSource.h +++ b/Minecraft.World/net/minecraft/world/damageSource/DamageSource.h @@ -7,7 +7,7 @@ class Fireball; class Player; class Explosion; -#include "../Network/Packets/ChatPacket.h" +#include "../../network/packet/ChatPacket.h" class DamageSource { public: diff --git a/Minecraft.World/Entities/EntityDamageSource.cpp b/Minecraft.World/net/minecraft/world/damageSource/EntityDamageSource.cpp similarity index 88% rename from Minecraft.World/Entities/EntityDamageSource.cpp rename to Minecraft.World/net/minecraft/world/damageSource/EntityDamageSource.cpp index ea5f0afd0..ae259ec1f 100644 --- a/Minecraft.World/Entities/EntityDamageSource.cpp +++ b/Minecraft.World/net/minecraft/world/damageSource/EntityDamageSource.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/net.minecraft.network.packet.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../entity/net.minecraft.world.entity.h" +#include "net.minecraft.world.damagesource.h" +#include "../../network/packet/net.minecraft.network.packet.h" // EntityDamageSource::EntityDamageSource(const wstring &msgId, // shared_ptr entity) : DamageSource(msgId) diff --git a/Minecraft.World/Entities/EntityDamageSource.h b/Minecraft.World/net/minecraft/world/damageSource/EntityDamageSource.h similarity index 96% rename from Minecraft.World/Entities/EntityDamageSource.h rename to Minecraft.World/net/minecraft/world/damageSource/EntityDamageSource.h index 9e4b2cbec..85970ac0a 100644 --- a/Minecraft.World/Entities/EntityDamageSource.h +++ b/Minecraft.World/net/minecraft/world/damageSource/EntityDamageSource.h @@ -1,6 +1,6 @@ #pragma once -#include "../Util/DamageSource.h" +#include "DamageSource.h" class Entity; class Player; diff --git a/Minecraft.World/Entities/IndirectEntityDamageSource.cpp b/Minecraft.World/net/minecraft/world/damageSource/IndirectEntityDamageSource.cpp similarity index 89% rename from Minecraft.World/Entities/IndirectEntityDamageSource.cpp rename to Minecraft.World/net/minecraft/world/damageSource/IndirectEntityDamageSource.cpp index 5b3695493..3e5e2532a 100644 --- a/Minecraft.World/Entities/IndirectEntityDamageSource.cpp +++ b/Minecraft.World/net/minecraft/world/damageSource/IndirectEntityDamageSource.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/net.minecraft.network.packet.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../entity/net.minecraft.world.entity.h" +#include "net.minecraft.world.damagesource.h" +#include "../../network/packet/net.minecraft.network.packet.h" // IndirectEntityDamageSource::IndirectEntityDamageSource(const wstring &msgId, // shared_ptr entity, shared_ptr owner) : diff --git a/Minecraft.World/Entities/IndirectEntityDamageSource.h b/Minecraft.World/net/minecraft/world/damageSource/IndirectEntityDamageSource.h similarity index 100% rename from Minecraft.World/Entities/IndirectEntityDamageSource.h rename to Minecraft.World/net/minecraft/world/damageSource/IndirectEntityDamageSource.h diff --git a/Minecraft.World/net/minecraft/world/damageSource/net.minecraft.world.damagesource.h b/Minecraft.World/net/minecraft/world/damageSource/net.minecraft.world.damagesource.h new file mode 100644 index 000000000..df0ccd8f6 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/damageSource/net.minecraft.world.damagesource.h @@ -0,0 +1,7 @@ +#pragma once + +#include "CombatEntry.h" +#include "CombatTracker.h" +#include "DamageSource.h" +#include "EntityDamageSource.h" +#include "IndirectEntityDamageSource.h" \ No newline at end of file diff --git a/Minecraft.World/Entities/AbsoptionMobEffect.cpp b/Minecraft.World/net/minecraft/world/effect/AbsoptionMobEffect.cpp similarity index 86% rename from Minecraft.World/Entities/AbsoptionMobEffect.cpp rename to Minecraft.World/net/minecraft/world/effect/AbsoptionMobEffect.cpp index 56a1812a6..cfd812332 100644 --- a/Minecraft.World/Entities/AbsoptionMobEffect.cpp +++ b/Minecraft.World/net/minecraft/world/effect/AbsoptionMobEffect.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.effect.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/net.minecraft.world.entity.h" +#include "net.minecraft.world.effect.h" #include "AbsoptionMobEffect.h" AbsoptionMobEffect::AbsoptionMobEffect(int id, bool isHarmful, diff --git a/Minecraft.World/Entities/AbsoptionMobEffect.h b/Minecraft.World/net/minecraft/world/effect/AbsoptionMobEffect.h similarity index 100% rename from Minecraft.World/Entities/AbsoptionMobEffect.h rename to Minecraft.World/net/minecraft/world/effect/AbsoptionMobEffect.h diff --git a/Minecraft.World/Entities/AttackDamageMobEffect.cpp b/Minecraft.World/net/minecraft/world/effect/AttackDamageMobEffect.cpp similarity index 91% rename from Minecraft.World/Entities/AttackDamageMobEffect.cpp rename to Minecraft.World/net/minecraft/world/effect/AttackDamageMobEffect.cpp index d79a5454e..1ffad03d1 100644 --- a/Minecraft.World/Entities/AttackDamageMobEffect.cpp +++ b/Minecraft.World/net/minecraft/world/effect/AttackDamageMobEffect.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "AttackDamageMobEffect.h" diff --git a/Minecraft.World/Entities/AttackDamageMobEffect.h b/Minecraft.World/net/minecraft/world/effect/AttackDamageMobEffect.h similarity index 100% rename from Minecraft.World/Entities/AttackDamageMobEffect.h rename to Minecraft.World/net/minecraft/world/effect/AttackDamageMobEffect.h diff --git a/Minecraft.World/Entities/HealthBoostMobEffect.cpp b/Minecraft.World/net/minecraft/world/effect/HealthBoostMobEffect.cpp similarity index 85% rename from Minecraft.World/Entities/HealthBoostMobEffect.cpp rename to Minecraft.World/net/minecraft/world/effect/HealthBoostMobEffect.cpp index 09c30f8f9..a829fbc63 100644 --- a/Minecraft.World/Entities/HealthBoostMobEffect.cpp +++ b/Minecraft.World/net/minecraft/world/effect/HealthBoostMobEffect.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/net.minecraft.world.entity.h" #include "HealthBoostMobEffect.h" HealthBoostMobEffect::HealthBoostMobEffect(int id, bool isHarmful, diff --git a/Minecraft.World/Entities/HealthBoostMobEffect.h b/Minecraft.World/net/minecraft/world/effect/HealthBoostMobEffect.h similarity index 100% rename from Minecraft.World/Entities/HealthBoostMobEffect.h rename to Minecraft.World/net/minecraft/world/effect/HealthBoostMobEffect.h diff --git a/Minecraft.World/Entities/InstantaneousMobEffect.cpp b/Minecraft.World/net/minecraft/world/effect/InstantaneousMobEffect.cpp similarity index 83% rename from Minecraft.World/Entities/InstantaneousMobEffect.cpp rename to Minecraft.World/net/minecraft/world/effect/InstantaneousMobEffect.cpp index 6821f59b3..b1161ca72 100644 --- a/Minecraft.World/Entities/InstantaneousMobEffect.cpp +++ b/Minecraft.World/net/minecraft/world/effect/InstantaneousMobEffect.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.effect.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.world.effect.h" InstantenousMobEffect::InstantenousMobEffect(int id, bool isHarmful, eMinecraftColour color) diff --git a/Minecraft.World/Entities/InstantaneousMobEffect.h b/Minecraft.World/net/minecraft/world/effect/InstantaneousMobEffect.h similarity index 100% rename from Minecraft.World/Entities/InstantaneousMobEffect.h rename to Minecraft.World/net/minecraft/world/effect/InstantaneousMobEffect.h diff --git a/Minecraft.World/Entities/MobEffect.cpp b/Minecraft.World/net/minecraft/world/effect/MobEffect.cpp similarity index 97% rename from Minecraft.World/Entities/MobEffect.cpp rename to Minecraft.World/net/minecraft/world/effect/MobEffect.cpp index 418cbb7bd..73c545122 100644 --- a/Minecraft.World/Entities/MobEffect.cpp +++ b/Minecraft.World/net/minecraft/world/effect/MobEffect.cpp @@ -1,13 +1,13 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.monster.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/net.minecraft.world.food.h" -#include "../Headers/net.minecraft.world.effect.h" -#include "../Util/SharedConstants.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../entity/monster/net.minecraft.world.entity.monster.h" +#include "../entity/net.minecraft.world.entity.h" +#include "../level/net.minecraft.world.level.h" +#include "../damageSource/net.minecraft.world.damagesource.h" +#include "../food/net.minecraft.world.food.h" +#include "net.minecraft.world.effect.h" +#include "../../SharedConstants.h" MobEffect* MobEffect::effects[NUM_EFFECTS]; diff --git a/Minecraft.World/Entities/MobEffect.h b/Minecraft.World/net/minecraft/world/effect/MobEffect.h similarity index 98% rename from Minecraft.World/Entities/MobEffect.h rename to Minecraft.World/net/minecraft/world/effect/MobEffect.h index 5576a2b4b..de9794103 100644 --- a/Minecraft.World/Entities/MobEffect.h +++ b/Minecraft.World/net/minecraft/world/effect/MobEffect.h @@ -1,6 +1,6 @@ #pragma once -#include "../AI/Attributes/AttributeModifier.h" +#include "../entity/ai/attributes/AttributeModifier.h" class Mob; class MobEffectInstance; diff --git a/Minecraft.World/Entities/MobEffectInstance.cpp b/Minecraft.World/net/minecraft/world/effect/MobEffectInstance.cpp similarity index 98% rename from Minecraft.World/Entities/MobEffectInstance.cpp rename to Minecraft.World/net/minecraft/world/effect/MobEffectInstance.cpp index f81d97f84..470200ceb 100644 --- a/Minecraft.World/Entities/MobEffectInstance.cpp +++ b/Minecraft.World/net/minecraft/world/effect/MobEffectInstance.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.effect.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.world.effect.h" void MobEffectInstance::_init(int id, int duration, int amplifier) { this->id = id; diff --git a/Minecraft.World/Entities/MobEffectInstance.h b/Minecraft.World/net/minecraft/world/effect/MobEffectInstance.h similarity index 100% rename from Minecraft.World/Entities/MobEffectInstance.h rename to Minecraft.World/net/minecraft/world/effect/MobEffectInstance.h diff --git a/Minecraft.World/net/minecraft/world/effect/net.minecraft.world.effect.h b/Minecraft.World/net/minecraft/world/effect/net.minecraft.world.effect.h new file mode 100644 index 000000000..5a545cddf --- /dev/null +++ b/Minecraft.World/net/minecraft/world/effect/net.minecraft.world.effect.h @@ -0,0 +1,8 @@ +#pragma once + +#include "AbsoptionMobEffect.h" +#include "AttackDamageMobEffect.h" +#include "HealthBoostMobEffect.h" +#include "MobEffect.h" +#include "InstantaneousMobEffect.h" +#include "MobEffectInstance.h" \ No newline at end of file diff --git a/Minecraft.World/Entities/Mobs/AgeableMob.cpp b/Minecraft.World/net/minecraft/world/entity/AgeableMob.cpp similarity index 91% rename from Minecraft.World/Entities/Mobs/AgeableMob.cpp rename to Minecraft.World/net/minecraft/world/entity/AgeableMob.cpp index 7069b991e..81f7c36ba 100644 --- a/Minecraft.World/Entities/Mobs/AgeableMob.cpp +++ b/Minecraft.World/net/minecraft/world/entity/AgeableMob.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../SyncedEntityData.h" -#include "../../Stats/GenericStats.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.world.entity.h" +#include "player/net.minecraft.world.entity.player.h" +#include "../item/net.minecraft.world.item.h" +#include "../level/net.minecraft.world.level.h" +#include "SyncedEntityData.h" +#include "../../stats/GenericStats.h" #include "AgeableMob.h" AgableMob::AgableMob(Level* level) : PathfinderMob(level) { diff --git a/Minecraft.World/Entities/Mobs/AgeableMob.h b/Minecraft.World/net/minecraft/world/entity/AgeableMob.h similarity index 96% rename from Minecraft.World/Entities/Mobs/AgeableMob.h rename to Minecraft.World/net/minecraft/world/entity/AgeableMob.h index 5815a2347..af10b6c25 100644 --- a/Minecraft.World/Entities/Mobs/AgeableMob.h +++ b/Minecraft.World/net/minecraft/world/entity/AgeableMob.h @@ -1,6 +1,6 @@ #pragma once -#include "../PathfinderMob.h" +#include "PathfinderMob.h" class AgableMob : public PathfinderMob { private: diff --git a/Minecraft.World/net/minecraft/world/entity/Creature.cpp b/Minecraft.World/net/minecraft/world/entity/Creature.cpp new file mode 100644 index 000000000..6aafa8d30 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/Creature.cpp @@ -0,0 +1,2 @@ +#include "../../../../Header Files/stdafx.h" +#include "Creature.h" diff --git a/Minecraft.World/Entities/Mobs/Creature.h b/Minecraft.World/net/minecraft/world/entity/Creature.h similarity index 76% rename from Minecraft.World/Entities/Mobs/Creature.h rename to Minecraft.World/net/minecraft/world/entity/Creature.h index 0e542690c..5f2e14c58 100644 --- a/Minecraft.World/Entities/Mobs/Creature.h +++ b/Minecraft.World/net/minecraft/world/entity/Creature.h @@ -1,5 +1,5 @@ #pragma once -#include "../Entity.h" +#include "Entity.h" class Level; diff --git a/Minecraft.World/Util/DelayedRelease.cpp b/Minecraft.World/net/minecraft/world/entity/DelayedRelease.cpp similarity index 88% rename from Minecraft.World/Util/DelayedRelease.cpp rename to Minecraft.World/net/minecraft/world/entity/DelayedRelease.cpp index 629178e0c..d31deac4c 100644 --- a/Minecraft.World/Util/DelayedRelease.cpp +++ b/Minecraft.World/net/minecraft/world/entity/DelayedRelease.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/net.minecraft.world.level.h" #include "DelayedRelease.h" DelayedRelease::DelayedRelease(Level* level, std::shared_ptr toRelease, diff --git a/Minecraft.World/Util/DelayedRelease.h b/Minecraft.World/net/minecraft/world/entity/DelayedRelease.h similarity index 95% rename from Minecraft.World/Util/DelayedRelease.h rename to Minecraft.World/net/minecraft/world/entity/DelayedRelease.h index deef6e8c0..f1614ec4d 100644 --- a/Minecraft.World/Util/DelayedRelease.h +++ b/Minecraft.World/net/minecraft/world/entity/DelayedRelease.h @@ -1,6 +1,6 @@ #pragma once -#include "../Entities/Entity.h" +#include "Entity.h" class DamageSource; diff --git a/Minecraft.World/Entities/Entity.cpp b/Minecraft.World/net/minecraft/world/entity/Entity.cpp similarity index 97% rename from Minecraft.World/Entities/Entity.cpp rename to Minecraft.World/net/minecraft/world/entity/Entity.cpp index a7dbc71e3..d1051baf5 100644 --- a/Minecraft.World/Entities/Entity.cpp +++ b/Minecraft.World/net/minecraft/world/entity/Entity.cpp @@ -1,31 +1,31 @@ -#include "../Platform/stdafx.h" -#include "../Headers/com.mojang.nbt.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.dimension.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.level.material.h" -#include "../Headers/net.minecraft.world.damagesource.h" +#include "../../../../Header Files/stdafx.h" +#include "../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../item/net.minecraft.world.item.h" +#include "../item/enchantment/net.minecraft.world.item.enchantment.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/dimension/net.minecraft.world.level.dimension.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../phys/net.minecraft.world.phys.h" +#include "item/net.minecraft.world.entity.item.h" +#include "../level/material/net.minecraft.world.level.material.h" +#include "../damageSource/net.minecraft.world.damagesource.h" #include "SyncedEntityData.h" -#include "../Level/Storage/EntityIO.h" -#include "../Util/SharedConstants.h" +#include "EntityIO.h" +#include "../../SharedConstants.h" -#include "../Util/ParticleTypes.h" +#include "../../../../Header Files/ParticleTypes.h" #include "EntityPos.h" #include "Entity.h" -#include "../Util/SoundTypes.h" -#include "../../Minecraft.Client/Rendering/Models/HumanoidModel.h" -#include "../../Minecraft.Client/MinecraftServer.h" -#include "../../Minecraft.Client/Level/MultiPlayerLevel.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" +#include "../../../../Header Files/SoundTypes.h" +#include "../../Minecraft.Client/net/minecraft/client/model/HumanoidModel.h" +#include "../../Minecraft.Client/net/minecraft/server/MinecraftServer.h" +#include "../../Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerLevel.h" +#include "../../Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" #include #include -#include "../../Minecraft.Client/Level/ServerLevel.h" -#include "../../Minecraft.Client/Network/PlayerList.h" +#include "../../Minecraft.Client/net/minecraft/server/level/ServerLevel.h" +#include "../../Minecraft.Client/net/minecraft/server/PlayerList.h" thread_local bool Entity::m_tlsUseSmallIds = false; diff --git a/Minecraft.World/Entities/Entity.h b/Minecraft.World/net/minecraft/world/entity/Entity.h similarity index 98% rename from Minecraft.World/Entities/Entity.h rename to Minecraft.World/net/minecraft/world/entity/Entity.h index 485a2ae57..7d4d6c768 100644 --- a/Minecraft.World/Entities/Entity.h +++ b/Minecraft.World/net/minecraft/world/entity/Entity.h @@ -1,11 +1,11 @@ #pragma once -#include "../IO/NBT/ListTag.h" -#include "../IO/NBT/DoubleTag.h" -#include "../IO/NBT/FloatTag.h" -#include "../Util/Vec3.h" -#include "../Util/Definitions.h" -#include "../Util/AABB.h" +#include "../../../../com/mojang/nbt/ListTag.h" +#include "../../../../com/mojang/nbt/DoubleTag.h" +#include "../../../../com/mojang/nbt/FloatTag.h" +#include "../phys/Vec3.h" +#include "../../../../ConsoleHelpers/Definitions.h" +#include "../phys/AABB.h" #include #include diff --git a/Minecraft.World/Entities/EntityEvent.h b/Minecraft.World/net/minecraft/world/entity/EntityEvent.h similarity index 100% rename from Minecraft.World/Entities/EntityEvent.h rename to Minecraft.World/net/minecraft/world/entity/EntityEvent.h diff --git a/Minecraft.World/Level/Storage/EntityIO.cpp b/Minecraft.World/net/minecraft/world/entity/EntityIO.cpp similarity index 95% rename from Minecraft.World/Level/Storage/EntityIO.cpp rename to Minecraft.World/net/minecraft/world/entity/EntityIO.cpp index 4023f1f4a..ea4c301cb 100644 --- a/Minecraft.World/Level/Storage/EntityIO.cpp +++ b/Minecraft.World/net/minecraft/world/entity/EntityIO.cpp @@ -1,19 +1,19 @@ -#include "../../Platform/stdafx.h" -#include "../../Util/Class.h" -#include "../../Entities/Mobs/Painting.h" -#include "../../Platform/System.h" -#include "../../Entities/Entity.h" -#include "../../Entities/Mobs/WitherBoss.h" -#include "../../Headers/net.minecraft.world.entity.ambient.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.entity.item.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.entity.projectile.h" -#include "../../Headers/net.minecraft.world.entity.boss.enderdragon.h" -#include "../../Headers/net.minecraft.world.entity.npc.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../Header Files/stdafx.h" +#include "../../../../ConsoleJavaLibs/Class.h" +#include "Painting.h" +#include "../../../../ConsoleJavaLibs/System.h" +#include "Entity.h" +#include "boss/wither/WitherBoss.h" +#include "ambient/net.minecraft.world.entity.ambient.h" +#include "animal/net.minecraft.world.entity.animal.h" +#include "item/net.minecraft.world.entity.item.h" +#include "monster/net.minecraft.world.entity.monster.h" +#include "projectile/net.minecraft.world.entity.projectile.h" +#include "boss/enderdragon/net.minecraft.world.entity.boss.enderdragon.h" +#include "npc/net.minecraft.world.entity.npc.h" +#include "net.minecraft.world.entity.h" +#include "../level/net.minecraft.world.level.h" +#include "../../../../com/mojang/nbt/com.mojang.nbt.h" #include "EntityIO.h" std::unordered_map* EntityIO::idCreateMap = diff --git a/Minecraft.World/Level/Storage/EntityIO.h b/Minecraft.World/net/minecraft/world/entity/EntityIO.h similarity index 97% rename from Minecraft.World/Level/Storage/EntityIO.h rename to Minecraft.World/net/minecraft/world/entity/EntityIO.h index db7737405..93ca1afe0 100644 --- a/Minecraft.World/Level/Storage/EntityIO.h +++ b/Minecraft.World/net/minecraft/world/entity/EntityIO.h @@ -1,7 +1,7 @@ #pragma once -#include "../../Entities/Entity.h" -#include "../../Util/JavaIntHash.h" +#include "Entity.h" +#include "../../../../ConsoleJavaLibs/JavaIntHash.h" class Level; class CompoundTag; diff --git a/Minecraft.World/Entities/EntityPos.cpp b/Minecraft.World/net/minecraft/world/entity/EntityPos.cpp similarity index 96% rename from Minecraft.World/Entities/EntityPos.cpp rename to Minecraft.World/net/minecraft/world/entity/EntityPos.cpp index bd5813f5d..72981740f 100644 --- a/Minecraft.World/Entities/EntityPos.cpp +++ b/Minecraft.World/net/minecraft/world/entity/EntityPos.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "Entity.h" #include "EntityPos.h" diff --git a/Minecraft.World/Entities/EntityPos.h b/Minecraft.World/net/minecraft/world/entity/EntityPos.h similarity index 100% rename from Minecraft.World/Entities/EntityPos.h rename to Minecraft.World/net/minecraft/world/entity/EntityPos.h diff --git a/Minecraft.World/Entities/EntitySelector.cpp b/Minecraft.World/net/minecraft/world/entity/EntitySelector.cpp similarity index 94% rename from Minecraft.World/Entities/EntitySelector.cpp rename to Minecraft.World/net/minecraft/world/entity/EntitySelector.cpp index a4e79f855..413fce4bd 100644 --- a/Minecraft.World/Entities/EntitySelector.cpp +++ b/Minecraft.World/net/minecraft/world/entity/EntitySelector.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Containers/Container.h" +#include "../../../../Header Files/stdafx.h" +#include "../Container.h" #include "EntitySelector.h" const EntitySelector* EntitySelector::ENTITY_STILL_ALIVE = diff --git a/Minecraft.World/Entities/EntitySelector.h b/Minecraft.World/net/minecraft/world/entity/EntitySelector.h similarity index 100% rename from Minecraft.World/Entities/EntitySelector.h rename to Minecraft.World/net/minecraft/world/entity/EntitySelector.h diff --git a/Minecraft.World/Entities/Mobs/ExperienceOrb.cpp b/Minecraft.World/net/minecraft/world/entity/ExperienceOrb.cpp similarity index 92% rename from Minecraft.World/Entities/Mobs/ExperienceOrb.cpp rename to Minecraft.World/net/minecraft/world/entity/ExperienceOrb.cpp index a187fea38..1309325e7 100644 --- a/Minecraft.World/Entities/Mobs/ExperienceOrb.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ExperienceOrb.cpp @@ -1,14 +1,14 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.material.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../Util/JavaMath.h" -#include "../../Util/SharedConstants.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/material/net.minecraft.world.level.material.h" +#include "../phys/net.minecraft.world.phys.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../damageSource/net.minecraft.world.damagesource.h" +#include "../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../../../../ConsoleJavaLibs/JavaMath.h" +#include "../../SharedConstants.h" #include "ExperienceOrb.h" -#include "../../Util/SoundTypes.h" +#include "../../../../Header Files/SoundTypes.h" const int ExperienceOrb::LIFETIME = 5 * 60 * SharedConstants::TICKS_PER_SECOND; // Five minutes! diff --git a/Minecraft.World/Entities/Mobs/ExperienceOrb.h b/Minecraft.World/net/minecraft/world/entity/ExperienceOrb.h similarity index 98% rename from Minecraft.World/Entities/Mobs/ExperienceOrb.h rename to Minecraft.World/net/minecraft/world/entity/ExperienceOrb.h index 0ecd4de42..4cd328f68 100644 --- a/Minecraft.World/Entities/Mobs/ExperienceOrb.h +++ b/Minecraft.World/net/minecraft/world/entity/ExperienceOrb.h @@ -1,6 +1,6 @@ #pragma once -#include "../Entity.h" +#include "Entity.h" class ExperienceOrb : public Entity { public: diff --git a/Minecraft.World/Entities/FlyingMob.cpp b/Minecraft.World/net/minecraft/world/entity/FlyingMob.cpp similarity index 91% rename from Minecraft.World/Entities/FlyingMob.cpp rename to Minecraft.World/net/minecraft/world/entity/FlyingMob.cpp index 6a38c457d..8d3213217 100644 --- a/Minecraft.World/Entities/FlyingMob.cpp +++ b/Minecraft.World/net/minecraft/world/entity/FlyingMob.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.phys.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../phys/net.minecraft.world.phys.h" #include "FlyingMob.h" FlyingMob::FlyingMob(Level* level) : Mob(level) {} diff --git a/Minecraft.World/Entities/FlyingMob.h b/Minecraft.World/net/minecraft/world/entity/FlyingMob.h similarity index 100% rename from Minecraft.World/Entities/FlyingMob.h rename to Minecraft.World/net/minecraft/world/entity/FlyingMob.h diff --git a/Minecraft.World/Entities/HangingEntity.cpp b/Minecraft.World/net/minecraft/world/entity/HangingEntity.cpp similarity index 95% rename from Minecraft.World/Entities/HangingEntity.cpp rename to Minecraft.World/net/minecraft/world/entity/HangingEntity.cpp index 2e4ed9359..04c6ab578 100644 --- a/Minecraft.World/Entities/HangingEntity.cpp +++ b/Minecraft.World/net/minecraft/world/entity/HangingEntity.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/com.mojang.nbt.h" +#include "../../../../Header Files/stdafx.h" +#include "../phys/net.minecraft.world.phys.h" +#include "net.minecraft.world.entity.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../level/net.minecraft.world.level.h" +#include "../damageSource/net.minecraft.world.damagesource.h" +#include "../../../../com/mojang/nbt/com.mojang.nbt.h" #include "HangingEntity.h" void HangingEntity::_init(Level* level) { diff --git a/Minecraft.World/Entities/HangingEntity.h b/Minecraft.World/net/minecraft/world/entity/HangingEntity.h similarity index 100% rename from Minecraft.World/Entities/HangingEntity.h rename to Minecraft.World/net/minecraft/world/entity/HangingEntity.h diff --git a/Minecraft.World/Entities/Mobs/ItemFrame.cpp b/Minecraft.World/net/minecraft/world/entity/ItemFrame.cpp similarity index 88% rename from Minecraft.World/Entities/Mobs/ItemFrame.cpp rename to Minecraft.World/net/minecraft/world/entity/ItemFrame.cpp index 2485a3ab6..44699ac36 100644 --- a/Minecraft.World/Entities/Mobs/ItemFrame.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ItemFrame.cpp @@ -1,14 +1,14 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.item.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.saveddata.h" -#include "../../Headers/com.mojang.nbt.h" +#include "item/net.minecraft.world.entity.item.h" +#include "../item/net.minecraft.world.item.h" +#include "../phys/net.minecraft.world.phys.h" +#include "../level/net.minecraft.world.level.h" +#include "player/net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../level/saveddata/net.minecraft.world.level.saveddata.h" +#include "../../../../com/mojang/nbt/com.mojang.nbt.h" #include "ItemFrame.h" // 4J - added for common ctor code diff --git a/Minecraft.World/Entities/Mobs/ItemFrame.h b/Minecraft.World/net/minecraft/world/entity/ItemFrame.h similarity index 95% rename from Minecraft.World/Entities/Mobs/ItemFrame.h rename to Minecraft.World/net/minecraft/world/entity/ItemFrame.h index 58a7394d4..b603fb52d 100644 --- a/Minecraft.World/Entities/Mobs/ItemFrame.h +++ b/Minecraft.World/net/minecraft/world/entity/ItemFrame.h @@ -1,7 +1,7 @@ #pragma once -#include "../Entity.h" -#include "../HangingEntity.h" +#include "Entity.h" +#include "HangingEntity.h" class Level; diff --git a/Minecraft.World/Entities/LeashFenceKnotEntity.cpp b/Minecraft.World/net/minecraft/world/entity/LeashFenceKnotEntity.cpp similarity index 95% rename from Minecraft.World/Entities/LeashFenceKnotEntity.cpp rename to Minecraft.World/net/minecraft/world/entity/LeashFenceKnotEntity.cpp index c5be63212..757ba1daf 100644 --- a/Minecraft.World/Entities/LeashFenceKnotEntity.cpp +++ b/Minecraft.World/net/minecraft/world/entity/LeashFenceKnotEntity.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.phys.h" +#include "../../../../Header Files/stdafx.h" +#include "player/net.minecraft.world.entity.player.h" +#include "../item/net.minecraft.world.item.h" +#include "../level/net.minecraft.world.level.h" +#include "../phys/net.minecraft.world.phys.h" #include "LeashFenceKnotEntity.h" void LeashFenceKnotEntity::_init() { defineSynchedData(); } diff --git a/Minecraft.World/Entities/LeashFenceKnotEntity.h b/Minecraft.World/net/minecraft/world/entity/LeashFenceKnotEntity.h similarity index 100% rename from Minecraft.World/Entities/LeashFenceKnotEntity.h rename to Minecraft.World/net/minecraft/world/entity/LeashFenceKnotEntity.h diff --git a/Minecraft.World/Entities/LivingEntity.cpp b/Minecraft.World/net/minecraft/world/entity/LivingEntity.cpp similarity index 96% rename from Minecraft.World/Entities/LivingEntity.cpp rename to Minecraft.World/net/minecraft/world/entity/LivingEntity.cpp index ef84a0837..b867e4b9c 100644 --- a/Minecraft.World/Entities/LivingEntity.cpp +++ b/Minecraft.World/net/minecraft/world/entity/LivingEntity.cpp @@ -1,38 +1,38 @@ -#include "../Platform/stdafx.h" -#include "../Util/JavaMath.h" -#include "../Util/Mth.h" -#include "../Headers/net.minecraft.network.packet.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../Headers/net.minecraft.world.entity.ai.control.h" -#include "../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../Headers/net.minecraft.world.entity.ai.sensing.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.animal.h" -#include "../Headers/net.minecraft.world.entity.monster.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.chunk.h" -#include "../Headers/net.minecraft.world.level.material.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/net.minecraft.world.effect.h" -#include "../Headers/net.minecraft.world.item.alchemy.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" -#include "../Headers/net.minecraft.world.scores.h" -#include "../Headers/com.mojang.nbt.h" +#include "../../../../Header Files/stdafx.h" +#include "../../../../ConsoleJavaLibs/JavaMath.h" +#include "../../util/Mth.h" +#include "../../network/packet/net.minecraft.network.packet.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../phys/net.minecraft.world.phys.h" +#include "net.minecraft.world.entity.h" +#include "ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "ai/control/net.minecraft.world.entity.ai.control.h" +#include "ai/navigation/net.minecraft.world.entity.ai.navigation.h" +#include "ai/sensing/net.minecraft.world.entity.ai.sensing.h" +#include "player/net.minecraft.world.entity.player.h" +#include "animal/net.minecraft.world.entity.animal.h" +#include "monster/net.minecraft.world.entity.monster.h" +#include "../item/net.minecraft.world.item.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/chunk/net.minecraft.world.level.chunk.h" +#include "../level/material/net.minecraft.world.level.material.h" +#include "../damageSource/net.minecraft.world.damagesource.h" +#include "../effect/net.minecraft.world.effect.h" +#include "../item/alchemy/net.minecraft.world.item.alchemy.h" +#include "../item/enchantment/net.minecraft.world.item.enchantment.h" +#include "../scores/net.minecraft.world.scores.h" +#include "../../../../com/mojang/nbt/com.mojang.nbt.h" #include "LivingEntity.h" #include -#include "../../Minecraft.Client/Textures/Textures.h" -#include "../../Minecraft.Client/Level/ServerLevel.h" -#include "../../Minecraft.Client/Player/EntityTracker.h" -#include "../Util/SoundTypes.h" -#include "../Util/ParticleTypes.h" -#include "../Stats/GenericStats.h" -#include "ItemEntity.h" -#include "Util/Vec3.h" +#include "../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" +#include "../../Minecraft.Client/net/minecraft/server/level/ServerLevel.h" +#include "../../Minecraft.Client/net/minecraft/server/level/EntityTracker.h" +#include "../../../../Header Files/SoundTypes.h" +#include "../../../../Header Files/ParticleTypes.h" +#include "../../stats/GenericStats.h" +#include "item/ItemEntity.h" +#include "../phys/Vec3.h" const double LivingEntity::MIN_MOVEMENT_DISTANCE = 0.005; diff --git a/Minecraft.World/Entities/LivingEntity.h b/Minecraft.World/net/minecraft/world/entity/LivingEntity.h similarity index 99% rename from Minecraft.World/Entities/LivingEntity.h rename to Minecraft.World/net/minecraft/world/entity/LivingEntity.h index ec20a24a9..1fad17157 100644 --- a/Minecraft.World/Entities/LivingEntity.h +++ b/Minecraft.World/net/minecraft/world/entity/LivingEntity.h @@ -3,8 +3,8 @@ #include #include "Entity.h" #include "MobType.h" -#include "../AI/Goals/GoalSelector.h" -#include "../Util/SharedConstants.h" +#include "ai/goal/GoalSelector.h" +#include "../../SharedConstants.h" class CombatTracker; class AttributeInstance; diff --git a/Minecraft.World/Entities/Mob.cpp b/Minecraft.World/net/minecraft/world/entity/Mob.cpp similarity index 94% rename from Minecraft.World/Entities/Mob.cpp rename to Minecraft.World/net/minecraft/world/entity/Mob.cpp index 270b5d112..798e311d9 100644 --- a/Minecraft.World/Entities/Mob.cpp +++ b/Minecraft.World/net/minecraft/world/entity/Mob.cpp @@ -1,33 +1,33 @@ -#include "../Platform/stdafx.h" -#include "../Util/JavaMath.h" -#include "../Headers/net.minecraft.network.packet.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../Headers/net.minecraft.world.entity.ai.control.h" -#include "../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../Headers/net.minecraft.world.entity.ai.sensing.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.animal.h" -#include "../Headers/net.minecraft.world.entity.monster.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.material.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/net.minecraft.world.effect.h" -#include "../Headers/net.minecraft.world.item.alchemy.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" -#include "../Headers/net.minecraft.world.h" -#include "../../Minecraft.Client/Level/ServerLevel.h" -#include "../../Minecraft.Client/Player/EntityTracker.h" -#include "../Headers/com.mojang.nbt.h" +#include "../../../../Header Files/stdafx.h" +#include "../../../../ConsoleJavaLibs/JavaMath.h" +#include "../../network/packet/net.minecraft.network.packet.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../phys/net.minecraft.world.phys.h" +#include "net.minecraft.world.entity.h" +#include "ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "ai/control/net.minecraft.world.entity.ai.control.h" +#include "ai/navigation/net.minecraft.world.entity.ai.navigation.h" +#include "ai/sensing/net.minecraft.world.entity.ai.sensing.h" +#include "player/net.minecraft.world.entity.player.h" +#include "animal/net.minecraft.world.entity.animal.h" +#include "monster/net.minecraft.world.entity.monster.h" +#include "../item/net.minecraft.world.item.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/material/net.minecraft.world.level.material.h" +#include "../damageSource/net.minecraft.world.damagesource.h" +#include "../effect/net.minecraft.world.effect.h" +#include "../item/alchemy/net.minecraft.world.item.alchemy.h" +#include "../item/enchantment/net.minecraft.world.item.enchantment.h" +#include "../net.minecraft.world.h" +#include "../../Minecraft.Client/net/minecraft/server/level/ServerLevel.h" +#include "../../Minecraft.Client/net/minecraft/server/level/EntityTracker.h" +#include "../../../../com/mojang/nbt/com.mojang.nbt.h" #include "Mob.h" -#include "../../Minecraft.Client/Textures/Textures.h" -#include "../Util/SoundTypes.h" -#include "../Util/ParticleTypes.h" -#include "../Stats/GenericStats.h" -#include "ItemEntity.h" +#include "../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" +#include "../../../../Header Files/SoundTypes.h" +#include "../../../../Header Files/ParticleTypes.h" +#include "../../stats/GenericStats.h" +#include "item/ItemEntity.h" const float Mob::MAX_WEARING_ARMOR_CHANCE = 0.15f; const float Mob::MAX_PICKUP_LOOT_CHANCE = 0.55f; diff --git a/Minecraft.World/Entities/Mob.h b/Minecraft.World/net/minecraft/world/entity/Mob.h similarity index 99% rename from Minecraft.World/Entities/Mob.h rename to Minecraft.World/net/minecraft/world/entity/Mob.h index 28723d342..bbc157ee7 100644 --- a/Minecraft.World/Entities/Mob.h +++ b/Minecraft.World/net/minecraft/world/entity/Mob.h @@ -2,7 +2,7 @@ #include "LivingEntity.h" #include "MobType.h" -#include "../AI/Goals/GoalSelector.h" +#include "ai/goal/GoalSelector.h" class HitResult; class Level; diff --git a/Minecraft.World/Entities/MobCategory.cpp b/Minecraft.World/net/minecraft/world/entity/MobCategory.cpp similarity index 93% rename from Minecraft.World/Entities/MobCategory.cpp rename to Minecraft.World/net/minecraft/world/entity/MobCategory.cpp index 9f3c15840..b744784f9 100644 --- a/Minecraft.World/Entities/MobCategory.cpp +++ b/Minecraft.World/net/minecraft/world/entity/MobCategory.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.animal.h" -#include "../Headers/net.minecraft.world.entity.monster.h" -#include "Mobs/Creature.h" -#include "../Blocks/Material.h" +#include "../../../../Header Files/stdafx.h" +#include "animal/net.minecraft.world.entity.animal.h" +#include "monster/net.minecraft.world.entity.monster.h" +#include "Creature.h" +#include "../level/material/Material.h" #include "MobCategory.h" MobCategory* MobCategory::monster = nullptr; diff --git a/Minecraft.World/Entities/MobCategory.h b/Minecraft.World/net/minecraft/world/entity/MobCategory.h similarity index 100% rename from Minecraft.World/Entities/MobCategory.h rename to Minecraft.World/net/minecraft/world/entity/MobCategory.h diff --git a/Minecraft.World/Entities/Mobs/MobGroupData.h b/Minecraft.World/net/minecraft/world/entity/MobGroupData.h similarity index 100% rename from Minecraft.World/Entities/Mobs/MobGroupData.h rename to Minecraft.World/net/minecraft/world/entity/MobGroupData.h diff --git a/Minecraft.World/Entities/MobType.h b/Minecraft.World/net/minecraft/world/entity/MobType.h similarity index 100% rename from Minecraft.World/Entities/MobType.h rename to Minecraft.World/net/minecraft/world/entity/MobType.h diff --git a/Minecraft.World/Entities/OwnableEntity.h b/Minecraft.World/net/minecraft/world/entity/OwnableEntity.h similarity index 100% rename from Minecraft.World/Entities/OwnableEntity.h rename to Minecraft.World/net/minecraft/world/entity/OwnableEntity.h diff --git a/Minecraft.World/Entities/Mobs/Painting.cpp b/Minecraft.World/net/minecraft/world/entity/Painting.cpp similarity index 91% rename from Minecraft.World/Entities/Mobs/Painting.cpp rename to Minecraft.World/net/minecraft/world/entity/Painting.cpp index 534a1169f..ccc916946 100644 --- a/Minecraft.World/Entities/Mobs/Painting.cpp +++ b/Minecraft.World/net/minecraft/world/entity/Painting.cpp @@ -1,13 +1,13 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.entity.item.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.material.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../Header Files/stdafx.h" +#include "../phys/net.minecraft.world.phys.h" +#include "item/net.minecraft.world.entity.item.h" +#include "../item/net.minecraft.world.item.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/material/net.minecraft.world.level.material.h" +#include "../damageSource/net.minecraft.world.damagesource.h" +#include "../../../../com/mojang/nbt/com.mojang.nbt.h" #include "Painting.h" -#include "../../Blocks/Material.h" +#include "../level/material/Material.h" typedef Painting::Motive _Motive; const _Motive* Painting::Motive::values[] = { diff --git a/Minecraft.World/Entities/Mobs/Painting.h b/Minecraft.World/net/minecraft/world/entity/Painting.h similarity index 98% rename from Minecraft.World/Entities/Mobs/Painting.h rename to Minecraft.World/net/minecraft/world/entity/Painting.h index bf7b8d2b5..51d8e24b2 100644 --- a/Minecraft.World/Entities/Mobs/Painting.h +++ b/Minecraft.World/net/minecraft/world/entity/Painting.h @@ -1,7 +1,7 @@ #pragma once -#include "../Entity.h" -#include "../HangingEntity.h" +#include "Entity.h" +#include "HangingEntity.h" class Level; class CompoundTag; diff --git a/Minecraft.World/Entities/PathfinderMob.cpp b/Minecraft.World/net/minecraft/world/entity/PathfinderMob.cpp similarity index 95% rename from Minecraft.World/Entities/PathfinderMob.cpp rename to Minecraft.World/net/minecraft/world/entity/PathfinderMob.cpp index b87662e2b..068d72d27 100644 --- a/Minecraft.World/Entities/PathfinderMob.cpp +++ b/Minecraft.World/net/minecraft/world/entity/PathfinderMob.cpp @@ -1,14 +1,14 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.animal.h" -#include "../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../Headers/net.minecraft.world.entity.monster.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.pathfinder.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Util/SharedConstants.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.world.entity.h" +#include "animal/net.minecraft.world.entity.animal.h" +#include "ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "ai/goal/net.minecraft.world.entity.ai.goal.h" +#include "ai/navigation/net.minecraft.world.entity.ai.navigation.h" +#include "monster/net.minecraft.world.entity.monster.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/pathfinder/net.minecraft.world.level.pathfinder.h" +#include "../phys/net.minecraft.world.phys.h" +#include "../../SharedConstants.h" #include "PathfinderMob.h" AttributeModifier* PathfinderMob::SPEED_MODIFIER_FLEEING = diff --git a/Minecraft.World/Entities/PathfinderMob.h b/Minecraft.World/net/minecraft/world/entity/PathfinderMob.h similarity index 100% rename from Minecraft.World/Entities/PathfinderMob.h rename to Minecraft.World/net/minecraft/world/entity/PathfinderMob.h diff --git a/Minecraft.World/Entities/SyncedEntityData.cpp b/Minecraft.World/net/minecraft/world/entity/SyncedEntityData.cpp similarity index 98% rename from Minecraft.World/Entities/SyncedEntityData.cpp rename to Minecraft.World/net/minecraft/world/entity/SyncedEntityData.cpp index 74dcc1bdd..d4abc7998 100644 --- a/Minecraft.World/Entities/SyncedEntityData.cpp +++ b/Minecraft.World/net/minecraft/world/entity/SyncedEntityData.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Util/Class.h" -#include "../IO/Streams/InputOutputStream.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.network.packet.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../../Header Files/stdafx.h" +#include "../../../../ConsoleJavaLibs/Class.h" +#include "../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../net.minecraft.h" +#include "../../network/packet/net.minecraft.network.packet.h" +#include "../item/net.minecraft.world.item.h" #include "SyncedEntityData.h" SynchedEntityData::SynchedEntityData() { diff --git a/Minecraft.World/Entities/SyncedEntityData.h b/Minecraft.World/net/minecraft/world/entity/SyncedEntityData.h similarity index 100% rename from Minecraft.World/Entities/SyncedEntityData.h rename to Minecraft.World/net/minecraft/world/entity/SyncedEntityData.h diff --git a/Minecraft.World/Entities/TamableAnimal.cpp b/Minecraft.World/net/minecraft/world/entity/TamableAnimal.cpp similarity index 94% rename from Minecraft.World/Entities/TamableAnimal.cpp rename to Minecraft.World/net/minecraft/world/entity/TamableAnimal.cpp index 858ccf63c..72992b5fc 100644 --- a/Minecraft.World/Entities/TamableAnimal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/TamableAnimal.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../Header Files/stdafx.h" +#include "ai/goal/net.minecraft.world.entity.ai.goal.h" +#include "net.minecraft.world.entity.h" +#include "../level/net.minecraft.world.level.h" #include "SyncedEntityData.h" -#include "../Util/ParticleTypes.h" +#include "../../../../Header Files/ParticleTypes.h" #include "TamableAnimal.h" TamableAnimal::TamableAnimal(Level* level) : Animal(level) { diff --git a/Minecraft.World/Entities/TamableAnimal.h b/Minecraft.World/net/minecraft/world/entity/TamableAnimal.h similarity index 97% rename from Minecraft.World/Entities/TamableAnimal.h rename to Minecraft.World/net/minecraft/world/entity/TamableAnimal.h index 9a9aa12d3..952235668 100644 --- a/Minecraft.World/Entities/TamableAnimal.h +++ b/Minecraft.World/net/minecraft/world/entity/TamableAnimal.h @@ -1,6 +1,6 @@ #pragma once -#include "Mobs/Animal.h" +#include "animal/Animal.h" #include "OwnableEntity.h" class SitGoal; diff --git a/Minecraft.World/AI/Attributes/Attribute.cpp b/Minecraft.World/net/minecraft/world/entity/ai/attributes/Attribute.cpp similarity index 90% rename from Minecraft.World/AI/Attributes/Attribute.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/attributes/Attribute.cpp index 50fe7d1bf..ad02acdc2 100644 --- a/Minecraft.World/AI/Attributes/Attribute.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/attributes/Attribute.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "Attribute.h" const int Attribute::AttributeNames[] = { diff --git a/Minecraft.World/AI/Attributes/Attribute.h b/Minecraft.World/net/minecraft/world/entity/ai/attributes/Attribute.h similarity index 100% rename from Minecraft.World/AI/Attributes/Attribute.h rename to Minecraft.World/net/minecraft/world/entity/ai/attributes/Attribute.h diff --git a/Minecraft.World/AI/Attributes/AttributeInstance.h b/Minecraft.World/net/minecraft/world/entity/ai/attributes/AttributeInstance.h similarity index 100% rename from Minecraft.World/AI/Attributes/AttributeInstance.h rename to Minecraft.World/net/minecraft/world/entity/ai/attributes/AttributeInstance.h diff --git a/Minecraft.World/AI/Attributes/AttributeModifier.cpp b/Minecraft.World/net/minecraft/world/entity/ai/attributes/AttributeModifier.cpp similarity index 97% rename from Minecraft.World/AI/Attributes/AttributeModifier.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/attributes/AttributeModifier.cpp index 4c505e231..b2c455eeb 100644 --- a/Minecraft.World/AI/Attributes/AttributeModifier.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/attributes/AttributeModifier.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "AttributeModifier.h" -#include "../../Util/HtmlString.h" +#include "../../../../util/HtmlString.h" void AttributeModifier::_init(eMODIFIER_ID id, const std::wstring name, double amount, int operation) { diff --git a/Minecraft.World/AI/Attributes/AttributeModifier.h b/Minecraft.World/net/minecraft/world/entity/ai/attributes/AttributeModifier.h similarity index 100% rename from Minecraft.World/AI/Attributes/AttributeModifier.h rename to Minecraft.World/net/minecraft/world/entity/ai/attributes/AttributeModifier.h diff --git a/Minecraft.World/AI/Attributes/BaseAttribute.cpp b/Minecraft.World/net/minecraft/world/entity/ai/attributes/BaseAttribute.cpp similarity index 90% rename from Minecraft.World/AI/Attributes/BaseAttribute.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/attributes/BaseAttribute.cpp index 4e80e8054..0ad423ca9 100644 --- a/Minecraft.World/AI/Attributes/BaseAttribute.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/attributes/BaseAttribute.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "BaseAttribute.h" diff --git a/Minecraft.World/AI/Attributes/BaseAttribute.h b/Minecraft.World/net/minecraft/world/entity/ai/attributes/BaseAttribute.h similarity index 100% rename from Minecraft.World/AI/Attributes/BaseAttribute.h rename to Minecraft.World/net/minecraft/world/entity/ai/attributes/BaseAttribute.h diff --git a/Minecraft.World/AI/Attributes/BaseAttributeMap.cpp b/Minecraft.World/net/minecraft/world/entity/ai/attributes/BaseAttributeMap.cpp similarity index 94% rename from Minecraft.World/AI/Attributes/BaseAttributeMap.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/attributes/BaseAttributeMap.cpp index 3cb0e0dc8..768f3ebae 100644 --- a/Minecraft.World/AI/Attributes/BaseAttributeMap.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/attributes/BaseAttributeMap.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "BaseAttributeMap.h" BaseAttributeMap::~BaseAttributeMap() { diff --git a/Minecraft.World/AI/Attributes/BaseAttributeMap.h b/Minecraft.World/net/minecraft/world/entity/ai/attributes/BaseAttributeMap.h similarity index 100% rename from Minecraft.World/AI/Attributes/BaseAttributeMap.h rename to Minecraft.World/net/minecraft/world/entity/ai/attributes/BaseAttributeMap.h diff --git a/Minecraft.World/AI/Attributes/ModifiableAttributeInstance.cpp b/Minecraft.World/net/minecraft/world/entity/ai/attributes/ModifiableAttributeInstance.cpp similarity index 97% rename from Minecraft.World/AI/Attributes/ModifiableAttributeInstance.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/attributes/ModifiableAttributeInstance.cpp index 865a71375..ab44b51b1 100644 --- a/Minecraft.World/AI/Attributes/ModifiableAttributeInstance.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/attributes/ModifiableAttributeInstance.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.entity.ai.attributes.h" #include "ModifiableAttributeInstance.h" ModifiableAttributeInstance::ModifiableAttributeInstance( diff --git a/Minecraft.World/AI/Attributes/ModifiableAttributeInstance.h b/Minecraft.World/net/minecraft/world/entity/ai/attributes/ModifiableAttributeInstance.h similarity index 100% rename from Minecraft.World/AI/Attributes/ModifiableAttributeInstance.h rename to Minecraft.World/net/minecraft/world/entity/ai/attributes/ModifiableAttributeInstance.h diff --git a/Minecraft.World/AI/Attributes/RangedAttribute.cpp b/Minecraft.World/net/minecraft/world/entity/ai/attributes/RangedAttribute.cpp similarity index 94% rename from Minecraft.World/AI/Attributes/RangedAttribute.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/attributes/RangedAttribute.cpp index ccbdaaad6..b4c1556cd 100644 --- a/Minecraft.World/AI/Attributes/RangedAttribute.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/attributes/RangedAttribute.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "RangedAttribute.h" diff --git a/Minecraft.World/AI/Attributes/RangedAttribute.h b/Minecraft.World/net/minecraft/world/entity/ai/attributes/RangedAttribute.h similarity index 100% rename from Minecraft.World/AI/Attributes/RangedAttribute.h rename to Minecraft.World/net/minecraft/world/entity/ai/attributes/RangedAttribute.h diff --git a/Minecraft.World/AI/Attributes/ServersideAttributeMap.cpp b/Minecraft.World/net/minecraft/world/entity/ai/attributes/ServersideAttributeMap.cpp similarity index 97% rename from Minecraft.World/AI/Attributes/ServersideAttributeMap.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/attributes/ServersideAttributeMap.cpp index a678ac6d7..901fcc7b2 100644 --- a/Minecraft.World/AI/Attributes/ServersideAttributeMap.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/attributes/ServersideAttributeMap.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "Attribute.h" #include "RangedAttribute.h" diff --git a/Minecraft.World/AI/Attributes/ServersideAttributeMap.h b/Minecraft.World/net/minecraft/world/entity/ai/attributes/ServersideAttributeMap.h similarity index 100% rename from Minecraft.World/AI/Attributes/ServersideAttributeMap.h rename to Minecraft.World/net/minecraft/world/entity/ai/attributes/ServersideAttributeMap.h diff --git a/Minecraft.World/net/minecraft/world/entity/ai/attributes/net.minecraft.world.entity.ai.attributes.h b/Minecraft.World/net/minecraft/world/entity/ai/attributes/net.minecraft.world.entity.ai.attributes.h new file mode 100644 index 000000000..783f48b57 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/ai/attributes/net.minecraft.world.entity.ai.attributes.h @@ -0,0 +1,10 @@ +#pragma once + +#include "Attribute.h" +#include "AttributeInstance.h" +#include "AttributeModifier.h" +#include "BaseAttribute.h" +#include "BaseAttributeMap.h" +#include "ModifiableAttributeInstance.h" +#include "RangedAttribute.h" +#include "ServersideAttributeMap.h" \ No newline at end of file diff --git a/Minecraft.World/AI/Control/BodyControl.cpp b/Minecraft.World/net/minecraft/world/entity/ai/control/BodyControl.cpp similarity index 90% rename from Minecraft.World/AI/Control/BodyControl.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/control/BodyControl.cpp index 787951c75..db6da03a5 100644 --- a/Minecraft.World/AI/Control/BodyControl.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/control/BodyControl.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.ai.control.h" #include "BodyControl.h" const float BodyControl::maxClampAngle = 75.0f; diff --git a/Minecraft.World/AI/Control/BodyControl.h b/Minecraft.World/net/minecraft/world/entity/ai/control/BodyControl.h similarity index 100% rename from Minecraft.World/AI/Control/BodyControl.h rename to Minecraft.World/net/minecraft/world/entity/ai/control/BodyControl.h diff --git a/Minecraft.World/AI/Control/Control.h b/Minecraft.World/net/minecraft/world/entity/ai/control/Control.h similarity index 100% rename from Minecraft.World/AI/Control/Control.h rename to Minecraft.World/net/minecraft/world/entity/ai/control/Control.h diff --git a/Minecraft.World/AI/Control/JumpControl.cpp b/Minecraft.World/net/minecraft/world/entity/ai/control/JumpControl.cpp similarity index 69% rename from Minecraft.World/AI/Control/JumpControl.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/control/JumpControl.cpp index 6cf8d3cc5..fee781cc1 100644 --- a/Minecraft.World/AI/Control/JumpControl.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/control/JumpControl.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.entity.h" #include "JumpControl.h" JumpControl::JumpControl(Mob* mob) { diff --git a/Minecraft.World/AI/Control/JumpControl.h b/Minecraft.World/net/minecraft/world/entity/ai/control/JumpControl.h similarity index 100% rename from Minecraft.World/AI/Control/JumpControl.h rename to Minecraft.World/net/minecraft/world/entity/ai/control/JumpControl.h diff --git a/Minecraft.World/AI/Control/LookControl.cpp b/Minecraft.World/net/minecraft/world/entity/ai/control/LookControl.cpp similarity index 91% rename from Minecraft.World/AI/Control/LookControl.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/control/LookControl.cpp index c956da61d..3fc8a02e7 100644 --- a/Minecraft.World/AI/Control/LookControl.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/control/LookControl.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../net.minecraft.world.entity.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "LookControl.h" LookControl::LookControl(Mob* mob) { diff --git a/Minecraft.World/AI/Control/LookControl.h b/Minecraft.World/net/minecraft/world/entity/ai/control/LookControl.h similarity index 100% rename from Minecraft.World/AI/Control/LookControl.h rename to Minecraft.World/net/minecraft/world/entity/ai/control/LookControl.h diff --git a/Minecraft.World/AI/Control/MoveControl.cpp b/Minecraft.World/net/minecraft/world/entity/ai/control/MoveControl.cpp similarity index 82% rename from Minecraft.World/AI/Control/MoveControl.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/control/MoveControl.cpp index 684ccd498..483e02fb2 100644 --- a/Minecraft.World/AI/Control/MoveControl.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/control/MoveControl.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.entity.h" +#include "../attributes/net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.ai.control.h" +#include "../../monster/net.minecraft.world.entity.monster.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "MoveControl.h" const float MoveControl::MIN_SPEED = 0.0005f; diff --git a/Minecraft.World/AI/Control/MoveControl.h b/Minecraft.World/net/minecraft/world/entity/ai/control/MoveControl.h similarity index 100% rename from Minecraft.World/AI/Control/MoveControl.h rename to Minecraft.World/net/minecraft/world/entity/ai/control/MoveControl.h diff --git a/Minecraft.World/net/minecraft/world/entity/ai/control/net.minecraft.world.entity.ai.control.h b/Minecraft.World/net/minecraft/world/entity/ai/control/net.minecraft.world.entity.ai.control.h new file mode 100644 index 000000000..d0a3e7832 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/ai/control/net.minecraft.world.entity.ai.control.h @@ -0,0 +1,7 @@ +#pragma once + +#include "Control.h" +#include "BodyControl.h" +#include "JumpControl.h" +#include "LookControl.h" +#include "MoveControl.h" \ No newline at end of file diff --git a/Minecraft.World/AI/Goals/AvoidPlayerGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/AvoidPlayerGoal.cpp similarity index 84% rename from Minecraft.World/AI/Goals/AvoidPlayerGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/AvoidPlayerGoal.cpp index 9288a7d93..39fce93c0 100644 --- a/Minecraft.World/AI/Goals/AvoidPlayerGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/AvoidPlayerGoal.cpp @@ -1,13 +1,13 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.ai.sensing.h" -#include "../../Headers/net.minecraft.world.entity.ai.util.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.pathfinder.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../sensing/net.minecraft.world.entity.ai.sensing.h" +#include "../util/net.minecraft.world.entity.ai.util.h" +#include "../../net.minecraft.world.entity.h" +#include "../../animal/net.minecraft.world.entity.animal.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../level/pathfinder/net.minecraft.world.level.pathfinder.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "AvoidPlayerGoal.h" AvoidPlayerGoalEntitySelector::AvoidPlayerGoalEntitySelector( diff --git a/Minecraft.World/AI/Goals/AvoidPlayerGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/AvoidPlayerGoal.h similarity index 96% rename from Minecraft.World/AI/Goals/AvoidPlayerGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/AvoidPlayerGoal.h index 9376dd750..238c6f8fe 100644 --- a/Minecraft.World/AI/Goals/AvoidPlayerGoal.h +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/AvoidPlayerGoal.h @@ -1,7 +1,7 @@ #pragma once #include "Goal.h" -#include "../../Entities/EntitySelector.h" +#include "../../EntitySelector.h" class PathNavigation; class PathfinderMob; diff --git a/Minecraft.World/AI/Goals/BegGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/BegGoal.cpp similarity index 82% rename from Minecraft.World/AI/Goals/BegGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/BegGoal.cpp index 2f31740bb..91d5b295f 100644 --- a/Minecraft.World/AI/Goals/BegGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/BegGoal.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.item.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../../animal/net.minecraft.world.entity.animal.h" +#include "../../player/net.minecraft.world.entity.player.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../item/net.minecraft.world.item.h" #include "BegGoal.h" BegGoal::BegGoal(Wolf* wolf, float lookDistance) { diff --git a/Minecraft.World/AI/Goals/BegGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/BegGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/BegGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/BegGoal.h diff --git a/Minecraft.World/AI/Goals/BreakDoorGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/BreakDoorGoal.cpp similarity index 85% rename from Minecraft.World/AI/Goals/BreakDoorGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/BreakDoorGoal.cpp index 26e210e86..adcb92346 100644 --- a/Minecraft.World/AI/Goals/BreakDoorGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/BreakDoorGoal.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.h" -#include "../../Util/SharedConstants.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.entity.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../level/tile/net.minecraft.world.level.tile.h" +#include "../../../net.minecraft.world.h" +#include "../../../../SharedConstants.h" #include "BreakDoorGoal.h" BreakDoorGoal::BreakDoorGoal(Mob* mob) : DoorInteractGoal(mob) { diff --git a/Minecraft.World/AI/Goals/BreakDoorGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/BreakDoorGoal.h similarity index 90% rename from Minecraft.World/AI/Goals/BreakDoorGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/BreakDoorGoal.h index 4912d9121..43ff82536 100644 --- a/Minecraft.World/AI/Goals/BreakDoorGoal.h +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/BreakDoorGoal.h @@ -1,7 +1,7 @@ #pragma once #include "DoorInteractGoal.h" -#include "../../Util/SharedConstants.h" +#include "../../../../SharedConstants.h" class BreakDoorGoal : public DoorInteractGoal { private: diff --git a/Minecraft.World/AI/Goals/BreedGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/BreedGoal.cpp similarity index 90% rename from Minecraft.World/AI/Goals/BreedGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/BreedGoal.cpp index ea219158f..75393f182 100644 --- a/Minecraft.World/AI/Goals/BreedGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/BreedGoal.cpp @@ -1,14 +1,14 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../animal/net.minecraft.world.entity.animal.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "BreedGoal.h" #include -#include "../../Entities/Mobs/ExperienceOrb.h" +#include "../../ExperienceOrb.h" -#include "../../Stats/GenericStats.h" +#include "../../../../stats/GenericStats.h" BreedGoal::BreedGoal(Animal* animal, double speedModifier) { partner = std::weak_ptr(); diff --git a/Minecraft.World/AI/Goals/BreedGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/BreedGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/BreedGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/BreedGoal.h diff --git a/Minecraft.World/AI/Goals/ControlledByPlayerGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/ControlledByPlayerGoal.cpp similarity index 91% rename from Minecraft.World/AI/Goals/ControlledByPlayerGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/ControlledByPlayerGoal.cpp index f32574982..2d4eeb79b 100644 --- a/Minecraft.World/AI/Goals/ControlledByPlayerGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/ControlledByPlayerGoal.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.pathfinder.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.entity.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../../player/net.minecraft.world.entity.player.h" +#include "../../../item/net.minecraft.world.item.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../level/tile/net.minecraft.world.level.tile.h" +#include "../../../level/pathfinder/net.minecraft.world.level.pathfinder.h" #include "ControlledByPlayerGoal.h" ControlledByPlayerGoal::ControlledByPlayerGoal(Mob* mob, float maxSpeed, diff --git a/Minecraft.World/AI/Goals/ControlledByPlayerGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/ControlledByPlayerGoal.h similarity index 93% rename from Minecraft.World/AI/Goals/ControlledByPlayerGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/ControlledByPlayerGoal.h index 06fa210de..bd992ea2a 100644 --- a/Minecraft.World/AI/Goals/ControlledByPlayerGoal.h +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/ControlledByPlayerGoal.h @@ -1,7 +1,7 @@ #pragma once #include "Goal.h" -#include "../Minecraft.World/Util/SharedConstants.h" +#include "../../../../SharedConstants.h" class Mob; diff --git a/Minecraft.World/AI/Goals/DoorInteractGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/DoorInteractGoal.cpp similarity index 83% rename from Minecraft.World/AI/Goals/DoorInteractGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/DoorInteractGoal.cpp index 117c3fb66..c153f1af8 100644 --- a/Minecraft.World/AI/Goals/DoorInteractGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/DoorInteractGoal.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.pathfinder.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.entity.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../level/pathfinder/net.minecraft.world.level.pathfinder.h" +#include "../../../level/tile/net.minecraft.world.level.tile.h" #include "DoorInteractGoal.h" DoorInteractGoal::DoorInteractGoal(Mob* mob) { diff --git a/Minecraft.World/AI/Goals/DoorInteractGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/DoorInteractGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/DoorInteractGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/DoorInteractGoal.h diff --git a/Minecraft.World/AI/Goals/EatTileGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/EatTileGoal.cpp similarity index 84% rename from Minecraft.World/AI/Goals/EatTileGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/EatTileGoal.cpp index 3354ee702..6b2782a26 100644 --- a/Minecraft.World/AI/Goals/EatTileGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/EatTileGoal.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../net.minecraft.world.entity.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../level/tile/net.minecraft.world.level.tile.h" #include "EatTileGoal.h" EatTileGoal::EatTileGoal(Mob* mob) { diff --git a/Minecraft.World/AI/Goals/EatTileGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/EatTileGoal.h similarity index 94% rename from Minecraft.World/AI/Goals/EatTileGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/EatTileGoal.h index 73a8baaa2..b22aa9394 100644 --- a/Minecraft.World/AI/Goals/EatTileGoal.h +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/EatTileGoal.h @@ -1,7 +1,7 @@ #pragma once #include "Goal.h" -#include "../../Util/SharedConstants.h" +#include "../../../../SharedConstants.h" // note: Mob should implement handleEntityEvent for client state, also ate to // take action upon eating diff --git a/Minecraft.World/AI/Goals/FleeSunGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/FleeSunGoal.cpp similarity index 80% rename from Minecraft.World/AI/Goals/FleeSunGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/FleeSunGoal.cpp index 4f35fb567..8c7a442b6 100644 --- a/Minecraft.World/AI/Goals/FleeSunGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/FleeSunGoal.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../net.minecraft.world.entity.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "FleeSunGoal.h" #include diff --git a/Minecraft.World/AI/Goals/FleeSunGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/FleeSunGoal.h similarity index 94% rename from Minecraft.World/AI/Goals/FleeSunGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/FleeSunGoal.h index e9cce5983..b2a7fbb56 100644 --- a/Minecraft.World/AI/Goals/FleeSunGoal.h +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/FleeSunGoal.h @@ -2,7 +2,7 @@ #include -#include "../../Util/Vec3.h" +#include "../../../phys/Vec3.h" #include "Goal.h" class FleeSunGoal : public Goal { diff --git a/Minecraft.World/AI/Goals/FloatGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/FloatGoal.cpp similarity index 62% rename from Minecraft.World/AI/Goals/FloatGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/FloatGoal.cpp index e69794d0e..aceda0d62 100644 --- a/Minecraft.World/AI/Goals/FloatGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/FloatGoal.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.entity.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" #include "FloatGoal.h" FloatGoal::FloatGoal(Mob* mob) { diff --git a/Minecraft.World/AI/Goals/FloatGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/FloatGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/FloatGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/FloatGoal.h diff --git a/Minecraft.World/AI/Goals/FollowOwnerGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/FollowOwnerGoal.cpp similarity index 87% rename from Minecraft.World/AI/Goals/FollowOwnerGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/FollowOwnerGoal.cpp index 627823b09..dfcc91b39 100644 --- a/Minecraft.World/AI/Goals/FollowOwnerGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/FollowOwnerGoal.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../net.minecraft.world.entity.h" +#include "../../animal/net.minecraft.world.entity.animal.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "FollowOwnerGoal.h" FollowOwnerGoal::FollowOwnerGoal(TamableAnimal* tamable, double speedModifier, diff --git a/Minecraft.World/AI/Goals/FollowOwnerGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/FollowOwnerGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/FollowOwnerGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/FollowOwnerGoal.h diff --git a/Minecraft.World/AI/Goals/FollowParentGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/FollowParentGoal.cpp similarity index 85% rename from Minecraft.World/AI/Goals/FollowParentGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/FollowParentGoal.cpp index ae6ff0b70..1a8dfc4fa 100644 --- a/Minecraft.World/AI/Goals/FollowParentGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/FollowParentGoal.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../animal/net.minecraft.world.entity.animal.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "FollowParentGoal.h" #include diff --git a/Minecraft.World/AI/Goals/FollowParentGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/FollowParentGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/FollowParentGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/FollowParentGoal.h diff --git a/Minecraft.World/AI/Goals/Goal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/Goal.cpp similarity index 88% rename from Minecraft.World/AI/Goals/Goal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/Goal.cpp index e4ea68fb4..3e47f4251 100644 --- a/Minecraft.World/AI/Goals/Goal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/Goal.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "Goal.h" Goal::Goal() { _requiredControlFlags = 0; } diff --git a/Minecraft.World/AI/Goals/Goal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/Goal.h similarity index 100% rename from Minecraft.World/AI/Goals/Goal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/Goal.h diff --git a/Minecraft.World/AI/Goals/GoalSelector.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/GoalSelector.cpp similarity index 98% rename from Minecraft.World/AI/Goals/GoalSelector.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/GoalSelector.cpp index 22facd8fd..62432d92e 100644 --- a/Minecraft.World/AI/Goals/GoalSelector.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/GoalSelector.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "Goal.h" #include "GoalSelector.h" diff --git a/Minecraft.World/AI/Goals/GoalSelector.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/GoalSelector.h similarity index 100% rename from Minecraft.World/AI/Goals/GoalSelector.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/GoalSelector.h diff --git a/Minecraft.World/AI/Goals/InteractGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/InteractGoal.cpp similarity index 84% rename from Minecraft.World/AI/Goals/InteractGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/InteractGoal.cpp index bb70da2d3..4a66753f8 100644 --- a/Minecraft.World/AI/Goals/InteractGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/InteractGoal.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" #include "InteractGoal.h" InteractGoal::InteractGoal(Mob* mob, const std::type_info& lookAtType, diff --git a/Minecraft.World/AI/Goals/InteractGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/InteractGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/InteractGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/InteractGoal.h diff --git a/Minecraft.World/AI/Goals/LeapAtTargetGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/LeapAtTargetGoal.cpp similarity index 87% rename from Minecraft.World/AI/Goals/LeapAtTargetGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/LeapAtTargetGoal.cpp index deeabe955..a00e3cddb 100644 --- a/Minecraft.World/AI/Goals/LeapAtTargetGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/LeapAtTargetGoal.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../../net.minecraft.world.entity.h" #include "LeapAtTargetGoal.h" LeapAtTargetGoal::LeapAtTargetGoal(Mob* mob, float yd) { diff --git a/Minecraft.World/AI/Goals/LeapAtTargetGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/LeapAtTargetGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/LeapAtTargetGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/LeapAtTargetGoal.h diff --git a/Minecraft.World/AI/Goals/LookAtPlayerGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/LookAtPlayerGoal.cpp similarity index 87% rename from Minecraft.World/AI/Goals/LookAtPlayerGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/LookAtPlayerGoal.cpp index 6f81859ff..e89bd5529 100644 --- a/Minecraft.World/AI/Goals/LookAtPlayerGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/LookAtPlayerGoal.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.entity.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "LookAtPlayerGoal.h" LookAtPlayerGoal::LookAtPlayerGoal(Mob* mob, const std::type_info& lookAtType, diff --git a/Minecraft.World/AI/Goals/LookAtPlayerGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/LookAtPlayerGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/LookAtPlayerGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/LookAtPlayerGoal.h diff --git a/Minecraft.World/AI/Goals/LookAtTradingPlayerGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/LookAtTradingPlayerGoal.cpp similarity index 72% rename from Minecraft.World/AI/Goals/LookAtTradingPlayerGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/LookAtTradingPlayerGoal.cpp index 00c733695..78c7e6f1a 100644 --- a/Minecraft.World/AI/Goals/LookAtTradingPlayerGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/LookAtTradingPlayerGoal.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.npc.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../player/net.minecraft.world.entity.player.h" +#include "../../npc/net.minecraft.world.entity.npc.h" #include "LookAtTradingPlayerGoal.h" LookAtTradingPlayerGoal::LookAtTradingPlayerGoal(Villager* villager) diff --git a/Minecraft.World/AI/Goals/LookAtTradingPlayerGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/LookAtTradingPlayerGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/LookAtTradingPlayerGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/LookAtTradingPlayerGoal.h diff --git a/Minecraft.World/AI/Goals/MakeLoveGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/MakeLoveGoal.cpp similarity index 88% rename from Minecraft.World/AI/Goals/MakeLoveGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/MakeLoveGoal.cpp index 4aa24c0db..8b541e5bd 100644 --- a/Minecraft.World/AI/Goals/MakeLoveGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/MakeLoveGoal.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.village.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.npc.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../village/net.minecraft.world.entity.ai.village.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../npc/net.minecraft.world.entity.npc.h" +#include "../../net.minecraft.world.entity.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "MakeLoveGoal.h" MakeLoveGoal::MakeLoveGoal(Villager* villager) { diff --git a/Minecraft.World/AI/Goals/MakeLoveGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/MakeLoveGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/MakeLoveGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/MakeLoveGoal.h diff --git a/Minecraft.World/AI/Goals/MeleeAttackGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/MeleeAttackGoal.cpp similarity index 84% rename from Minecraft.World/AI/Goals/MeleeAttackGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/MeleeAttackGoal.cpp index 989a355b6..4aa25fadf 100644 --- a/Minecraft.World/AI/Goals/MeleeAttackGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/MeleeAttackGoal.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../Navigation/Path.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.ai.sensing.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.entity.h" +#include "../../monster/net.minecraft.world.entity.monster.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../../../level/pathfinder/Path.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../sensing/net.minecraft.world.entity.ai.sensing.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "MeleeAttackGoal.h" void MeleeAttackGoal::_init(PathfinderMob* mob, double speedModifier, diff --git a/Minecraft.World/AI/Goals/MeleeAttackGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/MeleeAttackGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/MeleeAttackGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/MeleeAttackGoal.h diff --git a/Minecraft.World/AI/Goals/MoveIndoorsGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/MoveIndoorsGoal.cpp similarity index 82% rename from Minecraft.World/AI/Goals/MoveIndoorsGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/MoveIndoorsGoal.cpp index d9eddea58..64967527c 100644 --- a/Minecraft.World/AI/Goals/MoveIndoorsGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/MoveIndoorsGoal.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.util.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.ai.village.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.dimension.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../util/net.minecraft.world.entity.ai.util.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../village/net.minecraft.world.entity.ai.village.h" +#include "../../net.minecraft.world.entity.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../level/dimension/net.minecraft.world.level.dimension.h" #include "MoveIndoorsGoal.h" MoveIndoorsGoal::MoveIndoorsGoal(PathfinderMob* mob) { diff --git a/Minecraft.World/AI/Goals/MoveIndoorsGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/MoveIndoorsGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/MoveIndoorsGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/MoveIndoorsGoal.h diff --git a/Minecraft.World/AI/Goals/MoveThroughVillageGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/MoveThroughVillageGoal.cpp similarity index 90% rename from Minecraft.World/AI/Goals/MoveThroughVillageGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/MoveThroughVillageGoal.cpp index 7b4b56a14..3a4be0632 100644 --- a/Minecraft.World/AI/Goals/MoveThroughVillageGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/MoveThroughVillageGoal.cpp @@ -1,13 +1,13 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.ai.util.h" -#include "../../Headers/net.minecraft.world.entity.ai.village.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../util/net.minecraft.world.entity.ai.util.h" +#include "../village/net.minecraft.world.entity.ai.village.h" +#include "../../net.minecraft.world.entity.h" +#include "../../../level/net.minecraft.world.level.h" #include "MoveThroughVillageGoal.h" #include -#include "../Navigation/Path.h" +#include "../../../level/pathfinder/Path.h" MoveThroughVillageGoal::MoveThroughVillageGoal(PathfinderMob* mob, double speedModifier, diff --git a/Minecraft.World/AI/Goals/MoveThroughVillageGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/MoveThroughVillageGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/MoveThroughVillageGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/MoveThroughVillageGoal.h diff --git a/Minecraft.World/AI/Goals/MoveTowardsRestrictionGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/MoveTowardsRestrictionGoal.cpp similarity index 75% rename from Minecraft.World/AI/Goals/MoveTowardsRestrictionGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/MoveTowardsRestrictionGoal.cpp index cb52d4c3b..54401a934 100644 --- a/Minecraft.World/AI/Goals/MoveTowardsRestrictionGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/MoveTowardsRestrictionGoal.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.util.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../util/net.minecraft.world.entity.ai.util.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../net.minecraft.world.entity.h" +#include "../../../level/net.minecraft.world.level.h" #include "MoveTowardsRestrictionGoal.h" MoveTowardsRestrictionGoal::MoveTowardsRestrictionGoal(PathfinderMob* mob, diff --git a/Minecraft.World/AI/Goals/MoveTowardsRestrictionGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/MoveTowardsRestrictionGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/MoveTowardsRestrictionGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/MoveTowardsRestrictionGoal.h diff --git a/Minecraft.World/AI/Goals/MoveTowardsTargetGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/MoveTowardsTargetGoal.cpp similarity index 81% rename from Minecraft.World/AI/Goals/MoveTowardsTargetGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/MoveTowardsTargetGoal.cpp index 613cbfd3f..eeb56fa66 100644 --- a/Minecraft.World/AI/Goals/MoveTowardsTargetGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/MoveTowardsTargetGoal.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.ai.util.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../util/net.minecraft.world.entity.ai.util.h" +#include "../../net.minecraft.world.entity.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "MoveTowardsTargetGoal.h" MoveTowardsTargetGoal::MoveTowardsTargetGoal(PathfinderMob* mob, diff --git a/Minecraft.World/AI/Goals/MoveTowardsTargetGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/MoveTowardsTargetGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/MoveTowardsTargetGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/MoveTowardsTargetGoal.h diff --git a/Minecraft.World/AI/Goals/OcelotAttackGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/OcelotAttackGoal.cpp similarity index 83% rename from Minecraft.World/AI/Goals/OcelotAttackGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/OcelotAttackGoal.cpp index 5169093d3..7b6152575 100644 --- a/Minecraft.World/AI/Goals/OcelotAttackGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/OcelotAttackGoal.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../net.minecraft.world.entity.h" +#include "../../animal/net.minecraft.world.entity.animal.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "OcelotAttackGoal.h" OcelotAttackGoal::OcelotAttackGoal(Mob* mob) { diff --git a/Minecraft.World/AI/Goals/OcelotAttackGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/OcelotAttackGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/OcelotAttackGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/OcelotAttackGoal.h diff --git a/Minecraft.World/AI/Goals/OcelotSitOnTileGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/OcelotSitOnTileGoal.cpp similarity index 86% rename from Minecraft.World/AI/Goals/OcelotSitOnTileGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/OcelotSitOnTileGoal.cpp index 058565138..98eade3cd 100644 --- a/Minecraft.World/AI/Goals/OcelotSitOnTileGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/OcelotSitOnTileGoal.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Util/Arrays.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "net.minecraft.world.entity.ai.goal.h" +#include "../../animal/net.minecraft.world.entity.animal.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../level/tile/net.minecraft.world.level.tile.h" +#include "../../../level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../ConsoleJavaLibs/Arrays.h" #include "OcelotSitOnTileGoal.h" #include diff --git a/Minecraft.World/AI/Goals/OcelotSitOnTileGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/OcelotSitOnTileGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/OcelotSitOnTileGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/OcelotSitOnTileGoal.h diff --git a/Minecraft.World/AI/Goals/OfferFlowerGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/OfferFlowerGoal.cpp similarity index 76% rename from Minecraft.World/AI/Goals/OfferFlowerGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/OfferFlowerGoal.cpp index 7d6b64a37..49c367559 100644 --- a/Minecraft.World/AI/Goals/OfferFlowerGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/OfferFlowerGoal.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.npc.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../../npc/net.minecraft.world.entity.npc.h" +#include "../../animal/net.minecraft.world.entity.animal.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "OfferFlowerGoal.h" OfferFlowerGoal::OfferFlowerGoal(VillagerGolem* golem) { diff --git a/Minecraft.World/AI/Goals/OfferFlowerGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/OfferFlowerGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/OfferFlowerGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/OfferFlowerGoal.h diff --git a/Minecraft.World/AI/Goals/OpenDoorGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/OpenDoorGoal.cpp similarity index 79% rename from Minecraft.World/AI/Goals/OpenDoorGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/OpenDoorGoal.cpp index e13f88c00..6c607fee9 100644 --- a/Minecraft.World/AI/Goals/OpenDoorGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/OpenDoorGoal.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.entity.h" +#include "../../../level/tile/net.minecraft.world.level.tile.h" #include "OpenDoorGoal.h" OpenDoorGoal::OpenDoorGoal(Mob* mob, bool closeDoorAfter) diff --git a/Minecraft.World/AI/Goals/OpenDoorGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/OpenDoorGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/OpenDoorGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/OpenDoorGoal.h diff --git a/Minecraft.World/AI/Goals/PanicGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/PanicGoal.cpp similarity index 76% rename from Minecraft.World/AI/Goals/PanicGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/PanicGoal.cpp index 23f3e7213..ea57ecdd6 100644 --- a/Minecraft.World/AI/Goals/PanicGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/PanicGoal.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.ai.util.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../util/net.minecraft.world.entity.ai.util.h" +#include "../../net.minecraft.world.entity.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "PanicGoal.h" PanicGoal::PanicGoal(PathfinderMob* mob, double speedModifier) { diff --git a/Minecraft.World/AI/Goals/PanicGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/PanicGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/PanicGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/PanicGoal.h diff --git a/Minecraft.World/AI/Goals/PlayGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/PlayGoal.cpp similarity index 84% rename from Minecraft.World/AI/Goals/PlayGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/PlayGoal.cpp index 95d97e835..98b2f1ba2 100644 --- a/Minecraft.World/AI/Goals/PlayGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/PlayGoal.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.util.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.npc.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../util/net.minecraft.world.entity.ai.util.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../npc/net.minecraft.world.entity.npc.h" +#include "../../net.minecraft.world.entity.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "PlayGoal.h" #include diff --git a/Minecraft.World/AI/Goals/PlayGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/PlayGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/PlayGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/PlayGoal.h diff --git a/Minecraft.World/AI/Goals/RandomLookAroundGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/RandomLookAroundGoal.cpp similarity index 84% rename from Minecraft.World/AI/Goals/RandomLookAroundGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/RandomLookAroundGoal.cpp index 570735bcd..88f12608b 100644 --- a/Minecraft.World/AI/Goals/RandomLookAroundGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/RandomLookAroundGoal.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.entity.h" +#include "../control/net.minecraft.world.entity.ai.control.h" #include "RandomLookAroundGoal.h" RandomLookAroundGoal::RandomLookAroundGoal(Mob* mob) { diff --git a/Minecraft.World/AI/Goals/RandomLookAroundGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/RandomLookAroundGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/RandomLookAroundGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/RandomLookAroundGoal.h diff --git a/Minecraft.World/AI/Goals/RandomStrollGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/RandomStrollGoal.cpp similarity index 85% rename from Minecraft.World/AI/Goals/RandomStrollGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/RandomStrollGoal.cpp index 2e95918bd..f1f4de473 100644 --- a/Minecraft.World/AI/Goals/RandomStrollGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/RandomStrollGoal.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.ai.util.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Util/SharedConstants.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.entity.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../util/net.minecraft.world.entity.ai.util.h" +#include "../../../phys/net.minecraft.world.phys.h" +#include "../../../../SharedConstants.h" #include "RandomStrollGoal.h" RandomStrollGoal::RandomStrollGoal(PathfinderMob* mob, double speedModifier) { diff --git a/Minecraft.World/AI/Goals/RandomStrollGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/RandomStrollGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/RandomStrollGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/RandomStrollGoal.h diff --git a/Minecraft.World/AI/Goals/RangedAttackGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/RangedAttackGoal.cpp similarity index 89% rename from Minecraft.World/AI/Goals/RangedAttackGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/RangedAttackGoal.cpp index f0d3e109a..96e196c83 100644 --- a/Minecraft.World/AI/Goals/RangedAttackGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/RangedAttackGoal.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.ai.sensing.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../sensing/net.minecraft.world.entity.ai.sensing.h" +#include "../../net.minecraft.world.entity.h" +#include "../../monster/net.minecraft.world.entity.monster.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "RangedAttackGoal.h" void RangedAttackGoal::_init(RangedAttackMob* rangedMob, Mob* mob, diff --git a/Minecraft.World/AI/Goals/RangedAttackGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/RangedAttackGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/RangedAttackGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/RangedAttackGoal.h diff --git a/Minecraft.World/AI/Goals/RestrictOpenDoorGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/RestrictOpenDoorGoal.cpp similarity index 85% rename from Minecraft.World/AI/Goals/RestrictOpenDoorGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/RestrictOpenDoorGoal.cpp index d8b5d0241..939cb14e5 100644 --- a/Minecraft.World/AI/Goals/RestrictOpenDoorGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/RestrictOpenDoorGoal.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.ai.village.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../village/net.minecraft.world.entity.ai.village.h" +#include "../../net.minecraft.world.entity.h" +#include "../../../level/net.minecraft.world.level.h" #include "RestrictOpenDoorGoal.h" RestrictOpenDoorGoal::RestrictOpenDoorGoal(PathfinderMob* mob) { diff --git a/Minecraft.World/AI/Goals/RestrictOpenDoorGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/RestrictOpenDoorGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/RestrictOpenDoorGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/RestrictOpenDoorGoal.h diff --git a/Minecraft.World/AI/Goals/RestrictSunGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/RestrictSunGoal.cpp similarity index 60% rename from Minecraft.World/AI/Goals/RestrictSunGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/RestrictSunGoal.cpp index 647e15383..6bfffa2e3 100644 --- a/Minecraft.World/AI/Goals/RestrictSunGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/RestrictSunGoal.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../net.minecraft.world.entity.h" +#include "../../../level/net.minecraft.world.level.h" #include "RestrictSunGoal.h" RestrictSunGoal::RestrictSunGoal(PathfinderMob* mob) { this->mob = mob; } diff --git a/Minecraft.World/AI/Goals/RestrictSunGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/RestrictSunGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/RestrictSunGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/RestrictSunGoal.h diff --git a/Minecraft.World/AI/Goals/RunAroundLikeCrazyGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/RunAroundLikeCrazyGoal.cpp similarity index 81% rename from Minecraft.World/AI/Goals/RunAroundLikeCrazyGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/RunAroundLikeCrazyGoal.cpp index a8d7a2623..871d41ccf 100644 --- a/Minecraft.World/AI/Goals/RunAroundLikeCrazyGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/RunAroundLikeCrazyGoal.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../Navigation/RandomPos.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.entity.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../../animal/net.minecraft.world.entity.animal.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../player/net.minecraft.world.entity.player.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../util/RandomPos.h" #include "RunAroundLikeCrazyGoal.h" RunAroundLikeCrazyGoal::RunAroundLikeCrazyGoal(EntityHorse* mob, diff --git a/Minecraft.World/AI/Goals/RunAroundLikeCrazyGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/RunAroundLikeCrazyGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/RunAroundLikeCrazyGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/RunAroundLikeCrazyGoal.h diff --git a/Minecraft.World/AI/Goals/SitGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/SitGoal.cpp similarity index 74% rename from Minecraft.World/AI/Goals/SitGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/SitGoal.cpp index 16c31c420..240a90941 100644 --- a/Minecraft.World/AI/Goals/SitGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/SitGoal.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "net.minecraft.world.entity.ai.goal.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../net.minecraft.world.entity.h" +#include "../../animal/net.minecraft.world.entity.animal.h" #include "SitGoal.h" SitGoal::SitGoal(TamableAnimal* mob) { diff --git a/Minecraft.World/AI/Goals/SitGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/SitGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/SitGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/SitGoal.h diff --git a/Minecraft.World/AI/Goals/SwellGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/SwellGoal.cpp similarity index 76% rename from Minecraft.World/AI/Goals/SwellGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/SwellGoal.cpp index 37b0b3011..63edc3a94 100644 --- a/Minecraft.World/AI/Goals/SwellGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/SwellGoal.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.sensing.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../sensing/net.minecraft.world.entity.ai.sensing.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../monster/net.minecraft.world.entity.monster.h" #include "SwellGoal.h" SwellGoal::SwellGoal(Creeper* creeper) { diff --git a/Minecraft.World/AI/Goals/SwellGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/SwellGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/SwellGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/SwellGoal.h diff --git a/Minecraft.World/AI/Goals/TakeFlowerGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/TakeFlowerGoal.cpp similarity index 81% rename from Minecraft.World/AI/Goals/TakeFlowerGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/TakeFlowerGoal.cpp index 8d9b547aa..f7690651a 100644 --- a/Minecraft.World/AI/Goals/TakeFlowerGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/TakeFlowerGoal.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.npc.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "net.minecraft.world.entity.ai.goal.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../npc/net.minecraft.world.entity.npc.h" +#include "../../animal/net.minecraft.world.entity.animal.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "TakeFlowerGoal.h" TakeFlowerGoal::TakeFlowerGoal(Villager* villager) { diff --git a/Minecraft.World/AI/Goals/TakeFlowerGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/TakeFlowerGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/TakeFlowerGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/TakeFlowerGoal.h diff --git a/Minecraft.World/AI/Goals/TemptGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/TemptGoal.cpp similarity index 88% rename from Minecraft.World/AI/Goals/TemptGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/TemptGoal.cpp index 679924d6b..0a0cd5bc5 100644 --- a/Minecraft.World/AI/Goals/TemptGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/TemptGoal.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../player/net.minecraft.world.entity.player.h" +#include "../../net.minecraft.world.entity.h" +#include "../../../level/net.minecraft.world.level.h" #include "TemptGoal.h" TemptGoal::TemptGoal(PathfinderMob* mob, double speedModifier, int itemId, diff --git a/Minecraft.World/AI/Goals/TemptGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/TemptGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/TemptGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/TemptGoal.h diff --git a/Minecraft.World/AI/Goals/TradeWithPlayerGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/TradeWithPlayerGoal.cpp similarity index 76% rename from Minecraft.World/AI/Goals/TradeWithPlayerGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/TradeWithPlayerGoal.cpp index 7de227116..a0b44fd5a 100644 --- a/Minecraft.World/AI/Goals/TradeWithPlayerGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/TradeWithPlayerGoal.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.npc.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.inventory.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../npc/net.minecraft.world.entity.npc.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../../inventory/net.minecraft.world.inventory.h" #include "TradeWithPlayerGoal.h" TradeWithPlayerGoal::TradeWithPlayerGoal(Villager* mob) { diff --git a/Minecraft.World/AI/Goals/TradeWithPlayerGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/TradeWithPlayerGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/TradeWithPlayerGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/TradeWithPlayerGoal.h diff --git a/Minecraft.World/net/minecraft/world/entity/ai/goal/net.minecraft.world.entity.ai.goal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/net.minecraft.world.entity.ai.goal.h new file mode 100644 index 000000000..73273e13b --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/net.minecraft.world.entity.ai.goal.h @@ -0,0 +1,42 @@ +#pragma once + +#include "Goal.h" +#include "AvoidPlayerGoal.h" +#include "BegGoal.h" +#include "BreakDoorGoal.h" +#include "BreedGoal.h" +#include "ControlledByPlayerGoal.h" +#include "DoorInteractGoal.h" +#include "EatTileGoal.h" +#include "FleeSunGoal.h" +#include "FollowOwnerGoal.h" +#include "FollowParentGoal.h" +#include "FloatGoal.h" +#include "GoalSelector.h" +#include "InteractGoal.h" +#include "LeapAtTargetGoal.h" +#include "LookAtPlayerGoal.h" +#include "LookAtTradingPlayerGoal.h" +#include "MakeLoveGoal.h" +#include "MeleeAttackGoal.h" +#include "MoveIndoorsGoal.h" +#include "MoveThroughVillageGoal.h" +#include "MoveTowardsRestrictionGoal.h" +#include "MoveTowardsTargetGoal.h" +#include "OcelotSitOnTileGoal.h" +#include "OfferFlowerGoal.h" +#include "OpenDoorGoal.h" +#include "OcelotAttackGoal.h" +#include "PanicGoal.h" +#include "PlayGoal.h" +#include "RandomLookAroundGoal.h" +#include "RandomStrollGoal.h" +#include "RangedAttackGoal.h" +#include "RestrictOpenDoorGoal.h" +#include "RestrictSunGoal.h" +#include "RunAroundLikeCrazyGoal.h" +#include "SitGoal.h" +#include "SwellGoal.h" +#include "TakeFlowerGoal.h" +#include "TemptGoal.h" +#include "TradeWithPlayerGoal.h" \ No newline at end of file diff --git a/Minecraft.World/AI/Goals/DefendVillageTargetGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/DefendVillageTargetGoal.cpp similarity index 86% rename from Minecraft.World/AI/Goals/DefendVillageTargetGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/target/DefendVillageTargetGoal.cpp index 09de68a5a..33de3fa47 100644 --- a/Minecraft.World/AI/Goals/DefendVillageTargetGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/DefendVillageTargetGoal.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.village.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" +#include "../../../../../../../Header Files/stdafx.h" +#include "../../village/net.minecraft.world.entity.ai.village.h" +#include "../../../animal/net.minecraft.world.entity.animal.h" #include "DefendVillageTargetGoal.h" DefendVillageTargetGoal::DefendVillageTargetGoal(VillagerGolem* golem) diff --git a/Minecraft.World/AI/Goals/DefendVillageTargetGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/DefendVillageTargetGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/DefendVillageTargetGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/target/DefendVillageTargetGoal.h diff --git a/Minecraft.World/AI/Goals/HurtByTargetGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/HurtByTargetGoal.cpp similarity index 86% rename from Minecraft.World/AI/Goals/HurtByTargetGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/target/HurtByTargetGoal.cpp index ec922cd28..c192c6e8e 100644 --- a/Minecraft.World/AI/Goals/HurtByTargetGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/HurtByTargetGoal.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../../../Header Files/stdafx.h" +#include "../../../net.minecraft.world.entity.h" +#include "../../../../phys/net.minecraft.world.phys.h" +#include "../../../../level/net.minecraft.world.level.h" #include "HurtByTargetGoal.h" HurtByTargetGoal::HurtByTargetGoal(PathfinderMob* mob, bool alertSameType) diff --git a/Minecraft.World/AI/Goals/HurtByTargetGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/HurtByTargetGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/HurtByTargetGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/target/HurtByTargetGoal.h diff --git a/Minecraft.World/AI/Goals/NearestAttackableTargetGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/NearestAttackableTargetGoal.cpp similarity index 92% rename from Minecraft.World/AI/Goals/NearestAttackableTargetGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/target/NearestAttackableTargetGoal.cpp index 975ec5c46..f65903466 100644 --- a/Minecraft.World/AI/Goals/NearestAttackableTargetGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/NearestAttackableTargetGoal.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../../Header Files/stdafx.h" +#include "../../../net.minecraft.world.entity.h" +#include "../../../../level/net.minecraft.world.level.h" +#include "../../../../phys/net.minecraft.world.phys.h" #include "NearestAttackableTargetGoal.h" SubselectEntitySelector::SubselectEntitySelector( diff --git a/Minecraft.World/AI/Goals/NearestAttackableTargetGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/NearestAttackableTargetGoal.h similarity index 96% rename from Minecraft.World/AI/Goals/NearestAttackableTargetGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/target/NearestAttackableTargetGoal.h index cb023afcb..be6b1b0ee 100644 --- a/Minecraft.World/AI/Goals/NearestAttackableTargetGoal.h +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/NearestAttackableTargetGoal.h @@ -1,7 +1,7 @@ #pragma once #include "TargetGoal.h" -#include "../../Entities/EntitySelector.h" +#include "../../../EntitySelector.h" class NearestAttackableTargetGoal; diff --git a/Minecraft.World/AI/Goals/NonTameRandomTargetGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/NonTameRandomTargetGoal.cpp similarity index 77% rename from Minecraft.World/AI/Goals/NonTameRandomTargetGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/target/NonTameRandomTargetGoal.cpp index 7e65d559c..7571df9ee 100644 --- a/Minecraft.World/AI/Goals/NonTameRandomTargetGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/NonTameRandomTargetGoal.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" +#include "../../../../../../../Header Files/stdafx.h" +#include "../../../animal/net.minecraft.world.entity.animal.h" #include "NonTameRandomTargetGoal.h" NonTameRandomTargetGoal::NonTameRandomTargetGoal( diff --git a/Minecraft.World/AI/Goals/NonTameRandomTargetGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/NonTameRandomTargetGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/NonTameRandomTargetGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/target/NonTameRandomTargetGoal.h diff --git a/Minecraft.World/AI/Goals/OwnerHurtByTargetGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/OwnerHurtByTargetGoal.cpp similarity index 87% rename from Minecraft.World/AI/Goals/OwnerHurtByTargetGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/target/OwnerHurtByTargetGoal.cpp index d23375fb2..9ed01290a 100644 --- a/Minecraft.World/AI/Goals/OwnerHurtByTargetGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/OwnerHurtByTargetGoal.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" +#include "../../../../../../../Header Files/stdafx.h" +#include "../../../net.minecraft.world.entity.h" +#include "../../../animal/net.minecraft.world.entity.animal.h" #include "OwnerHurtByTargetGoal.h" OwnerHurtByTargetGoal::OwnerHurtByTargetGoal(TamableAnimal* tameAnimal) diff --git a/Minecraft.World/AI/Goals/OwnerHurtByTargetGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/OwnerHurtByTargetGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/OwnerHurtByTargetGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/target/OwnerHurtByTargetGoal.h diff --git a/Minecraft.World/AI/Goals/OwnerHurtTargetGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/OwnerHurtTargetGoal.cpp similarity index 86% rename from Minecraft.World/AI/Goals/OwnerHurtTargetGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/target/OwnerHurtTargetGoal.cpp index 10b0a040f..4cff6e933 100644 --- a/Minecraft.World/AI/Goals/OwnerHurtTargetGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/OwnerHurtTargetGoal.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" +#include "../../../../../../../Header Files/stdafx.h" +#include "../../../net.minecraft.world.entity.h" +#include "../../../animal/net.minecraft.world.entity.animal.h" #include "OwnerHurtTargetGoal.h" OwnerHurtTargetGoal::OwnerHurtTargetGoal(TamableAnimal* tameAnimal) diff --git a/Minecraft.World/AI/Goals/OwnerHurtTargetGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/OwnerHurtTargetGoal.h similarity index 100% rename from Minecraft.World/AI/Goals/OwnerHurtTargetGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/target/OwnerHurtTargetGoal.h diff --git a/Minecraft.World/AI/Goals/TargetGoal.cpp b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/TargetGoal.cpp similarity index 84% rename from Minecraft.World/AI/Goals/TargetGoal.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/goal/target/TargetGoal.cpp index 1c37f6050..7b98248fd 100644 --- a/Minecraft.World/AI/Goals/TargetGoal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/TargetGoal.cpp @@ -1,13 +1,13 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.ai.sensing.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.level.pathfinder.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../../Header Files/stdafx.h" +#include "../../../net.minecraft.world.entity.h" +#include "../../attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../../navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../sensing/net.minecraft.world.entity.ai.sensing.h" +#include "../../../animal/net.minecraft.world.entity.animal.h" +#include "../../../monster/net.minecraft.world.entity.monster.h" +#include "../../../player/net.minecraft.world.entity.player.h" +#include "../../../../level/pathfinder/net.minecraft.world.level.pathfinder.h" +#include "../../../../phys/net.minecraft.world.phys.h" #include "TargetGoal.h" void TargetGoal::_init(PathfinderMob* mob, bool mustSee, bool mustReach) { diff --git a/Minecraft.World/AI/Goals/TargetGoal.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/TargetGoal.h similarity index 98% rename from Minecraft.World/AI/Goals/TargetGoal.h rename to Minecraft.World/net/minecraft/world/entity/ai/goal/target/TargetGoal.h index 3039172d7..d4957909b 100644 --- a/Minecraft.World/AI/Goals/TargetGoal.h +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/TargetGoal.h @@ -1,6 +1,6 @@ #pragma once -#include "Goal.h" +#include "../Goal.h" class PathfinderMob; diff --git a/Minecraft.World/net/minecraft/world/entity/ai/goal/target/net.minecraft.world.entity.ai.goal.target.h b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/net.minecraft.world.entity.ai.goal.target.h new file mode 100644 index 000000000..98b96a16a --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/ai/goal/target/net.minecraft.world.entity.ai.goal.target.h @@ -0,0 +1,9 @@ +#pragma once + +#include "TargetGoal.h" +#include "DefendVillageTargetGoal.h" +#include "HurtByTargetGoal.h" +#include "NearestAttackableTargetGoal.h" +#include "NonTameRandomTargetGoal.h" +#include "OwnerHurtByTargetGoal.h" +#include "OwnerHurtTargetGoal.h" \ No newline at end of file diff --git a/Minecraft.World/AI/Navigation/PathNavigation.cpp b/Minecraft.World/net/minecraft/world/entity/ai/navigation/PathNavigation.cpp similarity index 94% rename from Minecraft.World/AI/Navigation/PathNavigation.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/navigation/PathNavigation.cpp index 35da31448..392b04618 100644 --- a/Minecraft.World/AI/Navigation/PathNavigation.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/navigation/PathNavigation.cpp @@ -1,13 +1,13 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.pathfinder.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../level/pathfinder/net.minecraft.world.level.pathfinder.h" +#include "../../net.minecraft.world.entity.h" +#include "../attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../control/net.minecraft.world.entity.ai.control.h" +#include "../../monster/net.minecraft.world.entity.monster.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../level/tile/net.minecraft.world.level.tile.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "PathNavigation.h" PathNavigation::PathNavigation(Mob* mob, Level* level) { diff --git a/Minecraft.World/AI/Navigation/PathNavigation.h b/Minecraft.World/net/minecraft/world/entity/ai/navigation/PathNavigation.h similarity index 100% rename from Minecraft.World/AI/Navigation/PathNavigation.h rename to Minecraft.World/net/minecraft/world/entity/ai/navigation/PathNavigation.h diff --git a/Minecraft.World/net/minecraft/world/entity/ai/navigation/net.minecraft.world.entity.ai.navigation.h b/Minecraft.World/net/minecraft/world/entity/ai/navigation/net.minecraft.world.entity.ai.navigation.h new file mode 100644 index 000000000..ca7e39ff7 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/ai/navigation/net.minecraft.world.entity.ai.navigation.h @@ -0,0 +1,3 @@ +#pragma once + +#include "PathNavigation.h" \ No newline at end of file diff --git a/Minecraft.World/AI/Control/Sensing.cpp b/Minecraft.World/net/minecraft/world/entity/ai/sensing/Sensing.cpp similarity index 89% rename from Minecraft.World/AI/Control/Sensing.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/sensing/Sensing.cpp index 6802f15e6..b81f73fc9 100644 --- a/Minecraft.World/AI/Control/Sensing.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/sensing/Sensing.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.entity.h" #include "Sensing.h" Sensing::Sensing(Mob* mob) { this->mob = mob; } diff --git a/Minecraft.World/AI/Control/Sensing.h b/Minecraft.World/net/minecraft/world/entity/ai/sensing/Sensing.h similarity index 100% rename from Minecraft.World/AI/Control/Sensing.h rename to Minecraft.World/net/minecraft/world/entity/ai/sensing/Sensing.h diff --git a/Minecraft.World/net/minecraft/world/entity/ai/sensing/net.minecraft.world.entity.ai.sensing.h b/Minecraft.World/net/minecraft/world/entity/ai/sensing/net.minecraft.world.entity.ai.sensing.h new file mode 100644 index 000000000..20410c95b --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/ai/sensing/net.minecraft.world.entity.ai.sensing.h @@ -0,0 +1,3 @@ +#pragma once + +#include "Sensing.h" \ No newline at end of file diff --git a/Minecraft.World/AI/Navigation/RandomPos.cpp b/Minecraft.World/net/minecraft/world/entity/ai/util/RandomPos.cpp similarity index 95% rename from Minecraft.World/AI/Navigation/RandomPos.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/util/RandomPos.cpp index 3b9528e17..a6476c848 100644 --- a/Minecraft.World/AI/Navigation/RandomPos.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/util/RandomPos.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.entity.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "RandomPos.h" #include diff --git a/Minecraft.World/AI/Navigation/RandomPos.h b/Minecraft.World/net/minecraft/world/entity/ai/util/RandomPos.h similarity index 100% rename from Minecraft.World/AI/Navigation/RandomPos.h rename to Minecraft.World/net/minecraft/world/entity/ai/util/RandomPos.h diff --git a/Minecraft.World/net/minecraft/world/entity/ai/util/net.minecraft.world.entity.ai.util.h b/Minecraft.World/net/minecraft/world/entity/ai/util/net.minecraft.world.entity.ai.util.h new file mode 100644 index 000000000..de67b5be9 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/ai/util/net.minecraft.world.entity.ai.util.h @@ -0,0 +1,3 @@ +#pragma once + +#include "RandomPos.h" \ No newline at end of file diff --git a/Minecraft.World/Entities/DoorInfo.cpp b/Minecraft.World/net/minecraft/world/entity/ai/village/DoorInfo.cpp similarity index 95% rename from Minecraft.World/Entities/DoorInfo.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/village/DoorInfo.cpp index f1c06debf..26d74bf42 100644 --- a/Minecraft.World/Entities/DoorInfo.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/village/DoorInfo.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "DoorInfo.h" diff --git a/Minecraft.World/Entities/DoorInfo.h b/Minecraft.World/net/minecraft/world/entity/ai/village/DoorInfo.h similarity index 100% rename from Minecraft.World/Entities/DoorInfo.h rename to Minecraft.World/net/minecraft/world/entity/ai/village/DoorInfo.h diff --git a/Minecraft.World/WorldGen/Structures/Village.cpp b/Minecraft.World/net/minecraft/world/entity/ai/village/Village.cpp similarity index 97% rename from Minecraft.World/WorldGen/Structures/Village.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/village/Village.cpp index aa6ae7c19..b76565684 100644 --- a/Minecraft.World/WorldGen/Structures/Village.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/village/Village.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.village.h" -#include "../../Headers/net.minecraft.world.entity.npc.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.entity.ai.village.h" +#include "../../npc/net.minecraft.world.entity.npc.h" +#include "../../animal/net.minecraft.world.entity.animal.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../level/tile/net.minecraft.world.level.tile.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "Village.h" #include #include diff --git a/Minecraft.World/WorldGen/Structures/Village.h b/Minecraft.World/net/minecraft/world/entity/ai/village/Village.h similarity index 100% rename from Minecraft.World/WorldGen/Structures/Village.h rename to Minecraft.World/net/minecraft/world/entity/ai/village/Village.h diff --git a/Minecraft.World/Level/Events/VillageSiege.cpp b/Minecraft.World/net/minecraft/world/entity/ai/village/VillageSiege.cpp similarity index 94% rename from Minecraft.World/Level/Events/VillageSiege.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/village/VillageSiege.cpp index 509cc306a..6c97d2d40 100644 --- a/Minecraft.World/Level/Events/VillageSiege.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/village/VillageSiege.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.village.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.entity.ai.village.h" +#include "../../net.minecraft.world.entity.h" +#include "../../monster/net.minecraft.world.entity.monster.h" +#include "../../../level/net.minecraft.world.level.h" #include "VillageSiege.h" #include diff --git a/Minecraft.World/Level/Events/VillageSiege.h b/Minecraft.World/net/minecraft/world/entity/ai/village/VillageSiege.h similarity index 100% rename from Minecraft.World/Level/Events/VillageSiege.h rename to Minecraft.World/net/minecraft/world/entity/ai/village/VillageSiege.h diff --git a/Minecraft.World/WorldGen/Structures/Villages.cpp b/Minecraft.World/net/minecraft/world/entity/ai/village/Villages.cpp similarity index 96% rename from Minecraft.World/WorldGen/Structures/Villages.cpp rename to Minecraft.World/net/minecraft/world/entity/ai/village/Villages.cpp index dc964b5b8..06a7a4fd6 100644 --- a/Minecraft.World/WorldGen/Structures/Villages.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ai/village/Villages.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.village.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.entity.ai.village.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../level/tile/net.minecraft.world.level.tile.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "Villages.h" #include diff --git a/Minecraft.World/WorldGen/Structures/Villages.h b/Minecraft.World/net/minecraft/world/entity/ai/village/Villages.h similarity index 95% rename from Minecraft.World/WorldGen/Structures/Villages.h rename to Minecraft.World/net/minecraft/world/entity/ai/village/Villages.h index 9c8cd5590..44197ea0e 100644 --- a/Minecraft.World/WorldGen/Structures/Villages.h +++ b/Minecraft.World/net/minecraft/world/entity/ai/village/Villages.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Level/Storage/SavedData.h" +#include "../../../level/saveddata/SavedData.h" class Villages : public SavedData { public: diff --git a/Minecraft.World/net/minecraft/world/entity/ai/village/net.minecraft.world.entity.ai.village.h b/Minecraft.World/net/minecraft/world/entity/ai/village/net.minecraft.world.entity.ai.village.h new file mode 100644 index 000000000..7aeb2d82e --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/ai/village/net.minecraft.world.entity.ai.village.h @@ -0,0 +1,6 @@ +#pragma once + +#include "DoorInfo.h" +#include "Village.h" +#include "Villages.h" +#include "VillageSiege.h" \ No newline at end of file diff --git a/Minecraft.World/Entities/Mobs/AmbientCreature.cpp b/Minecraft.World/net/minecraft/world/entity/ambient/AmbientCreature.cpp similarity index 83% rename from Minecraft.World/Entities/Mobs/AmbientCreature.cpp rename to Minecraft.World/net/minecraft/world/entity/ambient/AmbientCreature.cpp index 6022dd7db..58867f25a 100644 --- a/Minecraft.World/Entities/Mobs/AmbientCreature.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ambient/AmbientCreature.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "AmbientCreature.h" diff --git a/Minecraft.World/Entities/Mobs/AmbientCreature.h b/Minecraft.World/net/minecraft/world/entity/ambient/AmbientCreature.h similarity index 90% rename from Minecraft.World/Entities/Mobs/AmbientCreature.h rename to Minecraft.World/net/minecraft/world/entity/ambient/AmbientCreature.h index 59e059841..05e2b6a22 100644 --- a/Minecraft.World/Entities/Mobs/AmbientCreature.h +++ b/Minecraft.World/net/minecraft/world/entity/ambient/AmbientCreature.h @@ -1,7 +1,7 @@ #pragma once #include "../Mob.h" -#include "Creature.h" +#include "../Creature.h" class AmbientCreature : public Mob, public Creature { public: diff --git a/Minecraft.World/Entities/Mobs/Bat.cpp b/Minecraft.World/net/minecraft/world/entity/ambient/Bat.cpp similarity index 93% rename from Minecraft.World/Entities/Mobs/Bat.cpp rename to Minecraft.World/net/minecraft/world/entity/ambient/Bat.cpp index 3a9e61d42..eb7380a65 100644 --- a/Minecraft.World/Entities/Mobs/Bat.cpp +++ b/Minecraft.World/net/minecraft/world/entity/ambient/Bat.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.entity.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../monster/net.minecraft.world.entity.monster.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" #include "Bat.h" Bat::Bat(Level* level) : AmbientCreature(level) { diff --git a/Minecraft.World/Entities/Mobs/Bat.h b/Minecraft.World/net/minecraft/world/entity/ambient/Bat.h similarity index 100% rename from Minecraft.World/Entities/Mobs/Bat.h rename to Minecraft.World/net/minecraft/world/entity/ambient/Bat.h diff --git a/Minecraft.World/net/minecraft/world/entity/ambient/net.minecraft.world.entity.ambient.h b/Minecraft.World/net/minecraft/world/entity/ambient/net.minecraft.world.entity.ambient.h new file mode 100644 index 000000000..924d413a6 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/ambient/net.minecraft.world.entity.ambient.h @@ -0,0 +1,4 @@ +#pragma once + +#include "AmbientCreature.h" +#include "Bat.h" \ No newline at end of file diff --git a/Minecraft.World/Entities/Mobs/Animal.cpp b/Minecraft.World/net/minecraft/world/entity/animal/Animal.cpp similarity index 95% rename from Minecraft.World/Entities/Mobs/Animal.cpp rename to Minecraft.World/net/minecraft/world/entity/animal/Animal.cpp index 7fbc4b9c2..f231891d5 100644 --- a/Minecraft.World/Entities/Mobs/Animal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/animal/Animal.cpp @@ -1,18 +1,18 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.storage.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.projectile.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Util/Random.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/storage/net.minecraft.world.level.storage.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../net.minecraft.world.entity.h" +#include "../projectile/net.minecraft.world.entity.projectile.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../monster/net.minecraft.world.entity.monster.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../../../../../ConsoleJavaLibs/Random.h" #include "Animal.h" Animal::Animal(Level* level) : AgableMob(level) { diff --git a/Minecraft.World/Entities/Mobs/Animal.h b/Minecraft.World/net/minecraft/world/entity/animal/Animal.h similarity index 98% rename from Minecraft.World/Entities/Mobs/Animal.h rename to Minecraft.World/net/minecraft/world/entity/animal/Animal.h index f7882212e..05fa94eea 100644 --- a/Minecraft.World/Entities/Mobs/Animal.h +++ b/Minecraft.World/net/minecraft/world/entity/animal/Animal.h @@ -1,6 +1,6 @@ #pragma once -#include "AgeableMob.h" -#include "Creature.h" +#include "../AgeableMob.h" +#include "../Creature.h" class Level; class CompoundTag; diff --git a/Minecraft.World/Entities/Mobs/Chicken.cpp b/Minecraft.World/net/minecraft/world/entity/animal/Chicken.cpp similarity index 85% rename from Minecraft.World/Entities/Mobs/Chicken.cpp rename to Minecraft.World/net/minecraft/world/entity/animal/Chicken.cpp index dc8449eb7..b712fdffe 100644 --- a/Minecraft.World/Entities/Mobs/Chicken.cpp +++ b/Minecraft.World/net/minecraft/world/entity/animal/Chicken.cpp @@ -1,15 +1,15 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.item.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../ai/goal/net.minecraft.world.entity.ai.goal.h" +#include "../monster/net.minecraft.world.entity.monster.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../item/net.minecraft.world.item.h" #include "Chicken.h" -#include "../../../Minecraft.Client/Textures/Textures.h" -#include "../../Util/SoundTypes.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" +#include "../../../../../Header Files/SoundTypes.h" #include "../MobCategory.h" void Chicken::_init() { diff --git a/Minecraft.World/Entities/Mobs/Chicken.h b/Minecraft.World/net/minecraft/world/entity/animal/Chicken.h similarity index 100% rename from Minecraft.World/Entities/Mobs/Chicken.h rename to Minecraft.World/net/minecraft/world/entity/animal/Chicken.h diff --git a/Minecraft.World/Entities/Mobs/Cow.cpp b/Minecraft.World/net/minecraft/world/entity/animal/Cow.cpp similarity index 81% rename from Minecraft.World/Entities/Mobs/Cow.cpp rename to Minecraft.World/net/minecraft/world/entity/animal/Cow.cpp index add30a92f..6d9cd75d3 100644 --- a/Minecraft.World/Entities/Mobs/Cow.cpp +++ b/Minecraft.World/net/minecraft/world/entity/animal/Cow.cpp @@ -1,17 +1,17 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.stats.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../ai/navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../ai/goal/net.minecraft.world.entity.ai.goal.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../item/net.minecraft.world.item.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../monster/net.minecraft.world.entity.monster.h" +#include "../../../stats/net.minecraft.stats.h" #include "Cow.h" -#include "../../../Minecraft.Client/Textures/Textures.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" #include "../MobCategory.h" Cow::Cow(Level* level) : Animal(level) { diff --git a/Minecraft.World/Entities/Mobs/Cow.h b/Minecraft.World/net/minecraft/world/entity/animal/Cow.h similarity index 100% rename from Minecraft.World/Entities/Mobs/Cow.h rename to Minecraft.World/net/minecraft/world/entity/animal/Cow.h diff --git a/Minecraft.World/Entities/Mobs/EntityHorse.cpp b/Minecraft.World/net/minecraft/world/entity/animal/EntityHorse.cpp similarity index 97% rename from Minecraft.World/Entities/Mobs/EntityHorse.cpp rename to Minecraft.World/net/minecraft/world/entity/animal/EntityHorse.cpp index 98e01f758..cfb047163 100644 --- a/Minecraft.World/Entities/Mobs/EntityHorse.cpp +++ b/Minecraft.World/net/minecraft/world/entity/animal/EntityHorse.cpp @@ -1,20 +1,20 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.effect.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.inventory.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../../Minecraft.Client/Textures/Textures.h" -#include "../../../Minecraft.Client/Minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.entity.h" +#include "../monster/net.minecraft.world.entity.monster.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../ai/goal/net.minecraft.world.entity.ai.goal.h" +#include "../ai/navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../monster/net.minecraft.world.entity.monster.h" +#include "../../effect/net.minecraft.world.effect.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../inventory/net.minecraft.world.inventory.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" +#include "../../../Minecraft.Client/net/minecraft/client/Minecraft.h" #include "EntityHorse.h" #include diff --git a/Minecraft.World/Entities/Mobs/EntityHorse.h b/Minecraft.World/net/minecraft/world/entity/animal/EntityHorse.h similarity index 98% rename from Minecraft.World/Entities/Mobs/EntityHorse.h rename to Minecraft.World/net/minecraft/world/entity/animal/EntityHorse.h index ccca686a5..1c8466184 100644 --- a/Minecraft.World/Entities/Mobs/EntityHorse.h +++ b/Minecraft.World/net/minecraft/world/entity/animal/EntityHorse.h @@ -1,8 +1,8 @@ #pragma once #include "Animal.h" -#include "../../Headers/net.minecraft.world.ContainerListener.h" -#include "MobGroupData.h" +#include "../../net.minecraft.world.ContainerListener.h" +#include "../MobGroupData.h" #include "../EntitySelector.h" class Attribute; diff --git a/Minecraft.World/Entities/Mobs/Golem.cpp b/Minecraft.World/net/minecraft/world/entity/animal/Golem.cpp similarity index 88% rename from Minecraft.World/Entities/Mobs/Golem.cpp rename to Minecraft.World/net/minecraft/world/entity/animal/Golem.cpp index 92588af4b..78cc50122 100644 --- a/Minecraft.World/Entities/Mobs/Golem.cpp +++ b/Minecraft.World/net/minecraft/world/entity/animal/Golem.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "Golem.h" diff --git a/Minecraft.World/Entities/Mobs/Golem.h b/Minecraft.World/net/minecraft/world/entity/animal/Golem.h similarity index 94% rename from Minecraft.World/Entities/Mobs/Golem.h rename to Minecraft.World/net/minecraft/world/entity/animal/Golem.h index 2ce7eaf77..8ab7d22cf 100644 --- a/Minecraft.World/Entities/Mobs/Golem.h +++ b/Minecraft.World/net/minecraft/world/entity/animal/Golem.h @@ -1,7 +1,7 @@ #pragma once #include "../PathfinderMob.h" -#include "Creature.h" +#include "../Creature.h" class Level; class CompoundTag; diff --git a/Minecraft.World/Entities/Mobs/MushroomCow.cpp b/Minecraft.World/net/minecraft/world/entity/animal/MushroomCow.cpp similarity index 87% rename from Minecraft.World/Entities/Mobs/MushroomCow.cpp rename to Minecraft.World/net/minecraft/world/entity/animal/MushroomCow.cpp index d4b2ab30d..df95a0d0b 100644 --- a/Minecraft.World/Entities/Mobs/MushroomCow.cpp +++ b/Minecraft.World/net/minecraft/world/entity/animal/MushroomCow.cpp @@ -1,13 +1,13 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.item.h" -#include "../../../Minecraft.Client/Textures/Textures.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../item/net.minecraft.world.item.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../item/net.minecraft.world.entity.item.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" #include "MushroomCow.h" #include "../MobCategory.h" -#include "../../Util/AABB.h" +#include "../../phys/AABB.h" MushroomCow::MushroomCow(Level* level) : Cow(level) { // 4J Stu - This function call had to be moved here from the Entity ctor to diff --git a/Minecraft.World/Entities/Mobs/MushroomCow.h b/Minecraft.World/net/minecraft/world/entity/animal/MushroomCow.h similarity index 100% rename from Minecraft.World/Entities/Mobs/MushroomCow.h rename to Minecraft.World/net/minecraft/world/entity/animal/MushroomCow.h diff --git a/Minecraft.World/Entities/Mobs/Ocelot.cpp b/Minecraft.World/net/minecraft/world/entity/animal/Ocelot.cpp similarity index 89% rename from Minecraft.World/Entities/Mobs/Ocelot.cpp rename to Minecraft.World/net/minecraft/world/entity/animal/Ocelot.cpp index 53dfbd5a8..9952b8c20 100644 --- a/Minecraft.World/Entities/Mobs/Ocelot.cpp +++ b/Minecraft.World/net/minecraft/world/entity/animal/Ocelot.cpp @@ -1,23 +1,23 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.target.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../Header Files/stdafx.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../ai/control/net.minecraft.world.entity.ai.control.h" +#include "../ai/goal/target/net.minecraft.world.entity.ai.goal.target.h" +#include "../ai/goal/net.minecraft.world.entity.ai.goal.h" +#include "../ai/navigation/net.minecraft.world.entity.ai.navigation.h" +#include "net.minecraft.world.entity.animal.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../monster/net.minecraft.world.entity.monster.h" +#include "../net.minecraft.world.entity.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../phys/net.minecraft.world.phys.h" #include "../SyncedEntityData.h" -#include "../../Util/StringHelpers.h" -#include "../../../Minecraft.Client/Textures/Textures.h" -#include "../../../Minecraft.Client/Minecraft.h" -#include "../../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../../Stats/GenericStats.h" +#include "../../../../../ConsoleHelpers/StringHelpers.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" +#include "../../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../../../Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../../../stats/GenericStats.h" #include "Ocelot.h" const double Ocelot::SNEAK_SPEED_MOD = 0.6; diff --git a/Minecraft.World/Entities/Mobs/Ocelot.h b/Minecraft.World/net/minecraft/world/entity/animal/Ocelot.h similarity index 100% rename from Minecraft.World/Entities/Mobs/Ocelot.h rename to Minecraft.World/net/minecraft/world/entity/animal/Ocelot.h diff --git a/Minecraft.World/Entities/Mobs/Pig.cpp b/Minecraft.World/net/minecraft/world/entity/animal/Pig.cpp similarity index 83% rename from Minecraft.World/Entities/Mobs/Pig.cpp rename to Minecraft.World/net/minecraft/world/entity/animal/Pig.cpp index 5300ff040..9ba7734b0 100644 --- a/Minecraft.World/Entities/Mobs/Pig.cpp +++ b/Minecraft.World/net/minecraft/world/entity/animal/Pig.cpp @@ -1,20 +1,20 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../Headers/net.minecraft.stats.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.item.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.global.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../../../stats/net.minecraft.stats.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.entity.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../ai/goal/net.minecraft.world.entity.ai.goal.h" +#include "../ai/navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../item/net.minecraft.world.entity.item.h" +#include "../monster/net.minecraft.world.entity.monster.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../global/net.minecraft.world.entity.global.h" #include "Pig.h" -#include "../../../Minecraft.Client/Textures/Textures.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" #include "../MobCategory.h" Pig::Pig(Level* level) : Animal(level) { diff --git a/Minecraft.World/Entities/Mobs/Pig.h b/Minecraft.World/net/minecraft/world/entity/animal/Pig.h similarity index 100% rename from Minecraft.World/Entities/Mobs/Pig.h rename to Minecraft.World/net/minecraft/world/entity/animal/Pig.h diff --git a/Minecraft.World/Entities/Mobs/Sheep.cpp b/Minecraft.World/net/minecraft/world/entity/animal/Sheep.cpp similarity index 89% rename from Minecraft.World/Entities/Mobs/Sheep.cpp rename to Minecraft.World/net/minecraft/world/entity/animal/Sheep.cpp index 75c3216bc..65dd996a7 100644 --- a/Minecraft.World/Entities/Mobs/Sheep.cpp +++ b/Minecraft.World/net/minecraft/world/entity/animal/Sheep.cpp @@ -1,24 +1,24 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.item.crafting.h" -#include "../../Headers/net.minecraft.world.inventory.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.item.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.global.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../item/crafting/net.minecraft.world.item.crafting.h" +#include "../../inventory/net.minecraft.world.inventory.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../ai/goal/net.minecraft.world.entity.ai.goal.h" +#include "../ai/navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../net.minecraft.world.entity.h" +#include "../item/net.minecraft.world.entity.item.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../global/net.minecraft.world.entity.global.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../monster/net.minecraft.world.entity.monster.h" #include "Sheep.h" -#include "../../../Minecraft.Client/Textures/Textures.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" #include "../MobCategory.h" -#include "../../Stats/GenericStats.h" +#include "../../../stats/GenericStats.h" const float Sheep::COLOR[Sheep::COLOR_LENGTH][3] = { {1.0f, 1.0f, 1.0f}, // white diff --git a/Minecraft.World/Entities/Mobs/Sheep.h b/Minecraft.World/net/minecraft/world/entity/animal/Sheep.h similarity index 95% rename from Minecraft.World/Entities/Mobs/Sheep.h rename to Minecraft.World/net/minecraft/world/entity/animal/Sheep.h index a20b50b4a..65a0c325a 100644 --- a/Minecraft.World/Entities/Mobs/Sheep.h +++ b/Minecraft.World/net/minecraft/world/entity/animal/Sheep.h @@ -5,8 +5,8 @@ class EatTileGoal; class CraftingContainer; #include "Animal.h" -#include "../../Util/SharedConstants.h" -#include "../../Containers/AbstractContainerMenu.h" +#include "../../../SharedConstants.h" +#include "../../inventory/AbstractContainerMenu.h" class Sheep : public Animal { private: diff --git a/Minecraft.World/Entities/Mobs/SnowMan.cpp b/Minecraft.World/net/minecraft/world/entity/animal/SnowMan.cpp similarity index 75% rename from Minecraft.World/Entities/Mobs/SnowMan.cpp rename to Minecraft.World/net/minecraft/world/entity/animal/SnowMan.cpp index 3f44296a3..a9a0883b6 100644 --- a/Minecraft.World/Entities/Mobs/SnowMan.cpp +++ b/Minecraft.World/net/minecraft/world/entity/animal/SnowMan.cpp @@ -1,20 +1,20 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.target.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.entity.projectile.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Util/SharedConstants.h" -#include "../../../Minecraft.Client/Textures/Textures.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../level/net.minecraft.world.level.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../ai/goal/net.minecraft.world.entity.ai.goal.h" +#include "../ai/goal/target/net.minecraft.world.entity.ai.goal.target.h" +#include "../ai/navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../monster/net.minecraft.world.entity.monster.h" +#include "../projectile/net.minecraft.world.entity.projectile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../level/biome/net.minecraft.world.level.biome.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../../SharedConstants.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" #include "SnowMan.h" -#include "../../Util/SoundTypes.h" +#include "../../../../../Header Files/SoundTypes.h" SnowMan::SnowMan(Level* level) : Golem(level) { // 4J Stu - This function call had to be moved here from the Entity ctor to diff --git a/Minecraft.World/Entities/Mobs/SnowMan.h b/Minecraft.World/net/minecraft/world/entity/animal/SnowMan.h similarity index 94% rename from Minecraft.World/Entities/Mobs/SnowMan.h rename to Minecraft.World/net/minecraft/world/entity/animal/SnowMan.h index e582307de..8e8a9b83c 100644 --- a/Minecraft.World/Entities/Mobs/SnowMan.h +++ b/Minecraft.World/net/minecraft/world/entity/animal/SnowMan.h @@ -1,7 +1,7 @@ #pragma once #include "Golem.h" -#include "RangedAttackMob.h" +#include "../monster/RangedAttackMob.h" class SnowMan : public Golem, public RangedAttackMob { public: diff --git a/Minecraft.World/Entities/Mobs/Squid.cpp b/Minecraft.World/net/minecraft/world/entity/animal/Squid.cpp similarity index 87% rename from Minecraft.World/Entities/Mobs/Squid.cpp rename to Minecraft.World/net/minecraft/world/entity/animal/Squid.cpp index c04bba6eb..7c9feee8d 100644 --- a/Minecraft.World/Entities/Mobs/Squid.cpp +++ b/Minecraft.World/net/minecraft/world/entity/animal/Squid.cpp @@ -1,15 +1,15 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Util/SharedConstants.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.entity.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../monster/net.minecraft.world.entity.monster.h" +#include "../../../SharedConstants.h" #include "Squid.h" -#include "../../../Minecraft.Client/Textures/Textures.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" void Squid::_init() { xBodyRot = xBodyRotO = 0.0f; diff --git a/Minecraft.World/Entities/Mobs/Squid.h b/Minecraft.World/net/minecraft/world/entity/animal/Squid.h similarity index 97% rename from Minecraft.World/Entities/Mobs/Squid.h rename to Minecraft.World/net/minecraft/world/entity/animal/Squid.h index 84a078e15..cde993ba3 100644 --- a/Minecraft.World/Entities/Mobs/Squid.h +++ b/Minecraft.World/net/minecraft/world/entity/animal/Squid.h @@ -1,6 +1,6 @@ #pragma once -#include "../WaterAnimal.h" +#include "WaterAnimal.h" class Player; diff --git a/Minecraft.World/Entities/Mobs/VillagerGolem.cpp b/Minecraft.World/net/minecraft/world/entity/animal/VillagerGolem.cpp similarity index 87% rename from Minecraft.World/Entities/Mobs/VillagerGolem.cpp rename to Minecraft.World/net/minecraft/world/entity/animal/VillagerGolem.cpp index 9cb942151..2e51fd9a2 100644 --- a/Minecraft.World/Entities/Mobs/VillagerGolem.cpp +++ b/Minecraft.World/net/minecraft/world/entity/animal/VillagerGolem.cpp @@ -1,23 +1,23 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.ai.control.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.target.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.ai.village.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../../Minecraft.Client/Textures/Textures.h" +#include "../../../../../Header Files/stdafx.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../ai/control/net.minecraft.world.entity.ai.control.h" +#include "../ai/goal/net.minecraft.world.entity.ai.goal.h" +#include "../ai/goal/target/net.minecraft.world.entity.ai.goal.target.h" +#include "../ai/navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../ai/village/net.minecraft.world.entity.ai.village.h" +#include "net.minecraft.world.entity.animal.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../monster/net.minecraft.world.entity.monster.h" +#include "../net.minecraft.world.entity.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" #include "../SyncedEntityData.h" #include "VillagerGolem.h" -#include "../../Util/ParticleTypes.h" +#include "../../../../../Header Files/ParticleTypes.h" VillagerGolem::VillagerGolem(Level* level) : Golem(level) { // 4J Stu - This function call had to be moved here from the Entity ctor to diff --git a/Minecraft.World/Entities/Mobs/VillagerGolem.h b/Minecraft.World/net/minecraft/world/entity/animal/VillagerGolem.h similarity index 100% rename from Minecraft.World/Entities/Mobs/VillagerGolem.h rename to Minecraft.World/net/minecraft/world/entity/animal/VillagerGolem.h diff --git a/Minecraft.World/Entities/WaterAnimal.cpp b/Minecraft.World/net/minecraft/world/entity/animal/WaterAnimal.cpp similarity index 76% rename from Minecraft.World/Entities/WaterAnimal.cpp rename to Minecraft.World/net/minecraft/world/entity/animal/WaterAnimal.cpp index 71470f35b..44432db4b 100644 --- a/Minecraft.World/Entities/WaterAnimal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/animal/WaterAnimal.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/com.mojang.nbt.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.damagesource.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" #include "WaterAnimal.h" WaterAnimal::WaterAnimal(Level* level) : PathfinderMob(level) { diff --git a/Minecraft.World/Entities/WaterAnimal.h b/Minecraft.World/net/minecraft/world/entity/animal/WaterAnimal.h similarity index 87% rename from Minecraft.World/Entities/WaterAnimal.h rename to Minecraft.World/net/minecraft/world/entity/animal/WaterAnimal.h index 953966c81..ecf7ba529 100644 --- a/Minecraft.World/Entities/WaterAnimal.h +++ b/Minecraft.World/net/minecraft/world/entity/animal/WaterAnimal.h @@ -1,6 +1,6 @@ #pragma once -#include "PathfinderMob.h" -#include "Mobs/Creature.h" +#include "../PathfinderMob.h" +#include "../Creature.h" class Player; diff --git a/Minecraft.World/Entities/Mobs/Wolf.cpp b/Minecraft.World/net/minecraft/world/entity/animal/Wolf.cpp similarity index 93% rename from Minecraft.World/Entities/Mobs/Wolf.cpp rename to Minecraft.World/net/minecraft/world/entity/animal/Wolf.cpp index 21ff4e4fc..1dbe8eafa 100644 --- a/Minecraft.World/Entities/Mobs/Wolf.cpp +++ b/Minecraft.World/net/minecraft/world/entity/animal/Wolf.cpp @@ -1,25 +1,25 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.target.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.projectile.h" -#include "../../Headers/net.minecraft.world.level.pathfinder.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/net.minecraft.stats.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.animal.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../ai/goal/net.minecraft.world.entity.ai.goal.h" +#include "../ai/goal/target/net.minecraft.world.entity.ai.goal.target.h" +#include "../ai/navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../monster/net.minecraft.world.entity.monster.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../projectile/net.minecraft.world.entity.projectile.h" +#include "../../level/pathfinder/net.minecraft.world.level.pathfinder.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../../stats/net.minecraft.stats.h" #include "Sheep.h" #include "Wolf.h" -#include "../../../Minecraft.Client/Textures/Textures.h" -#include "../../Util/SoundTypes.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" +#include "../../../../../Header Files/SoundTypes.h" Wolf::Wolf(Level* level) : TamableAnimal(level) { // 4J Stu - This function call had to be moved here from the Entity ctor to diff --git a/Minecraft.World/Entities/Mobs/Wolf.h b/Minecraft.World/net/minecraft/world/entity/animal/Wolf.h similarity index 100% rename from Minecraft.World/Entities/Mobs/Wolf.h rename to Minecraft.World/net/minecraft/world/entity/animal/Wolf.h diff --git a/Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h b/Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h new file mode 100644 index 000000000..2bcb81f15 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/animal/net.minecraft.world.entity.animal.h @@ -0,0 +1,22 @@ +#pragma once + +#include "Animal.h" +#include "Chicken.h" +#include "Cow.h" +#include "Pig.h" +#include "Sheep.h" +#include "Squid.h" +#include "WaterAnimal.h" +#include "Wolf.h" + +// 1.0.1 +#include "Golem.h" +#include "MushroomCow.h" +#include "SnowMan.h" + +// 1.2.3 +#include "Ocelot.h" +#include "VillagerGolem.h" + +// 1.6.4 +#include "EntityHorse.h" \ No newline at end of file diff --git a/Minecraft.World/Entities/Mobs/BossMob.h b/Minecraft.World/net/minecraft/world/entity/boss/BossMob.h similarity index 100% rename from Minecraft.World/Entities/Mobs/BossMob.h rename to Minecraft.World/net/minecraft/world/entity/boss/BossMob.h diff --git a/Minecraft.World/Entities/Mobs/MultiEntityMob.h b/Minecraft.World/net/minecraft/world/entity/boss/MultiEntityMob.h similarity index 100% rename from Minecraft.World/Entities/Mobs/MultiEntityMob.h rename to Minecraft.World/net/minecraft/world/entity/boss/MultiEntityMob.h diff --git a/Minecraft.World/Entities/Mobs/MultiEntityMobPart.cpp b/Minecraft.World/net/minecraft/world/entity/boss/MultiEntityMobPart.cpp similarity index 95% rename from Minecraft.World/Entities/Mobs/MultiEntityMobPart.cpp rename to Minecraft.World/net/minecraft/world/entity/boss/MultiEntityMobPart.cpp index 66597d950..d8d7b4b30 100644 --- a/Minecraft.World/Entities/Mobs/MultiEntityMobPart.cpp +++ b/Minecraft.World/net/minecraft/world/entity/boss/MultiEntityMobPart.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "BossMob.h" #include "MultiEntityMob.h" #include "MultiEntityMobPart.h" diff --git a/Minecraft.World/Entities/Mobs/MultiEntityMobPart.h b/Minecraft.World/net/minecraft/world/entity/boss/MultiEntityMobPart.h similarity index 100% rename from Minecraft.World/Entities/Mobs/MultiEntityMobPart.h rename to Minecraft.World/net/minecraft/world/entity/boss/MultiEntityMobPart.h diff --git a/Minecraft.World/Entities/Mobs/EnderCrystal.cpp b/Minecraft.World/net/minecraft/world/entity/boss/enderdragon/EnderCrystal.cpp similarity index 90% rename from Minecraft.World/Entities/Mobs/EnderCrystal.cpp rename to Minecraft.World/net/minecraft/world/entity/boss/enderdragon/EnderCrystal.cpp index 8c7c94c78..133520cf7 100644 --- a/Minecraft.World/Entities/Mobs/EnderCrystal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/boss/enderdragon/EnderCrystal.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.boss.enderdragon.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../level/tile/net.minecraft.world.level.tile.h" +#include "../../net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.boss.enderdragon.h" #include "EnderCrystal.h" -#include "../../Util/DamageSource.h" +#include "../../../damageSource/DamageSource.h" void EnderCrystal::_init(Level* level) { // 4J Stu - This function call had to be moved here from the Entity ctor to diff --git a/Minecraft.World/Entities/Mobs/EnderCrystal.h b/Minecraft.World/net/minecraft/world/entity/boss/enderdragon/EnderCrystal.h similarity index 97% rename from Minecraft.World/Entities/Mobs/EnderCrystal.h rename to Minecraft.World/net/minecraft/world/entity/boss/enderdragon/EnderCrystal.h index 844b08706..fa53aead2 100644 --- a/Minecraft.World/Entities/Mobs/EnderCrystal.h +++ b/Minecraft.World/net/minecraft/world/entity/boss/enderdragon/EnderCrystal.h @@ -1,6 +1,6 @@ #pragma once -#include "../Entity.h" +#include "../../Entity.h" class EnderCrystal : public Entity { public: diff --git a/Minecraft.World/Entities/Mobs/EnderDragon.cpp b/Minecraft.World/net/minecraft/world/entity/boss/enderdragon/EnderDragon.cpp similarity index 98% rename from Minecraft.World/Entities/Mobs/EnderDragon.cpp rename to Minecraft.World/net/minecraft/world/entity/boss/enderdragon/EnderDragon.cpp index 2db34b8fc..775306b96 100644 --- a/Minecraft.World/Entities/Mobs/EnderDragon.cpp +++ b/Minecraft.World/net/minecraft/world/entity/boss/enderdragon/EnderDragon.cpp @@ -1,17 +1,17 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.boss.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.entity.projectile.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../../Minecraft.Client/Textures/Textures.h" -#include "../../Headers/net.minecraft.world.entity.boss.enderdragon.h" -#include "../../Headers/net.minecraft.world.level.pathfinder.h" -#include "../../Util/SharedConstants.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../level/tile/net.minecraft.world.level.tile.h" +#include "../../net.minecraft.world.entity.h" +#include "../../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../net.minecraft.world.entity.boss.h" +#include "../../monster/net.minecraft.world.entity.monster.h" +#include "../../projectile/net.minecraft.world.entity.projectile.h" +#include "../../../phys/net.minecraft.world.phys.h" +#include "../../../damageSource/net.minecraft.world.damagesource.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" +#include "net.minecraft.world.entity.boss.enderdragon.h" +#include "../../../level/pathfinder/net.minecraft.world.level.pathfinder.h" +#include "../../../../SharedConstants.h" #include "EnderDragon.h" #include #include diff --git a/Minecraft.World/Entities/Mobs/EnderDragon.h b/Minecraft.World/net/minecraft/world/entity/boss/enderdragon/EnderDragon.h similarity index 98% rename from Minecraft.World/Entities/Mobs/EnderDragon.h rename to Minecraft.World/net/minecraft/world/entity/boss/enderdragon/EnderDragon.h index 907ffe3fe..62f680cfb 100644 --- a/Minecraft.World/Entities/Mobs/EnderDragon.h +++ b/Minecraft.World/net/minecraft/world/entity/boss/enderdragon/EnderDragon.h @@ -1,7 +1,7 @@ #pragma once -#include "BossMob.h" -#include "MultiEntityMob.h" -#include "../Enemy.h" +#include "../BossMob.h" +#include "../MultiEntityMob.h" +#include "../../monster/Enemy.h" class MultiEntityMobPart; class EnderCrystal; diff --git a/Minecraft.World/net/minecraft/world/entity/boss/enderdragon/net.minecraft.world.entity.boss.enderdragon.h b/Minecraft.World/net/minecraft/world/entity/boss/enderdragon/net.minecraft.world.entity.boss.enderdragon.h new file mode 100644 index 000000000..defde300e --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/boss/enderdragon/net.minecraft.world.entity.boss.enderdragon.h @@ -0,0 +1,5 @@ +#pragma once + +#include "EnderCrystal.h" +#include "EnderDragon.h" +#include "../../../level/levelgen/feature/NetherSphereFeature.h" \ No newline at end of file diff --git a/Minecraft.World/net/minecraft/world/entity/boss/net.minecraft.world.entity.boss.h b/Minecraft.World/net/minecraft/world/entity/boss/net.minecraft.world.entity.boss.h new file mode 100644 index 000000000..764092017 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/boss/net.minecraft.world.entity.boss.h @@ -0,0 +1,5 @@ +#pragma once + +#include "BossMob.h" +#include "MultiEntityMob.h" +#include "MultiEntityMobPart.h" diff --git a/Minecraft.World/Entities/Mobs/WitherBoss.cpp b/Minecraft.World/net/minecraft/world/entity/boss/wither/WitherBoss.cpp similarity index 94% rename from Minecraft.World/Entities/Mobs/WitherBoss.cpp rename to Minecraft.World/net/minecraft/world/entity/boss/wither/WitherBoss.cpp index 01822a75a..0760d39f6 100644 --- a/Minecraft.World/Entities/Mobs/WitherBoss.cpp +++ b/Minecraft.World/net/minecraft/world/entity/boss/wither/WitherBoss.cpp @@ -1,20 +1,20 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.target.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.entity.projectile.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Util/Mth.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../net.minecraft.world.h" +#include "../../../damageSource/net.minecraft.world.damagesource.h" +#include "../../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../../ai/goal/net.minecraft.world.entity.ai.goal.h" +#include "../../ai/goal/target/net.minecraft.world.entity.ai.goal.target.h" +#include "../../ai/navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../../monster/net.minecraft.world.entity.monster.h" +#include "../../projectile/net.minecraft.world.entity.projectile.h" +#include "../../net.minecraft.world.entity.h" +#include "../../../item/net.minecraft.world.item.h" +#include "../../../level/net.minecraft.world.level.h" +#include "../../../level/tile/net.minecraft.world.level.tile.h" +#include "../../../phys/net.minecraft.world.phys.h" +#include "../../../../util/Mth.h" -#include "../../Util/SoundTypes.h" +#include "../../../../../../Header Files/SoundTypes.h" #include "WitherBoss.h" diff --git a/Minecraft.World/Entities/Mobs/WitherBoss.h b/Minecraft.World/net/minecraft/world/entity/boss/wither/WitherBoss.h similarity index 96% rename from Minecraft.World/Entities/Mobs/WitherBoss.h rename to Minecraft.World/net/minecraft/world/entity/boss/wither/WitherBoss.h index 6fbe7a5ab..d3d45cc8f 100644 --- a/Minecraft.World/Entities/Mobs/WitherBoss.h +++ b/Minecraft.World/net/minecraft/world/entity/boss/wither/WitherBoss.h @@ -1,8 +1,8 @@ #pragma once -#include "../Monster.h" -#include "RangedAttackMob.h" -#include "BossMob.h" +#include "../../monster/Monster.h" +#include "../../monster/RangedAttackMob.h" +#include "../BossMob.h" class LivingEntitySelector : public EntitySelector { public: diff --git a/Minecraft.World/net/minecraft/world/entity/global/GlobalEntity.cpp b/Minecraft.World/net/minecraft/world/entity/global/GlobalEntity.cpp new file mode 100644 index 000000000..66f0556f6 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/global/GlobalEntity.cpp @@ -0,0 +1,2 @@ +#include "../../../../../Header Files/stdafx.h" +#include "GlobalEntity.h" diff --git a/Minecraft.World/Entities/GlobalEntity.h b/Minecraft.World/net/minecraft/world/entity/global/GlobalEntity.h similarity index 87% rename from Minecraft.World/Entities/GlobalEntity.h rename to Minecraft.World/net/minecraft/world/entity/global/GlobalEntity.h index ff9cf7a33..2d9381c00 100644 --- a/Minecraft.World/Entities/GlobalEntity.h +++ b/Minecraft.World/net/minecraft/world/entity/global/GlobalEntity.h @@ -1,5 +1,5 @@ #pragma once -#include "Entity.h" +#include "../Entity.h" class Level; diff --git a/Minecraft.World/Entities/Mobs/LightningBolt.cpp b/Minecraft.World/net/minecraft/world/entity/global/LightningBolt.cpp similarity index 90% rename from Minecraft.World/Entities/Mobs/LightningBolt.cpp rename to Minecraft.World/net/minecraft/world/entity/global/LightningBolt.cpp index 6aa5a5f79..614cf39a2 100644 --- a/Minecraft.World/Entities/Mobs/LightningBolt.cpp +++ b/Minecraft.World/net/minecraft/world/entity/global/LightningBolt.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" #include "LightningBolt.h" -#include "../../Util/SoundTypes.h" -#include "../../../Minecraft.Client/MinecraftServer.h" -#include "../../../Minecraft.Client/Network/PlayerList.h" -#include "../../Headers/net.minecraft.world.level.dimension.h" +#include "../../../../../Header Files/SoundTypes.h" +#include "../../../Minecraft.Client/net/minecraft/server/MinecraftServer.h" +#include "../../../Minecraft.Client/net/minecraft/server/PlayerList.h" +#include "../../level/dimension/net.minecraft.world.level.dimension.h" LightningBolt::LightningBolt(Level* level, double x, double y, double z) : life(0), seed(0), flashes(0), GlobalEntity(level) { diff --git a/Minecraft.World/Entities/Mobs/LightningBolt.h b/Minecraft.World/net/minecraft/world/entity/global/LightningBolt.h similarity index 87% rename from Minecraft.World/Entities/Mobs/LightningBolt.h rename to Minecraft.World/net/minecraft/world/entity/global/LightningBolt.h index fabd93144..47b29be24 100644 --- a/Minecraft.World/Entities/Mobs/LightningBolt.h +++ b/Minecraft.World/net/minecraft/world/entity/global/LightningBolt.h @@ -1,7 +1,7 @@ #pragma once -#include "../GlobalEntity.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "GlobalEntity.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" // class LightningBolt : public GlobalEntity class LightningBolt : public GlobalEntity { diff --git a/Minecraft.World/net/minecraft/world/entity/global/net.minecraft.world.entity.global.h b/Minecraft.World/net/minecraft/world/entity/global/net.minecraft.world.entity.global.h new file mode 100644 index 000000000..51123d90e --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/global/net.minecraft.world.entity.global.h @@ -0,0 +1,4 @@ +#pragma once + +#include "GlobalEntity.h" +#include "LightningBolt.h" \ No newline at end of file diff --git a/Minecraft.World/Entities/Mobs/Boat.cpp b/Minecraft.World/net/minecraft/world/entity/item/Boat.cpp similarity index 95% rename from Minecraft.World/Entities/Mobs/Boat.cpp rename to Minecraft.World/net/minecraft/world/entity/item/Boat.cpp index 7d151c603..260547e33 100644 --- a/Minecraft.World/Entities/Mobs/Boat.cpp +++ b/Minecraft.World/net/minecraft/world/entity/item/Boat.cpp @@ -1,13 +1,13 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.material.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.damagesource.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../net.minecraft.world.entity.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/material/net.minecraft.world.level.material.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" #include "Boat.h" const double Boat::MAX_SPEED = 0.35; diff --git a/Minecraft.World/Entities/Mobs/Boat.h b/Minecraft.World/net/minecraft/world/entity/item/Boat.h similarity index 100% rename from Minecraft.World/Entities/Mobs/Boat.h rename to Minecraft.World/net/minecraft/world/entity/item/Boat.h diff --git a/Minecraft.World/Blocks/FallingTile.cpp b/Minecraft.World/net/minecraft/world/entity/item/FallingTile.cpp similarity index 96% rename from Minecraft.World/Blocks/FallingTile.cpp rename to Minecraft.World/net/minecraft/world/entity/item/FallingTile.cpp index 53d664c58..50f893d53 100644 --- a/Minecraft.World/Blocks/FallingTile.cpp +++ b/Minecraft.World/net/minecraft/world/entity/item/FallingTile.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/com.mojang.nbt.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.entity.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" #include "FallingTile.h" // 4J - added for common ctor code diff --git a/Minecraft.World/Blocks/FallingTile.h b/Minecraft.World/net/minecraft/world/entity/item/FallingTile.h similarity index 97% rename from Minecraft.World/Blocks/FallingTile.h rename to Minecraft.World/net/minecraft/world/entity/item/FallingTile.h index d5528412c..3447d93d0 100644 --- a/Minecraft.World/Blocks/FallingTile.h +++ b/Minecraft.World/net/minecraft/world/entity/item/FallingTile.h @@ -1,5 +1,5 @@ #pragma once -#include "../Entities/Entity.h" +#include "../Entity.h" class Level; diff --git a/Minecraft.World/Entities/ItemEntity.cpp b/Minecraft.World/net/minecraft/world/entity/item/ItemEntity.cpp similarity index 92% rename from Minecraft.World/Entities/ItemEntity.cpp rename to Minecraft.World/net/minecraft/world/entity/item/ItemEntity.cpp index a6627c6cc..2d2faae57 100644 --- a/Minecraft.World/Entities/ItemEntity.cpp +++ b/Minecraft.World/net/minecraft/world/entity/item/ItemEntity.cpp @@ -1,17 +1,17 @@ -#include "../Platform/stdafx.h" -#include "../Util/JavaMath.h" -#include "../Headers/net.minecraft.stats.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.material.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/com.mojang.nbt.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../ConsoleJavaLibs/JavaMath.h" +#include "../../../stats/net.minecraft.stats.h" +#include "../net.minecraft.world.entity.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../item/net.minecraft.world.item.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../../level/material/net.minecraft.world.level.material.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" #include "ItemEntity.h" -#include "../Util/SoundTypes.h" +#include "../../../../../Header Files/SoundTypes.h" void ItemEntity::_init() { age = 0; diff --git a/Minecraft.World/Entities/ItemEntity.h b/Minecraft.World/net/minecraft/world/entity/item/ItemEntity.h similarity index 96% rename from Minecraft.World/Entities/ItemEntity.h rename to Minecraft.World/net/minecraft/world/entity/item/ItemEntity.h index c5e8a3ae4..2ac4c80ea 100644 --- a/Minecraft.World/Entities/ItemEntity.h +++ b/Minecraft.World/net/minecraft/world/entity/item/ItemEntity.h @@ -1,6 +1,6 @@ #pragma once -#include "Entity.h" -#include "../Util/SharedConstants.h" +#include "../Entity.h" +#include "../../../SharedConstants.h" class Player; diff --git a/Minecraft.World/Entities/Mobs/Minecart.cpp b/Minecraft.World/net/minecraft/world/entity/item/Minecart.cpp similarity index 96% rename from Minecraft.World/Entities/Mobs/Minecart.cpp rename to Minecraft.World/net/minecraft/world/entity/item/Minecart.cpp index d66e830e2..2a7684c6f 100644 --- a/Minecraft.World/Entities/Mobs/Minecart.cpp +++ b/Minecraft.World/net/minecraft/world/entity/item/Minecart.cpp @@ -1,21 +1,21 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.dimension.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.item.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../../Minecraft.Client/MinecraftServer.h" -#include "../../../Minecraft.Client/Level/ServerLevel.h" -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../level/dimension/net.minecraft.world.level.dimension.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.item.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../animal/net.minecraft.world.entity.animal.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../../Minecraft.Client/net/minecraft/server/MinecraftServer.h" +#include "../../../Minecraft.Client/net/minecraft/server/level/ServerLevel.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" #include "Minecart.h" #include #include -#include "../../Util/SharedConstants.h" +#include "../../../SharedConstants.h" const int Minecart::EXITS[][2][3] = { // diff --git a/Minecraft.World/Entities/Mobs/Minecart.h b/Minecraft.World/net/minecraft/world/entity/item/Minecart.h similarity index 100% rename from Minecraft.World/Entities/Mobs/Minecart.h rename to Minecraft.World/net/minecraft/world/entity/item/Minecart.h diff --git a/Minecraft.World/Entities/MinecartChest.cpp b/Minecraft.World/net/minecraft/world/entity/item/MinecartChest.cpp similarity index 85% rename from Minecraft.World/Entities/MinecartChest.cpp rename to Minecraft.World/net/minecraft/world/entity/item/MinecartChest.cpp index 8efbf811b..b56e8bad1 100644 --- a/Minecraft.World/Entities/MinecartChest.cpp +++ b/Minecraft.World/net/minecraft/world/entity/item/MinecartChest.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.network.packet.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../../network/packet/net.minecraft.network.packet.h" #include "MinecartChest.h" MinecartChest::MinecartChest(Level* level) : MinecartContainer(level) { diff --git a/Minecraft.World/Entities/MinecartChest.h b/Minecraft.World/net/minecraft/world/entity/item/MinecartChest.h similarity index 100% rename from Minecraft.World/Entities/MinecartChest.h rename to Minecraft.World/net/minecraft/world/entity/item/MinecartChest.h diff --git a/Minecraft.World/Entities/MinecartContainer.cpp b/Minecraft.World/net/minecraft/world/entity/item/MinecartContainer.cpp similarity index 95% rename from Minecraft.World/Entities/MinecartContainer.cpp rename to Minecraft.World/net/minecraft/world/entity/item/MinecartContainer.cpp index 0a1a5f0ab..e38f93e01 100644 --- a/Minecraft.World/Entities/MinecartContainer.cpp +++ b/Minecraft.World/net/minecraft/world/entity/item/MinecartContainer.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.inventory.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.redstone.h" +#include "../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.entity.item.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../inventory/net.minecraft.world.inventory.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/redstone/net.minecraft.world.level.redstone.h" #include "MinecartContainer.h" void MinecartContainer::_init() { diff --git a/Minecraft.World/Entities/MinecartContainer.h b/Minecraft.World/net/minecraft/world/entity/item/MinecartContainer.h similarity index 95% rename from Minecraft.World/Entities/MinecartContainer.h rename to Minecraft.World/net/minecraft/world/entity/item/MinecartContainer.h index 7831cb4c4..88f900304 100644 --- a/Minecraft.World/Entities/MinecartContainer.h +++ b/Minecraft.World/net/minecraft/world/entity/item/MinecartContainer.h @@ -1,7 +1,7 @@ #pragma once -#include "Mobs/Minecart.h" -#include "../Containers/Container.h" +#include "Minecart.h" +#include "../../Container.h" class MinecartContainer : public Minecart, public virtual Container { private: diff --git a/Minecraft.World/Entities/MinecartFurnace.cpp b/Minecraft.World/net/minecraft/world/entity/item/MinecartFurnace.cpp similarity index 90% rename from Minecraft.World/Entities/MinecartFurnace.cpp rename to Minecraft.World/net/minecraft/world/entity/item/MinecartFurnace.cpp index b075af545..fff44c184 100644 --- a/Minecraft.World/Entities/MinecartFurnace.cpp +++ b/Minecraft.World/net/minecraft/world/entity/item/MinecartFurnace.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.network.packet.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../net.minecraft.world.entity.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../../network/packet/net.minecraft.network.packet.h" #include "MinecartFurnace.h" MinecartFurnace::MinecartFurnace(Level* level) : Minecart(level) { diff --git a/Minecraft.World/Entities/MinecartFurnace.h b/Minecraft.World/net/minecraft/world/entity/item/MinecartFurnace.h similarity index 97% rename from Minecraft.World/Entities/MinecartFurnace.h rename to Minecraft.World/net/minecraft/world/entity/item/MinecartFurnace.h index 25e359bbd..a0d3f2742 100644 --- a/Minecraft.World/Entities/MinecartFurnace.h +++ b/Minecraft.World/net/minecraft/world/entity/item/MinecartFurnace.h @@ -1,6 +1,6 @@ #pragma once -#include "Mobs/Minecart.h" +#include "Minecart.h" class MinecartFurnace : public Minecart { public: diff --git a/Minecraft.World/Entities/MinecartHopper.cpp b/Minecraft.World/net/minecraft/world/entity/item/MinecartHopper.cpp similarity index 87% rename from Minecraft.World/Entities/MinecartHopper.cpp rename to Minecraft.World/net/minecraft/world/entity/item/MinecartHopper.cpp index 58ad09612..d642f28e6 100644 --- a/Minecraft.World/Entities/MinecartHopper.cpp +++ b/Minecraft.World/net/minecraft/world/entity/item/MinecartHopper.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.phys.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.entity.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.world.entity.item.h" +#include "../../phys/net.minecraft.world.phys.h" #include "MinecartHopper.h" const int MinecartHopper::MOVE_ITEM_SPEED = diff --git a/Minecraft.World/Entities/MinecartHopper.h b/Minecraft.World/net/minecraft/world/entity/item/MinecartHopper.h similarity index 98% rename from Minecraft.World/Entities/MinecartHopper.h rename to Minecraft.World/net/minecraft/world/entity/item/MinecartHopper.h index 102bb77c8..641672f33 100644 --- a/Minecraft.World/Entities/MinecartHopper.h +++ b/Minecraft.World/net/minecraft/world/entity/item/MinecartHopper.h @@ -1,7 +1,7 @@ #pragma once #include "MinecartContainer.h" -#include "../Blocks/TileEntities/Hopper.h" +#include "../../level/tile/entity/Hopper.h" class MinecartHopper : public MinecartContainer, public Hopper { public: diff --git a/Minecraft.World/Entities/MinecartRideable.cpp b/Minecraft.World/net/minecraft/world/entity/item/MinecartRideable.cpp similarity index 83% rename from Minecraft.World/Entities/MinecartRideable.cpp rename to Minecraft.World/net/minecraft/world/entity/item/MinecartRideable.cpp index 1e04c5f94..273caf3e3 100644 --- a/Minecraft.World/Entities/MinecartRideable.cpp +++ b/Minecraft.World/net/minecraft/world/entity/item/MinecartRideable.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.entity.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../../level/net.minecraft.world.level.h" #include "MinecartRideable.h" MinecartRideable::MinecartRideable(Level* level) : Minecart(level) { diff --git a/Minecraft.World/Entities/MinecartRideable.h b/Minecraft.World/net/minecraft/world/entity/item/MinecartRideable.h similarity index 93% rename from Minecraft.World/Entities/MinecartRideable.h rename to Minecraft.World/net/minecraft/world/entity/item/MinecartRideable.h index 7f2f78a42..2a88df22e 100644 --- a/Minecraft.World/Entities/MinecartRideable.h +++ b/Minecraft.World/net/minecraft/world/entity/item/MinecartRideable.h @@ -1,6 +1,6 @@ #pragma once -#include "Mobs/Minecart.h" +#include "Minecart.h" class MinecartRideable : public Minecart { public: diff --git a/Minecraft.World/Entities/MinecartSpawner.cpp b/Minecraft.World/net/minecraft/world/entity/item/MinecartSpawner.cpp similarity index 92% rename from Minecraft.World/Entities/MinecartSpawner.cpp rename to Minecraft.World/net/minecraft/world/entity/item/MinecartSpawner.cpp index 7b8f4b188..96f040ca4 100644 --- a/Minecraft.World/Entities/MinecartSpawner.cpp +++ b/Minecraft.World/net/minecraft/world/entity/item/MinecartSpawner.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" #include "MinecartSpawner.h" MinecartSpawner::MinecartMobSpawner::MinecartMobSpawner( diff --git a/Minecraft.World/Entities/MinecartSpawner.h b/Minecraft.World/net/minecraft/world/entity/item/MinecartSpawner.h similarity index 94% rename from Minecraft.World/Entities/MinecartSpawner.h rename to Minecraft.World/net/minecraft/world/entity/item/MinecartSpawner.h index 34f9a5573..74ffbf86c 100644 --- a/Minecraft.World/Entities/MinecartSpawner.h +++ b/Minecraft.World/net/minecraft/world/entity/item/MinecartSpawner.h @@ -1,7 +1,7 @@ #pragma once -#include "Mobs/Minecart.h" -#include "../Level/BaseMobSpawner.h" +#include "Minecart.h" +#include "../../level/BaseMobSpawner.h" class MinecartSpawner : public Minecart { public: diff --git a/Minecraft.World/Entities/MinecartTNT.cpp b/Minecraft.World/net/minecraft/world/entity/item/MinecartTNT.cpp similarity index 94% rename from Minecraft.World/Entities/MinecartTNT.cpp rename to Minecraft.World/net/minecraft/world/entity/item/MinecartTNT.cpp index 32239b129..97ee6a9b4 100644 --- a/Minecraft.World/Entities/MinecartTNT.cpp +++ b/Minecraft.World/net/minecraft/world/entity/item/MinecartTNT.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" #include "MinecartTNT.h" void MinecartTNT::_init() { diff --git a/Minecraft.World/Entities/MinecartTNT.h b/Minecraft.World/net/minecraft/world/entity/item/MinecartTNT.h similarity index 97% rename from Minecraft.World/Entities/MinecartTNT.h rename to Minecraft.World/net/minecraft/world/entity/item/MinecartTNT.h index 80a51ccbc..4b9d8f507 100644 --- a/Minecraft.World/Entities/MinecartTNT.h +++ b/Minecraft.World/net/minecraft/world/entity/item/MinecartTNT.h @@ -1,6 +1,6 @@ #pragma once -#include "Mobs/Minecart.h" +#include "Minecart.h" class MinecartTNT : public Minecart { public: diff --git a/Minecraft.World/Entities/Mobs/PrimedTnt.cpp b/Minecraft.World/net/minecraft/world/entity/item/PrimedTnt.cpp similarity index 90% rename from Minecraft.World/Entities/Mobs/PrimedTnt.cpp rename to Minecraft.World/net/minecraft/world/entity/item/PrimedTnt.cpp index 8fd49dce9..97d337b41 100644 --- a/Minecraft.World/Entities/Mobs/PrimedTnt.cpp +++ b/Minecraft.World/net/minecraft/world/entity/item/PrimedTnt.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Util/JavaMath.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../ConsoleJavaLibs/JavaMath.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../../level/net.minecraft.world.level.h" #include "PrimedTnt.h" void PrimedTnt::_init() { diff --git a/Minecraft.World/Entities/Mobs/PrimedTnt.h b/Minecraft.World/net/minecraft/world/entity/item/PrimedTnt.h similarity index 100% rename from Minecraft.World/Entities/Mobs/PrimedTnt.h rename to Minecraft.World/net/minecraft/world/entity/item/PrimedTnt.h diff --git a/Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h b/Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h new file mode 100644 index 000000000..575f18b52 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/item/net.minecraft.world.entity.item.h @@ -0,0 +1,14 @@ +#pragma once + +#include "Boat.h" +#include "FallingTile.h" +#include "ItemEntity.h" +#include "Minecart.h" +#include "MinecartChest.h" +#include "MinecartContainer.h" +#include "MinecartHopper.h" +#include "MinecartFurnace.h" +#include "MinecartRideable.h" +#include "MinecartSpawner.h" +#include "MinecartTNT.h" +#include "PrimedTnt.h" diff --git a/Minecraft.World/Entities/Mobs/Blaze.cpp b/Minecraft.World/net/minecraft/world/entity/monster/Blaze.cpp similarity index 88% rename from Minecraft.World/Entities/Mobs/Blaze.cpp rename to Minecraft.World/net/minecraft/world/entity/monster/Blaze.cpp index dc1306dee..7a79dbb7a 100644 --- a/Minecraft.World/Entities/Mobs/Blaze.cpp +++ b/Minecraft.World/net/minecraft/world/entity/monster/Blaze.cpp @@ -1,17 +1,17 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.entity.projectile.h" -#include "../../Util/SharedConstants.h" -#include "../../../Minecraft.Client/Textures/Textures.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.entity.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.monster.h" +#include "../projectile/net.minecraft.world.entity.projectile.h" +#include "../../../SharedConstants.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" #include "Blaze.h" -#include "../../Util/SoundTypes.h" +#include "../../../../../Header Files/SoundTypes.h" Blaze::Blaze(Level* level) : Monster(level) { // 4J Stu - This function call had to be moved here from the Entity ctor to diff --git a/Minecraft.World/Entities/Mobs/Blaze.h b/Minecraft.World/net/minecraft/world/entity/monster/Blaze.h similarity index 97% rename from Minecraft.World/Entities/Mobs/Blaze.h rename to Minecraft.World/net/minecraft/world/entity/monster/Blaze.h index 54c6b11cf..30424f3ab 100644 --- a/Minecraft.World/Entities/Mobs/Blaze.h +++ b/Minecraft.World/net/minecraft/world/entity/monster/Blaze.h @@ -1,6 +1,6 @@ #pragma once -#include "../Monster.h" +#include "Monster.h" class Blaze : public Monster { public: diff --git a/Minecraft.World/Entities/Mobs/CaveSpider.cpp b/Minecraft.World/net/minecraft/world/entity/monster/CaveSpider.cpp similarity index 77% rename from Minecraft.World/Entities/Mobs/CaveSpider.cpp rename to Minecraft.World/net/minecraft/world/entity/monster/CaveSpider.cpp index 3e3a9ebfa..3f425df9e 100644 --- a/Minecraft.World/Entities/Mobs/CaveSpider.cpp +++ b/Minecraft.World/net/minecraft/world/entity/monster/CaveSpider.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" -#include "../../Util/SharedConstants.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.effect.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.h" -#include "../../../Minecraft.Client/Textures/Textures.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../SharedConstants.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.monster.h" +#include "../../effect/net.minecraft.world.effect.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../net.minecraft.world.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" #include "CaveSpider.h" CaveSpider::CaveSpider(Level* level) : Spider(level) { diff --git a/Minecraft.World/Entities/Mobs/CaveSpider.h b/Minecraft.World/net/minecraft/world/entity/monster/CaveSpider.h similarity index 100% rename from Minecraft.World/Entities/Mobs/CaveSpider.h rename to Minecraft.World/net/minecraft/world/entity/monster/CaveSpider.h diff --git a/Minecraft.World/Entities/Mobs/Creeper.cpp b/Minecraft.World/net/minecraft/world/entity/monster/Creeper.cpp similarity index 83% rename from Minecraft.World/Entities/Mobs/Creeper.cpp rename to Minecraft.World/net/minecraft/world/entity/monster/Creeper.cpp index a89674da1..a1eeb74ca 100644 --- a/Minecraft.World/Entities/Mobs/Creeper.cpp +++ b/Minecraft.World/net/minecraft/world/entity/monster/Creeper.cpp @@ -1,22 +1,22 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.target.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Stats/GeneralStat.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.entity.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../ai/goal/net.minecraft.world.entity.ai.goal.h" +#include "../ai/goal/target/net.minecraft.world.entity.ai.goal.target.h" +#include "../ai/navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../animal/net.minecraft.world.entity.animal.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../../stats/GeneralStat.h" #include "Skeleton.h" #include "Creeper.h" -#include "Arrow.h" -#include "../../../Minecraft.Client/Textures/Textures.h" -#include "../../Util/SoundTypes.h" +#include "../projectile/Arrow.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" +#include "../../../../../Header Files/SoundTypes.h" void Creeper::_init() { swell = 0; diff --git a/Minecraft.World/Entities/Mobs/Creeper.h b/Minecraft.World/net/minecraft/world/entity/monster/Creeper.h similarity index 98% rename from Minecraft.World/Entities/Mobs/Creeper.h rename to Minecraft.World/net/minecraft/world/entity/monster/Creeper.h index d071431c3..3936e5b86 100644 --- a/Minecraft.World/Entities/Mobs/Creeper.h +++ b/Minecraft.World/net/minecraft/world/entity/monster/Creeper.h @@ -1,6 +1,6 @@ #pragma once -#include "../Monster.h" +#include "Monster.h" class Level; class DamageSource; diff --git a/Minecraft.World/Entities/Mobs/EnderMan.cpp b/Minecraft.World/net/minecraft/world/entity/monster/EnderMan.cpp similarity index 94% rename from Minecraft.World/Entities/Mobs/EnderMan.cpp rename to Minecraft.World/net/minecraft/world/entity/monster/EnderMan.cpp index d87427e23..ec17138b8 100644 --- a/Minecraft.World/Entities/Mobs/EnderMan.cpp +++ b/Minecraft.World/net/minecraft/world/entity/monster/EnderMan.cpp @@ -1,15 +1,15 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../../Minecraft.Client/Textures/Textures.h" +#include "../../../../../Header Files/stdafx.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../net.minecraft.world.entity.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.monster.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" #include "EnderMan.h" AttributeModifier* EnderMan::SPEED_MODIFIER_ATTACKING = diff --git a/Minecraft.World/Entities/Mobs/EnderMan.h b/Minecraft.World/net/minecraft/world/entity/monster/EnderMan.h similarity index 98% rename from Minecraft.World/Entities/Mobs/EnderMan.h rename to Minecraft.World/net/minecraft/world/entity/monster/EnderMan.h index 5acd6ab9b..cea60740a 100644 --- a/Minecraft.World/Entities/Mobs/EnderMan.h +++ b/Minecraft.World/net/minecraft/world/entity/monster/EnderMan.h @@ -1,6 +1,6 @@ #pragma once -#include "../Monster.h" +#include "Monster.h" class EnderMan : public Monster { public: diff --git a/Minecraft.World/Entities/Enemy.cpp b/Minecraft.World/net/minecraft/world/entity/monster/Enemy.cpp similarity index 83% rename from Minecraft.World/Entities/Enemy.cpp rename to Minecraft.World/net/minecraft/world/entity/monster/Enemy.cpp index 3ca407447..759055226 100644 --- a/Minecraft.World/Entities/Enemy.cpp +++ b/Minecraft.World/net/minecraft/world/entity/monster/Enemy.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "Enemy.h" EntitySelector* Enemy::ENEMY_SELECTOR = new Enemy::EnemyEntitySelector(); diff --git a/Minecraft.World/Entities/Enemy.h b/Minecraft.World/net/minecraft/world/entity/monster/Enemy.h similarity index 89% rename from Minecraft.World/Entities/Enemy.h rename to Minecraft.World/net/minecraft/world/entity/monster/Enemy.h index 87d72edf2..86079fbf1 100644 --- a/Minecraft.World/Entities/Enemy.h +++ b/Minecraft.World/net/minecraft/world/entity/monster/Enemy.h @@ -1,6 +1,6 @@ #pragma once -#include "Mobs/Creature.h" -#include "EntitySelector.h" +#include "../Creature.h" +#include "../EntitySelector.h" class Enemy : public Creature { public: diff --git a/Minecraft.World/Entities/Mobs/Ghast.cpp b/Minecraft.World/net/minecraft/world/entity/monster/Ghast.cpp similarity index 88% rename from Minecraft.World/Entities/Mobs/Ghast.cpp rename to Minecraft.World/net/minecraft/world/entity/monster/Ghast.cpp index eed316638..7d7b69ac5 100644 --- a/Minecraft.World/Entities/Mobs/Ghast.cpp +++ b/Minecraft.World/net/minecraft/world/entity/monster/Ghast.cpp @@ -1,19 +1,19 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.projectile.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/net.minecraft.stats.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../level/net.minecraft.world.level.h" +#include "../net.minecraft.world.entity.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../projectile/net.minecraft.world.entity.projectile.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../../stats/net.minecraft.stats.h" #include "Ghast.h" -#include "../../../Minecraft.Client/Textures/Textures.h" -#include "../../Level/Events/LevelEvent.h" -#include "../../Util/SoundTypes.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" +#include "../../level/tile/LevelEvent.h" +#include "../../../../../Header Files/SoundTypes.h" void Ghast::_init() { explosionPower = 1; diff --git a/Minecraft.World/Entities/Mobs/Ghast.h b/Minecraft.World/net/minecraft/world/entity/monster/Ghast.h similarity index 98% rename from Minecraft.World/Entities/Mobs/Ghast.h rename to Minecraft.World/net/minecraft/world/entity/monster/Ghast.h index 828cf8df2..2a73c42b2 100644 --- a/Minecraft.World/Entities/Mobs/Ghast.h +++ b/Minecraft.World/net/minecraft/world/entity/monster/Ghast.h @@ -1,7 +1,7 @@ #pragma once #include "../FlyingMob.h" -#include "../Enemy.h" +#include "Enemy.h" class GhastClass; class Level; diff --git a/Minecraft.World/Entities/Mobs/Giant.cpp b/Minecraft.World/net/minecraft/world/entity/monster/Giant.cpp similarity index 71% rename from Minecraft.World/Entities/Mobs/Giant.cpp rename to Minecraft.World/net/minecraft/world/entity/monster/Giant.cpp index 29748a797..9da20c686 100644 --- a/Minecraft.World/Entities/Mobs/Giant.cpp +++ b/Minecraft.World/net/minecraft/world/entity/monster/Giant.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../level/net.minecraft.world.level.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.monster.h" #include "Giant.h" -#include "../../../Minecraft.Client/Textures/Textures.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" Giant::Giant(Level* level) : Monster(level) { // 4J Stu - This function call had to be moved here from the Entity ctor to diff --git a/Minecraft.World/Entities/Mobs/Giant.h b/Minecraft.World/net/minecraft/world/entity/monster/Giant.h similarity index 93% rename from Minecraft.World/Entities/Mobs/Giant.h rename to Minecraft.World/net/minecraft/world/entity/monster/Giant.h index a9663eee5..5512a9fd0 100644 --- a/Minecraft.World/Entities/Mobs/Giant.h +++ b/Minecraft.World/net/minecraft/world/entity/monster/Giant.h @@ -1,6 +1,6 @@ #pragma once -#include "../Monster.h" +#include "Monster.h" class Level; diff --git a/Minecraft.World/Entities/Mobs/LavaSlime.cpp b/Minecraft.World/net/minecraft/world/entity/monster/LavaSlime.cpp similarity index 86% rename from Minecraft.World/Entities/Mobs/LavaSlime.cpp rename to Minecraft.World/net/minecraft/world/entity/monster/LavaSlime.cpp index bcf420571..23b96de1b 100644 --- a/Minecraft.World/Entities/Mobs/LavaSlime.cpp +++ b/Minecraft.World/net/minecraft/world/entity/monster/LavaSlime.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../../Minecraft.Client/Textures/Textures.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../net.minecraft.world.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.monster.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" #include "LavaSlime.h" -#include "../../Util/SoundTypes.h" +#include "../../../../../Header Files/SoundTypes.h" LavaSlime::LavaSlime(Level* level) : Slime(level) { // 4J Stu - This function call had to be moved here from the Entity ctor to diff --git a/Minecraft.World/Entities/Mobs/LavaSlime.h b/Minecraft.World/net/minecraft/world/entity/monster/LavaSlime.h similarity index 100% rename from Minecraft.World/Entities/Mobs/LavaSlime.h rename to Minecraft.World/net/minecraft/world/entity/monster/LavaSlime.h diff --git a/Minecraft.World/Entities/Monster.cpp b/Minecraft.World/net/minecraft/world/entity/monster/Monster.cpp similarity index 87% rename from Minecraft.World/Entities/Monster.cpp rename to Minecraft.World/net/minecraft/world/entity/monster/Monster.cpp index 976ed393d..5b676f715 100644 --- a/Minecraft.World/Entities/Monster.cpp +++ b/Minecraft.World/net/minecraft/world/entity/monster/Monster.cpp @@ -1,16 +1,16 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.monster.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/net.minecraft.world.effect.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../level/net.minecraft.world.level.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../effect/net.minecraft.world.effect.h" +#include "../../item/enchantment/net.minecraft.world.item.enchantment.h" #include "Monster.h" -#include "../../Minecraft.Client/Minecraft.h" +#include "../../Minecraft.Client/net/minecraft/client/Minecraft.h" Monster::Monster(Level* level) : PathfinderMob(level) { xpReward = Enemy::XP_REWARD_MEDIUM; diff --git a/Minecraft.World/Entities/Monster.h b/Minecraft.World/net/minecraft/world/entity/monster/Monster.h similarity index 96% rename from Minecraft.World/Entities/Monster.h rename to Minecraft.World/net/minecraft/world/entity/monster/Monster.h index 8b83b2c59..fafe5b016 100644 --- a/Minecraft.World/Entities/Monster.h +++ b/Minecraft.World/net/minecraft/world/entity/monster/Monster.h @@ -1,6 +1,6 @@ #pragma once -#include "PathfinderMob.h" +#include "../PathfinderMob.h" #include "Enemy.h" class Level; diff --git a/Minecraft.World/Entities/Mobs/PigZombie.cpp b/Minecraft.World/net/minecraft/world/entity/monster/PigZombie.cpp similarity index 85% rename from Minecraft.World/Entities/Mobs/PigZombie.cpp rename to Minecraft.World/net/minecraft/world/entity/monster/PigZombie.cpp index 826d1e928..aad74a52b 100644 --- a/Minecraft.World/Entities/Mobs/PigZombie.cpp +++ b/Minecraft.World/net/minecraft/world/entity/monster/PigZombie.cpp @@ -1,18 +1,18 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../Headers/net.minecraft.world.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.item.enchantment.h" -#include "../../Headers/net.minecraft.world.entity.item.h" -#include "../../Headers/net.minecraft.world.damagesource.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../../net.minecraft.world.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../item/enchantment/net.minecraft.world.item.enchantment.h" +#include "../item/net.minecraft.world.entity.item.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" #include "PigZombie.h" -#include "../../../Minecraft.Client/Textures/Textures.h" -#include "../../Util/SoundTypes.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" +#include "../../../../../Header Files/SoundTypes.h" AttributeModifier* PigZombie::SPEED_MODIFIER_ATTACKING = (new AttributeModifier(eModifierId_MOB_PIG_ATTACKSPEED, 0.45, diff --git a/Minecraft.World/Entities/Mobs/PigZombie.h b/Minecraft.World/net/minecraft/world/entity/monster/PigZombie.h similarity index 100% rename from Minecraft.World/Entities/Mobs/PigZombie.h rename to Minecraft.World/net/minecraft/world/entity/monster/PigZombie.h diff --git a/Minecraft.World/Entities/Mobs/RangedAttackMob.h b/Minecraft.World/net/minecraft/world/entity/monster/RangedAttackMob.h similarity index 100% rename from Minecraft.World/Entities/Mobs/RangedAttackMob.h rename to Minecraft.World/net/minecraft/world/entity/monster/RangedAttackMob.h diff --git a/Minecraft.World/Entities/Mobs/SharedMonsterAttributes.cpp b/Minecraft.World/net/minecraft/world/entity/monster/SharedMonsterAttributes.cpp similarity index 97% rename from Minecraft.World/Entities/Mobs/SharedMonsterAttributes.cpp rename to Minecraft.World/net/minecraft/world/entity/monster/SharedMonsterAttributes.cpp index 51e69bd54..cb22aaa11 100644 --- a/Minecraft.World/Entities/Mobs/SharedMonsterAttributes.cpp +++ b/Minecraft.World/net/minecraft/world/entity/monster/SharedMonsterAttributes.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" +#include "../../../../../Header Files/stdafx.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" #include "SharedMonsterAttributes.h" #include diff --git a/Minecraft.World/Entities/Mobs/SharedMonsterAttributes.h b/Minecraft.World/net/minecraft/world/entity/monster/SharedMonsterAttributes.h similarity index 100% rename from Minecraft.World/Entities/Mobs/SharedMonsterAttributes.h rename to Minecraft.World/net/minecraft/world/entity/monster/SharedMonsterAttributes.h diff --git a/Minecraft.World/Entities/Mobs/Silverfish.cpp b/Minecraft.World/net/minecraft/world/entity/monster/Silverfish.cpp similarity index 92% rename from Minecraft.World/Entities/Mobs/Silverfish.cpp rename to Minecraft.World/net/minecraft/world/entity/monster/Silverfish.cpp index b99fa8c5e..edd04c118 100644 --- a/Minecraft.World/Entities/Mobs/Silverfish.cpp +++ b/Minecraft.World/net/minecraft/world/entity/monster/Silverfish.cpp @@ -1,14 +1,14 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.h" -#include "../../../Minecraft.Client/Textures/Textures.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "net.minecraft.world.entity.monster.h" +#include "../../../net.minecraft.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" #include "Silverfish.h" -#include "../../Util/SoundTypes.h" +#include "../../../../../Header Files/SoundTypes.h" Silverfish::Silverfish(Level* level) : Monster(level) { // 4J Stu - This function call had to be moved here from the Entity ctor to diff --git a/Minecraft.World/Entities/Mobs/Silverfish.h b/Minecraft.World/net/minecraft/world/entity/monster/Silverfish.h similarity index 97% rename from Minecraft.World/Entities/Mobs/Silverfish.h rename to Minecraft.World/net/minecraft/world/entity/monster/Silverfish.h index f27d8b6f8..417cc69d8 100644 --- a/Minecraft.World/Entities/Mobs/Silverfish.h +++ b/Minecraft.World/net/minecraft/world/entity/monster/Silverfish.h @@ -1,6 +1,6 @@ #pragma once -#include "../Monster.h" +#include "Monster.h" class Silverfish : public Monster { public: diff --git a/Minecraft.World/Entities/Mobs/Skeleton.cpp b/Minecraft.World/net/minecraft/world/entity/monster/Skeleton.cpp similarity index 88% rename from Minecraft.World/Entities/Mobs/Skeleton.cpp rename to Minecraft.World/net/minecraft/world/entity/monster/Skeleton.cpp index ac8cb3b03..4a9e9123c 100644 --- a/Minecraft.World/Entities/Mobs/Skeleton.cpp +++ b/Minecraft.World/net/minecraft/world/entity/monster/Skeleton.cpp @@ -1,26 +1,26 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.dimension.h" -#include "../../Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.item.enchantment.h" -#include "../../Headers/net.minecraft.world.effect.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.target.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.projectile.h" -#include "../../Headers/net.minecraft.world.entity.item.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.stats.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Util/SharedConstants.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/dimension/net.minecraft.world.level.dimension.h" +#include "../../level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../item/enchantment/net.minecraft.world.item.enchantment.h" +#include "../../effect/net.minecraft.world.effect.h" +#include "../net.minecraft.world.entity.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../ai/goal/net.minecraft.world.entity.ai.goal.h" +#include "../ai/goal/target/net.minecraft.world.entity.ai.goal.target.h" +#include "../ai/navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../projectile/net.minecraft.world.entity.projectile.h" +#include "../item/net.minecraft.world.entity.item.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" +#include "../../../stats/net.minecraft.stats.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../../SharedConstants.h" #include "Skeleton.h" -#include "../../../Minecraft.Client/Textures/Textures.h" -#include "../../Util/SoundTypes.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" +#include "../../../../../Header Files/SoundTypes.h" Skeleton::Skeleton(Level* level) : Monster(level) { // 4J Stu - This function call had to be moved here from the Entity ctor to diff --git a/Minecraft.World/Entities/Mobs/Skeleton.h b/Minecraft.World/net/minecraft/world/entity/monster/Skeleton.h similarity index 98% rename from Minecraft.World/Entities/Mobs/Skeleton.h rename to Minecraft.World/net/minecraft/world/entity/monster/Skeleton.h index 714700696..e54779b40 100644 --- a/Minecraft.World/Entities/Mobs/Skeleton.h +++ b/Minecraft.World/net/minecraft/world/entity/monster/Skeleton.h @@ -1,6 +1,6 @@ #pragma once -#include "../Monster.h" +#include "Monster.h" #include "RangedAttackMob.h" class RangedAttackGoal; diff --git a/Minecraft.World/Entities/Mobs/Slime.cpp b/Minecraft.World/net/minecraft/world/entity/monster/Slime.cpp similarity index 89% rename from Minecraft.World/Entities/Mobs/Slime.cpp rename to Minecraft.World/net/minecraft/world/entity/monster/Slime.cpp index 35d8d96cd..d62d23533 100644 --- a/Minecraft.World/Entities/Mobs/Slime.cpp +++ b/Minecraft.World/net/minecraft/world/entity/monster/Slime.cpp @@ -1,20 +1,20 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.storage.h" -#include "../../Headers/net.minecraft.world.level.chunk.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.item.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/storage/net.minecraft.world.level.storage.h" +#include "../../level/chunk/net.minecraft.world.level.chunk.h" +#include "../net.minecraft.world.entity.h" +#include "../../item/net.minecraft.world.item.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../item/net.minecraft.world.entity.item.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "net.minecraft.world.entity.monster.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" #include "Slime.h" -#include "../../../Minecraft.Client/Textures/Textures.h" -#include "../../Util/SoundTypes.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" +#include "../../../../../Header Files/SoundTypes.h" void Slime::_init() { jumpDelay = 0; diff --git a/Minecraft.World/Entities/Mobs/Slime.h b/Minecraft.World/net/minecraft/world/entity/monster/Slime.h similarity index 95% rename from Minecraft.World/Entities/Mobs/Slime.h rename to Minecraft.World/net/minecraft/world/entity/monster/Slime.h index 51483983a..908182f86 100644 --- a/Minecraft.World/Entities/Mobs/Slime.h +++ b/Minecraft.World/net/minecraft/world/entity/monster/Slime.h @@ -1,8 +1,8 @@ #pragma once #include "../Mob.h" -#include "../Enemy.h" -#include "../../Util/ParticleTypes.h" +#include "Enemy.h" +#include "../../../../../Header Files/ParticleTypes.h" class Slime : public Mob, public Enemy { public: diff --git a/Minecraft.World/Entities/Mobs/Spider.cpp b/Minecraft.World/net/minecraft/world/entity/monster/Spider.cpp similarity index 88% rename from Minecraft.World/Entities/Mobs/Spider.cpp rename to Minecraft.World/net/minecraft/world/entity/monster/Spider.cpp index 8cef7de42..ab1d13291 100644 --- a/Minecraft.World/Entities/Mobs/Spider.cpp +++ b/Minecraft.World/net/minecraft/world/entity/monster/Spider.cpp @@ -1,18 +1,18 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.item.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.effect.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../item/net.minecraft.world.item.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../item/net.minecraft.world.entity.item.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../../effect/net.minecraft.world.effect.h" +#include "../net.minecraft.world.entity.h" +#include "net.minecraft.world.entity.monster.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" #include "Spider.h" #include -#include "../../../Minecraft.Client/Textures/Textures.h" -#include "../../Util/SoundTypes.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" +#include "../../../../../Header Files/SoundTypes.h" Spider::Spider(Level* level) : Monster(level) { // 4J Stu - This function call had to be moved here from the Entity ctor to diff --git a/Minecraft.World/Entities/Mobs/Spider.h b/Minecraft.World/net/minecraft/world/entity/monster/Spider.h similarity index 96% rename from Minecraft.World/Entities/Mobs/Spider.h rename to Minecraft.World/net/minecraft/world/entity/monster/Spider.h index 30d7a9509..514b61225 100644 --- a/Minecraft.World/Entities/Mobs/Spider.h +++ b/Minecraft.World/net/minecraft/world/entity/monster/Spider.h @@ -1,7 +1,7 @@ #pragma once -#include "../Monster.h" -#include "MobGroupData.h" +#include "Monster.h" +#include "../MobGroupData.h" class Spider : public Monster { public: diff --git a/Minecraft.World/Entities/Mobs/Witch.cpp b/Minecraft.World/net/minecraft/world/entity/monster/Witch.cpp similarity index 91% rename from Minecraft.World/Entities/Mobs/Witch.cpp rename to Minecraft.World/net/minecraft/world/entity/monster/Witch.cpp index 40e40e77f..acec86850 100644 --- a/Minecraft.World/Entities/Mobs/Witch.cpp +++ b/Minecraft.World/net/minecraft/world/entity/monster/Witch.cpp @@ -1,16 +1,16 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.effect.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.target.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.entity.projectile.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.item.alchemy.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../effect/net.minecraft.world.effect.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../net.minecraft.world.entity.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../ai/goal/net.minecraft.world.entity.ai.goal.h" +#include "../ai/goal/target/net.minecraft.world.entity.ai.goal.target.h" +#include "net.minecraft.world.entity.monster.h" +#include "../projectile/net.minecraft.world.entity.projectile.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../item/alchemy/net.minecraft.world.item.alchemy.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../phys/net.minecraft.world.phys.h" #include "Witch.h" AttributeModifier* Witch::SPEED_MODIFIER_DRINKING = diff --git a/Minecraft.World/Entities/Mobs/Witch.h b/Minecraft.World/net/minecraft/world/entity/monster/Witch.h similarity index 98% rename from Minecraft.World/Entities/Mobs/Witch.h rename to Minecraft.World/net/minecraft/world/entity/monster/Witch.h index 07277ba8a..6c192e85d 100644 --- a/Minecraft.World/Entities/Mobs/Witch.h +++ b/Minecraft.World/net/minecraft/world/entity/monster/Witch.h @@ -1,6 +1,6 @@ #pragma once -#include "../Monster.h" +#include "Monster.h" #include "RangedAttackMob.h" class Witch : public Monster, public RangedAttackMob { diff --git a/Minecraft.World/Entities/Mobs/Zombie.cpp b/Minecraft.World/net/minecraft/world/entity/monster/Zombie.cpp similarity index 94% rename from Minecraft.World/Entities/Mobs/Zombie.cpp rename to Minecraft.World/net/minecraft/world/entity/monster/Zombie.cpp index 3fbd91058..1e2f16257 100644 --- a/Minecraft.World/Entities/Mobs/Zombie.cpp +++ b/Minecraft.World/net/minecraft/world/entity/monster/Zombie.cpp @@ -1,23 +1,23 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/net.minecraft.world.effect.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.target.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.entity.npc.h" -#include "../../Headers/net.minecraft.world.entity.player.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../net.minecraft.world.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../effect/net.minecraft.world.effect.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../ai/goal/net.minecraft.world.entity.ai.goal.h" +#include "../ai/goal/target/net.minecraft.world.entity.ai.goal.target.h" +#include "../ai/navigation/net.minecraft.world.entity.ai.navigation.h" +#include "net.minecraft.world.entity.monster.h" +#include "../npc/net.minecraft.world.entity.npc.h" +#include "../player/net.minecraft.world.entity.player.h" #include "Zombie.h" -#include "../../Stats/GenericStats.h" -#include "../../../Minecraft.Client/Textures/Textures.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Util/JavaMath.h" -#include "../../Util/SoundTypes.h" +#include "../../../stats/GenericStats.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" +#include "../net.minecraft.world.entity.h" +#include "../../../../../ConsoleJavaLibs/JavaMath.h" +#include "../../../../../Header Files/SoundTypes.h" Attribute* Zombie::SPAWN_REINFORCEMENTS_CHANCE = (new RangedAttribute(eAttributeId_ZOMBIE_SPAWNREINFORCEMENTS, 0, 0, 1)); diff --git a/Minecraft.World/Entities/Mobs/Zombie.h b/Minecraft.World/net/minecraft/world/entity/monster/Zombie.h similarity index 96% rename from Minecraft.World/Entities/Mobs/Zombie.h rename to Minecraft.World/net/minecraft/world/entity/monster/Zombie.h index 0e766ee1c..4e88fdf4a 100644 --- a/Minecraft.World/Entities/Mobs/Zombie.h +++ b/Minecraft.World/net/minecraft/world/entity/monster/Zombie.h @@ -1,8 +1,8 @@ #pragma once -#include "../Monster.h" -#include "../../Util/SharedConstants.h" -#include "MobGroupData.h" +#include "Monster.h" +#include "../../../SharedConstants.h" +#include "../MobGroupData.h" class Zombie : public Monster { private: diff --git a/Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h b/Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h new file mode 100644 index 000000000..edeaf9259 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/monster/net.minecraft.world.entity.monster.h @@ -0,0 +1,26 @@ +#pragma once + +#include "Enemy.h" +#include "Monster.h" +#include "Creeper.h" +#include "Ghast.h" +#include "Giant.h" +#include "Zombie.h" +#include "PigZombie.h" +#include "Skeleton.h" +#include "Slime.h" +#include "Spider.h" + +// 1.8.2 +#include "CaveSpider.h" +#include "EnderMan.h" +#include "Silverfish.h" + +// 1.0.1 +#include "Blaze.h" +#include "LavaSlime.h" + +// 1.6.4 +#include "RangedAttackMob.h" +#include "SharedMonsterAttributes.h" +#include "Witch.h" \ No newline at end of file diff --git a/Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h b/Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h new file mode 100644 index 000000000..8b6a7e0dd --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/net.minecraft.world.entity.h @@ -0,0 +1,34 @@ +#pragma once + +#include "Creature.h" +#include "SyncedEntityData.h" +#include "Entity.h" +#include "EntityEvent.h" +#include "EntityIO.h" +#include "EntityPos.h" +#include "FlyingMob.h" +#include "Mob.h" +#include "MobCategory.h" +#include "Painting.h" +#include "PathfinderMob.h" + +// 1.8.2 +#include "DelayedRelease.h" +#include "ExperienceOrb.h" + +// 1.0.1 +#include "MobType.h" + +// TU9 +#include "ItemFrame.h" + +// 1.2.3 +#include "AgeableMob.h" +#include "TamableAnimal.h" + +// 1.6.4 +#include "LeashFenceKnotEntity.h" +#include "MobGroupData.h" +#include "OwnableEntity.h" +#include "EntitySelector.h" +#include "LivingEntity.h" \ No newline at end of file diff --git a/Minecraft.World/Containers/ClientSideMerchant.cpp b/Minecraft.World/net/minecraft/world/entity/npc/ClientSideMerchant.cpp similarity index 88% rename from Minecraft.World/Containers/ClientSideMerchant.cpp rename to Minecraft.World/net/minecraft/world/entity/npc/ClientSideMerchant.cpp index f8763ca0b..6587f7f1d 100644 --- a/Minecraft.World/Containers/ClientSideMerchant.cpp +++ b/Minecraft.World/net/minecraft/world/entity/npc/ClientSideMerchant.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.trading.h" -#include "../Headers/net.minecraft.world.inventory.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../item/trading/net.minecraft.world.item.trading.h" +#include "../../inventory/net.minecraft.world.inventory.h" #include "ClientSideMerchant.h" ClientSideMerchant::ClientSideMerchant(std::shared_ptr source, diff --git a/Minecraft.World/Containers/ClientSideMerchant.h b/Minecraft.World/net/minecraft/world/entity/npc/ClientSideMerchant.h similarity index 95% rename from Minecraft.World/Containers/ClientSideMerchant.h rename to Minecraft.World/net/minecraft/world/entity/npc/ClientSideMerchant.h index 30d41e60b..873f32401 100644 --- a/Minecraft.World/Containers/ClientSideMerchant.h +++ b/Minecraft.World/net/minecraft/world/entity/npc/ClientSideMerchant.h @@ -1,6 +1,6 @@ #pragma once -#include "Merchant.h" +#include "../../item/trading/Merchant.h" class MerchantContainer; class MerchantRecipeList; diff --git a/Minecraft.World/net/minecraft/world/entity/npc/Npc.cpp b/Minecraft.World/net/minecraft/world/entity/npc/Npc.cpp new file mode 100644 index 000000000..4b72857e6 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/npc/Npc.cpp @@ -0,0 +1,3 @@ +#include "../../../../../Header Files/stdafx.h" + +#include "Npc.h" diff --git a/Minecraft.World/Entities/Mobs/Npc.h b/Minecraft.World/net/minecraft/world/entity/npc/Npc.h similarity index 76% rename from Minecraft.World/Entities/Mobs/Npc.h rename to Minecraft.World/net/minecraft/world/entity/npc/Npc.h index 545daa1da..49073c92e 100644 --- a/Minecraft.World/Entities/Mobs/Npc.h +++ b/Minecraft.World/net/minecraft/world/entity/npc/Npc.h @@ -1,6 +1,6 @@ #pragma once -#include "Creature.h" +#include "../Creature.h" class Level; diff --git a/Minecraft.World/Entities/Mobs/Villager.cpp b/Minecraft.World/net/minecraft/world/entity/npc/Villager.cpp similarity index 96% rename from Minecraft.World/Entities/Mobs/Villager.cpp rename to Minecraft.World/net/minecraft/world/entity/npc/Villager.cpp index e0b19a30f..732c2fd42 100644 --- a/Minecraft.World/Entities/Mobs/Villager.cpp +++ b/Minecraft.World/net/minecraft/world/entity/npc/Villager.cpp @@ -1,20 +1,20 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../../Headers/net.minecraft.world.entity.ai.navigation.h" -#include "../../Headers/net.minecraft.world.entity.ai.village.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.effect.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.item.enchantment.h" -#include "../../Headers/net.minecraft.world.item.trading.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.Client/Textures/Textures.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../ai/goal/net.minecraft.world.entity.ai.goal.h" +#include "../ai/navigation/net.minecraft.world.entity.ai.navigation.h" +#include "../ai/village/net.minecraft.world.entity.ai.village.h" +#include "../monster/net.minecraft.world.entity.monster.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../../effect/net.minecraft.world.effect.h" +#include "../net.minecraft.world.entity.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../item/enchantment/net.minecraft.world.item.enchantment.h" +#include "../../item/trading/net.minecraft.world.item.trading.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" #include "Villager.h" namespace { diff --git a/Minecraft.World/Entities/Mobs/Villager.h b/Minecraft.World/net/minecraft/world/entity/npc/Villager.h similarity index 97% rename from Minecraft.World/Entities/Mobs/Villager.h rename to Minecraft.World/net/minecraft/world/entity/npc/Villager.h index e4be4d88b..2544d2706 100644 --- a/Minecraft.World/Entities/Mobs/Villager.h +++ b/Minecraft.World/net/minecraft/world/entity/npc/Villager.h @@ -1,9 +1,9 @@ #pragma once -#include "AgeableMob.h" +#include "../AgeableMob.h" #include "Npc.h" -#include "../../Containers/Merchant.h" -#include "../../Util/ParticleTypes.h" +#include "../../item/trading/Merchant.h" +#include "../../../../../Header Files/ParticleTypes.h" class Level; class Village; diff --git a/Minecraft.World/net/minecraft/world/entity/npc/net.minecraft.world.entity.npc.h b/Minecraft.World/net/minecraft/world/entity/npc/net.minecraft.world.entity.npc.h new file mode 100644 index 000000000..2874bcd7f --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/npc/net.minecraft.world.entity.npc.h @@ -0,0 +1,5 @@ +#pragma once + +#include "Npc.h" +#include "Villager.h" +#include "ClientSideMerchant.h" \ No newline at end of file diff --git a/Minecraft.World/Player/Abilities.cpp b/Minecraft.World/net/minecraft/world/entity/player/Abilities.cpp similarity index 93% rename from Minecraft.World/Player/Abilities.cpp rename to Minecraft.World/net/minecraft/world/entity/player/Abilities.cpp index d5e1b913f..bccbdcf08 100644 --- a/Minecraft.World/Player/Abilities.cpp +++ b/Minecraft.World/net/minecraft/world/entity/player/Abilities.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/com.mojang.nbt.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" #include "Abilities.h" Abilities::Abilities() { diff --git a/Minecraft.World/Player/Abilities.h b/Minecraft.World/net/minecraft/world/entity/player/Abilities.h similarity index 100% rename from Minecraft.World/Player/Abilities.h rename to Minecraft.World/net/minecraft/world/entity/player/Abilities.h diff --git a/Minecraft.World/Containers/Inventory.cpp b/Minecraft.World/net/minecraft/world/entity/player/Inventory.cpp similarity index 98% rename from Minecraft.World/Containers/Inventory.cpp rename to Minecraft.World/net/minecraft/world/entity/player/Inventory.cpp index ea30b2cee..8b682b0c8 100644 --- a/Minecraft.World/Containers/Inventory.cpp +++ b/Minecraft.World/net/minecraft/world/entity/player/Inventory.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Headers/com.mojang.nbt.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.stats.h" -#include "../Blocks/Material.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "net.minecraft.world.entity.player.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../../stats/net.minecraft.stats.h" +#include "../../level/material/Material.h" #include "Inventory.h" const int Inventory::POP_TIME_DURATION = 5; diff --git a/Minecraft.World/Containers/Inventory.h b/Minecraft.World/net/minecraft/world/entity/player/Inventory.h similarity index 96% rename from Minecraft.World/Containers/Inventory.h rename to Minecraft.World/net/minecraft/world/entity/player/Inventory.h index 82b8db031..9af2a7d83 100644 --- a/Minecraft.World/Containers/Inventory.h +++ b/Minecraft.World/net/minecraft/world/entity/player/Inventory.h @@ -1,7 +1,7 @@ #pragma once -#include "Container.h" -#include "../IO/NBT/ListTag.h" -#include "../Items/ItemInstance.h" +#include "../../Container.h" +#include "../../../../../com/mojang/nbt/ListTag.h" +#include "../../item/ItemInstance.h" class Player; class CompoundTag; diff --git a/Minecraft.World/Player/Player.cpp b/Minecraft.World/net/minecraft/world/entity/player/Player.cpp similarity index 97% rename from Minecraft.World/Player/Player.cpp rename to Minecraft.World/net/minecraft/world/entity/player/Player.cpp index a89270574..82272c440 100644 --- a/Minecraft.World/Player/Player.cpp +++ b/Minecraft.World/net/minecraft/world/entity/player/Player.cpp @@ -7,43 +7,43 @@ // derives from, and not to find the derived class itself (which should own the // virtual GetType function) -#include "../Platform/stdafx.h" -#include "../Util/JavaMath.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.stats.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.chunk.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../Headers/net.minecraft.world.entity.animal.h" -#include "../Headers/net.minecraft.world.entity.boss.h" -#include "../Headers/net.minecraft.world.entity.monster.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" -#include "../Headers/net.minecraft.world.level.dimension.h" -#include "../Headers/net.minecraft.world.level.material.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "../Headers/net.minecraft.world.scores.h" -#include "../Headers/net.minecraft.world.scores.criteria.h" -#include "../Headers/net.minecraft.world.entity.projectile.h" -#include "../Headers/net.minecraft.world.inventory.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/net.minecraft.world.effect.h" -#include "../Headers/net.minecraft.world.food.h" -#include "../Containers/Inventory.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../ConsoleJavaLibs/JavaMath.h" +#include "../../../net.minecraft.h" +#include "../../net.minecraft.world.h" +#include "../../../stats/net.minecraft.stats.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/chunk/net.minecraft.world.level.chunk.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../net.minecraft.world.entity.h" +#include "../ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../animal/net.minecraft.world.entity.animal.h" +#include "../boss/net.minecraft.world.entity.boss.h" +#include "../monster/net.minecraft.world.entity.monster.h" +#include "../item/net.minecraft.world.entity.item.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../item/enchantment/net.minecraft.world.item.enchantment.h" +#include "../../level/dimension/net.minecraft.world.level.dimension.h" +#include "../../level/material/net.minecraft.world.level.material.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../scores/net.minecraft.world.scores.h" +#include "../../scores/criteria/net.minecraft.world.scores.criteria.h" +#include "../projectile/net.minecraft.world.entity.projectile.h" +#include "../../inventory/net.minecraft.world.inventory.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../effect/net.minecraft.world.effect.h" +#include "../../food/net.minecraft.world.food.h" +#include "Inventory.h" #include "Player.h" -#include "../Util/ParticleTypes.h" +#include "../../../../../Header Files/ParticleTypes.h" #include #include -#include "../../Minecraft.Client/Textures/Textures.h" +#include "../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" #include -#include "../../Minecraft.Client/Player/LocalPlayer.h" -#include "../../Minecraft.Client/Rendering/Models/HumanoidModel.h" -#include "../Util/SoundTypes.h" +#include "../../Minecraft.Client/net/minecraft/client/player/LocalPlayer.h" +#include "../../Minecraft.Client/net/minecraft/client/model/HumanoidModel.h" +#include "../../../../../Header Files/SoundTypes.h" void Player::_init() { registerAttributes(); diff --git a/Minecraft.World/Player/Player.h b/Minecraft.World/net/minecraft/world/entity/player/Player.h similarity index 98% rename from Minecraft.World/Player/Player.h rename to Minecraft.World/net/minecraft/world/entity/player/Player.h index 563aa6c17..4fbe69218 100644 --- a/Minecraft.World/Player/Player.h +++ b/Minecraft.World/net/minecraft/world/entity/player/Player.h @@ -2,13 +2,13 @@ #include -#include "../Entities/LivingEntity.h" -#include "../Util/Definitions.h" +#include "../LivingEntity.h" +#include "../../../../../ConsoleHelpers/Definitions.h" #include "Abilities.h" -#include "FoodData.h" -#include "PlayerEnderChestContainer.h" -#include "../Commands/CommandSender.h" -#include "../Scores/ScoreHolder.h" +#include "../../food/FoodData.h" +#include "../../inventory/PlayerEnderChestContainer.h" +#include "../../../commands/CommandSender.h" +#include "../../scores/ScoreHolder.h" class AbstractContainerMenu; class Stats; diff --git a/Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h b/Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h new file mode 100644 index 000000000..9394b89bd --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/player/net.minecraft.world.entity.player.h @@ -0,0 +1,5 @@ +#pragma once + +#include "Inventory.h" +#include "Player.h" +#include "Abilities.h" \ No newline at end of file diff --git a/Minecraft.World/Entities/Mobs/Arrow.cpp b/Minecraft.World/net/minecraft/world/entity/projectile/Arrow.cpp similarity index 94% rename from Minecraft.World/Entities/Mobs/Arrow.cpp rename to Minecraft.World/net/minecraft/world/entity/projectile/Arrow.cpp index 26da380fd..a83e6773b 100644 --- a/Minecraft.World/Entities/Mobs/Arrow.cpp +++ b/Minecraft.World/net/minecraft/world/entity/projectile/Arrow.cpp @@ -1,22 +1,22 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/net.minecraft.world.item.enchantment.h" -#include "../../Headers/net.minecraft.network.packet.h" -#include "../../../Minecraft.Client/Player/ServerPlayer.h" -#include "../../../Minecraft.Client/Network/PlayerConnection.h" -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../net.minecraft.world.entity.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../item/enchantment/net.minecraft.world.item.enchantment.h" +#include "../../../network/packet/net.minecraft.network.packet.h" +#include "../../../Minecraft.Client/net/minecraft/server/level/ServerPlayer.h" +#include "../../../Minecraft.Client/net/minecraft/server/network/PlayerConnection.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" #include "Arrow.h" // 4J : WESTY : Added for other award, kill creeper with arrow. -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.stats.h" -#include "../../Util/SoundTypes.h" +#include "../monster/net.minecraft.world.entity.monster.h" +#include "../../../stats/net.minecraft.stats.h" +#include "../../../../../Header Files/SoundTypes.h" // base damage, multiplied with velocity const double Arrow::ARROW_BASE_DAMAGE = 2.0f; diff --git a/Minecraft.World/Entities/Mobs/Arrow.h b/Minecraft.World/net/minecraft/world/entity/projectile/Arrow.h similarity index 98% rename from Minecraft.World/Entities/Mobs/Arrow.h rename to Minecraft.World/net/minecraft/world/entity/projectile/Arrow.h index 919df0c04..629fb19f7 100644 --- a/Minecraft.World/Entities/Mobs/Arrow.h +++ b/Minecraft.World/net/minecraft/world/entity/projectile/Arrow.h @@ -1,7 +1,7 @@ #pragma once #include "../Entity.h" -#include "../Projectile.h" +#include "Projectile.h" class Level; class CompoundTag; diff --git a/Minecraft.World/Entities/Mobs/DragonFireball.cpp b/Minecraft.World/net/minecraft/world/entity/projectile/DragonFireball.cpp similarity index 86% rename from Minecraft.World/Entities/Mobs/DragonFireball.cpp rename to Minecraft.World/net/minecraft/world/entity/projectile/DragonFireball.cpp index 2ccac22f1..c68dfc4d0 100644 --- a/Minecraft.World/Entities/Mobs/DragonFireball.cpp +++ b/Minecraft.World/net/minecraft/world/entity/projectile/DragonFireball.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Util/JavaMath.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../net.minecraft.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../../../../ConsoleJavaLibs/JavaMath.h" #include "DragonFireball.h" const double DragonFireball::SPLASH_RANGE = 4.0; diff --git a/Minecraft.World/Entities/Mobs/DragonFireball.h b/Minecraft.World/net/minecraft/world/entity/projectile/DragonFireball.h similarity index 100% rename from Minecraft.World/Entities/Mobs/DragonFireball.h rename to Minecraft.World/net/minecraft/world/entity/projectile/DragonFireball.h diff --git a/Minecraft.World/Entities/Mobs/EyeOfEnderSignal.cpp b/Minecraft.World/net/minecraft/world/entity/projectile/EyeOfEnderSignal.cpp similarity index 91% rename from Minecraft.World/Entities/Mobs/EyeOfEnderSignal.cpp rename to Minecraft.World/net/minecraft/world/entity/projectile/EyeOfEnderSignal.cpp index ed3311a2c..ac3e384ef 100644 --- a/Minecraft.World/Entities/Mobs/EyeOfEnderSignal.cpp +++ b/Minecraft.World/net/minecraft/world/entity/projectile/EyeOfEnderSignal.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.entity.item.h" -#include "../../Util/SharedConstants.h" -#include "../../Util/JavaMath.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../item/net.minecraft.world.item.h" +#include "../item/net.minecraft.world.entity.item.h" +#include "../../../SharedConstants.h" +#include "../../../../../ConsoleJavaLibs/JavaMath.h" #include "EyeOfEnderSignal.h" void EyeOfEnderSignal::_init() { diff --git a/Minecraft.World/Entities/Mobs/EyeOfEnderSignal.h b/Minecraft.World/net/minecraft/world/entity/projectile/EyeOfEnderSignal.h similarity index 100% rename from Minecraft.World/Entities/Mobs/EyeOfEnderSignal.h rename to Minecraft.World/net/minecraft/world/entity/projectile/EyeOfEnderSignal.h diff --git a/Minecraft.World/Entities/Mobs/Fireball.cpp b/Minecraft.World/net/minecraft/world/entity/projectile/Fireball.cpp similarity index 94% rename from Minecraft.World/Entities/Mobs/Fireball.cpp rename to Minecraft.World/net/minecraft/world/entity/projectile/Fireball.cpp index 5128b6877..0797e0d8f 100644 --- a/Minecraft.World/Entities/Mobs/Fireball.cpp +++ b/Minecraft.World/net/minecraft/world/entity/projectile/Fireball.cpp @@ -1,14 +1,14 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" #include "Fireball.h" -#include "../../Headers/net.minecraft.world.level.dimension.h" -#include "../../Util/SharedConstants.h" +#include "../../level/dimension/net.minecraft.world.level.dimension.h" +#include "../../../SharedConstants.h" // 4J - added common ctor code. void Fireball::_init() { diff --git a/Minecraft.World/Entities/Mobs/Fireball.h b/Minecraft.World/net/minecraft/world/entity/projectile/Fireball.h similarity index 96% rename from Minecraft.World/Entities/Mobs/Fireball.h rename to Minecraft.World/net/minecraft/world/entity/projectile/Fireball.h index 27e8aecdc..70d034598 100644 --- a/Minecraft.World/Entities/Mobs/Fireball.h +++ b/Minecraft.World/net/minecraft/world/entity/projectile/Fireball.h @@ -1,7 +1,7 @@ #pragma once #include "../Entity.h" -#include "../../Util/ParticleTypes.h" +#include "../../../../../Header Files/ParticleTypes.h" class HitResult; diff --git a/Minecraft.World/Entities/FireworksRocketEntity.cpp b/Minecraft.World/net/minecraft/world/entity/projectile/FireworksRocketEntity.cpp similarity index 96% rename from Minecraft.World/Entities/FireworksRocketEntity.cpp rename to Minecraft.World/net/minecraft/world/entity/projectile/FireworksRocketEntity.cpp index ee8ed0a72..f0df394b1 100644 --- a/Minecraft.World/Entities/FireworksRocketEntity.cpp +++ b/Minecraft.World/net/minecraft/world/entity/projectile/FireworksRocketEntity.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.entity.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../level/net.minecraft.world.level.h" #include "FireworksRocketEntity.h" FireworksRocketEntity::FireworksRocketEntity(Level* level) : Entity(level) { diff --git a/Minecraft.World/Entities/FireworksRocketEntity.h b/Minecraft.World/net/minecraft/world/entity/projectile/FireworksRocketEntity.h similarity index 97% rename from Minecraft.World/Entities/FireworksRocketEntity.h rename to Minecraft.World/net/minecraft/world/entity/projectile/FireworksRocketEntity.h index 21dc74a17..b44dca524 100644 --- a/Minecraft.World/Entities/FireworksRocketEntity.h +++ b/Minecraft.World/net/minecraft/world/entity/projectile/FireworksRocketEntity.h @@ -1,6 +1,6 @@ #pragma once -#include "Entity.h" +#include "../Entity.h" class FireworksRocketEntity : public Entity { public: diff --git a/Minecraft.World/Entities/Mobs/FishingHook.cpp b/Minecraft.World/net/minecraft/world/entity/projectile/FishingHook.cpp similarity index 94% rename from Minecraft.World/Entities/Mobs/FishingHook.cpp rename to Minecraft.World/net/minecraft/world/entity/projectile/FishingHook.cpp index 57c01e41c..e9923c3b9 100644 --- a/Minecraft.World/Entities/Mobs/FishingHook.cpp +++ b/Minecraft.World/net/minecraft/world/entity/projectile/FishingHook.cpp @@ -1,16 +1,16 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.stats.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.entity.item.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../stats/net.minecraft.stats.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../player/net.minecraft.world.entity.player.h" +#include "../../item/net.minecraft.world.item.h" +#include "../item/net.minecraft.world.entity.item.h" +#include "../net.minecraft.world.entity.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" #include "FishingHook.h" -#include "../../Util/SoundTypes.h" +#include "../../../../../Header Files/SoundTypes.h" // 4J - added common ctor code. void FishingHook::_init() { diff --git a/Minecraft.World/Entities/Mobs/FishingHook.h b/Minecraft.World/net/minecraft/world/entity/projectile/FishingHook.h similarity index 100% rename from Minecraft.World/Entities/Mobs/FishingHook.h rename to Minecraft.World/net/minecraft/world/entity/projectile/FishingHook.h diff --git a/Minecraft.World/Entities/LargeFireball.cpp b/Minecraft.World/net/minecraft/world/entity/projectile/LargeFireball.cpp similarity index 87% rename from Minecraft.World/Entities/LargeFireball.cpp rename to Minecraft.World/net/minecraft/world/entity/projectile/LargeFireball.cpp index e99c7c0a1..361e22b13 100644 --- a/Minecraft.World/Entities/LargeFireball.cpp +++ b/Minecraft.World/net/minecraft/world/entity/projectile/LargeFireball.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.phys.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../phys/net.minecraft.world.phys.h" #include "LargeFireball.h" LargeFireball::LargeFireball(Level* level) : Fireball(level) { diff --git a/Minecraft.World/Entities/LargeFireball.h b/Minecraft.World/net/minecraft/world/entity/projectile/LargeFireball.h similarity index 96% rename from Minecraft.World/Entities/LargeFireball.h rename to Minecraft.World/net/minecraft/world/entity/projectile/LargeFireball.h index 6c525e8e1..54a53577c 100644 --- a/Minecraft.World/Entities/LargeFireball.h +++ b/Minecraft.World/net/minecraft/world/entity/projectile/LargeFireball.h @@ -1,6 +1,6 @@ #pragma once -#include "Mobs/Fireball.h" +#include "Fireball.h" class LargeFireball : public Fireball { public: diff --git a/Minecraft.World/Entities/Projectile.h b/Minecraft.World/net/minecraft/world/entity/projectile/Projectile.h similarity index 100% rename from Minecraft.World/Entities/Projectile.h rename to Minecraft.World/net/minecraft/world/entity/projectile/Projectile.h diff --git a/Minecraft.World/Entities/Mobs/SmallFireball.cpp b/Minecraft.World/net/minecraft/world/entity/projectile/SmallFireball.cpp similarity index 86% rename from Minecraft.World/Entities/Mobs/SmallFireball.cpp rename to Minecraft.World/net/minecraft/world/entity/projectile/SmallFireball.cpp index e20063a8f..95418faa8 100644 --- a/Minecraft.World/Entities/Mobs/SmallFireball.cpp +++ b/Minecraft.World/net/minecraft/world/entity/projectile/SmallFireball.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../net.minecraft.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../level/net.minecraft.world.level.h" #include "SmallFireball.h" SmallFireball::SmallFireball(Level* level) : Fireball(level) { diff --git a/Minecraft.World/Entities/Mobs/SmallFireball.h b/Minecraft.World/net/minecraft/world/entity/projectile/SmallFireball.h similarity index 100% rename from Minecraft.World/Entities/Mobs/SmallFireball.h rename to Minecraft.World/net/minecraft/world/entity/projectile/SmallFireball.h diff --git a/Minecraft.World/Entities/Mobs/Snowball.cpp b/Minecraft.World/net/minecraft/world/entity/projectile/Snowball.cpp similarity index 79% rename from Minecraft.World/Entities/Mobs/Snowball.cpp rename to Minecraft.World/net/minecraft/world/entity/projectile/Snowball.cpp index 81df4ebdc..3521e0d2f 100644 --- a/Minecraft.World/Entities/Mobs/Snowball.cpp +++ b/Minecraft.World/net/minecraft/world/entity/projectile/Snowball.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../monster/net.minecraft.world.entity.monster.h" #include "Snowball.h" void Snowball::_init() { diff --git a/Minecraft.World/Entities/Mobs/Snowball.h b/Minecraft.World/net/minecraft/world/entity/projectile/Snowball.h similarity index 94% rename from Minecraft.World/Entities/Mobs/Snowball.h rename to Minecraft.World/net/minecraft/world/entity/projectile/Snowball.h index 9300d0e59..d89f266e9 100644 --- a/Minecraft.World/Entities/Mobs/Snowball.h +++ b/Minecraft.World/net/minecraft/world/entity/projectile/Snowball.h @@ -1,6 +1,6 @@ #pragma once -#include "../Throwable.h" +#include "Throwable.h" class HitResult; diff --git a/Minecraft.World/Entities/Throwable.cpp b/Minecraft.World/net/minecraft/world/entity/projectile/Throwable.cpp similarity index 95% rename from Minecraft.World/Entities/Throwable.cpp rename to Minecraft.World/net/minecraft/world/entity/projectile/Throwable.cpp index 922104799..dd297c91f 100644 --- a/Minecraft.World/Entities/Throwable.cpp +++ b/Minecraft.World/net/minecraft/world/entity/projectile/Throwable.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/com.mojang.nbt.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../net.minecraft.world.entity.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" #include "Throwable.h" void Throwable::_throwableInit() { diff --git a/Minecraft.World/Entities/Throwable.h b/Minecraft.World/net/minecraft/world/entity/projectile/Throwable.h similarity index 98% rename from Minecraft.World/Entities/Throwable.h rename to Minecraft.World/net/minecraft/world/entity/projectile/Throwable.h index fa8c65746..893112fab 100644 --- a/Minecraft.World/Entities/Throwable.h +++ b/Minecraft.World/net/minecraft/world/entity/projectile/Throwable.h @@ -1,6 +1,6 @@ #pragma once -#include "Entity.h" +#include "../Entity.h" #include "Projectile.h" class Mob; diff --git a/Minecraft.World/Entities/Mobs/ThrownEgg.cpp b/Minecraft.World/net/minecraft/world/entity/projectile/ThrownEgg.cpp similarity index 84% rename from Minecraft.World/Entities/Mobs/ThrownEgg.cpp rename to Minecraft.World/net/minecraft/world/entity/projectile/ThrownEgg.cpp index a85425169..99f7596f1 100644 --- a/Minecraft.World/Entities/Mobs/ThrownEgg.cpp +++ b/Minecraft.World/net/minecraft/world/entity/projectile/ThrownEgg.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../animal/net.minecraft.world.entity.animal.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" #include "ThrownEgg.h" #include "../MobCategory.h" diff --git a/Minecraft.World/Entities/Mobs/ThrownEgg.h b/Minecraft.World/net/minecraft/world/entity/projectile/ThrownEgg.h similarity index 93% rename from Minecraft.World/Entities/Mobs/ThrownEgg.h rename to Minecraft.World/net/minecraft/world/entity/projectile/ThrownEgg.h index 4215eec8f..f97b1c6b0 100644 --- a/Minecraft.World/Entities/Mobs/ThrownEgg.h +++ b/Minecraft.World/net/minecraft/world/entity/projectile/ThrownEgg.h @@ -1,6 +1,6 @@ #pragma once -#include "../Throwable.h" +#include "Throwable.h" class HitResult; diff --git a/Minecraft.World/Entities/Mobs/ThrownEnderPearl.cpp b/Minecraft.World/net/minecraft/world/entity/projectile/ThrownEnderpearl.cpp similarity index 84% rename from Minecraft.World/Entities/Mobs/ThrownEnderPearl.cpp rename to Minecraft.World/net/minecraft/world/entity/projectile/ThrownEnderpearl.cpp index e7cfe2adf..a9d89c38e 100644 --- a/Minecraft.World/Entities/Mobs/ThrownEnderPearl.cpp +++ b/Minecraft.World/net/minecraft/world/entity/projectile/ThrownEnderpearl.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.damagesource.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../../Minecraft.Client/Player/ServerPlayer.h" -#include "../../../Minecraft.Client/Network/PlayerConnection.h" -#include "ThrownEnderPearl.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../net.minecraft.world.entity.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../../Minecraft.Client/net/minecraft/server/level/ServerPlayer.h" +#include "../../../Minecraft.Client/net/minecraft/server/network/PlayerConnection.h" +#include "ThrownEnderpearl.h" ThrownEnderpearl::ThrownEnderpearl(Level* level) : Throwable(level) { // 4J Stu - This function call had to be moved here from the Entity ctor to diff --git a/Minecraft.World/Entities/Mobs/ThrownEnderPearl.h b/Minecraft.World/net/minecraft/world/entity/projectile/ThrownEnderpearl.h similarity index 94% rename from Minecraft.World/Entities/Mobs/ThrownEnderPearl.h rename to Minecraft.World/net/minecraft/world/entity/projectile/ThrownEnderpearl.h index 29504b949..7dd19bd60 100644 --- a/Minecraft.World/Entities/Mobs/ThrownEnderPearl.h +++ b/Minecraft.World/net/minecraft/world/entity/projectile/ThrownEnderpearl.h @@ -1,6 +1,6 @@ #pragma once -#include "../Throwable.h" +#include "Throwable.h" class HitResult; diff --git a/Minecraft.World/Entities/Mobs/ThrownExpBottle.cpp b/Minecraft.World/net/minecraft/world/entity/projectile/ThrownExpBottle.cpp similarity index 82% rename from Minecraft.World/Entities/Mobs/ThrownExpBottle.cpp rename to Minecraft.World/net/minecraft/world/entity/projectile/ThrownExpBottle.cpp index df143c4e0..2d1d57240 100644 --- a/Minecraft.World/Entities/Mobs/ThrownExpBottle.cpp +++ b/Minecraft.World/net/minecraft/world/entity/projectile/ThrownExpBottle.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Util/JavaMath.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.entity.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../../../../ConsoleJavaLibs/JavaMath.h" #include "ThrownExpBottle.h" ThrownExpBottle::ThrownExpBottle(Level* level) : Throwable(level) {} diff --git a/Minecraft.World/Entities/Mobs/ThrownExpBottle.h b/Minecraft.World/net/minecraft/world/entity/projectile/ThrownExpBottle.h similarity index 95% rename from Minecraft.World/Entities/Mobs/ThrownExpBottle.h rename to Minecraft.World/net/minecraft/world/entity/projectile/ThrownExpBottle.h index 38740e12d..d3b83502b 100644 --- a/Minecraft.World/Entities/Mobs/ThrownExpBottle.h +++ b/Minecraft.World/net/minecraft/world/entity/projectile/ThrownExpBottle.h @@ -1,6 +1,6 @@ #pragma once -#include "../Throwable.h" +#include "Throwable.h" class HitResult; diff --git a/Minecraft.World/Entities/Mobs/ThrownPotion.cpp b/Minecraft.World/net/minecraft/world/entity/projectile/ThrownPotion.cpp similarity index 92% rename from Minecraft.World/Entities/Mobs/ThrownPotion.cpp rename to Minecraft.World/net/minecraft/world/entity/projectile/ThrownPotion.cpp index cdf8df7d4..ad6826707 100644 --- a/Minecraft.World/Entities/Mobs/ThrownPotion.cpp +++ b/Minecraft.World/net/minecraft/world/entity/projectile/ThrownPotion.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.effect.h" -#include "../../Util/SharedConstants.h" -#include "../../Util/JavaMath.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../effect/net.minecraft.world.effect.h" +#include "../../../SharedConstants.h" +#include "../../../../../ConsoleJavaLibs/JavaMath.h" #include "ThrownPotion.h" const double ThrownPotion::SPLASH_RANGE = 4.0; diff --git a/Minecraft.World/Entities/Mobs/ThrownPotion.h b/Minecraft.World/net/minecraft/world/entity/projectile/ThrownPotion.h similarity index 97% rename from Minecraft.World/Entities/Mobs/ThrownPotion.h rename to Minecraft.World/net/minecraft/world/entity/projectile/ThrownPotion.h index 2890f1c19..e7773ddf5 100644 --- a/Minecraft.World/Entities/Mobs/ThrownPotion.h +++ b/Minecraft.World/net/minecraft/world/entity/projectile/ThrownPotion.h @@ -1,6 +1,6 @@ #pragma once -#include "../Throwable.h" +#include "Throwable.h" class HitResult; diff --git a/Minecraft.World/Entities/WitherSkull.cpp b/Minecraft.World/net/minecraft/world/entity/projectile/WitherSkull.cpp similarity index 88% rename from Minecraft.World/Entities/WitherSkull.cpp rename to Minecraft.World/net/minecraft/world/entity/projectile/WitherSkull.cpp index 2291341db..89ef57fab 100644 --- a/Minecraft.World/Entities/WitherSkull.cpp +++ b/Minecraft.World/net/minecraft/world/entity/projectile/WitherSkull.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/net.minecraft.world.effect.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.phys.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../effect/net.minecraft.world.effect.h" +#include "../net.minecraft.world.entity.h" +#include "../../level/net.minecraft.world.level.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" #include "WitherSkull.h" WitherSkull::WitherSkull(Level* level) : Fireball(level) { diff --git a/Minecraft.World/Entities/WitherSkull.h b/Minecraft.World/net/minecraft/world/entity/projectile/WitherSkull.h similarity index 97% rename from Minecraft.World/Entities/WitherSkull.h rename to Minecraft.World/net/minecraft/world/entity/projectile/WitherSkull.h index 3ab4d7846..d8f9fca8b 100644 --- a/Minecraft.World/Entities/WitherSkull.h +++ b/Minecraft.World/net/minecraft/world/entity/projectile/WitherSkull.h @@ -1,6 +1,6 @@ #pragma once -#include "Mobs/Fireball.h" +#include "Fireball.h" class WitherSkull : public Fireball { public: diff --git a/Minecraft.World/net/minecraft/world/entity/projectile/net.minecraft.world.entity.projectile.h b/Minecraft.World/net/minecraft/world/entity/projectile/net.minecraft.world.entity.projectile.h new file mode 100644 index 000000000..aa10571e0 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/entity/projectile/net.minecraft.world.entity.projectile.h @@ -0,0 +1,24 @@ +#pragma once + +#include "Arrow.h" +#include "Fireball.h" +#include "FishingHook.h" +#include "Snowball.h" +#include "ThrownEgg.h" + +// 1.0.1 +#include "EyeOfEnderSignal.h" +#include "SmallFireball.h" +#include "Throwable.h" +#include "ThrownEnderpearl.h" +#include "ThrownPotion.h" +#include "ThrownExpBottle.h" // Brought forward from 1.2 + +// Added TU 9 +#include "DragonFireball.h" + +// 1.6.4 +#include "FireworksRocketEntity.h" +#include "LargeFireball.h" +#include "Projectile.h" +#include "WitherSkull.h" \ No newline at end of file diff --git a/Minecraft.World/Util/FoodConstants.cpp b/Minecraft.World/net/minecraft/world/food/FoodConstants.cpp similarity index 97% rename from Minecraft.World/Util/FoodConstants.cpp rename to Minecraft.World/net/minecraft/world/food/FoodConstants.cpp index 0b011df5a..8a894636c 100644 --- a/Minecraft.World/Util/FoodConstants.cpp +++ b/Minecraft.World/net/minecraft/world/food/FoodConstants.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "FoodConstants.h" diff --git a/Minecraft.World/Util/FoodConstants.h b/Minecraft.World/net/minecraft/world/food/FoodConstants.h similarity index 100% rename from Minecraft.World/Util/FoodConstants.h rename to Minecraft.World/net/minecraft/world/food/FoodConstants.h diff --git a/Minecraft.World/Player/FoodData.cpp b/Minecraft.World/net/minecraft/world/food/FoodData.cpp similarity index 91% rename from Minecraft.World/Player/FoodData.cpp rename to Minecraft.World/net/minecraft/world/food/FoodData.cpp index cdbc25d93..0138bbdd6 100644 --- a/Minecraft.World/Player/FoodData.cpp +++ b/Minecraft.World/net/minecraft/world/food/FoodData.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/com.mojang.nbt.h" -#include "../Util/FoodConstants.h" +#include "../../../../Header Files/stdafx.h" +#include "../item/net.minecraft.world.item.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" +#include "../net.minecraft.world.h" +#include "../damageSource/net.minecraft.world.damagesource.h" +#include "../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "FoodConstants.h" #include "FoodData.h" FoodData::FoodData() { diff --git a/Minecraft.World/Player/FoodData.h b/Minecraft.World/net/minecraft/world/food/FoodData.h similarity index 100% rename from Minecraft.World/Player/FoodData.h rename to Minecraft.World/net/minecraft/world/food/FoodData.h diff --git a/Minecraft.World/net/minecraft/world/food/net.minecraft.world.food.h b/Minecraft.World/net/minecraft/world/food/net.minecraft.world.food.h new file mode 100644 index 000000000..91b1916a8 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/food/net.minecraft.world.food.h @@ -0,0 +1,4 @@ +#pragma once + +#include "FoodConstants.h" +#include "FoodData.h" \ No newline at end of file diff --git a/Minecraft.World/Containers/AbstractContainerMenu.cpp b/Minecraft.World/net/minecraft/world/inventory/AbstractContainerMenu.cpp similarity index 99% rename from Minecraft.World/Containers/AbstractContainerMenu.cpp rename to Minecraft.World/net/minecraft/world/inventory/AbstractContainerMenu.cpp index 2a8a89929..bfac470be 100644 --- a/Minecraft.World/Containers/AbstractContainerMenu.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/AbstractContainerMenu.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.redstone.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../item/net.minecraft.world.item.h" +#include "../level/redstone/net.minecraft.world.level.redstone.h" #include "Slot.h" #include "AbstractContainerMenu.h" diff --git a/Minecraft.World/Containers/AbstractContainerMenu.h b/Minecraft.World/net/minecraft/world/inventory/AbstractContainerMenu.h similarity index 97% rename from Minecraft.World/Containers/AbstractContainerMenu.h rename to Minecraft.World/net/minecraft/world/inventory/AbstractContainerMenu.h index 9b24bf03b..4bfb690c5 100644 --- a/Minecraft.World/Containers/AbstractContainerMenu.h +++ b/Minecraft.World/net/minecraft/world/inventory/AbstractContainerMenu.h @@ -1,7 +1,7 @@ #pragma once -#include "../Player/Player.h" -#include "../Headers/net.minecraft.world.inventory.ContainerListener.h" +#include "../entity/player/Player.h" +#include "net.minecraft.world.inventory.ContainerListener.h" using net_minecraft_world_inventory::ContainerListener; class Inventory; diff --git a/Minecraft.World/Containers/AnimalChest.cpp b/Minecraft.World/net/minecraft/world/inventory/AnimalChest.cpp similarity index 88% rename from Minecraft.World/Containers/AnimalChest.cpp rename to Minecraft.World/net/minecraft/world/inventory/AnimalChest.cpp index 5014152f7..483784c4c 100644 --- a/Minecraft.World/Containers/AnimalChest.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/AnimalChest.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "AnimalChest.h" diff --git a/Minecraft.World/Containers/AnimalChest.h b/Minecraft.World/net/minecraft/world/inventory/AnimalChest.h similarity index 88% rename from Minecraft.World/Containers/AnimalChest.h rename to Minecraft.World/net/minecraft/world/inventory/AnimalChest.h index 122757c6d..7d4fdbe69 100644 --- a/Minecraft.World/Containers/AnimalChest.h +++ b/Minecraft.World/net/minecraft/world/inventory/AnimalChest.h @@ -1,6 +1,6 @@ #pragma once -#include "SimpleContainer.h" +#include "../SimpleContainer.h" class AnimalChest : public SimpleContainer { public: diff --git a/Minecraft.World/Containers/AnvilMenu.cpp b/Minecraft.World/net/minecraft/world/inventory/AnvilMenu.cpp similarity index 97% rename from Minecraft.World/Containers/AnvilMenu.cpp rename to Minecraft.World/net/minecraft/world/inventory/AnvilMenu.cpp index 03bf9509b..9f27460cb 100644 --- a/Minecraft.World/Containers/AnvilMenu.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/AnvilMenu.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.inventory.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.world.inventory.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" +#include "../item/net.minecraft.world.item.h" +#include "../item/enchantment/net.minecraft.world.item.enchantment.h" #include "AnvilMenu.h" AnvilMenu::AnvilMenu(std::shared_ptr inventory, Level* level, int xt, diff --git a/Minecraft.World/Containers/AnvilMenu.h b/Minecraft.World/net/minecraft/world/inventory/AnvilMenu.h similarity index 100% rename from Minecraft.World/Containers/AnvilMenu.h rename to Minecraft.World/net/minecraft/world/inventory/AnvilMenu.h diff --git a/Minecraft.World/Containers/ArmorSlot.cpp b/Minecraft.World/net/minecraft/world/inventory/ArmorSlot.cpp similarity index 85% rename from Minecraft.World/Containers/ArmorSlot.cpp rename to Minecraft.World/net/minecraft/world/inventory/ArmorSlot.cpp index d2d182c4f..722905f37 100644 --- a/Minecraft.World/Containers/ArmorSlot.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/ArmorSlot.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.inventory.h" -#include "../Headers/net.minecraft.world.item.crafting.h" +#include "../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.h" +#include "../item/net.minecraft.world.item.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "net.minecraft.world.inventory.h" +#include "../item/crafting/net.minecraft.world.item.crafting.h" #include "ArmorSlot.h" ArmorSlot::ArmorSlot(int slotNum, std::shared_ptr container, int id, diff --git a/Minecraft.World/Containers/ArmorSlot.h b/Minecraft.World/net/minecraft/world/inventory/ArmorSlot.h similarity index 100% rename from Minecraft.World/Containers/ArmorSlot.h rename to Minecraft.World/net/minecraft/world/inventory/ArmorSlot.h diff --git a/Minecraft.World/Containers/BeaconMenu.cpp b/Minecraft.World/net/minecraft/world/inventory/BeaconMenu.cpp similarity index 95% rename from Minecraft.World/Containers/BeaconMenu.cpp rename to Minecraft.World/net/minecraft/world/inventory/BeaconMenu.cpp index b27776e83..805d77393 100644 --- a/Minecraft.World/Containers/BeaconMenu.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/BeaconMenu.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" +#include "../../../../Header Files/stdafx.h" +#include "../item/net.minecraft.world.item.h" +#include "../level/tile/entity/net.minecraft.world.level.tile.entity.h" #include "BeaconMenu.h" BeaconMenu::BeaconMenu(std::shared_ptr inventory, diff --git a/Minecraft.World/Containers/BeaconMenu.h b/Minecraft.World/net/minecraft/world/inventory/BeaconMenu.h similarity index 100% rename from Minecraft.World/Containers/BeaconMenu.h rename to Minecraft.World/net/minecraft/world/inventory/BeaconMenu.h diff --git a/Minecraft.World/Containers/BrewingStandMenu.cpp b/Minecraft.World/net/minecraft/world/inventory/BrewingStandMenu.cpp similarity index 96% rename from Minecraft.World/Containers/BrewingStandMenu.cpp rename to Minecraft.World/net/minecraft/world/inventory/BrewingStandMenu.cpp index 78e152661..6b2707111 100644 --- a/Minecraft.World/Containers/BrewingStandMenu.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/BrewingStandMenu.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.item.alchemy.h" -#include "../Headers/net.minecraft.stats.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../item/net.minecraft.world.item.h" +#include "../item/alchemy/net.minecraft.world.item.alchemy.h" +#include "../../stats/net.minecraft.stats.h" #include "BrewingStandMenu.h" BrewingStandMenu::BrewingStandMenu( diff --git a/Minecraft.World/Containers/BrewingStandMenu.h b/Minecraft.World/net/minecraft/world/inventory/BrewingStandMenu.h similarity index 100% rename from Minecraft.World/Containers/BrewingStandMenu.h rename to Minecraft.World/net/minecraft/world/inventory/BrewingStandMenu.h diff --git a/Minecraft.World/Containers/ContainerMenu.cpp b/Minecraft.World/net/minecraft/world/inventory/ContainerMenu.cpp similarity index 90% rename from Minecraft.World/Containers/ContainerMenu.cpp rename to Minecraft.World/net/minecraft/world/inventory/ContainerMenu.cpp index 6a5b71bdd..9e3a6aced 100644 --- a/Minecraft.World/Containers/ContainerMenu.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/ContainerMenu.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "Container.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../../Header Files/stdafx.h" +#include "../Container.h" +#include "../item/net.minecraft.world.item.h" #include "Slot.h" -#include "../Stats/GenericStats.h" -#include "../../Minecraft.Client/GameState/StatsCounter.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/LocalPlayer.h" +#include "../../stats/GenericStats.h" +#include "../../Minecraft.Client/net/minecraft/stats/StatsCounter.h" +#include "../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../../Minecraft.Client/net/minecraft/client/player/LocalPlayer.h" #include "ContainerMenu.h" ContainerMenu::ContainerMenu(std::shared_ptr inventory, diff --git a/Minecraft.World/Containers/ContainerMenu.h b/Minecraft.World/net/minecraft/world/inventory/ContainerMenu.h similarity index 100% rename from Minecraft.World/Containers/ContainerMenu.h rename to Minecraft.World/net/minecraft/world/inventory/ContainerMenu.h diff --git a/Minecraft.World/Containers/CraftingContainer.cpp b/Minecraft.World/net/minecraft/world/inventory/CraftingContainer.cpp similarity index 94% rename from Minecraft.World/Containers/CraftingContainer.cpp rename to Minecraft.World/net/minecraft/world/inventory/CraftingContainer.cpp index 8b0ef17ec..8420a20ac 100644 --- a/Minecraft.World/Containers/CraftingContainer.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/CraftingContainer.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../item/net.minecraft.world.item.h" #include "AbstractContainerMenu.h" #include "CraftingContainer.h" diff --git a/Minecraft.World/Containers/CraftingContainer.h b/Minecraft.World/net/minecraft/world/inventory/CraftingContainer.h similarity index 97% rename from Minecraft.World/Containers/CraftingContainer.h rename to Minecraft.World/net/minecraft/world/inventory/CraftingContainer.h index 71e7eb524..cf5f04238 100644 --- a/Minecraft.World/Containers/CraftingContainer.h +++ b/Minecraft.World/net/minecraft/world/inventory/CraftingContainer.h @@ -1,6 +1,6 @@ #pragma once -#include "Container.h" +#include "../Container.h" class AbstractContainerMenu; diff --git a/Minecraft.World/Containers/CraftingMenu.cpp b/Minecraft.World/net/minecraft/world/inventory/CraftingMenu.cpp similarity index 93% rename from Minecraft.World/Containers/CraftingMenu.cpp rename to Minecraft.World/net/minecraft/world/inventory/CraftingMenu.cpp index e433bcaa3..38fd6772b 100644 --- a/Minecraft.World/Containers/CraftingMenu.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/CraftingMenu.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.item.crafting.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../item/net.minecraft.world.item.h" +#include "../item/crafting/net.minecraft.world.item.crafting.h" #include "CraftingContainer.h" #include "ResultContainer.h" #include "ResultSlot.h" diff --git a/Minecraft.World/Containers/CraftingMenu.h b/Minecraft.World/net/minecraft/world/inventory/CraftingMenu.h similarity index 100% rename from Minecraft.World/Containers/CraftingMenu.h rename to Minecraft.World/net/minecraft/world/inventory/CraftingMenu.h diff --git a/Minecraft.World/Containers/EnchantmentContainer.cpp b/Minecraft.World/net/minecraft/world/inventory/EnchantmentContainer.cpp similarity index 85% rename from Minecraft.World/Containers/EnchantmentContainer.cpp rename to Minecraft.World/net/minecraft/world/inventory/EnchantmentContainer.cpp index 1cf3e214f..385680ae5 100644 --- a/Minecraft.World/Containers/EnchantmentContainer.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/EnchantmentContainer.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.inventory.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.world.inventory.h" #include "EnchantmentContainer.h" EnchantmentContainer::EnchantmentContainer(EnchantmentMenu* menu) diff --git a/Minecraft.World/Containers/EnchantmentContainer.h b/Minecraft.World/net/minecraft/world/inventory/EnchantmentContainer.h similarity index 93% rename from Minecraft.World/Containers/EnchantmentContainer.h rename to Minecraft.World/net/minecraft/world/inventory/EnchantmentContainer.h index a8717f0fd..2c58bdd7f 100644 --- a/Minecraft.World/Containers/EnchantmentContainer.h +++ b/Minecraft.World/net/minecraft/world/inventory/EnchantmentContainer.h @@ -3,7 +3,7 @@ // In EnchantmentMenu.java they create an anoymous class while creating the // container. I have moved the content of that anonymous class to here -#include "SimpleContainer.h" +#include "../SimpleContainer.h" class EnchantmentMenu; diff --git a/Minecraft.World/Containers/EnchantmentMenu.cpp b/Minecraft.World/net/minecraft/world/inventory/EnchantmentMenu.cpp similarity index 95% rename from Minecraft.World/Containers/EnchantmentMenu.cpp rename to Minecraft.World/net/minecraft/world/inventory/EnchantmentMenu.cpp index c60469ea2..ff4b8946a 100644 --- a/Minecraft.World/Containers/EnchantmentMenu.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/EnchantmentMenu.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.inventory.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "net.minecraft.world.inventory.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../item/net.minecraft.world.item.h" +#include "../item/enchantment/net.minecraft.world.item.enchantment.h" #include "EnchantmentMenu.h" EnchantmentMenu::EnchantmentMenu(std::shared_ptr inventory, diff --git a/Minecraft.World/Containers/EnchantmentMenu.h b/Minecraft.World/net/minecraft/world/inventory/EnchantmentMenu.h similarity index 96% rename from Minecraft.World/Containers/EnchantmentMenu.h rename to Minecraft.World/net/minecraft/world/inventory/EnchantmentMenu.h index 0d189607a..6f95b6467 100644 --- a/Minecraft.World/Containers/EnchantmentMenu.h +++ b/Minecraft.World/net/minecraft/world/inventory/EnchantmentMenu.h @@ -1,6 +1,6 @@ #pragma once #include "AbstractContainerMenu.h" -#include "../Util/Random.h" +#include "../../../../ConsoleJavaLibs/Random.h" class EnchantmentMenu : public AbstractContainerMenu { // 4J Stu Made these public for UI menus, perhaps should make friend class? diff --git a/Minecraft.World/Containers/EnchantmentSlot.h b/Minecraft.World/net/minecraft/world/inventory/EnchantmentSlot.h similarity index 100% rename from Minecraft.World/Containers/EnchantmentSlot.h rename to Minecraft.World/net/minecraft/world/inventory/EnchantmentSlot.h diff --git a/Minecraft.World/Containers/FireworksMenu.cpp b/Minecraft.World/net/minecraft/world/inventory/FireworksMenu.cpp similarity index 93% rename from Minecraft.World/Containers/FireworksMenu.cpp rename to Minecraft.World/net/minecraft/world/inventory/FireworksMenu.cpp index 3a47b2c8a..c6d0d267b 100644 --- a/Minecraft.World/Containers/FireworksMenu.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/FireworksMenu.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.item.crafting.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../item/net.minecraft.world.item.h" +#include "../item/crafting/net.minecraft.world.item.crafting.h" #include "CraftingContainer.h" #include "ResultContainer.h" #include "ResultSlot.h" diff --git a/Minecraft.World/Containers/FireworksMenu.h b/Minecraft.World/net/minecraft/world/inventory/FireworksMenu.h similarity index 100% rename from Minecraft.World/Containers/FireworksMenu.h rename to Minecraft.World/net/minecraft/world/inventory/FireworksMenu.h diff --git a/Minecraft.World/Containers/FurnaceMenu.cpp b/Minecraft.World/net/minecraft/world/inventory/FurnaceMenu.cpp similarity index 94% rename from Minecraft.World/Containers/FurnaceMenu.cpp rename to Minecraft.World/net/minecraft/world/inventory/FurnaceMenu.cpp index f6077079f..69fe5d1ad 100644 --- a/Minecraft.World/Containers/FurnaceMenu.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/FurnaceMenu.cpp @@ -1,12 +1,12 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../item/net.minecraft.world.item.h" +#include "../level/tile/entity/net.minecraft.world.level.tile.entity.h" #include "FurnaceResultSlot.h" #include "Slot.h" -#include "../Stats/GenericStats.h" +#include "../../stats/GenericStats.h" #include "FurnaceMenu.h" -#include "../Recipes/FurnaceRecipes.h" +#include "../item/crafting/FurnaceRecipes.h" FurnaceMenu::FurnaceMenu(std::shared_ptr inventory, std::shared_ptr furnace) diff --git a/Minecraft.World/Containers/FurnaceMenu.h b/Minecraft.World/net/minecraft/world/inventory/FurnaceMenu.h similarity index 100% rename from Minecraft.World/Containers/FurnaceMenu.h rename to Minecraft.World/net/minecraft/world/inventory/FurnaceMenu.h diff --git a/Minecraft.World/Containers/FurnaceResultSlot.cpp b/Minecraft.World/net/minecraft/world/inventory/FurnaceResultSlot.cpp similarity index 85% rename from Minecraft.World/Containers/FurnaceResultSlot.cpp rename to Minecraft.World/net/minecraft/world/inventory/FurnaceResultSlot.cpp index f53bb2fd3..359fbfdd7 100644 --- a/Minecraft.World/Containers/FurnaceResultSlot.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/FurnaceResultSlot.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.stats.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.item.crafting.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Util/JavaMath.h" +#include "../../../../Header Files/stdafx.h" +#include "../../stats/net.minecraft.stats.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../entity/net.minecraft.world.entity.h" +#include "../item/crafting/net.minecraft.world.item.crafting.h" +#include "../level/net.minecraft.world.level.h" +#include "../item/net.minecraft.world.item.h" +#include "../../../../ConsoleJavaLibs/JavaMath.h" #include "FurnaceResultSlot.h" FurnaceResultSlot::FurnaceResultSlot(std::shared_ptr player, diff --git a/Minecraft.World/Containers/FurnaceResultSlot.h b/Minecraft.World/net/minecraft/world/inventory/FurnaceResultSlot.h similarity index 100% rename from Minecraft.World/Containers/FurnaceResultSlot.h rename to Minecraft.World/net/minecraft/world/inventory/FurnaceResultSlot.h diff --git a/Minecraft.World/Containers/HopperMenu.cpp b/Minecraft.World/net/minecraft/world/inventory/HopperMenu.cpp similarity index 95% rename from Minecraft.World/Containers/HopperMenu.cpp rename to Minecraft.World/net/minecraft/world/inventory/HopperMenu.cpp index 6f7d24f5a..e0ba80eca 100644 --- a/Minecraft.World/Containers/HopperMenu.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/HopperMenu.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.inventory.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.world.inventory.h" #include "HopperMenu.h" HopperMenu::HopperMenu(std::shared_ptr inventory, diff --git a/Minecraft.World/Containers/HopperMenu.h b/Minecraft.World/net/minecraft/world/inventory/HopperMenu.h similarity index 100% rename from Minecraft.World/Containers/HopperMenu.h rename to Minecraft.World/net/minecraft/world/inventory/HopperMenu.h diff --git a/Minecraft.World/Containers/HorseInventoryMenu.cpp b/Minecraft.World/net/minecraft/world/inventory/HorseInventoryMenu.cpp similarity index 96% rename from Minecraft.World/Containers/HorseInventoryMenu.cpp rename to Minecraft.World/net/minecraft/world/inventory/HorseInventoryMenu.cpp index 084b11807..2beea1759 100644 --- a/Minecraft.World/Containers/HorseInventoryMenu.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/HorseInventoryMenu.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.entity.animal.h" +#include "../../../../Header Files/stdafx.h" +#include "../item/net.minecraft.world.item.h" +#include "../entity/animal/net.minecraft.world.entity.animal.h" #include "HorseInventoryMenu.h" HorseSaddleSlot::HorseSaddleSlot(std::shared_ptr horseInventory) diff --git a/Minecraft.World/Containers/HorseInventoryMenu.h b/Minecraft.World/net/minecraft/world/inventory/HorseInventoryMenu.h similarity index 100% rename from Minecraft.World/Containers/HorseInventoryMenu.h rename to Minecraft.World/net/minecraft/world/inventory/HorseInventoryMenu.h diff --git a/Minecraft.World/Containers/InventoryMenu.cpp b/Minecraft.World/net/minecraft/world/inventory/InventoryMenu.cpp similarity index 97% rename from Minecraft.World/Containers/InventoryMenu.cpp rename to Minecraft.World/net/minecraft/world/inventory/InventoryMenu.cpp index 07b9e29cf..b2542d2ac 100644 --- a/Minecraft.World/Containers/InventoryMenu.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/InventoryMenu.cpp @@ -1,14 +1,14 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.item.crafting.h" -#include "../Headers/net.minecraft.world.entity.player.h" +#include "../../../../Header Files/stdafx.h" +#include "../item/net.minecraft.world.item.h" +#include "../item/crafting/net.minecraft.world.item.crafting.h" +#include "../entity/player/net.minecraft.world.entity.player.h" #include "ResultSlot.h" #include "ArmorSlot.h" #include "CraftingContainer.h" #include "ResultContainer.h" #include "InventoryMenu.h" -#include "../Blocks/Tile.h" -#include "../Stats/GenericStats.h" +#include "../level/tile/Tile.h" +#include "../../stats/GenericStats.h" const int InventoryMenu::RESULT_SLOT = 0; const int InventoryMenu::CRAFT_SLOT_START = 1; diff --git a/Minecraft.World/Containers/InventoryMenu.h b/Minecraft.World/net/minecraft/world/inventory/InventoryMenu.h similarity index 100% rename from Minecraft.World/Containers/InventoryMenu.h rename to Minecraft.World/net/minecraft/world/inventory/InventoryMenu.h diff --git a/Minecraft.World/Containers/MenuBackup.cpp b/Minecraft.World/net/minecraft/world/inventory/MenuBackup.cpp similarity index 89% rename from Minecraft.World/Containers/MenuBackup.cpp rename to Minecraft.World/net/minecraft/world/inventory/MenuBackup.cpp index 4e4c98d31..da4739832 100644 --- a/Minecraft.World/Containers/MenuBackup.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/MenuBackup.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.entity.player.h" +#include "../../../../Header Files/stdafx.h" +#include "../item/net.minecraft.world.item.h" +#include "../entity/player/net.minecraft.world.entity.player.h" #include "AbstractContainerMenu.h" #include "Slot.h" #include "MenuBackup.h" diff --git a/Minecraft.World/Containers/MenuBackup.h b/Minecraft.World/net/minecraft/world/inventory/MenuBackup.h similarity index 100% rename from Minecraft.World/Containers/MenuBackup.h rename to Minecraft.World/net/minecraft/world/inventory/MenuBackup.h diff --git a/Minecraft.World/Containers/MerchantContainer.cpp b/Minecraft.World/net/minecraft/world/inventory/MerchantContainer.cpp similarity index 97% rename from Minecraft.World/Containers/MerchantContainer.cpp rename to Minecraft.World/net/minecraft/world/inventory/MerchantContainer.cpp index 09636249d..813ef8309 100644 --- a/Minecraft.World/Containers/MerchantContainer.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/MerchantContainer.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.trading.h" +#include "../../../../Header Files/stdafx.h" +#include "../item/trading/net.minecraft.world.item.trading.h" #include "MerchantMenu.h" #include "MerchantContainer.h" diff --git a/Minecraft.World/Containers/MerchantContainer.h b/Minecraft.World/net/minecraft/world/inventory/MerchantContainer.h similarity index 93% rename from Minecraft.World/Containers/MerchantContainer.h rename to Minecraft.World/net/minecraft/world/inventory/MerchantContainer.h index 76c676a9c..48088e32c 100644 --- a/Minecraft.World/Containers/MerchantContainer.h +++ b/Minecraft.World/net/minecraft/world/inventory/MerchantContainer.h @@ -1,7 +1,7 @@ #pragma once -#include "Container.h" -#include "../Util/ArrayWithLength.h" +#include "../Container.h" +#include "../../../../ConsoleHelpers/ArrayWithLength.h" class Merchant; class Player; diff --git a/Minecraft.World/Containers/MerchantMenu.cpp b/Minecraft.World/net/minecraft/world/inventory/MerchantMenu.cpp similarity index 93% rename from Minecraft.World/Containers/MerchantMenu.cpp rename to Minecraft.World/net/minecraft/world/inventory/MerchantMenu.cpp index 807b26a7a..1e0a3ce3f 100644 --- a/Minecraft.World/Containers/MerchantMenu.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/MerchantMenu.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.inventory.h" -#include "../Headers/net.minecraft.world.item.trading.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "net.minecraft.world.inventory.h" +#include "../item/trading/net.minecraft.world.item.trading.h" +#include "../level/net.minecraft.world.level.h" #include "MerchantMenu.h" MerchantMenu::MerchantMenu(std::shared_ptr inventory, diff --git a/Minecraft.World/Containers/MerchantMenu.h b/Minecraft.World/net/minecraft/world/inventory/MerchantMenu.h similarity index 100% rename from Minecraft.World/Containers/MerchantMenu.h rename to Minecraft.World/net/minecraft/world/inventory/MerchantMenu.h diff --git a/Minecraft.World/Containers/MerchantResultSlot.cpp b/Minecraft.World/net/minecraft/world/inventory/MerchantResultSlot.cpp similarity index 95% rename from Minecraft.World/Containers/MerchantResultSlot.cpp rename to Minecraft.World/net/minecraft/world/inventory/MerchantResultSlot.cpp index 289f90788..6e9b44332 100644 --- a/Minecraft.World/Containers/MerchantResultSlot.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/MerchantResultSlot.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.inventory.h" -#include "../Headers/net.minecraft.world.item.trading.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.world.inventory.h" +#include "../item/trading/net.minecraft.world.item.trading.h" #include "MerchantResultSlot.h" MerchantResultSlot::MerchantResultSlot(Player* player, diff --git a/Minecraft.World/Containers/MerchantResultSlot.h b/Minecraft.World/net/minecraft/world/inventory/MerchantResultSlot.h similarity index 100% rename from Minecraft.World/Containers/MerchantResultSlot.h rename to Minecraft.World/net/minecraft/world/inventory/MerchantResultSlot.h diff --git a/Minecraft.World/Player/PlayerEnderChestContainer.cpp b/Minecraft.World/net/minecraft/world/inventory/PlayerEnderChestContainer.cpp similarity index 92% rename from Minecraft.World/Player/PlayerEnderChestContainer.cpp rename to Minecraft.World/net/minecraft/world/inventory/PlayerEnderChestContainer.cpp index eaae3ba2c..7e1bcaa28 100644 --- a/Minecraft.World/Player/PlayerEnderChestContainer.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/PlayerEnderChestContainer.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "../Network/Packets/ContainerOpenPacket.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../network/packet/ContainerOpenPacket.h" #include "PlayerEnderChestContainer.h" PlayerEnderChestContainer::PlayerEnderChestContainer() diff --git a/Minecraft.World/Player/PlayerEnderChestContainer.h b/Minecraft.World/net/minecraft/world/inventory/PlayerEnderChestContainer.h similarity index 93% rename from Minecraft.World/Player/PlayerEnderChestContainer.h rename to Minecraft.World/net/minecraft/world/inventory/PlayerEnderChestContainer.h index a3ff584c4..3331421dd 100644 --- a/Minecraft.World/Player/PlayerEnderChestContainer.h +++ b/Minecraft.World/net/minecraft/world/inventory/PlayerEnderChestContainer.h @@ -1,6 +1,6 @@ #pragma once -#include "../Containers/SimpleContainer.h" +#include "../SimpleContainer.h" class EnderChestTileEntity; diff --git a/Minecraft.World/Containers/RepairContainer.cpp b/Minecraft.World/net/minecraft/world/inventory/RepairContainer.cpp similarity index 91% rename from Minecraft.World/Containers/RepairContainer.cpp rename to Minecraft.World/net/minecraft/world/inventory/RepairContainer.cpp index 53dfa21c5..29a180d70 100644 --- a/Minecraft.World/Containers/RepairContainer.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/RepairContainer.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "AnvilMenu.h" #include "RepairContainer.h" diff --git a/Minecraft.World/Containers/RepairContainer.h b/Minecraft.World/net/minecraft/world/inventory/RepairContainer.h similarity index 92% rename from Minecraft.World/Containers/RepairContainer.h rename to Minecraft.World/net/minecraft/world/inventory/RepairContainer.h index 1494a1099..66945e73a 100644 --- a/Minecraft.World/Containers/RepairContainer.h +++ b/Minecraft.World/net/minecraft/world/inventory/RepairContainer.h @@ -1,6 +1,6 @@ #pragma once -#include "SimpleContainer.h" +#include "../SimpleContainer.h" class AnvilMenu; diff --git a/Minecraft.World/Containers/RepairResultSlot.cpp b/Minecraft.World/net/minecraft/world/inventory/RepairResultSlot.cpp similarity index 90% rename from Minecraft.World/Containers/RepairResultSlot.cpp rename to Minecraft.World/net/minecraft/world/inventory/RepairResultSlot.cpp index 75a1318df..f628fe64d 100644 --- a/Minecraft.World/Containers/RepairResultSlot.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/RepairResultSlot.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.inventory.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.entity.player.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.world.inventory.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../entity/player/net.minecraft.world.entity.player.h" #include "RepairResultSlot.h" RepairResultSlot::RepairResultSlot(AnvilMenu* menu, int xt, int yt, int zt, diff --git a/Minecraft.World/Containers/RepairResultSlot.h b/Minecraft.World/net/minecraft/world/inventory/RepairResultSlot.h similarity index 100% rename from Minecraft.World/Containers/RepairResultSlot.h rename to Minecraft.World/net/minecraft/world/inventory/RepairResultSlot.h diff --git a/Minecraft.World/Containers/ResultContainer.cpp b/Minecraft.World/net/minecraft/world/inventory/ResultContainer.cpp similarity index 93% rename from Minecraft.World/Containers/ResultContainer.cpp rename to Minecraft.World/net/minecraft/world/inventory/ResultContainer.cpp index c95258bd2..c5aad0465 100644 --- a/Minecraft.World/Containers/ResultContainer.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/ResultContainer.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" #include "ResultContainer.h" ResultContainer::ResultContainer() : Container() {} diff --git a/Minecraft.World/Containers/ResultContainer.h b/Minecraft.World/net/minecraft/world/inventory/ResultContainer.h similarity index 97% rename from Minecraft.World/Containers/ResultContainer.h rename to Minecraft.World/net/minecraft/world/inventory/ResultContainer.h index dc4ff7a9e..1124c0d3a 100644 --- a/Minecraft.World/Containers/ResultContainer.h +++ b/Minecraft.World/net/minecraft/world/inventory/ResultContainer.h @@ -1,6 +1,6 @@ #pragma once -#include "Container.h" +#include "../Container.h" class ResultContainer : public Container { private: diff --git a/Minecraft.World/Containers/ResultSlot.cpp b/Minecraft.World/net/minecraft/world/inventory/ResultSlot.cpp similarity index 93% rename from Minecraft.World/Containers/ResultSlot.cpp rename to Minecraft.World/net/minecraft/world/inventory/ResultSlot.cpp index 21ba38854..7f46be655 100644 --- a/Minecraft.World/Containers/ResultSlot.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/ResultSlot.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "Container.h" -#include "../Headers/net.minecraft.stats.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../../../../Header Files/stdafx.h" +#include "../Container.h" +#include "../../stats/net.minecraft.stats.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../item/net.minecraft.world.item.h" +#include "../level/tile/net.minecraft.world.level.tile.h" #include "ResultSlot.h" ResultSlot::ResultSlot(Player* player, std::shared_ptr craftSlots, diff --git a/Minecraft.World/Containers/ResultSlot.h b/Minecraft.World/net/minecraft/world/inventory/ResultSlot.h similarity index 100% rename from Minecraft.World/Containers/ResultSlot.h rename to Minecraft.World/net/minecraft/world/inventory/ResultSlot.h diff --git a/Minecraft.World/Containers/Slot.cpp b/Minecraft.World/net/minecraft/world/inventory/Slot.cpp similarity index 95% rename from Minecraft.World/Containers/Slot.cpp rename to Minecraft.World/net/minecraft/world/inventory/Slot.cpp index 45bdea020..438f596db 100644 --- a/Minecraft.World/Containers/Slot.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/Slot.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" -#include "Container.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.item.crafting.h" +#include "../Container.h" +#include "../item/net.minecraft.world.item.h" +#include "../item/crafting/net.minecraft.world.item.crafting.h" #include "Slot.h" Slot::Slot(std::shared_ptr container, int slot, int x, int y) diff --git a/Minecraft.World/Containers/Slot.h b/Minecraft.World/net/minecraft/world/inventory/Slot.h similarity index 100% rename from Minecraft.World/Containers/Slot.h rename to Minecraft.World/net/minecraft/world/inventory/Slot.h diff --git a/Minecraft.World/Containers/TrapMenu.cpp b/Minecraft.World/net/minecraft/world/inventory/TrapMenu.cpp similarity index 89% rename from Minecraft.World/Containers/TrapMenu.cpp rename to Minecraft.World/net/minecraft/world/inventory/TrapMenu.cpp index 206ca0048..1b7f8cd75 100644 --- a/Minecraft.World/Containers/TrapMenu.cpp +++ b/Minecraft.World/net/minecraft/world/inventory/TrapMenu.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "Container.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../Container.h" #include "Slot.h" #include "TrapMenu.h" diff --git a/Minecraft.World/Containers/TrapMenu.h b/Minecraft.World/net/minecraft/world/inventory/TrapMenu.h similarity index 100% rename from Minecraft.World/Containers/TrapMenu.h rename to Minecraft.World/net/minecraft/world/inventory/TrapMenu.h diff --git a/Minecraft.World/Headers/net.minecraft.world.inventory.ContainerListener.h b/Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.ContainerListener.h similarity index 100% rename from Minecraft.World/Headers/net.minecraft.world.inventory.ContainerListener.h rename to Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.ContainerListener.h diff --git a/Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h b/Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h new file mode 100644 index 000000000..82a8a52d0 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/inventory/net.minecraft.world.inventory.h @@ -0,0 +1,32 @@ +#pragma once + +#include "AbstractContainerMenu.h" +#include "AnimalChest.h" +#include "ArmorSlot.h" +#include "BeaconMenu.h" +#include "net.minecraft.world.inventory.ContainerListener.h" +#include "ContainerMenu.h" +#include "CraftingContainer.h" +#include "CraftingMenu.h" +#include "FireworksMenu.h" +#include "FurnaceMenu.h" +#include "FurnaceResultSlot.h" +#include "HopperMenu.h" +#include "HorseInventoryMenu.h" +#include "InventoryMenu.h" +#include "MenuBackup.h" +#include "ResultContainer.h" +#include "ResultSlot.h" +#include "Slot.h" +#include "TrapMenu.h" +#include "EnchantmentMenu.h" +#include "EnchantmentSlot.h" +#include "EnchantmentContainer.h" +#include "BrewingStandMenu.h" +#include "MerchantContainer.h" +#include "MerchantMenu.h" +#include "MerchantResultSlot.h" +#include "PlayerEnderChestContainer.h" +#include "AnvilMenu.h" +#include "RepairContainer.h" +#include "RepairResultSlot.h" \ No newline at end of file diff --git a/Minecraft.World/Items/TileItems/AnvilTileItem.cpp b/Minecraft.World/net/minecraft/world/item/AnvilTileItem.cpp similarity index 80% rename from Minecraft.World/Items/TileItems/AnvilTileItem.cpp rename to Minecraft.World/net/minecraft/world/item/AnvilTileItem.cpp index 44381fb3c..adc75435a 100644 --- a/Minecraft.World/Items/TileItems/AnvilTileItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/AnvilTileItem.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/tile/net.minecraft.world.level.tile.h" #include "AnvilTileItem.h" AnvilTileItem::AnvilTileItem(Tile* tile) diff --git a/Minecraft.World/Items/TileItems/AnvilTileItem.h b/Minecraft.World/net/minecraft/world/item/AnvilTileItem.h similarity index 100% rename from Minecraft.World/Items/TileItems/AnvilTileItem.h rename to Minecraft.World/net/minecraft/world/item/AnvilTileItem.h diff --git a/Minecraft.World/Items/ArmorItem.cpp b/Minecraft.World/net/minecraft/world/item/ArmorItem.cpp similarity index 94% rename from Minecraft.World/Items/ArmorItem.cpp rename to Minecraft.World/net/minecraft/world/item/ArmorItem.cpp index e171e062d..c35452d2d 100644 --- a/Minecraft.World/Items/ArmorItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/ArmorItem.cpp @@ -1,12 +1,12 @@ -#include "../Platform/stdafx.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/com.mojang.nbt.h" +#include "../../../../Header Files/stdafx.h" +#include "../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../net.minecraft.world.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../entity/net.minecraft.world.entity.h" +#include "../phys/net.minecraft.world.phys.h" +#include "../level/net.minecraft.world.level.h" +#include "../../../../com/mojang/nbt/com.mojang.nbt.h" #include "ArmorItem.h" const int ArmorItem::healthPerSlot[] = {11, 16, 15, 13}; diff --git a/Minecraft.World/Items/ArmorItem.h b/Minecraft.World/net/minecraft/world/item/ArmorItem.h similarity index 98% rename from Minecraft.World/Items/ArmorItem.h rename to Minecraft.World/net/minecraft/world/item/ArmorItem.h index f63da30c5..6bba66850 100644 --- a/Minecraft.World/Items/ArmorItem.h +++ b/Minecraft.World/net/minecraft/world/item/ArmorItem.h @@ -1,7 +1,7 @@ #pragma once #include "Item.h" -#include "../Core/DefaultDispenseItemBehavior.h" +#include "../../core/DefaultDispenseItemBehavior.h" class ArmorItem : public Item { public: diff --git a/Minecraft.World/Items/TileItems/AuxDataTileItem.cpp b/Minecraft.World/net/minecraft/world/item/AuxDataTileItem.cpp similarity index 78% rename from Minecraft.World/Items/TileItems/AuxDataTileItem.cpp rename to Minecraft.World/net/minecraft/world/item/AuxDataTileItem.cpp index 3522706f4..48209e31a 100644 --- a/Minecraft.World/Items/TileItems/AuxDataTileItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/AuxDataTileItem.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/tile/net.minecraft.world.level.tile.h" #include "AuxDataTileItem.h" AuxDataTileItem::AuxDataTileItem(int id, Tile* parentTile) : TileItem(id) { diff --git a/Minecraft.World/Items/TileItems/AuxDataTileItem.h b/Minecraft.World/net/minecraft/world/item/AuxDataTileItem.h similarity index 100% rename from Minecraft.World/Items/TileItems/AuxDataTileItem.h rename to Minecraft.World/net/minecraft/world/item/AuxDataTileItem.h diff --git a/Minecraft.World/Items/BedItem.cpp b/Minecraft.World/net/minecraft/world/item/BedItem.cpp similarity index 85% rename from Minecraft.World/Items/BedItem.cpp rename to Minecraft.World/net/minecraft/world/item/BedItem.cpp index cac4f35dd..ed1e1f94c 100644 --- a/Minecraft.World/Items/BedItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/BedItem.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Util/Facing.h" -#include "../Stats/GenericStats.h" +#include "../../../../Header Files/stdafx.h" +#include "../../net.minecraft.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "net.minecraft.world.item.h" +#include "../../Facing.h" +#include "../../stats/GenericStats.h" #include "BedItem.h" BedItem::BedItem(int id) : Item(id) {} diff --git a/Minecraft.World/Items/BedItem.h b/Minecraft.World/net/minecraft/world/item/BedItem.h similarity index 100% rename from Minecraft.World/Items/BedItem.h rename to Minecraft.World/net/minecraft/world/item/BedItem.h diff --git a/Minecraft.World/Items/BoatItem.cpp b/Minecraft.World/net/minecraft/world/item/BoatItem.cpp similarity index 92% rename from Minecraft.World/Items/BoatItem.cpp rename to Minecraft.World/net/minecraft/world/item/BoatItem.cpp index 883bda4b9..deefca47f 100644 --- a/Minecraft.World/Items/BoatItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/BoatItem.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.phys.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../entity/item/net.minecraft.world.entity.item.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../phys/net.minecraft.world.phys.h" #include "ItemInstance.h" -#include "Util/Vec3.h" +#include "../phys/Vec3.h" #include "BoatItem.h" BoatItem::BoatItem(int id) : Item(id) { maxStackSize = 1; } diff --git a/Minecraft.World/Items/BoatItem.h b/Minecraft.World/net/minecraft/world/item/BoatItem.h similarity index 100% rename from Minecraft.World/Items/BoatItem.h rename to Minecraft.World/net/minecraft/world/item/BoatItem.h diff --git a/Minecraft.World/Items/BookItem.cpp b/Minecraft.World/net/minecraft/world/item/BookItem.cpp similarity index 83% rename from Minecraft.World/Items/BookItem.cpp rename to Minecraft.World/net/minecraft/world/item/BookItem.cpp index 6ea875f3c..23bebfa10 100644 --- a/Minecraft.World/Items/BookItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/BookItem.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "BookItem.h" diff --git a/Minecraft.World/Items/BookItem.h b/Minecraft.World/net/minecraft/world/item/BookItem.h similarity index 100% rename from Minecraft.World/Items/BookItem.h rename to Minecraft.World/net/minecraft/world/item/BookItem.h diff --git a/Minecraft.World/Items/BottleItem.cpp b/Minecraft.World/net/minecraft/world/item/BottleItem.cpp similarity index 88% rename from Minecraft.World/Items/BottleItem.cpp rename to Minecraft.World/net/minecraft/world/item/BottleItem.cpp index 8a6b26160..434a9dadd 100644 --- a/Minecraft.World/Items/BottleItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/BottleItem.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.material.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../../Header Files/stdafx.h" +#include "../phys/net.minecraft.world.phys.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/material/net.minecraft.world.level.material.h" +#include "net.minecraft.world.item.h" #include "BottleItem.h" BottleItem::BottleItem(int id) : Item(id) {} diff --git a/Minecraft.World/Items/BottleItem.h b/Minecraft.World/net/minecraft/world/item/BottleItem.h similarity index 100% rename from Minecraft.World/Items/BottleItem.h rename to Minecraft.World/net/minecraft/world/item/BottleItem.h diff --git a/Minecraft.World/Items/BowItem.cpp b/Minecraft.World/net/minecraft/world/item/BowItem.cpp similarity index 88% rename from Minecraft.World/Items/BowItem.cpp rename to Minecraft.World/net/minecraft/world/item/BowItem.cpp index dae94bb4f..3e89d1c57 100644 --- a/Minecraft.World/Items/BowItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/BowItem.cpp @@ -1,12 +1,12 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.projectile.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/net.minecraft.world.level.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../entity/item/net.minecraft.world.entity.item.h" +#include "enchantment/net.minecraft.world.item.enchantment.h" +#include "../net.minecraft.world.h" #include "BowItem.h" -#include "../Util/SoundTypes.h" +#include "../../../../Header Files/SoundTypes.h" const std::wstring BowItem::TEXTURE_PULL[] = {L"bow_pull_0", L"bow_pull_1", L"bow_pull_2"}; diff --git a/Minecraft.World/Items/BowItem.h b/Minecraft.World/net/minecraft/world/item/BowItem.h similarity index 100% rename from Minecraft.World/Items/BowItem.h rename to Minecraft.World/net/minecraft/world/item/BowItem.h diff --git a/Minecraft.World/Items/BowlFoodItem.cpp b/Minecraft.World/net/minecraft/world/item/BowlFoodItem.cpp similarity index 80% rename from Minecraft.World/Items/BowlFoodItem.cpp rename to Minecraft.World/net/minecraft/world/item/BowlFoodItem.cpp index f0e70e584..5405f226d 100644 --- a/Minecraft.World/Items/BowlFoodItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/BowlFoodItem.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" #include "ItemInstance.h" #include "BowlFoodItem.h" diff --git a/Minecraft.World/Items/BowlFoodItem.h b/Minecraft.World/net/minecraft/world/item/BowlFoodItem.h similarity index 100% rename from Minecraft.World/Items/BowlFoodItem.h rename to Minecraft.World/net/minecraft/world/item/BowlFoodItem.h diff --git a/Minecraft.World/Items/BucketItem.cpp b/Minecraft.World/net/minecraft/world/item/BucketItem.cpp similarity index 88% rename from Minecraft.World/Items/BucketItem.cpp rename to Minecraft.World/net/minecraft/world/item/BucketItem.cpp index 405989b78..736d5bc01 100644 --- a/Minecraft.World/Items/BucketItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/BucketItem.cpp @@ -1,22 +1,22 @@ -#include "../Platform/stdafx.h" -#include "../Util/JavaMath.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.dimension.h" -#include "../Headers/net.minecraft.world.level.material.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.entity.animal.h" -#include "../Headers/net.minecraft.stats.h" -#include "../Blocks/Material.h" +#include "../../../../Header Files/stdafx.h" +#include "../../../../ConsoleJavaLibs/JavaMath.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/dimension/net.minecraft.world.level.dimension.h" +#include "../level/material/net.minecraft.world.level.material.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../phys/net.minecraft.world.phys.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../entity/animal/net.minecraft.world.entity.animal.h" +#include "../../stats/net.minecraft.stats.h" +#include "../level/material/Material.h" #include "ItemInstance.h" #include "BucketItem.h" -#include "../../Minecraft.Client/Player/LocalPlayer.h" -#include "../../Minecraft.Client/Player/ServerPlayer.h" -#include "../../Minecraft.Client/Network/PlayerConnection.h" -#include "../Network/Packets/ChatPacket.h" -#include "../Util/SoundTypes.h" +#include "../../Minecraft.Client/net/minecraft/client/player/LocalPlayer.h" +#include "../../Minecraft.Client/net/minecraft/server/level/ServerPlayer.h" +#include "../../Minecraft.Client/net/minecraft/server/network/PlayerConnection.h" +#include "../../network/packet/ChatPacket.h" +#include "../../../../Header Files/SoundTypes.h" BucketItem::BucketItem(int id, int content) : Item(id) { maxStackSize = 1; diff --git a/Minecraft.World/Items/BucketItem.h b/Minecraft.World/net/minecraft/world/item/BucketItem.h similarity index 100% rename from Minecraft.World/Items/BucketItem.h rename to Minecraft.World/net/minecraft/world/item/BucketItem.h diff --git a/Minecraft.World/Items/CarrotOnAStickItem.cpp b/Minecraft.World/net/minecraft/world/item/CarrotOnAStickItem.cpp similarity index 81% rename from Minecraft.World/Items/CarrotOnAStickItem.cpp rename to Minecraft.World/net/minecraft/world/item/CarrotOnAStickItem.cpp index 96b6a9b20..40452c7c1 100644 --- a/Minecraft.World/Items/CarrotOnAStickItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/CarrotOnAStickItem.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.animal.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.ai.goal.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/animal/net.minecraft.world.entity.animal.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../entity/ai/goal/net.minecraft.world.entity.ai.goal.h" +#include "net.minecraft.world.item.h" #include "CarrotOnAStickItem.h" CarrotOnAStickItem::CarrotOnAStickItem(int id) : Item(id) { diff --git a/Minecraft.World/Items/CarrotOnAStickItem.h b/Minecraft.World/net/minecraft/world/item/CarrotOnAStickItem.h similarity index 100% rename from Minecraft.World/Items/CarrotOnAStickItem.h rename to Minecraft.World/net/minecraft/world/item/CarrotOnAStickItem.h diff --git a/Minecraft.World/Items/ClockItem.cpp b/Minecraft.World/net/minecraft/world/item/ClockItem.cpp similarity index 78% rename from Minecraft.World/Items/ClockItem.cpp rename to Minecraft.World/net/minecraft/world/item/ClockItem.cpp index c8e04d544..3662a3d43 100644 --- a/Minecraft.World/Items/ClockItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/ClockItem.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "ClockItem.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../Headers/net.minecraft.world.h" +#include "../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../../Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../net.minecraft.world.h" const std::wstring ClockItem::TEXTURE_PLAYER_ICON[XUSER_MAX_COUNT] = { L"clockP0", L"clockP1", L"clockP2", L"clockP3"}; diff --git a/Minecraft.World/Items/ClockItem.h b/Minecraft.World/net/minecraft/world/item/ClockItem.h similarity index 100% rename from Minecraft.World/Items/ClockItem.h rename to Minecraft.World/net/minecraft/world/item/ClockItem.h diff --git a/Minecraft.World/Items/CoalItem.cpp b/Minecraft.World/net/minecraft/world/item/CoalItem.cpp similarity index 72% rename from Minecraft.World/Items/CoalItem.cpp rename to Minecraft.World/net/minecraft/world/item/CoalItem.cpp index 348a24e6e..379cee754 100644 --- a/Minecraft.World/Items/CoalItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/CoalItem.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.world.item.h" +#include "../entity/item/net.minecraft.world.entity.item.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../net.minecraft.world.h" #include "CoalItem.h" CoalItem::CoalItem(int id) : Item(id) { diff --git a/Minecraft.World/Items/CoalItem.h b/Minecraft.World/net/minecraft/world/item/CoalItem.h similarity index 100% rename from Minecraft.World/Items/CoalItem.h rename to Minecraft.World/net/minecraft/world/item/CoalItem.h diff --git a/Minecraft.World/Items/TileItems/ColoredTileItem.cpp b/Minecraft.World/net/minecraft/world/item/ColoredTileItem.cpp similarity index 94% rename from Minecraft.World/Items/TileItems/ColoredTileItem.cpp rename to Minecraft.World/net/minecraft/world/item/ColoredTileItem.cpp index dc6c607e6..7cf1225f1 100644 --- a/Minecraft.World/Items/TileItems/ColoredTileItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/ColoredTileItem.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/tile/net.minecraft.world.level.tile.h" #include "ColoredTileItem.h" ColoredTileItem::ColoredTileItem(int id, bool stackedByData) : TileItem(id) { diff --git a/Minecraft.World/Items/TileItems/ColoredTileItem.h b/Minecraft.World/net/minecraft/world/item/ColoredTileItem.h similarity index 100% rename from Minecraft.World/Items/TileItems/ColoredTileItem.h rename to Minecraft.World/net/minecraft/world/item/ColoredTileItem.h diff --git a/Minecraft.World/Items/CompassItem.cpp b/Minecraft.World/net/minecraft/world/item/CompassItem.cpp similarity index 78% rename from Minecraft.World/Items/CompassItem.cpp rename to Minecraft.World/net/minecraft/world/item/CompassItem.cpp index 78237eadf..4254229ce 100644 --- a/Minecraft.World/Items/CompassItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/CompassItem.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "CompassItem.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Player/MultiPlayerLocalPlayer.h" -#include "../Headers/net.minecraft.world.h" +#include "../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../../Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerLocalPlayer.h" +#include "../net.minecraft.world.h" const std::wstring CompassItem::TEXTURE_PLAYER_ICON[XUSER_MAX_COUNT] = { L"compassP0", L"compassP1", L"compassP2", L"compassP3"}; diff --git a/Minecraft.World/Items/CompassItem.h b/Minecraft.World/net/minecraft/world/item/CompassItem.h similarity index 100% rename from Minecraft.World/Items/CompassItem.h rename to Minecraft.World/net/minecraft/world/item/CompassItem.h diff --git a/Minecraft.World/Items/ComplexItem.cpp b/Minecraft.World/net/minecraft/world/item/ComplexItem.cpp similarity index 57% rename from Minecraft.World/Items/ComplexItem.cpp rename to Minecraft.World/net/minecraft/world/item/ComplexItem.cpp index 45a563348..e00cb0a92 100644 --- a/Minecraft.World/Items/ComplexItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/ComplexItem.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.network.packet.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../Header Files/stdafx.h" +#include "../../network/packet/net.minecraft.network.packet.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" #include "ComplexItem.h" ComplexItem::ComplexItem(int id) : Item(id) {} diff --git a/Minecraft.World/Items/ComplexItem.h b/Minecraft.World/net/minecraft/world/item/ComplexItem.h similarity index 100% rename from Minecraft.World/Items/ComplexItem.h rename to Minecraft.World/net/minecraft/world/item/ComplexItem.h diff --git a/Minecraft.World/Items/DiggerItem.cpp b/Minecraft.World/net/minecraft/world/item/DiggerItem.cpp similarity index 86% rename from Minecraft.World/Items/DiggerItem.cpp rename to Minecraft.World/net/minecraft/world/item/DiggerItem.cpp index 2756b79d8..21412d6bb 100644 --- a/Minecraft.World/Items/DiggerItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/DiggerItem.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../Headers/net.minecraft.world.entity.monster.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/net.minecraft.world.entity.h" +#include "../entity/ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../entity/monster/net.minecraft.world.entity.monster.h" +#include "net.minecraft.world.item.h" +#include "../level/tile/net.minecraft.world.level.tile.h" #include "DiggerItem.h" DiggerItem::DiggerItem(int id, float attackDamage, const Tier* tier, diff --git a/Minecraft.World/Items/DiggerItem.h b/Minecraft.World/net/minecraft/world/item/DiggerItem.h similarity index 100% rename from Minecraft.World/Items/DiggerItem.h rename to Minecraft.World/net/minecraft/world/item/DiggerItem.h diff --git a/Minecraft.World/Items/DoorItem.cpp b/Minecraft.World/net/minecraft/world/item/DoorItem.cpp similarity index 85% rename from Minecraft.World/Items/DoorItem.cpp rename to Minecraft.World/net/minecraft/world/item/DoorItem.cpp index da161538d..5802e61f9 100644 --- a/Minecraft.World/Items/DoorItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/DoorItem.cpp @@ -1,14 +1,14 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Util/Facing.h" -#include "../Blocks/Material.h" -#include "../Stats/GenericStats.h" +#include "../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../phys/net.minecraft.world.phys.h" +#include "net.minecraft.world.item.h" +#include "../../Facing.h" +#include "../level/material/Material.h" +#include "../../stats/GenericStats.h" #include "DoorItem.h" DoorItem::DoorItem(int id, Material* material) : Item(id) { diff --git a/Minecraft.World/Items/DoorItem.h b/Minecraft.World/net/minecraft/world/item/DoorItem.h similarity index 100% rename from Minecraft.World/Items/DoorItem.h rename to Minecraft.World/net/minecraft/world/item/DoorItem.h diff --git a/Minecraft.World/Items/DyePowderItem.cpp b/Minecraft.World/net/minecraft/world/item/DyePowderItem.cpp similarity index 94% rename from Minecraft.World/Items/DyePowderItem.cpp rename to Minecraft.World/net/minecraft/world/item/DyePowderItem.cpp index 6ea385dcc..acaab9123 100644 --- a/Minecraft.World/Items/DyePowderItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/DyePowderItem.cpp @@ -1,16 +1,16 @@ -#include "../Platform/stdafx.h" -#include "../Headers/com.mojang.nbt.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.global.h" -#include "../Headers/net.minecraft.world.entity.animal.h" -#include "../Headers/net.minecraft.world.h" -#include "../Blocks/Material.h" +#include "../../../../Header Files/stdafx.h" +#include "../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../phys/net.minecraft.world.phys.h" +#include "../level/net.minecraft.world.level.h" +#include "net.minecraft.world.item.h" +#include "../entity/item/net.minecraft.world.entity.item.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../entity/global/net.minecraft.world.entity.global.h" +#include "../entity/animal/net.minecraft.world.entity.animal.h" +#include "../net.minecraft.world.h" +#include "../level/material/Material.h" #include "DyePowderItem.h" DyePowderItem::DyePowderItem(int id) : Item(id) { diff --git a/Minecraft.World/Items/DyePowderItem.h b/Minecraft.World/net/minecraft/world/item/DyePowderItem.h similarity index 100% rename from Minecraft.World/Items/DyePowderItem.h rename to Minecraft.World/net/minecraft/world/item/DyePowderItem.h diff --git a/Minecraft.World/net/minecraft/world/item/EggItem.cpp b/Minecraft.World/net/minecraft/world/item/EggItem.cpp new file mode 100644 index 000000000..32dcfa714 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/item/EggItem.cpp @@ -0,0 +1,29 @@ + +#include "../../../../Header Files/stdafx.h" +#include "../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../phys/net.minecraft.world.phys.h" +#include "../level/net.minecraft.world.level.h" +#include "net.minecraft.world.item.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../entity/item/net.minecraft.world.entity.item.h" +#include "../entity/global/net.minecraft.world.entity.global.h" +#include "../entity/projectile/net.minecraft.world.entity.projectile.h" +#include "EggItem.h" +#include "../../../../Header Files/SoundTypes.h" + +EggItem::EggItem(int id) : Item(id) { maxStackSize = 16; } + +std::shared_ptr EggItem::use( + std::shared_ptr instance, Level* level, + std::shared_ptr player) { + if (!player->abilities.instabuild) { + instance->count--; + } + level->playEntitySound(player, eSoundType_RANDOM_BOW, 0.5f, + 0.4f / (random->nextFloat() * 0.4f + 0.8f)); + if (!level->isClientSide) + level->addEntity( + std::shared_ptr(new ThrownEgg(level, player))); + return instance; +} diff --git a/Minecraft.World/Items/EggItem.h b/Minecraft.World/net/minecraft/world/item/EggItem.h similarity index 100% rename from Minecraft.World/Items/EggItem.h rename to Minecraft.World/net/minecraft/world/item/EggItem.h diff --git a/Minecraft.World/Items/EmptyMapItem.cpp b/Minecraft.World/net/minecraft/world/item/EmptyMapItem.cpp similarity index 89% rename from Minecraft.World/Items/EmptyMapItem.cpp rename to Minecraft.World/net/minecraft/world/item/EmptyMapItem.cpp index 1fd80a19b..b8041229d 100644 --- a/Minecraft.World/Items/EmptyMapItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/EmptyMapItem.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.entity.player.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.world.item.h" +#include "../entity/player/net.minecraft.world.entity.player.h" #include "EmptyMapItem.h" EmptyMapItem::EmptyMapItem(int id) : ComplexItem(id) {} diff --git a/Minecraft.World/Items/EmptyMapItem.h b/Minecraft.World/net/minecraft/world/item/EmptyMapItem.h similarity index 100% rename from Minecraft.World/Items/EmptyMapItem.h rename to Minecraft.World/net/minecraft/world/item/EmptyMapItem.h diff --git a/Minecraft.World/Items/EnchantedBookItem.cpp b/Minecraft.World/net/minecraft/world/item/EnchantedBookItem.cpp similarity index 96% rename from Minecraft.World/Items/EnchantedBookItem.cpp rename to Minecraft.World/net/minecraft/world/item/EnchantedBookItem.cpp index 6428aae14..f887a2fb4 100644 --- a/Minecraft.World/Items/EnchantedBookItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/EnchantedBookItem.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Util/WeighedTreasure.h" +#include "../../../../Header Files/stdafx.h" +#include "enchantment/net.minecraft.world.item.enchantment.h" +#include "net.minecraft.world.item.h" +#include "../../util/WeighedTreasure.h" #include "EnchantedBookItem.h" const std::wstring EnchantedBookItem::TAG_STORED_ENCHANTMENTS = diff --git a/Minecraft.World/Items/EnchantedBookItem.h b/Minecraft.World/net/minecraft/world/item/EnchantedBookItem.h similarity index 100% rename from Minecraft.World/Items/EnchantedBookItem.h rename to Minecraft.World/net/minecraft/world/item/EnchantedBookItem.h diff --git a/Minecraft.World/Items/EnderEyeItem.cpp b/Minecraft.World/net/minecraft/world/item/EnderEyeItem.cpp similarity index 94% rename from Minecraft.World/Items/EnderEyeItem.cpp rename to Minecraft.World/net/minecraft/world/item/EnderEyeItem.cpp index df1c7f915..00f0423fa 100644 --- a/Minecraft.World/Items/EnderEyeItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/EnderEyeItem.cpp @@ -1,13 +1,13 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.levelgen.h" -#include "../Headers/net.minecraft.world.level.dimension.h" -#include "../Headers/net.minecraft.world.entity.projectile.h" -#include "../Headers/net.minecraft.world.phys.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../level/levelgen/net.minecraft.world.level.levelgen.h" +#include "../level/dimension/net.minecraft.world.level.dimension.h" +#include "../entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../phys/net.minecraft.world.phys.h" #include "EnderEyeItem.h" -#include "../Util/SoundTypes.h" -#include "../Level/LevelData.h" +#include "../../../../Header Files/SoundTypes.h" +#include "../level/storage/LevelData.h" EnderEyeItem::EnderEyeItem(int id) : Item(id) {} diff --git a/Minecraft.World/Items/EnderEyeItem.h b/Minecraft.World/net/minecraft/world/item/EnderEyeItem.h similarity index 100% rename from Minecraft.World/Items/EnderEyeItem.h rename to Minecraft.World/net/minecraft/world/item/EnderEyeItem.h diff --git a/Minecraft.World/Items/EnderPearlItem.cpp b/Minecraft.World/net/minecraft/world/item/EnderpearlItem.cpp similarity index 76% rename from Minecraft.World/Items/EnderPearlItem.cpp rename to Minecraft.World/net/minecraft/world/item/EnderpearlItem.cpp index 6cc7684a9..d2320f8ef 100644 --- a/Minecraft.World/Items/EnderPearlItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/EnderpearlItem.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.projectile.h" -#include "EnderPearlItem.h" -#include "../Util/SoundTypes.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/net.minecraft.world.level.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../entity/projectile/net.minecraft.world.entity.projectile.h" +#include "EnderpearlItem.h" +#include "../../../../Header Files/SoundTypes.h" EnderpearlItem::EnderpearlItem(int id) : Item(id) { maxStackSize = 16; } diff --git a/Minecraft.World/Items/EnderPearlItem.h b/Minecraft.World/net/minecraft/world/item/EnderpearlItem.h similarity index 100% rename from Minecraft.World/Items/EnderPearlItem.h rename to Minecraft.World/net/minecraft/world/item/EnderpearlItem.h diff --git a/Minecraft.World/Items/ExperienceItem.cpp b/Minecraft.World/net/minecraft/world/item/ExperienceItem.cpp similarity index 73% rename from Minecraft.World/Items/ExperienceItem.cpp rename to Minecraft.World/net/minecraft/world/item/ExperienceItem.cpp index c02449444..d08176767 100644 --- a/Minecraft.World/Items/ExperienceItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/ExperienceItem.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.entity.projectile.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Util/SoundTypes.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/net.minecraft.world.level.h" +#include "../entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "net.minecraft.world.item.h" +#include "../../../../Header Files/SoundTypes.h" #include "ExperienceItem.h" ExperienceItem::ExperienceItem(int id) : Item(id) {} diff --git a/Minecraft.World/Items/ExperienceItem.h b/Minecraft.World/net/minecraft/world/item/ExperienceItem.h similarity index 100% rename from Minecraft.World/Items/ExperienceItem.h rename to Minecraft.World/net/minecraft/world/item/ExperienceItem.h diff --git a/Minecraft.World/Items/FireChargeItem.cpp b/Minecraft.World/net/minecraft/world/item/FireChargeItem.cpp similarity index 79% rename from Minecraft.World/Items/FireChargeItem.cpp rename to Minecraft.World/net/minecraft/world/item/FireChargeItem.cpp index dd7dbab76..44254e2bd 100644 --- a/Minecraft.World/Items/FireChargeItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/FireChargeItem.cpp @@ -1,12 +1,12 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.entity.projectile.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.h" -#include "../Util/SoundTypes.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/net.minecraft.world.level.h" +#include "../entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "net.minecraft.world.item.h" +#include "../net.minecraft.world.h" +#include "../../../../Header Files/SoundTypes.h" #include "FireChargeItem.h" -#include "../Blocks/Tile.h" +#include "../level/tile/Tile.h" FireChargeItem::FireChargeItem(int id) : Item(id) { m_dragonFireballIcon = nullptr; diff --git a/Minecraft.World/Items/FireChargeItem.h b/Minecraft.World/net/minecraft/world/item/FireChargeItem.h similarity index 100% rename from Minecraft.World/Items/FireChargeItem.h rename to Minecraft.World/net/minecraft/world/item/FireChargeItem.h diff --git a/Minecraft.World/Items/FireworksChargeItem.cpp b/Minecraft.World/net/minecraft/world/item/FireworksChargeItem.cpp similarity index 98% rename from Minecraft.World/Items/FireworksChargeItem.cpp rename to Minecraft.World/net/minecraft/world/item/FireworksChargeItem.cpp index 69dc4036d..b7b07e885 100644 --- a/Minecraft.World/Items/FireworksChargeItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/FireworksChargeItem.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.world.item.h" +#include "../net.minecraft.world.h" #include "FireworksChargeItem.h" FireworksChargeItem::FireworksChargeItem(int id) : Item(id) {} diff --git a/Minecraft.World/Items/FireworksChargeItem.h b/Minecraft.World/net/minecraft/world/item/FireworksChargeItem.h similarity index 100% rename from Minecraft.World/Items/FireworksChargeItem.h rename to Minecraft.World/net/minecraft/world/item/FireworksChargeItem.h diff --git a/Minecraft.World/Items/FireworksItem.cpp b/Minecraft.World/net/minecraft/world/item/FireworksItem.cpp similarity index 91% rename from Minecraft.World/Items/FireworksItem.cpp rename to Minecraft.World/net/minecraft/world/item/FireworksItem.cpp index 53e413a8b..6ee1978fe 100644 --- a/Minecraft.World/Items/FireworksItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/FireworksItem.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.projectile.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../entity/projectile/net.minecraft.world.entity.projectile.h" +#include "net.minecraft.world.item.h" +#include "../level/net.minecraft.world.level.h" #include "FireworksItem.h" const std::wstring FireworksItem::TAG_FIREWORKS = L"Fireworks"; diff --git a/Minecraft.World/Items/FireworksItem.h b/Minecraft.World/net/minecraft/world/item/FireworksItem.h similarity index 100% rename from Minecraft.World/Items/FireworksItem.h rename to Minecraft.World/net/minecraft/world/item/FireworksItem.h diff --git a/Minecraft.World/Items/FishingRodItem.cpp b/Minecraft.World/net/minecraft/world/item/FishingRodItem.cpp similarity index 68% rename from Minecraft.World/Items/FishingRodItem.cpp rename to Minecraft.World/net/minecraft/world/item/FishingRodItem.cpp index 94632cc6c..018cb4c05 100644 --- a/Minecraft.World/Items/FishingRodItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/FishingRodItem.cpp @@ -1,17 +1,17 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.network.packet.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.chunk.h" -#include "../Headers/net.minecraft.world.level.material.h" -#include "../Headers/net.minecraft.world.level.saveddata.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.entity.projectile.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../Header Files/stdafx.h" +#include "../../network/packet/net.minecraft.network.packet.h" +#include "../entity/net.minecraft.world.entity.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/chunk/net.minecraft.world.level.chunk.h" +#include "../level/material/net.minecraft.world.level.material.h" +#include "../level/saveddata/net.minecraft.world.level.saveddata.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../net.minecraft.world.h" #include "ItemInstance.h" #include "FishingRodItem.h" -#include "../Util/SoundTypes.h" +#include "../../../../Header Files/SoundTypes.h" FishingRodItem::FishingRodItem(int id) : Item(id) { setMaxDamage(64); diff --git a/Minecraft.World/Items/FishingRodItem.h b/Minecraft.World/net/minecraft/world/item/FishingRodItem.h similarity index 100% rename from Minecraft.World/Items/FishingRodItem.h rename to Minecraft.World/net/minecraft/world/item/FishingRodItem.h diff --git a/Minecraft.World/Items/FlintAndSteelItem.cpp b/Minecraft.World/net/minecraft/world/item/FlintAndSteelItem.cpp similarity index 83% rename from Minecraft.World/Items/FlintAndSteelItem.cpp rename to Minecraft.World/net/minecraft/world/item/FlintAndSteelItem.cpp index eef623779..ce1125039 100644 --- a/Minecraft.World/Items/FlintAndSteelItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/FlintAndSteelItem.cpp @@ -1,13 +1,13 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.stats.h" -#include "../Blocks/Material.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../phys/net.minecraft.world.phys.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../../stats/net.minecraft.stats.h" +#include "../level/material/Material.h" #include "ItemInstance.h" #include "FlintAndSteelItem.h" -#include "../Util/SoundTypes.h" +#include "../../../../Header Files/SoundTypes.h" FlintAndSteelItem::FlintAndSteelItem(int id) : Item(id) { maxStackSize = 1; diff --git a/Minecraft.World/Items/FlintAndSteelItem.h b/Minecraft.World/net/minecraft/world/item/FlintAndSteelItem.h similarity index 100% rename from Minecraft.World/Items/FlintAndSteelItem.h rename to Minecraft.World/net/minecraft/world/item/FlintAndSteelItem.h diff --git a/Minecraft.World/Items/FoodItem.cpp b/Minecraft.World/net/minecraft/world/item/FoodItem.cpp similarity index 88% rename from Minecraft.World/Items/FoodItem.cpp rename to Minecraft.World/net/minecraft/world/item/FoodItem.cpp index fd34b94be..41db2ff45 100644 --- a/Minecraft.World/Items/FoodItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/FoodItem.cpp @@ -1,15 +1,15 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.food.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.effect.h" -#include "../Headers/net.minecraft.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../food/net.minecraft.world.food.h" +#include "../level/net.minecraft.world.level.h" +#include "../effect/net.minecraft.world.effect.h" +#include "../../net.minecraft.h" #include "ItemInstance.h" #include "FoodItem.h" -#include "../Util/SoundTypes.h" +#include "../../../../Header Files/SoundTypes.h" // 4J : WESTY : Other award ... eating cooked pork chop. -#include "../Headers/net.minecraft.stats.h" +#include "../../stats/net.minecraft.stats.h" void FoodItem::_init() { // 4J Initialisers diff --git a/Minecraft.World/Items/FoodItem.h b/Minecraft.World/net/minecraft/world/item/FoodItem.h similarity index 100% rename from Minecraft.World/Items/FoodItem.h rename to Minecraft.World/net/minecraft/world/item/FoodItem.h diff --git a/Minecraft.World/Items/GoldenAppleItem.cpp b/Minecraft.World/net/minecraft/world/item/GoldenAppleItem.cpp similarity index 88% rename from Minecraft.World/Items/GoldenAppleItem.cpp rename to Minecraft.World/net/minecraft/world/item/GoldenAppleItem.cpp index 904ce7322..cc1b29baf 100644 --- a/Minecraft.World/Items/GoldenAppleItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/GoldenAppleItem.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.effect.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Util/SharedConstants.h" +#include "../../../../Header Files/stdafx.h" +#include "../effect/net.minecraft.world.effect.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" +#include "../../SharedConstants.h" #include "GoldenAppleItem.h" GoldenAppleItem::GoldenAppleItem(int id, int nutrition, float saturationMod, diff --git a/Minecraft.World/Items/GoldenAppleItem.h b/Minecraft.World/net/minecraft/world/item/GoldenAppleItem.h similarity index 100% rename from Minecraft.World/Items/GoldenAppleItem.h rename to Minecraft.World/net/minecraft/world/item/GoldenAppleItem.h diff --git a/Minecraft.World/Items/HangingEntityItem.cpp b/Minecraft.World/net/minecraft/world/item/HangingEntityItem.cpp similarity index 88% rename from Minecraft.World/Items/HangingEntityItem.cpp rename to Minecraft.World/net/minecraft/world/item/HangingEntityItem.cpp index 7dfcfe323..f5c3a50e0 100644 --- a/Minecraft.World/Items/HangingEntityItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/HangingEntityItem.cpp @@ -1,15 +1,15 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../Header Files/stdafx.h" +#include "../../net.minecraft.h" +#include "../phys/net.minecraft.world.phys.h" +#include "../damageSource/net.minecraft.world.damagesource.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "net.minecraft.world.item.h" +#include "../level/net.minecraft.world.level.h" #include "HangingEntityItem.h" -#include "../Entities/HangingEntity.h" -#include "../Entities/Mobs/Painting.h" -#include "../Stats/GenericStats.h" -#include "../Entities/Mobs/ItemFrame.h" +#include "../entity/HangingEntity.h" +#include "../entity/Painting.h" +#include "../../stats/GenericStats.h" +#include "../entity/ItemFrame.h" HangingEntityItem::HangingEntityItem(int id, eINSTANCEOF eClassType) : Item(id) { diff --git a/Minecraft.World/Items/HangingEntityItem.h b/Minecraft.World/net/minecraft/world/item/HangingEntityItem.h similarity index 100% rename from Minecraft.World/Items/HangingEntityItem.h rename to Minecraft.World/net/minecraft/world/item/HangingEntityItem.h diff --git a/Minecraft.World/Items/HatchetItem.cpp b/Minecraft.World/net/minecraft/world/item/HatchetItem.cpp similarity index 91% rename from Minecraft.World/Items/HatchetItem.cpp rename to Minecraft.World/net/minecraft/world/item/HatchetItem.cpp index 7247e1caf..618ef9a4f 100644 --- a/Minecraft.World/Items/HatchetItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/HatchetItem.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/tile/net.minecraft.world.level.tile.h" #include "HatchetItem.h" TileArray* HatchetItem::diggables = nullptr; diff --git a/Minecraft.World/Items/HatchetItem.h b/Minecraft.World/net/minecraft/world/item/HatchetItem.h similarity index 100% rename from Minecraft.World/Items/HatchetItem.h rename to Minecraft.World/net/minecraft/world/item/HatchetItem.h diff --git a/Minecraft.World/Items/HoeItem.cpp b/Minecraft.World/net/minecraft/world/item/HoeItem.cpp similarity index 87% rename from Minecraft.World/Items/HoeItem.cpp rename to Minecraft.World/net/minecraft/world/item/HoeItem.cpp index d23a61027..76ff7c240 100644 --- a/Minecraft.World/Items/HoeItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/HoeItem.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" #include "ItemInstance.h" #include "HoeItem.h" diff --git a/Minecraft.World/Items/HoeItem.h b/Minecraft.World/net/minecraft/world/item/HoeItem.h similarity index 100% rename from Minecraft.World/Items/HoeItem.h rename to Minecraft.World/net/minecraft/world/item/HoeItem.h diff --git a/Minecraft.World/Items/Item.cpp b/Minecraft.World/net/minecraft/world/item/Item.cpp similarity index 99% rename from Minecraft.World/Items/Item.cpp rename to Minecraft.World/net/minecraft/world/item/Item.cpp index 2e3cdc4e0..3c6105e62 100644 --- a/Minecraft.World/Items/Item.cpp +++ b/Minecraft.World/net/minecraft/world/item/Item.cpp @@ -1,21 +1,21 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" -#include "../Headers/net.minecraft.locale.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.item.alchemy.h" -#include "../Headers/net.minecraft.world.food.h" -#include "../Headers/net.minecraft.world.effect.h" -#include "../Headers/net.minecraft.stats.h" +#include "../../locale/net.minecraft.locale.h" +#include "../net.minecraft.world.h" +#include "../entity/net.minecraft.world.entity.h" +#include "../entity/item/net.minecraft.world.entity.item.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "net.minecraft.world.item.h" +#include "alchemy/net.minecraft.world.item.alchemy.h" +#include "../food/net.minecraft.world.food.h" +#include "../effect/net.minecraft.world.effect.h" +#include "../../stats/net.minecraft.stats.h" #include "MapItem.h" #include "Item.h" #include "HangingEntityItem.h" -#include "../Util/HtmlString.h" -#include "Util/Vec3.h" +#include "../../util/HtmlString.h" +#include "../phys/Vec3.h" typedef Item::Tier _Tier; diff --git a/Minecraft.World/Items/Item.h b/Minecraft.World/net/minecraft/world/item/Item.h similarity index 99% rename from Minecraft.World/Items/Item.h rename to Minecraft.World/net/minecraft/world/item/Item.h index 857b287f4..40bb2bbcc 100644 --- a/Minecraft.World/Items/Item.h +++ b/Minecraft.World/net/minecraft/world/item/Item.h @@ -1,8 +1,8 @@ #pragma once -#include "../Containers/Container.h" -#include "../Util/UseAnim.h" -#include "../Util/Rarity.h" +#include "../Container.h" +#include "UseAnim.h" +#include "Rarity.h" class MapItem; class Mob; diff --git a/Minecraft.World/Items/ItemInstance.cpp b/Minecraft.World/net/minecraft/world/item/ItemInstance.cpp similarity index 97% rename from Minecraft.World/Items/ItemInstance.cpp rename to Minecraft.World/net/minecraft/world/item/ItemInstance.cpp index 2e01eb296..176de30cd 100644 --- a/Minecraft.World/Items/ItemInstance.cpp +++ b/Minecraft.World/net/minecraft/world/item/ItemInstance.cpp @@ -1,18 +1,18 @@ -#include "../Platform/stdafx.h" -#include "../Headers/com.mojang.nbt.h" -#include "../Headers/net.minecraft.locale.h" -#include "../Headers/net.minecraft.stats.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../Headers/net.minecraft.world.entity.monster.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" +#include "../../../../Header Files/stdafx.h" +#include "../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../../locale/net.minecraft.locale.h" +#include "../../stats/net.minecraft.stats.h" +#include "../entity/net.minecraft.world.entity.h" +#include "../entity/ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../entity/monster/net.minecraft.world.entity.monster.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "net.minecraft.world.item.h" +#include "enchantment/net.minecraft.world.item.enchantment.h" #include "Item.h" #include "ItemInstance.h" -#include "../Util/HtmlString.h" +#include "../../util/HtmlString.h" const std::wstring ItemInstance::ATTRIBUTE_MODIFIER_FORMAT = L"#.###"; diff --git a/Minecraft.World/Items/ItemInstance.h b/Minecraft.World/net/minecraft/world/item/ItemInstance.h similarity index 98% rename from Minecraft.World/Items/ItemInstance.h rename to Minecraft.World/net/minecraft/world/item/ItemInstance.h index ef3c7c624..43bee3f35 100644 --- a/Minecraft.World/Items/ItemInstance.h +++ b/Minecraft.World/net/minecraft/world/item/ItemInstance.h @@ -1,8 +1,8 @@ #pragma once -#include "../Util/UseAnim.h" -#include "../Headers/com.mojang.nbt.h" -#include "../AI/Attributes/Attribute.h" +#include "UseAnim.h" +#include "../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../entity/ai/attributes/Attribute.h" class Entity; class Level; diff --git a/Minecraft.World/Items/TileItems/LeafTileItem.cpp b/Minecraft.World/net/minecraft/world/item/LeafTileItem.cpp similarity index 85% rename from Minecraft.World/Items/TileItems/LeafTileItem.cpp rename to Minecraft.World/net/minecraft/world/item/LeafTileItem.cpp index b7961636c..b905d4b88 100644 --- a/Minecraft.World/Items/TileItems/LeafTileItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/LeafTileItem.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.item.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "net.minecraft.world.item.h" #include "LeafTileItem.h" -#include "../../Util/FoliageColor.h" +#include "../level/FoliageColor.h" LeafTileItem::LeafTileItem(int id) : TileItem(id) { setMaxDamage(0); diff --git a/Minecraft.World/Items/TileItems/LeafTileItem.h b/Minecraft.World/net/minecraft/world/item/LeafTileItem.h similarity index 100% rename from Minecraft.World/Items/TileItems/LeafTileItem.h rename to Minecraft.World/net/minecraft/world/item/LeafTileItem.h diff --git a/Minecraft.World/Items/LeashItem.cpp b/Minecraft.World/net/minecraft/world/item/LeashItem.cpp similarity index 90% rename from Minecraft.World/Items/LeashItem.cpp rename to Minecraft.World/net/minecraft/world/item/LeashItem.cpp index 17d08f85d..9c3230e9f 100644 --- a/Minecraft.World/Items/LeashItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/LeashItem.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "Util/AABB.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../level/net.minecraft.world.level.h" +#include "../entity/net.minecraft.world.entity.h" +#include "../phys/net.minecraft.world.phys.h" +#include "../phys/AABB.h" #include "LeashItem.h" LeashItem::LeashItem(int id) : Item(id) {} diff --git a/Minecraft.World/Items/LeashItem.h b/Minecraft.World/net/minecraft/world/item/LeashItem.h similarity index 100% rename from Minecraft.World/Items/LeashItem.h rename to Minecraft.World/net/minecraft/world/item/LeashItem.h diff --git a/Minecraft.World/Items/MapItem.cpp b/Minecraft.World/net/minecraft/world/item/MapItem.cpp similarity index 93% rename from Minecraft.World/Items/MapItem.cpp rename to Minecraft.World/net/minecraft/world/item/MapItem.cpp index 63d828af0..e6a384c81 100644 --- a/Minecraft.World/Items/MapItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/MapItem.cpp @@ -1,18 +1,18 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.network.packet.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.chunk.h" -#include "../Headers/net.minecraft.world.level.dimension.h" -#include "../Headers/net.minecraft.world.level.material.h" -#include "../Headers/net.minecraft.world.level.saveddata.h" -#include "../Headers/net.minecraft.world.level.storage.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../../Header Files/stdafx.h" +#include "../../network/packet/net.minecraft.network.packet.h" +#include "../entity/net.minecraft.world.entity.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/chunk/net.minecraft.world.level.chunk.h" +#include "../level/dimension/net.minecraft.world.level.dimension.h" +#include "../level/material/net.minecraft.world.level.material.h" +#include "../level/saveddata/net.minecraft.world.level.saveddata.h" +#include "../level/storage/net.minecraft.world.level.storage.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "net.minecraft.world.item.h" #include "MapItem.h" -#include "../Headers/net.minecraft.world.inventory.h" -#include "../Util/JavaMath.h" +#include "../inventory/net.minecraft.world.inventory.h" +#include "../../../../ConsoleJavaLibs/JavaMath.h" MapItem::MapItem(int id) : ComplexItem(id) { setStackedByData(true); } diff --git a/Minecraft.World/Items/MapItem.h b/Minecraft.World/net/minecraft/world/item/MapItem.h similarity index 100% rename from Minecraft.World/Items/MapItem.h rename to Minecraft.World/net/minecraft/world/item/MapItem.h diff --git a/Minecraft.World/Items/MilkBucketItem.cpp b/Minecraft.World/net/minecraft/world/item/MilkBucketItem.cpp similarity index 86% rename from Minecraft.World/Items/MilkBucketItem.cpp rename to Minecraft.World/net/minecraft/world/item/MilkBucketItem.cpp index 719c2898b..f4815f670 100644 --- a/Minecraft.World/Items/MilkBucketItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/MilkBucketItem.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.entity.player.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/net.minecraft.world.level.h" +#include "../entity/player/net.minecraft.world.entity.player.h" #include "MilkBucketItem.h" MilkBucketItem::MilkBucketItem(int id) : Item(id) { setMaxStackSize(1); } diff --git a/Minecraft.World/Items/MilkBucketItem.h b/Minecraft.World/net/minecraft/world/item/MilkBucketItem.h similarity index 100% rename from Minecraft.World/Items/MilkBucketItem.h rename to Minecraft.World/net/minecraft/world/item/MilkBucketItem.h diff --git a/Minecraft.World/Items/MinecartItem.cpp b/Minecraft.World/net/minecraft/world/item/MinecartItem.cpp similarity index 92% rename from Minecraft.World/Items/MinecartItem.cpp rename to Minecraft.World/net/minecraft/world/item/MinecartItem.cpp index d73746206..65f1ab6ae 100644 --- a/Minecraft.World/Items/MinecartItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/MinecartItem.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/item/net.minecraft.world.entity.item.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" #include "ItemInstance.h" #include "MinecartItem.h" diff --git a/Minecraft.World/Items/MinecartItem.h b/Minecraft.World/net/minecraft/world/item/MinecartItem.h similarity index 94% rename from Minecraft.World/Items/MinecartItem.h rename to Minecraft.World/net/minecraft/world/item/MinecartItem.h index 21673e2cc..7e956cc14 100644 --- a/Minecraft.World/Items/MinecartItem.h +++ b/Minecraft.World/net/minecraft/world/item/MinecartItem.h @@ -1,7 +1,7 @@ #pragma once #include "Item.h" -#include "../Core/DefaultDispenseItemBehavior.h" +#include "../../core/DefaultDispenseItemBehavior.h" class MinecartItem : public Item { private: diff --git a/Minecraft.World/Items/TileItems/MultiTextureTileItem.cpp b/Minecraft.World/net/minecraft/world/item/MultiTextureTileItem.cpp similarity index 90% rename from Minecraft.World/Items/TileItems/MultiTextureTileItem.cpp rename to Minecraft.World/net/minecraft/world/item/MultiTextureTileItem.cpp index 304b84d75..34b356178 100644 --- a/Minecraft.World/Items/TileItems/MultiTextureTileItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/MultiTextureTileItem.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Blocks/Tile.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/tile/Tile.h" #include "MultiTextureTileItem.h" -#include "../../Headers/net.minecraft.world.item.crafting.h" +#include "crafting/net.minecraft.world.item.crafting.h" MultiTextureTileItem::MultiTextureTileItem(int id, Tile* parentTile, int* nameExtensions, int iLength, diff --git a/Minecraft.World/Items/TileItems/MultiTextureTileItem.h b/Minecraft.World/net/minecraft/world/item/MultiTextureTileItem.h similarity index 100% rename from Minecraft.World/Items/TileItems/MultiTextureTileItem.h rename to Minecraft.World/net/minecraft/world/item/MultiTextureTileItem.h diff --git a/Minecraft.World/Items/NameTagItem.cpp b/Minecraft.World/net/minecraft/world/item/NameTagItem.cpp similarity index 88% rename from Minecraft.World/Items/NameTagItem.cpp rename to Minecraft.World/net/minecraft/world/item/NameTagItem.cpp index 0890b8f35..e0a1ed379 100644 --- a/Minecraft.World/Items/NameTagItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/NameTagItem.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/net.minecraft.world.entity.h" #include "NameTagItem.h" NameTagItem::NameTagItem(int id) : Item(id) {} diff --git a/Minecraft.World/Items/NameTagItem.h b/Minecraft.World/net/minecraft/world/item/NameTagItem.h similarity index 100% rename from Minecraft.World/Items/NameTagItem.h rename to Minecraft.World/net/minecraft/world/item/NameTagItem.h diff --git a/Minecraft.World/Items/PickaxeItem.cpp b/Minecraft.World/net/minecraft/world/item/PickaxeItem.cpp similarity index 96% rename from Minecraft.World/Items/PickaxeItem.cpp rename to Minecraft.World/net/minecraft/world/item/PickaxeItem.cpp index 55ff1a084..9f317ff26 100644 --- a/Minecraft.World/Items/PickaxeItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/PickaxeItem.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/tile/net.minecraft.world.level.tile.h" #include "PickaxeItem.h" TileArray PickaxeItem::diggables; diff --git a/Minecraft.World/Items/PickaxeItem.h b/Minecraft.World/net/minecraft/world/item/PickaxeItem.h similarity index 100% rename from Minecraft.World/Items/PickaxeItem.h rename to Minecraft.World/net/minecraft/world/item/PickaxeItem.h diff --git a/Minecraft.World/Items/TileItems/PistonTileItem.cpp b/Minecraft.World/net/minecraft/world/item/PistonTileItem.cpp similarity index 64% rename from Minecraft.World/Items/TileItems/PistonTileItem.cpp rename to Minecraft.World/net/minecraft/world/item/PistonTileItem.cpp index 1d3eae892..277117f17 100644 --- a/Minecraft.World/Items/TileItems/PistonTileItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/PistonTileItem.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.item.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "net.minecraft.world.item.h" #include "PistonTileItem.h" PistonTileItem::PistonTileItem(int id) : TileItem(id) {} diff --git a/Minecraft.World/Items/TileItems/PistonTileItem.h b/Minecraft.World/net/minecraft/world/item/PistonTileItem.h similarity index 100% rename from Minecraft.World/Items/TileItems/PistonTileItem.h rename to Minecraft.World/net/minecraft/world/item/PistonTileItem.h diff --git a/Minecraft.World/Items/TileItems/PlanterTileItem.cpp b/Minecraft.World/net/minecraft/world/item/PlanterTileItem.cpp similarity index 90% rename from Minecraft.World/Items/TileItems/PlanterTileItem.cpp rename to Minecraft.World/net/minecraft/world/item/PlanterTileItem.cpp index 34e01312d..8c952562e 100644 --- a/Minecraft.World/Items/TileItems/PlanterTileItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/PlanterTileItem.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "net.minecraft.world.item.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../../net.minecraft.h" #include "PlanterTileItem.h" -#include "../../Stats/GenericStats.h" +#include "../../stats/GenericStats.h" // 4J-PB - for the debug option of not removing items #include #include diff --git a/Minecraft.World/Items/TileItems/PlanterTileItem.h b/Minecraft.World/net/minecraft/world/item/PlanterTileItem.h similarity index 95% rename from Minecraft.World/Items/TileItems/PlanterTileItem.h rename to Minecraft.World/net/minecraft/world/item/PlanterTileItem.h index 35f157a2f..2ec8bbb03 100644 --- a/Minecraft.World/Items/TileItems/PlanterTileItem.h +++ b/Minecraft.World/net/minecraft/world/item/PlanterTileItem.h @@ -1,6 +1,6 @@ #pragma once -#include "../Item.h" +#include "Item.h" class TilePlanterItem : public Item { private: diff --git a/Minecraft.World/Items/PotionItem.cpp b/Minecraft.World/net/minecraft/world/item/PotionItem.cpp similarity index 95% rename from Minecraft.World/Items/PotionItem.cpp rename to Minecraft.World/net/minecraft/world/item/PotionItem.cpp index 9bd524b5c..773dd18aa 100644 --- a/Minecraft.World/Items/PotionItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/PotionItem.cpp @@ -1,17 +1,17 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.item.alchemy.h" -#include "../Headers/net.minecraft.world.effect.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.projectile.h" -#include "../Headers/net.minecraft.world.h" -#include "../Entities/MobEffectInstance.h" -#include "../Util/StringHelpers.h" -#include "../Util/SharedConstants.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.world.item.h" +#include "alchemy/net.minecraft.world.item.alchemy.h" +#include "../effect/net.minecraft.world.effect.h" +#include "../level/net.minecraft.world.level.h" +#include "../entity/ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../net.minecraft.world.h" +#include "../effect/MobEffectInstance.h" +#include "../../../../ConsoleHelpers/StringHelpers.h" +#include "../../SharedConstants.h" #include "PotionItem.h" -#include "../Util/SoundTypes.h" +#include "../../../../Header Files/SoundTypes.h" const std::wstring PotionItem::DEFAULT_ICON = L"potion"; const std::wstring PotionItem::THROWABLE_ICON = L"potion_splash"; diff --git a/Minecraft.World/Items/PotionItem.h b/Minecraft.World/net/minecraft/world/item/PotionItem.h similarity index 100% rename from Minecraft.World/Items/PotionItem.h rename to Minecraft.World/net/minecraft/world/item/PotionItem.h diff --git a/Minecraft.World/Util/Rarity.cpp b/Minecraft.World/net/minecraft/world/item/Rarity.cpp similarity index 89% rename from Minecraft.World/Util/Rarity.cpp rename to Minecraft.World/net/minecraft/world/item/Rarity.cpp index 73368c2a7..1a9576144 100644 --- a/Minecraft.World/Util/Rarity.cpp +++ b/Minecraft.World/net/minecraft/world/item/Rarity.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "Rarity.h" diff --git a/Minecraft.World/Util/Rarity.h b/Minecraft.World/net/minecraft/world/item/Rarity.h similarity index 100% rename from Minecraft.World/Util/Rarity.h rename to Minecraft.World/net/minecraft/world/item/Rarity.h diff --git a/Minecraft.World/Items/RecordingItem.cpp b/Minecraft.World/net/minecraft/world/item/RecordingItem.cpp similarity index 87% rename from Minecraft.World/Items/RecordingItem.cpp rename to Minecraft.World/net/minecraft/world/item/RecordingItem.cpp index 1b8413a6d..cce62e64d 100644 --- a/Minecraft.World/Items/RecordingItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/RecordingItem.cpp @@ -1,12 +1,12 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "net.minecraft.world.item.h" +#include "../net.minecraft.world.h" #include "ItemInstance.h" #include "RecordingItem.h" -#include "../Stats/GenericStats.h" +#include "../../stats/GenericStats.h" std::unordered_map RecordingItem::BY_NAME; diff --git a/Minecraft.World/Items/RecordingItem.h b/Minecraft.World/net/minecraft/world/item/RecordingItem.h similarity index 100% rename from Minecraft.World/Items/RecordingItem.h rename to Minecraft.World/net/minecraft/world/item/RecordingItem.h diff --git a/Minecraft.World/Items/RedstoneItem.cpp b/Minecraft.World/net/minecraft/world/item/RedStoneItem.cpp similarity index 82% rename from Minecraft.World/Items/RedstoneItem.cpp rename to Minecraft.World/net/minecraft/world/item/RedStoneItem.cpp index ef8454e08..5575d0325 100644 --- a/Minecraft.World/Items/RedstoneItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/RedStoneItem.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" #include "ItemInstance.h" -#include "../Stats/GenericStats.h" -#include "RedstoneItem.h" +#include "../../stats/GenericStats.h" +#include "RedStoneItem.h" RedStoneItem::RedStoneItem(int id) : Item(id) {} diff --git a/Minecraft.World/Items/RedstoneItem.h b/Minecraft.World/net/minecraft/world/item/RedStoneItem.h similarity index 100% rename from Minecraft.World/Items/RedstoneItem.h rename to Minecraft.World/net/minecraft/world/item/RedStoneItem.h diff --git a/Minecraft.World/Items/SaddleItem.cpp b/Minecraft.World/net/minecraft/world/item/SaddleItem.cpp similarity index 81% rename from Minecraft.World/Items/SaddleItem.cpp rename to Minecraft.World/net/minecraft/world/item/SaddleItem.cpp index a7a1544ff..55e8e16f9 100644 --- a/Minecraft.World/Items/SaddleItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/SaddleItem.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.animal.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.entity.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/animal/net.minecraft.world.entity.animal.h" +#include "net.minecraft.world.item.h" +#include "../entity/net.minecraft.world.entity.h" #include "SaddleItem.h" SaddleItem::SaddleItem(int id) : Item(id) { maxStackSize = 1; } diff --git a/Minecraft.World/Items/SaddleItem.h b/Minecraft.World/net/minecraft/world/item/SaddleItem.h similarity index 100% rename from Minecraft.World/Items/SaddleItem.h rename to Minecraft.World/net/minecraft/world/item/SaddleItem.h diff --git a/Minecraft.World/Items/TileItems/SaplingTileItem.cpp b/Minecraft.World/net/minecraft/world/item/SaplingTileItem.cpp similarity index 87% rename from Minecraft.World/Items/TileItems/SaplingTileItem.cpp rename to Minecraft.World/net/minecraft/world/item/SaplingTileItem.cpp index 86fda0381..f3cea6041 100644 --- a/Minecraft.World/Items/TileItems/SaplingTileItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/SaplingTileItem.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "TileItem.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../level/tile/net.minecraft.world.level.tile.h" #include "SaplingTileItem.h" SaplingTileItem::SaplingTileItem(int id) : TileItem(id) { diff --git a/Minecraft.World/Items/TileItems/SaplingTileItem.h b/Minecraft.World/net/minecraft/world/item/SaplingTileItem.h similarity index 100% rename from Minecraft.World/Items/TileItems/SaplingTileItem.h rename to Minecraft.World/net/minecraft/world/item/SaplingTileItem.h diff --git a/Minecraft.World/Items/SeedFoodItem.cpp b/Minecraft.World/net/minecraft/world/item/SeedFoodItem.cpp similarity index 84% rename from Minecraft.World/Items/SeedFoodItem.cpp rename to Minecraft.World/net/minecraft/world/item/SeedFoodItem.cpp index 6962b0be1..c1ef19e3f 100644 --- a/Minecraft.World/Items/SeedFoodItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/SeedFoodItem.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../../net.minecraft.h" +#include "../level/net.minecraft.world.level.h" #include "SeedFoodItem.h" SeedFoodItem::SeedFoodItem(int id, int nutrition, float saturationMod, diff --git a/Minecraft.World/Items/SeedFoodItem.h b/Minecraft.World/net/minecraft/world/item/SeedFoodItem.h similarity index 100% rename from Minecraft.World/Items/SeedFoodItem.h rename to Minecraft.World/net/minecraft/world/item/SeedFoodItem.h diff --git a/Minecraft.World/Items/SeedItem.cpp b/Minecraft.World/net/minecraft/world/item/SeedItem.cpp similarity index 82% rename from Minecraft.World/Items/SeedItem.cpp rename to Minecraft.World/net/minecraft/world/item/SeedItem.cpp index 40393294f..2e1153dcd 100644 --- a/Minecraft.World/Items/SeedItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/SeedItem.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "Item.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" #include "ItemInstance.h" #include "SeedItem.h" diff --git a/Minecraft.World/Items/SeedItem.h b/Minecraft.World/net/minecraft/world/item/SeedItem.h similarity index 100% rename from Minecraft.World/Items/SeedItem.h rename to Minecraft.World/net/minecraft/world/item/SeedItem.h diff --git a/Minecraft.World/Items/ShearsItem.cpp b/Minecraft.World/net/minecraft/world/item/ShearsItem.cpp similarity index 90% rename from Minecraft.World/Items/ShearsItem.cpp rename to Minecraft.World/net/minecraft/world/item/ShearsItem.cpp index e1b4c360d..d858ca656 100644 --- a/Minecraft.World/Items/ShearsItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/ShearsItem.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "ShearsItem.h" -#include "../Blocks/Tile.h" -#include "../Headers/net.minecraft.world.entity.h" +#include "../level/tile/Tile.h" +#include "../entity/net.minecraft.world.entity.h" ShearsItem::ShearsItem(int itemId) : Item(itemId) { setMaxStackSize(1); diff --git a/Minecraft.World/Items/ShearsItem.h b/Minecraft.World/net/minecraft/world/item/ShearsItem.h similarity index 100% rename from Minecraft.World/Items/ShearsItem.h rename to Minecraft.World/net/minecraft/world/item/ShearsItem.h diff --git a/Minecraft.World/Items/ShovelItem.cpp b/Minecraft.World/net/minecraft/world/item/ShovelItem.cpp similarity index 88% rename from Minecraft.World/Items/ShovelItem.cpp rename to Minecraft.World/net/minecraft/world/item/ShovelItem.cpp index cebb309a7..a03c42d9c 100644 --- a/Minecraft.World/Items/ShovelItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/ShovelItem.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../level/tile/net.minecraft.world.level.tile.h" #include "ShovelItem.h" TileArray* ShovelItem::diggables = nullptr; diff --git a/Minecraft.World/Items/ShovelItem.h b/Minecraft.World/net/minecraft/world/item/ShovelItem.h similarity index 100% rename from Minecraft.World/Items/ShovelItem.h rename to Minecraft.World/net/minecraft/world/item/ShovelItem.h diff --git a/Minecraft.World/Items/SignItem.cpp b/Minecraft.World/net/minecraft/world/item/SignItem.cpp similarity index 85% rename from Minecraft.World/Items/SignItem.cpp rename to Minecraft.World/net/minecraft/world/item/SignItem.cpp index f24b7d206..0ec2e5de0 100644 --- a/Minecraft.World/Items/SignItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/SignItem.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../level/tile/entity/net.minecraft.world.level.tile.entity.h" #include "ItemInstance.h" #include "SignItem.h" -#include "../Stats/GenericStats.h" +#include "../../stats/GenericStats.h" SignItem::SignItem(int id) : Item(id) { // 4J-PB - Changed for TU9 diff --git a/Minecraft.World/Items/SignItem.h b/Minecraft.World/net/minecraft/world/item/SignItem.h similarity index 100% rename from Minecraft.World/Items/SignItem.h rename to Minecraft.World/net/minecraft/world/item/SignItem.h diff --git a/Minecraft.World/Items/SimpleFoiledItem.cpp b/Minecraft.World/net/minecraft/world/item/SimpleFoiledItem.cpp similarity index 80% rename from Minecraft.World/Items/SimpleFoiledItem.cpp rename to Minecraft.World/net/minecraft/world/item/SimpleFoiledItem.cpp index 06a176c12..b3695f7b8 100644 --- a/Minecraft.World/Items/SimpleFoiledItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/SimpleFoiledItem.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "SimpleFoiledItem.h" diff --git a/Minecraft.World/Items/SimpleFoiledItem.h b/Minecraft.World/net/minecraft/world/item/SimpleFoiledItem.h similarity index 100% rename from Minecraft.World/Items/SimpleFoiledItem.h rename to Minecraft.World/net/minecraft/world/item/SimpleFoiledItem.h diff --git a/Minecraft.World/Items/TileItems/SkullItem.cpp b/Minecraft.World/net/minecraft/world/item/SkullItem.cpp similarity index 91% rename from Minecraft.World/Items/TileItems/SkullItem.cpp rename to Minecraft.World/net/minecraft/world/item/SkullItem.cpp index fb7a581be..526ca07eb 100644 --- a/Minecraft.World/Items/TileItems/SkullItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/SkullItem.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Headers/net.minecraft.h" -#include "../../Headers/net.minecraft.world.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/net.minecraft.world.level.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../net.minecraft.h" +#include "../net.minecraft.world.h" #include "SkullItem.h" const unsigned int SkullItem::NAMES[SKULL_COUNT] = { diff --git a/Minecraft.World/Items/TileItems/SkullItem.h b/Minecraft.World/net/minecraft/world/item/SkullItem.h similarity index 98% rename from Minecraft.World/Items/TileItems/SkullItem.h rename to Minecraft.World/net/minecraft/world/item/SkullItem.h index abc741a1c..16a97ca71 100644 --- a/Minecraft.World/Items/TileItems/SkullItem.h +++ b/Minecraft.World/net/minecraft/world/item/SkullItem.h @@ -1,6 +1,6 @@ #pragma once -#include "../Item.h" +#include "Item.h" class SkullItem : public Item { private: diff --git a/Minecraft.World/Items/SnowItem.cpp b/Minecraft.World/net/minecraft/world/item/SnowItem.cpp similarity index 88% rename from Minecraft.World/Items/SnowItem.cpp rename to Minecraft.World/net/minecraft/world/item/SnowItem.cpp index 66524f9b4..857e67c6c 100644 --- a/Minecraft.World/Items/SnowItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/SnowItem.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../level/net.minecraft.world.level.h" #include "SnowItem.h" -#include "Util/AABB.h" +#include "../phys/AABB.h" SnowItem::SnowItem(int id, Tile* parentTile) : AuxDataTileItem(id, parentTile) {} diff --git a/Minecraft.World/Items/SnowItem.h b/Minecraft.World/net/minecraft/world/item/SnowItem.h similarity index 90% rename from Minecraft.World/Items/SnowItem.h rename to Minecraft.World/net/minecraft/world/item/SnowItem.h index 02b4bca99..b5ee55688 100644 --- a/Minecraft.World/Items/SnowItem.h +++ b/Minecraft.World/net/minecraft/world/item/SnowItem.h @@ -1,6 +1,6 @@ #pragma once -#include "TileItems/AuxDataTileItem.h" +#include "AuxDataTileItem.h" class SnowItem : public AuxDataTileItem { public: diff --git a/Minecraft.World/Items/SnowballItem.cpp b/Minecraft.World/net/minecraft/world/item/SnowballItem.cpp similarity index 67% rename from Minecraft.World/Items/SnowballItem.cpp rename to Minecraft.World/net/minecraft/world/item/SnowballItem.cpp index fed115d79..dfba0af77 100644 --- a/Minecraft.World/Items/SnowballItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/SnowballItem.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.projectile.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../entity/projectile/net.minecraft.world.entity.projectile.h" +#include "net.minecraft.world.item.h" +#include "../level/net.minecraft.world.level.h" #include "SnowballItem.h" -#include "../Util/SoundTypes.h" +#include "../../../../Header Files/SoundTypes.h" SnowballItem::SnowballItem(int id) : Item(id) { this->maxStackSize = 16; } diff --git a/Minecraft.World/Items/SnowballItem.h b/Minecraft.World/net/minecraft/world/item/SnowballItem.h similarity index 100% rename from Minecraft.World/Items/SnowballItem.h rename to Minecraft.World/net/minecraft/world/item/SnowballItem.h diff --git a/Minecraft.World/Items/SpawnEggItem.cpp b/Minecraft.World/net/minecraft/world/item/SpawnEggItem.cpp similarity index 95% rename from Minecraft.World/Items/SpawnEggItem.cpp rename to Minecraft.World/net/minecraft/world/item/SpawnEggItem.cpp index ac2ba878d..75f63c08b 100644 --- a/Minecraft.World/Items/SpawnEggItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/SpawnEggItem.cpp @@ -1,15 +1,15 @@ -#include "../Platform/stdafx.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.npc.h" -#include "../Headers/net.minecraft.world.h" -#include "../Util/HitResult.h" +#include "../../../../Header Files/stdafx.h" +#include "../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../../net.minecraft.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../level/tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../entity/net.minecraft.world.entity.h" +#include "../entity/npc/net.minecraft.world.entity.npc.h" +#include "../net.minecraft.world.h" +#include "../phys/HitResult.h" #include "SpawnEggItem.h" -#include "../Util/Difficulty.h" +#include "../Difficulty.h" SpawnEggItem::SpawnEggItem(int id) : Item(id) { setMaxStackSize(16); // 4J-PB brought forward. It is 64 on PC, but we'll diff --git a/Minecraft.World/Items/SpawnEggItem.h b/Minecraft.World/net/minecraft/world/item/SpawnEggItem.h similarity index 100% rename from Minecraft.World/Items/SpawnEggItem.h rename to Minecraft.World/net/minecraft/world/item/SpawnEggItem.h diff --git a/Minecraft.World/Items/TileItems/StoneSlabTileItem.cpp b/Minecraft.World/net/minecraft/world/item/StoneSlabTileItem.cpp similarity index 92% rename from Minecraft.World/Items/TileItems/StoneSlabTileItem.cpp rename to Minecraft.World/net/minecraft/world/item/StoneSlabTileItem.cpp index 3ec12fd21..2555010eb 100644 --- a/Minecraft.World/Items/TileItems/StoneSlabTileItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/StoneSlabTileItem.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.item.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/item/net.minecraft.world.entity.item.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "net.minecraft.world.item.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../../net.minecraft.h" #include "StoneSlabTileItem.h" -#include "../../Util/AABB.h" +#include "../phys/AABB.h" StoneSlabTileItem::StoneSlabTileItem(int id, HalfSlabTile* halfTile, HalfSlabTile* fullTile, bool full) diff --git a/Minecraft.World/Items/TileItems/StoneSlabTileItem.h b/Minecraft.World/net/minecraft/world/item/StoneSlabTileItem.h similarity index 96% rename from Minecraft.World/Items/TileItems/StoneSlabTileItem.h rename to Minecraft.World/net/minecraft/world/item/StoneSlabTileItem.h index 2de07147e..e0007ffb6 100644 --- a/Minecraft.World/Items/TileItems/StoneSlabTileItem.h +++ b/Minecraft.World/net/minecraft/world/item/StoneSlabTileItem.h @@ -1,7 +1,7 @@ #pragma once #include "TileItem.h" -#include "../../Blocks/HalfSlabTile.h" +#include "../level/tile/HalfSlabTile.h" class StoneSlabTileItem : public TileItem { private: diff --git a/Minecraft.World/Items/TileItems/TileItem.cpp b/Minecraft.World/net/minecraft/world/item/TileItem.cpp similarity index 94% rename from Minecraft.World/Items/TileItems/TileItem.cpp rename to Minecraft.World/net/minecraft/world/item/TileItem.cpp index df2924593..fc53e9595 100644 --- a/Minecraft.World/Items/TileItems/TileItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/TileItem.cpp @@ -1,16 +1,16 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.h" -#include "../../Headers/net.minecraft.stats.h" +#include "../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.h" +#include "../entity/net.minecraft.world.entity.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "net.minecraft.world.item.h" +#include "../net.minecraft.world.h" +#include "../../stats/net.minecraft.stats.h" #include "TileItem.h" -#include "../../Util/Facing.h" +#include "../../Facing.h" // 4J-PB - for the debug option of not removing items #include diff --git a/Minecraft.World/Items/TileItems/TileItem.h b/Minecraft.World/net/minecraft/world/item/TileItem.h similarity index 98% rename from Minecraft.World/Items/TileItems/TileItem.h rename to Minecraft.World/net/minecraft/world/item/TileItem.h index 8688f2c08..e8f4475a1 100644 --- a/Minecraft.World/Items/TileItems/TileItem.h +++ b/Minecraft.World/net/minecraft/world/item/TileItem.h @@ -1,6 +1,6 @@ #pragma once -#include "../Item.h" +#include "Item.h" class Player; class Level; diff --git a/Minecraft.World/Util/UseAnim.h b/Minecraft.World/net/minecraft/world/item/UseAnim.h similarity index 100% rename from Minecraft.World/Util/UseAnim.h rename to Minecraft.World/net/minecraft/world/item/UseAnim.h diff --git a/Minecraft.World/Items/TileItems/WaterLilyTileItem.cpp b/Minecraft.World/net/minecraft/world/item/WaterLilyTileItem.cpp similarity index 86% rename from Minecraft.World/Items/TileItems/WaterLilyTileItem.cpp rename to Minecraft.World/net/minecraft/world/item/WaterLilyTileItem.cpp index ce6c6bd54..c59a978ef 100644 --- a/Minecraft.World/Items/TileItems/WaterLilyTileItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/WaterLilyTileItem.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.material.h" -#include "../../Headers/net.minecraft.world.entity.player.h" +#include "../../../../Header Files/stdafx.h" +#include "../phys/net.minecraft.world.phys.h" +#include "../level/net.minecraft.world.level.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "../level/material/net.minecraft.world.level.material.h" +#include "../entity/player/net.minecraft.world.entity.player.h" #include "WaterLilyTileItem.h" WaterLilyTileItem::WaterLilyTileItem(int id) : ColoredTileItem(id, false) {} diff --git a/Minecraft.World/Items/TileItems/WaterLilyTileItem.h b/Minecraft.World/net/minecraft/world/item/WaterLilyTileItem.h similarity index 100% rename from Minecraft.World/Items/TileItems/WaterLilyTileItem.h rename to Minecraft.World/net/minecraft/world/item/WaterLilyTileItem.h diff --git a/Minecraft.World/Items/WeaponItem.cpp b/Minecraft.World/net/minecraft/world/item/WeaponItem.cpp similarity index 88% rename from Minecraft.World/Items/WeaponItem.cpp rename to Minecraft.World/net/minecraft/world/item/WeaponItem.cpp index d6ec87a90..041dd4b79 100644 --- a/Minecraft.World/Items/WeaponItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/WeaponItem.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.ai.attributes.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.monster.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.world.item.h" +#include "../entity/net.minecraft.world.entity.h" +#include "../entity/ai/attributes/net.minecraft.world.entity.ai.attributes.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "../entity/monster/net.minecraft.world.entity.monster.h" +#include "../level/tile/net.minecraft.world.level.tile.h" #include "WeaponItem.h" WeaponItem::WeaponItem(int id, const Tier* tier) : Item(id), tier(tier) { diff --git a/Minecraft.World/Items/WeaponItem.h b/Minecraft.World/net/minecraft/world/item/WeaponItem.h similarity index 100% rename from Minecraft.World/Items/WeaponItem.h rename to Minecraft.World/net/minecraft/world/item/WeaponItem.h diff --git a/Minecraft.World/Items/TileItems/WoolTileItem.cpp b/Minecraft.World/net/minecraft/world/item/WoolTileItem.cpp similarity index 96% rename from Minecraft.World/Items/TileItems/WoolTileItem.cpp rename to Minecraft.World/net/minecraft/world/item/WoolTileItem.cpp index 7f7f6ec05..aa4a54cfa 100644 --- a/Minecraft.World/Items/TileItems/WoolTileItem.cpp +++ b/Minecraft.World/net/minecraft/world/item/WoolTileItem.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../ItemInstance.h" -#include "../DyePowderItem.h" +#include "../../../../Header Files/stdafx.h" +#include "../level/tile/net.minecraft.world.level.tile.h" +#include "ItemInstance.h" +#include "DyePowderItem.h" #include "WoolTileItem.h" const unsigned int WoolTileItem::COLOR_DESCS[] = { diff --git a/Minecraft.World/Items/TileItems/WoolTileItem.h b/Minecraft.World/net/minecraft/world/item/WoolTileItem.h similarity index 100% rename from Minecraft.World/Items/TileItems/WoolTileItem.h rename to Minecraft.World/net/minecraft/world/item/WoolTileItem.h diff --git a/Minecraft.World/Items/WrittenBookItem.h b/Minecraft.World/net/minecraft/world/item/WrittenBookItem.h similarity index 100% rename from Minecraft.World/Items/WrittenBookItem.h rename to Minecraft.World/net/minecraft/world/item/WrittenBookItem.h diff --git a/Minecraft.World/Blocks/TileEntities/PotionBrewing.cpp b/Minecraft.World/net/minecraft/world/item/alchemy/PotionBrewing.cpp similarity index 99% rename from Minecraft.World/Blocks/TileEntities/PotionBrewing.cpp rename to Minecraft.World/net/minecraft/world/item/alchemy/PotionBrewing.cpp index 9768fc063..433026aa7 100644 --- a/Minecraft.World/Blocks/TileEntities/PotionBrewing.cpp +++ b/Minecraft.World/net/minecraft/world/item/alchemy/PotionBrewing.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../../Minecraft.Client/Minecraft.h" -#include "../../Headers/net.minecraft.world.effect.h" -#include "../../Util/JavaMath.h" -#include "../../Util/SharedConstants.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../../effect/net.minecraft.world.effect.h" +#include "../../../../../ConsoleJavaLibs/JavaMath.h" +#include "../../../SharedConstants.h" #include "PotionBrewing.h" const int PotionBrewing::DEFAULT_APPEARANCES[] = { diff --git a/Minecraft.World/Blocks/TileEntities/PotionBrewing.h b/Minecraft.World/net/minecraft/world/item/alchemy/PotionBrewing.h similarity index 100% rename from Minecraft.World/Blocks/TileEntities/PotionBrewing.h rename to Minecraft.World/net/minecraft/world/item/alchemy/PotionBrewing.h diff --git a/Minecraft.World/net/minecraft/world/item/alchemy/net.minecraft.world.item.alchemy.h b/Minecraft.World/net/minecraft/world/item/alchemy/net.minecraft.world.item.alchemy.h new file mode 100644 index 000000000..fe69821fb --- /dev/null +++ b/Minecraft.World/net/minecraft/world/item/alchemy/net.minecraft.world.item.alchemy.h @@ -0,0 +1,3 @@ +#pragma once + +#include "PotionBrewing.h" \ No newline at end of file diff --git a/Minecraft.World/Recipes/ArmorDyeRecipe.cpp b/Minecraft.World/net/minecraft/world/item/crafting/ArmorDyeRecipe.cpp similarity index 95% rename from Minecraft.World/Recipes/ArmorDyeRecipe.cpp rename to Minecraft.World/net/minecraft/world/item/crafting/ArmorDyeRecipe.cpp index ebf83a363..0fab702b5 100644 --- a/Minecraft.World/Recipes/ArmorDyeRecipe.cpp +++ b/Minecraft.World/net/minecraft/world/item/crafting/ArmorDyeRecipe.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.animal.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.item.crafting.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/animal/net.minecraft.world.entity.animal.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "../net.minecraft.world.item.h" +#include "net.minecraft.world.item.crafting.h" #include "ArmorDyeRecipe.h" bool ArmorDyeRecipe::matches(std::shared_ptr craftSlots, diff --git a/Minecraft.World/Recipes/ArmorDyeRecipe.h b/Minecraft.World/net/minecraft/world/item/crafting/ArmorDyeRecipe.h similarity index 100% rename from Minecraft.World/Recipes/ArmorDyeRecipe.h rename to Minecraft.World/net/minecraft/world/item/crafting/ArmorDyeRecipe.h diff --git a/Minecraft.World/Recipes/ArmorRecipes.cpp b/Minecraft.World/net/minecraft/world/item/crafting/ArmorRecipes.cpp similarity index 97% rename from Minecraft.World/Recipes/ArmorRecipes.cpp rename to Minecraft.World/net/minecraft/world/item/crafting/ArmorRecipes.cpp index 20a1b3c9f..32c0efb1c 100644 --- a/Minecraft.World/Recipes/ArmorRecipes.cpp +++ b/Minecraft.World/net/minecraft/world/item/crafting/ArmorRecipes.cpp @@ -2,9 +2,9 @@ // import net.minecraft.world.item.*; // import net.minecraft.world.level.tile.Tile; -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Blocks/Tile.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.item.h" +#include "../../level/tile/Tile.h" #include "Recipy.h" #include "Recipes.h" #include "ArmorRecipes.h" diff --git a/Minecraft.World/Recipes/ArmorRecipes.h b/Minecraft.World/net/minecraft/world/item/crafting/ArmorRecipes.h similarity index 100% rename from Minecraft.World/Recipes/ArmorRecipes.h rename to Minecraft.World/net/minecraft/world/item/crafting/ArmorRecipes.h diff --git a/Minecraft.World/Recipes/ClothDyeRecipes.cpp b/Minecraft.World/net/minecraft/world/item/crafting/ClothDyeRecipes.cpp similarity index 96% rename from Minecraft.World/Recipes/ClothDyeRecipes.cpp rename to Minecraft.World/net/minecraft/world/item/crafting/ClothDyeRecipes.cpp index 26a382df9..52026e0bf 100644 --- a/Minecraft.World/Recipes/ClothDyeRecipes.cpp +++ b/Minecraft.World/net/minecraft/world/item/crafting/ClothDyeRecipes.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.item.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" #include "Recipy.h" #include "Recipes.h" #include "ClothDyeRecipes.h" diff --git a/Minecraft.World/Recipes/ClothDyeRecipes.h b/Minecraft.World/net/minecraft/world/item/crafting/ClothDyeRecipes.h similarity index 100% rename from Minecraft.World/Recipes/ClothDyeRecipes.h rename to Minecraft.World/net/minecraft/world/item/crafting/ClothDyeRecipes.h diff --git a/Minecraft.World/Recipes/FireworksRecipe.cpp b/Minecraft.World/net/minecraft/world/item/crafting/FireworksRecipe.cpp similarity index 99% rename from Minecraft.World/Recipes/FireworksRecipe.cpp rename to Minecraft.World/net/minecraft/world/item/crafting/FireworksRecipe.cpp index f546810ef..49100e9dd 100644 --- a/Minecraft.World/Recipes/FireworksRecipe.cpp +++ b/Minecraft.World/net/minecraft/world/item/crafting/FireworksRecipe.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.item.h" #include "FireworksRecipe.h" thread_local FireworksRecipe::ThreadStorage* FireworksRecipe::m_tlsStorage = diff --git a/Minecraft.World/Recipes/FireworksRecipe.h b/Minecraft.World/net/minecraft/world/item/crafting/FireworksRecipe.h similarity index 100% rename from Minecraft.World/Recipes/FireworksRecipe.h rename to Minecraft.World/net/minecraft/world/item/crafting/FireworksRecipe.h diff --git a/Minecraft.World/Recipes/FoodRecipes.cpp b/Minecraft.World/net/minecraft/world/item/crafting/FoodRecipes.cpp similarity index 95% rename from Minecraft.World/Recipes/FoodRecipes.cpp rename to Minecraft.World/net/minecraft/world/item/crafting/FoodRecipes.cpp index f40ecaf16..501bd5434 100644 --- a/Minecraft.World/Recipes/FoodRecipes.cpp +++ b/Minecraft.World/net/minecraft/world/item/crafting/FoodRecipes.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Items/DyePowderItem.h" -#include "../Blocks/Tile.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.item.h" +#include "../DyePowderItem.h" +#include "../../level/tile/Tile.h" #include "Recipy.h" #include "Recipes.h" #include "FoodRecipes.h" diff --git a/Minecraft.World/Recipes/FoodRecipes.h b/Minecraft.World/net/minecraft/world/item/crafting/FoodRecipes.h similarity index 100% rename from Minecraft.World/Recipes/FoodRecipes.h rename to Minecraft.World/net/minecraft/world/item/crafting/FoodRecipes.h diff --git a/Minecraft.World/Recipes/FurnaceRecipes.cpp b/Minecraft.World/net/minecraft/world/item/crafting/FurnaceRecipes.cpp similarity index 96% rename from Minecraft.World/Recipes/FurnaceRecipes.cpp rename to Minecraft.World/net/minecraft/world/item/crafting/FurnaceRecipes.cpp index df477fb49..21e368842 100644 --- a/Minecraft.World/Recipes/FurnaceRecipes.cpp +++ b/Minecraft.World/net/minecraft/world/item/crafting/FurnaceRecipes.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Blocks/Tile.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.item.h" +#include "../../level/tile/Tile.h" #include "FurnaceRecipes.h" FurnaceRecipes* FurnaceRecipes::instance = nullptr; diff --git a/Minecraft.World/Recipes/FurnaceRecipes.h b/Minecraft.World/net/minecraft/world/item/crafting/FurnaceRecipes.h similarity index 100% rename from Minecraft.World/Recipes/FurnaceRecipes.h rename to Minecraft.World/net/minecraft/world/item/crafting/FurnaceRecipes.h diff --git a/Minecraft.World/Recipes/MapCloningRecipe.h b/Minecraft.World/net/minecraft/world/item/crafting/MapCloningRecipe.h similarity index 100% rename from Minecraft.World/Recipes/MapCloningRecipe.h rename to Minecraft.World/net/minecraft/world/item/crafting/MapCloningRecipe.h diff --git a/Minecraft.World/Recipes/MapExtendingRecipe.h b/Minecraft.World/net/minecraft/world/item/crafting/MapExtendingRecipe.h similarity index 100% rename from Minecraft.World/Recipes/MapExtendingRecipe.h rename to Minecraft.World/net/minecraft/world/item/crafting/MapExtendingRecipe.h diff --git a/Minecraft.World/Recipes/OreRecipes.cpp b/Minecraft.World/net/minecraft/world/item/crafting/OreRecipes.cpp similarity index 91% rename from Minecraft.World/Recipes/OreRecipes.cpp rename to Minecraft.World/net/minecraft/world/item/crafting/OreRecipes.cpp index f5adc8a4d..67d2f1fdd 100644 --- a/Minecraft.World/Recipes/OreRecipes.cpp +++ b/Minecraft.World/net/minecraft/world/item/crafting/OreRecipes.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Items/DyePowderItem.h" -#include "../Blocks/Tile.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.item.h" +#include "../DyePowderItem.h" +#include "../../level/tile/Tile.h" #include "Recipy.h" #include "Recipes.h" #include "OreRecipes.h" diff --git a/Minecraft.World/Recipes/OreRecipes.h b/Minecraft.World/net/minecraft/world/item/crafting/OreRecipes.h similarity index 100% rename from Minecraft.World/Recipes/OreRecipes.h rename to Minecraft.World/net/minecraft/world/item/crafting/OreRecipes.h diff --git a/Minecraft.World/Recipes/Recipes.cpp b/Minecraft.World/net/minecraft/world/item/crafting/Recipes.cpp similarity index 99% rename from Minecraft.World/Recipes/Recipes.cpp rename to Minecraft.World/net/minecraft/world/item/crafting/Recipes.cpp index 8c683a85b..bd84abde0 100644 --- a/Minecraft.World/Recipes/Recipes.cpp +++ b/Minecraft.World/net/minecraft/world/item/crafting/Recipes.cpp @@ -1,12 +1,12 @@ -#include "../Platform/stdafx.h" -#include "../Containers/Container.h" -#include "../Containers/AbstractContainerMenu.h" -#include "../Containers/CraftingContainer.h" -#include "../Items/CoalItem.h" -#include "../Items/Item.h" -#include "../Items/ItemInstance.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.item.crafting.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../Container.h" +#include "../../inventory/AbstractContainerMenu.h" +#include "../../inventory/CraftingContainer.h" +#include "../CoalItem.h" +#include "../Item.h" +#include "../ItemInstance.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" +#include "net.minecraft.world.item.crafting.h" Recipes* Recipes::instance = nullptr; ArmorRecipes* Recipes::pArmorRecipes = nullptr; diff --git a/Minecraft.World/Recipes/Recipes.h b/Minecraft.World/net/minecraft/world/item/crafting/Recipes.h similarity index 100% rename from Minecraft.World/Recipes/Recipes.h rename to Minecraft.World/net/minecraft/world/item/crafting/Recipes.h diff --git a/Minecraft.World/Recipes/Recipy.h b/Minecraft.World/net/minecraft/world/item/crafting/Recipy.h similarity index 97% rename from Minecraft.World/Recipes/Recipy.h rename to Minecraft.World/net/minecraft/world/item/crafting/Recipy.h index fded84c19..62df868ff 100644 --- a/Minecraft.World/Recipes/Recipy.h +++ b/Minecraft.World/net/minecraft/world/item/crafting/Recipy.h @@ -5,7 +5,7 @@ #pragma once -#include "../Containers/CraftingContainer.h" +#include "../../inventory/CraftingContainer.h" #define RECIPE_TYPE_2x2 0 #define RECIPE_TYPE_3x3 1 diff --git a/Minecraft.World/Recipes/ShapedRecipy.cpp b/Minecraft.World/net/minecraft/world/item/crafting/ShapedRecipy.cpp similarity index 97% rename from Minecraft.World/Recipes/ShapedRecipy.cpp rename to Minecraft.World/net/minecraft/world/item/crafting/ShapedRecipy.cpp index e5b1ea0f0..9e24b3ee5 100644 --- a/Minecraft.World/Recipes/ShapedRecipy.cpp +++ b/Minecraft.World/net/minecraft/world/item/crafting/ShapedRecipy.cpp @@ -3,10 +3,10 @@ // import net.minecraft.world.inventory.CraftingContainer; // import net.minecraft.world.item.ItemInstance; -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.inventory.h" -#include "../Blocks/Tile.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.item.h" +#include "../../inventory/net.minecraft.world.inventory.h" +#include "../../level/tile/Tile.h" #include "Recipy.h" #include "Recipes.h" #include "ShapedRecipy.h" diff --git a/Minecraft.World/Recipes/ShapedRecipy.h b/Minecraft.World/net/minecraft/world/item/crafting/ShapedRecipy.h similarity index 100% rename from Minecraft.World/Recipes/ShapedRecipy.h rename to Minecraft.World/net/minecraft/world/item/crafting/ShapedRecipy.h diff --git a/Minecraft.World/Recipes/ShapelessRecipy.cpp b/Minecraft.World/net/minecraft/world/item/crafting/ShapelessRecipy.cpp similarity index 96% rename from Minecraft.World/Recipes/ShapelessRecipy.cpp rename to Minecraft.World/net/minecraft/world/item/crafting/ShapelessRecipy.cpp index 7bffab698..d1cec39d1 100644 --- a/Minecraft.World/Recipes/ShapelessRecipy.cpp +++ b/Minecraft.World/net/minecraft/world/item/crafting/ShapelessRecipy.cpp @@ -4,10 +4,10 @@ // // import net.minecraft.world.inventory.CraftingContainer; // import net.minecraft.world.item.ItemInstance; -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.inventory.h" -#include "../Blocks/Tile.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.item.h" +#include "../../inventory/net.minecraft.world.inventory.h" +#include "../../level/tile/Tile.h" #include "Recipy.h" #include "Recipes.h" #include "ShapelessRecipy.h" diff --git a/Minecraft.World/Recipes/ShapelessRecipy.h b/Minecraft.World/net/minecraft/world/item/crafting/ShapelessRecipy.h similarity index 100% rename from Minecraft.World/Recipes/ShapelessRecipy.h rename to Minecraft.World/net/minecraft/world/item/crafting/ShapelessRecipy.h diff --git a/Minecraft.World/Recipes/StructureRecipes.cpp b/Minecraft.World/net/minecraft/world/item/crafting/StructureRecipes.cpp similarity index 96% rename from Minecraft.World/Recipes/StructureRecipes.cpp rename to Minecraft.World/net/minecraft/world/item/crafting/StructureRecipes.cpp index 25f011866..7adb5cc68 100644 --- a/Minecraft.World/Recipes/StructureRecipes.cpp +++ b/Minecraft.World/net/minecraft/world/item/crafting/StructureRecipes.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.item.h" +#include "../../level/tile/net.minecraft.world.level.tile.h" #include "Recipy.h" #include "Recipes.h" #include "StructureRecipes.h" diff --git a/Minecraft.World/Recipes/StructureRecipes.h b/Minecraft.World/net/minecraft/world/item/crafting/StructureRecipes.h similarity index 100% rename from Minecraft.World/Recipes/StructureRecipes.h rename to Minecraft.World/net/minecraft/world/item/crafting/StructureRecipes.h diff --git a/Minecraft.World/Recipes/ToolRecipes.cpp b/Minecraft.World/net/minecraft/world/item/crafting/ToolRecipes.cpp similarity index 95% rename from Minecraft.World/Recipes/ToolRecipes.cpp rename to Minecraft.World/net/minecraft/world/item/crafting/ToolRecipes.cpp index c782e0e45..b3b03b49b 100644 --- a/Minecraft.World/Recipes/ToolRecipes.cpp +++ b/Minecraft.World/net/minecraft/world/item/crafting/ToolRecipes.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Blocks/Tile.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.item.h" +#include "../../level/tile/Tile.h" #include "Recipy.h" #include "Recipes.h" #include "ToolRecipes.h" diff --git a/Minecraft.World/Recipes/ToolRecipes.h b/Minecraft.World/net/minecraft/world/item/crafting/ToolRecipes.h similarity index 100% rename from Minecraft.World/Recipes/ToolRecipes.h rename to Minecraft.World/net/minecraft/world/item/crafting/ToolRecipes.h diff --git a/Minecraft.World/Recipes/WeaponRecipes.cpp b/Minecraft.World/net/minecraft/world/item/crafting/WeaponRecipes.cpp similarity index 95% rename from Minecraft.World/Recipes/WeaponRecipes.cpp rename to Minecraft.World/net/minecraft/world/item/crafting/WeaponRecipes.cpp index a37f4ca90..e4a6a9161 100644 --- a/Minecraft.World/Recipes/WeaponRecipes.cpp +++ b/Minecraft.World/net/minecraft/world/item/crafting/WeaponRecipes.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Blocks/Tile.h" +#include "../net.minecraft.world.item.h" +#include "../../level/tile/Tile.h" #include "Recipy.h" #include "Recipes.h" #include "WeaponRecipes.h" diff --git a/Minecraft.World/Recipes/WeaponRecipes.h b/Minecraft.World/net/minecraft/world/item/crafting/WeaponRecipes.h similarity index 100% rename from Minecraft.World/Recipes/WeaponRecipes.h rename to Minecraft.World/net/minecraft/world/item/crafting/WeaponRecipes.h diff --git a/Minecraft.World/net/minecraft/world/item/crafting/net.minecraft.world.item.crafting.h b/Minecraft.World/net/minecraft/world/item/crafting/net.minecraft.world.item.crafting.h new file mode 100644 index 000000000..7224068c7 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/item/crafting/net.minecraft.world.item.crafting.h @@ -0,0 +1,16 @@ +#pragma once + +#include "Recipes.h" +#include "Recipy.h" +#include "ArmorDyeRecipe.h" +#include "ArmorRecipes.h" +#include "ClothDyeRecipes.h" +#include "FoodRecipes.h" +#include "FireworksRecipe.h" +#include "FurnaceRecipes.h" +#include "OreRecipes.h" +#include "ShapedRecipy.h" +#include "ShapelessRecipy.h" +#include "StructureRecipes.h" +#include "ToolRecipes.h" +#include "WeaponRecipes.h" \ No newline at end of file diff --git a/Minecraft.World/Enchantments/ArrowDamageEnchantment.cpp b/Minecraft.World/net/minecraft/world/item/enchantment/ArrowDamageEnchantment.cpp similarity index 90% rename from Minecraft.World/Enchantments/ArrowDamageEnchantment.cpp rename to Minecraft.World/net/minecraft/world/item/enchantment/ArrowDamageEnchantment.cpp index cde223b65..72592608a 100644 --- a/Minecraft.World/Enchantments/ArrowDamageEnchantment.cpp +++ b/Minecraft.World/net/minecraft/world/item/enchantment/ArrowDamageEnchantment.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "ArrowDamageEnchantment.h" ArrowDamageEnchantment::ArrowDamageEnchantment(int id, int frequency) diff --git a/Minecraft.World/Enchantments/ArrowDamageEnchantment.h b/Minecraft.World/net/minecraft/world/item/enchantment/ArrowDamageEnchantment.h similarity index 100% rename from Minecraft.World/Enchantments/ArrowDamageEnchantment.h rename to Minecraft.World/net/minecraft/world/item/enchantment/ArrowDamageEnchantment.h diff --git a/Minecraft.World/Enchantments/ArrowFireEnchantment.cpp b/Minecraft.World/net/minecraft/world/item/enchantment/ArrowFireEnchantment.cpp similarity index 89% rename from Minecraft.World/Enchantments/ArrowFireEnchantment.cpp rename to Minecraft.World/net/minecraft/world/item/enchantment/ArrowFireEnchantment.cpp index d0e1208d7..a13ea670e 100644 --- a/Minecraft.World/Enchantments/ArrowFireEnchantment.cpp +++ b/Minecraft.World/net/minecraft/world/item/enchantment/ArrowFireEnchantment.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "ArrowFireEnchantment.h" ArrowFireEnchantment::ArrowFireEnchantment(int id, int frequency) diff --git a/Minecraft.World/Enchantments/ArrowFireEnchantment.h b/Minecraft.World/net/minecraft/world/item/enchantment/ArrowFireEnchantment.h similarity index 100% rename from Minecraft.World/Enchantments/ArrowFireEnchantment.h rename to Minecraft.World/net/minecraft/world/item/enchantment/ArrowFireEnchantment.h diff --git a/Minecraft.World/Enchantments/ArrowInfiniteEnchantment.cpp b/Minecraft.World/net/minecraft/world/item/enchantment/ArrowInfiniteEnchantment.cpp similarity index 89% rename from Minecraft.World/Enchantments/ArrowInfiniteEnchantment.cpp rename to Minecraft.World/net/minecraft/world/item/enchantment/ArrowInfiniteEnchantment.cpp index 29de1659a..3fecad4b9 100644 --- a/Minecraft.World/Enchantments/ArrowInfiniteEnchantment.cpp +++ b/Minecraft.World/net/minecraft/world/item/enchantment/ArrowInfiniteEnchantment.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "ArrowInfiniteEnchantment.h" ArrowInfiniteEnchantment::ArrowInfiniteEnchantment(int id, int frequency) diff --git a/Minecraft.World/Enchantments/ArrowInfiniteEnchantment.h b/Minecraft.World/net/minecraft/world/item/enchantment/ArrowInfiniteEnchantment.h similarity index 100% rename from Minecraft.World/Enchantments/ArrowInfiniteEnchantment.h rename to Minecraft.World/net/minecraft/world/item/enchantment/ArrowInfiniteEnchantment.h diff --git a/Minecraft.World/Enchantments/ArrowKnockbackEnchantment.cpp b/Minecraft.World/net/minecraft/world/item/enchantment/ArrowKnockbackEnchantment.cpp similarity index 90% rename from Minecraft.World/Enchantments/ArrowKnockbackEnchantment.cpp rename to Minecraft.World/net/minecraft/world/item/enchantment/ArrowKnockbackEnchantment.cpp index a5d6cfcd9..adda48731 100644 --- a/Minecraft.World/Enchantments/ArrowKnockbackEnchantment.cpp +++ b/Minecraft.World/net/minecraft/world/item/enchantment/ArrowKnockbackEnchantment.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "ArrowKnockbackEnchantment.h" ArrowKnockbackEnchantment::ArrowKnockbackEnchantment(int id, int frequency) diff --git a/Minecraft.World/Enchantments/ArrowKnockbackEnchantment.h b/Minecraft.World/net/minecraft/world/item/enchantment/ArrowKnockbackEnchantment.h similarity index 100% rename from Minecraft.World/Enchantments/ArrowKnockbackEnchantment.h rename to Minecraft.World/net/minecraft/world/item/enchantment/ArrowKnockbackEnchantment.h diff --git a/Minecraft.World/Enchantments/DamageEnchantment.cpp b/Minecraft.World/net/minecraft/world/item/enchantment/DamageEnchantment.cpp similarity index 92% rename from Minecraft.World/Enchantments/DamageEnchantment.cpp rename to Minecraft.World/net/minecraft/world/item/enchantment/DamageEnchantment.cpp index 782e7f718..d7ef4e7e2 100644 --- a/Minecraft.World/Enchantments/DamageEnchantment.cpp +++ b/Minecraft.World/net/minecraft/world/item/enchantment/DamageEnchantment.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/net.minecraft.world.entity.h" +#include "../net.minecraft.world.item.h" #include "DamageEnchantment.h" const int DamageEnchantment::names[] = {IDS_ENCHANTMENT_DAMAGE_ALL, diff --git a/Minecraft.World/Enchantments/DamageEnchantment.h b/Minecraft.World/net/minecraft/world/item/enchantment/DamageEnchantment.h similarity index 100% rename from Minecraft.World/Enchantments/DamageEnchantment.h rename to Minecraft.World/net/minecraft/world/item/enchantment/DamageEnchantment.h diff --git a/Minecraft.World/Enchantments/DigDurabilityEnchantment.cpp b/Minecraft.World/net/minecraft/world/item/enchantment/DigDurabilityEnchantment.cpp similarity index 91% rename from Minecraft.World/Enchantments/DigDurabilityEnchantment.cpp rename to Minecraft.World/net/minecraft/world/item/enchantment/DigDurabilityEnchantment.cpp index 89bf00c5a..197bd2552 100644 --- a/Minecraft.World/Enchantments/DigDurabilityEnchantment.cpp +++ b/Minecraft.World/net/minecraft/world/item/enchantment/DigDurabilityEnchantment.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.item.h" #include "DigDurabilityEnchantment.h" DigDurabilityEnchantment::DigDurabilityEnchantment(int id, int frequency) diff --git a/Minecraft.World/Enchantments/DigDurabilityEnchantment.h b/Minecraft.World/net/minecraft/world/item/enchantment/DigDurabilityEnchantment.h similarity index 100% rename from Minecraft.World/Enchantments/DigDurabilityEnchantment.h rename to Minecraft.World/net/minecraft/world/item/enchantment/DigDurabilityEnchantment.h diff --git a/Minecraft.World/Enchantments/DiggingEnchantment.cpp b/Minecraft.World/net/minecraft/world/item/enchantment/DiggingEnchantment.cpp similarity index 87% rename from Minecraft.World/Enchantments/DiggingEnchantment.cpp rename to Minecraft.World/net/minecraft/world/item/enchantment/DiggingEnchantment.cpp index dca6f603f..36833fdab 100644 --- a/Minecraft.World/Enchantments/DiggingEnchantment.cpp +++ b/Minecraft.World/net/minecraft/world/item/enchantment/DiggingEnchantment.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.item.h" #include "DiggingEnchantment.h" DiggingEnchantment::DiggingEnchantment(int id, int frequency) diff --git a/Minecraft.World/Enchantments/DiggingEnchantment.h b/Minecraft.World/net/minecraft/world/item/enchantment/DiggingEnchantment.h similarity index 100% rename from Minecraft.World/Enchantments/DiggingEnchantment.h rename to Minecraft.World/net/minecraft/world/item/enchantment/DiggingEnchantment.h diff --git a/Minecraft.World/Enchantments/Enchantment.cpp b/Minecraft.World/net/minecraft/world/item/enchantment/Enchantment.cpp similarity index 97% rename from Minecraft.World/Enchantments/Enchantment.cpp rename to Minecraft.World/net/minecraft/world/item/enchantment/Enchantment.cpp index eb7be03a7..d7776062c 100644 --- a/Minecraft.World/Enchantments/Enchantment.cpp +++ b/Minecraft.World/net/minecraft/world/item/enchantment/Enchantment.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.item.enchantment.h" +#include "../net.minecraft.world.item.h" #include "Enchantment.h" // Enchantment *Enchantment::enchantments[256]; diff --git a/Minecraft.World/Enchantments/Enchantment.h b/Minecraft.World/net/minecraft/world/item/enchantment/Enchantment.h similarity index 100% rename from Minecraft.World/Enchantments/Enchantment.h rename to Minecraft.World/net/minecraft/world/item/enchantment/Enchantment.h diff --git a/Minecraft.World/Enchantments/EnchantmentCategory.cpp b/Minecraft.World/net/minecraft/world/item/enchantment/EnchantmentCategory.cpp similarity index 94% rename from Minecraft.World/Enchantments/EnchantmentCategory.cpp rename to Minecraft.World/net/minecraft/world/item/enchantment/EnchantmentCategory.cpp index 90fd58a42..d81844c17 100644 --- a/Minecraft.World/Enchantments/EnchantmentCategory.cpp +++ b/Minecraft.World/net/minecraft/world/item/enchantment/EnchantmentCategory.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.item.h" #include "EnchantmentCategory.h" const EnchantmentCategory* EnchantmentCategory::all = new EnchantmentCategory(); diff --git a/Minecraft.World/Enchantments/EnchantmentCategory.h b/Minecraft.World/net/minecraft/world/item/enchantment/EnchantmentCategory.h similarity index 100% rename from Minecraft.World/Enchantments/EnchantmentCategory.h rename to Minecraft.World/net/minecraft/world/item/enchantment/EnchantmentCategory.h diff --git a/Minecraft.World/Enchantments/EnchantmentHelper.cpp b/Minecraft.World/net/minecraft/world/item/enchantment/EnchantmentHelper.cpp similarity index 97% rename from Minecraft.World/Enchantments/EnchantmentHelper.cpp rename to Minecraft.World/net/minecraft/world/item/enchantment/EnchantmentHelper.cpp index 80e20b8cb..e7a75f8d9 100644 --- a/Minecraft.World/Enchantments/EnchantmentHelper.cpp +++ b/Minecraft.World/net/minecraft/world/item/enchantment/EnchantmentHelper.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Util/WeighedRandom.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.item.h" +#include "net.minecraft.world.item.enchantment.h" +#include "../../entity/net.minecraft.world.entity.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../../util/WeighedRandom.h" #include "EnchantmentHelper.h" Random EnchantmentHelper::random; diff --git a/Minecraft.World/Enchantments/EnchantmentHelper.h b/Minecraft.World/net/minecraft/world/item/enchantment/EnchantmentHelper.h similarity index 100% rename from Minecraft.World/Enchantments/EnchantmentHelper.h rename to Minecraft.World/net/minecraft/world/item/enchantment/EnchantmentHelper.h diff --git a/Minecraft.World/Enchantments/EnchantmentInstance.cpp b/Minecraft.World/net/minecraft/world/item/enchantment/EnchantmentInstance.cpp similarity index 85% rename from Minecraft.World/Enchantments/EnchantmentInstance.cpp rename to Minecraft.World/net/minecraft/world/item/enchantment/EnchantmentInstance.cpp index 8538ec437..fdae7e150 100644 --- a/Minecraft.World/Enchantments/EnchantmentInstance.cpp +++ b/Minecraft.World/net/minecraft/world/item/enchantment/EnchantmentInstance.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" +#include "../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.item.enchantment.h" #include "EnchantmentInstance.h" EnchantmentInstance::EnchantmentInstance(Enchantment* enchantment, int level) diff --git a/Minecraft.World/Enchantments/EnchantmentInstance.h b/Minecraft.World/net/minecraft/world/item/enchantment/EnchantmentInstance.h similarity index 87% rename from Minecraft.World/Enchantments/EnchantmentInstance.h rename to Minecraft.World/net/minecraft/world/item/enchantment/EnchantmentInstance.h index 4a62e764d..344a048cb 100644 --- a/Minecraft.World/Enchantments/EnchantmentInstance.h +++ b/Minecraft.World/net/minecraft/world/item/enchantment/EnchantmentInstance.h @@ -1,6 +1,6 @@ #pragma once -#include "../Util/WeighedRandom.h" +#include "../../../util/WeighedRandom.h" class EnchantmentInstance : public WeighedRandomItem { public: diff --git a/Minecraft.World/Enchantments/FireAspectEnchantment.cpp b/Minecraft.World/net/minecraft/world/item/enchantment/FireAspectEnchantment.cpp similarity index 90% rename from Minecraft.World/Enchantments/FireAspectEnchantment.cpp rename to Minecraft.World/net/minecraft/world/item/enchantment/FireAspectEnchantment.cpp index d5bd5ef38..dcfc2a4b7 100644 --- a/Minecraft.World/Enchantments/FireAspectEnchantment.cpp +++ b/Minecraft.World/net/minecraft/world/item/enchantment/FireAspectEnchantment.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "FireAspectEnchantment.h" FireAspectEnchantment::FireAspectEnchantment(int id, int frequency) diff --git a/Minecraft.World/Enchantments/FireAspectEnchantment.h b/Minecraft.World/net/minecraft/world/item/enchantment/FireAspectEnchantment.h similarity index 100% rename from Minecraft.World/Enchantments/FireAspectEnchantment.h rename to Minecraft.World/net/minecraft/world/item/enchantment/FireAspectEnchantment.h diff --git a/Minecraft.World/Enchantments/KnockbackEnchantment.cpp b/Minecraft.World/net/minecraft/world/item/enchantment/KnockbackEnchantment.cpp similarity index 90% rename from Minecraft.World/Enchantments/KnockbackEnchantment.cpp rename to Minecraft.World/net/minecraft/world/item/enchantment/KnockbackEnchantment.cpp index f7fca6bdd..7d5eb9ce8 100644 --- a/Minecraft.World/Enchantments/KnockbackEnchantment.cpp +++ b/Minecraft.World/net/minecraft/world/item/enchantment/KnockbackEnchantment.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "KnockbackEnchantment.h" KnockbackEnchantment::KnockbackEnchantment(int id, int frequency) diff --git a/Minecraft.World/Enchantments/KnockbackEnchantment.h b/Minecraft.World/net/minecraft/world/item/enchantment/KnockbackEnchantment.h similarity index 100% rename from Minecraft.World/Enchantments/KnockbackEnchantment.h rename to Minecraft.World/net/minecraft/world/item/enchantment/KnockbackEnchantment.h diff --git a/Minecraft.World/Enchantments/LootBonusEnchantment.cpp b/Minecraft.World/net/minecraft/world/item/enchantment/LootBonusEnchantment.cpp similarity index 94% rename from Minecraft.World/Enchantments/LootBonusEnchantment.cpp rename to Minecraft.World/net/minecraft/world/item/enchantment/LootBonusEnchantment.cpp index 94ecde5e9..d9c788392 100644 --- a/Minecraft.World/Enchantments/LootBonusEnchantment.cpp +++ b/Minecraft.World/net/minecraft/world/item/enchantment/LootBonusEnchantment.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "LootBonusEnchantment.h" LootBonusEnchantment::LootBonusEnchantment(int id, int frequency, diff --git a/Minecraft.World/Enchantments/LootBonusEnchantment.h b/Minecraft.World/net/minecraft/world/item/enchantment/LootBonusEnchantment.h similarity index 100% rename from Minecraft.World/Enchantments/LootBonusEnchantment.h rename to Minecraft.World/net/minecraft/world/item/enchantment/LootBonusEnchantment.h diff --git a/Minecraft.World/Enchantments/OxygenEnchantment.cpp b/Minecraft.World/net/minecraft/world/item/enchantment/OxygenEnchantment.cpp similarity index 89% rename from Minecraft.World/Enchantments/OxygenEnchantment.cpp rename to Minecraft.World/net/minecraft/world/item/enchantment/OxygenEnchantment.cpp index 37df5c48d..764576d89 100644 --- a/Minecraft.World/Enchantments/OxygenEnchantment.cpp +++ b/Minecraft.World/net/minecraft/world/item/enchantment/OxygenEnchantment.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "OxygenEnchantment.h" OxygenEnchantment::OxygenEnchantment(int id, int frequency) diff --git a/Minecraft.World/Enchantments/OxygenEnchantment.h b/Minecraft.World/net/minecraft/world/item/enchantment/OxygenEnchantment.h similarity index 100% rename from Minecraft.World/Enchantments/OxygenEnchantment.h rename to Minecraft.World/net/minecraft/world/item/enchantment/OxygenEnchantment.h diff --git a/Minecraft.World/Enchantments/ProtectionEnchantment.cpp b/Minecraft.World/net/minecraft/world/item/enchantment/ProtectionEnchantment.cpp similarity index 92% rename from Minecraft.World/Enchantments/ProtectionEnchantment.cpp rename to Minecraft.World/net/minecraft/world/item/enchantment/ProtectionEnchantment.cpp index 12b0042f1..e3f0a58f6 100644 --- a/Minecraft.World/Enchantments/ProtectionEnchantment.cpp +++ b/Minecraft.World/net/minecraft/world/item/enchantment/ProtectionEnchantment.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" -#include "../Headers/net.minecraft.world.entity.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "net.minecraft.world.item.enchantment.h" +#include "../../entity/net.minecraft.world.entity.h" #include "ProtectionEnchantment.h" const int ProtectionEnchantment::names[] = { diff --git a/Minecraft.World/Enchantments/ProtectionEnchantment.h b/Minecraft.World/net/minecraft/world/item/enchantment/ProtectionEnchantment.h similarity index 100% rename from Minecraft.World/Enchantments/ProtectionEnchantment.h rename to Minecraft.World/net/minecraft/world/item/enchantment/ProtectionEnchantment.h diff --git a/Minecraft.World/Enchantments/ThornsEnchantment.cpp b/Minecraft.World/net/minecraft/world/item/enchantment/ThornsEnchantment.cpp similarity index 86% rename from Minecraft.World/Enchantments/ThornsEnchantment.cpp rename to Minecraft.World/net/minecraft/world/item/enchantment/ThornsEnchantment.cpp index 30842b5b8..9938307e6 100644 --- a/Minecraft.World/Enchantments/ThornsEnchantment.cpp +++ b/Minecraft.World/net/minecraft/world/item/enchantment/ThornsEnchantment.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.damagesource.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.item.h" +#include "net.minecraft.world.item.enchantment.h" +#include "../../entity/net.minecraft.world.entity.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" #include "ThornsEnchantment.h" const float ThornsEnchantment::CHANCE_PER_LEVEl = 0.15f; diff --git a/Minecraft.World/Enchantments/ThornsEnchantment.h b/Minecraft.World/net/minecraft/world/item/enchantment/ThornsEnchantment.h similarity index 100% rename from Minecraft.World/Enchantments/ThornsEnchantment.h rename to Minecraft.World/net/minecraft/world/item/enchantment/ThornsEnchantment.h diff --git a/Minecraft.World/Enchantments/UntouchingEnchantment.cpp b/Minecraft.World/net/minecraft/world/item/enchantment/UntouchingEnchantment.cpp similarity index 89% rename from Minecraft.World/Enchantments/UntouchingEnchantment.cpp rename to Minecraft.World/net/minecraft/world/item/enchantment/UntouchingEnchantment.cpp index c9041227c..27a1e5754 100644 --- a/Minecraft.World/Enchantments/UntouchingEnchantment.cpp +++ b/Minecraft.World/net/minecraft/world/item/enchantment/UntouchingEnchantment.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.item.h" #include "UntouchingEnchantment.h" UntouchingEnchantment::UntouchingEnchantment(int id, int frequency) diff --git a/Minecraft.World/Enchantments/UntouchingEnchantment.h b/Minecraft.World/net/minecraft/world/item/enchantment/UntouchingEnchantment.h similarity index 100% rename from Minecraft.World/Enchantments/UntouchingEnchantment.h rename to Minecraft.World/net/minecraft/world/item/enchantment/UntouchingEnchantment.h diff --git a/Minecraft.World/Enchantments/WaterWorkerEnchantment.cpp b/Minecraft.World/net/minecraft/world/item/enchantment/WaterWorkerEnchantment.cpp similarity index 90% rename from Minecraft.World/Enchantments/WaterWorkerEnchantment.cpp rename to Minecraft.World/net/minecraft/world/item/enchantment/WaterWorkerEnchantment.cpp index 3b497f137..6144308a5 100644 --- a/Minecraft.World/Enchantments/WaterWorkerEnchantment.cpp +++ b/Minecraft.World/net/minecraft/world/item/enchantment/WaterWorkerEnchantment.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "WaterWorkerEnchantment.h" WaterWorkerEnchantment::WaterWorkerEnchantment(int id, int frequency) diff --git a/Minecraft.World/Enchantments/WaterWorkerEnchantment.h b/Minecraft.World/net/minecraft/world/item/enchantment/WaterWorkerEnchantment.h similarity index 100% rename from Minecraft.World/Enchantments/WaterWorkerEnchantment.h rename to Minecraft.World/net/minecraft/world/item/enchantment/WaterWorkerEnchantment.h diff --git a/Minecraft.World/net/minecraft/world/item/enchantment/net.minecraft.world.item.enchantment.h b/Minecraft.World/net/minecraft/world/item/enchantment/net.minecraft.world.item.enchantment.h new file mode 100644 index 000000000..c0df52265 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/item/enchantment/net.minecraft.world.item.enchantment.h @@ -0,0 +1,24 @@ +#pragma once + +#include "DamageEnchantment.h" +#include "DigDurabilityEnchantment.h" +#include "DiggingEnchantment.h" +#include "Enchantment.h" +#include "EnchantmentCategory.h" +#include "EnchantmentHelper.h" +#include "EnchantmentInstance.h" +#include "FireAspectEnchantment.h" +#include "KnockbackEnchantment.h" +#include "LootBonusEnchantment.h" +#include "OxygenEnchantment.h" +#include "ProtectionEnchantment.h" +#include "UntouchingEnchantment.h" +#include "WaterWorkerEnchantment.h" + +// 4J Stu - Brought forward +#include "ArrowDamageEnchantment.h" +#include "ArrowFireEnchantment.h" +#include "ArrowInfiniteEnchantment.h" +#include "ArrowKnockbackEnchantment.h" + +#include "ThornsEnchantment.h" \ No newline at end of file diff --git a/Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h b/Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h new file mode 100644 index 000000000..393c6ae1f --- /dev/null +++ b/Minecraft.World/net/minecraft/world/item/net.minecraft.world.item.h @@ -0,0 +1,87 @@ +#pragma once + +#include "ArmorItem.h" +#include "BedItem.h" +#include "BoatItem.h" +#include "BowItem.h" +#include "BowlFoodItem.h" +#include "BucketItem.h" +#include "WoolTileItem.h" +#include "CoalItem.h" +#include "ComplexItem.h" +#include "DiggerItem.h" +#include "DoorItem.h" +#include "DyePowderItem.h" +#include "EggItem.h" +#include "FishingRodItem.h" +#include "FlintAndSteelItem.h" +#include "FoodItem.h" +#include "HatchetItem.h" +#include "HoeItem.h" +#include "Item.h" +#include "ItemInstance.h" +#include "LeafTileItem.h" +#include "MapItem.h" +#include "MinecartItem.h" +// #include "PaintingItem.h" +#include "PickaxeItem.h" +#include "PistonTileItem.h" +#include "RecordingItem.h" +#include "RedStoneItem.h" +#include "SaddleItem.h" +#include "SaplingTileItem.h" +#include "SeedItem.h" +#include "ShearsItem.h" +#include "ShovelItem.h" +#include "SignItem.h" +#include "SnowballItem.h" +#include "StoneSlabTileItem.h" +#include "TileItem.h" +#include "PlanterTileItem.h" +#include "WeaponItem.h" + +// 1.8.2 +#include "AuxDataTileItem.h" +#include "ColoredTileItem.h" +#include "UseAnim.h" + +// 1.0.1 +#include "BottleItem.h" +#include "EnderEyeItem.h" +#include "EnderpearlItem.h" +#include "GoldenAppleItem.h" +#include "MilkBucketItem.h" +#include "PotionItem.h" +#include "Rarity.h" +#include "WaterLilyTileItem.h" +#include "ExperienceItem.h" // 4J Stu brought forward + +// TU9 +#include "FireChargeItem.h" +#include "../entity/ItemFrame.h" +#include "SpawnEggItem.h" +#include "MultiTextureTileItem.h" + +// TU12 +#include "SkullItem.h" + +// TU14 +#include "AnvilTileItem.h" +#include "BookItem.h" +#include "CarrotOnAStickItem.h" +#include "EnchantedBookItem.h" +#include "SeedFoodItem.h" + +// 1.6.4 +#include "FireworksChargeItem.h" +#include "FireworksItem.h" +#include "LeashItem.h" +#include "NameTagItem.h" +#include "SimpleFoiledItem.h" +#include "SnowItem.h" +#include "EmptyMapItem.h" + +// 4J Added +#include "ClockItem.h" +#include "CompassItem.h" +#include "../../util/HtmlString.h" \ No newline at end of file diff --git a/Minecraft.World/Containers/Merchant.h b/Minecraft.World/net/minecraft/world/item/trading/Merchant.h similarity index 100% rename from Minecraft.World/Containers/Merchant.h rename to Minecraft.World/net/minecraft/world/item/trading/Merchant.h diff --git a/Minecraft.World/Containers/MerchantRecipe.cpp b/Minecraft.World/net/minecraft/world/item/trading/MerchantRecipe.cpp similarity index 98% rename from Minecraft.World/Containers/MerchantRecipe.cpp rename to Minecraft.World/net/minecraft/world/item/trading/MerchantRecipe.cpp index ace323517..3a6ca5320 100644 --- a/Minecraft.World/Containers/MerchantRecipe.cpp +++ b/Minecraft.World/net/minecraft/world/item/trading/MerchantRecipe.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "MerchantRecipe.h" diff --git a/Minecraft.World/Containers/MerchantRecipe.h b/Minecraft.World/net/minecraft/world/item/trading/MerchantRecipe.h similarity index 100% rename from Minecraft.World/Containers/MerchantRecipe.h rename to Minecraft.World/net/minecraft/world/item/trading/MerchantRecipe.h diff --git a/Minecraft.World/Containers/MerchantRecipeList.cpp b/Minecraft.World/net/minecraft/world/item/trading/MerchantRecipeList.cpp similarity index 98% rename from Minecraft.World/Containers/MerchantRecipeList.cpp rename to Minecraft.World/net/minecraft/world/item/trading/MerchantRecipeList.cpp index f1dc83185..5e4464397 100644 --- a/Minecraft.World/Containers/MerchantRecipeList.cpp +++ b/Minecraft.World/net/minecraft/world/item/trading/MerchantRecipeList.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.trading.h" +#include "../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.item.trading.h" #include "MerchantRecipeList.h" MerchantRecipeList::MerchantRecipeList() {} diff --git a/Minecraft.World/Containers/MerchantRecipeList.h b/Minecraft.World/net/minecraft/world/item/trading/MerchantRecipeList.h similarity index 100% rename from Minecraft.World/Containers/MerchantRecipeList.h rename to Minecraft.World/net/minecraft/world/item/trading/MerchantRecipeList.h diff --git a/Minecraft.World/net/minecraft/world/item/trading/net.minecraft.world.item.trading.h b/Minecraft.World/net/minecraft/world/item/trading/net.minecraft.world.item.trading.h new file mode 100644 index 000000000..a705a1c07 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/item/trading/net.minecraft.world.item.trading.h @@ -0,0 +1,5 @@ +#pragma once + +#include "Merchant.h" +#include "MerchantRecipe.h" +#include "MerchantRecipeList.h" \ No newline at end of file diff --git a/Minecraft.World/Level/BaseMobSpawner.cpp b/Minecraft.World/net/minecraft/world/level/BaseMobSpawner.cpp similarity index 97% rename from Minecraft.World/Level/BaseMobSpawner.cpp rename to Minecraft.World/net/minecraft/world/level/BaseMobSpawner.cpp index e85d3f7ae..1ebdb0348 100644 --- a/Minecraft.World/Level/BaseMobSpawner.cpp +++ b/Minecraft.World/net/minecraft/world/level/BaseMobSpawner.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.phys.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/net.minecraft.world.entity.h" +#include "../entity/item/net.minecraft.world.entity.item.h" +#include "net.minecraft.world.level.h" +#include "tile/net.minecraft.world.level.tile.h" +#include "../phys/net.minecraft.world.phys.h" #include "BaseMobSpawner.h" BaseMobSpawner::BaseMobSpawner() { diff --git a/Minecraft.World/Level/BaseMobSpawner.h b/Minecraft.World/net/minecraft/world/level/BaseMobSpawner.h similarity index 97% rename from Minecraft.World/Level/BaseMobSpawner.h rename to Minecraft.World/net/minecraft/world/level/BaseMobSpawner.h index 0933908b1..85fa2ff74 100644 --- a/Minecraft.World/Level/BaseMobSpawner.h +++ b/Minecraft.World/net/minecraft/world/level/BaseMobSpawner.h @@ -1,6 +1,6 @@ #pragma once -#include "../Util/WeighedRandom.h" +#include "../../util/WeighedRandom.h" class BaseMobSpawner { public: diff --git a/Minecraft.World/Level/BlockDestructionProgress.cpp b/Minecraft.World/net/minecraft/world/level/BlockDestructionProgress.cpp similarity index 95% rename from Minecraft.World/Level/BlockDestructionProgress.cpp rename to Minecraft.World/net/minecraft/world/level/BlockDestructionProgress.cpp index c56a4de29..d8d34c873 100644 --- a/Minecraft.World/Level/BlockDestructionProgress.cpp +++ b/Minecraft.World/net/minecraft/world/level/BlockDestructionProgress.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "BlockDestructionProgress.h" BlockDestructionProgress::BlockDestructionProgress(int id, int x, int y, diff --git a/Minecraft.World/Level/BlockDestructionProgress.h b/Minecraft.World/net/minecraft/world/level/BlockDestructionProgress.h similarity index 100% rename from Minecraft.World/Level/BlockDestructionProgress.h rename to Minecraft.World/net/minecraft/world/level/BlockDestructionProgress.h diff --git a/Minecraft.World/Level/Calendar.cpp b/Minecraft.World/net/minecraft/world/level/Calendar.cpp similarity index 86% rename from Minecraft.World/Level/Calendar.cpp rename to Minecraft.World/net/minecraft/world/level/Calendar.cpp index b978fee26..08a41a608 100644 --- a/Minecraft.World/Level/Calendar.cpp +++ b/Minecraft.World/net/minecraft/world/level/Calendar.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "Calendar.h" #include diff --git a/Minecraft.World/Level/Calendar.h b/Minecraft.World/net/minecraft/world/level/Calendar.h similarity index 100% rename from Minecraft.World/Level/Calendar.h rename to Minecraft.World/net/minecraft/world/level/Calendar.h diff --git a/Minecraft.World/Level/ChunkPos.cpp b/Minecraft.World/net/minecraft/world/level/ChunkPos.cpp similarity index 93% rename from Minecraft.World/Level/ChunkPos.cpp rename to Minecraft.World/net/minecraft/world/level/ChunkPos.cpp index bf479e109..dd452ded2 100644 --- a/Minecraft.World/Level/ChunkPos.cpp +++ b/Minecraft.World/net/minecraft/world/level/ChunkPos.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/net.minecraft.world.entity.h" #include "ChunkPos.h" ChunkPos::ChunkPos(int x, int z) : x(x), z(z) {} diff --git a/Minecraft.World/Level/ChunkPos.h b/Minecraft.World/net/minecraft/world/level/ChunkPos.h similarity index 100% rename from Minecraft.World/Level/ChunkPos.h rename to Minecraft.World/net/minecraft/world/level/ChunkPos.h diff --git a/Minecraft.World/Util/Coord.h b/Minecraft.World/net/minecraft/world/level/Coord.h similarity index 100% rename from Minecraft.World/Util/Coord.h rename to Minecraft.World/net/minecraft/world/level/Coord.h diff --git a/Minecraft.World/Level/Explosion.cpp b/Minecraft.World/net/minecraft/world/level/Explosion.cpp similarity index 95% rename from Minecraft.World/Level/Explosion.cpp rename to Minecraft.World/net/minecraft/world/level/Explosion.cpp index fe1ac7c03..7af5a3dbc 100644 --- a/Minecraft.World/Level/Explosion.cpp +++ b/Minecraft.World/net/minecraft/world/level/Explosion.cpp @@ -1,15 +1,15 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.damagesource.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/net.minecraft.world.entity.h" +#include "../entity/item/net.minecraft.world.entity.item.h" +#include "../item/enchantment/net.minecraft.world.item.enchantment.h" +#include "net.minecraft.world.level.h" +#include "tile/net.minecraft.world.level.tile.h" +#include "../phys/net.minecraft.world.phys.h" +#include "../damageSource/net.minecraft.world.damagesource.h" #include "TilePos.h" #include "Explosion.h" -#include "../Util/SoundTypes.h" -#include "Util/AABB.h" +#include "../../../../Header Files/SoundTypes.h" +#include "../phys/AABB.h" Explosion::Explosion(Level* level, std::shared_ptr source, double x, double y, double z, float r) { diff --git a/Minecraft.World/Level/Explosion.h b/Minecraft.World/net/minecraft/world/level/Explosion.h similarity index 96% rename from Minecraft.World/Level/Explosion.h rename to Minecraft.World/net/minecraft/world/level/Explosion.h index 36ab53016..3d5d07fd7 100644 --- a/Minecraft.World/Level/Explosion.h +++ b/Minecraft.World/net/minecraft/world/level/Explosion.h @@ -1,6 +1,6 @@ #pragma once #include "TilePos.h" -#include "../Player/Player.h" +#include "../entity/player/Player.h" class Random; class Level; diff --git a/Minecraft.World/Util/FoliageColor.cpp b/Minecraft.World/net/minecraft/world/level/FoliageColor.cpp similarity index 89% rename from Minecraft.World/Util/FoliageColor.cpp rename to Minecraft.World/net/minecraft/world/level/FoliageColor.cpp index a6d328dc4..181261cb4 100644 --- a/Minecraft.World/Util/FoliageColor.cpp +++ b/Minecraft.World/net/minecraft/world/level/FoliageColor.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../../Minecraft.Client/Minecraft.h" +#include "../../../../Header Files/stdafx.h" +#include "../../Minecraft.Client/net/minecraft/client/Minecraft.h" #include "FoliageColor.h" // 4J Stu - Don't use this any more diff --git a/Minecraft.World/Util/FoliageColor.h b/Minecraft.World/net/minecraft/world/level/FoliageColor.h similarity index 100% rename from Minecraft.World/Util/FoliageColor.h rename to Minecraft.World/net/minecraft/world/level/FoliageColor.h diff --git a/Minecraft.World/Level/GameRules.cpp b/Minecraft.World/net/minecraft/world/level/GameRules.cpp similarity index 99% rename from Minecraft.World/Level/GameRules.cpp rename to Minecraft.World/net/minecraft/world/level/GameRules.cpp index fef5c9c6d..7c40547a2 100644 --- a/Minecraft.World/Level/GameRules.cpp +++ b/Minecraft.World/net/minecraft/world/level/GameRules.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "GameRules.h" diff --git a/Minecraft.World/Level/GameRules.h b/Minecraft.World/net/minecraft/world/level/GameRules.h similarity index 100% rename from Minecraft.World/Level/GameRules.h rename to Minecraft.World/net/minecraft/world/level/GameRules.h diff --git a/Minecraft.World/Util/GrassColor.cpp b/Minecraft.World/net/minecraft/world/level/GrassColor.cpp similarity index 91% rename from Minecraft.World/Util/GrassColor.cpp rename to Minecraft.World/net/minecraft/world/level/GrassColor.cpp index 77f75a350..2a92be999 100644 --- a/Minecraft.World/Util/GrassColor.cpp +++ b/Minecraft.World/net/minecraft/world/level/GrassColor.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "GrassColor.h" // 4J Stu - Don't want to do this any more diff --git a/Minecraft.World/Util/GrassColor.h b/Minecraft.World/net/minecraft/world/level/GrassColor.h similarity index 100% rename from Minecraft.World/Util/GrassColor.h rename to Minecraft.World/net/minecraft/world/level/GrassColor.h diff --git a/Minecraft.World/Level/Level.cpp b/Minecraft.World/net/minecraft/world/level/Level.cpp similarity index 98% rename from Minecraft.World/Level/Level.cpp rename to Minecraft.World/net/minecraft/world/level/Level.cpp index 98bf3d669..9e2cd3649 100644 --- a/Minecraft.World/Level/Level.cpp +++ b/Minecraft.World/net/minecraft/world/level/Level.cpp @@ -1,52 +1,52 @@ -#include "../Platform/stdafx.h" -#include "../Platform/System.h" -#include "../IO/Files/File.h" -#include "../Util/ProgressListener.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.world.entity.ai.village.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.global.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.biome.h" -#include "../Headers/net.minecraft.world.level.chunk.h" -#include "../Headers/net.minecraft.world.level.dimension.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.levelgen.h" -#include "../Headers/net.minecraft.world.level.storage.h" -#include "../Headers/net.minecraft.world.level.pathfinder.h" -#include "../Headers/net.minecraft.world.level.redstone.h" -#include "../Headers/net.minecraft.world.scores.h" -#include "../Headers/net.minecraft.world.phys.h" +#include "../../../../Header Files/stdafx.h" +#include "../../../../ConsoleJavaLibs/System.h" +#include "../../../../ConsoleJavaLibs/File.h" +#include "../../util/ProgressListener.h" +#include "../../net.minecraft.h" +#include "../net.minecraft.world.h" +#include "../entity/ai/village/net.minecraft.world.entity.ai.village.h" +#include "../entity/net.minecraft.world.entity.h" +#include "../entity/global/net.minecraft.world.entity.global.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "biome/net.minecraft.world.level.biome.h" +#include "chunk/net.minecraft.world.level.chunk.h" +#include "dimension/net.minecraft.world.level.dimension.h" +#include "tile/net.minecraft.world.level.tile.h" +#include "tile/entity/net.minecraft.world.level.tile.entity.h" +#include "net.minecraft.world.level.h" +#include "levelgen/net.minecraft.world.level.levelgen.h" +#include "storage/net.minecraft.world.level.storage.h" +#include "pathfinder/net.minecraft.world.level.pathfinder.h" +#include "redstone/net.minecraft.world.level.redstone.h" +#include "../scores/net.minecraft.world.scores.h" +#include "../phys/net.minecraft.world.phys.h" #include "Explosion.h" -#include "Events/LevelListener.h" +#include "LevelListener.h" #include "Level.h" -#include "../Util/ThreadName.h" -#include "../Util/WeighedRandom.h" +#include "../../../../ConsoleHelpers/ThreadName.h" +#include "../../util/WeighedRandom.h" -#include "../IO/Files/ConsoleSaveFile.h" +#include "../../../../ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFile.h" #include #include -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Rendering/LevelRenderer.h" -#include "../Util/SoundTypes.h" -#include "Storage/SparseLightStorage.h" -#include "../../Minecraft.Client/Textures/Textures.h" -#include "../../Minecraft.Client/Textures/Packs/TexturePackRepository.h" -#include "../../Minecraft.Client/Textures/Packs/DLCTexturePack.h" -#include "../../Minecraft.Client/Platform/Common/DLC/DLCPack.h" -#include "../../Minecraft.Client/Platform/Common/ShutdownManager.h" -#include "../../Minecraft.Client/MinecraftServer.h" -#include "../../Minecraft.Client/Utils/FrameProfiler.h" +#include "../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../../Minecraft.Client/net/minecraft/client/renderer/LevelRenderer.h" +#include "../../../../Header Files/SoundTypes.h" +#include "chunk/SparseLightStorage.h" +#include "../../Minecraft.Client/net/minecraft/client/renderer/Textures.h" +#include "../../Minecraft.Client/net/minecraft/client/skins/TexturePackRepository.h" +#include "../../Minecraft.Client/net/minecraft/client/skins/DLCTexturePack.h" +#include "../../Minecraft.Client/Common/Source Files/DLC/DLCPack.h" +#include "../../Minecraft.Client/Common/ShutdownManager.h" +#include "../../Minecraft.Client/net/minecraft/server/MinecraftServer.h" +#include "../../Minecraft.Client/Header Files/FrameProfiler.h" #include #include #include #include // 4J : WESTY : Added for time played stats. -#include "../Headers/net.minecraft.stats.h" +#include "../../stats/net.minecraft.stats.h" // 4J - Caching of lighting data added. This is implemented as a 16x16x16 cache // of ints (ie 16K storage in total). The index of the element to be used in the diff --git a/Minecraft.World/Level/Level.h b/Minecraft.World/net/minecraft/world/level/Level.h similarity index 99% rename from Minecraft.World/Level/Level.h rename to Minecraft.World/net/minecraft/world/level/Level.h index 9503e1d2d..4d069d31b 100644 --- a/Minecraft.World/Level/Level.h +++ b/Minecraft.World/net/minecraft/world/level/Level.h @@ -1,14 +1,14 @@ #pragma once -#include "Storage/LevelSource.h" -#include "../Util/LightLayer.h" +#include "LevelSource.h" +#include "LightLayer.h" #include "ChunkPos.h" #include "TickNextTickData.h" -#include "Storage/SavedData.h" -#include "../Util/Definitions.h" -#include "../Util/ParticleTypes.h" -#include "../WorldGen/Biomes/Biome.h" -#include "../Util/C4JThread.h" +#include "saveddata/SavedData.h" +#include "../../../../ConsoleHelpers/Definitions.h" +#include "../../../../Header Files/ParticleTypes.h" +#include "biome/Biome.h" +#include "../../../../ConsoleHelpers/C4JThread.h" #include #include #include diff --git a/Minecraft.World/Level/LevelConflictException.cpp b/Minecraft.World/net/minecraft/world/level/LevelConflictException.cpp similarity index 75% rename from Minecraft.World/Level/LevelConflictException.cpp rename to Minecraft.World/net/minecraft/world/level/LevelConflictException.cpp index 18d0c1360..ab09ab12d 100644 --- a/Minecraft.World/Level/LevelConflictException.cpp +++ b/Minecraft.World/net/minecraft/world/level/LevelConflictException.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "LevelConflictException.h" LevelConflictException::LevelConflictException(const std::wstring& msg) diff --git a/Minecraft.World/Level/LevelConflictException.h b/Minecraft.World/net/minecraft/world/level/LevelConflictException.h similarity index 78% rename from Minecraft.World/Level/LevelConflictException.h rename to Minecraft.World/net/minecraft/world/level/LevelConflictException.h index f2153e2af..c063def27 100644 --- a/Minecraft.World/Level/LevelConflictException.h +++ b/Minecraft.World/net/minecraft/world/level/LevelConflictException.h @@ -1,6 +1,6 @@ #pragma once -#include "../Util/Exceptions.h" +#include "../../../../ConsoleJavaLibs/Exceptions.h" class LevelConflictException : public RuntimeException { private: diff --git a/Minecraft.World/Level/Events/LevelListener.h b/Minecraft.World/net/minecraft/world/level/LevelListener.h similarity index 96% rename from Minecraft.World/Level/Events/LevelListener.h rename to Minecraft.World/net/minecraft/world/level/LevelListener.h index bb6bd6815..c2ffca054 100644 --- a/Minecraft.World/Level/Events/LevelListener.h +++ b/Minecraft.World/net/minecraft/world/level/LevelListener.h @@ -1,8 +1,8 @@ #pragma once class TileEntity; -#include "../../Player/Player.h" -#include "../../Util/ParticleTypes.h" +#include "../entity/player/Player.h" +#include "../../../../Header Files/ParticleTypes.h" class LevelListener { public: diff --git a/Minecraft.World/Level/Storage/LevelSettings.cpp b/Minecraft.World/net/minecraft/world/level/LevelSettings.cpp similarity index 97% rename from Minecraft.World/Level/Storage/LevelSettings.cpp rename to Minecraft.World/net/minecraft/world/level/LevelSettings.cpp index cd0120eff..8fe650562 100644 --- a/Minecraft.World/Level/Storage/LevelSettings.cpp +++ b/Minecraft.World/net/minecraft/world/level/LevelSettings.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "LevelSettings.h" -#include "../../Headers/net.minecraft.world.level.storage.h" +#include "storage/net.minecraft.world.level.storage.h" #include "LevelType.h" GameType* GameType::NOT_SET = nullptr; diff --git a/Minecraft.World/Level/Storage/LevelSettings.h b/Minecraft.World/net/minecraft/world/level/LevelSettings.h similarity index 100% rename from Minecraft.World/Level/Storage/LevelSettings.h rename to Minecraft.World/net/minecraft/world/level/LevelSettings.h diff --git a/Minecraft.World/Level/Storage/LevelSource.h b/Minecraft.World/net/minecraft/world/level/LevelSource.h similarity index 97% rename from Minecraft.World/Level/Storage/LevelSource.h rename to Minecraft.World/net/minecraft/world/level/LevelSource.h index fd84ea9c9..ac8b144b3 100644 --- a/Minecraft.World/Level/Storage/LevelSource.h +++ b/Minecraft.World/net/minecraft/world/level/LevelSource.h @@ -4,7 +4,7 @@ class BiomeSource; class Material; class TileEntity; -#include "../../Util/LightLayer.h" +#include "LightLayer.h" class LevelSource { public: diff --git a/Minecraft.World/Level/Storage/LevelType.cpp b/Minecraft.World/net/minecraft/world/level/LevelType.cpp similarity index 96% rename from Minecraft.World/Level/Storage/LevelType.cpp rename to Minecraft.World/net/minecraft/world/level/LevelType.cpp index ae48a2f82..46a8c7845 100644 --- a/Minecraft.World/Level/Storage/LevelType.cpp +++ b/Minecraft.World/net/minecraft/world/level/LevelType.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.h" // public static final LevelType[] levelTypes = new LevelType[16]; // diff --git a/Minecraft.World/Level/Storage/LevelType.h b/Minecraft.World/net/minecraft/world/level/LevelType.h similarity index 95% rename from Minecraft.World/Level/Storage/LevelType.h rename to Minecraft.World/net/minecraft/world/level/LevelType.h index cd83597a2..527a41489 100644 --- a/Minecraft.World/Level/Storage/LevelType.h +++ b/Minecraft.World/net/minecraft/world/level/LevelType.h @@ -1,5 +1,5 @@ #pragma once -#include "../../Headers/net.minecraft.world.level.h" +#include "net.minecraft.world.level.h" class LevelType { public: diff --git a/Minecraft.World/Util/LightLayer.h b/Minecraft.World/net/minecraft/world/level/LightLayer.h similarity index 100% rename from Minecraft.World/Util/LightLayer.h rename to Minecraft.World/net/minecraft/world/level/LightLayer.h diff --git a/Minecraft.World/Blocks/MobSpawner.cpp b/Minecraft.World/net/minecraft/world/level/MobSpawner.cpp similarity index 95% rename from Minecraft.World/Blocks/MobSpawner.cpp rename to Minecraft.World/net/minecraft/world/level/MobSpawner.cpp index 123e88295..10f15f115 100644 --- a/Minecraft.World/Blocks/MobSpawner.cpp +++ b/Minecraft.World/net/minecraft/world/level/MobSpawner.cpp @@ -1,22 +1,22 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.animal.h" -#include "../Headers/net.minecraft.world.entity.monster.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.biome.h" -#include "../Headers/net.minecraft.world.level.material.h" -#include "../Headers/net.minecraft.world.level.pathfinder.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Util/Difficulty.h" -#include "../Util/WeighedRandom.h" -#include "../Level/Level.h" -#include "../Level/ChunkPos.h" -#include "../Level/TilePos.h" -#include "../../Minecraft.Client/Level/ServerLevel.h" +#include "../../../../Header Files/stdafx.h" +#include "../../net.minecraft.h" +#include "../entity/net.minecraft.world.entity.h" +#include "../entity/animal/net.minecraft.world.entity.animal.h" +#include "../entity/monster/net.minecraft.world.entity.monster.h" +#include "../entity/player/net.minecraft.world.entity.player.h" +#include "net.minecraft.world.level.h" +#include "biome/net.minecraft.world.level.biome.h" +#include "material/net.minecraft.world.level.material.h" +#include "pathfinder/net.minecraft.world.level.pathfinder.h" +#include "tile/net.minecraft.world.level.tile.h" +#include "../Difficulty.h" +#include "../../util/WeighedRandom.h" +#include "Level.h" +#include "ChunkPos.h" +#include "TilePos.h" +#include "../../Minecraft.Client/net/minecraft/server/level/ServerLevel.h" #include "MobSpawner.h" -#include "../Level/Dimensions/Dimension.h" +#include "dimension/Dimension.h" const int MobSpawner::MIN_SPAWN_DISTANCE = 24; diff --git a/Minecraft.World/Blocks/MobSpawner.h b/Minecraft.World/net/minecraft/world/level/MobSpawner.h similarity index 96% rename from Minecraft.World/Blocks/MobSpawner.h rename to Minecraft.World/net/minecraft/world/level/MobSpawner.h index 307f7b8c2..aae97e98b 100644 --- a/Minecraft.World/Blocks/MobSpawner.h +++ b/Minecraft.World/net/minecraft/world/level/MobSpawner.h @@ -1,6 +1,6 @@ #pragma once -#include "../Entities/Mob.h" +#include "../entity/Mob.h" class Player; class Level; diff --git a/Minecraft.World/Level/Storage/PortalForcer.cpp b/Minecraft.World/net/minecraft/world/level/PortalForcer.cpp similarity index 98% rename from Minecraft.World/Level/Storage/PortalForcer.cpp rename to Minecraft.World/net/minecraft/world/level/PortalForcer.cpp index 19e93c033..1fbe9d075 100644 --- a/Minecraft.World/Level/Storage/PortalForcer.cpp +++ b/Minecraft.World/net/minecraft/world/level/PortalForcer.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.dimension.h" -#include "../../../Minecraft.Client/Level/ServerLevel.h" +#include "../../../../Header Files/stdafx.h" +#include "../entity/net.minecraft.world.entity.h" +#include "net.minecraft.world.level.h" +#include "tile/net.minecraft.world.level.tile.h" +#include "dimension/net.minecraft.world.level.dimension.h" +#include "../../../Minecraft.Client/net/minecraft/server/level/ServerLevel.h" #include "PortalForcer.h" PortalForcer::PortalPosition::PortalPosition(int x, int y, int z, int64_t time) diff --git a/Minecraft.World/Level/Storage/PortalForcer.h b/Minecraft.World/net/minecraft/world/level/PortalForcer.h similarity index 100% rename from Minecraft.World/Level/Storage/PortalForcer.h rename to Minecraft.World/net/minecraft/world/level/PortalForcer.h diff --git a/Minecraft.World/Level/Storage/Region.cpp b/Minecraft.World/net/minecraft/world/level/Region.cpp similarity index 96% rename from Minecraft.World/Level/Storage/Region.cpp rename to Minecraft.World/net/minecraft/world/level/Region.cpp index ca1687549..9228f582d 100644 --- a/Minecraft.World/Level/Storage/Region.cpp +++ b/Minecraft.World/net/minecraft/world/level/Region.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../../Headers/net.minecraft.world.level.chunk.h" -#include "../../Headers/net.minecraft.world.level.dimension.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.redstone.h" -#include "../../Blocks/Material.h" -#include "../Level.h" +#include "../../../../Header Files/stdafx.h" +#include "biome/net.minecraft.world.level.biome.h" +#include "chunk/net.minecraft.world.level.chunk.h" +#include "dimension/net.minecraft.world.level.dimension.h" +#include "tile/net.minecraft.world.level.tile.h" +#include "redstone/net.minecraft.world.level.redstone.h" +#include "material/Material.h" +#include "Level.h" #include "Region.h" diff --git a/Minecraft.World/Level/Storage/Region.h b/Minecraft.World/net/minecraft/world/level/Region.h similarity index 100% rename from Minecraft.World/Level/Storage/Region.h rename to Minecraft.World/net/minecraft/world/level/Region.h diff --git a/Minecraft.World/Level/TickNextTickData.cpp b/Minecraft.World/net/minecraft/world/level/TickNextTickData.cpp similarity index 96% rename from Minecraft.World/Level/TickNextTickData.cpp rename to Minecraft.World/net/minecraft/world/level/TickNextTickData.cpp index aa3455296..3f3cdc146 100644 --- a/Minecraft.World/Level/TickNextTickData.cpp +++ b/Minecraft.World/net/minecraft/world/level/TickNextTickData.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../../../../Header Files/stdafx.h" +#include "tile/net.minecraft.world.level.tile.h" #include "TickNextTickData.h" int64_t TickNextTickData::C = 0; diff --git a/Minecraft.World/Level/TickNextTickData.h b/Minecraft.World/net/minecraft/world/level/TickNextTickData.h similarity index 100% rename from Minecraft.World/Level/TickNextTickData.h rename to Minecraft.World/net/minecraft/world/level/TickNextTickData.h diff --git a/Minecraft.World/Level/TileEventData.cpp b/Minecraft.World/net/minecraft/world/level/TileEventData.cpp similarity index 94% rename from Minecraft.World/Level/TileEventData.cpp rename to Minecraft.World/net/minecraft/world/level/TileEventData.cpp index c904e510c..719e631e6 100644 --- a/Minecraft.World/Level/TileEventData.cpp +++ b/Minecraft.World/net/minecraft/world/level/TileEventData.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "TileEventData.h" diff --git a/Minecraft.World/Level/TileEventData.h b/Minecraft.World/net/minecraft/world/level/TileEventData.h similarity index 100% rename from Minecraft.World/Level/TileEventData.h rename to Minecraft.World/net/minecraft/world/level/TileEventData.h diff --git a/Minecraft.World/Level/TilePos.cpp b/Minecraft.World/net/minecraft/world/level/TilePos.cpp similarity index 87% rename from Minecraft.World/Level/TilePos.cpp rename to Minecraft.World/net/minecraft/world/level/TilePos.cpp index bb83514f3..4fd621617 100644 --- a/Minecraft.World/Level/TilePos.cpp +++ b/Minecraft.World/net/minecraft/world/level/TilePos.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "TilePos.h" -#include "../Util/Vec3.h" +#include "../phys/Vec3.h" TilePos::TilePos(int x, int y, int z) { this->x = x; diff --git a/Minecraft.World/Level/TilePos.h b/Minecraft.World/net/minecraft/world/level/TilePos.h similarity index 100% rename from Minecraft.World/Level/TilePos.h rename to Minecraft.World/net/minecraft/world/level/TilePos.h diff --git a/Minecraft.World/Util/WaterColor.cpp b/Minecraft.World/net/minecraft/world/level/WaterColor.cpp similarity index 91% rename from Minecraft.World/Util/WaterColor.cpp rename to Minecraft.World/net/minecraft/world/level/WaterColor.cpp index 8399afd08..f5bfaf018 100644 --- a/Minecraft.World/Util/WaterColor.cpp +++ b/Minecraft.World/net/minecraft/world/level/WaterColor.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "WaterColor.h" diff --git a/Minecraft.World/Util/WaterColor.h b/Minecraft.World/net/minecraft/world/level/WaterColor.h similarity index 100% rename from Minecraft.World/Util/WaterColor.h rename to Minecraft.World/net/minecraft/world/level/WaterColor.h diff --git a/Minecraft.World/WorldGen/Biomes/BeachBiome.cpp b/Minecraft.World/net/minecraft/world/level/biome/BeachBiome.cpp similarity index 80% rename from Minecraft.World/WorldGen/Biomes/BeachBiome.cpp rename to Minecraft.World/net/minecraft/world/level/biome/BeachBiome.cpp index cfa68b6b4..a8825977a 100644 --- a/Minecraft.World/WorldGen/Biomes/BeachBiome.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/BeachBiome.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../Header Files/stdafx.h" +#include "../tile/net.minecraft.world.level.tile.h" #include "BiomeDecorator.h" #include "BeachBiome.h" diff --git a/Minecraft.World/WorldGen/Biomes/BeachBiome.h b/Minecraft.World/net/minecraft/world/level/biome/BeachBiome.h similarity index 100% rename from Minecraft.World/WorldGen/Biomes/BeachBiome.h rename to Minecraft.World/net/minecraft/world/level/biome/BeachBiome.h diff --git a/Minecraft.World/WorldGen/Biomes/Biome.cpp b/Minecraft.World/net/minecraft/world/level/biome/Biome.cpp similarity index 97% rename from Minecraft.World/WorldGen/Biomes/Biome.cpp rename to Minecraft.World/net/minecraft/world/level/biome/Biome.cpp index 8adde11c2..04a049f5f 100644 --- a/Minecraft.World/WorldGen/Biomes/Biome.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/Biome.cpp @@ -1,14 +1,14 @@ -#include "../../Platform/stdafx.h" -#include "../../Util/Color.h" -#include "../../../Minecraft.Client/Minecraft.h" -#include "../../Headers/net.minecraft.world.level.levelgen.feature.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.entity.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../ConsoleJavaLibs/Color.h" +#include "../../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../levelgen/feature/net.minecraft.world.level.levelgen.feature.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "../net.minecraft.world.level.h" +#include "../../entity/animal/net.minecraft.world.entity.animal.h" +#include "../../entity/monster/net.minecraft.world.entity.monster.h" +#include "../../entity/net.minecraft.world.entity.h" #include "Biome.h" -#include "../../Headers/net.minecraft.world.level.biome.h" +#include "net.minecraft.world.level.biome.h" // public static final Biome[] biomes = new Biome[256]; Biome* Biome::biomes[256]; diff --git a/Minecraft.World/WorldGen/Biomes/Biome.h b/Minecraft.World/net/minecraft/world/level/biome/Biome.h similarity index 97% rename from Minecraft.World/WorldGen/Biomes/Biome.h rename to Minecraft.World/net/minecraft/world/level/biome/Biome.h index dd9ecd3e3..bab5cac84 100644 --- a/Minecraft.World/WorldGen/Biomes/Biome.h +++ b/Minecraft.World/net/minecraft/world/level/biome/Biome.h @@ -1,8 +1,8 @@ #pragma once -#include "../../Level/Storage/LevelSource.h" -#include "../../Entities/Mob.h" -#include "../../Util/WeighedRandom.h" +#include "../LevelSource.h" +#include "../../entity/Mob.h" +#include "../../../util/WeighedRandom.h" class Feature; class MobCategory; diff --git a/Minecraft.World/WorldGen/Biomes/BiomeCache.cpp b/Minecraft.World/net/minecraft/world/level/biome/BiomeCache.cpp similarity index 97% rename from Minecraft.World/WorldGen/Biomes/BiomeCache.cpp rename to Minecraft.World/net/minecraft/world/level/biome/BiomeCache.cpp index 75fc85b82..a32bbdaaa 100644 --- a/Minecraft.World/WorldGen/Biomes/BiomeCache.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/BiomeCache.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "Biome.h" #include "BiomeSource.h" #include "BiomeCache.h" -#include "../../Platform/System.h" +#include "../../../../../ConsoleJavaLibs/System.h" BiomeCache::Block::Block(int x, int z, BiomeCache* parent) { // temps = floatArray(ZONE_SIZE * ZONE_SIZE, false); // MGH - diff --git a/Minecraft.World/WorldGen/Biomes/BiomeCache.h b/Minecraft.World/net/minecraft/world/level/biome/BiomeCache.h similarity index 96% rename from Minecraft.World/WorldGen/Biomes/BiomeCache.h rename to Minecraft.World/net/minecraft/world/level/biome/BiomeCache.h index 529461404..f3a2f5b4c 100644 --- a/Minecraft.World/WorldGen/Biomes/BiomeCache.h +++ b/Minecraft.World/net/minecraft/world/level/biome/BiomeCache.h @@ -1,6 +1,6 @@ #pragma once #include -#include "../Minecraft.World/Util/JavaIntHash.h" +#include "../../../../../ConsoleJavaLibs/JavaIntHash.h" class BiomeCache { private: diff --git a/Minecraft.World/WorldGen/Biomes/BiomeDecorator.cpp b/Minecraft.World/net/minecraft/world/level/biome/BiomeDecorator.cpp similarity index 97% rename from Minecraft.World/WorldGen/Biomes/BiomeDecorator.cpp rename to Minecraft.World/net/minecraft/world/level/biome/BiomeDecorator.cpp index 27349e494..767c6aea3 100644 --- a/Minecraft.World/WorldGen/Biomes/BiomeDecorator.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/BiomeDecorator.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.levelgen.feature.h" -#include "../../Headers/net.minecraft.world.level.biome.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "../levelgen/feature/net.minecraft.world.level.levelgen.feature.h" +#include "net.minecraft.world.level.biome.h" BiomeDecorator::BiomeDecorator(Biome* biome) { _init(); diff --git a/Minecraft.World/WorldGen/Biomes/BiomeDecorator.h b/Minecraft.World/net/minecraft/world/level/biome/BiomeDecorator.h similarity index 100% rename from Minecraft.World/WorldGen/Biomes/BiomeDecorator.h rename to Minecraft.World/net/minecraft/world/level/biome/BiomeDecorator.h diff --git a/Minecraft.World/WorldGen/Biomes/BiomeSource.cpp b/Minecraft.World/net/minecraft/world/level/biome/BiomeSource.cpp similarity index 97% rename from Minecraft.World/WorldGen/Biomes/BiomeSource.cpp rename to Minecraft.World/net/minecraft/world/level/biome/BiomeSource.cpp index 76e896d34..dab4e2e47 100644 --- a/Minecraft.World/WorldGen/Biomes/BiomeSource.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/BiomeSource.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.storage.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" -#include "../../Platform/System.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../storage/net.minecraft.world.level.storage.h" +#include "net.minecraft.world.level.biome.h" +#include "../newbiome/layer/net.minecraft.world.level.newbiome.layer.h" +#include "../../../../../ConsoleJavaLibs/System.h" #include "BiomeSource.h" -#include "../../../Minecraft.Client/Minecraft.h" -#include "../../../Minecraft.Client/Rendering/EntityRenderers/ProgressRenderer.h" +#include "../../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../../../Minecraft.Client/net/minecraft/client/ProgressRenderer.h" // 4J - removal of separate temperature & downfall layers brought forward // from 1.2.3 diff --git a/Minecraft.World/WorldGen/Biomes/BiomeSource.h b/Minecraft.World/net/minecraft/world/level/biome/BiomeSource.h similarity index 98% rename from Minecraft.World/WorldGen/Biomes/BiomeSource.h rename to Minecraft.World/net/minecraft/world/level/biome/BiomeSource.h index 7508c8f83..095167aca 100644 --- a/Minecraft.World/WorldGen/Biomes/BiomeSource.h +++ b/Minecraft.World/net/minecraft/world/level/biome/BiomeSource.h @@ -2,7 +2,7 @@ #include "Biome.h" #include "BiomeSource.h" #include "BiomeCache.h" -#include "../../Headers/net.minecraft.world.level.levelgen.synth.h" +#include "../levelgen/synth/net.minecraft.world.level.levelgen.synth.h" class ChunkPos; class Level; diff --git a/Minecraft.World/WorldGen/Biomes/DesertBiome.cpp b/Minecraft.World/net/minecraft/world/level/biome/DesertBiome.cpp similarity index 75% rename from Minecraft.World/WorldGen/Biomes/DesertBiome.cpp rename to Minecraft.World/net/minecraft/world/level/biome/DesertBiome.cpp index e01145c8d..396eb946f 100644 --- a/Minecraft.World/WorldGen/Biomes/DesertBiome.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/DesertBiome.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.levelgen.feature.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.biome.h" +#include "../../../../../Header Files/stdafx.h" +#include "../levelgen/feature/net.minecraft.world.level.levelgen.feature.h" +#include "../net.minecraft.world.level.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.biome.h" DesertBiome::DesertBiome(int id) : Biome(id) { // remove default mob spawn settings diff --git a/Minecraft.World/WorldGen/Biomes/DesertBiome.h b/Minecraft.World/net/minecraft/world/level/biome/DesertBiome.h similarity index 100% rename from Minecraft.World/WorldGen/Biomes/DesertBiome.h rename to Minecraft.World/net/minecraft/world/level/biome/DesertBiome.h diff --git a/Minecraft.World/WorldGen/Biomes/ExtremeHillsBiome.cpp b/Minecraft.World/net/minecraft/world/level/biome/ExtremeHillsBiome.cpp similarity index 84% rename from Minecraft.World/WorldGen/Biomes/ExtremeHillsBiome.cpp rename to Minecraft.World/net/minecraft/world/level/biome/ExtremeHillsBiome.cpp index 5ce0fb2db..3204c15c9 100644 --- a/Minecraft.World/WorldGen/Biomes/ExtremeHillsBiome.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/ExtremeHillsBiome.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.levelgen.feature.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "../levelgen/feature/net.minecraft.world.level.levelgen.feature.h" #include "ExtremeHillsBiome.h" ExtremeHillsBiome::ExtremeHillsBiome(int id) : Biome(id) { diff --git a/Minecraft.World/WorldGen/Biomes/ExtremeHillsBiome.h b/Minecraft.World/net/minecraft/world/level/biome/ExtremeHillsBiome.h similarity index 100% rename from Minecraft.World/WorldGen/Biomes/ExtremeHillsBiome.h rename to Minecraft.World/net/minecraft/world/level/biome/ExtremeHillsBiome.h diff --git a/Minecraft.World/WorldGen/Biomes/FixedBiomeSource.cpp b/Minecraft.World/net/minecraft/world/level/biome/FixedBiomeSource.cpp similarity index 98% rename from Minecraft.World/WorldGen/Biomes/FixedBiomeSource.cpp rename to Minecraft.World/net/minecraft/world/level/biome/FixedBiomeSource.cpp index d0f2ea0f7..74c8b057e 100644 --- a/Minecraft.World/WorldGen/Biomes/FixedBiomeSource.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/FixedBiomeSource.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Util/Arrays.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../ConsoleJavaLibs/Arrays.h" #include "FixedBiomeSource.h" FixedBiomeSource::FixedBiomeSource(Biome* fixed, float temperature, diff --git a/Minecraft.World/WorldGen/Biomes/FixedBiomeSource.h b/Minecraft.World/net/minecraft/world/level/biome/FixedBiomeSource.h similarity index 100% rename from Minecraft.World/WorldGen/Biomes/FixedBiomeSource.h rename to Minecraft.World/net/minecraft/world/level/biome/FixedBiomeSource.h diff --git a/Minecraft.World/WorldGen/Biomes/ForestBiome.cpp b/Minecraft.World/net/minecraft/world/level/biome/ForestBiome.cpp similarity index 78% rename from Minecraft.World/WorldGen/Biomes/ForestBiome.cpp rename to Minecraft.World/net/minecraft/world/level/biome/ForestBiome.cpp index b7c1b994c..23795a040 100644 --- a/Minecraft.World/WorldGen/Biomes/ForestBiome.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/ForestBiome.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.levelgen.feature.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.entity.h" +#include "../../../../../Header Files/stdafx.h" +#include "../levelgen/feature/net.minecraft.world.level.levelgen.feature.h" +#include "net.minecraft.world.level.biome.h" +#include "../../entity/animal/net.minecraft.world.entity.animal.h" +#include "../../entity/net.minecraft.world.entity.h" #include "ForestBiome.h" ForestBiome::ForestBiome(int id) : Biome(id) { diff --git a/Minecraft.World/WorldGen/Biomes/ForestBiome.h b/Minecraft.World/net/minecraft/world/level/biome/ForestBiome.h similarity index 100% rename from Minecraft.World/WorldGen/Biomes/ForestBiome.h rename to Minecraft.World/net/minecraft/world/level/biome/ForestBiome.h diff --git a/Minecraft.World/WorldGen/Biomes/HellBiome.cpp b/Minecraft.World/net/minecraft/world/level/biome/HellBiome.cpp similarity index 80% rename from Minecraft.World/WorldGen/Biomes/HellBiome.cpp rename to Minecraft.World/net/minecraft/world/level/biome/HellBiome.cpp index 273371764..76d31110c 100644 --- a/Minecraft.World/WorldGen/Biomes/HellBiome.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/HellBiome.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/monster/net.minecraft.world.entity.monster.h" #include "HellBiome.h" HellBiome::HellBiome(int id) : Biome(id) { diff --git a/Minecraft.World/WorldGen/Biomes/HellBiome.h b/Minecraft.World/net/minecraft/world/level/biome/HellBiome.h similarity index 100% rename from Minecraft.World/WorldGen/Biomes/HellBiome.h rename to Minecraft.World/net/minecraft/world/level/biome/HellBiome.h diff --git a/Minecraft.World/WorldGen/Biomes/IceBiome.cpp b/Minecraft.World/net/minecraft/world/level/biome/IceBiome.cpp similarity index 57% rename from Minecraft.World/WorldGen/Biomes/IceBiome.cpp rename to Minecraft.World/net/minecraft/world/level/biome/IceBiome.cpp index c37c49f8d..1b6cd0c9e 100644 --- a/Minecraft.World/WorldGen/Biomes/IceBiome.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/IceBiome.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "IceBiome.h" IceBiome::IceBiome(int id) : Biome(id) {}; \ No newline at end of file diff --git a/Minecraft.World/WorldGen/Biomes/IceBiome.h b/Minecraft.World/net/minecraft/world/level/biome/IceBiome.h similarity index 100% rename from Minecraft.World/WorldGen/Biomes/IceBiome.h rename to Minecraft.World/net/minecraft/world/level/biome/IceBiome.h diff --git a/Minecraft.World/WorldGen/Biomes/JungleBiome.cpp b/Minecraft.World/net/minecraft/world/level/biome/JungleBiome.cpp similarity index 85% rename from Minecraft.World/WorldGen/Biomes/JungleBiome.cpp rename to Minecraft.World/net/minecraft/world/level/biome/JungleBiome.cpp index 820b2a4b5..a338ec163 100644 --- a/Minecraft.World/WorldGen/Biomes/JungleBiome.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/JungleBiome.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../../Headers/net.minecraft.world.level.levelgen.feature.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" +#include "../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.biome.h" +#include "../levelgen/feature/net.minecraft.world.level.levelgen.feature.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "../net.minecraft.world.level.h" +#include "../../entity/animal/net.minecraft.world.entity.animal.h" #include "JungleBiome.h" JungleBiome::JungleBiome(int id) : Biome(id) { diff --git a/Minecraft.World/WorldGen/Biomes/JungleBiome.h b/Minecraft.World/net/minecraft/world/level/biome/JungleBiome.h similarity index 100% rename from Minecraft.World/WorldGen/Biomes/JungleBiome.h rename to Minecraft.World/net/minecraft/world/level/biome/JungleBiome.h diff --git a/Minecraft.World/WorldGen/Biomes/MushroomIslandBiome.cpp b/Minecraft.World/net/minecraft/world/level/biome/MushroomIslandBiome.cpp similarity index 79% rename from Minecraft.World/WorldGen/Biomes/MushroomIslandBiome.cpp rename to Minecraft.World/net/minecraft/world/level/biome/MushroomIslandBiome.cpp index 027e28bce..aecf73f59 100644 --- a/Minecraft.World/WorldGen/Biomes/MushroomIslandBiome.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/MushroomIslandBiome.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "MushroomIslandBiome.h" #include "BiomeDecorator.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../entity/animal/net.minecraft.world.entity.animal.h" +#include "../tile/net.minecraft.world.level.tile.h" MushroomIslandBiome::MushroomIslandBiome(int id) : Biome(id) { decorator->treeCount = -100; diff --git a/Minecraft.World/WorldGen/Biomes/MushroomIslandBiome.h b/Minecraft.World/net/minecraft/world/level/biome/MushroomIslandBiome.h similarity index 100% rename from Minecraft.World/WorldGen/Biomes/MushroomIslandBiome.h rename to Minecraft.World/net/minecraft/world/level/biome/MushroomIslandBiome.h diff --git a/Minecraft.World/WorldGen/Biomes/OceanBiome.h b/Minecraft.World/net/minecraft/world/level/biome/OceanBiome.h similarity index 100% rename from Minecraft.World/WorldGen/Biomes/OceanBiome.h rename to Minecraft.World/net/minecraft/world/level/biome/OceanBiome.h diff --git a/Minecraft.World/WorldGen/Biomes/PlainsBiome.cpp b/Minecraft.World/net/minecraft/world/level/biome/PlainsBiome.cpp similarity index 69% rename from Minecraft.World/WorldGen/Biomes/PlainsBiome.cpp rename to Minecraft.World/net/minecraft/world/level/biome/PlainsBiome.cpp index c86f58566..fbb0f548c 100644 --- a/Minecraft.World/WorldGen/Biomes/PlainsBiome.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/PlainsBiome.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.biome.h" +#include "../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.biome.h" PlainsBiome::PlainsBiome(int id) : Biome(id) { friendlies.push_back(new MobSpawnerData(eTYPE_HORSE, 5, 2, 6)); diff --git a/Minecraft.World/WorldGen/Biomes/PlainsBiome.h b/Minecraft.World/net/minecraft/world/level/biome/PlainsBiome.h similarity index 100% rename from Minecraft.World/WorldGen/Biomes/PlainsBiome.h rename to Minecraft.World/net/minecraft/world/level/biome/PlainsBiome.h diff --git a/Minecraft.World/WorldGen/Biomes/RainforestBiome.cpp b/Minecraft.World/net/minecraft/world/level/biome/RainforestBiome.cpp similarity index 67% rename from Minecraft.World/WorldGen/Biomes/RainforestBiome.cpp rename to Minecraft.World/net/minecraft/world/level/biome/RainforestBiome.cpp index dfbb9eb4a..4c6bfaa6b 100644 --- a/Minecraft.World/WorldGen/Biomes/RainforestBiome.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/RainforestBiome.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "RainforestBiome.h" -#include "../../Headers/net.minecraft.world.level.levelgen.feature.h" +#include "../levelgen/feature/net.minecraft.world.level.levelgen.feature.h" RainforestBiome::RainforestBiome(int id) : Biome(id) {} diff --git a/Minecraft.World/WorldGen/Biomes/RainforestBiome.h b/Minecraft.World/net/minecraft/world/level/biome/RainforestBiome.h similarity index 100% rename from Minecraft.World/WorldGen/Biomes/RainforestBiome.h rename to Minecraft.World/net/minecraft/world/level/biome/RainforestBiome.h diff --git a/Minecraft.World/WorldGen/Biomes/RiverBiome.h b/Minecraft.World/net/minecraft/world/level/biome/RiverBiome.h similarity index 100% rename from Minecraft.World/WorldGen/Biomes/RiverBiome.h rename to Minecraft.World/net/minecraft/world/level/biome/RiverBiome.h diff --git a/Minecraft.World/WorldGen/Biomes/SwampBiome.cpp b/Minecraft.World/net/minecraft/world/level/biome/SwampBiome.cpp similarity index 85% rename from Minecraft.World/WorldGen/Biomes/SwampBiome.cpp rename to Minecraft.World/net/minecraft/world/level/biome/SwampBiome.cpp index 9c50c03cc..42d5a35da 100644 --- a/Minecraft.World/WorldGen/Biomes/SwampBiome.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/SwampBiome.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../Features/SwampTreeFeature.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "net.minecraft.world.level.biome.h" +#include "../levelgen/feature/SwampTreeFeature.h" SwampBiome::SwampBiome(int id) : Biome(id) { decorator->treeCount = 2; diff --git a/Minecraft.World/WorldGen/Biomes/SwampBiome.h b/Minecraft.World/net/minecraft/world/level/biome/SwampBiome.h similarity index 100% rename from Minecraft.World/WorldGen/Biomes/SwampBiome.h rename to Minecraft.World/net/minecraft/world/level/biome/SwampBiome.h diff --git a/Minecraft.World/WorldGen/Biomes/TaigaBiome.cpp b/Minecraft.World/net/minecraft/world/level/biome/TaigaBiome.cpp similarity index 64% rename from Minecraft.World/WorldGen/Biomes/TaigaBiome.cpp rename to Minecraft.World/net/minecraft/world/level/biome/TaigaBiome.cpp index e25d5e7d1..b12672cc1 100644 --- a/Minecraft.World/WorldGen/Biomes/TaigaBiome.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/TaigaBiome.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "TaigaBiome.h" -#include "../../Headers/net.minecraft.world.entity.animal.h" -#include "../../Headers/net.minecraft.world.level.levelgen.feature.h" -#include "../../Headers/net.minecraft.world.level.biome.h" +#include "../../entity/animal/net.minecraft.world.entity.animal.h" +#include "../levelgen/feature/net.minecraft.world.level.levelgen.feature.h" +#include "net.minecraft.world.level.biome.h" TaigaBiome::TaigaBiome(int id) : Biome(id) { friendlies_wolf.push_back(new MobSpawnerData( diff --git a/Minecraft.World/WorldGen/Biomes/TaigaBiome.h b/Minecraft.World/net/minecraft/world/level/biome/TaigaBiome.h similarity index 100% rename from Minecraft.World/WorldGen/Biomes/TaigaBiome.h rename to Minecraft.World/net/minecraft/world/level/biome/TaigaBiome.h diff --git a/Minecraft.World/WorldGen/Biomes/TheEndBiome.cpp b/Minecraft.World/net/minecraft/world/level/biome/TheEndBiome.cpp similarity index 73% rename from Minecraft.World/WorldGen/Biomes/TheEndBiome.cpp rename to Minecraft.World/net/minecraft/world/level/biome/TheEndBiome.cpp index 77dce0233..bf1a1ead9 100644 --- a/Minecraft.World/WorldGen/Biomes/TheEndBiome.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/TheEndBiome.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "TheEndBiome.h" -#include "../Structures/TheEndBiomeDecorator.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "TheEndBiomeDecorator.h" +#include "../../entity/monster/net.minecraft.world.entity.monster.h" +#include "../tile/net.minecraft.world.level.tile.h" TheEndBiome::TheEndBiome(int id) : Biome(id) { enemies.clear(); diff --git a/Minecraft.World/WorldGen/Biomes/TheEndBiome.h b/Minecraft.World/net/minecraft/world/level/biome/TheEndBiome.h similarity index 100% rename from Minecraft.World/WorldGen/Biomes/TheEndBiome.h rename to Minecraft.World/net/minecraft/world/level/biome/TheEndBiome.h diff --git a/Minecraft.World/WorldGen/Structures/TheEndBiomeDecorator.cpp b/Minecraft.World/net/minecraft/world/level/biome/TheEndBiomeDecorator.cpp similarity index 89% rename from Minecraft.World/WorldGen/Structures/TheEndBiomeDecorator.cpp rename to Minecraft.World/net/minecraft/world/level/biome/TheEndBiomeDecorator.cpp index c7baf035d..86c7483b1 100644 --- a/Minecraft.World/WorldGen/Structures/TheEndBiomeDecorator.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/TheEndBiomeDecorator.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "TheEndBiomeDecorator.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.levelgen.feature.h" -#include "../../Headers/net.minecraft.world.entity.boss.enderdragon.h" +#include "../net.minecraft.world.level.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "../levelgen/feature/net.minecraft.world.level.levelgen.feature.h" +#include "../../entity/boss/enderdragon/net.minecraft.world.entity.boss.enderdragon.h" // Spike centre positions, calculated using // for(int i=0;i<8;i++) diff --git a/Minecraft.World/WorldGen/Structures/TheEndBiomeDecorator.h b/Minecraft.World/net/minecraft/world/level/biome/TheEndBiomeDecorator.h similarity index 90% rename from Minecraft.World/WorldGen/Structures/TheEndBiomeDecorator.h rename to Minecraft.World/net/minecraft/world/level/biome/TheEndBiomeDecorator.h index c184af238..82a3bc9ca 100644 --- a/Minecraft.World/WorldGen/Structures/TheEndBiomeDecorator.h +++ b/Minecraft.World/net/minecraft/world/level/biome/TheEndBiomeDecorator.h @@ -1,5 +1,5 @@ #pragma once -#include "../Biomes/BiomeDecorator.h" +#include "BiomeDecorator.h" class TheEndBiomeDecorator : public BiomeDecorator { public: diff --git a/Minecraft.World/WorldGen/Features/WaterlilyFeature.cpp b/Minecraft.World/net/minecraft/world/level/biome/WaterlilyFeature.cpp similarity index 81% rename from Minecraft.World/WorldGen/Features/WaterlilyFeature.cpp rename to Minecraft.World/net/minecraft/world/level/biome/WaterlilyFeature.cpp index 0271759ff..afd7799b9 100644 --- a/Minecraft.World/WorldGen/Features/WaterlilyFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/biome/WaterlilyFeature.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "WaterlilyFeature.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "../net.minecraft.world.level.h" bool WaterlilyFeature::place(Level* level, Random* random, int x, int y, int z) { diff --git a/Minecraft.World/WorldGen/Features/WaterlilyFeature.h b/Minecraft.World/net/minecraft/world/level/biome/WaterlilyFeature.h similarity index 76% rename from Minecraft.World/WorldGen/Features/WaterlilyFeature.h rename to Minecraft.World/net/minecraft/world/level/biome/WaterlilyFeature.h index de2a2eaff..b1d303c00 100644 --- a/Minecraft.World/WorldGen/Features/WaterlilyFeature.h +++ b/Minecraft.World/net/minecraft/world/level/biome/WaterlilyFeature.h @@ -1,5 +1,5 @@ #pragma once -#include "Feature.h" +#include "../levelgen/feature/Feature.h" class WaterlilyFeature : public Feature { virtual bool place(Level* level, Random* random, int x, int y, int z); diff --git a/Minecraft.World/net/minecraft/world/level/biome/net.minecraft.world.level.biome.h b/Minecraft.World/net/minecraft/world/level/biome/net.minecraft.world.level.biome.h new file mode 100644 index 000000000..a47131d79 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/level/biome/net.minecraft.world.level.biome.h @@ -0,0 +1,31 @@ +#pragma once + +#include "Biome.h" +#include "ForestBiome.h" +#include "HellBiome.h" +#include "RainforestBiome.h" +#include "IceBiome.h" +#include "MushroomIslandBiome.h" +#include "TheEndBiome.h" +#include "TheEndBiomeDecorator.h" +#include "WaterlilyFeature.h" +#include "SwampBiome.h" +#include "TaigaBiome.h" +#include "../LevelSource.h" +#include "BiomeSource.h" +#include "FixedBiomeSource.h" + +// 1.8.2 +#include "BiomeCache.h" +#include "BiomeDecorator.h" +#include "DesertBiome.h" +#include "ExtremeHillsBiome.h" +#include "OceanBiome.h" +#include "PlainsBiome.h" +#include "RiverBiome.h" + +// 1.1 +#include "BeachBiome.h" + +// 1.2.3 +#include "JungleBiome.h" \ No newline at end of file diff --git a/Minecraft.World/Level/BlockReplacements.cpp b/Minecraft.World/net/minecraft/world/level/chunk/BlockReplacements.cpp similarity index 83% rename from Minecraft.World/Level/BlockReplacements.cpp rename to Minecraft.World/net/minecraft/world/level/chunk/BlockReplacements.cpp index 94a9e26dc..54cf95874 100644 --- a/Minecraft.World/Level/BlockReplacements.cpp +++ b/Minecraft.World/net/minecraft/world/level/chunk/BlockReplacements.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "BlockReplacements.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../tile/net.minecraft.world.level.tile.h" byteArray BlockReplacements::replacements = byteArray(256); diff --git a/Minecraft.World/Level/BlockReplacements.h b/Minecraft.World/net/minecraft/world/level/chunk/BlockReplacements.h similarity index 100% rename from Minecraft.World/Level/BlockReplacements.h rename to Minecraft.World/net/minecraft/world/level/chunk/BlockReplacements.h diff --git a/Minecraft.World/Level/ChunkSource.h b/Minecraft.World/net/minecraft/world/level/chunk/ChunkSource.h similarity index 98% rename from Minecraft.World/Level/ChunkSource.h rename to Minecraft.World/net/minecraft/world/level/chunk/ChunkSource.h index ced0a1e84..2ed5cde91 100644 --- a/Minecraft.World/Level/ChunkSource.h +++ b/Minecraft.World/net/minecraft/world/level/chunk/ChunkSource.h @@ -1,6 +1,6 @@ #pragma once -#include "../WorldGen/Biomes/Biome.h" +#include "../biome/Biome.h" class ProgressListener; class TilePos; diff --git a/Minecraft.World/Level/Storage/CompressedTileStorage.cpp b/Minecraft.World/net/minecraft/world/level/chunk/CompressedTileStorage.cpp similarity index 99% rename from Minecraft.World/Level/Storage/CompressedTileStorage.cpp rename to Minecraft.World/net/minecraft/world/level/chunk/CompressedTileStorage.cpp index a2b3f921c..870a964e7 100644 --- a/Minecraft.World/Level/Storage/CompressedTileStorage.cpp +++ b/Minecraft.World/net/minecraft/world/level/chunk/CompressedTileStorage.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "CompressedTileStorage.h" // Note: See header for an overview of this class diff --git a/Minecraft.World/Level/Storage/CompressedTileStorage.h b/Minecraft.World/net/minecraft/world/level/chunk/CompressedTileStorage.h similarity index 99% rename from Minecraft.World/Level/Storage/CompressedTileStorage.h rename to Minecraft.World/net/minecraft/world/level/chunk/CompressedTileStorage.h index 42e91e455..66452e5a5 100644 --- a/Minecraft.World/Level/Storage/CompressedTileStorage.h +++ b/Minecraft.World/net/minecraft/world/level/chunk/CompressedTileStorage.h @@ -1,7 +1,7 @@ #pragma once #include #if !defined(__linux__) -#include "../../Platform/x64headers/xmcore.h" +#include "../../../../../x64headers/xmcore.h" #endif // This class is used for the compressed storage of tile data. Unlike the diff --git a/Minecraft.World/Level/Storage/DataLayer.cpp b/Minecraft.World/net/minecraft/world/level/chunk/DataLayer.cpp similarity index 96% rename from Minecraft.World/Level/Storage/DataLayer.cpp rename to Minecraft.World/net/minecraft/world/level/chunk/DataLayer.cpp index e52287c09..24c50c0ca 100644 --- a/Minecraft.World/Level/Storage/DataLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/chunk/DataLayer.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "DataLayer.h" DataLayer::DataLayer(int length, int depthBits) diff --git a/Minecraft.World/Level/Storage/DataLayer.h b/Minecraft.World/net/minecraft/world/level/chunk/DataLayer.h similarity index 100% rename from Minecraft.World/Level/Storage/DataLayer.h rename to Minecraft.World/net/minecraft/world/level/chunk/DataLayer.h diff --git a/Minecraft.World/Level/EmptyLevelChunk.cpp b/Minecraft.World/net/minecraft/world/level/chunk/EmptyLevelChunk.cpp similarity index 96% rename from Minecraft.World/Level/EmptyLevelChunk.cpp rename to Minecraft.World/net/minecraft/world/level/chunk/EmptyLevelChunk.cpp index addbb0992..4704acf13 100644 --- a/Minecraft.World/Level/EmptyLevelChunk.cpp +++ b/Minecraft.World/net/minecraft/world/level/chunk/EmptyLevelChunk.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Util/Arrays.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.phys.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../ConsoleJavaLibs/Arrays.h" +#include "../net.minecraft.world.level.h" +#include "../../phys/net.minecraft.world.phys.h" #include "EmptyLevelChunk.h" EmptyLevelChunk::EmptyLevelChunk(Level* level, int x, int z) diff --git a/Minecraft.World/Level/EmptyLevelChunk.h b/Minecraft.World/net/minecraft/world/level/chunk/EmptyLevelChunk.h similarity index 98% rename from Minecraft.World/Level/EmptyLevelChunk.h rename to Minecraft.World/net/minecraft/world/level/chunk/EmptyLevelChunk.h index 5c64f9c8c..eaa165237 100644 --- a/Minecraft.World/Level/EmptyLevelChunk.h +++ b/Minecraft.World/net/minecraft/world/level/chunk/EmptyLevelChunk.h @@ -1,6 +1,6 @@ #pragma once #include "LevelChunk.h" -#include "../Util/Definitions.h" +#include "../../../../../ConsoleHelpers/Definitions.h" class Level; diff --git a/Minecraft.World/Level/LevelChunk.cpp b/Minecraft.World/net/minecraft/world/level/chunk/LevelChunk.cpp similarity index 99% rename from Minecraft.World/Level/LevelChunk.cpp rename to Minecraft.World/net/minecraft/world/level/chunk/LevelChunk.cpp index 69d4a9ebc..8a06d521e 100644 --- a/Minecraft.World/Level/LevelChunk.cpp +++ b/Minecraft.World/net/minecraft/world/level/chunk/LevelChunk.cpp @@ -1,23 +1,23 @@ -#include "../Platform/stdafx.h" -#include "../Platform/System.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.dimension.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.level.biome.h" -#include "../Headers/net.minecraft.world.entity.monster.h" -#include "Storage/DataLayer.h" -#include "Storage/SparseLightStorage.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../ConsoleJavaLibs/System.h" +#include "../../entity/net.minecraft.world.entity.h" +#include "../net.minecraft.world.level.h" +#include "../dimension/net.minecraft.world.level.dimension.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../biome/net.minecraft.world.level.biome.h" +#include "../../entity/monster/net.minecraft.world.entity.monster.h" +#include "DataLayer.h" +#include "SparseLightStorage.h" #include "BlockReplacements.h" #include "LevelChunk.h" #include -#include "../../Minecraft.Client/MinecraftServer.h" -#include "../../Minecraft.Client/Level/ServerLevel.h" -#include "../../Minecraft.Client/Network/ServerChunkCache.h" -#include "../../Minecraft.Client/Rendering/GameRenderer.h" -#include "../Entities/ItemEntity.h" -#include "../Entities/Mobs/Minecart.h" +#include "../../Minecraft.Client/net/minecraft/server/MinecraftServer.h" +#include "../../Minecraft.Client/net/minecraft/server/level/ServerLevel.h" +#include "../../Minecraft.Client/net/minecraft/server/level/ServerChunkCache.h" +#include "../../Minecraft.Client/net/minecraft/client/renderer/GameRenderer.h" +#include "../../entity/item/ItemEntity.h" +#include "../../entity/item/Minecart.h" #include diff --git a/Minecraft.World/Level/LevelChunk.h b/Minecraft.World/net/minecraft/world/level/chunk/LevelChunk.h similarity index 98% rename from Minecraft.World/Level/LevelChunk.h rename to Minecraft.World/net/minecraft/world/level/chunk/LevelChunk.h index 7796cb7a3..7c0a55feb 100644 --- a/Minecraft.World/Level/LevelChunk.h +++ b/Minecraft.World/net/minecraft/world/level/chunk/LevelChunk.h @@ -8,13 +8,13 @@ class Random; class ChunkSource; class EntitySelector; -#include "Storage/SparseLightStorage.h" -#include "Storage/CompressedTileStorage.h" -#include "Storage/SparseDataStorage.h" +#include "SparseLightStorage.h" +#include "CompressedTileStorage.h" +#include "SparseDataStorage.h" -#include "../Util/LightLayer.h" -#include "../Entities/Entity.h" -#include "Level.h" +#include "../LightLayer.h" +#include "../../entity/Entity.h" +#include "../Level.h" #define SHARING_ENABLED class TileCompressData_SPU; diff --git a/Minecraft.World/Level/Storage/ReadOnlyChunkCache.cpp b/Minecraft.World/net/minecraft/world/level/chunk/ReadOnlyChunkCache.cpp similarity index 94% rename from Minecraft.World/Level/Storage/ReadOnlyChunkCache.cpp rename to Minecraft.World/net/minecraft/world/level/chunk/ReadOnlyChunkCache.cpp index 41f8c72e3..acdc71e59 100644 --- a/Minecraft.World/Level/Storage/ReadOnlyChunkCache.cpp +++ b/Minecraft.World/net/minecraft/world/level/chunk/ReadOnlyChunkCache.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" #include "ReadOnlyChunkCache.h" -#include "../../WorldGen/Biomes/Biome.h" +#include "../biome/Biome.h" ReadOnlyChunkCache::ReadOnlyChunkCache(Level* level, ChunkStorage* storage) { chunks = LevelChunkArray(LEN * LEN); diff --git a/Minecraft.World/Level/Storage/ReadOnlyChunkCache.h b/Minecraft.World/net/minecraft/world/level/chunk/ReadOnlyChunkCache.h similarity index 91% rename from Minecraft.World/Level/Storage/ReadOnlyChunkCache.h rename to Minecraft.World/net/minecraft/world/level/chunk/ReadOnlyChunkCache.h index 6d96389bf..01c421c99 100644 --- a/Minecraft.World/Level/Storage/ReadOnlyChunkCache.h +++ b/Minecraft.World/net/minecraft/world/level/chunk/ReadOnlyChunkCache.h @@ -1,8 +1,8 @@ #pragma once -#include "../ChunkSource.h" -#include "../LevelChunk.h" -#include "../EmptyLevelChunk.h" -#include "ChunkStorage.h" +#include "ChunkSource.h" +#include "LevelChunk.h" +#include "EmptyLevelChunk.h" +#include "storage/ChunkStorage.h" class ProgressListener; diff --git a/Minecraft.World/Level/Storage/SparseDataStorage.cpp b/Minecraft.World/net/minecraft/world/level/chunk/SparseDataStorage.cpp similarity index 99% rename from Minecraft.World/Level/Storage/SparseDataStorage.cpp rename to Minecraft.World/net/minecraft/world/level/chunk/SparseDataStorage.cpp index 061c38a03..a3114c574 100644 --- a/Minecraft.World/Level/Storage/SparseDataStorage.cpp +++ b/Minecraft.World/net/minecraft/world/level/chunk/SparseDataStorage.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "SparseDataStorage.h" // Note: See header for an overview of this class diff --git a/Minecraft.World/Level/Storage/SparseDataStorage.h b/Minecraft.World/net/minecraft/world/level/chunk/SparseDataStorage.h similarity index 99% rename from Minecraft.World/Level/Storage/SparseDataStorage.h rename to Minecraft.World/net/minecraft/world/level/chunk/SparseDataStorage.h index 09c4140c3..efe32b763 100644 --- a/Minecraft.World/Level/Storage/SparseDataStorage.h +++ b/Minecraft.World/net/minecraft/world/level/chunk/SparseDataStorage.h @@ -1,6 +1,6 @@ #pragma once #if !defined(__linux__) -#include "../../Platform/x64headers/xmcore.h" +#include "../../../../../x64headers/xmcore.h" #endif // 4J added - Storage for data (ie the extra per tile storage). Data is normally diff --git a/Minecraft.World/Level/Storage/SparseLightStorage.cpp b/Minecraft.World/net/minecraft/world/level/chunk/SparseLightStorage.cpp similarity index 99% rename from Minecraft.World/Level/Storage/SparseLightStorage.cpp rename to Minecraft.World/net/minecraft/world/level/chunk/SparseLightStorage.cpp index f713858ab..8097ed332 100644 --- a/Minecraft.World/Level/Storage/SparseLightStorage.cpp +++ b/Minecraft.World/net/minecraft/world/level/chunk/SparseLightStorage.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "SparseLightStorage.h" // Note: See header for an overview of this class diff --git a/Minecraft.World/Level/Storage/SparseLightStorage.h b/Minecraft.World/net/minecraft/world/level/chunk/SparseLightStorage.h similarity index 99% rename from Minecraft.World/Level/Storage/SparseLightStorage.h rename to Minecraft.World/net/minecraft/world/level/chunk/SparseLightStorage.h index 7077e3fb9..49c554309 100644 --- a/Minecraft.World/Level/Storage/SparseLightStorage.h +++ b/Minecraft.World/net/minecraft/world/level/chunk/SparseLightStorage.h @@ -1,6 +1,6 @@ #pragma once #if !defined(__linux__) -#include "../../Platform/x64headers/xmcore.h" +#include "../../../../../x64headers/xmcore.h" #endif // 4J added - Storage for block & sky light data. Lighting data is normally diff --git a/Minecraft.World/Level/WaterLevelChunk.cpp b/Minecraft.World/net/minecraft/world/level/chunk/WaterLevelChunk.cpp similarity index 93% rename from Minecraft.World/Level/WaterLevelChunk.cpp rename to Minecraft.World/net/minecraft/world/level/chunk/WaterLevelChunk.cpp index 27a64e93e..31f58748a 100644 --- a/Minecraft.World/Level/WaterLevelChunk.cpp +++ b/Minecraft.World/net/minecraft/world/level/chunk/WaterLevelChunk.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Util/Arrays.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.phys.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../ConsoleJavaLibs/Arrays.h" +#include "../net.minecraft.world.level.h" +#include "../../phys/net.minecraft.world.phys.h" #include "WaterLevelChunk.h" -#include "../Headers/net.minecraft.world.level.biome.h" +#include "../biome/net.minecraft.world.level.biome.h" WaterLevelChunk::WaterLevelChunk(Level* level, byteArray blocks, int x, int z) : LevelChunk(level, blocks, x, z) { diff --git a/Minecraft.World/Level/WaterLevelChunk.h b/Minecraft.World/net/minecraft/world/level/chunk/WaterLevelChunk.h similarity index 97% rename from Minecraft.World/Level/WaterLevelChunk.h rename to Minecraft.World/net/minecraft/world/level/chunk/WaterLevelChunk.h index f153318a4..f7e8f71fd 100644 --- a/Minecraft.World/Level/WaterLevelChunk.h +++ b/Minecraft.World/net/minecraft/world/level/chunk/WaterLevelChunk.h @@ -1,6 +1,6 @@ #pragma once #include "LevelChunk.h" -#include "../Util/Definitions.h" +#include "../../../../../ConsoleHelpers/Definitions.h" class Level; diff --git a/Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h b/Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h new file mode 100644 index 000000000..d98bbe5cf --- /dev/null +++ b/Minecraft.World/net/minecraft/world/level/chunk/net.minecraft.world.level.chunk.h @@ -0,0 +1,8 @@ +#pragma once + +#include "BlockReplacements.h" +#include "ChunkSource.h" +#include "DataLayer.h" +#include "EmptyLevelChunk.h" +#include "LevelChunk.h" +#include "ReadOnlyChunkCache.h" diff --git a/Minecraft.World/Level/Storage/ChunkStorage.h b/Minecraft.World/net/minecraft/world/level/chunk/storage/ChunkStorage.h similarity index 100% rename from Minecraft.World/Level/Storage/ChunkStorage.h rename to Minecraft.World/net/minecraft/world/level/chunk/storage/ChunkStorage.h diff --git a/Minecraft.World/Level/Storage/ChunkStorageProfileDecorator.cpp b/Minecraft.World/net/minecraft/world/level/chunk/storage/ChunkStorageProfileDecorator.cpp similarity index 95% rename from Minecraft.World/Level/Storage/ChunkStorageProfileDecorator.cpp rename to Minecraft.World/net/minecraft/world/level/chunk/storage/ChunkStorageProfileDecorator.cpp index 48f93c1a5..aea3a296c 100644 --- a/Minecraft.World/Level/Storage/ChunkStorageProfileDecorator.cpp +++ b/Minecraft.World/net/minecraft/world/level/chunk/storage/ChunkStorageProfileDecorator.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Platform/System.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../../../ConsoleJavaLibs/System.h" #include "ChunkStorageProfileDecorator.h" ChunkStorageProfilerDecorator::ChunkStorageProfilerDecorator( diff --git a/Minecraft.World/Level/Storage/ChunkStorageProfileDecorator.h b/Minecraft.World/net/minecraft/world/level/chunk/storage/ChunkStorageProfileDecorator.h similarity index 100% rename from Minecraft.World/Level/Storage/ChunkStorageProfileDecorator.h rename to Minecraft.World/net/minecraft/world/level/chunk/storage/ChunkStorageProfileDecorator.h diff --git a/Minecraft.World/Level/Storage/McRegionChunkStorage.cpp b/Minecraft.World/net/minecraft/world/level/chunk/storage/McRegionChunkStorage.cpp similarity index 98% rename from Minecraft.World/Level/Storage/McRegionChunkStorage.cpp rename to Minecraft.World/net/minecraft/world/level/chunk/storage/McRegionChunkStorage.cpp index 27808d7af..4727c9f97 100644 --- a/Minecraft.World/Level/Storage/McRegionChunkStorage.cpp +++ b/Minecraft.World/net/minecraft/world/level/chunk/storage/McRegionChunkStorage.cpp @@ -2,11 +2,11 @@ #include #include -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../IO/Files/ConsoleSaveFileIO.h" -#include "../../Util/ThreadName.h" -#include "../LevelData.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../../../../../ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileIO.h" +#include "../../../../../../ConsoleHelpers/ThreadName.h" +#include "../../storage/LevelData.h" #include "McRegionChunkStorage.h" std::mutex McRegionChunkStorage::cs_memory; diff --git a/Minecraft.World/Level/Storage/McRegionChunkStorage.h b/Minecraft.World/net/minecraft/world/level/chunk/storage/McRegionChunkStorage.h similarity index 95% rename from Minecraft.World/Level/Storage/McRegionChunkStorage.h rename to Minecraft.World/net/minecraft/world/level/chunk/storage/McRegionChunkStorage.h index f651f95e5..de8002814 100644 --- a/Minecraft.World/Level/Storage/McRegionChunkStorage.h +++ b/Minecraft.World/net/minecraft/world/level/chunk/storage/McRegionChunkStorage.h @@ -5,7 +5,7 @@ #include "ChunkStorage.h" #include "../LevelChunk.h" #include "RegionFileCache.h" -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../../../com/mojang/nbt/com.mojang.nbt.h" #include "OldChunkStorage.h" class ConsoleSaveFile; diff --git a/Minecraft.World/Level/Storage/MemoryChunkStorage.cpp b/Minecraft.World/net/minecraft/world/level/chunk/storage/MemoryChunkStorage.cpp similarity index 76% rename from Minecraft.World/Level/Storage/MemoryChunkStorage.cpp rename to Minecraft.World/net/minecraft/world/level/chunk/storage/MemoryChunkStorage.cpp index f5bb9977d..f3cfd2330 100644 --- a/Minecraft.World/Level/Storage/MemoryChunkStorage.cpp +++ b/Minecraft.World/net/minecraft/world/level/chunk/storage/MemoryChunkStorage.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.chunk.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../net.minecraft.world.level.chunk.h" #include "MemoryChunkStorage.h" LevelChunk* MemoryChunkStorage::load(Level* level, int x, diff --git a/Minecraft.World/Level/Storage/MemoryChunkStorage.h b/Minecraft.World/net/minecraft/world/level/chunk/storage/MemoryChunkStorage.h similarity index 100% rename from Minecraft.World/Level/Storage/MemoryChunkStorage.h rename to Minecraft.World/net/minecraft/world/level/chunk/storage/MemoryChunkStorage.h diff --git a/Minecraft.World/IO/NBT/NbtSlotFile.cpp b/Minecraft.World/net/minecraft/world/level/chunk/storage/NbtSlotFile.cpp similarity index 98% rename from Minecraft.World/IO/NBT/NbtSlotFile.cpp rename to Minecraft.World/net/minecraft/world/level/chunk/storage/NbtSlotFile.cpp index 07eaf0307..fbf26d18a 100644 --- a/Minecraft.World/IO/NBT/NbtSlotFile.cpp +++ b/Minecraft.World/net/minecraft/world/level/chunk/storage/NbtSlotFile.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../Files/File.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../../../ConsoleJavaLibs/File.h" #include "NbtSlotFile.h" namespace { diff --git a/Minecraft.World/IO/NBT/NbtSlotFile.h b/Minecraft.World/net/minecraft/world/level/chunk/storage/NbtSlotFile.h similarity index 84% rename from Minecraft.World/IO/NBT/NbtSlotFile.h rename to Minecraft.World/net/minecraft/world/level/chunk/storage/NbtSlotFile.h index 9f7a88788..a2f2413b6 100644 --- a/Minecraft.World/IO/NBT/NbtSlotFile.h +++ b/Minecraft.World/net/minecraft/world/level/chunk/storage/NbtSlotFile.h @@ -1,9 +1,9 @@ #pragma once #include -#include "CompoundTag.h" -#include "../../Level/Storage/ZonedChunkStorage.h" -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../../../com/mojang/nbt/CompoundTag.h" +#include "ZonedChunkStorage.h" +#include "../../../../../../com/mojang/nbt/com.mojang.nbt.h" class NbtSlotFile { private: diff --git a/Minecraft.World/Level/Storage/OldChunkStorage.cpp b/Minecraft.World/net/minecraft/world/level/chunk/storage/OldChunkStorage.cpp similarity index 97% rename from Minecraft.World/Level/Storage/OldChunkStorage.cpp rename to Minecraft.World/net/minecraft/world/level/chunk/storage/OldChunkStorage.cpp index 70ace0f3a..d3fad50ea 100644 --- a/Minecraft.World/Level/Storage/OldChunkStorage.cpp +++ b/Minecraft.World/net/minecraft/world/level/chunk/storage/OldChunkStorage.cpp @@ -1,13 +1,13 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include -#include "../../IO/Files/File.h" -#include "../../IO/Streams/InputOutputStream.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.chunk.h" -#include "../../Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Headers/net.minecraft.world.level.storage.h" -#include "../../IO/Files/FileHeader.h" +#include "../../../../../../ConsoleJavaLibs/File.h" +#include "../../../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../../entity/net.minecraft.world.entity.h" +#include "../../net.minecraft.world.level.h" +#include "../net.minecraft.world.level.chunk.h" +#include "../../tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../storage/net.minecraft.world.level.storage.h" +#include "../../../../../../ConsoleHelpers/ConsoleSaveFileIO/FileHeader.h" #include "OldChunkStorage.h" thread_local OldChunkStorage::ThreadStorage* OldChunkStorage::m_tlsStorage = diff --git a/Minecraft.World/Level/Storage/OldChunkStorage.h b/Minecraft.World/net/minecraft/world/level/chunk/storage/OldChunkStorage.h similarity index 91% rename from Minecraft.World/Level/Storage/OldChunkStorage.h rename to Minecraft.World/net/minecraft/world/level/chunk/storage/OldChunkStorage.h index c451d6ffd..67d19e2c1 100644 --- a/Minecraft.World/Level/Storage/OldChunkStorage.h +++ b/Minecraft.World/net/minecraft/world/level/chunk/storage/OldChunkStorage.h @@ -1,9 +1,9 @@ #pragma once #include "ChunkStorage.h" #include "../LevelChunk.h" -#include "../../IO/Files/File.h" -#include "../../IO/NBT/CompoundTag.h" -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../../../ConsoleJavaLibs/File.h" +#include "../../../../../../com/mojang/nbt/CompoundTag.h" +#include "../../../../../../com/mojang/nbt/com.mojang.nbt.h" #include class Level; diff --git a/Minecraft.World/Level/Storage/RegionFile.cpp b/Minecraft.World/net/minecraft/world/level/chunk/storage/RegionFile.cpp similarity index 98% rename from Minecraft.World/Level/Storage/RegionFile.cpp rename to Minecraft.World/net/minecraft/world/level/chunk/storage/RegionFile.cpp index 043bc1ec0..da27e6071 100644 --- a/Minecraft.World/Level/Storage/RegionFile.cpp +++ b/Minecraft.World/net/minecraft/world/level/chunk/storage/RegionFile.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../../Platform/System.h" -#include "../../IO/Streams/InputOutputStream.h" -#include "../../IO/Files/File.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../../../ConsoleJavaLibs/System.h" +#include "../../../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" +#include "../../../../../../ConsoleJavaLibs/File.h" #include "RegionFile.h" -#include "../../IO/Files/ConsoleSaveFile.h" +#include "../../../../../../ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFile.h" byteArray RegionFile::emptySector(SECTOR_BYTES); diff --git a/Minecraft.World/Level/Storage/RegionFile.h b/Minecraft.World/net/minecraft/world/level/chunk/storage/RegionFile.h similarity index 94% rename from Minecraft.World/Level/Storage/RegionFile.h rename to Minecraft.World/net/minecraft/world/level/chunk/storage/RegionFile.h index f22b2337a..619326b34 100644 --- a/Minecraft.World/Level/Storage/RegionFile.h +++ b/Minecraft.World/net/minecraft/world/level/chunk/storage/RegionFile.h @@ -1,6 +1,6 @@ #pragma once -#include "../../IO/Streams/Compression.h" -#include "../../IO/Streams/InputOutputStream.h" +#include "../../../../../../Header Files/compression.h" +#include "../../../../../../ConsoleJavaLibs/InputOutputStream/InputOutputStream.h" class FileEntry; class ConsoleSaveFile; diff --git a/Minecraft.World/Level/Storage/RegionFileCache.cpp b/Minecraft.World/net/minecraft/world/level/chunk/storage/RegionFileCache.cpp similarity index 94% rename from Minecraft.World/Level/Storage/RegionFileCache.cpp rename to Minecraft.World/net/minecraft/world/level/chunk/storage/RegionFileCache.cpp index 710302033..c9fbda872 100644 --- a/Minecraft.World/Level/Storage/RegionFileCache.cpp +++ b/Minecraft.World/net/minecraft/world/level/chunk/storage/RegionFileCache.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../IO/Files/File.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../../../ConsoleJavaLibs/File.h" #include "RegionFileCache.h" -#include "../../IO/Files/ConsoleSaveFileIO.h" +#include "../../../../../../ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileIO.h" RegionFileCache RegionFileCache::s_defaultCache; diff --git a/Minecraft.World/Level/Storage/RegionFileCache.h b/Minecraft.World/net/minecraft/world/level/chunk/storage/RegionFileCache.h similarity index 96% rename from Minecraft.World/Level/Storage/RegionFileCache.h rename to Minecraft.World/net/minecraft/world/level/chunk/storage/RegionFileCache.h index 3f29e132a..804667bc0 100644 --- a/Minecraft.World/Level/Storage/RegionFileCache.h +++ b/Minecraft.World/net/minecraft/world/level/chunk/storage/RegionFileCache.h @@ -1,7 +1,7 @@ #pragma once #include "RegionFile.h" -#include "../../Util/Reference.h" -#include "../../IO/Files/File.h" +#include "../../../../../../ConsoleJavaLibs/Reference.h" +#include "../../../../../../ConsoleJavaLibs/File.h" class RegionFileCache { friend class ConsoleSaveFileOriginal; diff --git a/Minecraft.World/Level/Storage/ZoneFile.cpp b/Minecraft.World/net/minecraft/world/level/chunk/storage/ZoneFile.cpp similarity index 94% rename from Minecraft.World/Level/Storage/ZoneFile.cpp rename to Minecraft.World/net/minecraft/world/level/chunk/storage/ZoneFile.cpp index b89fc2c49..d64964314 100644 --- a/Minecraft.World/Level/Storage/ZoneFile.cpp +++ b/Minecraft.World/net/minecraft/world/level/chunk/storage/ZoneFile.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../IO/Streams/ByteBuffer.h" -#include "../../IO/Files/File.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../../../ConsoleJavaLibs/ByteBuffer.h" +#include "../../../../../../ConsoleJavaLibs/File.h" #include "ZoneFile.h" namespace { diff --git a/Minecraft.World/Level/Storage/ZoneFile.h b/Minecraft.World/net/minecraft/world/level/chunk/storage/ZoneFile.h similarity index 91% rename from Minecraft.World/Level/Storage/ZoneFile.h rename to Minecraft.World/net/minecraft/world/level/chunk/storage/ZoneFile.h index 412b1508c..8f3f46b94 100644 --- a/Minecraft.World/Level/Storage/ZoneFile.h +++ b/Minecraft.World/net/minecraft/world/level/chunk/storage/ZoneFile.h @@ -2,8 +2,8 @@ #include #include "ZonedChunkStorage.h" -#include "../../IO/NBT/NbtSlotFile.h" -#include "ZoneIO.h" +#include "NbtSlotFile.h" +#include "ZoneIo.h" class ZoneFile { public: diff --git a/Minecraft.World/Level/Storage/ZoneIO.cpp b/Minecraft.World/net/minecraft/world/level/chunk/storage/ZoneIo.cpp similarity index 91% rename from Minecraft.World/Level/Storage/ZoneIO.cpp rename to Minecraft.World/net/minecraft/world/level/chunk/storage/ZoneIo.cpp index 2cdcdf3d7..6559faff4 100644 --- a/Minecraft.World/Level/Storage/ZoneIO.cpp +++ b/Minecraft.World/net/minecraft/world/level/chunk/storage/ZoneIo.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../IO/Streams/ByteBuffer.h" -#include "ZoneIO.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../../../ConsoleJavaLibs/ByteBuffer.h" +#include "ZoneIo.h" namespace { bool SeekFile(std::FILE* file, int64_t offset) { diff --git a/Minecraft.World/Level/Storage/ZoneIO.h b/Minecraft.World/net/minecraft/world/level/chunk/storage/ZoneIo.h similarity index 100% rename from Minecraft.World/Level/Storage/ZoneIO.h rename to Minecraft.World/net/minecraft/world/level/chunk/storage/ZoneIo.h diff --git a/Minecraft.World/Level/Storage/ZonedChunkStorage.cpp b/Minecraft.World/net/minecraft/world/level/chunk/storage/ZonedChunkStorage.cpp similarity index 95% rename from Minecraft.World/Level/Storage/ZonedChunkStorage.cpp rename to Minecraft.World/net/minecraft/world/level/chunk/storage/ZonedChunkStorage.cpp index 92b41eb56..230d472f7 100644 --- a/Minecraft.World/Level/Storage/ZonedChunkStorage.cpp +++ b/Minecraft.World/net/minecraft/world/level/chunk/storage/ZonedChunkStorage.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include -#include "../../IO/Files/File.h" -#include "../../IO/Streams/ByteBuffer.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Headers/net.minecraft.world.level.chunk.h" +#include "../../../../../../ConsoleJavaLibs/File.h" +#include "../../../../../../ConsoleJavaLibs/ByteBuffer.h" +#include "../../../entity/net.minecraft.world.entity.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../net.minecraft.world.level.chunk.h" #include "ZonedChunkStorage.h" #include "ZoneFile.h" diff --git a/Minecraft.World/Level/Storage/ZonedChunkStorage.h b/Minecraft.World/net/minecraft/world/level/chunk/storage/ZonedChunkStorage.h similarity index 95% rename from Minecraft.World/Level/Storage/ZonedChunkStorage.h rename to Minecraft.World/net/minecraft/world/level/chunk/storage/ZonedChunkStorage.h index 4cf3b0e34..b928af665 100644 --- a/Minecraft.World/Level/Storage/ZonedChunkStorage.h +++ b/Minecraft.World/net/minecraft/world/level/chunk/storage/ZonedChunkStorage.h @@ -1,5 +1,5 @@ #pragma once -#include "../../IO/Files/File.h" +#include "../../../../../../ConsoleJavaLibs/File.h" #include "ChunkStorage.h" #include "../LevelChunk.h" diff --git a/Minecraft.World/net/minecraft/world/level/chunk/storage/net.minecraft.world.level.chunk.storage.h b/Minecraft.World/net/minecraft/world/level/chunk/storage/net.minecraft.world.level.chunk.storage.h new file mode 100644 index 000000000..114264ecc --- /dev/null +++ b/Minecraft.World/net/minecraft/world/level/chunk/storage/net.minecraft.world.level.chunk.storage.h @@ -0,0 +1,13 @@ +#pragma once + +#include "ChunkStorage.h" +#include "ChunkStorageProfileDecorator.h" +#include "MemoryChunkStorage.h" +#include "McRegionChunkStorage.h" +#include "NbtSlotFile.h" +#include "OldChunkStorage.h" +#include "RegionFile.h" +#include "RegionFileCache.h" +#include "ZonedChunkStorage.h" +#include "ZoneFile.h" +#include "ZoneIo.h" \ No newline at end of file diff --git a/Minecraft.World/Level/Dimensions/Dimension.cpp b/Minecraft.World/net/minecraft/world/level/dimension/Dimension.cpp similarity index 91% rename from Minecraft.World/Level/Dimensions/Dimension.cpp rename to Minecraft.World/net/minecraft/world/level/dimension/Dimension.cpp index 881405671..179f11c43 100644 --- a/Minecraft.World/Level/Dimensions/Dimension.cpp +++ b/Minecraft.World/net/minecraft/world/level/dimension/Dimension.cpp @@ -1,18 +1,18 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.levelgen.flat.h" -#include "../../Headers/net.minecraft.world.level.levelgen.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.storage.h" +#include "../../../../../Header Files/stdafx.h" +#include "../levelgen/flat/net.minecraft.world.level.levelgen.flat.h" +#include "../levelgen/net.minecraft.world.level.levelgen.h" +#include "../net.minecraft.world.level.h" +#include "../storage/net.minecraft.world.level.storage.h" #include "Dimension.h" -#include "../../WorldGen/Biomes/BiomeSource.h" -#include "../../WorldGen/Biomes/FixedBiomeSource.h" -#include "../Storage/OldChunkStorage.h" +#include "../biome/BiomeSource.h" +#include "../biome/FixedBiomeSource.h" +#include "../chunk/storage/OldChunkStorage.h" #include "HellDimension.h" #include "NormalDimension.h" #include "TheEndDimension.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.Client/Minecraft.h" -#include "../../../Minecraft.Client/Platform/Common/Colours/ColourTable.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "../../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../../../Minecraft.Client/Common/Source Files/Colours/ColourTable.h" const float Dimension::MOON_BRIGHTNESS_PER_PHASE[8] = { 1.0f, 0.75f, 0.5f, 0.25f, 0, 0.25f, 0.5f, 0.75f}; diff --git a/Minecraft.World/Level/Dimensions/Dimension.h b/Minecraft.World/net/minecraft/world/level/dimension/Dimension.h similarity index 94% rename from Minecraft.World/Level/Dimensions/Dimension.h rename to Minecraft.World/net/minecraft/world/level/dimension/Dimension.h index 0aea9e38c..97f1f20cd 100644 --- a/Minecraft.World/Level/Dimensions/Dimension.h +++ b/Minecraft.World/net/minecraft/world/level/dimension/Dimension.h @@ -5,9 +5,9 @@ class ChunkStorage; class Level; class LevelType; -#include "../../Blocks/Material.h" -#include "../../Util/Vec3.h" -#include "../../Util/Pos.h" +#include "../material/Material.h" +#include "../../phys/Vec3.h" +#include "../../../Pos.h" class Dimension { public: diff --git a/Minecraft.World/Level/Dimensions/HellDimension.cpp b/Minecraft.World/net/minecraft/world/level/dimension/HellDimension.cpp similarity index 81% rename from Minecraft.World/Level/Dimensions/HellDimension.cpp rename to Minecraft.World/net/minecraft/world/level/dimension/HellDimension.cpp index 87d8ae155..538b247f5 100644 --- a/Minecraft.World/Level/Dimensions/HellDimension.cpp +++ b/Minecraft.World/net/minecraft/world/level/dimension/HellDimension.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.storage.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../storage/net.minecraft.world.level.storage.h" #include "HellDimension.h" -#include "../../Headers/net.minecraft.world.level.levelgen.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.Client/Minecraft.h" -#include "../../../Minecraft.Client/Platform/Common/Colours/ColourTable.h" +#include "../levelgen/net.minecraft.world.level.levelgen.h" +#include "../biome/net.minecraft.world.level.biome.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "../../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../../../Minecraft.Client/Common/Source Files/Colours/ColourTable.h" void HellDimension::init() { biomeSource = new FixedBiomeSource(Biome::hell, 1, 0); diff --git a/Minecraft.World/Level/Dimensions/HellDimension.h b/Minecraft.World/net/minecraft/world/level/dimension/HellDimension.h similarity index 100% rename from Minecraft.World/Level/Dimensions/HellDimension.h rename to Minecraft.World/net/minecraft/world/level/dimension/HellDimension.h diff --git a/Minecraft.World/Level/Dimensions/NormalDimension.h b/Minecraft.World/net/minecraft/world/level/dimension/NormalDimension.h similarity index 100% rename from Minecraft.World/Level/Dimensions/NormalDimension.h rename to Minecraft.World/net/minecraft/world/level/dimension/NormalDimension.h diff --git a/Minecraft.World/Level/Dimensions/TheEndDimension.cpp b/Minecraft.World/net/minecraft/world/level/dimension/TheEndDimension.cpp similarity index 80% rename from Minecraft.World/Level/Dimensions/TheEndDimension.cpp rename to Minecraft.World/net/minecraft/world/level/dimension/TheEndDimension.cpp index ed6bf28bf..0b8236a67 100644 --- a/Minecraft.World/Level/Dimensions/TheEndDimension.cpp +++ b/Minecraft.World/net/minecraft/world/level/dimension/TheEndDimension.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "TheEndDimension.h" -#include "../../WorldGen/Biomes/FixedBiomeSource.h" -#include "../../Headers/net.minecraft.world.level.levelgen.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../../Minecraft.Client/Minecraft.h" -#include "../../../Minecraft.Client/Platform/Common/Colours/ColourTable.h" +#include "../biome/FixedBiomeSource.h" +#include "../levelgen/net.minecraft.world.level.levelgen.h" +#include "../net.minecraft.world.level.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "../../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../../../Minecraft.Client/Common/Source Files/Colours/ColourTable.h" void TheEndDimension::init() { biomeSource = new FixedBiomeSource(Biome::sky, 0.5f, 0); diff --git a/Minecraft.World/Level/Dimensions/TheEndDimension.h b/Minecraft.World/net/minecraft/world/level/dimension/TheEndDimension.h similarity index 100% rename from Minecraft.World/Level/Dimensions/TheEndDimension.h rename to Minecraft.World/net/minecraft/world/level/dimension/TheEndDimension.h diff --git a/Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h b/Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h new file mode 100644 index 000000000..0c9f41c2a --- /dev/null +++ b/Minecraft.World/net/minecraft/world/level/dimension/net.minecraft.world.level.dimension.h @@ -0,0 +1,6 @@ +#pragma once + +#include "Dimension.h" +#include "HellDimension.h" +#include "NormalDimension.h" +#include "TheEndDimension.h" \ No newline at end of file diff --git a/Minecraft.World/WorldGen/Features/CanyonFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/CanyonFeature.cpp similarity index 96% rename from Minecraft.World/WorldGen/Features/CanyonFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/CanyonFeature.cpp index cd502aafb..ca1e67af2 100644 --- a/Minecraft.World/WorldGen/Features/CanyonFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/CanyonFeature.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" #include "CanyonFeature.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.biome.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "../biome/net.minecraft.world.level.biome.h" void CanyonFeature::addTunnel(int64_t seed, int xOffs, int zOffs, byteArray blocks, double xCave, double yCave, diff --git a/Minecraft.World/WorldGen/Features/CanyonFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/CanyonFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/CanyonFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/CanyonFeature.h diff --git a/Minecraft.World/Level/CustomLevelSource.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/CustomLevelSource.cpp similarity index 97% rename from Minecraft.World/Level/CustomLevelSource.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/CustomLevelSource.cpp index 7df8394ac..3f9a55b7f 100644 --- a/Minecraft.World/Level/CustomLevelSource.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/CustomLevelSource.cpp @@ -1,13 +1,13 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.biome.h" -#include "../Headers/net.minecraft.world.level.levelgen.h" -#include "../Headers/net.minecraft.world.level.levelgen.feature.h" -#include "../Headers/net.minecraft.world.level.levelgen.structure.h" -#include "../Headers/net.minecraft.world.level.levelgen.synth.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.storage.h" -#include "../Headers/net.minecraft.world.entity.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../biome/net.minecraft.world.level.biome.h" +#include "net.minecraft.world.level.levelgen.h" +#include "feature/net.minecraft.world.level.levelgen.feature.h" +#include "structure/net.minecraft.world.level.levelgen.structure.h" +#include "synth/net.minecraft.world.level.levelgen.synth.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "../storage/net.minecraft.world.level.storage.h" +#include "../../entity/net.minecraft.world.entity.h" #include "CustomLevelSource.h" const double CustomLevelSource::SNOW_SCALE = 0.3; diff --git a/Minecraft.World/Level/CustomLevelSource.h b/Minecraft.World/net/minecraft/world/level/levelgen/CustomLevelSource.h similarity index 98% rename from Minecraft.World/Level/CustomLevelSource.h rename to Minecraft.World/net/minecraft/world/level/levelgen/CustomLevelSource.h index 65a38fadf..226c0a0ca 100644 --- a/Minecraft.World/Level/CustomLevelSource.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/CustomLevelSource.h @@ -1,6 +1,6 @@ #pragma once -#include "ChunkSource.h" +#include "../chunk/ChunkSource.h" #ifndef _CONTENT_PACKAGE #define _OVERRIDE_HEIGHTMAP diff --git a/Minecraft.World/WorldGen/Features/DungeonFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/DungeonFeature.cpp similarity index 97% rename from Minecraft.World/WorldGen/Features/DungeonFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/DungeonFeature.cpp index e7f88585d..ce4e57587 100644 --- a/Minecraft.World/WorldGen/Features/DungeonFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/DungeonFeature.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" #include "DungeonFeature.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../tile/net.minecraft.world.level.tile.h" void DungeonFeature::addRoom(int xOffs, int zOffs, byteArray blocks, double xRoom, double yRoom, double zRoom) { diff --git a/Minecraft.World/WorldGen/Features/DungeonFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/DungeonFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/DungeonFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/DungeonFeature.h diff --git a/Minecraft.World/WorldGen/Sources/FlatLevelSource.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/FlatLevelSource.cpp similarity index 89% rename from Minecraft.World/WorldGen/Sources/FlatLevelSource.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/FlatLevelSource.cpp index 5b4f429b8..3fe83f6e7 100644 --- a/Minecraft.World/WorldGen/Sources/FlatLevelSource.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/FlatLevelSource.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.levelgen.h" -#include "../../Headers/net.minecraft.world.level.levelgen.feature.h" -#include "../../Headers/net.minecraft.world.level.levelgen.structure.h" -#include "../../Headers/net.minecraft.world.level.levelgen.synth.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.storage.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "net.minecraft.world.level.levelgen.h" +#include "feature/net.minecraft.world.level.levelgen.feature.h" +#include "structure/net.minecraft.world.level.levelgen.structure.h" +#include "synth/net.minecraft.world.level.levelgen.synth.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "../storage/net.minecraft.world.level.storage.h" #include "FlatLevelSource.h" // FlatLevelSource::villageFeature = new VillageFeature(1); diff --git a/Minecraft.World/WorldGen/Sources/FlatLevelSource.h b/Minecraft.World/net/minecraft/world/level/levelgen/FlatLevelSource.h similarity index 97% rename from Minecraft.World/WorldGen/Sources/FlatLevelSource.h rename to Minecraft.World/net/minecraft/world/level/levelgen/FlatLevelSource.h index 7c2bdb908..18773c802 100644 --- a/Minecraft.World/WorldGen/Sources/FlatLevelSource.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/FlatLevelSource.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Level/ChunkSource.h" +#include "../chunk/ChunkSource.h" class ProgressListener; class LargeFeature; diff --git a/Minecraft.World/WorldGen/Sources/HellFlatLevelSource.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/HellFlatLevelSource.cpp similarity index 97% rename from Minecraft.World/WorldGen/Sources/HellFlatLevelSource.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/HellFlatLevelSource.cpp index 9bec242f3..69dc6e181 100644 --- a/Minecraft.World/WorldGen/Sources/HellFlatLevelSource.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/HellFlatLevelSource.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.storage.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "../storage/net.minecraft.world.level.storage.h" #include "HellFlatLevelSource.h" HellFlatLevelSource::HellFlatLevelSource(Level* level, int64_t seed) { diff --git a/Minecraft.World/WorldGen/Sources/HellFlatLevelSource.h b/Minecraft.World/net/minecraft/world/level/levelgen/HellFlatLevelSource.h similarity index 76% rename from Minecraft.World/WorldGen/Sources/HellFlatLevelSource.h rename to Minecraft.World/net/minecraft/world/level/levelgen/HellFlatLevelSource.h index 1e19ca85c..af987c683 100644 --- a/Minecraft.World/WorldGen/Sources/HellFlatLevelSource.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/HellFlatLevelSource.h @@ -1,14 +1,14 @@ #pragma once -#include "../../Level/ChunkSource.h" -#include "../Noise/PerlinNoise.h" -#include "../Features/LargeFeature.h" -#include "../Features/LargeHellCaveFeature.h" -#include "../../Level/LevelChunk.h" -#include "../Features/HellFireFeature.h" -#include "../Features/LightGemFeature.h" -#include "../Features/HellPortalFeature.h" -#include "../Features/FlowerFeature.h" -#include "../Features/HellSpringFeature.h" +#include "../chunk/ChunkSource.h" +#include "synth/PerlinNoise.h" +#include "LargeFeature.h" +#include "LargeHellCaveFeature.h" +#include "../chunk/LevelChunk.h" +#include "feature/HellFireFeature.h" +#include "feature/LightGemFeature.h" +#include "feature/HellPortalFeature.h" +#include "feature/FlowerFeature.h" +#include "feature/HellSpringFeature.h" class ProgressListener; diff --git a/Minecraft.World/WorldGen/Sources/HellRandomLevelSource.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/HellRandomLevelSource.cpp similarity index 98% rename from Minecraft.World/WorldGen/Sources/HellRandomLevelSource.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/HellRandomLevelSource.cpp index 316b6a023..9e318477d 100644 --- a/Minecraft.World/WorldGen/Sources/HellRandomLevelSource.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/HellRandomLevelSource.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.levelgen.feature.h" -#include "../../Headers/net.minecraft.world.level.storage.h" -#include "../Biomes/BiomeSource.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "../../entity/net.minecraft.world.entity.h" +#include "feature/net.minecraft.world.level.levelgen.feature.h" +#include "../storage/net.minecraft.world.level.storage.h" +#include "../biome/BiomeSource.h" #include "HellRandomLevelSource.h" HellRandomLevelSource::HellRandomLevelSource(Level* level, int64_t seed) { diff --git a/Minecraft.World/WorldGen/Sources/HellRandomLevelSource.h b/Minecraft.World/net/minecraft/world/level/levelgen/HellRandomLevelSource.h similarity index 79% rename from Minecraft.World/WorldGen/Sources/HellRandomLevelSource.h rename to Minecraft.World/net/minecraft/world/level/levelgen/HellRandomLevelSource.h index a055ba0a0..5da7d9a0e 100644 --- a/Minecraft.World/WorldGen/Sources/HellRandomLevelSource.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/HellRandomLevelSource.h @@ -1,15 +1,15 @@ #pragma once -#include "../../Level/ChunkSource.h" -#include "../Noise/PerlinNoise.h" -#include "../Features/LargeFeature.h" -#include "../Features/LargeHellCaveFeature.h" -#include "../../Level/LevelChunk.h" -#include "../Features/HellFireFeature.h" -#include "../Features/LightGemFeature.h" -#include "../Features/HellPortalFeature.h" -#include "../Features/FlowerFeature.h" -#include "../Features/HellSpringFeature.h" -#include "../Features/NetherBridgeFeature.h" +#include "../chunk/ChunkSource.h" +#include "synth/PerlinNoise.h" +#include "LargeFeature.h" +#include "LargeHellCaveFeature.h" +#include "../chunk/LevelChunk.h" +#include "feature/HellFireFeature.h" +#include "feature/LightGemFeature.h" +#include "feature/HellPortalFeature.h" +#include "feature/FlowerFeature.h" +#include "feature/HellSpringFeature.h" +#include "structure/NetherBridgeFeature.h" class ProgressListener; diff --git a/Minecraft.World/WorldGen/Features/LargeCaveFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/LargeCaveFeature.cpp similarity index 97% rename from Minecraft.World/WorldGen/Features/LargeCaveFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/LargeCaveFeature.cpp index 8fccdf9d5..5b3edaa38 100644 --- a/Minecraft.World/WorldGen/Features/LargeCaveFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/LargeCaveFeature.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.biome.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "../biome/net.minecraft.world.level.biome.h" #include "LargeCaveFeature.h" void LargeCaveFeature::addRoom(int64_t seed, int xOffs, int zOffs, diff --git a/Minecraft.World/WorldGen/Features/LargeCaveFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/LargeCaveFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/LargeCaveFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/LargeCaveFeature.h diff --git a/Minecraft.World/WorldGen/Features/LargeFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/LargeFeature.cpp similarity index 90% rename from Minecraft.World/WorldGen/Features/LargeFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/LargeFeature.cpp index 2a129e31d..c3426d14e 100644 --- a/Minecraft.World/WorldGen/Features/LargeFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/LargeFeature.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" #include "LargeFeature.h" const std::wstring LargeFeature::STRONGHOLD = L"StrongHold"; diff --git a/Minecraft.World/WorldGen/Features/LargeFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/LargeFeature.h similarity index 93% rename from Minecraft.World/WorldGen/Features/LargeFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/LargeFeature.h index f48b26b24..cfdc16255 100644 --- a/Minecraft.World/WorldGen/Features/LargeFeature.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/LargeFeature.h @@ -1,5 +1,5 @@ #pragma once -#include "../../Level/ChunkSource.h" +#include "../chunk/ChunkSource.h" class Level; diff --git a/Minecraft.World/WorldGen/Features/LargeHellCaveFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/LargeHellCaveFeature.cpp similarity index 97% rename from Minecraft.World/WorldGen/Features/LargeHellCaveFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/LargeHellCaveFeature.cpp index 4078d9729..3fcd2f4d2 100644 --- a/Minecraft.World/WorldGen/Features/LargeHellCaveFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/LargeHellCaveFeature.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" #include "LargeHellCaveFeature.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../tile/net.minecraft.world.level.tile.h" void LargeHellCaveFeature::addRoom(int64_t seed, int xOffs, int zOffs, byteArray blocks, double xRoom, double yRoom, diff --git a/Minecraft.World/WorldGen/Features/LargeHellCaveFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/LargeHellCaveFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/LargeHellCaveFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/LargeHellCaveFeature.h diff --git a/Minecraft.World/Level/RandomLevelSource.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/RandomLevelSource.cpp similarity index 98% rename from Minecraft.World/Level/RandomLevelSource.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/RandomLevelSource.cpp index 85144a1a1..d1ee6b2f3 100644 --- a/Minecraft.World/Level/RandomLevelSource.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/RandomLevelSource.cpp @@ -1,13 +1,13 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.biome.h" -#include "../Headers/net.minecraft.world.level.levelgen.h" -#include "../Headers/net.minecraft.world.level.levelgen.feature.h" -#include "../Headers/net.minecraft.world.level.levelgen.structure.h" -#include "../Headers/net.minecraft.world.level.levelgen.synth.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.storage.h" -#include "../Headers/net.minecraft.world.entity.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../biome/net.minecraft.world.level.biome.h" +#include "net.minecraft.world.level.levelgen.h" +#include "feature/net.minecraft.world.level.levelgen.feature.h" +#include "structure/net.minecraft.world.level.levelgen.structure.h" +#include "synth/net.minecraft.world.level.levelgen.synth.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "../storage/net.minecraft.world.level.storage.h" +#include "../../entity/net.minecraft.world.entity.h" #include "RandomLevelSource.h" const double RandomLevelSource::SNOW_SCALE = 0.3; diff --git a/Minecraft.World/Level/RandomLevelSource.h b/Minecraft.World/net/minecraft/world/level/levelgen/RandomLevelSource.h similarity index 98% rename from Minecraft.World/Level/RandomLevelSource.h rename to Minecraft.World/net/minecraft/world/level/levelgen/RandomLevelSource.h index 9c23ab8dc..7373d96c0 100644 --- a/Minecraft.World/Level/RandomLevelSource.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/RandomLevelSource.h @@ -1,6 +1,6 @@ #pragma once -#include "ChunkSource.h" +#include "../chunk/ChunkSource.h" class ProgressListener; class LargeFeature; diff --git a/Minecraft.World/WorldGen/Sources/TheEndLevelRandomLevelSource.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/TheEndLevelRandomLevelSource.cpp similarity index 96% rename from Minecraft.World/WorldGen/Sources/TheEndLevelRandomLevelSource.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/TheEndLevelRandomLevelSource.cpp index 5170267bf..5a0c935f6 100644 --- a/Minecraft.World/WorldGen/Sources/TheEndLevelRandomLevelSource.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/TheEndLevelRandomLevelSource.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../../Headers/net.minecraft.world.level.levelgen.h" -#include "../../Headers/net.minecraft.world.level.levelgen.feature.h" -#include "../../Headers/net.minecraft.world.level.levelgen.structure.h" -#include "../../Headers/net.minecraft.world.level.levelgen.synth.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.storage.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../biome/net.minecraft.world.level.biome.h" +#include "net.minecraft.world.level.levelgen.h" +#include "feature/net.minecraft.world.level.levelgen.feature.h" +#include "structure/net.minecraft.world.level.levelgen.structure.h" +#include "synth/net.minecraft.world.level.levelgen.synth.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "../storage/net.minecraft.world.level.storage.h" #include "TheEndLevelRandomLevelSource.h" TheEndLevelRandomLevelSource::TheEndLevelRandomLevelSource(Level* level, diff --git a/Minecraft.World/WorldGen/Sources/TheEndLevelRandomLevelSource.h b/Minecraft.World/net/minecraft/world/level/levelgen/TheEndLevelRandomLevelSource.h similarity index 98% rename from Minecraft.World/WorldGen/Sources/TheEndLevelRandomLevelSource.h rename to Minecraft.World/net/minecraft/world/level/levelgen/TheEndLevelRandomLevelSource.h index 617b30a68..b154c8d75 100644 --- a/Minecraft.World/WorldGen/Sources/TheEndLevelRandomLevelSource.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/TheEndLevelRandomLevelSource.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Level/ChunkSource.h" +#include "../chunk/ChunkSource.h" class PerlinNoise; class TheEndLevelRandomLevelSource : public ChunkSource { diff --git a/Minecraft.World/WorldGen/Features/TownFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/TownFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/TownFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/TownFeature.h diff --git a/Minecraft.World/WorldGen/Features/BasicTreeFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/BasicTreeFeature.cpp similarity index 99% rename from Minecraft.World/WorldGen/Features/BasicTreeFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/BasicTreeFeature.cpp index 8dc6e212b..59e988dbb 100644 --- a/Minecraft.World/WorldGen/Features/BasicTreeFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/BasicTreeFeature.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" #include "BasicTreeFeature.h" uint8_t BasicTree::axisConversionArray[] = {2, 0, 0, 1, 2, 1}; diff --git a/Minecraft.World/WorldGen/Features/BasicTreeFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/BasicTreeFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/BasicTreeFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/BasicTreeFeature.h diff --git a/Minecraft.World/WorldGen/Features/BirchFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/BirchFeature.cpp similarity index 94% rename from Minecraft.World/WorldGen/Features/BirchFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/BirchFeature.cpp index 63dc21c46..0dc4c10ae 100644 --- a/Minecraft.World/WorldGen/Features/BirchFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/BirchFeature.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" #include "BirchFeature.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../tile/net.minecraft.world.level.tile.h" BirchFeature::BirchFeature(bool doUpdate) : Feature(doUpdate) {} diff --git a/Minecraft.World/WorldGen/Features/BirchFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/BirchFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/BirchFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/BirchFeature.h diff --git a/Minecraft.World/WorldGen/Features/BonusChestFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/BonusChestFeature.cpp similarity index 92% rename from Minecraft.World/WorldGen/Features/BonusChestFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/BonusChestFeature.cpp index 1e2b488c5..c105fb715 100644 --- a/Minecraft.World/WorldGen/Features/BonusChestFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/BonusChestFeature.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "BonusChestFeature.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Util/WeighedTreasure.h" -#include "../Structures/StructurePiece.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" +#include "../../tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../../util/WeighedTreasure.h" +#include "../structure/StructurePiece.h" BonusChestFeature::BonusChestFeature(WeighedTreasureArray treasureList, int numRolls) diff --git a/Minecraft.World/WorldGen/Features/BonusChestFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/BonusChestFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/BonusChestFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/BonusChestFeature.h diff --git a/Minecraft.World/WorldGen/Features/CactusFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/CactusFeature.cpp similarity index 83% rename from Minecraft.World/WorldGen/Features/CactusFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/CactusFeature.cpp index 62a97d1d5..57e0dcc3d 100644 --- a/Minecraft.World/WorldGen/Features/CactusFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/CactusFeature.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" #include "CactusFeature.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../tile/net.minecraft.world.level.tile.h" bool CactusFeature::place(Level* level, Random* random, int x, int y, int z) { for (int i = 0; i < 10; i++) { diff --git a/Minecraft.World/WorldGen/Features/CactusFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/CactusFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/CactusFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/CactusFeature.h diff --git a/Minecraft.World/WorldGen/Features/CaveFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/CaveFeature.cpp similarity index 96% rename from Minecraft.World/WorldGen/Features/CaveFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/CaveFeature.cpp index 006bc7a18..780c22c5e 100644 --- a/Minecraft.World/WorldGen/Features/CaveFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/CaveFeature.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "CaveFeature.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" bool CaveFeature::place(Level* level, Random* random, int x, int y, int z) { float dir = random->nextFloat() * PI; diff --git a/Minecraft.World/WorldGen/Features/CaveFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/CaveFeature.h similarity index 81% rename from Minecraft.World/WorldGen/Features/CaveFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/CaveFeature.h index f00c62352..f6577ec8c 100644 --- a/Minecraft.World/WorldGen/Features/CaveFeature.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/CaveFeature.h @@ -1,6 +1,6 @@ #pragma once #include "Feature.h" -#include "../../Blocks/Material.h" +#include "../../material/Material.h" class Level; diff --git a/Minecraft.World/WorldGen/Features/ClayFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/ClayFeature.cpp similarity index 80% rename from Minecraft.World/WorldGen/Features/ClayFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/ClayFeature.cpp index 06f643b30..e20b4dd77 100644 --- a/Minecraft.World/WorldGen/Features/ClayFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/ClayFeature.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.material.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../material/net.minecraft.world.level.material.h" #include "ClayFeature.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../tile/net.minecraft.world.level.tile.h" ClayFeature::ClayFeature(int radius) { this->tile = Tile::clay_Id; diff --git a/Minecraft.World/WorldGen/Features/ClayFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/ClayFeature.h similarity index 86% rename from Minecraft.World/WorldGen/Features/ClayFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/ClayFeature.h index 973657c8d..10c5f1b5a 100644 --- a/Minecraft.World/WorldGen/Features/ClayFeature.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/ClayFeature.h @@ -1,6 +1,6 @@ #pragma once #include "Feature.h" -#include "../../Blocks/Material.h" +#include "../../material/Material.h" class Level; diff --git a/Minecraft.World/WorldGen/Features/DeadBushFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/DeadBushFeature.cpp similarity index 84% rename from Minecraft.World/WorldGen/Features/DeadBushFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/DeadBushFeature.cpp index 4fbf97f56..a4261afa0 100644 --- a/Minecraft.World/WorldGen/Features/DeadBushFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/DeadBushFeature.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" #include "DeadBushFeature.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../tile/net.minecraft.world.level.tile.h" DeadBushFeature::DeadBushFeature(int tile) { this->tile = tile; } diff --git a/Minecraft.World/WorldGen/Features/DeadBushFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/DeadBushFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/DeadBushFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/DeadBushFeature.h diff --git a/Minecraft.World/WorldGen/Features/DesertWellFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/DesertWellFeature.cpp similarity index 95% rename from Minecraft.World/WorldGen/Features/DesertWellFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/DesertWellFeature.cpp index 16821ae19..149fbbdc5 100644 --- a/Minecraft.World/WorldGen/Features/DesertWellFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/DesertWellFeature.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" #include "DesertWellFeature.h" bool DesertWellFeature::place(Level* level, Random* random, int x, int y, diff --git a/Minecraft.World/WorldGen/Features/DesertWellFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/DesertWellFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/DesertWellFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/DesertWellFeature.h diff --git a/Minecraft.World/WorldGen/Features/EndPodiumFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/EndPodiumFeature.cpp similarity index 91% rename from Minecraft.World/WorldGen/Features/EndPodiumFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/EndPodiumFeature.cpp index 3c9a4bf34..a24590b2b 100644 --- a/Minecraft.World/WorldGen/Features/EndPodiumFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/EndPodiumFeature.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.entity.boss.enderdragon.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../../entity/boss/enderdragon/net.minecraft.world.entity.boss.enderdragon.h" +#include "../../tile/net.minecraft.world.level.tile.h" #include "EndPodiumFeature.h" EndPodiumFeature::EndPodiumFeature(int tile) { diff --git a/Minecraft.World/WorldGen/Features/EndPodiumFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/EndPodiumFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/EndPodiumFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/EndPodiumFeature.h diff --git a/Minecraft.World/WorldGen/Features/Feature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/Feature.cpp similarity index 81% rename from Minecraft.World/WorldGen/Features/Feature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/Feature.cpp index a6edfbe66..168966ef8 100644 --- a/Minecraft.World/WorldGen/Features/Feature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/Feature.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" #include "Feature.h" Feature::Feature() { this->doUpdate = false; } diff --git a/Minecraft.World/WorldGen/Features/Feature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/Feature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/Feature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/Feature.h diff --git a/Minecraft.World/WorldGen/Features/FlowerFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/FlowerFeature.cpp similarity index 86% rename from Minecraft.World/WorldGen/Features/FlowerFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/FlowerFeature.cpp index f59bcbd5b..358cc6651 100644 --- a/Minecraft.World/WorldGen/Features/FlowerFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/FlowerFeature.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.dimension.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../dimension/net.minecraft.world.level.dimension.h" #include "FlowerFeature.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../tile/net.minecraft.world.level.tile.h" FlowerFeature::FlowerFeature(int tile) { this->tile = tile; } diff --git a/Minecraft.World/WorldGen/Features/FlowerFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/FlowerFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/FlowerFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/FlowerFeature.h diff --git a/Minecraft.World/WorldGen/Features/GroundBushFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/GroundBushFeature.cpp similarity index 90% rename from Minecraft.World/WorldGen/Features/GroundBushFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/GroundBushFeature.cpp index 912fdb414..3452178c9 100644 --- a/Minecraft.World/WorldGen/Features/GroundBushFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/GroundBushFeature.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" #include "GroundBushFeature.h" GroundBushFeature::GroundBushFeature(int trunkType, int leafType) { diff --git a/Minecraft.World/WorldGen/Features/GroundBushFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/GroundBushFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/GroundBushFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/GroundBushFeature.h diff --git a/Minecraft.World/WorldGen/Features/HellFireFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/HellFireFeature.cpp similarity index 79% rename from Minecraft.World/WorldGen/Features/HellFireFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/HellFireFeature.cpp index 4af1e30e8..e4ae8155b 100644 --- a/Minecraft.World/WorldGen/Features/HellFireFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/HellFireFeature.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" #include "HellFireFeature.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../tile/net.minecraft.world.level.tile.h" bool HellFireFeature::place(Level* level, Random* random, int x, int y, int z) { for (int i = 0; i < 64; i++) { diff --git a/Minecraft.World/WorldGen/Features/HellFireFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/HellFireFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/HellFireFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/HellFireFeature.h diff --git a/Minecraft.World/WorldGen/Features/HellPortalFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/HellPortalFeature.cpp similarity index 89% rename from Minecraft.World/WorldGen/Features/HellPortalFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/HellPortalFeature.cpp index 9238b4f8d..f0f3bdd0b 100644 --- a/Minecraft.World/WorldGen/Features/HellPortalFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/HellPortalFeature.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" #include "HellPortalFeature.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../tile/net.minecraft.world.level.tile.h" bool HellPortalFeature::place(Level* level, Random* random, int x, int y, int z) { diff --git a/Minecraft.World/WorldGen/Features/HellPortalFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/HellPortalFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/HellPortalFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/HellPortalFeature.h diff --git a/Minecraft.World/WorldGen/Features/HellSpringFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/HellSpringFeature.cpp similarity index 90% rename from Minecraft.World/WorldGen/Features/HellSpringFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/HellSpringFeature.cpp index 2bae1dd4c..5b7164d17 100644 --- a/Minecraft.World/WorldGen/Features/HellSpringFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/HellSpringFeature.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" #include "HellSpringFeature.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../tile/net.minecraft.world.level.tile.h" HellSpringFeature::HellSpringFeature(int tile, bool insideRock) { this->tile = tile; diff --git a/Minecraft.World/WorldGen/Features/HellSpringFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/HellSpringFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/HellSpringFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/HellSpringFeature.h diff --git a/Minecraft.World/WorldGen/Features/HouseFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/HouseFeature.cpp similarity index 95% rename from Minecraft.World/WorldGen/Features/HouseFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/HouseFeature.cpp index 48e71c7fd..b91ec81c0 100644 --- a/Minecraft.World/WorldGen/Features/HouseFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/HouseFeature.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" #include "HouseFeature.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.item.h" +#include "../../tile/net.minecraft.world.level.tile.h" +#include "../../../entity/monster/net.minecraft.world.entity.monster.h" +#include "../../../item/net.minecraft.world.item.h" bool HouseFeature::place(Level* level, Random* random, int x, int y, int z) { while (y > 0 && !level->getMaterial(x, y - 1, z)->blocksMotion()) y--; diff --git a/Minecraft.World/WorldGen/Features/HouseFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/HouseFeature.h similarity index 81% rename from Minecraft.World/WorldGen/Features/HouseFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/HouseFeature.h index 1c9f9f36c..d16795b4e 100644 --- a/Minecraft.World/WorldGen/Features/HouseFeature.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/HouseFeature.h @@ -1,6 +1,6 @@ #pragma once #include "Feature.h" -#include "../../Blocks/Material.h" +#include "../../material/Material.h" class HouseFeature : public Feature { public: diff --git a/Minecraft.World/WorldGen/Features/HugeMushroomFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/HugeMushroomFeature.cpp similarity index 95% rename from Minecraft.World/WorldGen/Features/HugeMushroomFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/HugeMushroomFeature.cpp index fc7321ff4..7b9812533 100644 --- a/Minecraft.World/WorldGen/Features/HugeMushroomFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/HugeMushroomFeature.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "HugeMushroomFeature.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" HugeMushroomFeature::HugeMushroomFeature(int forcedType) : Feature(true) { this->forcedType = forcedType; diff --git a/Minecraft.World/WorldGen/Features/HugeMushroomFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/HugeMushroomFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/HugeMushroomFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/HugeMushroomFeature.h diff --git a/Minecraft.World/WorldGen/Features/LakeFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/LakeFeature.cpp similarity index 96% rename from Minecraft.World/WorldGen/Features/LakeFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/LakeFeature.cpp index 685aebda5..20c1c3495 100644 --- a/Minecraft.World/WorldGen/Features/LakeFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/LakeFeature.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "LakeFeature.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.biome.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" +#include "../../biome/net.minecraft.world.level.biome.h" LakeFeature::LakeFeature(int tile) { this->tile = tile; } diff --git a/Minecraft.World/WorldGen/Features/LakeFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/LakeFeature.h similarity index 84% rename from Minecraft.World/WorldGen/Features/LakeFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/LakeFeature.h index 197eea9e2..f466c2f3e 100644 --- a/Minecraft.World/WorldGen/Features/LakeFeature.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/LakeFeature.h @@ -1,6 +1,6 @@ #pragma once #include "Feature.h" -#include "../../Blocks/Material.h" +#include "../../material/Material.h" class LakeFeature : public Feature { private: diff --git a/Minecraft.World/WorldGen/Features/LightGemFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/LightGemFeature.cpp similarity index 89% rename from Minecraft.World/WorldGen/Features/LightGemFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/LightGemFeature.cpp index d8ee13904..b055bd456 100644 --- a/Minecraft.World/WorldGen/Features/LightGemFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/LightGemFeature.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" #include "LightGemFeature.h" bool LightGemFeature::place(Level* level, Random* random, int x, int y, int z) { diff --git a/Minecraft.World/WorldGen/Features/LightGemFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/LightGemFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/LightGemFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/LightGemFeature.h diff --git a/Minecraft.World/WorldGen/Features/MegaTreeFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/MegaTreeFeature.cpp similarity index 98% rename from Minecraft.World/WorldGen/Features/MegaTreeFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/MegaTreeFeature.cpp index 1dfaf4991..8e52bdfc1 100644 --- a/Minecraft.World/WorldGen/Features/MegaTreeFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/MegaTreeFeature.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" #include "MegaTreeFeature.h" MegaTreeFeature::MegaTreeFeature(bool doUpdate, int baseHeight, int trunkType, diff --git a/Minecraft.World/WorldGen/Features/MegaTreeFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/MegaTreeFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/MegaTreeFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/MegaTreeFeature.h diff --git a/Minecraft.World/WorldGen/Features/MonsterRoomFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/MonsterRoomFeature.cpp similarity index 93% rename from Minecraft.World/WorldGen/Features/MonsterRoomFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/MonsterRoomFeature.cpp index b6545c4db..876791016 100644 --- a/Minecraft.World/WorldGen/Features/MonsterRoomFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/MonsterRoomFeature.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.material.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Util/WeighedTreasure.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../material/net.minecraft.world.level.material.h" +#include "../../tile/net.minecraft.world.level.tile.h" +#include "../../tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../item/net.minecraft.world.item.h" +#include "../../../../util/WeighedTreasure.h" #include "MonsterRoomFeature.h" WeighedTreasure* MonsterRoomFeature::monsterRoomTreasure diff --git a/Minecraft.World/WorldGen/Features/MonsterRoomFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/MonsterRoomFeature.h similarity index 91% rename from Minecraft.World/WorldGen/Features/MonsterRoomFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/MonsterRoomFeature.h index 36488997c..2a796e519 100644 --- a/Minecraft.World/WorldGen/Features/MonsterRoomFeature.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/MonsterRoomFeature.h @@ -1,6 +1,6 @@ #pragma once #include "Feature.h" -#include "../../Blocks/Material.h" +#include "../../material/Material.h" class WeighedTreasure; diff --git a/Minecraft.World/WorldGen/Features/NetherSphereFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/NetherSphereFeature.cpp similarity index 90% rename from Minecraft.World/WorldGen/Features/NetherSphereFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/NetherSphereFeature.cpp index 3d855b923..e9bfc3da6 100644 --- a/Minecraft.World/WorldGen/Features/NetherSphereFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/NetherSphereFeature.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "NetherSphereFeature.h" NetherSphere::NetherSphere(Level* level) : Entity(level) { diff --git a/Minecraft.World/WorldGen/Features/NetherSphereFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/NetherSphereFeature.h similarity index 90% rename from Minecraft.World/WorldGen/Features/NetherSphereFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/NetherSphereFeature.h index c1b16a16b..95e116226 100644 --- a/Minecraft.World/WorldGen/Features/NetherSphereFeature.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/NetherSphereFeature.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Entities/Entity.h" +#include "../../../entity/Entity.h" class NetherSphere : public Entity { public: diff --git a/Minecraft.World/WorldGen/Features/OreFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/OreFeature.cpp similarity index 97% rename from Minecraft.World/WorldGen/Features/OreFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/OreFeature.cpp index d3fd028ac..d0d50f83e 100644 --- a/Minecraft.World/WorldGen/Features/OreFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/OreFeature.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" #include "OreFeature.h" void OreFeature::_init(int tile, int count, int targetTile) { diff --git a/Minecraft.World/WorldGen/Features/OreFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/OreFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/OreFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/OreFeature.h diff --git a/Minecraft.World/WorldGen/Features/PineFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/PineFeature.cpp similarity index 95% rename from Minecraft.World/WorldGen/Features/PineFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/PineFeature.cpp index fec11fc17..bf7309668 100644 --- a/Minecraft.World/WorldGen/Features/PineFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/PineFeature.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" #include "PineFeature.h" bool PineFeature::place(Level* level, Random* random, int x, int y, int z) { diff --git a/Minecraft.World/WorldGen/Features/PineFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/PineFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/PineFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/PineFeature.h diff --git a/Minecraft.World/WorldGen/Features/PumpkinFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/PumpkinFeature.cpp similarity index 82% rename from Minecraft.World/WorldGen/Features/PumpkinFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/PumpkinFeature.cpp index 905f2ded8..f15815371 100644 --- a/Minecraft.World/WorldGen/Features/PumpkinFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/PumpkinFeature.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" #include "PumpkinFeature.h" bool PumpkinFeature::place(Level* level, Random* random, int x, int y, int z) { diff --git a/Minecraft.World/WorldGen/Features/PumpkinFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/PumpkinFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/PumpkinFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/PumpkinFeature.h diff --git a/Minecraft.World/WorldGen/Features/ReedsFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/ReedsFeature.cpp similarity index 91% rename from Minecraft.World/WorldGen/Features/ReedsFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/ReedsFeature.cpp index 744953e03..a8846c391 100644 --- a/Minecraft.World/WorldGen/Features/ReedsFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/ReedsFeature.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" #include "ReedsFeature.h" bool ReedsFeature::place(Level* level, Random* random, int x, int y, int z) { diff --git a/Minecraft.World/WorldGen/Features/ReedsFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/ReedsFeature.h similarity index 81% rename from Minecraft.World/WorldGen/Features/ReedsFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/ReedsFeature.h index d49aafa35..ed720f58c 100644 --- a/Minecraft.World/WorldGen/Features/ReedsFeature.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/ReedsFeature.h @@ -1,6 +1,6 @@ #pragma once #include "Feature.h" -#include "../../Blocks/Material.h" +#include "../../material/Material.h" class ReedsFeature : public Feature { public: diff --git a/Minecraft.World/WorldGen/Features/SandFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/SandFeature.cpp similarity index 92% rename from Minecraft.World/WorldGen/Features/SandFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/SandFeature.cpp index 00e3df65d..75d21c35c 100644 --- a/Minecraft.World/WorldGen/Features/SandFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/SandFeature.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "SandFeature.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" SandFeature::SandFeature(int radius, int tile) { this->tile = tile; diff --git a/Minecraft.World/WorldGen/Features/SandFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/SandFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/SandFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/SandFeature.h diff --git a/Minecraft.World/WorldGen/Features/SpikeFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/SpikeFeature.cpp similarity index 95% rename from Minecraft.World/WorldGen/Features/SpikeFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/SpikeFeature.cpp index 69925079f..2a9213620 100644 --- a/Minecraft.World/WorldGen/Features/SpikeFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/SpikeFeature.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.entity.boss.enderdragon.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../../entity/boss/enderdragon/net.minecraft.world.entity.boss.enderdragon.h" +#include "../../tile/net.minecraft.world.level.tile.h" #include "SpikeFeature.h" SpikeFeature::SpikeFeature(int tile) { diff --git a/Minecraft.World/WorldGen/Features/SpikeFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/SpikeFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/SpikeFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/SpikeFeature.h diff --git a/Minecraft.World/WorldGen/Features/SpringFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/SpringFeature.cpp similarity index 92% rename from Minecraft.World/WorldGen/Features/SpringFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/SpringFeature.cpp index 34906fd7e..57ed3809d 100644 --- a/Minecraft.World/WorldGen/Features/SpringFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/SpringFeature.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" #include "SpringFeature.h" SpringFeature::SpringFeature(int tile) { this->tile = tile; } diff --git a/Minecraft.World/WorldGen/Features/SpringFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/SpringFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/SpringFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/SpringFeature.h diff --git a/Minecraft.World/WorldGen/Features/SpruceFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/SpruceFeature.cpp similarity index 95% rename from Minecraft.World/WorldGen/Features/SpruceFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/SpruceFeature.cpp index dba9aa12d..0aa4e531a 100644 --- a/Minecraft.World/WorldGen/Features/SpruceFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/SpruceFeature.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" #include "SpruceFeature.h" SpruceFeature::SpruceFeature(bool doUpdate) : Feature(doUpdate) {} diff --git a/Minecraft.World/WorldGen/Features/SpruceFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/SpruceFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/SpruceFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/SpruceFeature.h diff --git a/Minecraft.World/WorldGen/Features/SwampTreeFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/SwampTreeFeature.cpp similarity index 95% rename from Minecraft.World/WorldGen/Features/SwampTreeFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/SwampTreeFeature.cpp index 31f1c621d..483007727 100644 --- a/Minecraft.World/WorldGen/Features/SwampTreeFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/SwampTreeFeature.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "SwampTreeFeature.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Util/JavaMath.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" +#include "../../../../../../ConsoleJavaLibs/JavaMath.h" bool SwampTreeFeature::place(Level* level, Random* random, int x, int y, int z) { diff --git a/Minecraft.World/WorldGen/Features/SwampTreeFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/SwampTreeFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/SwampTreeFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/SwampTreeFeature.h diff --git a/Minecraft.World/WorldGen/Features/TallGrassFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/TallGrassFeature.cpp similarity index 85% rename from Minecraft.World/WorldGen/Features/TallGrassFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/TallGrassFeature.cpp index 1d848d5a5..7759847ee 100644 --- a/Minecraft.World/WorldGen/Features/TallGrassFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/TallGrassFeature.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" #include "TallGrassFeature.h" TallGrassFeature::TallGrassFeature(int tile, int type) { diff --git a/Minecraft.World/WorldGen/Features/TallGrassFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/TallGrassFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/TallGrassFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/TallGrassFeature.h diff --git a/Minecraft.World/WorldGen/Features/TreeFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/TreeFeature.cpp similarity index 98% rename from Minecraft.World/WorldGen/Features/TreeFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/TreeFeature.cpp index 13d3e8ecd..0f26410ee 100644 --- a/Minecraft.World/WorldGen/Features/TreeFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/TreeFeature.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" #include "TreeFeature.h" TreeFeature::TreeFeature(bool doUpdate) diff --git a/Minecraft.World/WorldGen/Features/TreeFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/TreeFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/TreeFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/TreeFeature.h diff --git a/Minecraft.World/WorldGen/Features/VinesFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/feature/VinesFeature.cpp similarity index 82% rename from Minecraft.World/WorldGen/Features/VinesFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/VinesFeature.cpp index 074c9e3f2..99b41cbe6 100644 --- a/Minecraft.World/WorldGen/Features/VinesFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/VinesFeature.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" +#include "../../../../net.minecraft.h" #include "VinesFeature.h" VinesFeature::VinesFeature() {} diff --git a/Minecraft.World/WorldGen/Features/VinesFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/VinesFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/VinesFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/feature/VinesFeature.h diff --git a/Minecraft.World/net/minecraft/world/level/levelgen/feature/net.minecraft.world.level.levelgen.feature.h b/Minecraft.World/net/minecraft/world/level/levelgen/feature/net.minecraft.world.level.levelgen.feature.h new file mode 100644 index 000000000..46dea209b --- /dev/null +++ b/Minecraft.World/net/minecraft/world/level/levelgen/feature/net.minecraft.world.level.levelgen.feature.h @@ -0,0 +1,37 @@ +#pragma once + +#include "BasicTreeFeature.h" +#include "BirchFeature.h" +#include "CactusFeature.h" +#include "CaveFeature.h" +#include "ClayFeature.h" +#include "DeadBushFeature.h" +#include "Feature.h" +#include "FlowerFeature.h" +#include "HellFireFeature.h" +#include "HellPortalFeature.h" +#include "HellSpringFeature.h" +#include "HouseFeature.h" +#include "LakeFeature.h" +#include "LightGemFeature.h" +#include "MonsterRoomFeature.h" +#include "OreFeature.h" +#include "PineFeature.h" +#include "PumpkinFeature.h" +#include "ReedsFeature.h" +#include "SpringFeature.h" +#include "SpruceFeature.h" +#include "TallGrassFeature.h" +#include "TreeFeature.h" + +#include "HugeMushroomFeature.h" +#include "SandFeature.h" +#include "SwampTreeFeature.h" +#include "BonusChestFeature.h" +#include "SpikeFeature.h" +#include "EndPodiumFeature.h" + +#include "DesertWellFeature.h" +#include "MegaTreeFeature.h" +#include "VinesFeature.h" +#include "GroundBushFeature.h" \ No newline at end of file diff --git a/Minecraft.World/WorldGen/Flat/FlatGeneratorInfo.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/flat/FlatGeneratorInfo.cpp similarity index 92% rename from Minecraft.World/WorldGen/Flat/FlatGeneratorInfo.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/flat/FlatGeneratorInfo.cpp index 9971645cc..419936550 100644 --- a/Minecraft.World/WorldGen/Flat/FlatGeneratorInfo.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/flat/FlatGeneratorInfo.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Util/StringHelpers.h" -#include "../../Headers/net.minecraft.world.level.levelgen.flat.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../../../ConsoleHelpers/StringHelpers.h" +#include "net.minecraft.world.level.levelgen.flat.h" +#include "../../tile/net.minecraft.world.level.tile.h" #include "FlatGeneratorInfo.h" const std::wstring FlatGeneratorInfo::STRUCTURE_VILLAGE = L"village"; diff --git a/Minecraft.World/WorldGen/Flat/FlatGeneratorInfo.h b/Minecraft.World/net/minecraft/world/level/levelgen/flat/FlatGeneratorInfo.h similarity index 100% rename from Minecraft.World/WorldGen/Flat/FlatGeneratorInfo.h rename to Minecraft.World/net/minecraft/world/level/levelgen/flat/FlatGeneratorInfo.h diff --git a/Minecraft.World/WorldGen/Flat/FlatLayerInfo.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/flat/FlatLayerInfo.cpp similarity index 95% rename from Minecraft.World/WorldGen/Flat/FlatLayerInfo.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/flat/FlatLayerInfo.cpp index 0cf9bda2e..756797d8a 100644 --- a/Minecraft.World/WorldGen/Flat/FlatLayerInfo.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/flat/FlatLayerInfo.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "FlatLayerInfo.h" diff --git a/Minecraft.World/WorldGen/Flat/FlatLayerInfo.h b/Minecraft.World/net/minecraft/world/level/levelgen/flat/FlatLayerInfo.h similarity index 100% rename from Minecraft.World/WorldGen/Flat/FlatLayerInfo.h rename to Minecraft.World/net/minecraft/world/level/levelgen/flat/FlatLayerInfo.h diff --git a/Minecraft.World/net/minecraft/world/level/levelgen/flat/net.minecraft.world.level.levelgen.flat.h b/Minecraft.World/net/minecraft/world/level/levelgen/flat/net.minecraft.world.level.levelgen.flat.h new file mode 100644 index 000000000..92b8023c6 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/level/levelgen/flat/net.minecraft.world.level.levelgen.flat.h @@ -0,0 +1,4 @@ +#pragma once + +#include "FlatGeneratorInfo.h" +#include "FlatLayerInfo.h" \ No newline at end of file diff --git a/Minecraft.World/net/minecraft/world/level/levelgen/net.minecraft.world.level.levelgen.h b/Minecraft.World/net/minecraft/world/level/levelgen/net.minecraft.world.level.levelgen.h new file mode 100644 index 000000000..ea17a33c2 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/level/levelgen/net.minecraft.world.level.levelgen.h @@ -0,0 +1,15 @@ +#pragma once + +#include "CanyonFeature.h" +#include "DungeonFeature.h" +#include "HellRandomLevelSource.h" +#include "HellFlatLevelSource.h" +#include "LargeCaveFeature.h" +#include "LargeFeature.h" +#include "LargeHellCaveFeature.h" +#include "RandomLevelSource.h" +#include "FlatLevelSource.h" +#include "TownFeature.h" +#include "TheEndLevelRandomLevelSource.h" + +#include "CustomLevelSource.h" \ No newline at end of file diff --git a/Minecraft.World/Level/BlockGenMethods.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/structure/BlockGenMethods.cpp similarity index 97% rename from Minecraft.World/Level/BlockGenMethods.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/BlockGenMethods.cpp index 4c47ecdfe..2f47b5aff 100644 --- a/Minecraft.World/Level/BlockGenMethods.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/BlockGenMethods.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../net.minecraft.h" +#include "../../net.minecraft.world.level.h" #include "BlockGenMethods.h" void BlockGenMethods::generateBox(Level* level, byteArray blocks, int sx, diff --git a/Minecraft.World/Level/BlockGenMethods.h b/Minecraft.World/net/minecraft/world/level/levelgen/structure/BlockGenMethods.h similarity index 94% rename from Minecraft.World/Level/BlockGenMethods.h rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/BlockGenMethods.h index 5d84207b8..2e62430dd 100644 --- a/Minecraft.World/Level/BlockGenMethods.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/BlockGenMethods.h @@ -1,7 +1,7 @@ #pragma once #include -#include "../Util/ArrayWithLength.h" +#include "../../../../../../ConsoleHelpers/ArrayWithLength.h" class BlockGenMethods { public: diff --git a/Minecraft.World/Util/BoundingBox.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/structure/BoundingBox.cpp similarity index 97% rename from Minecraft.World/Util/BoundingBox.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/BoundingBox.cpp index ebb442316..7a78a04ae 100644 --- a/Minecraft.World/Util/BoundingBox.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/BoundingBox.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "BoundingBox.h" -#include "Direction.h" -#include "JavaMath.h" +#include "../../../../Direction.h" +#include "../../../../../../ConsoleJavaLibs/JavaMath.h" BoundingBox::BoundingBox() { // 4J added initialisers diff --git a/Minecraft.World/Util/BoundingBox.h b/Minecraft.World/net/minecraft/world/level/levelgen/structure/BoundingBox.h similarity index 94% rename from Minecraft.World/Util/BoundingBox.h rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/BoundingBox.h index 11ba91ddf..9d57f09f0 100644 --- a/Minecraft.World/Util/BoundingBox.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/BoundingBox.h @@ -1,6 +1,6 @@ #pragma once -#include "ArrayWithLength.h" +#include "../../../../../../ConsoleHelpers/ArrayWithLength.h" class BoundingBox { public: diff --git a/Minecraft.World/WorldGen/Features/MineShaftFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/structure/MineShaftFeature.cpp similarity index 85% rename from Minecraft.World/WorldGen/Features/MineShaftFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/MineShaftFeature.cpp index 74a3c9c5f..595ec0e45 100644 --- a/Minecraft.World/WorldGen/Features/MineShaftFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/MineShaftFeature.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.levelgen.structure.h" -#include "../../Util/JavaMath.h" -#include "../../Util/Mth.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.levelgen.structure.h" +#include "../../../../../../ConsoleJavaLibs/JavaMath.h" +#include "../../../../util/Mth.h" const std::wstring MineShaftFeature::OPTION_CHANCE = L"chance"; diff --git a/Minecraft.World/WorldGen/Features/MineShaftFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/structure/MineShaftFeature.h similarity index 100% rename from Minecraft.World/WorldGen/Features/MineShaftFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/MineShaftFeature.h diff --git a/Minecraft.World/WorldGen/Structures/MineShaftPieces.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/structure/MineShaftPieces.cpp similarity index 98% rename from Minecraft.World/WorldGen/Structures/MineShaftPieces.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/MineShaftPieces.cpp index 216958a2c..37b947ca0 100644 --- a/Minecraft.World/WorldGen/Structures/MineShaftPieces.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/MineShaftPieces.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.item.h" -#include "../../Headers/net.minecraft.world.level.levelgen.structure.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Util/JavaMath.h" -#include "../../Util/WeighedTreasure.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../entity/item/net.minecraft.world.entity.item.h" +#include "net.minecraft.world.level.levelgen.structure.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" +#include "../../tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../item/net.minecraft.world.item.h" +#include "../../../../../../ConsoleJavaLibs/JavaMath.h" +#include "../../../../util/WeighedTreasure.h" #include "MineShaftPieces.h" WeighedTreasureArray MineShaftPieces::smallTreasureItems; diff --git a/Minecraft.World/WorldGen/Structures/MineShaftPieces.h b/Minecraft.World/net/minecraft/world/level/levelgen/structure/MineShaftPieces.h similarity index 100% rename from Minecraft.World/WorldGen/Structures/MineShaftPieces.h rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/MineShaftPieces.h diff --git a/Minecraft.World/WorldGen/Structures/MineShaftStart.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/structure/MineShaftStart.cpp similarity index 84% rename from Minecraft.World/WorldGen/Structures/MineShaftStart.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/MineShaftStart.cpp index 465a30804..eadba49dc 100644 --- a/Minecraft.World/WorldGen/Structures/MineShaftStart.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/MineShaftStart.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.levelgen.structure.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.levelgen.structure.h" MineShaftStart::MineShaftStart() { // for reflection diff --git a/Minecraft.World/WorldGen/Structures/MineShaftStart.h b/Minecraft.World/net/minecraft/world/level/levelgen/structure/MineShaftStart.h similarity index 100% rename from Minecraft.World/WorldGen/Structures/MineShaftStart.h rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/MineShaftStart.h diff --git a/Minecraft.World/WorldGen/Features/NetherBridgeFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/structure/NetherBridgeFeature.cpp similarity index 92% rename from Minecraft.World/WorldGen/Features/NetherBridgeFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/NetherBridgeFeature.cpp index ceeff64de..8edcf49b1 100644 --- a/Minecraft.World/WorldGen/Features/NetherBridgeFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/NetherBridgeFeature.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" -#include "../Biomes/Biome.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../biome/Biome.h" #include "NetherBridgeFeature.h" -#include "../Structures/NetherBridgePieces.h" -#include "../../Blocks/MobSpawner.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.dimension.h" +#include "NetherBridgePieces.h" +#include "../../MobSpawner.h" +#include "../../../entity/monster/net.minecraft.world.entity.monster.h" +#include "../../net.minecraft.world.level.h" +#include "../../dimension/net.minecraft.world.level.dimension.h" NetherBridgeFeature::NetherBridgeFeature() : StructureFeature() { bridgeEnemies.push_back(new Biome::MobSpawnerData(eTYPE_BLAZE, 10, 2, 3)); diff --git a/Minecraft.World/WorldGen/Features/NetherBridgeFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/structure/NetherBridgeFeature.h similarity index 93% rename from Minecraft.World/WorldGen/Features/NetherBridgeFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/NetherBridgeFeature.h index 560c74b19..25956a2b9 100644 --- a/Minecraft.World/WorldGen/Features/NetherBridgeFeature.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/NetherBridgeFeature.h @@ -1,7 +1,7 @@ #pragma once #include "StructureFeature.h" -#include "../Structures/StructureStart.h" -#include "../Biomes/Biome.h" +#include "StructureStart.h" +#include "../../biome/Biome.h" class Random; class NetherBridgeFeature : public StructureFeature { diff --git a/Minecraft.World/WorldGen/Structures/NetherBridgePieces.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/structure/NetherBridgePieces.cpp similarity index 99% rename from Minecraft.World/WorldGen/Structures/NetherBridgePieces.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/NetherBridgePieces.cpp index 47e003124..e57a4dd3d 100644 --- a/Minecraft.World/WorldGen/Structures/NetherBridgePieces.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/NetherBridgePieces.cpp @@ -1,14 +1,14 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Headers/net.minecraft.world.level.levelgen.h" -#include "../../Headers/net.minecraft.world.level.storage.h" -#include "../../Headers/net.minecraft.world.level.levelgen.structure.h" -#include "../../Util/WeighedTreasure.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../item/net.minecraft.world.item.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" +#include "../../tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../net.minecraft.world.level.levelgen.h" +#include "../../storage/net.minecraft.world.level.storage.h" +#include "net.minecraft.world.level.levelgen.structure.h" +#include "../../../../util/WeighedTreasure.h" #include "NetherBridgePieces.h" -#include "../../Util/Direction.h" +#include "../../../../Direction.h" void NetherBridgePieces::loadStatic() { StructureFeatureIO::setPieceId(eStructurePiece_BridgeCrossing, diff --git a/Minecraft.World/WorldGen/Structures/NetherBridgePieces.h b/Minecraft.World/net/minecraft/world/level/levelgen/structure/NetherBridgePieces.h similarity index 100% rename from Minecraft.World/WorldGen/Structures/NetherBridgePieces.h rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/NetherBridgePieces.h diff --git a/Minecraft.World/WorldGen/Features/RandomScatteredLargeFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/structure/RandomScatteredLargeFeature.cpp similarity index 94% rename from Minecraft.World/WorldGen/Features/RandomScatteredLargeFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/RandomScatteredLargeFeature.cpp index e8e9c7d2a..2cd240be8 100644 --- a/Minecraft.World/WorldGen/Features/RandomScatteredLargeFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/RandomScatteredLargeFeature.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../../Headers/net.minecraft.world.level.levelgen.structure.h" -#include "../Structures/ScatteredFeaturePieces.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../../biome/net.minecraft.world.level.biome.h" +#include "net.minecraft.world.level.levelgen.structure.h" +#include "ScatteredFeaturePieces.h" #include "RandomScatteredLargeFeature.h" const std::wstring RandomScatteredLargeFeature::OPTION_SPACING = L"distance"; diff --git a/Minecraft.World/WorldGen/Features/RandomScatteredLargeFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/structure/RandomScatteredLargeFeature.h similarity index 96% rename from Minecraft.World/WorldGen/Features/RandomScatteredLargeFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/RandomScatteredLargeFeature.h index 565d9763d..41f07fec0 100644 --- a/Minecraft.World/WorldGen/Features/RandomScatteredLargeFeature.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/RandomScatteredLargeFeature.h @@ -1,7 +1,7 @@ #pragma once #include "StructureFeature.h" -#include "../Structures/StructureStart.h" +#include "StructureStart.h" class RandomScatteredLargeFeature : public StructureFeature { public: diff --git a/Minecraft.World/WorldGen/Structures/ScatteredFeaturePieces.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/structure/ScatteredFeaturePieces.cpp similarity index 98% rename from Minecraft.World/WorldGen/Structures/ScatteredFeaturePieces.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/ScatteredFeaturePieces.cpp index aea34d0cd..5bdced3dc 100644 --- a/Minecraft.World/WorldGen/Structures/ScatteredFeaturePieces.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/ScatteredFeaturePieces.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.h" -#include "../../Headers/net.minecraft.world.entity.monster.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.level.dimension.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.levelgen.structure.h" -#include "../../Util/WeighedTreasure.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../net.minecraft.h" +#include "../../../entity/monster/net.minecraft.world.entity.monster.h" +#include "../../../item/net.minecraft.world.item.h" +#include "../../dimension/net.minecraft.world.level.dimension.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.levelgen.structure.h" +#include "../../../../util/WeighedTreasure.h" #include "ScatteredFeaturePieces.h" void ScatteredFeaturePieces::loadStatic() { diff --git a/Minecraft.World/WorldGen/Structures/ScatteredFeaturePieces.h b/Minecraft.World/net/minecraft/world/level/levelgen/structure/ScatteredFeaturePieces.h similarity index 100% rename from Minecraft.World/WorldGen/Structures/ScatteredFeaturePieces.h rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/ScatteredFeaturePieces.h diff --git a/Minecraft.World/Level/Dimensions/SkyIslandDimension.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/structure/SkyIslandDimension.cpp similarity index 82% rename from Minecraft.World/Level/Dimensions/SkyIslandDimension.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/SkyIslandDimension.cpp index 56b7d1b76..fe3ac136c 100644 --- a/Minecraft.World/Level/Dimensions/SkyIslandDimension.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/SkyIslandDimension.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "SkyIslandDimension.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.levelgen.h" +#include "../../net.minecraft.world.level.h" +#include "../../biome/net.minecraft.world.level.biome.h" +#include "../../tile/net.minecraft.world.level.tile.h" +#include "../net.minecraft.world.level.levelgen.h" void SkyIslandDimension::init() { biomeSource = new FixedBiomeSource(Biome::sky, 0.5f, 0); diff --git a/Minecraft.World/WorldGen/Features/StrongholdFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StrongholdFeature.cpp similarity index 95% rename from Minecraft.World/WorldGen/Features/StrongholdFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/StrongholdFeature.cpp index 29ec6c3a9..23060c63d 100644 --- a/Minecraft.World/WorldGen/Features/StrongholdFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StrongholdFeature.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "StrongholdFeature.h" -#include "../Structures/StrongholdPieces.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../../Headers/net.minecraft.world.level.dimension.h" -#include "../../Util/Mth.h" -#include "../../IO/Files/FileHeader.h" -#include "../../Util/JavaMath.h" +#include "StrongholdPieces.h" +#include "../../net.minecraft.world.level.h" +#include "../../biome/net.minecraft.world.level.biome.h" +#include "../../dimension/net.minecraft.world.level.dimension.h" +#include "../../../../util/Mth.h" +#include "../../../../../../ConsoleHelpers/ConsoleSaveFileIO/FileHeader.h" +#include "../../../../../../ConsoleJavaLibs/JavaMath.h" const std::wstring StrongholdFeature::OPTION_DISTANCE = L"distance"; const std::wstring StrongholdFeature::OPTION_COUNT = L"count"; diff --git a/Minecraft.World/WorldGen/Features/StrongholdFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StrongholdFeature.h similarity index 95% rename from Minecraft.World/WorldGen/Features/StrongholdFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/StrongholdFeature.h index 7c2114572..83847734f 100644 --- a/Minecraft.World/WorldGen/Features/StrongholdFeature.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StrongholdFeature.h @@ -3,9 +3,9 @@ class Biome; #include "StructureFeature.h" -#include "../Structures/StructureStart.h" +#include "StructureStart.h" -#include "../../Level/ChunkPos.h" +#include "../../ChunkPos.h" // 4J Stu Added // We can get away with a few more attempts on new-gen consoles diff --git a/Minecraft.World/WorldGen/Structures/StrongholdPieces.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StrongholdPieces.cpp similarity index 99% rename from Minecraft.World/WorldGen/Structures/StrongholdPieces.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/StrongholdPieces.cpp index dd35a16d8..0807bc1c3 100644 --- a/Minecraft.World/WorldGen/Structures/StrongholdPieces.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StrongholdPieces.cpp @@ -1,15 +1,15 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "StrongholdPieces.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Headers/net.minecraft.world.level.storage.h" -#include "../../Headers/net.minecraft.world.level.levelgen.h" -#include "../../Headers/net.minecraft.world.level.levelgen.structure.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Util/WeighedTreasure.h" -#include "../../IO/Files/FileHeader.h" -#include "../../Util/Facing.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" +#include "../../tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../storage/net.minecraft.world.level.storage.h" +#include "../net.minecraft.world.level.levelgen.h" +#include "net.minecraft.world.level.levelgen.structure.h" +#include "../../../item/net.minecraft.world.item.h" +#include "../../../../util/WeighedTreasure.h" +#include "../../../../../../ConsoleHelpers/ConsoleSaveFileIO/FileHeader.h" +#include "../../../../Facing.h" int StrongholdPieces::totalWeight = 0; std::list StrongholdPieces::currentPieces; diff --git a/Minecraft.World/WorldGen/Structures/StrongholdPieces.h b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StrongholdPieces.h similarity index 100% rename from Minecraft.World/WorldGen/Structures/StrongholdPieces.h rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/StrongholdPieces.h diff --git a/Minecraft.World/WorldGen/Features/StructureFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureFeature.cpp similarity index 97% rename from Minecraft.World/WorldGen/Features/StructureFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureFeature.cpp index 749990f5b..87a5be4e0 100644 --- a/Minecraft.World/WorldGen/Features/StructureFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureFeature.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "StructureFeature.h" -#include "../Structures/StructureStart.h" -#include "../Structures/StructurePiece.h" -#include "../../Level/ChunkPos.h" -#include "../../Util/BoundingBox.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Level/LevelData.h" +#include "StructureStart.h" +#include "StructurePiece.h" +#include "../../ChunkPos.h" +#include "BoundingBox.h" +#include "../../net.minecraft.world.level.h" +#include "../../storage/LevelData.h" StructureFeature::StructureFeature() { #ifdef ENABLE_STRUCTURE_SAVING diff --git a/Minecraft.World/WorldGen/Features/StructureFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureFeature.h similarity index 96% rename from Minecraft.World/WorldGen/Features/StructureFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureFeature.h index c00efbd20..3ad27f63b 100644 --- a/Minecraft.World/WorldGen/Features/StructureFeature.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureFeature.h @@ -1,6 +1,6 @@ #pragma once -#include "LargeFeature.h" -#include "../StructureFeatureSavedData.h" +#include "../LargeFeature.h" +#include "StructureFeatureSavedData.h" class StructureStart; diff --git a/Minecraft.World/WorldGen/StructureFeatureIO.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureFeatureIO.cpp similarity index 96% rename from Minecraft.World/WorldGen/StructureFeatureIO.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureFeatureIO.cpp index 7a35abb98..f303546d7 100644 --- a/Minecraft.World/WorldGen/StructureFeatureIO.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureFeatureIO.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.levelgen.structure.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.levelgen.structure.h" #include "StructureFeatureIO.h" std::unordered_map diff --git a/Minecraft.World/WorldGen/StructureFeatureIO.h b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureFeatureIO.h similarity index 100% rename from Minecraft.World/WorldGen/StructureFeatureIO.h rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureFeatureIO.h diff --git a/Minecraft.World/WorldGen/StructureFeatureSavedData.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureFeatureSavedData.cpp similarity index 96% rename from Minecraft.World/WorldGen/StructureFeatureSavedData.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureFeatureSavedData.cpp index 32d3b10fd..e4b657c20 100644 --- a/Minecraft.World/WorldGen/StructureFeatureSavedData.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureFeatureSavedData.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "StructureFeatureSavedData.h" diff --git a/Minecraft.World/WorldGen/StructureFeatureSavedData.h b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureFeatureSavedData.h similarity index 92% rename from Minecraft.World/WorldGen/StructureFeatureSavedData.h rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureFeatureSavedData.h index 6dec5e561..595e1c5dd 100644 --- a/Minecraft.World/WorldGen/StructureFeatureSavedData.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureFeatureSavedData.h @@ -1,6 +1,6 @@ #pragma once -#include "../Level/Storage/SavedData.h" +#include "../../saveddata/SavedData.h" class StructureFeatureSavedData : public SavedData { private: diff --git a/Minecraft.World/WorldGen/Structures/StructurePiece.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StructurePiece.cpp similarity index 97% rename from Minecraft.World/WorldGen/Structures/StructurePiece.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/StructurePiece.cpp index e8bc97499..ed90d75ac 100644 --- a/Minecraft.World/WorldGen/Structures/StructurePiece.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StructurePiece.cpp @@ -1,17 +1,17 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.levelgen.structure.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.material.h" -#include "../../Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Util/WeighedTreasure.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.levelgen.structure.h" +#include "../../net.minecraft.world.level.h" +#include "../../tile/net.minecraft.world.level.tile.h" +#include "../../material/net.minecraft.world.level.material.h" +#include "../../tile/entity/net.minecraft.world.level.tile.entity.h" +#include "../../../entity/net.minecraft.world.entity.h" +#include "../../../../util/WeighedTreasure.h" #include "StructurePiece.h" -#include "../../Util/BoundingBox.h" -#include "../../Util/Direction.h" -#include "../../Util/JavaMath.h" -#include "../../Util/Facing.h" -#include "../../Items/DoorItem.h" +#include "BoundingBox.h" +#include "../../../../Direction.h" +#include "../../../../../../ConsoleJavaLibs/JavaMath.h" +#include "../../../../Facing.h" +#include "../../../item/DoorItem.h" /** * diff --git a/Minecraft.World/WorldGen/Structures/StructurePiece.h b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StructurePiece.h similarity index 98% rename from Minecraft.World/WorldGen/Structures/StructurePiece.h rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/StructurePiece.h index 100919a17..f571d9d78 100644 --- a/Minecraft.World/WorldGen/Structures/StructurePiece.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StructurePiece.h @@ -1,7 +1,7 @@ #pragma once -#include "../../Util/WeighedRandom.h" -#include "../../Util/BoundingBox.h" -#include "../StructureFeatureIO.h" +#include "../../../../util/WeighedRandom.h" +#include "BoundingBox.h" +#include "StructureFeatureIO.h" class Level; class Random; diff --git a/Minecraft.World/WorldGen/Structures/StructureStart.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureStart.cpp similarity index 95% rename from Minecraft.World/WorldGen/Structures/StructureStart.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureStart.cpp index 17457f0e7..099733c0e 100644 --- a/Minecraft.World/WorldGen/Structures/StructureStart.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureStart.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.levelgen.structure.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "net.minecraft.world.level.levelgen.structure.h" #include "StructureStart.h" #include "StructurePiece.h" -#include "../../Util/BoundingBox.h" +#include "BoundingBox.h" StructureStart::StructureStart() { chunkX = chunkZ = 0; diff --git a/Minecraft.World/WorldGen/Structures/StructureStart.h b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureStart.h similarity index 96% rename from Minecraft.World/WorldGen/Structures/StructureStart.h rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureStart.h index 11e682228..e2f9baf56 100644 --- a/Minecraft.World/WorldGen/Structures/StructureStart.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/StructureStart.h @@ -2,7 +2,7 @@ class StructurePiece; class BoundingBox; -#include "../StructureFeatureIO.h" +#include "StructureFeatureIO.h" class StructureStart { public: diff --git a/Minecraft.World/WorldGen/Features/VillageFeature.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/structure/VillageFeature.cpp similarity index 95% rename from Minecraft.World/WorldGen/Features/VillageFeature.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/VillageFeature.cpp index 1bb95f735..18303d3a7 100644 --- a/Minecraft.World/WorldGen/Features/VillageFeature.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/VillageFeature.cpp @@ -1,9 +1,9 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "VillageFeature.h" -#include "../Structures/VillagePieces.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../../Headers/net.minecraft.world.level.dimension.h" +#include "VillagePieces.h" +#include "../../net.minecraft.world.level.h" +#include "../../biome/net.minecraft.world.level.biome.h" +#include "../../dimension/net.minecraft.world.level.dimension.h" const std::wstring VillageFeature::OPTION_SIZE_MODIFIER = L"size"; const std::wstring VillageFeature::OPTION_SPACING = L"distance"; diff --git a/Minecraft.World/WorldGen/Features/VillageFeature.h b/Minecraft.World/net/minecraft/world/level/levelgen/structure/VillageFeature.h similarity index 97% rename from Minecraft.World/WorldGen/Features/VillageFeature.h rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/VillageFeature.h index 97b21a781..a89bf7ef4 100644 --- a/Minecraft.World/WorldGen/Features/VillageFeature.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/VillageFeature.h @@ -1,6 +1,6 @@ #pragma once #include "StructureFeature.h" -#include "../Structures/StructureStart.h" +#include "StructureStart.h" class Biome; class VillageFeature : public StructureFeature { diff --git a/Minecraft.World/WorldGen/Structures/VillagePieces.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/structure/VillagePieces.cpp similarity index 99% rename from Minecraft.World/WorldGen/Structures/VillagePieces.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/VillagePieces.cpp index 2b9f3dcaa..3ab843dbb 100644 --- a/Minecraft.World/WorldGen/Structures/VillagePieces.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/VillagePieces.cpp @@ -1,19 +1,19 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.storage.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.levelgen.h" -#include "../../Headers/net.minecraft.world.level.levelgen.structure.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.level.dimension.h" -#include "../../Headers/net.minecraft.world.entity.npc.h" -#include "../../Util/WeighedTreasure.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../net.minecraft.h" +#include "../../net.minecraft.world.level.h" +#include "../../storage/net.minecraft.world.level.storage.h" +#include "../../tile/net.minecraft.world.level.tile.h" +#include "../net.minecraft.world.level.levelgen.h" +#include "net.minecraft.world.level.levelgen.structure.h" +#include "../../../item/net.minecraft.world.item.h" +#include "../../dimension/net.minecraft.world.level.dimension.h" +#include "../../../entity/npc/net.minecraft.world.entity.npc.h" +#include "../../../../util/WeighedTreasure.h" #include "VillagePieces.h" -#include "../Features/VillageFeature.h" -#include "../../Util/Direction.h" -#include "../../Util/JavaMath.h" -#include "../Biomes/BiomeSource.h" +#include "VillageFeature.h" +#include "../../../../Direction.h" +#include "../../../../../../ConsoleJavaLibs/JavaMath.h" +#include "../../biome/BiomeSource.h" WeighedTreasureArray VillagePieces::Smithy::treasureItems; diff --git a/Minecraft.World/WorldGen/Structures/VillagePieces.h b/Minecraft.World/net/minecraft/world/level/levelgen/structure/VillagePieces.h similarity index 100% rename from Minecraft.World/WorldGen/Structures/VillagePieces.h rename to Minecraft.World/net/minecraft/world/level/levelgen/structure/VillagePieces.h diff --git a/Minecraft.World/net/minecraft/world/level/levelgen/structure/net.minecraft.world.level.levelgen.structure.h b/Minecraft.World/net/minecraft/world/level/levelgen/structure/net.minecraft.world.level.levelgen.structure.h new file mode 100644 index 000000000..e7dae5ead --- /dev/null +++ b/Minecraft.World/net/minecraft/world/level/levelgen/structure/net.minecraft.world.level.levelgen.structure.h @@ -0,0 +1,20 @@ +#pragma once + +#include "BlockGenMethods.h" +#include "BoundingBox.h" +#include "MineShaftFeature.h" +#include "MineShaftPieces.h" +#include "MineShaftStart.h" +#include "NetherBridgeFeature.h" +#include "NetherBridgePieces.h" +#include "StrongholdFeature.h" +#include "StrongholdPieces.h" +#include "StructureFeature.h" +#include "StructureFeatureIO.h" +#include "StructureFeatureSavedData.h" +#include "StructurePiece.h" +#include "StructureStart.h" +#include "VillageFeature.h" +#include "VillagePieces.h" +#include "RandomScatteredLargeFeature.h" +#include "ScatteredFeaturePieces.h" \ No newline at end of file diff --git a/Minecraft.World/Util/Distort.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/synth/Distort.cpp similarity index 82% rename from Minecraft.World/Util/Distort.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/Distort.cpp index 31917e09f..5353abe45 100644 --- a/Minecraft.World/Util/Distort.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/synth/Distort.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "Distort.h" Distort::Distort(Synth* source, Synth* distort) { diff --git a/Minecraft.World/Util/Distort.h b/Minecraft.World/net/minecraft/world/level/levelgen/synth/Distort.h similarity index 84% rename from Minecraft.World/Util/Distort.h rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/Distort.h index 3dfaac7cc..ada214263 100644 --- a/Minecraft.World/Util/Distort.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/synth/Distort.h @@ -1,5 +1,5 @@ #pragma once -#include "../WorldGen/Noise/Synth.h" +#include "Synth.h" class Distort : public Synth { private: diff --git a/Minecraft.World/Util/Emboss.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/synth/Emboss.cpp similarity index 78% rename from Minecraft.World/Util/Emboss.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/Emboss.cpp index ddd31f8a2..c7ef816ec 100644 --- a/Minecraft.World/Util/Emboss.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/synth/Emboss.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "Emboss.h" Emboss::Emboss(Synth* synth) { this->synth = synth; } diff --git a/Minecraft.World/Util/Emboss.h b/Minecraft.World/net/minecraft/world/level/levelgen/synth/Emboss.h similarity index 81% rename from Minecraft.World/Util/Emboss.h rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/Emboss.h index a62e244f4..a69f0632a 100644 --- a/Minecraft.World/Util/Emboss.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/synth/Emboss.h @@ -1,5 +1,5 @@ #pragma once -#include "../WorldGen/Noise/Synth.h" +#include "Synth.h" class Emboss : public Synth { private: diff --git a/Minecraft.World/WorldGen/Noise/FastNoise.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/synth/FastNoise.cpp similarity index 98% rename from Minecraft.World/WorldGen/Noise/FastNoise.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/FastNoise.cpp index 1b44de282..49cb1144c 100644 --- a/Minecraft.World/WorldGen/Noise/FastNoise.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/synth/FastNoise.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "FastNoise.h" FastNoise::FastNoise(int levels) { diff --git a/Minecraft.World/WorldGen/Noise/FastNoise.h b/Minecraft.World/net/minecraft/world/level/levelgen/synth/FastNoise.h similarity index 100% rename from Minecraft.World/WorldGen/Noise/FastNoise.h rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/FastNoise.h diff --git a/Minecraft.World/WorldGen/Noise/ImprovedNoise.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/synth/ImprovedNoise.cpp similarity index 99% rename from Minecraft.World/WorldGen/Noise/ImprovedNoise.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/ImprovedNoise.cpp index ffc16f4fa..4ece4a30b 100644 --- a/Minecraft.World/WorldGen/Noise/ImprovedNoise.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/synth/ImprovedNoise.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "ImprovedNoise.h" ImprovedNoise::ImprovedNoise() { diff --git a/Minecraft.World/WorldGen/Noise/ImprovedNoise.h b/Minecraft.World/net/minecraft/world/level/levelgen/synth/ImprovedNoise.h similarity index 100% rename from Minecraft.World/WorldGen/Noise/ImprovedNoise.h rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/ImprovedNoise.h diff --git a/Minecraft.World/WorldGen/Noise/PerlinNoise.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/synth/PerlinNoise.cpp similarity index 96% rename from Minecraft.World/WorldGen/Noise/PerlinNoise.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/PerlinNoise.cpp index 2f4db10ae..7ef6d9b9f 100644 --- a/Minecraft.World/WorldGen/Noise/PerlinNoise.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/synth/PerlinNoise.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "PerlinNoise.h" -#include "../../Util/Mth.h" +#include "../../../../util/Mth.h" PerlinNoise::PerlinNoise(int levels) { Random random; diff --git a/Minecraft.World/WorldGen/Noise/PerlinNoise.h b/Minecraft.World/net/minecraft/world/level/levelgen/synth/PerlinNoise.h similarity index 100% rename from Minecraft.World/WorldGen/Noise/PerlinNoise.h rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/PerlinNoise.h diff --git a/Minecraft.World/WorldGen/Noise/PerlinSimplexNoise.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/synth/PerlinSimplexNoise.cpp similarity index 98% rename from Minecraft.World/WorldGen/Noise/PerlinSimplexNoise.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/PerlinSimplexNoise.cpp index 40d2f10f3..73743c5c0 100644 --- a/Minecraft.World/WorldGen/Noise/PerlinSimplexNoise.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/synth/PerlinSimplexNoise.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "PerlinSimplexNoise.h" PerlinSimplexNoise::PerlinSimplexNoise(int levels) { diff --git a/Minecraft.World/WorldGen/Noise/PerlinSimplexNoise.h b/Minecraft.World/net/minecraft/world/level/levelgen/synth/PerlinSimplexNoise.h similarity index 100% rename from Minecraft.World/WorldGen/Noise/PerlinSimplexNoise.h rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/PerlinSimplexNoise.h diff --git a/Minecraft.World/Util/Rotate.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/synth/Rotate.cpp similarity index 83% rename from Minecraft.World/Util/Rotate.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/Rotate.cpp index 2b4d10bce..4490f5268 100644 --- a/Minecraft.World/Util/Rotate.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/synth/Rotate.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "Rotate.h" Rotate::Rotate(Synth* synth, float angle) { diff --git a/Minecraft.World/Util/Rotate.h b/Minecraft.World/net/minecraft/world/level/levelgen/synth/Rotate.h similarity index 84% rename from Minecraft.World/Util/Rotate.h rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/Rotate.h index 02a7806e5..daffc56ee 100644 --- a/Minecraft.World/Util/Rotate.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/synth/Rotate.h @@ -1,5 +1,5 @@ #pragma once -#include "../WorldGen/Noise/Synth.h" +#include "Synth.h" class Rotate : public Synth { private: diff --git a/Minecraft.World/Util/Scale.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/synth/Scale.cpp similarity index 84% rename from Minecraft.World/Util/Scale.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/Scale.cpp index 45c55054d..582536e6a 100644 --- a/Minecraft.World/Util/Scale.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/synth/Scale.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "Scale.h" Scale::Scale(Synth* synth, double xScale, double yScale) { diff --git a/Minecraft.World/Util/Scale.h b/Minecraft.World/net/minecraft/world/level/levelgen/synth/Scale.h similarity index 85% rename from Minecraft.World/Util/Scale.h rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/Scale.h index dce37b00e..d7d306581 100644 --- a/Minecraft.World/Util/Scale.h +++ b/Minecraft.World/net/minecraft/world/level/levelgen/synth/Scale.h @@ -1,5 +1,5 @@ #pragma once -#include "../WorldGen/Noise/Synth.h" +#include "Synth.h" class Scale : public Synth { private: diff --git a/Minecraft.World/WorldGen/Noise/SimplexNoise.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/synth/SimplexNoise.cpp similarity index 99% rename from Minecraft.World/WorldGen/Noise/SimplexNoise.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/SimplexNoise.cpp index e505d3622..2911b0c07 100644 --- a/Minecraft.World/WorldGen/Noise/SimplexNoise.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/synth/SimplexNoise.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "SimplexNoise.h" int SimplexNoise::grad3[12][3] = { diff --git a/Minecraft.World/WorldGen/Noise/SimplexNoise.h b/Minecraft.World/net/minecraft/world/level/levelgen/synth/SimplexNoise.h similarity index 100% rename from Minecraft.World/WorldGen/Noise/SimplexNoise.h rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/SimplexNoise.h diff --git a/Minecraft.World/WorldGen/Noise/Synth.cpp b/Minecraft.World/net/minecraft/world/level/levelgen/synth/Synth.cpp similarity index 85% rename from Minecraft.World/WorldGen/Noise/Synth.cpp rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/Synth.cpp index aa1ebc6d5..0eacc8099 100644 --- a/Minecraft.World/WorldGen/Noise/Synth.cpp +++ b/Minecraft.World/net/minecraft/world/level/levelgen/synth/Synth.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "Synth.h" doubleArray Synth::create(int width, int height) { diff --git a/Minecraft.World/WorldGen/Noise/Synth.h b/Minecraft.World/net/minecraft/world/level/levelgen/synth/Synth.h similarity index 100% rename from Minecraft.World/WorldGen/Noise/Synth.h rename to Minecraft.World/net/minecraft/world/level/levelgen/synth/Synth.h diff --git a/Minecraft.World/net/minecraft/world/level/levelgen/synth/net.minecraft.world.level.levelgen.synth.h b/Minecraft.World/net/minecraft/world/level/levelgen/synth/net.minecraft.world.level.levelgen.synth.h new file mode 100644 index 000000000..a0f5bf1fa --- /dev/null +++ b/Minecraft.World/net/minecraft/world/level/levelgen/synth/net.minecraft.world.level.levelgen.synth.h @@ -0,0 +1,12 @@ +#pragma once + +#include "Distort.h" +#include "Emboss.h" +#include "FastNoise.h" +#include "ImprovedNoise.h" +#include "PerlinNoise.h" +#include "PerlinSimplexNoise.h" +#include "Rotate.h" +#include "Scale.h" +#include "SimplexNoise.h" +#include "Synth.h" \ No newline at end of file diff --git a/Minecraft.World/Blocks/DecorationMaterial.h b/Minecraft.World/net/minecraft/world/level/material/DecorationMaterial.h similarity index 100% rename from Minecraft.World/Blocks/DecorationMaterial.h rename to Minecraft.World/net/minecraft/world/level/material/DecorationMaterial.h diff --git a/Minecraft.World/Blocks/GasMaterial.h b/Minecraft.World/net/minecraft/world/level/material/GasMaterial.h similarity index 100% rename from Minecraft.World/Blocks/GasMaterial.h rename to Minecraft.World/net/minecraft/world/level/material/GasMaterial.h diff --git a/Minecraft.World/Blocks/LiquidMaterial.h b/Minecraft.World/net/minecraft/world/level/material/LiquidMaterial.h similarity index 100% rename from Minecraft.World/Blocks/LiquidMaterial.h rename to Minecraft.World/net/minecraft/world/level/material/LiquidMaterial.h diff --git a/Minecraft.World/Blocks/Material.cpp b/Minecraft.World/net/minecraft/world/level/material/Material.cpp similarity index 99% rename from Minecraft.World/Blocks/Material.cpp rename to Minecraft.World/net/minecraft/world/level/material/Material.cpp index d80d9ae91..5b5a63f73 100644 --- a/Minecraft.World/Blocks/Material.cpp +++ b/Minecraft.World/net/minecraft/world/level/material/Material.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "Material.h" #include "DecorationMaterial.h" #include "GasMaterial.h" diff --git a/Minecraft.World/Blocks/Material.h b/Minecraft.World/net/minecraft/world/level/material/Material.h similarity index 100% rename from Minecraft.World/Blocks/Material.h rename to Minecraft.World/net/minecraft/world/level/material/Material.h diff --git a/Minecraft.World/Blocks/MaterialColor.cpp b/Minecraft.World/net/minecraft/world/level/material/MaterialColor.cpp similarity index 97% rename from Minecraft.World/Blocks/MaterialColor.cpp rename to Minecraft.World/net/minecraft/world/level/material/MaterialColor.cpp index 2b4fd5e34..fcf15b261 100644 --- a/Minecraft.World/Blocks/MaterialColor.cpp +++ b/Minecraft.World/net/minecraft/world/level/material/MaterialColor.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "MaterialColor.h" MaterialColor** MaterialColor::colors; diff --git a/Minecraft.World/Blocks/MaterialColor.h b/Minecraft.World/net/minecraft/world/level/material/MaterialColor.h similarity index 100% rename from Minecraft.World/Blocks/MaterialColor.h rename to Minecraft.World/net/minecraft/world/level/material/MaterialColor.h diff --git a/Minecraft.World/Blocks/PortalMaterial.h b/Minecraft.World/net/minecraft/world/level/material/PortalMaterial.h similarity index 100% rename from Minecraft.World/Blocks/PortalMaterial.h rename to Minecraft.World/net/minecraft/world/level/material/PortalMaterial.h diff --git a/Minecraft.World/Blocks/WebMaterial.h b/Minecraft.World/net/minecraft/world/level/material/WebMaterial.h similarity index 100% rename from Minecraft.World/Blocks/WebMaterial.h rename to Minecraft.World/net/minecraft/world/level/material/WebMaterial.h diff --git a/Minecraft.World/net/minecraft/world/level/material/net.minecraft.world.level.material.h b/Minecraft.World/net/minecraft/world/level/material/net.minecraft.world.level.material.h new file mode 100644 index 000000000..173ac53a1 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/level/material/net.minecraft.world.level.material.h @@ -0,0 +1,8 @@ +#pragma once + +#include "DecorationMaterial.h" +#include "GasMaterial.h" +#include "LiquidMaterial.h" +#include "Material.h" +#include "MaterialColor.h" +#include "PortalMaterial.h" \ No newline at end of file diff --git a/Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h b/Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h new file mode 100644 index 000000000..e69d423b4 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/level/net.minecraft.world.level.h @@ -0,0 +1,26 @@ +#pragma once + +#include "BaseMobSpawner.h" +#include "BlockDestructionProgress.h" +#include "ChunkPos.h" +#include "Coord.h" +#include "Explosion.h" +#include "FoliageColor.h" +#include "GameRules.h" +#include "GrassColor.h" +#include "LevelConflictException.h" +#include "LevelListener.h" +#include "LevelSource.h" +#include "LightLayer.h" +#include "MobSpawner.h" +#include "PortalForcer.h" +#include "Region.h" +#include "TickNextTickData.h" +#include "TileEventData.h" +#include "TilePos.h" +#include "WaterColor.h" +#include "Level.h" +#include "LevelType.h" +#include "LevelSettings.h" + +#include "Calendar.h" \ No newline at end of file diff --git a/Minecraft.World/WorldGen/Layers/AddIslandLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/AddIslandLayer.cpp similarity index 92% rename from Minecraft.World/WorldGen/Layers/AddIslandLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/AddIslandLayer.cpp index deee6c325..5cd12e760 100644 --- a/Minecraft.World/WorldGen/Layers/AddIslandLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/AddIslandLayer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" -#include "../../Headers/net.minecraft.world.level.biome.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.newbiome.layer.h" +#include "../../biome/net.minecraft.world.level.biome.h" AddIslandLayer::AddIslandLayer(int64_t seedMixup, std::shared_ptr parent) : Layer(seedMixup) { diff --git a/Minecraft.World/WorldGen/Layers/AddIslandLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/AddIslandLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/AddIslandLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/AddIslandLayer.h diff --git a/Minecraft.World/WorldGen/Layers/AddMushroomIslandLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/AddMushroomIslandLayer.cpp similarity index 87% rename from Minecraft.World/WorldGen/Layers/AddMushroomIslandLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/AddMushroomIslandLayer.cpp index f1cf6cafb..a7733b917 100644 --- a/Minecraft.World/WorldGen/Layers/AddMushroomIslandLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/AddMushroomIslandLayer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" -#include "../../Headers/net.minecraft.world.level.biome.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.newbiome.layer.h" +#include "../../biome/net.minecraft.world.level.biome.h" AddMushroomIslandLayer::AddMushroomIslandLayer(int64_t seedMixup, std::shared_ptr parent) diff --git a/Minecraft.World/WorldGen/Layers/AddMushroomIslandLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/AddMushroomIslandLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/AddMushroomIslandLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/AddMushroomIslandLayer.h diff --git a/Minecraft.World/WorldGen/Layers/AddSnowLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/AddSnowLayer.cpp similarity index 84% rename from Minecraft.World/WorldGen/Layers/AddSnowLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/AddSnowLayer.cpp index d8491787b..7726a00e7 100644 --- a/Minecraft.World/WorldGen/Layers/AddSnowLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/AddSnowLayer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" -#include "../../Headers/net.minecraft.world.level.biome.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.newbiome.layer.h" +#include "../../biome/net.minecraft.world.level.biome.h" AddSnowLayer::AddSnowLayer(int64_t seedMixup, std::shared_ptr parent) : Layer(seedMixup) { diff --git a/Minecraft.World/WorldGen/Layers/AddSnowLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/AddSnowLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/AddSnowLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/AddSnowLayer.h diff --git a/Minecraft.World/WorldGen/Layers/BiomeInitLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/BiomeInitLayer.cpp similarity index 89% rename from Minecraft.World/WorldGen/Layers/BiomeInitLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/BiomeInitLayer.cpp index 005a9b25b..b9cc9be6e 100644 --- a/Minecraft.World/WorldGen/Layers/BiomeInitLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/BiomeInitLayer.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../biome/net.minecraft.world.level.biome.h" +#include "net.minecraft.world.level.newbiome.layer.h" +#include "../../net.minecraft.world.level.h" #include "BiomeInitLayer.h" BiomeInitLayer::BiomeInitLayer(int64_t seed, std::shared_ptr parent, diff --git a/Minecraft.World/WorldGen/Layers/BiomeInitLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/BiomeInitLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/BiomeInitLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/BiomeInitLayer.h diff --git a/Minecraft.World/WorldGen/Layers/BiomeOverrideLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/BiomeOverrideLayer.cpp similarity index 91% rename from Minecraft.World/WorldGen/Layers/BiomeOverrideLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/BiomeOverrideLayer.cpp index eb0dc5cd1..413f2e701 100644 --- a/Minecraft.World/WorldGen/Layers/BiomeOverrideLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/BiomeOverrideLayer.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../biome/net.minecraft.world.level.biome.h" +#include "net.minecraft.world.level.newbiome.layer.h" +#include "../../net.minecraft.world.level.h" #include "BiomeOverrideLayer.h" BiomeOverrideLayer::BiomeOverrideLayer(int seedMixup) : Layer(seedMixup) { diff --git a/Minecraft.World/WorldGen/Layers/BiomeOverrideLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/BiomeOverrideLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/BiomeOverrideLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/BiomeOverrideLayer.h diff --git a/Minecraft.World/WorldGen/Layers/DownfallLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/DownfallLayer.cpp similarity index 71% rename from Minecraft.World/WorldGen/Layers/DownfallLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/DownfallLayer.cpp index b89d2491c..973db7a67 100644 --- a/Minecraft.World/WorldGen/Layers/DownfallLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/DownfallLayer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../biome/net.minecraft.world.level.biome.h" +#include "net.minecraft.world.level.newbiome.layer.h" DownfallLayer::DownfallLayer(std::shared_ptr parent) : Layer(0) { this->parent = parent; diff --git a/Minecraft.World/WorldGen/Layers/DownfallLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/DownfallLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/DownfallLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/DownfallLayer.h diff --git a/Minecraft.World/WorldGen/Layers/DownfallMixerLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/DownfallMixerLayer.cpp similarity index 79% rename from Minecraft.World/WorldGen/Layers/DownfallMixerLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/DownfallMixerLayer.cpp index af2734425..8a3f94ce2 100644 --- a/Minecraft.World/WorldGen/Layers/DownfallMixerLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/DownfallMixerLayer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../biome/net.minecraft.world.level.biome.h" +#include "net.minecraft.world.level.newbiome.layer.h" DownfallMixerLayer::DownfallMixerLayer(std::shared_ptr downfall, std::shared_ptr parent, int layer) diff --git a/Minecraft.World/WorldGen/Layers/DownfallMixerLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/DownfallMixerLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/DownfallMixerLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/DownfallMixerLayer.h diff --git a/Minecraft.World/WorldGen/Layers/FlatLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/FlatLayer.cpp similarity index 75% rename from Minecraft.World/WorldGen/Layers/FlatLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/FlatLayer.cpp index 6685eb518..c87f07287 100644 --- a/Minecraft.World/WorldGen/Layers/FlatLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/FlatLayer.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.newbiome.layer.h" FlatLayer::FlatLayer(int val) : Layer(0) { this->val = val; } diff --git a/Minecraft.World/WorldGen/Layers/FlatLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/FlatLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/FlatLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/FlatLayer.h diff --git a/Minecraft.World/WorldGen/Layers/FuzzyZoomLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/FuzzyZoomLayer.cpp similarity index 93% rename from Minecraft.World/WorldGen/Layers/FuzzyZoomLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/FuzzyZoomLayer.cpp index 005c77408..dff37e1ad 100644 --- a/Minecraft.World/WorldGen/Layers/FuzzyZoomLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/FuzzyZoomLayer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Platform/System.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../../../ConsoleJavaLibs/System.h" +#include "net.minecraft.world.level.newbiome.layer.h" FuzzyZoomLayer::FuzzyZoomLayer(int64_t seedMixup, std::shared_ptr parent) : Layer(seedMixup) { diff --git a/Minecraft.World/WorldGen/Layers/FuzzyZoomLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/FuzzyZoomLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/FuzzyZoomLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/FuzzyZoomLayer.h diff --git a/Minecraft.World/WorldGen/Layers/GrowMushroomIslandLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/GrowMushroomIslandLayer.cpp similarity index 87% rename from Minecraft.World/WorldGen/Layers/GrowMushroomIslandLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/GrowMushroomIslandLayer.cpp index 0b45d2785..13d89575a 100644 --- a/Minecraft.World/WorldGen/Layers/GrowMushroomIslandLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/GrowMushroomIslandLayer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" -#include "../../Headers/net.minecraft.world.level.biome.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.newbiome.layer.h" +#include "../../biome/net.minecraft.world.level.biome.h" GrowMushroomIslandLayer::GrowMushroomIslandLayer(int64_t seedMixup, std::shared_ptr parent) diff --git a/Minecraft.World/WorldGen/Layers/GrowMushroomIslandLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/GrowMushroomIslandLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/GrowMushroomIslandLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/GrowMushroomIslandLayer.h diff --git a/Minecraft.World/WorldGen/Layers/IslandLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/IslandLayer.cpp similarity index 83% rename from Minecraft.World/WorldGen/Layers/IslandLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/IslandLayer.cpp index fea672e79..23c5b84b5 100644 --- a/Minecraft.World/WorldGen/Layers/IslandLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/IslandLayer.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.newbiome.layer.h" IslandLayer::IslandLayer(int64_t seedMixup) : Layer(seedMixup) {} diff --git a/Minecraft.World/WorldGen/Layers/IslandLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/IslandLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/IslandLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/IslandLayer.h diff --git a/Minecraft.World/WorldGen/Layers/Layer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/Layer.cpp similarity index 97% rename from Minecraft.World/WorldGen/Layers/Layer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/Layer.cpp index cd97198b9..46435f591 100644 --- a/Minecraft.World/WorldGen/Layers/Layer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/Layer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.newbiome.layer.h" +#include "../../net.minecraft.world.level.h" #include "BiomeOverrideLayer.h" LayerArray Layer::getDefaultLayers(int64_t seed, LevelType* levelType) { diff --git a/Minecraft.World/WorldGen/Layers/Layer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/Layer.h similarity index 89% rename from Minecraft.World/WorldGen/Layers/Layer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/Layer.h index 84b34fc9c..ade815820 100644 --- a/Minecraft.World/WorldGen/Layers/Layer.h +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/Layer.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Util/ArrayWithLength.h" +#include "../../../../../../ConsoleHelpers/ArrayWithLength.h" class LevelType; diff --git a/Minecraft.World/WorldGen/Layers/RegionHillsLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/RegionHillsLayer.cpp similarity index 94% rename from Minecraft.World/WorldGen/Layers/RegionHillsLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/RegionHillsLayer.cpp index e1d922325..199ddf1df 100644 --- a/Minecraft.World/WorldGen/Layers/RegionHillsLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/RegionHillsLayer.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.biome.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../biome/net.minecraft.world.level.biome.h" #include "RegionHillsLayer.h" RegionHillsLayer::RegionHillsLayer(int64_t seed, std::shared_ptr parent) diff --git a/Minecraft.World/WorldGen/Layers/RegionHillsLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/RegionHillsLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/RegionHillsLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/RegionHillsLayer.h diff --git a/Minecraft.World/WorldGen/Layers/RiverInitLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/RiverInitLayer.cpp similarity index 83% rename from Minecraft.World/WorldGen/Layers/RiverInitLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/RiverInitLayer.cpp index 7ccf2cc4a..d009b03d3 100644 --- a/Minecraft.World/WorldGen/Layers/RiverInitLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/RiverInitLayer.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.newbiome.layer.h" RiverInitLayer::RiverInitLayer(int64_t seed, std::shared_ptr parent) : Layer(seed) { diff --git a/Minecraft.World/WorldGen/Layers/RiverInitLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/RiverInitLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/RiverInitLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/RiverInitLayer.h diff --git a/Minecraft.World/WorldGen/Layers/RiverLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/RiverLayer.cpp similarity index 85% rename from Minecraft.World/WorldGen/Layers/RiverLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/RiverLayer.cpp index fcd93e3af..e690dae7a 100644 --- a/Minecraft.World/WorldGen/Layers/RiverLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/RiverLayer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../biome/net.minecraft.world.level.biome.h" +#include "net.minecraft.world.level.newbiome.layer.h" RiverLayer::RiverLayer(int64_t seedMixup, std::shared_ptr parent) : Layer(seedMixup) { diff --git a/Minecraft.World/WorldGen/Layers/RiverLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/RiverLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/RiverLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/RiverLayer.h diff --git a/Minecraft.World/WorldGen/Layers/RiverMixerLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/RiverMixerLayer.cpp similarity index 90% rename from Minecraft.World/WorldGen/Layers/RiverMixerLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/RiverMixerLayer.cpp index c2dc12e10..4b022dad6 100644 --- a/Minecraft.World/WorldGen/Layers/RiverMixerLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/RiverMixerLayer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../biome/net.minecraft.world.level.biome.h" +#include "net.minecraft.world.level.newbiome.layer.h" RiverMixerLayer::RiverMixerLayer(int64_t seed, std::shared_ptr biomes, std::shared_ptr rivers) diff --git a/Minecraft.World/WorldGen/Layers/RiverMixerLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/RiverMixerLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/RiverMixerLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/RiverMixerLayer.h diff --git a/Minecraft.World/WorldGen/Layers/ShoreLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/ShoreLayer.cpp similarity index 94% rename from Minecraft.World/WorldGen/Layers/ShoreLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/ShoreLayer.cpp index a4bfc420c..ca273653e 100644 --- a/Minecraft.World/WorldGen/Layers/ShoreLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/ShoreLayer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" -#include "../../Headers/net.minecraft.world.level.biome.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.newbiome.layer.h" +#include "../../biome/net.minecraft.world.level.biome.h" ShoreLayer::ShoreLayer(int64_t seed, std::shared_ptr parent) : Layer(seed) { diff --git a/Minecraft.World/WorldGen/Layers/ShoreLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/ShoreLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/ShoreLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/ShoreLayer.h diff --git a/Minecraft.World/WorldGen/Layers/SmoothLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/SmoothLayer.cpp similarity index 91% rename from Minecraft.World/WorldGen/Layers/SmoothLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/SmoothLayer.cpp index b76dd3bce..976a92b27 100644 --- a/Minecraft.World/WorldGen/Layers/SmoothLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/SmoothLayer.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.newbiome.layer.h" SmoothLayer::SmoothLayer(int64_t seedMixup, std::shared_ptr parent) : Layer(seedMixup) { diff --git a/Minecraft.World/WorldGen/Layers/SmoothLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/SmoothLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/SmoothLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/SmoothLayer.h diff --git a/Minecraft.World/WorldGen/Layers/SmoothZoomLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/SmoothZoomLayer.cpp similarity index 92% rename from Minecraft.World/WorldGen/Layers/SmoothZoomLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/SmoothZoomLayer.cpp index e8b2d0f09..db751befe 100644 --- a/Minecraft.World/WorldGen/Layers/SmoothZoomLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/SmoothZoomLayer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" -#include "../../Platform/System.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.newbiome.layer.h" +#include "../../../../../../ConsoleJavaLibs/System.h" SmoothZoomLayer::SmoothZoomLayer(int64_t seedMixup, std::shared_ptr parent) diff --git a/Minecraft.World/WorldGen/Layers/SmoothZoomLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/SmoothZoomLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/SmoothZoomLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/SmoothZoomLayer.h diff --git a/Minecraft.World/WorldGen/Layers/SwampRiversLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/SwampRiversLayer.cpp similarity index 88% rename from Minecraft.World/WorldGen/Layers/SwampRiversLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/SwampRiversLayer.cpp index f886716df..34091ca46 100644 --- a/Minecraft.World/WorldGen/Layers/SwampRiversLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/SwampRiversLayer.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.biome.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../biome/net.minecraft.world.level.biome.h" #include "SwampRiversLayer.h" SwampRiversLayer::SwampRiversLayer(int64_t seed, std::shared_ptr parent) diff --git a/Minecraft.World/WorldGen/Layers/SwampRiversLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/SwampRiversLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/SwampRiversLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/SwampRiversLayer.h diff --git a/Minecraft.World/WorldGen/Layers/TemperatureLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/TemperatureLayer.cpp similarity index 71% rename from Minecraft.World/WorldGen/Layers/TemperatureLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/TemperatureLayer.cpp index cc5a05c23..bb259eebe 100644 --- a/Minecraft.World/WorldGen/Layers/TemperatureLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/TemperatureLayer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../biome/net.minecraft.world.level.biome.h" +#include "net.minecraft.world.level.newbiome.layer.h" TemperatureLayer::TemperatureLayer(std::shared_ptr parent) : Layer(0) { this->parent = parent; diff --git a/Minecraft.World/WorldGen/Layers/TemperatureLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/TemperatureLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/TemperatureLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/TemperatureLayer.h diff --git a/Minecraft.World/WorldGen/Layers/TemperatureMixerLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/TemperatureMixerLayer.cpp similarity index 81% rename from Minecraft.World/WorldGen/Layers/TemperatureMixerLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/TemperatureMixerLayer.cpp index f8350b6fd..793e1aa63 100644 --- a/Minecraft.World/WorldGen/Layers/TemperatureMixerLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/TemperatureMixerLayer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.biome.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../biome/net.minecraft.world.level.biome.h" +#include "net.minecraft.world.level.newbiome.layer.h" TemperatureMixerLayer::TemperatureMixerLayer(std::shared_ptr temp, std::shared_ptr parent, diff --git a/Minecraft.World/WorldGen/Layers/TemperatureMixerLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/TemperatureMixerLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/TemperatureMixerLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/TemperatureMixerLayer.h diff --git a/Minecraft.World/WorldGen/Layers/VoronoiZoom.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/VoronoiZoom.cpp similarity index 96% rename from Minecraft.World/WorldGen/Layers/VoronoiZoom.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/VoronoiZoom.cpp index 0dafbd6d9..f5b55018d 100644 --- a/Minecraft.World/WorldGen/Layers/VoronoiZoom.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/VoronoiZoom.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" -#include "../../Platform/System.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.newbiome.layer.h" +#include "../../../../../../ConsoleJavaLibs/System.h" VoronoiZoom::VoronoiZoom(int64_t seedMixup, std::shared_ptr parent) : Layer(seedMixup) { diff --git a/Minecraft.World/WorldGen/Layers/VoronoiZoom.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/VoronoiZoom.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/VoronoiZoom.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/VoronoiZoom.h diff --git a/Minecraft.World/WorldGen/Layers/ZoomLayer.cpp b/Minecraft.World/net/minecraft/world/level/newbiome/layer/ZoomLayer.cpp similarity index 94% rename from Minecraft.World/WorldGen/Layers/ZoomLayer.cpp rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/ZoomLayer.cpp index 673cec962..a02577d67 100644 --- a/Minecraft.World/WorldGen/Layers/ZoomLayer.cpp +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/ZoomLayer.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.newbiome.layer.h" -#include "../../Platform/System.h" +#include "../../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.level.newbiome.layer.h" +#include "../../../../../../ConsoleJavaLibs/System.h" ZoomLayer::ZoomLayer(int64_t seedMixup, std::shared_ptr parent) : Layer(seedMixup) { diff --git a/Minecraft.World/WorldGen/Layers/ZoomLayer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/ZoomLayer.h similarity index 100% rename from Minecraft.World/WorldGen/Layers/ZoomLayer.h rename to Minecraft.World/net/minecraft/world/level/newbiome/layer/ZoomLayer.h diff --git a/Minecraft.World/net/minecraft/world/level/newbiome/layer/net.minecraft.world.level.newbiome.layer.h b/Minecraft.World/net/minecraft/world/level/newbiome/layer/net.minecraft.world.level.newbiome.layer.h new file mode 100644 index 000000000..f3f866343 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/level/newbiome/layer/net.minecraft.world.level.newbiome.layer.h @@ -0,0 +1,27 @@ +#pragma once + +#include "AddIslandLayer.h" +#include "AddMushroomIslandLayer.h" +#include "AddSnowLayer.h" +#include "BiomeInitLayer.h" +#include "DownfallLayer.h" +#include "DownfallMixerLayer.h" +#include "FlatLayer.h" +#include "FuzzyZoomLayer.h" +#include "IslandLayer.h" +#include "Layer.h" +#include "RiverInitLayer.h" +#include "RiverLayer.h" +#include "RiverMixerLayer.h" +#include "ShoreLayer.h" +#include "SmoothLayer.h" +#include "SmoothZoomLayer.h" +#include "TemperatureLayer.h" +#include "TemperatureMixerLayer.h" +#include "VoronoiZoom.h" +#include "ZoomLayer.h" +#include "GrowMushroomIslandLayer.h" // 4J added + +// 1.1. +#include "RegionHillsLayer.h" +#include "SwampRiversLayer.h" diff --git a/Minecraft.World/Util/BinaryHeap.cpp b/Minecraft.World/net/minecraft/world/level/pathfinder/BinaryHeap.cpp similarity index 96% rename from Minecraft.World/Util/BinaryHeap.cpp rename to Minecraft.World/net/minecraft/world/level/pathfinder/BinaryHeap.cpp index 8f08f0a90..4b44508e8 100644 --- a/Minecraft.World/Util/BinaryHeap.cpp +++ b/Minecraft.World/net/minecraft/world/level/pathfinder/BinaryHeap.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../AI/Navigation/Node.h" -#include "../Platform/System.h" +#include "../../../../../Header Files/stdafx.h" +#include "Node.h" +#include "../../../../../ConsoleJavaLibs/System.h" #include "BinaryHeap.h" #include diff --git a/Minecraft.World/Util/BinaryHeap.h b/Minecraft.World/net/minecraft/world/level/pathfinder/BinaryHeap.h similarity index 79% rename from Minecraft.World/Util/BinaryHeap.h rename to Minecraft.World/net/minecraft/world/level/pathfinder/BinaryHeap.h index f632934ec..9ddc11da2 100644 --- a/Minecraft.World/Util/BinaryHeap.h +++ b/Minecraft.World/net/minecraft/world/level/pathfinder/BinaryHeap.h @@ -1,8 +1,8 @@ #pragma once -#include "../Platform/stdafx.h" -#include "../AI/Navigation/Node.h" -#include "../Platform/System.h" +#include "../../../../../Header Files/stdafx.h" +#include "Node.h" +#include "../../../../../ConsoleJavaLibs/System.h" class BinaryHeap { private: diff --git a/Minecraft.World/AI/Navigation/Node.cpp b/Minecraft.World/net/minecraft/world/level/pathfinder/Node.cpp similarity index 90% rename from Minecraft.World/AI/Navigation/Node.cpp rename to Minecraft.World/net/minecraft/world/level/pathfinder/Node.cpp index 7a06742e4..a7f5f643f 100644 --- a/Minecraft.World/AI/Navigation/Node.cpp +++ b/Minecraft.World/net/minecraft/world/level/pathfinder/Node.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.pathfinder.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/net.minecraft.world.entity.h" +#include "net.minecraft.world.level.pathfinder.h" // 4J - added for common ctor code // Do all the default initialisations done in the java class diff --git a/Minecraft.World/AI/Navigation/Node.h b/Minecraft.World/net/minecraft/world/level/pathfinder/Node.h similarity index 100% rename from Minecraft.World/AI/Navigation/Node.h rename to Minecraft.World/net/minecraft/world/level/pathfinder/Node.h diff --git a/Minecraft.World/AI/Navigation/Path.cpp b/Minecraft.World/net/minecraft/world/level/pathfinder/Path.cpp similarity index 93% rename from Minecraft.World/AI/Navigation/Path.cpp rename to Minecraft.World/net/minecraft/world/level/pathfinder/Path.cpp index bd05f06ff..224878579 100644 --- a/Minecraft.World/AI/Navigation/Path.cpp +++ b/Minecraft.World/net/minecraft/world/level/pathfinder/Path.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.pathfinder.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/net.minecraft.world.entity.h" +#include "net.minecraft.world.level.pathfinder.h" #include "Path.h" Path::~Path() { diff --git a/Minecraft.World/AI/Navigation/Path.h b/Minecraft.World/net/minecraft/world/level/pathfinder/Path.h similarity index 100% rename from Minecraft.World/AI/Navigation/Path.h rename to Minecraft.World/net/minecraft/world/level/pathfinder/Path.h diff --git a/Minecraft.World/AI/Navigation/PathFinder.cpp b/Minecraft.World/net/minecraft/world/level/pathfinder/PathFinder.cpp similarity index 96% rename from Minecraft.World/AI/Navigation/PathFinder.cpp rename to Minecraft.World/net/minecraft/world/level/pathfinder/PathFinder.cpp index 3ceb018a0..ee5830d91 100644 --- a/Minecraft.World/AI/Navigation/PathFinder.cpp +++ b/Minecraft.World/net/minecraft/world/level/pathfinder/PathFinder.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.material.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Util/BinaryHeap.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/net.minecraft.world.entity.h" +#include "../net.minecraft.world.level.h" +#include "../material/net.minecraft.world.level.material.h" +#include "../tile/net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "BinaryHeap.h" #include "Node.h" #include "Path.h" #include "PathFinder.h" diff --git a/Minecraft.World/AI/Navigation/PathFinder.h b/Minecraft.World/net/minecraft/world/level/pathfinder/PathFinder.h similarity index 96% rename from Minecraft.World/AI/Navigation/PathFinder.h rename to Minecraft.World/net/minecraft/world/level/pathfinder/PathFinder.h index 6d02f67ae..34ca9c220 100644 --- a/Minecraft.World/AI/Navigation/PathFinder.h +++ b/Minecraft.World/net/minecraft/world/level/pathfinder/PathFinder.h @@ -1,5 +1,5 @@ #pragma once -#include "../../Util/JavaIntHash.h" +#include "../../../../../ConsoleJavaLibs/JavaIntHash.h" class LevelSource; diff --git a/Minecraft.World/net/minecraft/world/level/pathfinder/net.minecraft.world.level.pathfinder.h b/Minecraft.World/net/minecraft/world/level/pathfinder/net.minecraft.world.level.pathfinder.h new file mode 100644 index 000000000..acfbbea89 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/level/pathfinder/net.minecraft.world.level.pathfinder.h @@ -0,0 +1,6 @@ +#pragma once + +#include "BinaryHeap.h" +#include "Node.h" +#include "Path.h" +#include "PathFinder.h" diff --git a/Minecraft.World/Level/Redstone.cpp b/Minecraft.World/net/minecraft/world/level/redstone/Redstone.cpp similarity index 76% rename from Minecraft.World/Level/Redstone.cpp rename to Minecraft.World/net/minecraft/world/level/redstone/Redstone.cpp index 6a78dfc88..cc071871c 100644 --- a/Minecraft.World/Level/Redstone.cpp +++ b/Minecraft.World/net/minecraft/world/level/redstone/Redstone.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "Redstone.h" diff --git a/Minecraft.World/Level/Redstone.h b/Minecraft.World/net/minecraft/world/level/redstone/Redstone.h similarity index 100% rename from Minecraft.World/Level/Redstone.h rename to Minecraft.World/net/minecraft/world/level/redstone/Redstone.h diff --git a/Minecraft.World/net/minecraft/world/level/redstone/net.minecraft.world.level.redstone.h b/Minecraft.World/net/minecraft/world/level/redstone/net.minecraft.world.level.redstone.h new file mode 100644 index 000000000..8e30ebfc8 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/level/redstone/net.minecraft.world.level.redstone.h @@ -0,0 +1,3 @@ +#pragma once + +#include "Redstone.h" \ No newline at end of file diff --git a/Minecraft.World/Level/Storage/MapItemSavedData.cpp b/Minecraft.World/net/minecraft/world/level/saveddata/MapItemSavedData.cpp similarity index 97% rename from Minecraft.World/Level/Storage/MapItemSavedData.cpp rename to Minecraft.World/net/minecraft/world/level/saveddata/MapItemSavedData.cpp index fc1afa910..efd89eb2b 100644 --- a/Minecraft.World/Level/Storage/MapItemSavedData.cpp +++ b/Minecraft.World/net/minecraft/world/level/saveddata/MapItemSavedData.cpp @@ -1,14 +1,14 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.item.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../../item/net.minecraft.world.item.h" #include "MapItemSavedData.h" -#include "../../../Minecraft.Client/Network/PlayerList.h" -#include "../../../Minecraft.Client/MinecraftServer.h" -#include "../../../Minecraft.Client/Player/ServerPlayer.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.storage.h" -#include "../../../Minecraft.Client/Network/PlayerConnection.h" +#include "../../../Minecraft.Client/net/minecraft/server/PlayerList.h" +#include "../../../Minecraft.Client/net/minecraft/server/MinecraftServer.h" +#include "../../../Minecraft.Client/net/minecraft/server/level/ServerPlayer.h" +#include "../net.minecraft.world.level.h" +#include "../storage/net.minecraft.world.level.storage.h" +#include "../../../Minecraft.Client/net/minecraft/server/network/PlayerConnection.h" const int MapItemSavedData::END_PORTAL_DECORATION_KEY = -1; diff --git a/Minecraft.World/Level/Storage/MapItemSavedData.h b/Minecraft.World/net/minecraft/world/level/saveddata/MapItemSavedData.h similarity index 98% rename from Minecraft.World/Level/Storage/MapItemSavedData.h rename to Minecraft.World/net/minecraft/world/level/saveddata/MapItemSavedData.h index 6642e4828..07eef8184 100644 --- a/Minecraft.World/Level/Storage/MapItemSavedData.h +++ b/Minecraft.World/net/minecraft/world/level/saveddata/MapItemSavedData.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Player/Player.h" +#include "../../entity/player/Player.h" #include "SavedData.h" class MapItemSavedData : public SavedData { diff --git a/Minecraft.World/Level/Storage/SavedData.cpp b/Minecraft.World/net/minecraft/world/level/saveddata/SavedData.cpp similarity index 84% rename from Minecraft.World/Level/Storage/SavedData.cpp rename to Minecraft.World/net/minecraft/world/level/saveddata/SavedData.cpp index 1cb534ffb..b31b0be7e 100644 --- a/Minecraft.World/Level/Storage/SavedData.cpp +++ b/Minecraft.World/net/minecraft/world/level/saveddata/SavedData.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "SavedData.h" SavedData::SavedData(const std::wstring& id) : id(id) { dirty = false; } diff --git a/Minecraft.World/Level/Storage/SavedData.h b/Minecraft.World/net/minecraft/world/level/saveddata/SavedData.h similarity index 89% rename from Minecraft.World/Level/Storage/SavedData.h rename to Minecraft.World/net/minecraft/world/level/saveddata/SavedData.h index 3c62bd4e8..da3876015 100644 --- a/Minecraft.World/Level/Storage/SavedData.h +++ b/Minecraft.World/net/minecraft/world/level/saveddata/SavedData.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Util/Class.h" +#include "../../../../../ConsoleJavaLibs/Class.h" class CompoundTag; diff --git a/Minecraft.World/net/minecraft/world/level/saveddata/net.minecraft.world.level.saveddata.h b/Minecraft.World/net/minecraft/world/level/saveddata/net.minecraft.world.level.saveddata.h new file mode 100644 index 000000000..11878d9e8 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/level/saveddata/net.minecraft.world.level.saveddata.h @@ -0,0 +1,4 @@ +#pragma once + +#include "SavedData.h" +#include "MapItemSavedData.h" \ No newline at end of file diff --git a/Minecraft.World/Level/DerivedLevelData.cpp b/Minecraft.World/net/minecraft/world/level/storage/DerivedLevelData.cpp similarity index 98% rename from Minecraft.World/Level/DerivedLevelData.cpp rename to Minecraft.World/net/minecraft/world/level/storage/DerivedLevelData.cpp index fef8fefa1..e89e4acf3 100644 --- a/Minecraft.World/Level/DerivedLevelData.cpp +++ b/Minecraft.World/net/minecraft/world/level/storage/DerivedLevelData.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "DerivedLevelData.h" diff --git a/Minecraft.World/Level/DerivedLevelData.h b/Minecraft.World/net/minecraft/world/level/storage/DerivedLevelData.h similarity index 100% rename from Minecraft.World/Level/DerivedLevelData.h rename to Minecraft.World/net/minecraft/world/level/storage/DerivedLevelData.h diff --git a/Minecraft.World/Level/Storage/DirectoryLevelStorage.cpp b/Minecraft.World/net/minecraft/world/level/storage/DirectoryLevelStorage.cpp similarity index 97% rename from Minecraft.World/Level/Storage/DirectoryLevelStorage.cpp rename to Minecraft.World/net/minecraft/world/level/storage/DirectoryLevelStorage.cpp index fbb42ec8d..882f29360 100644 --- a/Minecraft.World/Level/Storage/DirectoryLevelStorage.cpp +++ b/Minecraft.World/net/minecraft/world/level/storage/DirectoryLevelStorage.cpp @@ -1,16 +1,16 @@ -#include "../../Platform/stdafx.h" -#include "../../Platform/System.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.chunk.storage.h" -#include "../../Headers/net.minecraft.world.level.dimension.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../IO/Files/File.h" -#include "../../IO/Streams/DataInputStream.h" -#include "../../IO/Files/FileInputStream.h" -#include "../LevelData.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../ConsoleJavaLibs/System.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../net.minecraft.world.level.h" +#include "../chunk/storage/net.minecraft.world.level.chunk.storage.h" +#include "../dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../../../../../ConsoleJavaLibs/File.h" +#include "../../../../../ConsoleJavaLibs/InputOutputStream/DataInputStream.h" +#include "../../../../../ConsoleJavaLibs/InputOutputStream/FileInputStream.h" +#include "LevelData.h" #include "DirectoryLevelStorage.h" -#include "../../IO/Files/ConsoleSaveFileIO.h" +#include "../../../../../ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileIO.h" const std::wstring DirectoryLevelStorage::sc_szPlayerDir(L"players/"); diff --git a/Minecraft.World/Level/Storage/DirectoryLevelStorage.h b/Minecraft.World/net/minecraft/world/level/storage/DirectoryLevelStorage.h similarity index 97% rename from Minecraft.World/Level/Storage/DirectoryLevelStorage.h rename to Minecraft.World/net/minecraft/world/level/storage/DirectoryLevelStorage.h index bb579c9bf..3bca465b4 100644 --- a/Minecraft.World/Level/Storage/DirectoryLevelStorage.h +++ b/Minecraft.World/net/minecraft/world/level/storage/DirectoryLevelStorage.h @@ -25,11 +25,11 @@ // The save file version in which we added the End dimension map mappings #define END_DIMENSION_MAP_MAPPINGS_SAVE_VERSION 5 -#include "../../IO/Files/File.h" +#include "../../../../../ConsoleJavaLibs/File.h" #include "LevelStorage.h" #include "PlayerIO.h" -#include "../../IO/Files/ConsoleSavePath.h" +#include "../../../../../ConsoleHelpers/ConsoleSaveFileIO/ConsoleSavePath.h" class ConsoleSaveFile; // 4J Stu - Added this which we will write out as a file. Map id's are stored in diff --git a/Minecraft.World/Level/Storage/DirectoryLevelStorageSource.cpp b/Minecraft.World/net/minecraft/world/level/storage/DirectoryLevelStorageSource.cpp similarity index 91% rename from Minecraft.World/Level/Storage/DirectoryLevelStorageSource.cpp rename to Minecraft.World/net/minecraft/world/level/storage/DirectoryLevelStorageSource.cpp index 32294eb7d..79be0d2dc 100644 --- a/Minecraft.World/Level/Storage/DirectoryLevelStorageSource.cpp +++ b/Minecraft.World/net/minecraft/world/level/storage/DirectoryLevelStorageSource.cpp @@ -1,13 +1,13 @@ -#include "../../Platform/stdafx.h" -#include "../../IO/Files/File.h" -#include "../LevelData.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../ConsoleJavaLibs/File.h" +#include "LevelData.h" #include "LevelSummary.h" -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" #include "DirectoryLevelStorage.h" #include "DirectoryLevelStorageSource.h" -#include "../../IO/Files/ConsoleSaveFileIO.h" -#include "../../IO/Files/ConsoleSaveFileOriginal.h" +#include "../../../../../ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileIO.h" +#include "../../../../../ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileOriginal.h" class LevelStorage; diff --git a/Minecraft.World/Level/Storage/DirectoryLevelStorageSource.h b/Minecraft.World/net/minecraft/world/level/storage/DirectoryLevelStorageSource.h similarity index 96% rename from Minecraft.World/Level/Storage/DirectoryLevelStorageSource.h rename to Minecraft.World/net/minecraft/world/level/storage/DirectoryLevelStorageSource.h index 25c9fc8a4..ed0e7e147 100644 --- a/Minecraft.World/Level/Storage/DirectoryLevelStorageSource.h +++ b/Minecraft.World/net/minecraft/world/level/storage/DirectoryLevelStorageSource.h @@ -1,7 +1,7 @@ #pragma once #include "LevelStorageSource.h" -#include "../../IO/Files/File.h" +#include "../../../../../ConsoleJavaLibs/File.h" class ProgressListener; class LevelData; diff --git a/Minecraft.World/Level/LevelData.cpp b/Minecraft.World/net/minecraft/world/level/storage/LevelData.cpp similarity index 98% rename from Minecraft.World/Level/LevelData.cpp rename to Minecraft.World/net/minecraft/world/level/storage/LevelData.cpp index 9750e06e8..b79676e02 100644 --- a/Minecraft.World/Level/LevelData.cpp +++ b/Minecraft.World/net/minecraft/world/level/storage/LevelData.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Platform/System.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/com.mojang.nbt.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../ConsoleJavaLibs/System.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" #include "LevelData.h" -#include "Storage/LevelType.h" -#include "Storage/LevelSettings.h" +#include "../LevelType.h" +#include "../LevelSettings.h" LevelData::LevelData() {} diff --git a/Minecraft.World/Level/LevelData.h b/Minecraft.World/net/minecraft/world/level/storage/LevelData.h similarity index 99% rename from Minecraft.World/Level/LevelData.h rename to Minecraft.World/net/minecraft/world/level/storage/LevelData.h index 56101dc37..ff11166f3 100644 --- a/Minecraft.World/Level/LevelData.h +++ b/Minecraft.World/net/minecraft/world/level/storage/LevelData.h @@ -1,6 +1,6 @@ #pragma once -#include "GameRules.h" +#include "../GameRules.h" class Player; class CompoundTag; diff --git a/Minecraft.World/Level/Storage/LevelStorage.cpp b/Minecraft.World/net/minecraft/world/level/storage/LevelStorage.cpp similarity index 75% rename from Minecraft.World/Level/Storage/LevelStorage.cpp rename to Minecraft.World/net/minecraft/world/level/storage/LevelStorage.cpp index 7f05a12c0..3e494ac9d 100644 --- a/Minecraft.World/Level/Storage/LevelStorage.cpp +++ b/Minecraft.World/net/minecraft/world/level/storage/LevelStorage.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "LevelStorage.h" diff --git a/Minecraft.World/Level/Storage/LevelStorage.h b/Minecraft.World/net/minecraft/world/level/storage/LevelStorage.h similarity index 93% rename from Minecraft.World/Level/Storage/LevelStorage.h rename to Minecraft.World/net/minecraft/world/level/storage/LevelStorage.h index a8a2f0cc0..bfbe31fc7 100644 --- a/Minecraft.World/Level/Storage/LevelStorage.h +++ b/Minecraft.World/net/minecraft/world/level/storage/LevelStorage.h @@ -1,6 +1,6 @@ #pragma once -#include "../../IO/Files/ConsoleSavePath.h" +#include "../../../../../ConsoleHelpers/ConsoleSaveFileIO/ConsoleSavePath.h" class PlayerIO; class Dimension; diff --git a/Minecraft.World/Level/Storage/LevelStorageProfilerDecorator.cpp b/Minecraft.World/net/minecraft/world/level/storage/LevelStorageProfilerDecorator.cpp similarity index 78% rename from Minecraft.World/Level/Storage/LevelStorageProfilerDecorator.cpp rename to Minecraft.World/net/minecraft/world/level/storage/LevelStorageProfilerDecorator.cpp index 05fdd2427..d0e11ff52 100644 --- a/Minecraft.World/Level/Storage/LevelStorageProfilerDecorator.cpp +++ b/Minecraft.World/net/minecraft/world/level/storage/LevelStorageProfilerDecorator.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.chunk.storage.h" -#include "../../Headers/net.minecraft.world.level.dimension.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../net.minecraft.world.level.h" +#include "../chunk/storage/net.minecraft.world.level.chunk.storage.h" +#include "../dimension/net.minecraft.world.level.dimension.h" #include "LevelStorageProfilerDecorator.h" -#include "../../IO/Files/ConsoleSaveFileIO.h" +#include "../../../../../ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileIO.h" LevelStorageProfilerDecorator::LevelStorageProfilerDecorator( LevelStorage* capsulated) diff --git a/Minecraft.World/Level/Storage/LevelStorageProfilerDecorator.h b/Minecraft.World/net/minecraft/world/level/storage/LevelStorageProfilerDecorator.h similarity index 100% rename from Minecraft.World/Level/Storage/LevelStorageProfilerDecorator.h rename to Minecraft.World/net/minecraft/world/level/storage/LevelStorageProfilerDecorator.h diff --git a/Minecraft.World/Level/Storage/LevelStorageSource.h b/Minecraft.World/net/minecraft/world/level/storage/LevelStorageSource.h similarity index 97% rename from Minecraft.World/Level/Storage/LevelStorageSource.h rename to Minecraft.World/net/minecraft/world/level/storage/LevelStorageSource.h index 8d3e84da6..a42b80590 100644 --- a/Minecraft.World/Level/Storage/LevelStorageSource.h +++ b/Minecraft.World/net/minecraft/world/level/storage/LevelStorageSource.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" class LevelSummary; class ProgressListener; diff --git a/Minecraft.World/Level/Storage/LevelSummary.cpp b/Minecraft.World/net/minecraft/world/level/storage/LevelSummary.cpp similarity index 96% rename from Minecraft.World/Level/Storage/LevelSummary.cpp rename to Minecraft.World/net/minecraft/world/level/storage/LevelSummary.cpp index 59a7f31bd..a4deabdeb 100644 --- a/Minecraft.World/Level/Storage/LevelSummary.cpp +++ b/Minecraft.World/net/minecraft/world/level/storage/LevelSummary.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "LevelSummary.h" LevelSummary::LevelSummary(const std::wstring& levelId, diff --git a/Minecraft.World/Level/Storage/LevelSummary.h b/Minecraft.World/net/minecraft/world/level/storage/LevelSummary.h similarity index 100% rename from Minecraft.World/Level/Storage/LevelSummary.h rename to Minecraft.World/net/minecraft/world/level/storage/LevelSummary.h diff --git a/Minecraft.World/Level/Storage/McRegionLevelStorage.cpp b/Minecraft.World/net/minecraft/world/level/storage/McRegionLevelStorage.cpp similarity index 90% rename from Minecraft.World/Level/Storage/McRegionLevelStorage.cpp rename to Minecraft.World/net/minecraft/world/level/storage/McRegionLevelStorage.cpp index e7247f0f5..c88a27306 100644 --- a/Minecraft.World/Level/Storage/McRegionLevelStorage.cpp +++ b/Minecraft.World/net/minecraft/world/level/storage/McRegionLevelStorage.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.level.chunk.storage.h" -#include "../../Headers/net.minecraft.world.level.dimension.h" -#include "../../IO/Files/ConsoleSaveFileIO.h" -#include "../LevelData.h" -#include "../../IO/Files/File.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../chunk/storage/net.minecraft.world.level.chunk.storage.h" +#include "../dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileIO.h" +#include "LevelData.h" +#include "../../../../../ConsoleJavaLibs/File.h" #include "McRegionLevelStorage.h" McRegionLevelStorage::McRegionLevelStorage(ConsoleSaveFile* saveFile, File dir, diff --git a/Minecraft.World/Level/Storage/McRegionLevelStorage.h b/Minecraft.World/net/minecraft/world/level/storage/McRegionLevelStorage.h similarity index 100% rename from Minecraft.World/Level/Storage/McRegionLevelStorage.h rename to Minecraft.World/net/minecraft/world/level/storage/McRegionLevelStorage.h diff --git a/Minecraft.World/Level/Storage/McRegionLevelStorageSource.cpp b/Minecraft.World/net/minecraft/world/level/storage/McRegionLevelStorageSource.cpp similarity index 88% rename from Minecraft.World/Level/Storage/McRegionLevelStorageSource.cpp rename to Minecraft.World/net/minecraft/world/level/storage/McRegionLevelStorageSource.cpp index a456c6ec6..923c8d212 100644 --- a/Minecraft.World/Level/Storage/McRegionLevelStorageSource.cpp +++ b/Minecraft.World/net/minecraft/world/level/storage/McRegionLevelStorageSource.cpp @@ -1,15 +1,15 @@ -#include "../../Platform/stdafx.h" -#include "../../Util/JavaMath.h" -#include "../../Util/ProgressListener.h" -#include "../../Headers/net.minecraft.world.level.chunk.storage.h" -#include "../../Headers/net.minecraft.world.level.chunk.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../ConsoleJavaLibs/JavaMath.h" +#include "../../../util/ProgressListener.h" +#include "../chunk/storage/net.minecraft.world.level.chunk.storage.h" +#include "../chunk/net.minecraft.world.level.chunk.h" #include "LevelSummary.h" #include "McRegionLevelStorage.h" -#include "../../IO/Files/File.h" -#include "../LevelData.h" +#include "../../../../../ConsoleJavaLibs/File.h" +#include "LevelData.h" #include "McRegionLevelStorageSource.h" -#include "../../IO/Files/ConsoleSaveFileIO.h" +#include "../../../../../ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileIO.h" McRegionLevelStorageSource::McRegionLevelStorageSource(File dir) : DirectoryLevelStorageSource(dir) {} diff --git a/Minecraft.World/Level/Storage/McRegionLevelStorageSource.h b/Minecraft.World/net/minecraft/world/level/storage/McRegionLevelStorageSource.h similarity index 91% rename from Minecraft.World/Level/Storage/McRegionLevelStorageSource.h rename to Minecraft.World/net/minecraft/world/level/storage/McRegionLevelStorageSource.h index 1b69720e8..09bb38a72 100644 --- a/Minecraft.World/Level/Storage/McRegionLevelStorageSource.h +++ b/Minecraft.World/net/minecraft/world/level/storage/McRegionLevelStorageSource.h @@ -1,8 +1,8 @@ #pragma once #include "DirectoryLevelStorageSource.h" -#include "../../IO/Files/FileFilter.h" -#include "../../IO/Files/FilenameFilter.h" +#include "../../../../../ConsoleJavaLibs/FileFilter.h" +#include "../../../../../ConsoleJavaLibs/FilenameFilter.h" class ProgressListener; class LevelStorage; diff --git a/Minecraft.World/Level/Storage/MemoryLevelStorage.cpp b/Minecraft.World/net/minecraft/world/level/storage/MemoryLevelStorage.cpp similarity index 69% rename from Minecraft.World/Level/Storage/MemoryLevelStorage.cpp rename to Minecraft.World/net/minecraft/world/level/storage/MemoryLevelStorage.cpp index cea06ca68..f46b86bc5 100644 --- a/Minecraft.World/Level/Storage/MemoryLevelStorage.cpp +++ b/Minecraft.World/net/minecraft/world/level/storage/MemoryLevelStorage.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.chunk.storage.h" -#include "../../Headers/net.minecraft.world.level.dimension.h" -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../net.minecraft.world.level.h" +#include "../chunk/storage/net.minecraft.world.level.chunk.storage.h" +#include "../dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" #include "MemoryLevelStorage.h" -#include "../../IO/Files/ConsoleSaveFileIO.h" +#include "../../../../../ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileIO.h" MemoryLevelStorage::MemoryLevelStorage() {} diff --git a/Minecraft.World/Level/Storage/MemoryLevelStorage.h b/Minecraft.World/net/minecraft/world/level/storage/MemoryLevelStorage.h similarity index 65% rename from Minecraft.World/Level/Storage/MemoryLevelStorage.h rename to Minecraft.World/net/minecraft/world/level/storage/MemoryLevelStorage.h index 95577dbaf..6f2b93c11 100644 --- a/Minecraft.World/Level/Storage/MemoryLevelStorage.h +++ b/Minecraft.World/net/minecraft/world/level/storage/MemoryLevelStorage.h @@ -3,14 +3,14 @@ #include "LevelStorage.h" #include "PlayerIO.h" -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.chunk.storage.h" -#include "../../Headers/net.minecraft.world.level.dimension.h" -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../net.minecraft.world.level.h" +#include "../chunk/storage/net.minecraft.world.level.chunk.storage.h" +#include "../dimension/net.minecraft.world.level.dimension.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" -#include "../../IO/Files/ConsoleSaveFile.h" +#include "../../../../../ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFile.h" class MemoryLevelStorage : public LevelStorage, public PlayerIO { public: diff --git a/Minecraft.World/Level/Storage/MemoryLevelStorageSource.cpp b/Minecraft.World/net/minecraft/world/level/storage/MemoryLevelStorageSource.cpp similarity index 92% rename from Minecraft.World/Level/Storage/MemoryLevelStorageSource.cpp rename to Minecraft.World/net/minecraft/world/level/storage/MemoryLevelStorageSource.cpp index c172511ec..0c1f48ac5 100644 --- a/Minecraft.World/Level/Storage/MemoryLevelStorageSource.cpp +++ b/Minecraft.World/net/minecraft/world/level/storage/MemoryLevelStorageSource.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.chunk.storage.h" +#include "../../../../../Header Files/stdafx.h" +#include "../chunk/storage/net.minecraft.world.level.chunk.storage.h" #include "MemoryLevelStorage.h" #include "LevelSummary.h" #include "MemoryLevelStorageSource.h" diff --git a/Minecraft.World/Level/Storage/MemoryLevelStorageSource.h b/Minecraft.World/net/minecraft/world/level/storage/MemoryLevelStorageSource.h similarity index 100% rename from Minecraft.World/Level/Storage/MemoryLevelStorageSource.h rename to Minecraft.World/net/minecraft/world/level/storage/MemoryLevelStorageSource.h diff --git a/Minecraft.World/Level/Storage/MockedLevelStorage.cpp b/Minecraft.World/net/minecraft/world/level/storage/MockedLevelStorage.cpp similarity index 66% rename from Minecraft.World/Level/Storage/MockedLevelStorage.cpp rename to Minecraft.World/net/minecraft/world/level/storage/MockedLevelStorage.cpp index 2da239af1..403f3a2bc 100644 --- a/Minecraft.World/Level/Storage/MockedLevelStorage.cpp +++ b/Minecraft.World/net/minecraft/world/level/storage/MockedLevelStorage.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.chunk.storage.h" -#include "../../Headers/net.minecraft.world.level.dimension.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../net.minecraft.world.level.h" +#include "../chunk/storage/net.minecraft.world.level.chunk.storage.h" +#include "../dimension/net.minecraft.world.level.dimension.h" #include "MockedLevelStorage.h" -#include "../../IO/Files/ConsoleSaveFileIO.h" +#include "../../../../../ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileIO.h" LevelData* MockedLevelStorage::prepareLevel() { return nullptr; } diff --git a/Minecraft.World/Level/Storage/MockedLevelStorage.h b/Minecraft.World/net/minecraft/world/level/storage/MockedLevelStorage.h similarity index 89% rename from Minecraft.World/Level/Storage/MockedLevelStorage.h rename to Minecraft.World/net/minecraft/world/level/storage/MockedLevelStorage.h index 324410fb7..4e44b3fd8 100644 --- a/Minecraft.World/Level/Storage/MockedLevelStorage.h +++ b/Minecraft.World/net/minecraft/world/level/storage/MockedLevelStorage.h @@ -2,7 +2,7 @@ #include "LevelStorage.h" -#include "../../IO/Files/ConsoleSavePath.h" +#include "../../../../../ConsoleHelpers/ConsoleSaveFileIO/ConsoleSavePath.h" class MockedLevelStorage : public LevelStorage { public: diff --git a/Minecraft.World/Level/Storage/PlayerIO.h b/Minecraft.World/net/minecraft/world/level/storage/PlayerIO.h similarity index 100% rename from Minecraft.World/Level/Storage/PlayerIO.h rename to Minecraft.World/net/minecraft/world/level/storage/PlayerIO.h diff --git a/Minecraft.World/Level/Storage/SavedDataStorage.cpp b/Minecraft.World/net/minecraft/world/level/storage/SavedDataStorage.cpp similarity index 94% rename from Minecraft.World/Level/Storage/SavedDataStorage.cpp rename to Minecraft.World/net/minecraft/world/level/storage/SavedDataStorage.cpp index 47f47d4ff..30ae16d4f 100644 --- a/Minecraft.World/Level/Storage/SavedDataStorage.cpp +++ b/Minecraft.World/net/minecraft/world/level/storage/SavedDataStorage.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.saveddata.h" -#include "../../Headers/net.minecraft.world.level.storage.h" -#include "../../Headers/net.minecraft.world.entity.ai.village.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../IO/Files/File.h" +#include "../../../../../Header Files/stdafx.h" +#include "../saveddata/net.minecraft.world.level.saveddata.h" +#include "net.minecraft.world.level.storage.h" +#include "../../entity/ai/village/net.minecraft.world.entity.ai.village.h" +#include "../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../../../../../ConsoleJavaLibs/File.h" #include "SavedDataStorage.h" -#include "../../IO/Files/ConsoleSaveFileIO.h" +#include "../../../../../ConsoleHelpers/ConsoleSaveFileIO/ConsoleSaveFileIO.h" SavedDataStorage::SavedDataStorage(LevelStorage* levelStorage) { /* diff --git a/Minecraft.World/Level/Storage/SavedDataStorage.h b/Minecraft.World/net/minecraft/world/level/storage/SavedDataStorage.h similarity index 96% rename from Minecraft.World/Level/Storage/SavedDataStorage.h rename to Minecraft.World/net/minecraft/world/level/storage/SavedDataStorage.h index f214d47f2..cbb87f8b2 100644 --- a/Minecraft.World/Level/Storage/SavedDataStorage.h +++ b/Minecraft.World/net/minecraft/world/level/storage/SavedDataStorage.h @@ -1,7 +1,7 @@ #pragma once class ConsoleSaveFile; -#include "SavedData.h" +#include "../saveddata/SavedData.h" class SavedDataStorage { private: diff --git a/Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h b/Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h new file mode 100644 index 000000000..1ba7b8e8b --- /dev/null +++ b/Minecraft.World/net/minecraft/world/level/storage/net.minecraft.world.level.storage.h @@ -0,0 +1,17 @@ +#pragma once + +#include "DirectoryLevelStorage.h" +#include "DirectoryLevelStorageSource.h" +#include "LevelData.h" +#include "LevelStorage.h" +#include "LevelStorageProfilerDecorator.h" +#include "LevelStorageSource.h" +#include "LevelSummary.h" +#include "McRegionLevelStorage.h" +#include "McRegionLevelStorageSource.h" +// #include "MemoryLevelStorage.h" // 4J removed as unused +// #include "MemoryLevelStorageSource.h" // 4J removed as +// unused +#include "MockedLevelStorage.h" +#include "PlayerIO.h" +#include "SavedDataStorage.h" diff --git a/Minecraft.World/Blocks/AirTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/AirTile.cpp similarity index 61% rename from Minecraft.World/Blocks/AirTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/AirTile.cpp index ccad24637..ff10c8b82 100644 --- a/Minecraft.World/Blocks/AirTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/AirTile.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "AirTile.h" AirTile::AirTile(int id) : Tile(id, Material::air) {} diff --git a/Minecraft.World/Blocks/AirTile.h b/Minecraft.World/net/minecraft/world/level/tile/AirTile.h similarity index 77% rename from Minecraft.World/Blocks/AirTile.h rename to Minecraft.World/net/minecraft/world/level/tile/AirTile.h index c50484e95..a628bfbf7 100644 --- a/Minecraft.World/Blocks/AirTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/AirTile.h @@ -1,6 +1,6 @@ #pragma once #include "Tile.h" -#include "Material.h" +#include "../material/Material.h" class AirTile : public Tile { friend class Tile; diff --git a/Minecraft.World/Blocks/AnvilTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/AnvilTile.cpp similarity index 90% rename from Minecraft.World/Blocks/AnvilTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/AnvilTile.cpp index 7e4f025c1..04dd3d24b 100644 --- a/Minecraft.World/Blocks/AnvilTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/AnvilTile.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../../entity/item/net.minecraft.world.entity.item.h" +#include "../net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "../../net.minecraft.world.h" +#include "../../../net.minecraft.h" #include "AnvilTile.h" const unsigned int AnvilTile::ANVIL_NAMES[ANVIL_NAMES_LENGTH] = { diff --git a/Minecraft.World/Blocks/AnvilTile.h b/Minecraft.World/net/minecraft/world/level/tile/AnvilTile.h similarity index 100% rename from Minecraft.World/Blocks/AnvilTile.h rename to Minecraft.World/net/minecraft/world/level/tile/AnvilTile.h diff --git a/Minecraft.World/Blocks/BaseEntityTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/BaseEntityTile.cpp similarity index 84% rename from Minecraft.World/Blocks/BaseEntityTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/BaseEntityTile.cpp index c3344201f..3fcc70c67 100644 --- a/Minecraft.World/Blocks/BaseEntityTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/BaseEntityTile.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "TileEntities/TileEntity.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../../entity/net.minecraft.world.entity.h" +#include "entity/TileEntity.h" #include "BaseEntityTile.h" BaseEntityTile::BaseEntityTile(int id, Material* material, diff --git a/Minecraft.World/Blocks/BaseEntityTile.h b/Minecraft.World/net/minecraft/world/level/tile/BaseEntityTile.h similarity index 92% rename from Minecraft.World/Blocks/BaseEntityTile.h rename to Minecraft.World/net/minecraft/world/level/tile/BaseEntityTile.h index efb07a99c..e8fe9a49b 100644 --- a/Minecraft.World/Blocks/BaseEntityTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/BaseEntityTile.h @@ -1,6 +1,6 @@ #pragma once #include "Tile.h" -#include "TileEntities/EntityTile.h" +#include "EntityTile.h" class TileEntity; diff --git a/Minecraft.World/Blocks/BasePressurePlateTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/BasePressurePlateTile.cpp similarity index 93% rename from Minecraft.World/Blocks/BasePressurePlateTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/BasePressurePlateTile.cpp index 212fbb914..8e5571c84 100644 --- a/Minecraft.World/Blocks/BasePressurePlateTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/BasePressurePlateTile.cpp @@ -1,13 +1,13 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.redstone.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../redstone/net.minecraft.world.level.redstone.h" +#include "net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../../net.minecraft.h" +#include "../../net.minecraft.world.h" #include "BasePressurePlateTile.h" #include -#include "Util/AABB.h" +#include "../../phys/AABB.h" BasePressurePlateTile::BasePressurePlateTile(int id, const std::wstring& tex, Material* material) diff --git a/Minecraft.World/Blocks/BasePressurePlateTile.h b/Minecraft.World/net/minecraft/world/level/tile/BasePressurePlateTile.h similarity index 100% rename from Minecraft.World/Blocks/BasePressurePlateTile.h rename to Minecraft.World/net/minecraft/world/level/tile/BasePressurePlateTile.h diff --git a/Minecraft.World/Blocks/BaseRailTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/BaseRailTile.cpp similarity index 98% rename from Minecraft.World/Blocks/BaseRailTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/BaseRailTile.cpp index 26085e720..5b7f16893 100644 --- a/Minecraft.World/Blocks/BaseRailTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/BaseRailTile.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../net.minecraft.world.level.h" +#include "../../net.minecraft.world.h" #include "BaseRailTile.h" #include diff --git a/Minecraft.World/Blocks/BaseRailTile.h b/Minecraft.World/net/minecraft/world/level/tile/BaseRailTile.h similarity index 97% rename from Minecraft.World/Blocks/BaseRailTile.h rename to Minecraft.World/net/minecraft/world/level/tile/BaseRailTile.h index 23a7b45af..d0527a1ce 100644 --- a/Minecraft.World/Blocks/BaseRailTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/BaseRailTile.h @@ -1,7 +1,7 @@ #pragma once #include "Tile.h" -#include "../Level/TilePos.h" -#include "../Util/Definitions.h" +#include "../TilePos.h" +#include "../../../../../ConsoleHelpers/Definitions.h" class Random; class HitResult; diff --git a/Minecraft.World/Blocks/BeaconTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/BeaconTile.cpp similarity index 88% rename from Minecraft.World/Blocks/BeaconTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/BeaconTile.cpp index 5ed7c98e5..237c00ab7 100644 --- a/Minecraft.World/Blocks/BeaconTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/BeaconTile.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../net.minecraft.world.level.h" +#include "entity/net.minecraft.world.level.tile.entity.h" #include "BeaconTile.h" BeaconTile::BeaconTile(int id) : BaseEntityTile(id, Material::glass, false) { diff --git a/Minecraft.World/Blocks/BeaconTile.h b/Minecraft.World/net/minecraft/world/level/tile/BeaconTile.h similarity index 100% rename from Minecraft.World/Blocks/BeaconTile.h rename to Minecraft.World/net/minecraft/world/level/tile/BeaconTile.h diff --git a/Minecraft.World/Blocks/BedTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/BedTile.cpp similarity index 96% rename from Minecraft.World/Blocks/BedTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/BedTile.cpp index 2db5bdac6..50cc4e900 100644 --- a/Minecraft.World/Blocks/BedTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/BedTile.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Level/Dimensions/Dimension.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../dimension/Dimension.h" +#include "../../../net.minecraft.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.level.h" +#include "../../net.minecraft.world.h" #include "BedTile.h" int BedTile::HEAD_DIRECTION_OFFSETS[4][2] = {{0, 1}, {-1, 0}, {0, -1}, {1, 0}}; diff --git a/Minecraft.World/Blocks/BedTile.h b/Minecraft.World/net/minecraft/world/level/tile/BedTile.h similarity index 100% rename from Minecraft.World/Blocks/BedTile.h rename to Minecraft.World/net/minecraft/world/level/tile/BedTile.h diff --git a/Minecraft.World/Blocks/BookshelfTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/BookshelfTile.cpp similarity index 77% rename from Minecraft.World/Blocks/BookshelfTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/BookshelfTile.cpp index 461fd23fe..ebeeab986 100644 --- a/Minecraft.World/Blocks/BookshelfTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/BookshelfTile.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "BookshelfTile.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../../net.minecraft.h" BookshelfTile::BookshelfTile(int id) : Tile(id, Material::wood) {} diff --git a/Minecraft.World/Blocks/BookshelfTile.h b/Minecraft.World/net/minecraft/world/level/tile/BookshelfTile.h similarity index 89% rename from Minecraft.World/Blocks/BookshelfTile.h rename to Minecraft.World/net/minecraft/world/level/tile/BookshelfTile.h index a5c91f319..969ae8a83 100644 --- a/Minecraft.World/Blocks/BookshelfTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/BookshelfTile.h @@ -1,6 +1,6 @@ #pragma once #include "Tile.h" -#include "Material.h" +#include "../material/Material.h" class Random; diff --git a/Minecraft.World/Blocks/BrewingStandTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/BrewingStandTile.cpp similarity index 93% rename from Minecraft.World/Blocks/BrewingStandTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/BrewingStandTile.cpp index d901e8472..8644e786c 100644 --- a/Minecraft.World/Blocks/BrewingStandTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/BrewingStandTile.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "BrewingStandTile.h" -#include "TileEntities/BrewingStandTileEntity.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.world.inventory.h" +#include "entity/BrewingStandTileEntity.h" +#include "../net.minecraft.world.level.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../entity/item/net.minecraft.world.entity.item.h" +#include "../../net.minecraft.world.h" +#include "../../inventory/net.minecraft.world.inventory.h" BrewingStandTile::BrewingStandTile(int id) : BaseEntityTile(id, Material::metal, false) { diff --git a/Minecraft.World/Blocks/BrewingStandTile.h b/Minecraft.World/net/minecraft/world/level/tile/BrewingStandTile.h similarity index 100% rename from Minecraft.World/Blocks/BrewingStandTile.h rename to Minecraft.World/net/minecraft/world/level/tile/BrewingStandTile.h diff --git a/Minecraft.World/Blocks/ButtonTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/ButtonTile.cpp similarity index 96% rename from Minecraft.World/Blocks/ButtonTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/ButtonTile.cpp index b77abf25d..fd625b758 100644 --- a/Minecraft.World/Blocks/ButtonTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/ButtonTile.cpp @@ -1,12 +1,12 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.projectile.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.redstone.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../net.minecraft.world.level.h" +#include "../redstone/net.minecraft.world.level.redstone.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../../net.minecraft.h" #include "ButtonTile.h" #include -#include "../Util/SoundTypes.h" +#include "../../../../../Header Files/SoundTypes.h" ButtonTile::ButtonTile(int id, bool sensitive) : Tile(id, Material::decoration, false) { diff --git a/Minecraft.World/Blocks/ButtonTile.h b/Minecraft.World/net/minecraft/world/level/tile/ButtonTile.h similarity index 98% rename from Minecraft.World/Blocks/ButtonTile.h rename to Minecraft.World/net/minecraft/world/level/tile/ButtonTile.h index 570dc1be0..7ab9b2819 100644 --- a/Minecraft.World/Blocks/ButtonTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/ButtonTile.h @@ -1,6 +1,6 @@ #pragma once #include "Tile.h" -#include "../Util/Definitions.h" +#include "../../../../../ConsoleHelpers/Definitions.h" class Player; class Random; diff --git a/Minecraft.World/Blocks/CactusTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/CactusTile.cpp similarity index 87% rename from Minecraft.World/Blocks/CactusTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/CactusTile.cpp index 8ce97f40a..9950a3489 100644 --- a/Minecraft.World/Blocks/CactusTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/CactusTile.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.material.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.damagesource.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../material/net.minecraft.world.level.material.h" +#include "../../entity/net.minecraft.world.entity.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../damageSource/net.minecraft.world.damagesource.h" +#include "../../../net.minecraft.h" +#include "../../net.minecraft.world.h" #include "CactusTile.h" CactusTile::CactusTile(int id) : Tile(id, Material::cactus, false) { diff --git a/Minecraft.World/Blocks/CactusTile.h b/Minecraft.World/net/minecraft/world/level/tile/CactusTile.h similarity index 93% rename from Minecraft.World/Blocks/CactusTile.h rename to Minecraft.World/net/minecraft/world/level/tile/CactusTile.h index c35dc18a2..b2df17eff 100644 --- a/Minecraft.World/Blocks/CactusTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/CactusTile.h @@ -1,7 +1,7 @@ #pragma once #include "Tile.h" -#include "Material.h" -#include "../Util/Definitions.h" +#include "../material/Material.h" +#include "../../../../../ConsoleHelpers/Definitions.h" class Random; class Level; diff --git a/Minecraft.World/Blocks/CakeTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/CakeTile.cpp similarity index 90% rename from Minecraft.World/Blocks/CakeTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/CakeTile.cpp index 83b2749f7..a3464c3d9 100644 --- a/Minecraft.World/Blocks/CakeTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/CakeTile.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.food.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../../food/net.minecraft.world.food.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../net.minecraft.world.h" +#include "../../../net.minecraft.h" #include "CakeTile.h" CakeTile::CakeTile(int id) : Tile(id, Material::cake, false) { diff --git a/Minecraft.World/Blocks/CakeTile.h b/Minecraft.World/net/minecraft/world/level/tile/CakeTile.h similarity index 95% rename from Minecraft.World/Blocks/CakeTile.h rename to Minecraft.World/net/minecraft/world/level/tile/CakeTile.h index b2f2a3655..3932cc847 100644 --- a/Minecraft.World/Blocks/CakeTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/CakeTile.h @@ -1,7 +1,7 @@ #pragma once #include "Tile.h" -#include "Material.h" -#include "../Util/Definitions.h" +#include "../material/Material.h" +#include "../../../../../ConsoleHelpers/Definitions.h" class Player; class Random; diff --git a/Minecraft.World/Blocks/CarrotTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/CarrotTile.cpp similarity index 82% rename from Minecraft.World/Blocks/CarrotTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/CarrotTile.cpp index c5e118d5d..3f7e71e9b 100644 --- a/Minecraft.World/Blocks/CarrotTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/CarrotTile.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.h" +#include "../../item/net.minecraft.world.item.h" #include "CarrotTile.h" CarrotTile::CarrotTile(int id) : CropTile(id) {} diff --git a/Minecraft.World/Blocks/CarrotTile.h b/Minecraft.World/net/minecraft/world/level/tile/CarrotTile.h similarity index 100% rename from Minecraft.World/Blocks/CarrotTile.h rename to Minecraft.World/net/minecraft/world/level/tile/CarrotTile.h diff --git a/Minecraft.World/Blocks/CauldronTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/CauldronTile.cpp similarity index 93% rename from Minecraft.World/Blocks/CauldronTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/CauldronTile.cpp index 5aeacabf6..b5bac92fd 100644 --- a/Minecraft.World/Blocks/CauldronTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/CauldronTile.cpp @@ -1,12 +1,12 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "CauldronTile.h" -#include "../Util/Facing.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.h" -#include "../../Minecraft.Client/Player/ServerPlayer.h" +#include "../../../Facing.h" +#include "../net.minecraft.world.level.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../entity/item/net.minecraft.world.entity.item.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../../net.minecraft.world.h" +#include "../../Minecraft.Client/net/minecraft/server/level/ServerPlayer.h" const std::wstring CauldronTile::TEXTURE_INSIDE = L"cauldron_inner"; const std::wstring CauldronTile::TEXTURE_BOTTOM = L"cauldron_bottom"; diff --git a/Minecraft.World/Blocks/CauldronTile.h b/Minecraft.World/net/minecraft/world/level/tile/CauldronTile.h similarity index 100% rename from Minecraft.World/Blocks/CauldronTile.h rename to Minecraft.World/net/minecraft/world/level/tile/CauldronTile.h diff --git a/Minecraft.World/Blocks/ChestTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/ChestTile.cpp similarity index 96% rename from Minecraft.World/Blocks/ChestTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/ChestTile.cpp index aaf41500f..ae213494c 100644 --- a/Minecraft.World/Blocks/ChestTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/ChestTile.cpp @@ -1,15 +1,15 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.entity.animal.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.redstone.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "../Headers/net.minecraft.world.phys.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.h" +#include "../net.minecraft.world.level.h" +#include "../../entity/item/net.minecraft.world.entity.item.h" +#include "../../entity/animal/net.minecraft.world.entity.animal.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../../item/net.minecraft.world.item.h" +#include "../redstone/net.minecraft.world.level.redstone.h" +#include "entity/net.minecraft.world.level.tile.entity.h" +#include "../../phys/net.minecraft.world.phys.h" #include "ChestTile.h" -#include "../Util/Facing.h" +#include "../../../Facing.h" ChestTile::ChestTile(int id, int type) : BaseEntityTile(id, Material::wood, false) { diff --git a/Minecraft.World/Blocks/ChestTile.h b/Minecraft.World/net/minecraft/world/level/tile/ChestTile.h similarity index 98% rename from Minecraft.World/Blocks/ChestTile.h rename to Minecraft.World/net/minecraft/world/level/tile/ChestTile.h index ace667ca9..f9b998fb2 100644 --- a/Minecraft.World/Blocks/ChestTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/ChestTile.h @@ -1,6 +1,6 @@ #pragma once #include "BaseEntityTile.h" -#include "Material.h" +#include "../material/Material.h" class Player; class Random; diff --git a/Minecraft.World/Blocks/ClayTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/ClayTile.cpp similarity index 71% rename from Minecraft.World/Blocks/ClayTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/ClayTile.cpp index b52ecefdb..c2a6ff020 100644 --- a/Minecraft.World/Blocks/ClayTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/ClayTile.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "ClayTile.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../item/net.minecraft.world.item.h" ClayTile::ClayTile(int id) : Tile(id, Material::clay) {} diff --git a/Minecraft.World/Blocks/ClayTile.h b/Minecraft.World/net/minecraft/world/level/tile/ClayTile.h similarity index 87% rename from Minecraft.World/Blocks/ClayTile.h rename to Minecraft.World/net/minecraft/world/level/tile/ClayTile.h index 8395fa325..83855f0c6 100644 --- a/Minecraft.World/Blocks/ClayTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/ClayTile.h @@ -1,6 +1,6 @@ #pragma once #include "Tile.h" -#include "Material.h" +#include "../material/Material.h" class Random; diff --git a/Minecraft.World/Blocks/CocoaTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/CocoaTile.cpp similarity index 94% rename from Minecraft.World/Blocks/CocoaTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/CocoaTile.cpp index 7c06ba874..2ab3a4081 100644 --- a/Minecraft.World/Blocks/CocoaTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/CocoaTile.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "../../net.minecraft.world.h" +#include "../../../net.minecraft.h" #include "CocoaTile.h" -#include "Util/AABB.h" +#include "../../phys/AABB.h" const std::wstring CocoaTile::TEXTURE_AGES[] = {L"cocoa_0", L"cocoa_1", L"cocoa_2"}; diff --git a/Minecraft.World/Blocks/CocoaTile.h b/Minecraft.World/net/minecraft/world/level/tile/CocoaTile.h similarity index 100% rename from Minecraft.World/Blocks/CocoaTile.h rename to Minecraft.World/net/minecraft/world/level/tile/CocoaTile.h diff --git a/Minecraft.World/Blocks/ColoredTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/ColoredTile.cpp similarity index 83% rename from Minecraft.World/Blocks/ColoredTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/ColoredTile.cpp index 3f2be2ebd..506a9d99f 100644 --- a/Minecraft.World/Blocks/ColoredTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/ColoredTile.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.h" +#include "../../item/net.minecraft.world.item.h" #include "ColoredTile.h" ColoredTile::ColoredTile(int id, Material* material) : Tile(id, material) {} diff --git a/Minecraft.World/Blocks/ColoredTile.h b/Minecraft.World/net/minecraft/world/level/tile/ColoredTile.h similarity index 100% rename from Minecraft.World/Blocks/ColoredTile.h rename to Minecraft.World/net/minecraft/world/level/tile/ColoredTile.h diff --git a/Minecraft.World/Blocks/CommandBlock.cpp b/Minecraft.World/net/minecraft/world/level/tile/CommandBlock.cpp similarity index 93% rename from Minecraft.World/Blocks/CommandBlock.cpp rename to Minecraft.World/net/minecraft/world/level/tile/CommandBlock.cpp index 3666dd549..e3bf2f200 100644 --- a/Minecraft.World/Blocks/CommandBlock.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/CommandBlock.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.redstone.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../redstone/net.minecraft.world.level.redstone.h" +#include "entity/net.minecraft.world.level.tile.entity.h" #include "CommandBlock.h" CommandBlock::CommandBlock(int id) diff --git a/Minecraft.World/Blocks/CommandBlock.h b/Minecraft.World/net/minecraft/world/level/tile/CommandBlock.h similarity index 100% rename from Minecraft.World/Blocks/CommandBlock.h rename to Minecraft.World/net/minecraft/world/level/tile/CommandBlock.h diff --git a/Minecraft.World/Blocks/ComparatorTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/ComparatorTile.cpp similarity index 95% rename from Minecraft.World/Blocks/ComparatorTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/ComparatorTile.cpp index a236a93a5..7958c2388 100644 --- a/Minecraft.World/Blocks/ComparatorTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/ComparatorTile.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.redstone.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "../Headers/net.minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.level.h" +#include "../redstone/net.minecraft.world.level.redstone.h" +#include "net.minecraft.world.level.tile.h" +#include "entity/net.minecraft.world.level.tile.entity.h" +#include "../../../net.minecraft.h" #include "ComparatorTile.h" ComparatorTile::ComparatorTile(int id, bool on) : DiodeTile(id, on) { diff --git a/Minecraft.World/Blocks/ComparatorTile.h b/Minecraft.World/net/minecraft/world/level/tile/ComparatorTile.h similarity index 98% rename from Minecraft.World/Blocks/ComparatorTile.h rename to Minecraft.World/net/minecraft/world/level/tile/ComparatorTile.h index 55d0712bf..135b71a47 100644 --- a/Minecraft.World/Blocks/ComparatorTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/ComparatorTile.h @@ -1,7 +1,7 @@ #pragma once #include "DiodeTile.h" -#include "TileEntities/EntityTile.h" +#include "EntityTile.h" class ComparatorTileEntity; diff --git a/Minecraft.World/Blocks/CoralTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/CoralTile.cpp similarity index 92% rename from Minecraft.World/Blocks/CoralTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/CoralTile.cpp index 15e1ba607..2277ebf79 100644 --- a/Minecraft.World/Blocks/CoralTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/CoralTile.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "CoralTile.h" CoralTile::CoralTile(int id) diff --git a/Minecraft.World/Blocks/CoralTile.h b/Minecraft.World/net/minecraft/world/level/tile/CoralTile.h similarity index 90% rename from Minecraft.World/Blocks/CoralTile.h rename to Minecraft.World/net/minecraft/world/level/tile/CoralTile.h index 54564c96e..7e965bda8 100644 --- a/Minecraft.World/Blocks/CoralTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/CoralTile.h @@ -1,6 +1,6 @@ #pragma once #include "HalfTransparentTile.h" -#include "Material.h" +#include "../material/Material.h" class CoralTile : public HalfTransparentTile { public: diff --git a/Minecraft.World/Blocks/CropTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/CropTile.cpp similarity index 94% rename from Minecraft.World/Blocks/CropTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/CropTile.cpp index 736404696..e38d3f4a9 100644 --- a/Minecraft.World/Blocks/CropTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/CropTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../../entity/item/net.minecraft.world.entity.item.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../net.minecraft.world.h" #include "CropTile.h" CropTile::CropTile(int id) : Bush(id) { diff --git a/Minecraft.World/Blocks/CropTile.h b/Minecraft.World/net/minecraft/world/level/tile/CropTile.h similarity index 97% rename from Minecraft.World/Blocks/CropTile.h rename to Minecraft.World/net/minecraft/world/level/tile/CropTile.h index 02e9fe38f..61e83513c 100644 --- a/Minecraft.World/Blocks/CropTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/CropTile.h @@ -1,6 +1,6 @@ #pragma once #include "PlantTile.h" -#include "Material.h" +#include "../material/Material.h" class Random; class Level; diff --git a/Minecraft.World/Blocks/DaylightDetectorTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/DaylightDetectorTile.cpp similarity index 87% rename from Minecraft.World/Blocks/DaylightDetectorTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/DaylightDetectorTile.cpp index f001325b8..a1b3a7b81 100644 --- a/Minecraft.World/Blocks/DaylightDetectorTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/DaylightDetectorTile.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.level.dimension.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.redstone.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "../Headers/net.minecraft.world.h" -#include "../Util/JavaMath.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../net.minecraft.h" +#include "../dimension/net.minecraft.world.level.dimension.h" +#include "../net.minecraft.world.level.h" +#include "../redstone/net.minecraft.world.level.redstone.h" +#include "entity/net.minecraft.world.level.tile.entity.h" +#include "../../net.minecraft.world.h" +#include "../../../../../ConsoleJavaLibs/JavaMath.h" #include "DaylightDetectorTile.h" DaylightDetectorTile::DaylightDetectorTile(int id) diff --git a/Minecraft.World/Blocks/DaylightDetectorTile.h b/Minecraft.World/net/minecraft/world/level/tile/DaylightDetectorTile.h similarity index 100% rename from Minecraft.World/Blocks/DaylightDetectorTile.h rename to Minecraft.World/net/minecraft/world/level/tile/DaylightDetectorTile.h diff --git a/Minecraft.World/Blocks/DeadBushTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/DeadBushTile.cpp similarity index 81% rename from Minecraft.World/Blocks/DeadBushTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/DeadBushTile.cpp index 288f0ac1e..9f2ae079c 100644 --- a/Minecraft.World/Blocks/DeadBushTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/DeadBushTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.stats.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../stats/net.minecraft.stats.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.level.h" #include "DeadBushTile.h" DeadBushTile::DeadBushTile(int id) : Bush(id, Material::replaceable_plant) { diff --git a/Minecraft.World/Blocks/DeadBushTile.h b/Minecraft.World/net/minecraft/world/level/tile/DeadBushTile.h similarity index 100% rename from Minecraft.World/Blocks/DeadBushTile.h rename to Minecraft.World/net/minecraft/world/level/tile/DeadBushTile.h diff --git a/Minecraft.World/Blocks/DetectorRailTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/DetectorRailTile.cpp similarity index 90% rename from Minecraft.World/Blocks/DetectorRailTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/DetectorRailTile.cpp index 722e0eef4..ad13b3944 100644 --- a/Minecraft.World/Blocks/DetectorRailTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/DetectorRailTile.cpp @@ -1,13 +1,13 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.inventory.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.redstone.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../inventory/net.minecraft.world.inventory.h" +#include "../net.minecraft.world.level.h" +#include "../redstone/net.minecraft.world.level.redstone.h" +#include "../../entity/net.minecraft.world.entity.h" +#include "../../entity/item/net.minecraft.world.entity.item.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../net.minecraft.world.h" #include "DetectorRailTile.h" -#include "../Headers/net.minecraft.h" +#include "../../../net.minecraft.h" DetectorRailTile::DetectorRailTile(int id) : BaseRailTile(id, true) { setTicking(true); diff --git a/Minecraft.World/Blocks/DetectorRailTile.h b/Minecraft.World/net/minecraft/world/level/tile/DetectorRailTile.h similarity index 100% rename from Minecraft.World/Blocks/DetectorRailTile.h rename to Minecraft.World/net/minecraft/world/level/tile/DetectorRailTile.h diff --git a/Minecraft.World/Blocks/DiodeTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/DiodeTile.cpp similarity index 96% rename from Minecraft.World/Blocks/DiodeTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/DiodeTile.cpp index 3d5753752..474608bdf 100644 --- a/Minecraft.World/Blocks/DiodeTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/DiodeTile.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.level.redstone.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../net.minecraft.h" +#include "../redstone/net.minecraft.world.level.redstone.h" +#include "../net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../entity/net.minecraft.world.entity.h" +#include "../../net.minecraft.world.h" #include "DiodeTile.h" DiodeTile::DiodeTile(int id, bool on) diff --git a/Minecraft.World/Blocks/DiodeTile.h b/Minecraft.World/net/minecraft/world/level/tile/DiodeTile.h similarity index 100% rename from Minecraft.World/Blocks/DiodeTile.h rename to Minecraft.World/net/minecraft/world/level/tile/DiodeTile.h diff --git a/Minecraft.World/Blocks/DirectionalTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/DirectionalTile.cpp similarity index 82% rename from Minecraft.World/Blocks/DirectionalTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/DirectionalTile.cpp index 6b4735d30..fc5a8e1c1 100644 --- a/Minecraft.World/Blocks/DirectionalTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/DirectionalTile.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "DirectionalTile.h" diff --git a/Minecraft.World/Blocks/DirectionalTile.h b/Minecraft.World/net/minecraft/world/level/tile/DirectionalTile.h similarity index 100% rename from Minecraft.World/Blocks/DirectionalTile.h rename to Minecraft.World/net/minecraft/world/level/tile/DirectionalTile.h diff --git a/Minecraft.World/Blocks/DirtTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/DirtTile.cpp similarity index 62% rename from Minecraft.World/Blocks/DirtTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/DirtTile.cpp index adffc8c64..515d88e6f 100644 --- a/Minecraft.World/Blocks/DirtTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/DirtTile.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "DirtTile.h" DirtTile::DirtTile(int id) : Tile(id, Material::dirt) {} \ No newline at end of file diff --git a/Minecraft.World/Blocks/DirtTile.h b/Minecraft.World/net/minecraft/world/level/tile/DirtTile.h similarity index 100% rename from Minecraft.World/Blocks/DirtTile.h rename to Minecraft.World/net/minecraft/world/level/tile/DirtTile.h diff --git a/Minecraft.World/Blocks/DispenserTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/DispenserTile.cpp similarity index 92% rename from Minecraft.World/Blocks/DispenserTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/DispenserTile.cpp index bb29a41dd..532fbaabc 100644 --- a/Minecraft.World/Blocks/DispenserTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/DispenserTile.cpp @@ -1,16 +1,16 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.projectile.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.inventory.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/item/net.minecraft.world.entity.item.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../../entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../inventory/net.minecraft.world.inventory.h" +#include "../net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "entity/net.minecraft.world.level.tile.entity.h" +#include "../../net.minecraft.world.h" #include "DispenserTile.h" -#include "../Headers/net.minecraft.h" -#include "../Entities/Mob.h" +#include "../../../net.minecraft.h" +#include "../../entity/Mob.h" BehaviorRegistry DispenserTile::REGISTRY = BehaviorRegistry(new DefaultDispenseItemBehavior()); diff --git a/Minecraft.World/Blocks/DispenserTile.h b/Minecraft.World/net/minecraft/world/level/tile/DispenserTile.h similarity index 97% rename from Minecraft.World/Blocks/DispenserTile.h rename to Minecraft.World/net/minecraft/world/level/tile/DispenserTile.h index de051f1f7..95c3ee0ad 100644 --- a/Minecraft.World/Blocks/DispenserTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/DispenserTile.h @@ -1,6 +1,6 @@ #pragma once #include "BaseEntityTile.h" -#include "../Headers/net.minecraft.core.h" +#include "../../../core/net.minecraft.core.h" class Player; class Mob; diff --git a/Minecraft.World/Blocks/DoorTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/DoorTile.cpp similarity index 96% rename from Minecraft.World/Blocks/DoorTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/DoorTile.cpp index 5e3faf703..3f5bc1d00 100644 --- a/Minecraft.World/Blocks/DoorTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/DoorTile.cpp @@ -1,12 +1,12 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.phys.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../../phys/net.minecraft.world.phys.h" #include "DoorTile.h" -#include "../Level/Events/LevelEvent.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.h" +#include "LevelEvent.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../../net.minecraft.world.h" +#include "../../../net.minecraft.h" const std::wstring DoorTile::TEXTURES[] = { L"doorWood_lower", L"doorWood_upper", L"doorIron_lower", L"doorIron_upper"}; diff --git a/Minecraft.World/Blocks/DoorTile.h b/Minecraft.World/net/minecraft/world/level/tile/DoorTile.h similarity index 98% rename from Minecraft.World/Blocks/DoorTile.h rename to Minecraft.World/net/minecraft/world/level/tile/DoorTile.h index 3f844a27d..245a7f1b4 100644 --- a/Minecraft.World/Blocks/DoorTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/DoorTile.h @@ -1,6 +1,6 @@ #pragma once #include "Tile.h" -#include "../Util/Definitions.h" +#include "../../../../../ConsoleHelpers/Definitions.h" class Player; class HitResult; diff --git a/Minecraft.World/Blocks/DropperTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/DropperTile.cpp similarity index 87% rename from Minecraft.World/Blocks/DropperTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/DropperTile.cpp index 906a6e380..11559852f 100644 --- a/Minecraft.World/Blocks/DropperTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/DropperTile.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.core.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "entity/net.minecraft.world.level.tile.entity.h" +#include "../../../net.minecraft.h" +#include "../../net.minecraft.world.h" +#include "../../../core/net.minecraft.core.h" #include "DropperTile.h" DropperTile::DropperTile(int id) : DispenserTile(id) { diff --git a/Minecraft.World/Blocks/DropperTile.h b/Minecraft.World/net/minecraft/world/level/tile/DropperTile.h similarity index 100% rename from Minecraft.World/Blocks/DropperTile.h rename to Minecraft.World/net/minecraft/world/level/tile/DropperTile.h diff --git a/Minecraft.World/Blocks/EggTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/EggTile.cpp similarity index 96% rename from Minecraft.World/Blocks/EggTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/EggTile.cpp index 67fd2e1e9..39494bcda 100644 --- a/Minecraft.World/Blocks/EggTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/EggTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "EggTile.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.entity.item.h" +#include "../net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "../../entity/item/net.minecraft.world.entity.item.h" EggTile::EggTile(int id) : Tile(id, Material::egg, false) {} diff --git a/Minecraft.World/Blocks/EggTile.h b/Minecraft.World/net/minecraft/world/level/tile/EggTile.h similarity index 100% rename from Minecraft.World/Blocks/EggTile.h rename to Minecraft.World/net/minecraft/world/level/tile/EggTile.h diff --git a/Minecraft.World/Blocks/EnchantmentTableTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/EnchantmentTableTile.cpp similarity index 94% rename from Minecraft.World/Blocks/EnchantmentTableTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/EnchantmentTableTile.cpp index 9cd0c39be..5e8fee7b5 100644 --- a/Minecraft.World/Blocks/EnchantmentTableTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/EnchantmentTableTile.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "EnchantmentTableTile.h" -#include "TileEntities/EnchantmentTableTileEntity.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.h" +#include "entity/EnchantmentTableTileEntity.h" +#include "../net.minecraft.world.level.h" +#include "../../../net.minecraft.h" +#include "../../net.minecraft.world.h" const std::wstring EnchantmentTableTile::TEXTURE_SIDE = L"enchantment_side"; const std::wstring EnchantmentTableTile::TEXTURE_TOP = L"enchantment_top"; diff --git a/Minecraft.World/Blocks/EnchantmentTableTile.h b/Minecraft.World/net/minecraft/world/level/tile/EnchantmentTableTile.h similarity index 100% rename from Minecraft.World/Blocks/EnchantmentTableTile.h rename to Minecraft.World/net/minecraft/world/level/tile/EnchantmentTableTile.h diff --git a/Minecraft.World/Blocks/EnderChestTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/EnderChestTile.cpp similarity index 90% rename from Minecraft.World/Blocks/EnderChestTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/EnderChestTile.cpp index 36c4185bf..39e4f2b04 100644 --- a/Minecraft.World/Blocks/EnderChestTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/EnderChestTile.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/net.minecraft.world.entity.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../net.minecraft.world.level.h" +#include "entity/net.minecraft.world.level.tile.entity.h" +#include "../../net.minecraft.world.h" +#include "../../../net.minecraft.h" #include "EnderChestTile.h" EnderChestTile::EnderChestTile(int id) diff --git a/Minecraft.World/Blocks/EnderChestTile.h b/Minecraft.World/net/minecraft/world/level/tile/EnderChestTile.h similarity index 100% rename from Minecraft.World/Blocks/EnderChestTile.h rename to Minecraft.World/net/minecraft/world/level/tile/EnderChestTile.h diff --git a/Minecraft.World/Blocks/TileEntities/EntityTile.h b/Minecraft.World/net/minecraft/world/level/tile/EntityTile.h similarity index 100% rename from Minecraft.World/Blocks/TileEntities/EntityTile.h rename to Minecraft.World/net/minecraft/world/level/tile/EntityTile.h diff --git a/Minecraft.World/Blocks/FarmTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/FarmTile.cpp similarity index 94% rename from Minecraft.World/Blocks/FarmTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/FarmTile.cpp index 732103c05..19b18ae8e 100644 --- a/Minecraft.World/Blocks/FarmTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/FarmTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../../net.minecraft.h" +#include "../../net.minecraft.world.h" #include "FarmTile.h" FarmTile::FarmTile(int id) : Tile(id, Material::dirt, false) { diff --git a/Minecraft.World/Blocks/FarmTile.h b/Minecraft.World/net/minecraft/world/level/tile/FarmTile.h similarity index 95% rename from Minecraft.World/Blocks/FarmTile.h rename to Minecraft.World/net/minecraft/world/level/tile/FarmTile.h index ee7a7e3df..cfa9f9a4f 100644 --- a/Minecraft.World/Blocks/FarmTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/FarmTile.h @@ -1,6 +1,6 @@ #pragma once #include "Tile.h" -#include "../Util/Definitions.h" +#include "../../../../../ConsoleHelpers/Definitions.h" class Random; class ChunkRebuildData; diff --git a/Minecraft.World/Blocks/FenceGateTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/FenceGateTile.cpp similarity index 95% rename from Minecraft.World/Blocks/FenceGateTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/FenceGateTile.cpp index bdb608dda..5cc32d7af 100644 --- a/Minecraft.World/Blocks/FenceGateTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/FenceGateTile.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "FenceGateTile.h" -#include "../Util/AABB.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.h" -#include "../Level/Events/LevelEvent.h" -#include "Util/Direction.h" +#include "../../phys/AABB.h" +#include "../net.minecraft.world.level.h" +#include "../../../net.minecraft.h" +#include "LevelEvent.h" +#include "../../../Direction.h" FenceGateTile::FenceGateTile(int id) : DirectionalTile(id, Material::wood, false) {} diff --git a/Minecraft.World/Blocks/FenceGateTile.h b/Minecraft.World/net/minecraft/world/level/tile/FenceGateTile.h similarity index 100% rename from Minecraft.World/Blocks/FenceGateTile.h rename to Minecraft.World/net/minecraft/world/level/tile/FenceGateTile.h diff --git a/Minecraft.World/Blocks/FenceTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/FenceTile.cpp similarity index 95% rename from Minecraft.World/Blocks/FenceTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/FenceTile.cpp index b8084d0d5..4163b0444 100644 --- a/Minecraft.World/Blocks/FenceTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/FenceTile.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.level.h" +#include "../../net.minecraft.world.h" #include "FenceTile.h" FenceTile::FenceTile(int id, const std::wstring& texture, Material* material) diff --git a/Minecraft.World/Blocks/FenceTile.h b/Minecraft.World/net/minecraft/world/level/tile/FenceTile.h similarity index 95% rename from Minecraft.World/Blocks/FenceTile.h rename to Minecraft.World/net/minecraft/world/level/tile/FenceTile.h index 1645c9bb7..f5dad4016 100644 --- a/Minecraft.World/Blocks/FenceTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/FenceTile.h @@ -1,6 +1,6 @@ #pragma once #include "Tile.h" -#include "../Util/Definitions.h" +#include "../../../../../ConsoleHelpers/Definitions.h" class FenceTile : public Tile { private: diff --git a/Minecraft.World/Blocks/FireTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/FireTile.cpp similarity index 95% rename from Minecraft.World/Blocks/FireTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/FireTile.cpp index 3ee78cdbb..203cf7394 100644 --- a/Minecraft.World/Blocks/FireTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/FireTile.cpp @@ -1,17 +1,17 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.dimension.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../dimension/net.minecraft.world.level.dimension.h" +#include "../../net.minecraft.world.h" +#include "net.minecraft.world.level.tile.h" #include "FireTile.h" -#include "../Util/SoundTypes.h" -#include "../../Minecraft.Client/MinecraftServer.h" -#include "../../Minecraft.Client/Network/PlayerList.h" -#include "Util/AABB.h" +#include "../../../../../Header Files/SoundTypes.h" +#include "../../Minecraft.Client/net/minecraft/server/MinecraftServer.h" +#include "../../Minecraft.Client/net/minecraft/server/PlayerList.h" +#include "../../phys/AABB.h" // AP - added for Vita to set Alpha Cut out -#include "../IO/Streams/IntBuffer.h" -#include "../../Minecraft.Client/Rendering/Tesselator.h" +#include "../../../../../ConsoleJavaLibs/IntBuffer.h" +#include "../../Minecraft.Client/net/minecraft/client/renderer/Tesselator.h" const std::wstring FireTile::TEXTURE_FIRST = L"fire_0"; const std::wstring FireTile::TEXTURE_SECOND = L"fire_1"; diff --git a/Minecraft.World/Blocks/FireTile.h b/Minecraft.World/net/minecraft/world/level/tile/FireTile.h similarity index 97% rename from Minecraft.World/Blocks/FireTile.h rename to Minecraft.World/net/minecraft/world/level/tile/FireTile.h index c93e7e94f..a120d4e03 100644 --- a/Minecraft.World/Blocks/FireTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/FireTile.h @@ -1,6 +1,6 @@ #pragma once #include "Tile.h" -#include "../Util/Definitions.h" +#include "../../../../../ConsoleHelpers/Definitions.h" class Random; class ChunkRebuildData; diff --git a/Minecraft.World/Blocks/FlowerPotTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/FlowerPotTile.cpp similarity index 95% rename from Minecraft.World/Blocks/FlowerPotTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/FlowerPotTile.cpp index 5c9ff9835..acb790fe2 100644 --- a/Minecraft.World/Blocks/FlowerPotTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/FlowerPotTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" #include "FlowerPotTile.h" FlowerPotTile::FlowerPotTile(int id) : Tile(id, Material::decoration, false) { diff --git a/Minecraft.World/Blocks/FlowerPotTile.h b/Minecraft.World/net/minecraft/world/level/tile/FlowerPotTile.h similarity index 100% rename from Minecraft.World/Blocks/FlowerPotTile.h rename to Minecraft.World/net/minecraft/world/level/tile/FlowerPotTile.h diff --git a/Minecraft.World/Blocks/FurnaceTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/FurnaceTile.cpp similarity index 94% rename from Minecraft.World/Blocks/FurnaceTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/FurnaceTile.cpp index d9dc2092f..f44e4460b 100644 --- a/Minecraft.World/Blocks/FurnaceTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/FurnaceTile.cpp @@ -1,14 +1,14 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.inventory.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../../entity/item/net.minecraft.world.entity.item.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../inventory/net.minecraft.world.inventory.h" +#include "entity/net.minecraft.world.level.tile.entity.h" +#include "../../net.minecraft.world.h" #include "FurnaceTile.h" -#include "../Entities/Mob.h" -#include "../Util/Facing.h" +#include "../../entity/Mob.h" +#include "../../../Facing.h" bool FurnaceTile::noDrop = false; diff --git a/Minecraft.World/Blocks/FurnaceTile.h b/Minecraft.World/net/minecraft/world/level/tile/FurnaceTile.h similarity index 100% rename from Minecraft.World/Blocks/FurnaceTile.h rename to Minecraft.World/net/minecraft/world/level/tile/FurnaceTile.h diff --git a/Minecraft.World/Blocks/GlassTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/GlassTile.cpp similarity index 89% rename from Minecraft.World/Blocks/GlassTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/GlassTile.cpp index fdc9f0abc..a9fe80f22 100644 --- a/Minecraft.World/Blocks/GlassTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/GlassTile.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "GlassTile.h" GlassTile::GlassTile(int id, Material* material, bool allowSame) diff --git a/Minecraft.World/Blocks/GlassTile.h b/Minecraft.World/net/minecraft/world/level/tile/GlassTile.h similarity index 100% rename from Minecraft.World/Blocks/GlassTile.h rename to Minecraft.World/net/minecraft/world/level/tile/GlassTile.h diff --git a/Minecraft.World/Blocks/GlowstoneTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/GlowstoneTile.cpp similarity index 84% rename from Minecraft.World/Blocks/GlowstoneTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/GlowstoneTile.cpp index ced4026bd..6c30adfb3 100644 --- a/Minecraft.World/Blocks/GlowstoneTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/GlowstoneTile.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "GlowstoneTile.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../item/net.minecraft.world.item.h" Glowstonetile::Glowstonetile(int id, Material* material) : Tile(id, material) {} diff --git a/Minecraft.World/Blocks/GlowstoneTile.h b/Minecraft.World/net/minecraft/world/level/tile/GlowstoneTile.h similarity index 100% rename from Minecraft.World/Blocks/GlowstoneTile.h rename to Minecraft.World/net/minecraft/world/level/tile/GlowstoneTile.h diff --git a/Minecraft.World/Blocks/GrassTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/GrassTile.cpp similarity index 90% rename from Minecraft.World/Blocks/GrassTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/GrassTile.cpp index 0781505d4..d0b90c6d4 100644 --- a/Minecraft.World/Blocks/GrassTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/GrassTile.cpp @@ -1,14 +1,14 @@ -#include "../Platform/stdafx.h" -#include "../../Minecraft.Client/Minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../Minecraft.Client/net/minecraft/client/Minecraft.h" #include "GrassTile.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.biome.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.h" +#include "../net.minecraft.world.level.h" +#include "../biome/net.minecraft.world.level.biome.h" +#include "../../../net.minecraft.h" +#include "../../net.minecraft.world.h" // AP - included for PSVita Alpha cut out optimisation -#include "../IO/Streams/IntBuffer.h" -#include "../../Minecraft.Client/Rendering/Tesselator.h" +#include "../../../../../ConsoleJavaLibs/IntBuffer.h" +#include "../../Minecraft.Client/net/minecraft/client/renderer/Tesselator.h" GrassTile::GrassTile(int id) : Tile(id, Material::grass) { iconTop = nullptr; diff --git a/Minecraft.World/Blocks/GrassTile.h b/Minecraft.World/net/minecraft/world/level/tile/GrassTile.h similarity index 100% rename from Minecraft.World/Blocks/GrassTile.h rename to Minecraft.World/net/minecraft/world/level/tile/GrassTile.h diff --git a/Minecraft.World/Blocks/GravelTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/GravelTile.cpp similarity index 75% rename from Minecraft.World/Blocks/GravelTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/GravelTile.cpp index c67d89c6b..de74e19a8 100644 --- a/Minecraft.World/Blocks/GravelTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/GravelTile.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "GravelTile.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../item/net.minecraft.world.item.h" GravelTile::GravelTile(int type) : HeavyTile(type) {} diff --git a/Minecraft.World/Blocks/GravelTile.h b/Minecraft.World/net/minecraft/world/level/tile/GravelTile.h similarity index 100% rename from Minecraft.World/Blocks/GravelTile.h rename to Minecraft.World/net/minecraft/world/level/tile/GravelTile.h diff --git a/Minecraft.World/Blocks/HalfSlabTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/HalfSlabTile.cpp similarity index 93% rename from Minecraft.World/Blocks/HalfSlabTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/HalfSlabTile.cpp index 6e677ebe8..f48a2fb4f 100644 --- a/Minecraft.World/Blocks/HalfSlabTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/HalfSlabTile.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "HalfSlabTile.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.biome.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.stats.h" -#include "../Util/Facing.h" +#include "../net.minecraft.world.level.h" +#include "../biome/net.minecraft.world.level.biome.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../../stats/net.minecraft.stats.h" +#include "../../../Facing.h" HalfSlabTile::HalfSlabTile(int id, bool fullSize, Material* material) : Tile(id, material, fullSize) { diff --git a/Minecraft.World/Blocks/HalfSlabTile.h b/Minecraft.World/net/minecraft/world/level/tile/HalfSlabTile.h similarity index 100% rename from Minecraft.World/Blocks/HalfSlabTile.h rename to Minecraft.World/net/minecraft/world/level/tile/HalfSlabTile.h diff --git a/Minecraft.World/Blocks/HalfTransparentTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/HalfTransparentTile.cpp similarity index 86% rename from Minecraft.World/Blocks/HalfTransparentTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/HalfTransparentTile.cpp index 81a60b33d..3dbb25dd3 100644 --- a/Minecraft.World/Blocks/HalfTransparentTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/HalfTransparentTile.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../../net.minecraft.world.h" #include "HalfTransparentTile.h" HalfTransparentTile::HalfTransparentTile(int id, const std::wstring& tex, diff --git a/Minecraft.World/Blocks/HalfTransparentTile.h b/Minecraft.World/net/minecraft/world/level/tile/HalfTransparentTile.h similarity index 100% rename from Minecraft.World/Blocks/HalfTransparentTile.h rename to Minecraft.World/net/minecraft/world/level/tile/HalfTransparentTile.h diff --git a/Minecraft.World/Blocks/HayBlockTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/HayBlockTile.cpp similarity index 83% rename from Minecraft.World/Blocks/HayBlockTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/HayBlockTile.cpp index 9ceba51d8..626c30243 100644 --- a/Minecraft.World/Blocks/HayBlockTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/HayBlockTile.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.h" #include "HayBlockTile.h" HayBlockTile::HayBlockTile(int id) : RotatedPillarTile(id, Material::grass) {} diff --git a/Minecraft.World/Blocks/HayBlockTile.h b/Minecraft.World/net/minecraft/world/level/tile/HayBlockTile.h similarity index 100% rename from Minecraft.World/Blocks/HayBlockTile.h rename to Minecraft.World/net/minecraft/world/level/tile/HayBlockTile.h diff --git a/Minecraft.World/Blocks/HeavyTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/HeavyTile.cpp similarity index 93% rename from Minecraft.World/Blocks/HeavyTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/HeavyTile.cpp index 9b06fbcd2..4008aec6a 100644 --- a/Minecraft.World/Blocks/HeavyTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/HeavyTile.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.entity.item.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../../entity/item/net.minecraft.world.entity.item.h" #include "HeavyTile.h" #include "FireTile.h" diff --git a/Minecraft.World/Blocks/HeavyTile.h b/Minecraft.World/net/minecraft/world/level/tile/HeavyTile.h similarity index 100% rename from Minecraft.World/Blocks/HeavyTile.h rename to Minecraft.World/net/minecraft/world/level/tile/HeavyTile.h diff --git a/Minecraft.World/Blocks/HopperTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/HopperTile.cpp similarity index 94% rename from Minecraft.World/Blocks/HopperTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/HopperTile.cpp index ac6bf32b1..983f91805 100644 --- a/Minecraft.World/Blocks/HopperTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/HopperTile.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.inventory.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../net.minecraft.h" +#include "../../entity/item/net.minecraft.world.entity.item.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../inventory/net.minecraft.world.inventory.h" +#include "../net.minecraft.world.level.h" +#include "entity/net.minecraft.world.level.tile.entity.h" +#include "../../net.minecraft.world.h" #include "HopperTile.h" const std::wstring HopperTile::TEXTURE_OUTSIDE = L"hopper_outside"; diff --git a/Minecraft.World/Blocks/HopperTile.h b/Minecraft.World/net/minecraft/world/level/tile/HopperTile.h similarity index 100% rename from Minecraft.World/Blocks/HopperTile.h rename to Minecraft.World/net/minecraft/world/level/tile/HopperTile.h diff --git a/Minecraft.World/Blocks/HugeMushroomTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/HugeMushroomTile.cpp similarity index 95% rename from Minecraft.World/Blocks/HugeMushroomTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/HugeMushroomTile.cpp index 8b727baba..dd4b7f16d 100644 --- a/Minecraft.World/Blocks/HugeMushroomTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/HugeMushroomTile.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.h" #include "HugeMushroomTile.h" const std::wstring HugeMushroomTile::TEXTURE_STEM = L"skin_stem"; diff --git a/Minecraft.World/Blocks/HugeMushroomTile.h b/Minecraft.World/net/minecraft/world/level/tile/HugeMushroomTile.h similarity index 100% rename from Minecraft.World/Blocks/HugeMushroomTile.h rename to Minecraft.World/net/minecraft/world/level/tile/HugeMushroomTile.h diff --git a/Minecraft.World/Blocks/IceTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/IceTile.cpp similarity index 86% rename from Minecraft.World/Blocks/IceTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/IceTile.cpp index 7d6e660c5..f478a4f9b 100644 --- a/Minecraft.World/Blocks/IceTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/IceTile.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.dimension.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" -#include "../Headers/net.minecraft.world.food.h" -#include "../Headers/net.minecraft.stats.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../dimension/net.minecraft.world.level.dimension.h" +#include "../../item/enchantment/net.minecraft.world.item.enchantment.h" +#include "../../food/net.minecraft.world.food.h" +#include "../../../stats/net.minecraft.stats.h" #include "IceTile.h" IceTile::IceTile(int id) diff --git a/Minecraft.World/Blocks/IceTile.h b/Minecraft.World/net/minecraft/world/level/tile/IceTile.h similarity index 100% rename from Minecraft.World/Blocks/IceTile.h rename to Minecraft.World/net/minecraft/world/level/tile/IceTile.h diff --git a/Minecraft.World/Blocks/JukeboxTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/JukeboxTile.cpp similarity index 93% rename from Minecraft.World/Blocks/JukeboxTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/JukeboxTile.cpp index e0615cc61..0879396c5 100644 --- a/Minecraft.World/Blocks/JukeboxTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/JukeboxTile.cpp @@ -1,12 +1,12 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.redstone.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../redstone/net.minecraft.world.level.redstone.h" +#include "../../entity/item/net.minecraft.world.entity.item.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.level.h" +#include "../../../net.minecraft.h" +#include "../../net.minecraft.world.h" #include "JukeboxTile.h" -#include "../Level/Events/LevelEvent.h" +#include "LevelEvent.h" JukeboxTile::Entity::Entity() : TileEntity() { record = nullptr; } diff --git a/Minecraft.World/Blocks/JukeboxTile.h b/Minecraft.World/net/minecraft/world/level/tile/JukeboxTile.h similarity index 95% rename from Minecraft.World/Blocks/JukeboxTile.h rename to Minecraft.World/net/minecraft/world/level/tile/JukeboxTile.h index d3fa9603f..3807a4998 100644 --- a/Minecraft.World/Blocks/JukeboxTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/JukeboxTile.h @@ -1,8 +1,8 @@ #pragma once #include "BaseEntityTile.h" -#include "../IO/NBT/CompoundTag.h" -#include "TileEntities/TileEntity.h" +#include "../../../../../com/mojang/nbt/CompoundTag.h" +#include "entity/TileEntity.h" class CompoundTag; class ChunkRebuildData; diff --git a/Minecraft.World/Blocks/LadderTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/LadderTile.cpp similarity index 96% rename from Minecraft.World/Blocks/LadderTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/LadderTile.cpp index f061eceed..de2952e10 100644 --- a/Minecraft.World/Blocks/LadderTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/LadderTile.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" #include "LadderTile.h" -#include "Util/AABB.h" +#include "../../phys/AABB.h" LadderTile::LadderTile(int id) : Tile(id, Material::decoration, false) {} diff --git a/Minecraft.World/Blocks/LadderTile.h b/Minecraft.World/net/minecraft/world/level/tile/LadderTile.h similarity index 95% rename from Minecraft.World/Blocks/LadderTile.h rename to Minecraft.World/net/minecraft/world/level/tile/LadderTile.h index 9bde7712d..327dce1f2 100644 --- a/Minecraft.World/Blocks/LadderTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/LadderTile.h @@ -1,6 +1,6 @@ #pragma once #include "Tile.h" -#include "../Util/Definitions.h" +#include "../../../../../ConsoleHelpers/Definitions.h" class Random; diff --git a/Minecraft.World/Blocks/LeafTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/LeafTile.cpp similarity index 97% rename from Minecraft.World/Blocks/LeafTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/LeafTile.cpp index ae12b03a2..d71cd7d06 100644 --- a/Minecraft.World/Blocks/LeafTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/LeafTile.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "../../Minecraft.Client/Minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../Minecraft.Client/net/minecraft/client/Minecraft.h" #include "LeafTile.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.biome.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.stats.h" -#include "../Headers/net.minecraft.world.h" +#include "../net.minecraft.world.level.h" +#include "../biome/net.minecraft.world.level.biome.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../../stats/net.minecraft.stats.h" +#include "../../net.minecraft.world.h" const unsigned int LeafTile::LEAF_NAMES[LEAF_NAMES_LENGTH] = { IDS_TILE_LEAVES_OAK, diff --git a/Minecraft.World/Blocks/LeafTile.h b/Minecraft.World/net/minecraft/world/level/tile/LeafTile.h similarity index 100% rename from Minecraft.World/Blocks/LeafTile.h rename to Minecraft.World/net/minecraft/world/level/tile/LeafTile.h diff --git a/Minecraft.World/Level/Events/LevelEvent.h b/Minecraft.World/net/minecraft/world/level/tile/LevelEvent.h similarity index 100% rename from Minecraft.World/Level/Events/LevelEvent.h rename to Minecraft.World/net/minecraft/world/level/tile/LevelEvent.h diff --git a/Minecraft.World/Blocks/LeverTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/LeverTile.cpp similarity index 97% rename from Minecraft.World/Blocks/LeverTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/LeverTile.cpp index 11e8db00f..0f1deb65e 100644 --- a/Minecraft.World/Blocks/LeverTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/LeverTile.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.redstone.h" -#include "../Headers/net.minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../redstone/net.minecraft.world.level.redstone.h" +#include "../../../net.minecraft.h" #include "LeverTile.h" -#include "Util/AABB.h" +#include "../../phys/AABB.h" LeverTile::LeverTile(int id) : Tile(id, Material::decoration, false) {} diff --git a/Minecraft.World/Blocks/LeverTile.h b/Minecraft.World/net/minecraft/world/level/tile/LeverTile.h similarity index 100% rename from Minecraft.World/Blocks/LeverTile.h rename to Minecraft.World/net/minecraft/world/level/tile/LeverTile.h diff --git a/Minecraft.World/Blocks/LiquidTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/LiquidTile.cpp similarity index 96% rename from Minecraft.World/Blocks/LiquidTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/LiquidTile.cpp index cda40aa15..077e30e62 100644 --- a/Minecraft.World/Blocks/LiquidTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/LiquidTile.cpp @@ -1,15 +1,15 @@ -#include "../Platform/stdafx.h" -#include "../Util/JavaMath.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.dimension.h" -#include "../Headers/net.minecraft.world.level.biome.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../../../ConsoleJavaLibs/JavaMath.h" +#include "../net.minecraft.world.level.h" +#include "../dimension/net.minecraft.world.level.dimension.h" +#include "../biome/net.minecraft.world.level.biome.h" +#include "../../net.minecraft.world.h" #include "LiquidTile.h" #include -#include "../Util/Facing.h" -#include "../Util/SoundTypes.h" -#include "Blocks/Material.h" -#include "Util/AABB.h" +#include "../../../Facing.h" +#include "../../../../../Header Files/SoundTypes.h" +#include "../material/Material.h" +#include "../../phys/AABB.h" const std::wstring LiquidTile::TEXTURE_LAVA_STILL = L"lava"; const std::wstring LiquidTile::TEXTURE_WATER_STILL = L"water"; diff --git a/Minecraft.World/Blocks/LiquidTile.h b/Minecraft.World/net/minecraft/world/level/tile/LiquidTile.h similarity index 98% rename from Minecraft.World/Blocks/LiquidTile.h rename to Minecraft.World/net/minecraft/world/level/tile/LiquidTile.h index 7ffed063a..4b5d96dda 100644 --- a/Minecraft.World/Blocks/LiquidTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/LiquidTile.h @@ -1,7 +1,7 @@ #pragma once #include #include "Tile.h" -#include "../Util/Definitions.h" +#include "../../../../../ConsoleHelpers/Definitions.h" class Random; class ChunkRebuildData; diff --git a/Minecraft.World/Blocks/LiquidTileDynamic.cpp b/Minecraft.World/net/minecraft/world/level/tile/LiquidTileDynamic.cpp similarity index 98% rename from Minecraft.World/Blocks/LiquidTileDynamic.cpp rename to Minecraft.World/net/minecraft/world/level/tile/LiquidTileDynamic.cpp index a2a3366b1..cc36098b3 100644 --- a/Minecraft.World/Blocks/LiquidTileDynamic.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/LiquidTileDynamic.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" #include "LiquidTileDynamic.h" -#include "../Headers/net.minecraft.world.level.dimension.h" +#include "../dimension/net.minecraft.world.level.dimension.h" LiquidTileDynamic::LiquidTileDynamic(int id, Material* material) : LiquidTile(id, material) { diff --git a/Minecraft.World/Blocks/LiquidTileDynamic.h b/Minecraft.World/net/minecraft/world/level/tile/LiquidTileDynamic.h similarity index 100% rename from Minecraft.World/Blocks/LiquidTileDynamic.h rename to Minecraft.World/net/minecraft/world/level/tile/LiquidTileDynamic.h diff --git a/Minecraft.World/Blocks/LiquidTileStatic.cpp b/Minecraft.World/net/minecraft/world/level/tile/LiquidTileStatic.cpp similarity index 96% rename from Minecraft.World/Blocks/LiquidTileStatic.cpp rename to Minecraft.World/net/minecraft/world/level/tile/LiquidTileStatic.cpp index b1b75838b..4cd5d5bc8 100644 --- a/Minecraft.World/Blocks/LiquidTileStatic.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/LiquidTileStatic.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" #include "LiquidTileStatic.h" #include "FireTile.h" diff --git a/Minecraft.World/Blocks/LiquidTileStatic.h b/Minecraft.World/net/minecraft/world/level/tile/LiquidTileStatic.h similarity index 100% rename from Minecraft.World/Blocks/LiquidTileStatic.h rename to Minecraft.World/net/minecraft/world/level/tile/LiquidTileStatic.h diff --git a/Minecraft.World/Blocks/LockedChestTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/LockedChestTile.cpp similarity index 81% rename from Minecraft.World/Blocks/LockedChestTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/LockedChestTile.cpp index ff3ede66f..6a1213c3f 100644 --- a/Minecraft.World/Blocks/LockedChestTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/LockedChestTile.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" #include "LockedChestTile.h" LockedChestTile::LockedChestTile(int id) : Tile(id, Material::wood) {} diff --git a/Minecraft.World/Blocks/LockedChestTile.h b/Minecraft.World/net/minecraft/world/level/tile/LockedChestTile.h similarity index 100% rename from Minecraft.World/Blocks/LockedChestTile.h rename to Minecraft.World/net/minecraft/world/level/tile/LockedChestTile.h diff --git a/Minecraft.World/Blocks/MelonTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/MelonTile.cpp similarity index 83% rename from Minecraft.World/Blocks/MelonTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/MelonTile.cpp index c392b90fa..d4583e8b1 100644 --- a/Minecraft.World/Blocks/MelonTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/MelonTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "MelonTile.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.h" -#include "../Util/Facing.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../net.minecraft.world.h" +#include "../../../Facing.h" MelonTile::MelonTile(int id) : Tile(id, Material::vegetable) { iconTop = nullptr; diff --git a/Minecraft.World/Blocks/MelonTile.h b/Minecraft.World/net/minecraft/world/level/tile/MelonTile.h similarity index 100% rename from Minecraft.World/Blocks/MelonTile.h rename to Minecraft.World/net/minecraft/world/level/tile/MelonTile.h diff --git a/Minecraft.World/Blocks/MetalTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/MetalTile.cpp similarity index 63% rename from Minecraft.World/Blocks/MetalTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/MetalTile.cpp index 53332bbef..c5d5a82aa 100644 --- a/Minecraft.World/Blocks/MetalTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/MetalTile.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "MetalTile.h" MetalTile::MetalTile(int id) : Tile(id, Material::metal) {} \ No newline at end of file diff --git a/Minecraft.World/Blocks/MetalTile.h b/Minecraft.World/net/minecraft/world/level/tile/MetalTile.h similarity index 100% rename from Minecraft.World/Blocks/MetalTile.h rename to Minecraft.World/net/minecraft/world/level/tile/MetalTile.h diff --git a/Minecraft.World/Blocks/MobSpawnerTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/MobSpawnerTile.cpp similarity index 88% rename from Minecraft.World/Blocks/MobSpawnerTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/MobSpawnerTile.cpp index 85af0b16d..152393047 100644 --- a/Minecraft.World/Blocks/MobSpawnerTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/MobSpawnerTile.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "entity/net.minecraft.world.level.tile.entity.h" #include "MobSpawnerTile.h" MobSpawnerTile::MobSpawnerTile(int id) diff --git a/Minecraft.World/Blocks/MobSpawnerTile.h b/Minecraft.World/net/minecraft/world/level/tile/MobSpawnerTile.h similarity index 100% rename from Minecraft.World/Blocks/MobSpawnerTile.h rename to Minecraft.World/net/minecraft/world/level/tile/MobSpawnerTile.h diff --git a/Minecraft.World/Blocks/MushroomPlantTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/MushroomPlantTile.cpp similarity index 92% rename from Minecraft.World/Blocks/MushroomPlantTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/MushroomPlantTile.cpp index 7b5e272d2..87fb47a9a 100644 --- a/Minecraft.World/Blocks/MushroomPlantTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/MushroomPlantTile.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.levelgen.feature.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../levelgen/feature/net.minecraft.world.level.levelgen.feature.h" +#include "../../net.minecraft.world.h" #include "MushroomPlantTile.h" Mushroom::Mushroom(int id) : Bush(id) { diff --git a/Minecraft.World/Blocks/MushroomPlantTile.h b/Minecraft.World/net/minecraft/world/level/tile/MushroomPlantTile.h similarity index 100% rename from Minecraft.World/Blocks/MushroomPlantTile.h rename to Minecraft.World/net/minecraft/world/level/tile/MushroomPlantTile.h diff --git a/Minecraft.World/Blocks/MycelTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/MycelTile.cpp similarity index 93% rename from Minecraft.World/Blocks/MycelTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/MycelTile.cpp index 842c2a746..a77379874 100644 --- a/Minecraft.World/Blocks/MycelTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/MycelTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "MycelTile.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.h" +#include "../net.minecraft.world.level.h" +#include "../../../net.minecraft.h" +#include "../../net.minecraft.world.h" MycelTile::MycelTile(int id) : Tile(id, Material::grass) { iconTop = nullptr; diff --git a/Minecraft.World/Blocks/MycelTile.h b/Minecraft.World/net/minecraft/world/level/tile/MycelTile.h similarity index 100% rename from Minecraft.World/Blocks/MycelTile.h rename to Minecraft.World/net/minecraft/world/level/tile/MycelTile.h diff --git a/Minecraft.World/Blocks/NetherWartTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/NetherWartTile.cpp similarity index 91% rename from Minecraft.World/Blocks/NetherWartTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/NetherWartTile.cpp index 956d40ee9..532196a74 100644 --- a/Minecraft.World/Blocks/NetherWartTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/NetherWartTile.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "NetherWartTile.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.biome.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.h" +#include "../net.minecraft.world.level.h" +#include "../biome/net.minecraft.world.level.biome.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../net.minecraft.world.h" NetherWartTile::NetherWartTile(int id) : Bush(id) { setTicking(true); diff --git a/Minecraft.World/Blocks/NetherWartTile.h b/Minecraft.World/net/minecraft/world/level/tile/NetherWartTile.h similarity index 100% rename from Minecraft.World/Blocks/NetherWartTile.h rename to Minecraft.World/net/minecraft/world/level/tile/NetherWartTile.h diff --git a/Minecraft.World/Blocks/NetherrackTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/NetherrackTile.cpp similarity index 67% rename from Minecraft.World/Blocks/NetherrackTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/NetherrackTile.cpp index a3f026497..f0d339b4e 100644 --- a/Minecraft.World/Blocks/NetherrackTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/NetherrackTile.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "NetherrackTile.h" NetherrackTile::NetherrackTile(int id) : Tile(id, Material::stone) {} \ No newline at end of file diff --git a/Minecraft.World/Blocks/NetherrackTile.h b/Minecraft.World/net/minecraft/world/level/tile/NetherrackTile.h similarity index 100% rename from Minecraft.World/Blocks/NetherrackTile.h rename to Minecraft.World/net/minecraft/world/level/tile/NetherrackTile.h diff --git a/Minecraft.World/Blocks/NotGateTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/NotGateTile.cpp similarity index 97% rename from Minecraft.World/Blocks/NotGateTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/NotGateTile.cpp index efaaec30a..8681dd4bd 100644 --- a/Minecraft.World/Blocks/NotGateTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/NotGateTile.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.redstone.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../redstone/net.minecraft.world.level.redstone.h" #include "NotGateTile.h" -#include "../Util/SoundTypes.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/SoundTypes.h" +#include "../../net.minecraft.world.h" std::unordered_map*> NotGateTile::recentToggles = diff --git a/Minecraft.World/Blocks/NotGateTile.h b/Minecraft.World/net/minecraft/world/level/tile/NotGateTile.h similarity index 100% rename from Minecraft.World/Blocks/NotGateTile.h rename to Minecraft.World/net/minecraft/world/level/tile/NotGateTile.h diff --git a/Minecraft.World/Blocks/NoteBlockTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/NoteBlockTile.cpp similarity index 93% rename from Minecraft.World/Blocks/NoteBlockTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/NoteBlockTile.cpp index 578a4ddd4..ec2a7f62d 100644 --- a/Minecraft.World/Blocks/NoteBlockTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/NoteBlockTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "entity/net.minecraft.world.level.tile.entity.h" #include "NoteBlockTile.h" -#include "../Util/SoundTypes.h" +#include "../../../../../Header Files/SoundTypes.h" NoteBlockTile::NoteBlockTile(int id) : BaseEntityTile(id, Material::wood) {} diff --git a/Minecraft.World/Blocks/NoteBlockTile.h b/Minecraft.World/net/minecraft/world/level/tile/NoteBlockTile.h similarity index 100% rename from Minecraft.World/Blocks/NoteBlockTile.h rename to Minecraft.World/net/minecraft/world/level/tile/NoteBlockTile.h diff --git a/Minecraft.World/Blocks/ObsidianTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/ObsidianTile.cpp similarity index 84% rename from Minecraft.World/Blocks/ObsidianTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/ObsidianTile.cpp index cf7ce9efc..f18a72251 100644 --- a/Minecraft.World/Blocks/ObsidianTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/ObsidianTile.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "ObsidianTile.h" ObsidianTile::ObsidianTile(int id) : StoneTile(id) {} diff --git a/Minecraft.World/Blocks/ObsidianTile.h b/Minecraft.World/net/minecraft/world/level/tile/ObsidianTile.h similarity index 100% rename from Minecraft.World/Blocks/ObsidianTile.h rename to Minecraft.World/net/minecraft/world/level/tile/ObsidianTile.h diff --git a/Minecraft.World/Blocks/OreTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/OreTile.cpp similarity index 93% rename from Minecraft.World/Blocks/OreTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/OreTile.cpp index 1bf41cd11..0282275ac 100644 --- a/Minecraft.World/Blocks/OreTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/OreTile.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "OreTile.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.level.h" OreTile::OreTile(int id) : Tile(id, Material::stone) {} diff --git a/Minecraft.World/Blocks/OreTile.h b/Minecraft.World/net/minecraft/world/level/tile/OreTile.h similarity index 100% rename from Minecraft.World/Blocks/OreTile.h rename to Minecraft.World/net/minecraft/world/level/tile/OreTile.h diff --git a/Minecraft.World/Blocks/PlantTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/PlantTile.cpp similarity index 93% rename from Minecraft.World/Blocks/PlantTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/PlantTile.cpp index 5789a441c..9e9f0f404 100644 --- a/Minecraft.World/Blocks/PlantTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/PlantTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" #include "GrassTile.h" #include "PlantTile.h" -#include "Util/AABB.h" +#include "../../phys/AABB.h" void Bush::_init() { setTicking(true); diff --git a/Minecraft.World/Blocks/PlantTile.h b/Minecraft.World/net/minecraft/world/level/tile/PlantTile.h similarity index 91% rename from Minecraft.World/Blocks/PlantTile.h rename to Minecraft.World/net/minecraft/world/level/tile/PlantTile.h index 72c134196..b840efbaa 100644 --- a/Minecraft.World/Blocks/PlantTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/PlantTile.h @@ -1,7 +1,7 @@ #pragma once #include "Tile.h" -#include "Material.h" -#include "../Util/Definitions.h" +#include "../material/Material.h" +#include "../../../../../ConsoleHelpers/Definitions.h" class Random; class Level; diff --git a/Minecraft.World/Blocks/PortalTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/PortalTile.cpp similarity index 96% rename from Minecraft.World/Blocks/PortalTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/PortalTile.cpp index 4a4a9e133..94538e474 100644 --- a/Minecraft.World/Blocks/PortalTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/PortalTile.cpp @@ -1,12 +1,12 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.dimension.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/net.minecraft.world.entity.h" +#include "../net.minecraft.world.level.h" +#include "../dimension/net.minecraft.world.level.dimension.h" +#include "../../item/net.minecraft.world.item.h" #include "PortalTile.h" #include -#include "Util/AABB.h" +#include "../../phys/AABB.h" #include "FireTile.h" PortalTile::PortalTile(int id) diff --git a/Minecraft.World/Blocks/PortalTile.h b/Minecraft.World/net/minecraft/world/level/tile/PortalTile.h similarity index 96% rename from Minecraft.World/Blocks/PortalTile.h rename to Minecraft.World/net/minecraft/world/level/tile/PortalTile.h index c62fb1033..dcc1b2e0a 100644 --- a/Minecraft.World/Blocks/PortalTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/PortalTile.h @@ -1,7 +1,7 @@ #pragma once #include #include "HalfTransparentTile.h" -#include "../Util/Definitions.h" +#include "../../../../../ConsoleHelpers/Definitions.h" class Random; diff --git a/Minecraft.World/Blocks/PotatoTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/PotatoTile.cpp similarity index 86% rename from Minecraft.World/Blocks/PotatoTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/PotatoTile.cpp index 28ca09e94..2f7f96890 100644 --- a/Minecraft.World/Blocks/PotatoTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/PotatoTile.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.level.h" +#include "../../net.minecraft.world.h" #include "PotatoTile.h" PotatoTile::PotatoTile(int id) : CropTile(id) {} diff --git a/Minecraft.World/Blocks/PotatoTile.h b/Minecraft.World/net/minecraft/world/level/tile/PotatoTile.h similarity index 100% rename from Minecraft.World/Blocks/PotatoTile.h rename to Minecraft.World/net/minecraft/world/level/tile/PotatoTile.h diff --git a/Minecraft.World/Blocks/PoweredMetalTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/PoweredMetalTile.cpp similarity index 73% rename from Minecraft.World/Blocks/PoweredMetalTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/PoweredMetalTile.cpp index 905774d05..326196ae4 100644 --- a/Minecraft.World/Blocks/PoweredMetalTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/PoweredMetalTile.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.redstone.h" +#include "../../../../../Header Files/stdafx.h" +#include "../redstone/net.minecraft.world.level.redstone.h" #include "PoweredMetalTile.h" PoweredMetalTile::PoweredMetalTile(int id) : MetalTile(id) {} diff --git a/Minecraft.World/Blocks/PoweredMetalTile.h b/Minecraft.World/net/minecraft/world/level/tile/PoweredMetalTile.h similarity index 100% rename from Minecraft.World/Blocks/PoweredMetalTile.h rename to Minecraft.World/net/minecraft/world/level/tile/PoweredMetalTile.h diff --git a/Minecraft.World/Blocks/PoweredRailTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/PoweredRailTile.cpp similarity index 97% rename from Minecraft.World/Blocks/PoweredRailTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/PoweredRailTile.cpp index a75fc74b9..e434c9ead 100644 --- a/Minecraft.World/Blocks/PoweredRailTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/PoweredRailTile.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.h" +#include "../net.minecraft.world.level.h" #include "PoweredRailTile.h" PoweredRailTile::PoweredRailTile(int id) : BaseRailTile(id, true) {} diff --git a/Minecraft.World/Blocks/PoweredRailTile.h b/Minecraft.World/net/minecraft/world/level/tile/PoweredRailTile.h similarity index 100% rename from Minecraft.World/Blocks/PoweredRailTile.h rename to Minecraft.World/net/minecraft/world/level/tile/PoweredRailTile.h diff --git a/Minecraft.World/Blocks/PressurePlateTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/PressurePlateTile.cpp similarity index 90% rename from Minecraft.World/Blocks/PressurePlateTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/PressurePlateTile.cpp index c05ef5870..d3c96a1a1 100644 --- a/Minecraft.World/Blocks/PressurePlateTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/PressurePlateTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.redstone.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../redstone/net.minecraft.world.level.redstone.h" #include "PressurePlateTile.h" -#include "Util/AABB.h" +#include "../../phys/AABB.h" PressurePlateTile::PressurePlateTile(int id, const std::wstring& tex, Material* material, diff --git a/Minecraft.World/Blocks/PressurePlateTile.h b/Minecraft.World/net/minecraft/world/level/tile/PressurePlateTile.h similarity index 100% rename from Minecraft.World/Blocks/PressurePlateTile.h rename to Minecraft.World/net/minecraft/world/level/tile/PressurePlateTile.h diff --git a/Minecraft.World/Blocks/PumpkinTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/PumpkinTile.cpp similarity index 96% rename from Minecraft.World/Blocks/PumpkinTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/PumpkinTile.cpp index 6ad35cc18..8c7809d88 100644 --- a/Minecraft.World/Blocks/PumpkinTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/PumpkinTile.cpp @@ -1,12 +1,12 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.animal.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/animal/net.minecraft.world.entity.animal.h" +#include "../net.minecraft.world.level.h" +#include "../../../net.minecraft.h" +#include "../../net.minecraft.world.h" #include "PumpkinTile.h" -#include "../Entities/Mob.h" -#include "../Entities/Mobs/SnowMan.h" -#include "../Entities/MobCategory.h" +#include "../../entity/Mob.h" +#include "../../entity/animal/SnowMan.h" +#include "../../entity/MobCategory.h" const std::wstring PumpkinTile::TEXTURE_FACE = L"pumpkin_face"; const std::wstring PumpkinTile::TEXTURE_LANTERN = L"pumpkin_jack"; diff --git a/Minecraft.World/Blocks/PumpkinTile.h b/Minecraft.World/net/minecraft/world/level/tile/PumpkinTile.h similarity index 100% rename from Minecraft.World/Blocks/PumpkinTile.h rename to Minecraft.World/net/minecraft/world/level/tile/PumpkinTile.h diff --git a/Minecraft.World/Blocks/QuartzBlockTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/QuartzBlockTile.cpp similarity index 94% rename from Minecraft.World/Blocks/QuartzBlockTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/QuartzBlockTile.cpp index c5d02b1eb..41ddbb5e7 100644 --- a/Minecraft.World/Blocks/QuartzBlockTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/QuartzBlockTile.cpp @@ -1,12 +1,12 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../net.minecraft.h" +#include "../../net.minecraft.world.h" #include "QuartzBlockTile.h" // 4J Added -#include "../Level/Level.h" -#include "PistonBaseTile.h" -#include "../Player/Player.h" +#include "../Level.h" +#include "piston/PistonBaseTile.h" +#include "../../entity/player/Player.h" int QuartzBlockTile::BLOCK_NAMES[QUARTZ_BLOCK_NAMES] = { IDS_TILE_QUARTZ_BLOCK, IDS_TILE_QUARTZ_BLOCK_CHISELED, diff --git a/Minecraft.World/Blocks/QuartzBlockTile.h b/Minecraft.World/net/minecraft/world/level/tile/QuartzBlockTile.h similarity index 100% rename from Minecraft.World/Blocks/QuartzBlockTile.h rename to Minecraft.World/net/minecraft/world/level/tile/QuartzBlockTile.h diff --git a/Minecraft.World/Blocks/RailTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/RailTile.cpp similarity index 89% rename from Minecraft.World/Blocks/RailTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/RailTile.cpp index 5d72f9906..cf673e5b6 100644 --- a/Minecraft.World/Blocks/RailTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/RailTile.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.h" #include "RailTile.h" RailTile::RailTile(int id) : BaseRailTile(id, false) {} diff --git a/Minecraft.World/Blocks/RailTile.h b/Minecraft.World/net/minecraft/world/level/tile/RailTile.h similarity index 100% rename from Minecraft.World/Blocks/RailTile.h rename to Minecraft.World/net/minecraft/world/level/tile/RailTile.h diff --git a/Minecraft.World/Blocks/RedStoneDustTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/RedStoneDustTile.cpp similarity index 96% rename from Minecraft.World/Blocks/RedStoneDustTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/RedStoneDustTile.cpp index 8babbeaf9..bfe6c8b93 100644 --- a/Minecraft.World/Blocks/RedStoneDustTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/RedStoneDustTile.cpp @@ -1,21 +1,21 @@ -#include "../Platform/stdafx.h" -#include "../../Minecraft.Client/Minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../Minecraft.Client/net/minecraft/client/Minecraft.h" #include "RedStoneDustTile.h" #include #include -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.redstone.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.h" -#include "../Util/Direction.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.level.h" +#include "../redstone/net.minecraft.world.level.redstone.h" +#include "net.minecraft.world.level.tile.h" +#include "../../net.minecraft.world.h" +#include "../../../net.minecraft.h" +#include "../../../Direction.h" #include "DiodeTile.h" -#include "Util/AABB.h" +#include "../../phys/AABB.h" // AP - added for Vita to set Alpha Cut out -#include "../IO/Streams/IntBuffer.h" -#include "../../Minecraft.Client/Rendering/Tesselator.h" +#include "../../../../../ConsoleJavaLibs/IntBuffer.h" +#include "../../Minecraft.Client/net/minecraft/client/renderer/Tesselator.h" const std::wstring RedStoneDustTile::TEXTURE_CROSS = L"_cross"; const std::wstring RedStoneDustTile::TEXTURE_LINE = L"_line"; diff --git a/Minecraft.World/Blocks/RedStoneDustTile.h b/Minecraft.World/net/minecraft/world/level/tile/RedStoneDustTile.h similarity index 97% rename from Minecraft.World/Blocks/RedStoneDustTile.h rename to Minecraft.World/net/minecraft/world/level/tile/RedStoneDustTile.h index e9656d395..7b8922a42 100644 --- a/Minecraft.World/Blocks/RedStoneDustTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/RedStoneDustTile.h @@ -1,7 +1,7 @@ #pragma once #include #include "Tile.h" -#include "../Util/Definitions.h" +#include "../../../../../ConsoleHelpers/Definitions.h" class Random; class Level; diff --git a/Minecraft.World/Blocks/RedStoneOreTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/RedStoneOreTile.cpp similarity index 96% rename from Minecraft.World/Blocks/RedStoneOreTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/RedStoneOreTile.cpp index 8e563d117..b3fecfc44 100644 --- a/Minecraft.World/Blocks/RedStoneOreTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/RedStoneOreTile.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" #include "RedStoneOreTile.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../item/net.minecraft.world.item.h" RedStoneOreTile::RedStoneOreTile(int id, bool lit) : Tile(id, Material::stone) { if (lit) { diff --git a/Minecraft.World/Blocks/RedStoneOreTile.h b/Minecraft.World/net/minecraft/world/level/tile/RedStoneOreTile.h similarity index 100% rename from Minecraft.World/Blocks/RedStoneOreTile.h rename to Minecraft.World/net/minecraft/world/level/tile/RedStoneOreTile.h diff --git a/Minecraft.World/Blocks/RedLightTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/RedlightTile.cpp similarity index 89% rename from Minecraft.World/Blocks/RedLightTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/RedlightTile.cpp index 64322d8f5..9a11aa1e0 100644 --- a/Minecraft.World/Blocks/RedLightTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/RedlightTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.h" -#include "RedLightTile.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "../../net.minecraft.world.h" +#include "RedlightTile.h" RedlightTile::RedlightTile(int id, bool isLit) : Tile(id, Material::buildable_glass) { diff --git a/Minecraft.World/Blocks/RedLightTile.h b/Minecraft.World/net/minecraft/world/level/tile/RedlightTile.h similarity index 100% rename from Minecraft.World/Blocks/RedLightTile.h rename to Minecraft.World/net/minecraft/world/level/tile/RedlightTile.h diff --git a/Minecraft.World/Blocks/ReedTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/ReedTile.cpp similarity index 91% rename from Minecraft.World/Blocks/ReedTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/ReedTile.cpp index 716cf471e..aba9c321f 100644 --- a/Minecraft.World/Blocks/ReedTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/ReedTile.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "GrassTile.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.material.h" -#include "../Headers/net.minecraft.world.phys.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.level.h" +#include "../material/net.minecraft.world.level.material.h" +#include "../../phys/net.minecraft.world.phys.h" #include "ReedTile.h" #include diff --git a/Minecraft.World/Blocks/ReedTile.h b/Minecraft.World/net/minecraft/world/level/tile/ReedTile.h similarity index 95% rename from Minecraft.World/Blocks/ReedTile.h rename to Minecraft.World/net/minecraft/world/level/tile/ReedTile.h index 4fbe21aa3..fb1667066 100644 --- a/Minecraft.World/Blocks/ReedTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/ReedTile.h @@ -2,7 +2,7 @@ #include #include "Tile.h" -#include "../Util/Definitions.h" +#include "../../../../../ConsoleHelpers/Definitions.h" class Random; diff --git a/Minecraft.World/Blocks/RepeaterTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/RepeaterTile.cpp similarity index 93% rename from Minecraft.World/Blocks/RepeaterTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/RepeaterTile.cpp index 5afae29a9..a2d8054cd 100644 --- a/Minecraft.World/Blocks/RepeaterTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/RepeaterTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.redstone.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../net.minecraft.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.level.h" +#include "../redstone/net.minecraft.world.level.redstone.h" #include "RepeaterTile.h" const double RepeaterTile::DELAY_RENDER_OFFSETS[4] = { diff --git a/Minecraft.World/Blocks/RepeaterTile.h b/Minecraft.World/net/minecraft/world/level/tile/RepeaterTile.h similarity index 100% rename from Minecraft.World/Blocks/RepeaterTile.h rename to Minecraft.World/net/minecraft/world/level/tile/RepeaterTile.h diff --git a/Minecraft.World/Blocks/RotatedPillarTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/RotatedPillarTile.cpp similarity index 95% rename from Minecraft.World/Blocks/RotatedPillarTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/RotatedPillarTile.cpp index 4d4b47e54..7c55f68f7 100644 --- a/Minecraft.World/Blocks/RotatedPillarTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/RotatedPillarTile.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../net.minecraft.h" #include "RotatedPillarTile.h" RotatedPillarTile::RotatedPillarTile(int id, Material* material) diff --git a/Minecraft.World/Blocks/RotatedPillarTile.h b/Minecraft.World/net/minecraft/world/level/tile/RotatedPillarTile.h similarity index 100% rename from Minecraft.World/Blocks/RotatedPillarTile.h rename to Minecraft.World/net/minecraft/world/level/tile/RotatedPillarTile.h diff --git a/Minecraft.World/Blocks/SandStoneTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/SandStoneTile.cpp similarity index 88% rename from Minecraft.World/Blocks/SandStoneTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/SandStoneTile.cpp index 25bd067eb..e36126463 100644 --- a/Minecraft.World/Blocks/SandStoneTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/SandStoneTile.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.level.material.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../net.minecraft.h" +#include "../material/net.minecraft.world.level.material.h" +#include "../../net.minecraft.world.h" #include "SandStoneTile.h" const std::wstring SandStoneTile::TEXTURE_TOP = L"sandstone_top"; diff --git a/Minecraft.World/Blocks/SandStoneTile.h b/Minecraft.World/net/minecraft/world/level/tile/SandStoneTile.h similarity index 100% rename from Minecraft.World/Blocks/SandStoneTile.h rename to Minecraft.World/net/minecraft/world/level/tile/SandStoneTile.h diff --git a/Minecraft.World/Blocks/SaplingPlantTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/SaplingPlantTile.cpp similarity index 94% rename from Minecraft.World/Blocks/SaplingPlantTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/SaplingPlantTile.cpp index c0c1ecdbd..ba9ccd744 100644 --- a/Minecraft.World/Blocks/SaplingPlantTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/SaplingPlantTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.levelgen.feature.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "../levelgen/feature/net.minecraft.world.level.levelgen.feature.h" +#include "../../net.minecraft.world.h" #include "SaplingPlantTile.h" diff --git a/Minecraft.World/Blocks/SaplingPlantTile.h b/Minecraft.World/net/minecraft/world/level/tile/SaplingPlantTile.h similarity index 100% rename from Minecraft.World/Blocks/SaplingPlantTile.h rename to Minecraft.World/net/minecraft/world/level/tile/SaplingPlantTile.h diff --git a/Minecraft.World/Blocks/SignTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/SignTile.cpp similarity index 93% rename from Minecraft.World/Blocks/SignTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/SignTile.cpp index 85c53aaf1..2884fb56c 100644 --- a/Minecraft.World/Blocks/SignTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/SignTile.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.item.h" -#include "Material.h" -#include "TileEntities/SignTileEntity.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../../item/net.minecraft.world.item.h" +#include "../material/Material.h" +#include "entity/SignTileEntity.h" #include "SignTile.h" -#include "Util/AABB.h" +#include "../../phys/AABB.h" #include diff --git a/Minecraft.World/Blocks/SignTile.h b/Minecraft.World/net/minecraft/world/level/tile/SignTile.h similarity index 91% rename from Minecraft.World/Blocks/SignTile.h rename to Minecraft.World/net/minecraft/world/level/tile/SignTile.h index 952b5e1cc..930715b2a 100644 --- a/Minecraft.World/Blocks/SignTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/SignTile.h @@ -2,10 +2,10 @@ #include #include "BaseEntityTile.h" -#include "TileEntities/TileEntity.h" +#include "entity/TileEntity.h" -#include "../Platform/stdafx.h" -#include "Material.h" +#include "../../../../../Header Files/stdafx.h" +#include "../material/Material.h" class SignTile : public BaseEntityTile { friend class Tile; diff --git a/Minecraft.World/Blocks/SkullTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/SkullTile.cpp similarity index 97% rename from Minecraft.World/Blocks/SkullTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/SkullTile.cpp index 8594baaad..fc1864c5d 100644 --- a/Minecraft.World/Blocks/SkullTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/SkullTile.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "../Entities/Mobs/WitherBoss.h" -#include "../Headers/net.minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.h" +#include "../../entity/item/net.minecraft.world.entity.item.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.level.h" +#include "entity/net.minecraft.world.level.tile.entity.h" +#include "../../entity/boss/wither/WitherBoss.h" +#include "../../../net.minecraft.h" #include "SkullTile.h" SkullTile::SkullTile(int id) : BaseEntityTile(id, Material::decoration, false) { diff --git a/Minecraft.World/Blocks/SkullTile.h b/Minecraft.World/net/minecraft/world/level/tile/SkullTile.h similarity index 100% rename from Minecraft.World/Blocks/SkullTile.h rename to Minecraft.World/net/minecraft/world/level/tile/SkullTile.h diff --git a/Minecraft.World/Blocks/SmoothStoneBrickTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/SmoothStoneBrickTile.cpp similarity index 94% rename from Minecraft.World/Blocks/SmoothStoneBrickTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/SmoothStoneBrickTile.cpp index 76faab042..18177e0b5 100644 --- a/Minecraft.World/Blocks/SmoothStoneBrickTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/SmoothStoneBrickTile.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "SmoothStoneBrickTile.h" -#include "../Headers/net.minecraft.world.h" +#include "../../net.minecraft.world.h" const std::wstring SmoothStoneBrickTile::TEXTURE_NAMES[] = { L"", L"mossy", L"cracked", L"carved"}; diff --git a/Minecraft.World/Blocks/SmoothStoneBrickTile.h b/Minecraft.World/net/minecraft/world/level/tile/SmoothStoneBrickTile.h similarity index 100% rename from Minecraft.World/Blocks/SmoothStoneBrickTile.h rename to Minecraft.World/net/minecraft/world/level/tile/SmoothStoneBrickTile.h diff --git a/Minecraft.World/Blocks/SnowTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/SnowTile.cpp similarity index 82% rename from Minecraft.World/Blocks/SnowTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/SnowTile.cpp index 801714d8b..e7bfdc31a 100644 --- a/Minecraft.World/Blocks/SnowTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/SnowTile.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../item/net.minecraft.world.item.h" #include "SnowTile.h" SnowTile::SnowTile(int id) : Tile(id, Material::snow) { setTicking(true); } diff --git a/Minecraft.World/Blocks/SnowTile.h b/Minecraft.World/net/minecraft/world/level/tile/SnowTile.h similarity index 100% rename from Minecraft.World/Blocks/SnowTile.h rename to Minecraft.World/net/minecraft/world/level/tile/SnowTile.h diff --git a/Minecraft.World/Blocks/SoulSandTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/SoulSandTile.cpp similarity index 74% rename from Minecraft.World/Blocks/SoulSandTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/SoulSandTile.cpp index b9f7b48df..070baf708 100644 --- a/Minecraft.World/Blocks/SoulSandTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/SoulSandTile.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.phys.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/net.minecraft.world.entity.h" +#include "../../phys/net.minecraft.world.phys.h" #include "SoulSandTile.h" SoulSandTile::SoulSandTile(int id) : Tile(id, Material::sand) {} diff --git a/Minecraft.World/Blocks/SoulSandTile.h b/Minecraft.World/net/minecraft/world/level/tile/SoulSandTile.h similarity index 84% rename from Minecraft.World/Blocks/SoulSandTile.h rename to Minecraft.World/net/minecraft/world/level/tile/SoulSandTile.h index b45c8dc53..6a19d52e5 100644 --- a/Minecraft.World/Blocks/SoulSandTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/SoulSandTile.h @@ -1,6 +1,6 @@ #pragma once #include "Tile.h" -#include "../Util/Definitions.h" +#include "../../../../../ConsoleHelpers/Definitions.h" class SoulSandTile : public Tile { public: diff --git a/Minecraft.World/Blocks/SpongeTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/SpongeTile.cpp similarity index 53% rename from Minecraft.World/Blocks/SpongeTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/SpongeTile.cpp index 434c98e6f..bec292e18 100644 --- a/Minecraft.World/Blocks/SpongeTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/SpongeTile.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" #include "SpongeTile.h" diff --git a/Minecraft.World/Blocks/SpongeTile.h b/Minecraft.World/net/minecraft/world/level/tile/SpongeTile.h similarity index 100% rename from Minecraft.World/Blocks/SpongeTile.h rename to Minecraft.World/net/minecraft/world/level/tile/SpongeTile.h diff --git a/Minecraft.World/Blocks/StainedGlassBlock.cpp b/Minecraft.World/net/minecraft/world/level/tile/StainedGlassBlock.cpp similarity index 88% rename from Minecraft.World/Blocks/StainedGlassBlock.cpp rename to Minecraft.World/net/minecraft/world/level/tile/StainedGlassBlock.cpp index 59f15729b..7fe2a4475 100644 --- a/Minecraft.World/Blocks/StainedGlassBlock.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/StainedGlassBlock.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../net.minecraft.world.h" #include "StainedGlassBlock.h" Icon* StainedGlassBlock::ICONS[StainedGlassBlock::ICONS_LENGTH]; diff --git a/Minecraft.World/Blocks/StainedGlassBlock.h b/Minecraft.World/net/minecraft/world/level/tile/StainedGlassBlock.h similarity index 100% rename from Minecraft.World/Blocks/StainedGlassBlock.h rename to Minecraft.World/net/minecraft/world/level/tile/StainedGlassBlock.h diff --git a/Minecraft.World/Blocks/StainedGlassPaneBlock.cpp b/Minecraft.World/net/minecraft/world/level/tile/StainedGlassPaneBlock.cpp similarity index 90% rename from Minecraft.World/Blocks/StainedGlassPaneBlock.cpp rename to Minecraft.World/net/minecraft/world/level/tile/StainedGlassPaneBlock.cpp index b1484a92d..79b083262 100644 --- a/Minecraft.World/Blocks/StainedGlassPaneBlock.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/StainedGlassPaneBlock.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.h" +#include "../../item/net.minecraft.world.item.h" #include "StainedGlassPaneBlock.h" Icon* StainedGlassPaneBlock::ICONS[StainedGlassPaneBlock::ICONS_COUNT]; diff --git a/Minecraft.World/Blocks/StainedGlassPaneBlock.h b/Minecraft.World/net/minecraft/world/level/tile/StainedGlassPaneBlock.h similarity index 100% rename from Minecraft.World/Blocks/StainedGlassPaneBlock.h rename to Minecraft.World/net/minecraft/world/level/tile/StainedGlassPaneBlock.h diff --git a/Minecraft.World/Blocks/StairTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/StairTile.cpp similarity index 98% rename from Minecraft.World/Blocks/StairTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/StairTile.cpp index 7cf98ba3f..a32b78392 100644 --- a/Minecraft.World/Blocks/StairTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/StairTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/net.minecraft.world.entity.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../net.minecraft.world.level.h" +#include "../../../net.minecraft.h" #include "StairTile.h" int StairTile::DEAD_SPACES[8][2] = {{2, 6}, {3, 7}, {2, 3}, {6, 7}, diff --git a/Minecraft.World/Blocks/StairTile.h b/Minecraft.World/net/minecraft/world/level/tile/StairTile.h similarity index 100% rename from Minecraft.World/Blocks/StairTile.h rename to Minecraft.World/net/minecraft/world/level/tile/StairTile.h diff --git a/Minecraft.World/Blocks/StemTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/StemTile.cpp similarity index 94% rename from Minecraft.World/Blocks/StemTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/StemTile.cpp index 4f8665136..acc805dab 100644 --- a/Minecraft.World/Blocks/StemTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/StemTile.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Platform/Common/Colours/ColourTable.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../entity/item/net.minecraft.world.entity.item.h" +#include "../net.minecraft.world.level.h" +#include "../../net.minecraft.world.h" +#include "../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../../Minecraft.Client/Common/Source Files/Colours/ColourTable.h" #include "StemTile.h" const std::wstring StemTile::TEXTURE_ANGLED = L"stem_bent"; diff --git a/Minecraft.World/Blocks/StemTile.h b/Minecraft.World/net/minecraft/world/level/tile/StemTile.h similarity index 100% rename from Minecraft.World/Blocks/StemTile.h rename to Minecraft.World/net/minecraft/world/level/tile/StemTile.h diff --git a/Minecraft.World/Blocks/StoneButtonTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/StoneButtonTile.cpp similarity index 70% rename from Minecraft.World/Blocks/StoneButtonTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/StoneButtonTile.cpp index 99bfb96a0..4e8090573 100644 --- a/Minecraft.World/Blocks/StoneButtonTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/StoneButtonTile.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../net.minecraft.h" #include "StoneButtonTile.h" StoneButtonTile::StoneButtonTile(int id) : ButtonTile(id, false) {} diff --git a/Minecraft.World/Blocks/StoneButtonTile.h b/Minecraft.World/net/minecraft/world/level/tile/StoneButtonTile.h similarity index 100% rename from Minecraft.World/Blocks/StoneButtonTile.h rename to Minecraft.World/net/minecraft/world/level/tile/StoneButtonTile.h diff --git a/Minecraft.World/Blocks/StoneMonsterTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/StoneMonsterTile.cpp similarity index 93% rename from Minecraft.World/Blocks/StoneMonsterTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/StoneMonsterTile.cpp index 09af1cf27..9c1b3ea52 100644 --- a/Minecraft.World/Blocks/StoneMonsterTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/StoneMonsterTile.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.monster.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/monster/net.minecraft.world.entity.monster.h" +#include "../net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" #include "StoneMonsterTile.h" const unsigned int diff --git a/Minecraft.World/Blocks/StoneMonsterTile.h b/Minecraft.World/net/minecraft/world/level/tile/StoneMonsterTile.h similarity index 100% rename from Minecraft.World/Blocks/StoneMonsterTile.h rename to Minecraft.World/net/minecraft/world/level/tile/StoneMonsterTile.h diff --git a/Minecraft.World/Blocks/StoneSlabTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/StoneSlabTile.cpp similarity index 91% rename from Minecraft.World/Blocks/StoneSlabTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/StoneSlabTile.cpp index 845bc1689..5f33d7314 100644 --- a/Minecraft.World/Blocks/StoneSlabTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/StoneSlabTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../net.minecraft.h" +#include "../net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "../../net.minecraft.world.h" #include "StoneSlabTile.h" const unsigned int StoneSlabTile::SLAB_NAMES[SLAB_NAMES_LENGTH] = { diff --git a/Minecraft.World/Blocks/StoneSlabTile.h b/Minecraft.World/net/minecraft/world/level/tile/StoneSlabTile.h similarity index 100% rename from Minecraft.World/Blocks/StoneSlabTile.h rename to Minecraft.World/net/minecraft/world/level/tile/StoneSlabTile.h diff --git a/Minecraft.World/Blocks/StoneTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/StoneTile.cpp similarity index 80% rename from Minecraft.World/Blocks/StoneTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/StoneTile.cpp index 8d22a5879..8cc313703 100644 --- a/Minecraft.World/Blocks/StoneTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/StoneTile.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "StoneTile.h" StoneTile::StoneTile(int id) : Tile(id, Material::stone) {} diff --git a/Minecraft.World/Blocks/StoneTile.h b/Minecraft.World/net/minecraft/world/level/tile/StoneTile.h similarity index 100% rename from Minecraft.World/Blocks/StoneTile.h rename to Minecraft.World/net/minecraft/world/level/tile/StoneTile.h diff --git a/Minecraft.World/Blocks/TallGrassPlantTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/TallGrassPlantTile.cpp similarity index 89% rename from Minecraft.World/Blocks/TallGrassPlantTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/TallGrassPlantTile.cpp index 3367d28ca..194c0acfa 100644 --- a/Minecraft.World/Blocks/TallGrassPlantTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/TallGrassPlantTile.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.biome.h" -#include "../Headers/net.minecraft.stats.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.level.h" +#include "../biome/net.minecraft.world.level.biome.h" +#include "../../../stats/net.minecraft.stats.h" +#include "../../net.minecraft.world.h" #include "TallGrassPlantTile.h" const unsigned int diff --git a/Minecraft.World/Blocks/TallGrassPlantTile.h b/Minecraft.World/net/minecraft/world/level/tile/TallGrassPlantTile.h similarity index 100% rename from Minecraft.World/Blocks/TallGrassPlantTile.h rename to Minecraft.World/net/minecraft/world/level/tile/TallGrassPlantTile.h diff --git a/Minecraft.World/Blocks/TheEndPortalFrameTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/TheEndPortalFrameTile.cpp similarity index 92% rename from Minecraft.World/Blocks/TheEndPortalFrameTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/TheEndPortalFrameTile.cpp index 2c531b244..4fe615f56 100644 --- a/Minecraft.World/Blocks/TheEndPortalFrameTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/TheEndPortalFrameTile.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "TheEndPortalFrameTile.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.redstone.h" -#include "../Headers/net.minecraft.world.h" -#include "../Util/Facing.h" +#include "../net.minecraft.world.level.h" +#include "../redstone/net.minecraft.world.level.redstone.h" +#include "../../net.minecraft.world.h" +#include "../../../Facing.h" const std::wstring TheEndPortalFrameTile::TEXTURE_EYE = L"endframe_eye"; diff --git a/Minecraft.World/Blocks/TheEndPortalFrameTile.h b/Minecraft.World/net/minecraft/world/level/tile/TheEndPortalFrameTile.h similarity index 100% rename from Minecraft.World/Blocks/TheEndPortalFrameTile.h rename to Minecraft.World/net/minecraft/world/level/tile/TheEndPortalFrameTile.h diff --git a/Minecraft.World/Blocks/ThinFenceTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/ThinFenceTile.cpp similarity index 96% rename from Minecraft.World/Blocks/ThinFenceTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/ThinFenceTile.cpp index b11a29bfa..7b0257264 100644 --- a/Minecraft.World/Blocks/ThinFenceTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/ThinFenceTile.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "ThinFenceTile.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.h" +#include "../net.minecraft.world.level.h" +#include "../../net.minecraft.world.h" ThinFenceTile::ThinFenceTile(int id, const std::wstring& tex, const std::wstring& edgeTex, Material* material, diff --git a/Minecraft.World/Blocks/ThinFenceTile.h b/Minecraft.World/net/minecraft/world/level/tile/ThinFenceTile.h similarity index 96% rename from Minecraft.World/Blocks/ThinFenceTile.h rename to Minecraft.World/net/minecraft/world/level/tile/ThinFenceTile.h index d7ba84fa0..324cdf66b 100644 --- a/Minecraft.World/Blocks/ThinFenceTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/ThinFenceTile.h @@ -1,6 +1,6 @@ #pragma once #include "Tile.h" -#include "../Util/Definitions.h" +#include "../../../../../ConsoleHelpers/Definitions.h" class ThinFenceTile : public Tile { private: diff --git a/Minecraft.World/Blocks/Tile.cpp b/Minecraft.World/net/minecraft/world/level/tile/Tile.cpp similarity index 99% rename from Minecraft.World/Blocks/Tile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/Tile.cpp index 995e37598..5fa259587 100644 --- a/Minecraft.World/Blocks/Tile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/Tile.cpp @@ -1,21 +1,21 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.stats.h" -#include "../Headers/net.minecraft.locale.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.item.enchantment.h" -#include "../Headers/net.minecraft.world.level.material.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.tile.entity.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.redstone.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.food.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.h" -#include "Util/Vec3.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../stats/net.minecraft.stats.h" +#include "../../../locale/net.minecraft.locale.h" +#include "../../entity/net.minecraft.world.entity.h" +#include "../../entity/item/net.minecraft.world.entity.item.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../item/enchantment/net.minecraft.world.item.enchantment.h" +#include "../material/net.minecraft.world.level.material.h" +#include "net.minecraft.world.level.tile.h" +#include "entity/net.minecraft.world.level.tile.entity.h" +#include "../net.minecraft.world.level.h" +#include "../redstone/net.minecraft.world.level.redstone.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../food/net.minecraft.world.food.h" +#include "../../net.minecraft.world.h" +#include "../../../net.minecraft.h" +#include "../../phys/Vec3.h" #include "Tile.h" #include diff --git a/Minecraft.World/Blocks/Tile.h b/Minecraft.World/net/minecraft/world/level/tile/Tile.h similarity index 99% rename from Minecraft.World/Blocks/Tile.h rename to Minecraft.World/net/minecraft/world/level/tile/Tile.h index baffa8ebb..61c0e2283 100644 --- a/Minecraft.World/Blocks/Tile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/Tile.h @@ -1,8 +1,8 @@ #pragma once -#include "Material.h" -#include "../Util/Vec3.h" -#include "../Util/Definitions.h" -#include "../Util/SoundTypes.h" +#include "../material/Material.h" +#include "../../phys/Vec3.h" +#include "../../../../../ConsoleHelpers/Definitions.h" +#include "../../../../../Header Files/SoundTypes.h" #include #include diff --git a/Minecraft.World/Blocks/TntTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/TntTile.cpp similarity index 91% rename from Minecraft.World/Blocks/TntTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/TntTile.cpp index e067d0569..914419cc4 100644 --- a/Minecraft.World/Blocks/TntTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/TntTile.cpp @@ -1,13 +1,13 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.entity.projectile.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../../entity/item/net.minecraft.world.entity.item.h" +#include "../../entity/projectile/net.minecraft.world.entity.projectile.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../net.minecraft.world.h" +#include "../../../net.minecraft.h" #include "TntTile.h" -#include "../Util/SoundTypes.h" +#include "../../../../../Header Files/SoundTypes.h" TntTile::TntTile(int id) : Tile(id, Material::explosive) { iconTop = nullptr; diff --git a/Minecraft.World/Blocks/TntTile.h b/Minecraft.World/net/minecraft/world/level/tile/TntTile.h similarity index 100% rename from Minecraft.World/Blocks/TntTile.h rename to Minecraft.World/net/minecraft/world/level/tile/TntTile.h diff --git a/Minecraft.World/Blocks/TopSnowTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/TopSnowTile.cpp similarity index 92% rename from Minecraft.World/Blocks/TopSnowTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/TopSnowTile.cpp index 54a5ea5a3..e31c2008a 100644 --- a/Minecraft.World/Blocks/TopSnowTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/TopSnowTile.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.stats.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../stats/net.minecraft.stats.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../../entity/item/net.minecraft.world.entity.item.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.level.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../net.minecraft.world.h" #include "TopSnowTile.h" const int TopSnowTile::MAX_HEIGHT = 6; diff --git a/Minecraft.World/Blocks/TopSnowTile.h b/Minecraft.World/net/minecraft/world/level/tile/TopSnowTile.h similarity index 100% rename from Minecraft.World/Blocks/TopSnowTile.h rename to Minecraft.World/net/minecraft/world/level/tile/TopSnowTile.h diff --git a/Minecraft.World/Blocks/TorchTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/TorchTile.cpp similarity index 97% rename from Minecraft.World/Blocks/TorchTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/TorchTile.cpp index c3d742531..ac6bba5f1 100644 --- a/Minecraft.World/Blocks/TorchTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/TorchTile.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" #include "TorchTile.h" #include -#include "Util/AABB.h" +#include "../../phys/AABB.h" TorchTile::TorchTile(int id) : Tile(id, Material::decoration, false) { this->setTicking(true); diff --git a/Minecraft.World/Blocks/TorchTile.h b/Minecraft.World/net/minecraft/world/level/tile/TorchTile.h similarity index 97% rename from Minecraft.World/Blocks/TorchTile.h rename to Minecraft.World/net/minecraft/world/level/tile/TorchTile.h index 525f851cc..b8312881e 100644 --- a/Minecraft.World/Blocks/TorchTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/TorchTile.h @@ -1,6 +1,6 @@ #pragma once #include "Tile.h" -#include "../Util/Definitions.h" +#include "../../../../../ConsoleHelpers/Definitions.h" class Random; class HitResult; diff --git a/Minecraft.World/Blocks/TransparentTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/TransparentTile.cpp similarity index 87% rename from Minecraft.World/Blocks/TransparentTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/TransparentTile.cpp index 44fddb081..55ce7283f 100644 --- a/Minecraft.World/Blocks/TransparentTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/TransparentTile.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" #include "TransparentTile.h" TransparentTile::TransparentTile(int id, Material* material, bool allowSame, diff --git a/Minecraft.World/Blocks/TransparentTile.h b/Minecraft.World/net/minecraft/world/level/tile/TransparentTile.h similarity index 100% rename from Minecraft.World/Blocks/TransparentTile.h rename to Minecraft.World/net/minecraft/world/level/tile/TransparentTile.h diff --git a/Minecraft.World/Blocks/TrapDoorTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/TrapDoorTile.cpp similarity index 95% rename from Minecraft.World/Blocks/TrapDoorTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/TrapDoorTile.cpp index 97efb0390..7ad5c5161 100644 --- a/Minecraft.World/Blocks/TrapDoorTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/TrapDoorTile.cpp @@ -1,10 +1,10 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "net.minecraft.world.level.tile.h" +#include "../../../net.minecraft.h" #include "TrapDoorTile.h" -#include "Util/AABB.h" +#include "../../phys/AABB.h" TrapDoorTile::TrapDoorTile(int id, Material* material) : Tile(id, material, false) { diff --git a/Minecraft.World/Blocks/TrapDoorTile.h b/Minecraft.World/net/minecraft/world/level/tile/TrapDoorTile.h similarity index 100% rename from Minecraft.World/Blocks/TrapDoorTile.h rename to Minecraft.World/net/minecraft/world/level/tile/TrapDoorTile.h diff --git a/Minecraft.World/Blocks/TreeTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/TreeTile.cpp similarity index 92% rename from Minecraft.World/Blocks/TreeTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/TreeTile.cpp index 8bf398d18..ba3937938 100644 --- a/Minecraft.World/Blocks/TreeTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/TreeTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.piston.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "piston/net.minecraft.world.level.tile.piston.h" +#include "../../../net.minecraft.h" +#include "../../net.minecraft.world.h" #include "LeafTile.h" #include "TreeTile.h" diff --git a/Minecraft.World/Blocks/TreeTile.h b/Minecraft.World/net/minecraft/world/level/tile/TreeTile.h similarity index 100% rename from Minecraft.World/Blocks/TreeTile.h rename to Minecraft.World/net/minecraft/world/level/tile/TreeTile.h diff --git a/Minecraft.World/Blocks/TripWireSourceTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/TripWireSourceTile.cpp similarity index 97% rename from Minecraft.World/Blocks/TripWireSourceTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/TripWireSourceTile.cpp index f2e4a4a30..f3524c2e0 100644 --- a/Minecraft.World/Blocks/TripWireSourceTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/TripWireSourceTile.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.level.redstone.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../net.minecraft.h" +#include "../net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "../redstone/net.minecraft.world.level.redstone.h" #include "TripWireSourceTile.h" #include "optional" -#include "Util/AABB.h" +#include "../../phys/AABB.h" TripWireSourceTile::TripWireSourceTile(int id) : Tile(id, Material::decoration, false) { diff --git a/Minecraft.World/Blocks/TripWireSourceTile.h b/Minecraft.World/net/minecraft/world/level/tile/TripWireSourceTile.h similarity index 100% rename from Minecraft.World/Blocks/TripWireSourceTile.h rename to Minecraft.World/net/minecraft/world/level/tile/TripWireSourceTile.h diff --git a/Minecraft.World/Blocks/TripWireTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/TripWireTile.cpp similarity index 96% rename from Minecraft.World/Blocks/TripWireTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/TripWireTile.cpp index 3fc850110..adccc308c 100644 --- a/Minecraft.World/Blocks/TripWireTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/TripWireTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.phys.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../item/net.minecraft.world.item.h" +#include "../net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" #include "TripWireTile.h" #include diff --git a/Minecraft.World/Blocks/TripWireTile.h b/Minecraft.World/net/minecraft/world/level/tile/TripWireTile.h similarity index 100% rename from Minecraft.World/Blocks/TripWireTile.h rename to Minecraft.World/net/minecraft/world/level/tile/TripWireTile.h diff --git a/Minecraft.World/Blocks/VineTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/VineTile.cpp similarity index 97% rename from Minecraft.World/Blocks/VineTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/VineTile.cpp index 3c527ece7..1f9fcf8b6 100644 --- a/Minecraft.World/Blocks/VineTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/VineTile.cpp @@ -1,13 +1,13 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "VineTile.h" -#include "Material.h" -#include "../Util/JavaMath.h" -#include "../Util/Facing.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.stats.h" -#include "../Headers/net.minecraft.world.level.biome.h" -#include "Util/AABB.h" +#include "../material/Material.h" +#include "../../../../../ConsoleJavaLibs/JavaMath.h" +#include "../../../Facing.h" +#include "../net.minecraft.world.level.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../../stats/net.minecraft.stats.h" +#include "../biome/net.minecraft.world.level.biome.h" +#include "../../phys/AABB.h" VineTile::VineTile(int id) : Tile(id, Material::replaceable_plant, false) { setTicking(true); diff --git a/Minecraft.World/Blocks/VineTile.h b/Minecraft.World/net/minecraft/world/level/tile/VineTile.h similarity index 98% rename from Minecraft.World/Blocks/VineTile.h rename to Minecraft.World/net/minecraft/world/level/tile/VineTile.h index dc123a38c..3a09402b9 100644 --- a/Minecraft.World/Blocks/VineTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/VineTile.h @@ -1,6 +1,6 @@ #pragma once #include "Tile.h" -#include "../Util/Direction.h" +#include "../../../Direction.h" class Level; class LevelSource; diff --git a/Minecraft.World/Blocks/WallTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/WallTile.cpp similarity index 94% rename from Minecraft.World/Blocks/WallTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/WallTile.cpp index 8ebe33a39..80407daa3 100644 --- a/Minecraft.World/Blocks/WallTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/WallTile.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.tile.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../net.minecraft.world.level.h" +#include "net.minecraft.world.level.tile.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../../net.minecraft.world.h" +#include "../../../net.minecraft.h" #include "WallTile.h" const float WallTile::WALL_WIDTH = 3.0f / 16.0f; diff --git a/Minecraft.World/Blocks/WallTile.h b/Minecraft.World/net/minecraft/world/level/tile/WallTile.h similarity index 100% rename from Minecraft.World/Blocks/WallTile.h rename to Minecraft.World/net/minecraft/world/level/tile/WallTile.h diff --git a/Minecraft.World/Blocks/WaterLilyTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/WaterLilyTile.cpp similarity index 89% rename from Minecraft.World/Blocks/WaterLilyTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/WaterLilyTile.cpp index 29f76bc34..7145db598 100644 --- a/Minecraft.World/Blocks/WaterLilyTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/WaterLilyTile.cpp @@ -1,9 +1,9 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "WaterLilyTile.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../Util/AABB.h" +#include "../net.minecraft.world.level.h" +#include "../../entity/item/net.minecraft.world.entity.item.h" +#include "../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../../phys/AABB.h" WaterlilyTile::WaterlilyTile(int id) : Bush(id) { this->updateDefaultShape(); } diff --git a/Minecraft.World/Blocks/WaterLilyTile.h b/Minecraft.World/net/minecraft/world/level/tile/WaterLilyTile.h similarity index 100% rename from Minecraft.World/Blocks/WaterLilyTile.h rename to Minecraft.World/net/minecraft/world/level/tile/WaterLilyTile.h diff --git a/Minecraft.World/Blocks/WebTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/WebTile.cpp similarity index 81% rename from Minecraft.World/Blocks/WebTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/WebTile.cpp index 043079a99..14046bb92 100644 --- a/Minecraft.World/Blocks/WebTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/WebTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.item.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/net.minecraft.world.entity.h" +#include "../../item/net.minecraft.world.item.h" #include "WebTile.h" -#include "Util/AABB.h" +#include "../../phys/AABB.h" WebTile::WebTile(int id) : Tile(id, Material::web) {} diff --git a/Minecraft.World/Blocks/WebTile.h b/Minecraft.World/net/minecraft/world/level/tile/WebTile.h similarity index 100% rename from Minecraft.World/Blocks/WebTile.h rename to Minecraft.World/net/minecraft/world/level/tile/WebTile.h diff --git a/Minecraft.World/Blocks/WeightedPressurePlateTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/WeightedPressurePlateTile.cpp similarity index 80% rename from Minecraft.World/Blocks/WeightedPressurePlateTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/WeightedPressurePlateTile.cpp index 850a21dfc..18a429aec 100644 --- a/Minecraft.World/Blocks/WeightedPressurePlateTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/WeightedPressurePlateTile.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.item.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.redstone.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Entities/Entity.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/item/net.minecraft.world.entity.item.h" +#include "../net.minecraft.world.level.h" +#include "../redstone/net.minecraft.world.level.redstone.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../entity/Entity.h" #include "WeightedPressurePlateTile.h" -#include "Util/AABB.h" +#include "../../phys/AABB.h" WeightedPressurePlateTile::WeightedPressurePlateTile(int id, const std::wstring& tex, diff --git a/Minecraft.World/Blocks/WeightedPressurePlateTile.h b/Minecraft.World/net/minecraft/world/level/tile/WeightedPressurePlateTile.h similarity index 100% rename from Minecraft.World/Blocks/WeightedPressurePlateTile.h rename to Minecraft.World/net/minecraft/world/level/tile/WeightedPressurePlateTile.h diff --git a/Minecraft.World/Blocks/WoodButtonTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/WoodButtonTile.cpp similarity index 70% rename from Minecraft.World/Blocks/WoodButtonTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/WoodButtonTile.cpp index 3129003de..ad691b2e9 100644 --- a/Minecraft.World/Blocks/WoodButtonTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/WoodButtonTile.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../../net.minecraft.h" #include "WoodButtonTile.h" WoodButtonTile::WoodButtonTile(int id) : ButtonTile(id, true) {} diff --git a/Minecraft.World/Blocks/WoodButtonTile.h b/Minecraft.World/net/minecraft/world/level/tile/WoodButtonTile.h similarity index 100% rename from Minecraft.World/Blocks/WoodButtonTile.h rename to Minecraft.World/net/minecraft/world/level/tile/WoodButtonTile.h diff --git a/Minecraft.World/Blocks/WoodSlabTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/WoodSlabTile.cpp similarity index 85% rename from Minecraft.World/Blocks/WoodSlabTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/WoodSlabTile.cpp index b0d8b7abd..242a5c46d 100644 --- a/Minecraft.World/Blocks/WoodSlabTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/WoodSlabTile.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "WoodSlabTile.h" #include "WoodTile.h" #include "TreeTile.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.biome.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.stats.h" +#include "../net.minecraft.world.level.h" +#include "../biome/net.minecraft.world.level.biome.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../../stats/net.minecraft.stats.h" const unsigned int WoodSlabTile::SLAB_NAMES[SLAB_NAMES_LENGTH] = { IDS_TILE_STONESLAB_OAK, diff --git a/Minecraft.World/Blocks/WoodSlabTile.h b/Minecraft.World/net/minecraft/world/level/tile/WoodSlabTile.h similarity index 100% rename from Minecraft.World/Blocks/WoodSlabTile.h rename to Minecraft.World/net/minecraft/world/level/tile/WoodSlabTile.h diff --git a/Minecraft.World/Blocks/WoodTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/WoodTile.cpp similarity index 80% rename from Minecraft.World/Blocks/WoodTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/WoodTile.cpp index 39c6def5a..c6a1dec3b 100644 --- a/Minecraft.World/Blocks/WoodTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/WoodTile.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "WoodTile.h" #include "TreeTile.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.biome.h" -#include "../Headers/net.minecraft.world.item.h" -#include "../Headers/net.minecraft.stats.h" -#include "../Headers/net.minecraft.world.h" +#include "../net.minecraft.world.level.h" +#include "../biome/net.minecraft.world.level.biome.h" +#include "../../item/net.minecraft.world.item.h" +#include "../../../stats/net.minecraft.stats.h" +#include "../../net.minecraft.world.h" const unsigned int WoodTile::WOOD_NAMES[WOOD_NAMES_LENGTH] = { IDS_TILE_OAKWOOD_PLANKS, diff --git a/Minecraft.World/Blocks/WoodTile.h b/Minecraft.World/net/minecraft/world/level/tile/WoodTile.h similarity index 100% rename from Minecraft.World/Blocks/WoodTile.h rename to Minecraft.World/net/minecraft/world/level/tile/WoodTile.h diff --git a/Minecraft.World/Blocks/WoolCarpetTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/WoolCarpetTile.cpp similarity index 93% rename from Minecraft.World/Blocks/WoolCarpetTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/WoolCarpetTile.cpp index 23222cb18..525e42ee3 100644 --- a/Minecraft.World/Blocks/WoolCarpetTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/WoolCarpetTile.cpp @@ -1,7 +1,7 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.phys.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Util/SharedConstants.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../phys/net.minecraft.world.phys.h" +#include "../net.minecraft.world.level.h" +#include "../../../SharedConstants.h" #include "WoolCarpetTile.h" WoolCarpetTile::WoolCarpetTile(int id) diff --git a/Minecraft.World/Blocks/WoolCarpetTile.h b/Minecraft.World/net/minecraft/world/level/tile/WoolCarpetTile.h similarity index 100% rename from Minecraft.World/Blocks/WoolCarpetTile.h rename to Minecraft.World/net/minecraft/world/level/tile/WoolCarpetTile.h diff --git a/Minecraft.World/Blocks/WorkbenchTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/WorkbenchTile.cpp similarity index 83% rename from Minecraft.World/Blocks/WorkbenchTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/WorkbenchTile.cpp index 8929f2116..cadbcc8f3 100644 --- a/Minecraft.World/Blocks/WorkbenchTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/WorkbenchTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.h" -#include "../Headers/net.minecraft.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" +#include "../net.minecraft.world.level.h" +#include "../../net.minecraft.world.h" +#include "../../../net.minecraft.h" #include "WorkbenchTile.h" WorkbenchTile::WorkbenchTile(int id) : Tile(id, Material::wood) { diff --git a/Minecraft.World/Blocks/WorkbenchTile.h b/Minecraft.World/net/minecraft/world/level/tile/WorkbenchTile.h similarity index 100% rename from Minecraft.World/Blocks/WorkbenchTile.h rename to Minecraft.World/net/minecraft/world/level/tile/WorkbenchTile.h diff --git a/Minecraft.World/Blocks/TileEntities/BeaconTileEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/BeaconTileEntity.cpp similarity index 95% rename from Minecraft.World/Blocks/TileEntities/BeaconTileEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/BeaconTileEntity.cpp index 90ee61dd9..2b3a03672 100644 --- a/Minecraft.World/Blocks/TileEntities/BeaconTileEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/BeaconTileEntity.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.network.packet.h" -#include "../../Headers/net.minecraft.world.effect.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../network/packet/net.minecraft.network.packet.h" +#include "../../../effect/net.minecraft.world.effect.h" +#include "../../../entity/player/net.minecraft.world.entity.player.h" +#include "../../../item/net.minecraft.world.item.h" +#include "../../net.minecraft.world.level.h" +#include "../net.minecraft.world.level.tile.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "BeaconTileEntity.h" std::shared_ptr BeaconTileEntity::clone() { diff --git a/Minecraft.World/Blocks/TileEntities/BeaconTileEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/BeaconTileEntity.h similarity index 98% rename from Minecraft.World/Blocks/TileEntities/BeaconTileEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/BeaconTileEntity.h index 64d6af548..d5c4ea070 100644 --- a/Minecraft.World/Blocks/TileEntities/BeaconTileEntity.h +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/BeaconTileEntity.h @@ -1,6 +1,6 @@ #pragma once #include "TileEntity.h" -#include "../../Containers/Container.h" +#include "../../../Container.h" class BeaconTileEntity : public TileEntity, public Container { public: diff --git a/Minecraft.World/Blocks/TileEntities/BrewingStandTileEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/BrewingStandTileEntity.cpp similarity index 97% rename from Minecraft.World/Blocks/TileEntities/BrewingStandTileEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/BrewingStandTileEntity.cpp index 8341a6758..8c0c2a067 100644 --- a/Minecraft.World/Blocks/TileEntities/BrewingStandTileEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/BrewingStandTileEntity.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../../../com/mojang/nbt/com.mojang.nbt.h" #include "BrewingStandTileEntity.h" -#include "../../Util/SharedConstants.h" -#include "../../Headers/net.minecraft.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.item.alchemy.h" +#include "../../../../SharedConstants.h" +#include "../../../../net.minecraft.h" +#include "../../net.minecraft.world.level.h" +#include "../../../item/net.minecraft.world.item.h" +#include "../../../item/alchemy/net.minecraft.world.item.alchemy.h" int slotsForUp[] = {BrewingStandTileEntity::INGREDIENT_SLOT}; int slotsForOtherFaces[] = {0, 1, 2}; diff --git a/Minecraft.World/Blocks/TileEntities/BrewingStandTileEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/BrewingStandTileEntity.h similarity index 97% rename from Minecraft.World/Blocks/TileEntities/BrewingStandTileEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/BrewingStandTileEntity.h index 13f689576..313e5d56c 100644 --- a/Minecraft.World/Blocks/TileEntities/BrewingStandTileEntity.h +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/BrewingStandTileEntity.h @@ -1,6 +1,6 @@ #pragma once #include "TileEntity.h" -#include "../../Containers/WorldlyContainer.h" +#include "../../../WorldlyContainer.h" class BrewingStandTileEntity : public TileEntity, public WorldlyContainer { public: diff --git a/Minecraft.World/Blocks/TileEntities/ChestTileEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/ChestTileEntity.cpp similarity index 94% rename from Minecraft.World/Blocks/TileEntities/ChestTileEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/ChestTileEntity.cpp index 2a17b1566..e7945c4a5 100644 --- a/Minecraft.World/Blocks/TileEntities/ChestTileEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/ChestTileEntity.cpp @@ -1,17 +1,17 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../Headers/net.minecraft.world.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../../../net.minecraft.world.h" +#include "../../net.minecraft.world.level.h" #include "TileEntity.h" -#include "../../Headers/net.minecraft.world.entity.item.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.inventory.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.phys.h" +#include "../../../entity/item/net.minecraft.world.entity.item.h" +#include "../../../entity/player/net.minecraft.world.entity.player.h" +#include "../../../item/net.minecraft.world.item.h" +#include "../../../inventory/net.minecraft.world.inventory.h" +#include "../net.minecraft.world.level.tile.h" +#include "../../../phys/net.minecraft.world.phys.h" #include "ChestTileEntity.h" -#include "../../Network/Packets/ContainerOpenPacket.h" -#include "../../Util/SoundTypes.h" +#include "../../../../network/packet/ContainerOpenPacket.h" +#include "../../../../../../Header Files/SoundTypes.h" int ChestTileEntity::getContainerType() { if (isBonusChest) diff --git a/Minecraft.World/Blocks/TileEntities/ChestTileEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/ChestTileEntity.h similarity index 96% rename from Minecraft.World/Blocks/TileEntities/ChestTileEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/ChestTileEntity.h index 5705aa8e2..9d9ade4f8 100644 --- a/Minecraft.World/Blocks/TileEntities/ChestTileEntity.h +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/ChestTileEntity.h @@ -1,9 +1,9 @@ #pragma once #include "TileEntity.h" -#include "../../Containers/Container.h" +#include "../../../Container.h" -#include "../../IO/NBT/ListTag.h" +#include "../../../../../../com/mojang/nbt/ListTag.h" class Player; class CompoundTag; diff --git a/Minecraft.World/Blocks/TileEntities/CommandBlockEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/CommandBlockEntity.cpp similarity index 88% rename from Minecraft.World/Blocks/TileEntities/CommandBlockEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/CommandBlockEntity.cpp index 576ea0612..f45c036ed 100644 --- a/Minecraft.World/Blocks/TileEntities/CommandBlockEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/CommandBlockEntity.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.network.packet.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.commands.h" -#include "../../../Minecraft.Client/MinecraftServer.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../network/packet/net.minecraft.network.packet.h" +#include "../../net.minecraft.world.level.h" +#include "../../../../commands/net.minecraft.commands.h" +#include "../../../Minecraft.Client/net/minecraft/server/MinecraftServer.h" #include "CommandBlockEntity.h" CommandBlockEntity::CommandBlockEntity() { diff --git a/Minecraft.World/Blocks/TileEntities/CommandBlockEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/CommandBlockEntity.h similarity index 96% rename from Minecraft.World/Blocks/TileEntities/CommandBlockEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/CommandBlockEntity.h index c6d4fae6f..4727809e5 100644 --- a/Minecraft.World/Blocks/TileEntities/CommandBlockEntity.h +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/CommandBlockEntity.h @@ -1,7 +1,7 @@ #pragma once #include "TileEntity.h" -#include "../../Commands/CommandSender.h" +#include "../../../../commands/CommandSender.h" class ChatMessageComponent; diff --git a/Minecraft.World/Blocks/TileEntities/ComparatorTileEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/ComparatorTileEntity.cpp similarity index 93% rename from Minecraft.World/Blocks/TileEntities/ComparatorTileEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/ComparatorTileEntity.cpp index 35aa56b83..98132c9ac 100644 --- a/Minecraft.World/Blocks/TileEntities/ComparatorTileEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/ComparatorTileEntity.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "ComparatorTileEntity.h" diff --git a/Minecraft.World/Blocks/TileEntities/ComparatorTileEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/ComparatorTileEntity.h similarity index 100% rename from Minecraft.World/Blocks/TileEntities/ComparatorTileEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/ComparatorTileEntity.h diff --git a/Minecraft.World/Blocks/TileEntities/DaylightDetectorTileEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/DaylightDetectorTileEntity.cpp similarity index 84% rename from Minecraft.World/Blocks/TileEntities/DaylightDetectorTileEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/DaylightDetectorTileEntity.cpp index 786dda13d..d52c64140 100644 --- a/Minecraft.World/Blocks/TileEntities/DaylightDetectorTileEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/DaylightDetectorTileEntity.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../net.minecraft.world.level.tile.h" #include "DaylightDetectorTileEntity.h" DaylightDetectorTileEntity::DaylightDetectorTileEntity() {} diff --git a/Minecraft.World/Blocks/TileEntities/DaylightDetectorTileEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/DaylightDetectorTileEntity.h similarity index 100% rename from Minecraft.World/Blocks/TileEntities/DaylightDetectorTileEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/DaylightDetectorTileEntity.h diff --git a/Minecraft.World/Blocks/TileEntities/DispenserTileEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/DispenserTileEntity.cpp similarity index 94% rename from Minecraft.World/Blocks/TileEntities/DispenserTileEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/DispenserTileEntity.cpp index 57052df4d..3e4ed16b9 100644 --- a/Minecraft.World/Blocks/TileEntities/DispenserTileEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/DispenserTileEntity.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../../../com/mojang/nbt/com.mojang.nbt.h" #include "TileEntity.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.entity.item.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.item.h" +#include "../../net.minecraft.world.level.h" +#include "../../../entity/item/net.minecraft.world.entity.item.h" +#include "../../../entity/player/net.minecraft.world.entity.player.h" +#include "../../../item/net.minecraft.world.item.h" #include "DispenserTileEntity.h" DispenserTileEntity::DispenserTileEntity() : TileEntity() { diff --git a/Minecraft.World/Blocks/TileEntities/DispenserTileEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/DispenserTileEntity.h similarity index 94% rename from Minecraft.World/Blocks/TileEntities/DispenserTileEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/DispenserTileEntity.h index 717f808b9..e09d0bd6a 100644 --- a/Minecraft.World/Blocks/TileEntities/DispenserTileEntity.h +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/DispenserTileEntity.h @@ -1,8 +1,8 @@ #pragma once -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../../../com/mojang/nbt/com.mojang.nbt.h" #include "TileEntity.h" -#include "../../Containers/Container.h" +#include "../../../Container.h" class Player; class Random; diff --git a/Minecraft.World/Blocks/TileEntities/DropperTileEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/DropperTileEntity.cpp similarity index 89% rename from Minecraft.World/Blocks/TileEntities/DropperTileEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/DropperTileEntity.cpp index 89e6c04dc..9a09f0cb9 100644 --- a/Minecraft.World/Blocks/TileEntities/DropperTileEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/DropperTileEntity.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "DropperTileEntity.h" diff --git a/Minecraft.World/Blocks/TileEntities/DropperTileEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/DropperTileEntity.h similarity index 100% rename from Minecraft.World/Blocks/TileEntities/DropperTileEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/DropperTileEntity.h diff --git a/Minecraft.World/Blocks/TileEntities/EnchantmentTableTileEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/EnchantmentTableTileEntity.cpp similarity index 94% rename from Minecraft.World/Blocks/TileEntities/EnchantmentTableTileEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/EnchantmentTableTileEntity.cpp index 75407395e..d8bd9d74a 100644 --- a/Minecraft.World/Blocks/TileEntities/EnchantmentTableTileEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/EnchantmentTableTileEntity.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "EnchantmentTableTileEntity.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.level.h" +#include "../../../entity/player/net.minecraft.world.entity.player.h" +#include "../../net.minecraft.world.level.h" EnchantmentTableEntity::EnchantmentTableEntity() { random = new Random(); diff --git a/Minecraft.World/Blocks/TileEntities/EnchantmentTableTileEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/EnchantmentTableTileEntity.h similarity index 100% rename from Minecraft.World/Blocks/TileEntities/EnchantmentTableTileEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/EnchantmentTableTileEntity.h diff --git a/Minecraft.World/Blocks/TileEntities/EnderChestTileEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/EnderChestTileEntity.cpp similarity index 95% rename from Minecraft.World/Blocks/TileEntities/EnderChestTileEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/EnderChestTileEntity.cpp index 5a775d823..53e770018 100644 --- a/Minecraft.World/Blocks/TileEntities/EnderChestTileEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/EnderChestTileEntity.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../net.minecraft.world.level.h" +#include "../net.minecraft.world.level.tile.h" #include "EnderChestTileEntity.h" EnderChestTileEntity::EnderChestTileEntity() { diff --git a/Minecraft.World/Blocks/TileEntities/EnderChestTileEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/EnderChestTileEntity.h similarity index 100% rename from Minecraft.World/Blocks/TileEntities/EnderChestTileEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/EnderChestTileEntity.h diff --git a/Minecraft.World/Blocks/TileEntities/FurnaceTileEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/FurnaceTileEntity.cpp similarity index 95% rename from Minecraft.World/Blocks/TileEntities/FurnaceTileEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/FurnaceTileEntity.cpp index 56185e42a..9f615a745 100644 --- a/Minecraft.World/Blocks/TileEntities/FurnaceTileEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/FurnaceTileEntity.cpp @@ -1,12 +1,12 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../Headers/net.minecraft.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.item.crafting.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../Material.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../../../../net.minecraft.h" +#include "../../../entity/player/net.minecraft.world.entity.player.h" +#include "../../../item/net.minecraft.world.item.h" +#include "../../../item/crafting/net.minecraft.world.item.crafting.h" +#include "../../net.minecraft.world.level.h" +#include "../net.minecraft.world.level.tile.h" +#include "../../material/Material.h" #include "FurnaceTileEntity.h" int furnaceSlotsForUp[] = {FurnaceTileEntity::SLOT_INPUT}; diff --git a/Minecraft.World/Blocks/TileEntities/FurnaceTileEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/FurnaceTileEntity.h similarity index 98% rename from Minecraft.World/Blocks/TileEntities/FurnaceTileEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/FurnaceTileEntity.h index 519357f07..9f2eb8af6 100644 --- a/Minecraft.World/Blocks/TileEntities/FurnaceTileEntity.h +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/FurnaceTileEntity.h @@ -2,7 +2,7 @@ #include "../FurnaceTile.h" #include "TileEntity.h" -#include "../../Containers/WorldlyContainer.h" +#include "../../../WorldlyContainer.h" class Player; class Level; diff --git a/Minecraft.World/Blocks/TileEntities/Hopper.h b/Minecraft.World/net/minecraft/world/level/tile/entity/Hopper.h similarity index 84% rename from Minecraft.World/Blocks/TileEntities/Hopper.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/Hopper.h index 0318a2d4f..2edd010c4 100644 --- a/Minecraft.World/Blocks/TileEntities/Hopper.h +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/Hopper.h @@ -1,6 +1,6 @@ #pragma once -#include "../../Containers/Container.h" +#include "../../../Container.h" class Level; diff --git a/Minecraft.World/Blocks/TileEntities/HopperTileEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/HopperTileEntity.cpp similarity index 96% rename from Minecraft.World/Blocks/TileEntities/HopperTileEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/HopperTileEntity.cpp index d12b38315..244adadf3 100644 --- a/Minecraft.World/Blocks/TileEntities/HopperTileEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/HopperTileEntity.cpp @@ -1,13 +1,13 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.entity.item.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.tile.entity.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.world.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../net.minecraft.h" +#include "../../../entity/net.minecraft.world.entity.h" +#include "../../../entity/item/net.minecraft.world.entity.item.h" +#include "../../../entity/player/net.minecraft.world.entity.player.h" +#include "../../net.minecraft.world.level.h" +#include "../net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.tile.entity.h" +#include "../../../phys/net.minecraft.world.phys.h" +#include "../../../net.minecraft.world.h" #include "HopperTileEntity.h" HopperTileEntity::HopperTileEntity() { diff --git a/Minecraft.World/Blocks/TileEntities/HopperTileEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/HopperTileEntity.h similarity index 100% rename from Minecraft.World/Blocks/TileEntities/HopperTileEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/HopperTileEntity.h diff --git a/Minecraft.World/Blocks/TileEntities/MobSpawnerTileEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/MobSpawnerTileEntity.cpp similarity index 91% rename from Minecraft.World/Blocks/TileEntities/MobSpawnerTileEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/MobSpawnerTileEntity.cpp index 351a2ed8b..032a49550 100644 --- a/Minecraft.World/Blocks/TileEntities/MobSpawnerTileEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/MobSpawnerTileEntity.cpp @@ -1,7 +1,7 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.network.packet.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../network/packet/net.minecraft.network.packet.h" +#include "../../net.minecraft.world.level.h" +#include "../net.minecraft.world.level.tile.h" #include "MobSpawnerTileEntity.h" MobSpawnerTileEntity::TileEntityMobSpawner::TileEntityMobSpawner( diff --git a/Minecraft.World/Blocks/TileEntities/MobSpawnerTileEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/MobSpawnerTileEntity.h similarity index 96% rename from Minecraft.World/Blocks/TileEntities/MobSpawnerTileEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/MobSpawnerTileEntity.h index 0847c1a3a..09d3af09f 100644 --- a/Minecraft.World/Blocks/TileEntities/MobSpawnerTileEntity.h +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/MobSpawnerTileEntity.h @@ -1,7 +1,7 @@ #pragma once #include "TileEntity.h" -#include "../../Level/BaseMobSpawner.h" +#include "../../BaseMobSpawner.h" class Packet; class Entity; diff --git a/Minecraft.World/Blocks/TileEntities/MusicTileEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/MusicTileEntity.cpp similarity index 74% rename from Minecraft.World/Blocks/TileEntities/MusicTileEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/MusicTileEntity.cpp index c5fa02784..f8c2cd463 100644 --- a/Minecraft.World/Blocks/TileEntities/MusicTileEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/MusicTileEntity.cpp @@ -1,10 +1,10 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.material.h" -#include "../../Headers/net.minecraft.world.level.tile.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../../../entity/player/net.minecraft.world.entity.player.h" +#include "../../../item/net.minecraft.world.item.h" +#include "../../net.minecraft.world.level.h" +#include "../../material/net.minecraft.world.level.material.h" +#include "../net.minecraft.world.level.tile.h" #include "MusicTileEntity.h" diff --git a/Minecraft.World/Blocks/TileEntities/MusicTileEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/MusicTileEntity.h similarity index 100% rename from Minecraft.World/Blocks/TileEntities/MusicTileEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/MusicTileEntity.h diff --git a/Minecraft.World/Blocks/PistonMovingTileEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/PistonMovingTileEntity.cpp similarity index 96% rename from Minecraft.World/Blocks/PistonMovingTileEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/PistonMovingTileEntity.cpp index a104299e6..bb1904e85 100644 --- a/Minecraft.World/Blocks/PistonMovingTileEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/PistonMovingTileEntity.cpp @@ -1,11 +1,11 @@ -#include "../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "PistonMovingTileEntity.h" #include -#include "TileEntities/PistonPieceTileEntity.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.h" -#include "../Util/Facing.h" -#include "../Util/AABB.h" +#include "PistonPieceTileEntity.h" +#include "../../net.minecraft.world.level.h" +#include "../../../net.minecraft.world.h" +#include "../../../../Facing.h" +#include "../../../phys/AABB.h" PistonMovingPiece::PistonMovingPiece(int id) : BaseEntityTile(id, Material::piston, false) { diff --git a/Minecraft.World/Blocks/PistonMovingTileEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/PistonMovingTileEntity.h similarity index 98% rename from Minecraft.World/Blocks/PistonMovingTileEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/PistonMovingTileEntity.h index 4b0fd1849..7a25bdd35 100644 --- a/Minecraft.World/Blocks/PistonMovingTileEntity.h +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/PistonMovingTileEntity.h @@ -1,5 +1,5 @@ #pragma once -#include "BaseEntityTile.h" +#include "../BaseEntityTile.h" class PistonPieceEntity; diff --git a/Minecraft.World/Blocks/TileEntities/PistonPieceTileEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/PistonPieceTileEntity.cpp similarity index 94% rename from Minecraft.World/Blocks/TileEntities/PistonPieceTileEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/PistonPieceTileEntity.cpp index 6862471b6..8b0dc4037 100644 --- a/Minecraft.World/Blocks/TileEntities/PistonPieceTileEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/PistonPieceTileEntity.cpp @@ -1,11 +1,11 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/com.mojang.nbt.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../../../com/mojang/nbt/com.mojang.nbt.h" #include "PistonPieceTileEntity.h" -#include "../PistonMovingTileEntity.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Util/Facing.h" +#include "PistonMovingTileEntity.h" +#include "../../net.minecraft.world.level.h" +#include "../../../../Facing.h" #include "../Tile.h" -#include "../../Util/AABB.h" +#include "../../../phys/AABB.h" PistonPieceEntity::PistonPieceEntity() { // for the tile entity loader diff --git a/Minecraft.World/Blocks/TileEntities/PistonPieceTileEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/PistonPieceTileEntity.h similarity index 100% rename from Minecraft.World/Blocks/TileEntities/PistonPieceTileEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/PistonPieceTileEntity.h diff --git a/Minecraft.World/Blocks/TileEntities/SignTileEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/SignTileEntity.cpp similarity index 87% rename from Minecraft.World/Blocks/TileEntities/SignTileEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/SignTileEntity.cpp index d8d578aa5..d97921c1c 100644 --- a/Minecraft.World/Blocks/TileEntities/SignTileEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/SignTileEntity.cpp @@ -1,18 +1,18 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.entity.item.h" -#include "../../Headers/net.minecraft.world.entity.player.h" -#include "../../Headers/net.minecraft.world.item.h" -#include "../../Headers/net.minecraft.world.entity.h" -#include "../../Headers/net.minecraft.world.phys.h" -#include "../../Headers/net.minecraft.network.packet.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../../net.minecraft.world.level.h" +#include "../../../entity/item/net.minecraft.world.entity.item.h" +#include "../../../entity/player/net.minecraft.world.entity.player.h" +#include "../../../item/net.minecraft.world.item.h" +#include "../../../entity/net.minecraft.world.entity.h" +#include "../../../phys/net.minecraft.world.phys.h" +#include "../../../../network/packet/net.minecraft.network.packet.h" #include "SignTileEntity.h" #include -#include "../../../Minecraft.Client/Network/ClientConnection.h" -#include "../../../Minecraft.Client/Minecraft.h" -#include "../../../Minecraft.Client/Level/ServerLevel.h" -#include "../../Level/Level.h" +#include "../../../Minecraft.Client/net/minecraft/client/multiplayer/ClientConnection.h" +#include "../../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../../../Minecraft.Client/net/minecraft/server/level/ServerLevel.h" +#include "../../Level.h" const int SignTileEntity::MAX_LINE_LENGTH = 15; diff --git a/Minecraft.World/Blocks/TileEntities/SignTileEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/SignTileEntity.h similarity index 100% rename from Minecraft.World/Blocks/TileEntities/SignTileEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/SignTileEntity.h diff --git a/Minecraft.World/Blocks/TileEntities/SkullTileEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/SkullTileEntity.cpp similarity index 89% rename from Minecraft.World/Blocks/TileEntities/SkullTileEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/SkullTileEntity.cpp index d555b88d8..1b8be9e21 100644 --- a/Minecraft.World/Blocks/TileEntities/SkullTileEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/SkullTileEntity.cpp @@ -1,6 +1,6 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/com.mojang.nbt.h" -#include "../../Headers/net.minecraft.network.packet.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../../../com/mojang/nbt/com.mojang.nbt.h" +#include "../../../../network/packet/net.minecraft.network.packet.h" #include "SkullTileEntity.h" SkullTileEntity::SkullTileEntity() { diff --git a/Minecraft.World/Blocks/TileEntities/SkullTileEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/SkullTileEntity.h similarity index 100% rename from Minecraft.World/Blocks/TileEntities/SkullTileEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/SkullTileEntity.h diff --git a/Minecraft.World/Blocks/TheEndPortalTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/TheEndPortalTile.cpp similarity index 88% rename from Minecraft.World/Blocks/TheEndPortalTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/TheEndPortalTile.cpp index f83226946..82df7f7ed 100644 --- a/Minecraft.World/Blocks/TheEndPortalTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/TheEndPortalTile.cpp @@ -1,12 +1,12 @@ -#include "../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "TheEndPortalTile.h" -#include "TileEntities/TheEndPortalTileEntity.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../Headers/net.minecraft.world.level.dimension.h" -#include "../Headers/net.minecraft.world.level.storage.h" -#include "../Headers/net.minecraft.world.entity.h" -#include "../Headers/net.minecraft.world.entity.player.h" -#include "../Headers/net.minecraft.world.h" +#include "TheEndPortalTileEntity.h" +#include "../../net.minecraft.world.level.h" +#include "../../dimension/net.minecraft.world.level.dimension.h" +#include "../../storage/net.minecraft.world.level.storage.h" +#include "../../../entity/net.minecraft.world.entity.h" +#include "../../../entity/player/net.minecraft.world.entity.player.h" +#include "../../../net.minecraft.world.h" #include thread_local bool TheEndPortal::m_tlsAllowAnywhere = false; diff --git a/Minecraft.World/Blocks/TheEndPortalTile.h b/Minecraft.World/net/minecraft/world/level/tile/entity/TheEndPortalTile.h similarity index 95% rename from Minecraft.World/Blocks/TheEndPortalTile.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/TheEndPortalTile.h index 2cd4e99e7..a413f5ca2 100644 --- a/Minecraft.World/Blocks/TheEndPortalTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/TheEndPortalTile.h @@ -1,6 +1,6 @@ #pragma once -#include "TileEntities/EntityTile.h" -#include "BaseEntityTile.h" +#include "../EntityTile.h" +#include "../BaseEntityTile.h" #include class IconRegister; diff --git a/Minecraft.World/Blocks/TileEntities/TheEndPortalTileEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/TheEndPortalTileEntity.cpp similarity index 85% rename from Minecraft.World/Blocks/TileEntities/TheEndPortalTileEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/TheEndPortalTileEntity.cpp index 6a2376cbb..43d1306e1 100644 --- a/Minecraft.World/Blocks/TileEntities/TheEndPortalTileEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/TheEndPortalTileEntity.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "TheEndPortalTileEntity.h" // 4J Added diff --git a/Minecraft.World/Blocks/TileEntities/TheEndPortalTileEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/TheEndPortalTileEntity.h similarity index 100% rename from Minecraft.World/Blocks/TileEntities/TheEndPortalTileEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/TheEndPortalTileEntity.h diff --git a/Minecraft.World/Blocks/TileEntities/TileEntity.cpp b/Minecraft.World/net/minecraft/world/level/tile/entity/TileEntity.cpp similarity index 96% rename from Minecraft.World/Blocks/TileEntities/TileEntity.cpp rename to Minecraft.World/net/minecraft/world/level/tile/entity/TileEntity.cpp index b3f134c50..836f5c613 100644 --- a/Minecraft.World/Blocks/TileEntities/TileEntity.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/TileEntity.cpp @@ -1,8 +1,8 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.network.packet.h" -#include "../../Headers/net.minecraft.world.level.h" -#include "../../Headers/net.minecraft.world.level.tile.h" -#include "../../Headers/net.minecraft.world.level.tile.entity.h" +#include "../../../../../../Header Files/stdafx.h" +#include "../../../../network/packet/net.minecraft.network.packet.h" +#include "../../net.minecraft.world.level.h" +#include "../net.minecraft.world.level.tile.h" +#include "net.minecraft.world.level.tile.entity.h" #include "TileEntity.h" #include "PistonPieceTileEntity.h" diff --git a/Minecraft.World/Blocks/TileEntities/TileEntity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/TileEntity.h similarity index 95% rename from Minecraft.World/Blocks/TileEntities/TileEntity.h rename to Minecraft.World/net/minecraft/world/level/tile/entity/TileEntity.h index fc382b673..ade37c7b2 100644 --- a/Minecraft.World/Blocks/TileEntities/TileEntity.h +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/TileEntity.h @@ -1,7 +1,7 @@ #pragma once -#include "../../Util/HashExtension.h" -#include "../../Util/JavaIntHash.h" +#include "../../../../../../ConsoleHelpers/HashExtension.h" +#include "../../../../../../ConsoleJavaLibs/JavaIntHash.h" class Level; class Packet; diff --git a/Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h b/Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h new file mode 100644 index 000000000..b123f7d82 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/level/tile/entity/net.minecraft.world.level.tile.entity.h @@ -0,0 +1,22 @@ +#pragma once + +#include "BeaconTileEntity.h" +#include "BrewingStandTileEntity.h" +#include "ChestTileEntity.h" +#include "CommandBlockEntity.h" +#include "ComparatorTileEntity.h" +#include "DaylightDetectorTileEntity.h" +#include "DispenserTileEntity.h" +#include "DropperTileEntity.h" +#include "EnchantmentTableTileEntity.h" +#include "FurnaceTileEntity.h" +#include "Hopper.h" +#include "HopperTileEntity.h" +#include "MobSpawnerTileEntity.h" +#include "MusicTileEntity.h" +#include "SignTileEntity.h" +#include "TileEntity.h" +#include "PistonMovingTileEntity.h" +#include "TheEndPortalTileEntity.h" +#include "SkullTileEntity.h" +#include "EnderChestTileEntity.h" diff --git a/Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h b/Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h new file mode 100644 index 000000000..0c0859d25 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/level/tile/net.minecraft.world.level.tile.h @@ -0,0 +1,131 @@ +#pragma once + +#include "Tile.h" +#include "AirTile.h" +#include "AnvilTile.h" +#include "BaseEntityTile.h" +#include "BasePressurePlateTile.h" +#include "BaseRailTile.h" +#include "BeaconTile.h" +#include "BedTile.h" +#include "BookshelfTile.h" +#include "BrewingStandTile.h" +#include "PlantTile.h" +#include "ButtonTile.h" +#include "CactusTile.h" +#include "CakeTile.h" +#include "CarrotTile.h" +#include "CauldronTile.h" +#include "ChestTile.h" +#include "ClayTile.h" +#include "CocoaTile.h" +#include "ColoredTile.h" +#include "CommandBlock.h" +#include "ComparatorTile.h" +#include "CoralTile.h" +#include "CropTile.h" +#include "DaylightDetectorTile.h" +#include "DeadBushTile.h" +#include "DetectorRailTile.h" +#include "DiodeTile.h" +#include "DirectionalTile.h" +#include "DirtTile.h" +#include "DispenserTile.h" +#include "DoorTile.h" +#include "DropperTile.h" +#include "EggTile.h" +#include "EnchantmentTableTile.h" +#include "EnderChestTile.h" +#include "EntityTile.h" +#include "FarmTile.h" +#include "FenceGateTile.h" +#include "FenceTile.h" +#include "FireTile.h" +#include "FlowerPotTile.h" +#include "FurnaceTile.h" +#include "GlassTile.h" +#include "GlowstoneTile.h" +#include "GrassTile.h" +#include "GravelTile.h" +#include "HalfSlabTile.h" +#include "HalfTransparentTile.h" +#include "HayBlockTile.h" +#include "HeavyTile.h" +#include "HopperTile.h" +#include "HugeMushroomTile.h" +#include "IceTile.h" +#include "JukeboxTile.h" +#include "LadderTile.h" +#include "LeafTile.h" +#include "LevelEvent.h" +#include "LeverTile.h" +#include "LiquidTile.h" +#include "LiquidTileDynamic.h" +#include "LiquidTileStatic.h" +#include "LockedChestTile.h" +#include "MelonTile.h" +#include "MetalTile.h" +#include "MobSpawnerTile.h" +#include "MushroomPlantTile.h" +#include "NoteBlockTile.h" +#include "MycelTile.h" +#include "NetherrackTile.h" +#include "NetherWartTile.h" +#include "NotGateTile.h" +#include "ObsidianTile.h" +#include "OreTile.h" +#include "piston/PistonBaseTile.h" +#include "piston/PistonExtensionTile.h" +#include "PortalTile.h" +#include "PotatoTile.h" +#include "PoweredMetalTile.h" +#include "PoweredRailTile.h" +#include "PressurePlateTile.h" +#include "PumpkinTile.h" +#include "QuartzBlockTile.h" +#include "RailTile.h" +#include "RedlightTile.h" +#include "RedStoneDustTile.h" +#include "RedStoneOreTile.h" +#include "ReedTile.h" +#include "RepeaterTile.h" +#include "RotatedPillarTile.h" +#include "SandStoneTile.h" +#include "SaplingPlantTile.h" +#include "SignTile.h" +#include "SkullTile.h" +#include "SmoothStoneBrickTile.h" +#include "SnowTile.h" +#include "SoulSandTile.h" +#include "SpongeTile.h" +#include "StainedGlassBlock.h" +#include "StainedGlassPaneBlock.h" +#include "StairTile.h" +#include "StemTile.h" +#include "StoneButtonTile.h" +#include "StoneMonsterTile.h" +#include "StoneSlabTile.h" +#include "StoneTile.h" +#include "TallGrassPlantTile.h" +#include "entity/TheEndPortalTile.h" +#include "TheEndPortalFrameTile.h" +#include "ThinFenceTile.h" +#include "TntTile.h" +#include "TopSnowTile.h" +#include "TorchTile.h" +#include "TransparentTile.h" +#include "TrapDoorTile.h" +#include "TreeTile.h" +#include "TripWireSourceTile.h" +#include "TripWireTile.h" +#include "VineTile.h" +#include "WallTile.h" +#include "WaterLilyTile.h" +#include "WebTile.h" +#include "WeightedPressurePlateTile.h" +#include "WoodButtonTile.h" +#include "WorkbenchTile.h" +#include "WoodTile.h" +#include "HalfSlabTile.h" +#include "WoodSlabTile.h" +#include "WoolCarpetTile.h" diff --git a/Minecraft.World/Blocks/PistonBaseTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/piston/PistonBaseTile.cpp similarity index 97% rename from Minecraft.World/Blocks/PistonBaseTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/piston/PistonBaseTile.cpp index d128d911c..343ebab19 100644 --- a/Minecraft.World/Blocks/PistonBaseTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/piston/PistonBaseTile.cpp @@ -1,19 +1,19 @@ -#include "../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include #include #include "PistonBaseTile.h" -#include "PistonMovingTileEntity.h" -#include "TileEntities/PistonPieceTileEntity.h" +#include "../entity/PistonMovingTileEntity.h" +#include "../entity/PistonPieceTileEntity.h" #include "PistonExtensionTile.h" -#include "../Util/Facing.h" -#include "../Headers/net.minecraft.world.level.h" -#include "../../Minecraft.Client/Minecraft.h" -#include "../../Minecraft.Client/Level/MultiPlayerLevel.h" -#include "../Headers/net.minecraft.world.h" -#include "../Level/LevelChunk.h" -#include "../Level/Dimensions/Dimension.h" +#include "../../../../Facing.h" +#include "../../net.minecraft.world.level.h" +#include "../../Minecraft.Client/net/minecraft/client/Minecraft.h" +#include "../../Minecraft.Client/net/minecraft/client/multiplayer/MultiPlayerLevel.h" +#include "../../../net.minecraft.world.h" +#include "../../chunk/LevelChunk.h" +#include "../../dimension/Dimension.h" -#include "Util/AABB.h" +#include "../../../phys/AABB.h" const std::wstring PistonBaseTile::EDGE_TEX = L"piston_side"; const std::wstring PistonBaseTile::PLATFORM_TEX = L"piston_top"; diff --git a/Minecraft.World/Blocks/PistonBaseTile.h b/Minecraft.World/net/minecraft/world/level/tile/piston/PistonBaseTile.h similarity index 99% rename from Minecraft.World/Blocks/PistonBaseTile.h rename to Minecraft.World/net/minecraft/world/level/tile/piston/PistonBaseTile.h index 36097aacf..80c71ce71 100644 --- a/Minecraft.World/Blocks/PistonBaseTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/piston/PistonBaseTile.h @@ -1,5 +1,5 @@ #pragma once -#include "Tile.h" +#include "../Tile.h" #include #include diff --git a/Minecraft.World/Blocks/PistonExtensionTile.cpp b/Minecraft.World/net/minecraft/world/level/tile/piston/PistonExtensionTile.cpp similarity index 98% rename from Minecraft.World/Blocks/PistonExtensionTile.cpp rename to Minecraft.World/net/minecraft/world/level/tile/piston/PistonExtensionTile.cpp index 3658c575a..837bc692c 100644 --- a/Minecraft.World/Blocks/PistonExtensionTile.cpp +++ b/Minecraft.World/net/minecraft/world/level/tile/piston/PistonExtensionTile.cpp @@ -1,8 +1,8 @@ -#include "../Platform/stdafx.h" +#include "../../../../../../Header Files/stdafx.h" #include "PistonExtensionTile.h" #include "PistonBaseTile.h" -#include "../Util/Facing.h" -#include "../Headers/net.minecraft.world.level.h" +#include "../../../../Facing.h" +#include "../../net.minecraft.world.level.h" PistonExtensionTile::PistonExtensionTile(int id) : Tile(id, Material::piston, false) { diff --git a/Minecraft.World/Blocks/PistonExtensionTile.h b/Minecraft.World/net/minecraft/world/level/tile/piston/PistonExtensionTile.h similarity index 98% rename from Minecraft.World/Blocks/PistonExtensionTile.h rename to Minecraft.World/net/minecraft/world/level/tile/piston/PistonExtensionTile.h index f38d101ce..f2f64e336 100644 --- a/Minecraft.World/Blocks/PistonExtensionTile.h +++ b/Minecraft.World/net/minecraft/world/level/tile/piston/PistonExtensionTile.h @@ -1,5 +1,5 @@ #pragma once -#include "Tile.h" +#include "../Tile.h" class PistonExtensionTile : public Tile { public: diff --git a/Minecraft.World/net/minecraft/world/level/tile/piston/net.minecraft.world.level.tile.piston.h b/Minecraft.World/net/minecraft/world/level/tile/piston/net.minecraft.world.level.tile.piston.h new file mode 100644 index 000000000..478ddc456 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/level/tile/piston/net.minecraft.world.level.tile.piston.h @@ -0,0 +1,6 @@ +#pragma once + +#include "PistonBaseTile.h" +#include "PistonExtensionTile.h" +#include "../entity/PistonMovingTileEntity.h" +#include "../entity/PistonPieceTileEntity.h" \ No newline at end of file diff --git a/Minecraft.World/Headers/net.minecraft.world.ContainerListener.h b/Minecraft.World/net/minecraft/world/net.minecraft.world.ContainerListener.h similarity index 100% rename from Minecraft.World/Headers/net.minecraft.world.ContainerListener.h rename to Minecraft.World/net/minecraft/world/net.minecraft.world.ContainerListener.h diff --git a/Minecraft.World/net/minecraft/world/net.minecraft.world.h b/Minecraft.World/net/minecraft/world/net.minecraft.world.h new file mode 100644 index 000000000..8b4f3e34e --- /dev/null +++ b/Minecraft.World/net/minecraft/world/net.minecraft.world.h @@ -0,0 +1,15 @@ +#pragma once + +#include "CompoundContainer.h" +#include "Container.h" +#include "Difficulty.h" +#include "MouseInventoryClickHandler.h" +#include "net.minecraft.world.ContainerListener.h" +#include "SimpleContainer.h" + +// TU10 +#include "Icon.h" +#include "IconRegister.h" +#include "FlippedIcon.h" + +#include "WorldlyContainer.h" \ No newline at end of file diff --git a/Minecraft.World/Util/AABB.cpp b/Minecraft.World/net/minecraft/world/phys/AABB.cpp similarity index 99% rename from Minecraft.World/Util/AABB.cpp rename to Minecraft.World/net/minecraft/world/phys/AABB.cpp index c9a58d1bb..ea2e44acd 100644 --- a/Minecraft.World/Util/AABB.cpp +++ b/Minecraft.World/net/minecraft/world/phys/AABB.cpp @@ -5,12 +5,12 @@ // TODO: use brace initialization everywhere -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "AABB.h" #include #include #include "HitResult.h" -#include "Util/Vec3.h" +#include "Vec3.h" AABB::AABB(double x0, double y0, double z0, double x1, double y1, double z1) { this->x0 = x0; diff --git a/Minecraft.World/Util/AABB.h b/Minecraft.World/net/minecraft/world/phys/AABB.h similarity index 95% rename from Minecraft.World/Util/AABB.h rename to Minecraft.World/net/minecraft/world/phys/AABB.h index 83c32519a..e148367f2 100644 --- a/Minecraft.World/Util/AABB.h +++ b/Minecraft.World/net/minecraft/world/phys/AABB.h @@ -1,7 +1,7 @@ #pragma once #include "Vec3.h" -#include "Definitions.h" +#include "../../../../ConsoleHelpers/Definitions.h" class HitResult; diff --git a/Minecraft.World/Util/HitResult.cpp b/Minecraft.World/net/minecraft/world/phys/HitResult.cpp similarity index 86% rename from Minecraft.World/Util/HitResult.cpp rename to Minecraft.World/net/minecraft/world/phys/HitResult.cpp index e6f49dbac..503fb05a6 100644 --- a/Minecraft.World/Util/HitResult.cpp +++ b/Minecraft.World/net/minecraft/world/phys/HitResult.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" -#include "../Headers/net.minecraft.world.entity.h" +#include "../entity/net.minecraft.world.entity.h" #include "HitResult.h" HitResult::HitResult(int x, int y, int z, int f, const Vec3& pos) { diff --git a/Minecraft.World/Util/HitResult.h b/Minecraft.World/net/minecraft/world/phys/HitResult.h similarity index 100% rename from Minecraft.World/Util/HitResult.h rename to Minecraft.World/net/minecraft/world/phys/HitResult.h diff --git a/Minecraft.World/Util/Vec3.cpp b/Minecraft.World/net/minecraft/world/phys/Vec3.cpp similarity index 100% rename from Minecraft.World/Util/Vec3.cpp rename to Minecraft.World/net/minecraft/world/phys/Vec3.cpp diff --git a/Minecraft.World/Util/Vec3.h b/Minecraft.World/net/minecraft/world/phys/Vec3.h similarity index 100% rename from Minecraft.World/Util/Vec3.h rename to Minecraft.World/net/minecraft/world/phys/Vec3.h diff --git a/Minecraft.World/net/minecraft/world/phys/net.minecraft.world.phys.h b/Minecraft.World/net/minecraft/world/phys/net.minecraft.world.phys.h new file mode 100644 index 000000000..87f5bf980 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/phys/net.minecraft.world.phys.h @@ -0,0 +1,4 @@ +#pragma once +#include "AABB.h" +#include "HitResult.h" +#include "Vec3.h" \ No newline at end of file diff --git a/Minecraft.World/Scores/Objective.cpp b/Minecraft.World/net/minecraft/world/scores/Objective.cpp similarity index 88% rename from Minecraft.World/Scores/Objective.cpp rename to Minecraft.World/net/minecraft/world/scores/Objective.cpp index f67bc33a7..d784e7c71 100644 --- a/Minecraft.World/Scores/Objective.cpp +++ b/Minecraft.World/net/minecraft/world/scores/Objective.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.scores.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.world.scores.h" #include "Objective.h" Objective::Objective(Scoreboard* scoreboard, const std::wstring& name, diff --git a/Minecraft.World/Scores/Objective.h b/Minecraft.World/net/minecraft/world/scores/Objective.h similarity index 100% rename from Minecraft.World/Scores/Objective.h rename to Minecraft.World/net/minecraft/world/scores/Objective.h diff --git a/Minecraft.World/Scores/PlayerTeam.cpp b/Minecraft.World/net/minecraft/world/scores/PlayerTeam.cpp similarity index 96% rename from Minecraft.World/Scores/PlayerTeam.cpp rename to Minecraft.World/net/minecraft/world/scores/PlayerTeam.cpp index 553be6bfa..8df62ae3b 100644 --- a/Minecraft.World/Scores/PlayerTeam.cpp +++ b/Minecraft.World/net/minecraft/world/scores/PlayerTeam.cpp @@ -1,5 +1,5 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.scores.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.world.scores.h" #include "PlayerTeam.h" PlayerTeam::PlayerTeam(Scoreboard* scoreboard, const std::wstring& name) { diff --git a/Minecraft.World/Scores/PlayerTeam.h b/Minecraft.World/net/minecraft/world/scores/PlayerTeam.h similarity index 100% rename from Minecraft.World/Scores/PlayerTeam.h rename to Minecraft.World/net/minecraft/world/scores/PlayerTeam.h diff --git a/Minecraft.World/Scores/Score.cpp b/Minecraft.World/net/minecraft/world/scores/Score.cpp similarity index 90% rename from Minecraft.World/Scores/Score.cpp rename to Minecraft.World/net/minecraft/world/scores/Score.cpp index e49114084..a13f39cd9 100644 --- a/Minecraft.World/Scores/Score.cpp +++ b/Minecraft.World/net/minecraft/world/scores/Score.cpp @@ -1,6 +1,6 @@ -#include "../Platform/stdafx.h" -#include "../Headers/net.minecraft.world.scores.h" -#include "../Headers/net.minecraft.world.scores.criteria.h" +#include "../../../../Header Files/stdafx.h" +#include "net.minecraft.world.scores.h" +#include "criteria/net.minecraft.world.scores.criteria.h" #include "Score.h" Score::Score(Scoreboard* scoreboard, Objective* objective, diff --git a/Minecraft.World/Scores/Score.h b/Minecraft.World/net/minecraft/world/scores/Score.h similarity index 100% rename from Minecraft.World/Scores/Score.h rename to Minecraft.World/net/minecraft/world/scores/Score.h diff --git a/Minecraft.World/Scores/ScoreHolder.h b/Minecraft.World/net/minecraft/world/scores/ScoreHolder.h similarity index 100% rename from Minecraft.World/Scores/ScoreHolder.h rename to Minecraft.World/net/minecraft/world/scores/ScoreHolder.h diff --git a/Minecraft.World/Scores/Scoreboard.cpp b/Minecraft.World/net/minecraft/world/scores/Scoreboard.cpp similarity index 99% rename from Minecraft.World/Scores/Scoreboard.cpp rename to Minecraft.World/net/minecraft/world/scores/Scoreboard.cpp index b79245b5c..1a29b1a83 100644 --- a/Minecraft.World/Scores/Scoreboard.cpp +++ b/Minecraft.World/net/minecraft/world/scores/Scoreboard.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "Scoreboard.h" diff --git a/Minecraft.World/Scores/Scoreboard.h b/Minecraft.World/net/minecraft/world/scores/Scoreboard.h similarity index 100% rename from Minecraft.World/Scores/Scoreboard.h rename to Minecraft.World/net/minecraft/world/scores/Scoreboard.h diff --git a/Minecraft.World/Scores/ScoreboardSaveData.h b/Minecraft.World/net/minecraft/world/scores/ScoreboardSaveData.h similarity index 100% rename from Minecraft.World/Scores/ScoreboardSaveData.h rename to Minecraft.World/net/minecraft/world/scores/ScoreboardSaveData.h diff --git a/Minecraft.World/Scores/Team.cpp b/Minecraft.World/net/minecraft/world/scores/Team.cpp similarity index 80% rename from Minecraft.World/Scores/Team.cpp rename to Minecraft.World/net/minecraft/world/scores/Team.cpp index eaec14ae3..71b3e590b 100644 --- a/Minecraft.World/Scores/Team.cpp +++ b/Minecraft.World/net/minecraft/world/scores/Team.cpp @@ -1,4 +1,4 @@ -#include "../Platform/stdafx.h" +#include "../../../../Header Files/stdafx.h" #include "Team.h" diff --git a/Minecraft.World/Scores/Team.h b/Minecraft.World/net/minecraft/world/scores/Team.h similarity index 100% rename from Minecraft.World/Scores/Team.h rename to Minecraft.World/net/minecraft/world/scores/Team.h diff --git a/Minecraft.World/Scores/Criteria/DummyCriteria.cpp b/Minecraft.World/net/minecraft/world/scores/criteria/DummyCriteria.cpp similarity index 88% rename from Minecraft.World/Scores/Criteria/DummyCriteria.cpp rename to Minecraft.World/net/minecraft/world/scores/criteria/DummyCriteria.cpp index ed458b9c1..464c076f5 100644 --- a/Minecraft.World/Scores/Criteria/DummyCriteria.cpp +++ b/Minecraft.World/net/minecraft/world/scores/criteria/DummyCriteria.cpp @@ -1,4 +1,4 @@ -#include "../../Platform/stdafx.h" +#include "../../../../../Header Files/stdafx.h" #include "DummyCriteria.h" diff --git a/Minecraft.World/Scores/Criteria/DummyCriteria.h b/Minecraft.World/net/minecraft/world/scores/criteria/DummyCriteria.h similarity index 100% rename from Minecraft.World/Scores/Criteria/DummyCriteria.h rename to Minecraft.World/net/minecraft/world/scores/criteria/DummyCriteria.h diff --git a/Minecraft.World/Scores/Criteria/HealthCriteria.cpp b/Minecraft.World/net/minecraft/world/scores/criteria/HealthCriteria.cpp similarity index 82% rename from Minecraft.World/Scores/Criteria/HealthCriteria.cpp rename to Minecraft.World/net/minecraft/world/scores/criteria/HealthCriteria.cpp index e8791fd30..bfb427622 100644 --- a/Minecraft.World/Scores/Criteria/HealthCriteria.cpp +++ b/Minecraft.World/net/minecraft/world/scores/criteria/HealthCriteria.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.entity.player.h" +#include "../../../../../Header Files/stdafx.h" +#include "../../entity/player/net.minecraft.world.entity.player.h" #include "HealthCriteria.h" HealthCriteria::HealthCriteria(const std::wstring& id) : DummyCriteria(id) {} diff --git a/Minecraft.World/Scores/Criteria/HealthCriteria.h b/Minecraft.World/net/minecraft/world/scores/criteria/HealthCriteria.h similarity index 100% rename from Minecraft.World/Scores/Criteria/HealthCriteria.h rename to Minecraft.World/net/minecraft/world/scores/criteria/HealthCriteria.h diff --git a/Minecraft.World/Scores/Criteria/ObjectiveCriteria.cpp b/Minecraft.World/net/minecraft/world/scores/criteria/ObjectiveCriteria.cpp similarity index 85% rename from Minecraft.World/Scores/Criteria/ObjectiveCriteria.cpp rename to Minecraft.World/net/minecraft/world/scores/criteria/ObjectiveCriteria.cpp index 3083fa2da..79cbdac23 100644 --- a/Minecraft.World/Scores/Criteria/ObjectiveCriteria.cpp +++ b/Minecraft.World/net/minecraft/world/scores/criteria/ObjectiveCriteria.cpp @@ -1,5 +1,5 @@ -#include "../../Platform/stdafx.h" -#include "../../Headers/net.minecraft.world.scores.criteria.h" +#include "../../../../../Header Files/stdafx.h" +#include "net.minecraft.world.scores.criteria.h" #include "ObjectiveCriteria.h" std::unordered_map diff --git a/Minecraft.World/Scores/Criteria/ObjectiveCriteria.h b/Minecraft.World/net/minecraft/world/scores/criteria/ObjectiveCriteria.h similarity index 100% rename from Minecraft.World/Scores/Criteria/ObjectiveCriteria.h rename to Minecraft.World/net/minecraft/world/scores/criteria/ObjectiveCriteria.h diff --git a/Minecraft.World/net/minecraft/world/scores/criteria/net.minecraft.world.scores.criteria.h b/Minecraft.World/net/minecraft/world/scores/criteria/net.minecraft.world.scores.criteria.h new file mode 100644 index 000000000..fd8c86400 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/scores/criteria/net.minecraft.world.scores.criteria.h @@ -0,0 +1,5 @@ +#pragma once + +#include "DummyCriteria.h" +#include "HealthCriteria.h" +#include "ObjectiveCriteria.h" \ No newline at end of file diff --git a/Minecraft.World/net/minecraft/world/scores/net.minecraft.world.scores.h b/Minecraft.World/net/minecraft/world/scores/net.minecraft.world.scores.h new file mode 100644 index 000000000..0dccff460 --- /dev/null +++ b/Minecraft.World/net/minecraft/world/scores/net.minecraft.world.scores.h @@ -0,0 +1,9 @@ +#pragma once + +#include "Objective.h" +#include "PlayerTeam.h" +#include "Score.h" +#include "Scoreboard.h" +#include "ScoreboardSaveData.h" +#include "ScoreHolder.h" +#include "Team.h" \ No newline at end of file diff --git a/Minecraft.World/Platform/x64headers/extraX64.h b/Minecraft.World/x64headers/extraX64.h similarity index 99% rename from Minecraft.World/Platform/x64headers/extraX64.h rename to Minecraft.World/x64headers/extraX64.h index efc640224..6a8d5cef3 100644 --- a/Minecraft.World/Platform/x64headers/extraX64.h +++ b/Minecraft.World/x64headers/extraX64.h @@ -8,7 +8,7 @@ #include #include "../../../4J.Common/4J_Compat.h" -#include "../../../Minecraft.Client/Rendering/Models/SkinBox.h" +#include "../../../Minecraft.Client/Header Files/SkinBox.h" #include diff --git a/Minecraft.World/Platform/x64headers/qnet.h b/Minecraft.World/x64headers/qnet.h similarity index 100% rename from Minecraft.World/Platform/x64headers/qnet.h rename to Minecraft.World/x64headers/qnet.h diff --git a/Minecraft.World/Platform/x64headers/xmcore.h b/Minecraft.World/x64headers/xmcore.h similarity index 100% rename from Minecraft.World/Platform/x64headers/xmcore.h rename to Minecraft.World/x64headers/xmcore.h diff --git a/Minecraft.World/Platform/x64headers/xrnm.h b/Minecraft.World/x64headers/xrnm.h similarity index 100% rename from Minecraft.World/Platform/x64headers/xrnm.h rename to Minecraft.World/x64headers/xrnm.h diff --git a/Minecraft.World/Platform/x64headers/xsocialpost.h b/Minecraft.World/x64headers/xsocialpost.h similarity index 100% rename from Minecraft.World/Platform/x64headers/xsocialpost.h rename to Minecraft.World/x64headers/xsocialpost.h diff --git a/Minecraft.World/Platform/x64headers/xuiapp.h b/Minecraft.World/x64headers/xuiapp.h similarity index 100% rename from Minecraft.World/Platform/x64headers/xuiapp.h rename to Minecraft.World/x64headers/xuiapp.h diff --git a/Minecraft.World/Platform/x64headers/xuiresource.h b/Minecraft.World/x64headers/xuiresource.h similarity index 100% rename from Minecraft.World/Platform/x64headers/xuiresource.h rename to Minecraft.World/x64headers/xuiresource.h

|HcInRswq3T^-Oxr^U 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%0AY5iASrsyBQTf!A5pwii( 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 z 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